Metadata-Version: 2.4
Name: m4opt
Version: 2.4.0
Summary: Multi-Mission Multi-Messenger Observation Planning Toolkit
Author-email: M4OPT Developers <leo.singer@ligo.org>
License-Expression: BSD-3-Clause
Project-URL: Homepage, https://m4opt.readthedocs.io/
Project-URL: Bug Tracker, https://github.com/m4opt/m4opt/issues
Project-URL: Change Log, https://m4opt.readthedocs.io/en/latest/changes.html
Project-URL: Documentation, https://m4opt.readthedocs.io/
Project-URL: GitHub, https://github.com/m4opt/m4opt
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: MacOS
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Scientific/Engineering :: Astronomy
Classifier: Typing :: Typed
Requires-Python: <3.15,>=3.12
Description-Content-Type: text/x-rst
Requires-Dist: aep8>=1.0.0
Requires-Dist: antiprism-python
Requires-Dist: astropy>=7.1.0
Requires-Dist: astropy-healpix
Requires-Dist: astroquery
Requires-Dist: click>=8.2.0
Requires-Dist: cplex~=22.1.2.0
Requires-Dist: docplex
Requires-Dist: dust-extinction>=1.7
Requires-Dist: dustmaps
Requires-Dist: ligo.skymap>=2.4.0
Requires-Dist: networkx
Requires-Dist: numpy>=2.1.0
Requires-Dist: regions
Requires-Dist: pymetis
Requires-Dist: satellitetle
Requires-Dist: scipy
Requires-Dist: sgp4
Requires-Dist: spiceypy
Requires-Dist: sympy
Requires-Dist: synphot
Requires-Dist: typer>=0.16.0
Requires-Dist: xdg-base-dirs
Provides-Extra: test
Requires-Dist: astroplan; extra == "test"
Requires-Dist: networkx; extra == "test"
Requires-Dist: sphinxcontrib-bibtex; extra == "test"
Requires-Dist: pytest-astropy; extra == "test"
Provides-Extra: docs
Requires-Dist: pysiaf; extra == "docs"
Requires-Dist: sphinx-astropy[confv2]; extra == "docs"
Requires-Dist: sphinxcontrib-bibtex; extra == "docs"
Requires-Dist: sphinxcontrib-typer; extra == "docs"

Multi-Mission Multi-Messenger Observation Planning Toolkit
----------------------------------------------------------

.. image:: https://img.shields.io/pypi/v/m4opt
    :target: https://pypi.org/project/m4opt/
    :alt: Python Package Index status
.. image:: http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat
    :target: http://www.astropy.org
    :alt: Powered by Astropy Badge
.. image:: https://codecov.io/gh/m4opt/m4opt/branch/main/graph/badge.svg?token=L837JHNTUV
    :target: https://codecov.io/gh/m4opt/m4opt
    :alt: Code coverage status
.. image:: https://readthedocs.org/projects/m4opt/badge/?version=latest
    :target: https://m4opt.readthedocs.io/en/latest/?badge=latest
    :alt: Documentation Status

.. image:: https://m4opt.readthedocs.io/en/latest/_images/example.gif
    :alt: Visualization of an example observing plan for UVEX generated M4OPT

M4OPT is an open-source toolkit for multi-facility scheduling of astrophysics
observing campaigns. It focuses on extremely rapid follow-up of gravitational
wave (GW) and neutrino events with heterogeneous networks of space and
ground-based observatories.

M4OPT uses the versatile mathematical framework of `mixed integer
programming`__ to model and solve complex observation scheduling problems.
Although M4OPT is open source, for the largest problems it can leverage two
industrial-strength commercial MIP solvers: `CPLEX`__ or `Gurobi`__. Both
solvers are available for free for academic users.

__ https://en.wikipedia.org/wiki/Integer_programming
__ https://www.ibm.com/products/ilog-cplex-optimization-studio
__ https://www.gurobi.com

M4OPT is designed from the `Astropy affiliated package`__ template, and is
meant to follow those standards, including interoperability with the
`Astropy`__ ecosystem. It also complies with `NASA Procedural Requirements
(NPR) 7150`__ for `Class C software`__ and is suitable for non-safety-critical
ground software applications for `Class D NASA payloads`__.

__ https://www.astropy.org/affiliated/
__ https://www.astropy.org
__ https://nodis3.gsfc.nasa.gov/displayDir.cfm?t=NPR&c=7150&s=2C
__ https://nodis3.gsfc.nasa.gov/displayDir.cfm?Internal_ID=N_PR_7150_002C_&page_name=AppendixD
__ https://nodis3.gsfc.nasa.gov/displayDir.cfm?t=NPR&c=8705&s=4A

Features
--------

*   **Global**: jointly and globally solves the problems of tiling (the set of
    telescope boresight orientations and roll angles) and the scheduling (which
    tile is observed at what time), rather than solving each sub-problem one at
    a time
*   **Optimal**: generally solves all the way to optimality, rather than
    finding merely a "good enough" solution
*   **Fast**: solve an entire orbit in about 5 minutes
*   **General**: does not depend on heuristics of any kind
*   **Flexible**: problem is formulated in the versatile framework of
    `mixed integer programming <https://en.wikipedia.org/wiki/Integer_programming>`_

License
-------

This project is Copyright (c) M4OPT Developers and licensed under
the terms of the BSD 3-Clause license. This package is based upon
the `Astropy package template <https://github.com/astropy/package-template>`_
which is licensed under the BSD 3-clause license. See the licenses folder for
more information.

How to Cite
-----------

If you use M4OPT in your research, then please cite the following paper:

   Singer, L. P., Criswell, A. W., Leggio, S. C., et al. Optimal Follow-up of
   Gravitational-wave Events with the UltraViolet EXplorer (UVEX).
   *Publications of the Astronomical Society of the Pacific*, 137(7):074501,
   July 2025. https://doi.org/10.1088/1538-3873/adcfc6.

Contributing
------------

We love contributions! m4opt is open source,
built on open source, and we'd love to have you hang out in our community.

**Imposter syndrome disclaimer**: We want your help. No, really.

There may be a little voice inside your head that is telling you that you're not
ready to be an open source contributor; that your skills aren't nearly good
enough to contribute. What could you possibly offer a project like this one?

We assure you - the little voice in your head is wrong. If you can write code at
all, you can contribute code to open source. Contributing to open source
projects is a fantastic way to advance one's coding skills. Writing perfect code
isn't the measure of a good developer (that would disqualify all of us!); it's
trying to create something, making mistakes, and learning from those
mistakes. That's how we all improve, and we are happy to help others learn.

Being an open source contributor doesn't just mean writing code, either. You can
help out by writing documentation, tests, or even giving feedback about the
project (and yes - that includes giving feedback about the contribution
process). Some of these contributions may be the most valuable to the project as
a whole, because you're coming to the project with fresh eyes, so you can see
the errors and assumptions that seasoned contributors have glossed over.

Note: This disclaimer was originally written by
`Adrienne Lowe <https://github.com/adriennefriend>`_ for a
`PyCon talk <https://www.youtube.com/watch?v=6Uj746j9Heo>`_, and was adapted by
m4opt based on its use in the README file for the
`MetPy project <https://github.com/Unidata/MetPy>`_.
