{"id":13478455,"url":"https://github.com/parmoo/parmoo","last_synced_at":"2026-02-19T20:31:47.896Z","repository":{"id":39981771,"uuid":"449011189","full_name":"parmoo/parmoo","owner":"parmoo","description":"Python library for parallel multiobjective simulation optimization","archived":false,"fork":false,"pushed_at":"2026-01-25T07:47:38.000Z","size":7810,"stargazers_count":87,"open_issues_count":9,"forks_count":11,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-02-16T15:49:45.597Z","etag":null,"topics":["blackbox-optimization","mathematical-software","multicriteria-optimization","multiobjective","multiobjective-optimization","numerical-optimization","python3","response-surface-methodology","simulation-based-optimization","simulation-optimization","surrogate-based-optimization"],"latest_commit_sha":null,"homepage":"https://parmoo.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/parmoo.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":"CONTRIBUTING.rst","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"SUPPORT.rst","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-01-17T18:47:49.000Z","updated_at":"2026-01-25T08:24:51.000Z","dependencies_parsed_at":"2022-06-26T01:37:41.593Z","dependency_job_id":"f5a72f03-bf4f-4028-bed8-0f2e132b2fb8","html_url":"https://github.com/parmoo/parmoo","commit_stats":{"total_commits":308,"total_committers":10,"mean_commits":30.8,"dds":"0.49350649350649356","last_synced_commit":"3f6e9da75c101149be75e66f90e21ce68b117e3c"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/parmoo/parmoo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parmoo%2Fparmoo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parmoo%2Fparmoo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parmoo%2Fparmoo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parmoo%2Fparmoo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/parmoo","download_url":"https://codeload.github.com/parmoo/parmoo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parmoo%2Fparmoo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29576862,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T08:38:15.585Z","status":"ssl_error","status_checked_at":"2026-02-18T08:38:14.917Z","response_time":162,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blackbox-optimization","mathematical-software","multicriteria-optimization","multiobjective","multiobjective-optimization","numerical-optimization","python3","response-surface-methodology","simulation-based-optimization","simulation-optimization","surrogate-based-optimization"],"created_at":"2024-07-31T16:01:57.281Z","updated_at":"2026-02-19T20:31:47.878Z","avatar_url":"https://github.com/parmoo.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"\n.. image:: docs/img/logo-ParMOO.svg\n    :align: center\n    :alt: ParMOO\n\n|\n\n.. image:: https://img.shields.io/badge/License-BSD_3--Clause-green.svg\n    :target: https://opensource.org/licenses/BSD-3-Clause\n    :alt: License\n\n.. image:: https://img.shields.io/pypi/v/parmoo.svg?color=green\n    :target: https://pypi.org/project/parmoo\n\n.. image:: https://github.com/parmoo/parmoo/actions/workflows/parmoo-ci.yml/badge.svg?/branch=main\n    :target: https://github.com/parmoo/parmoo/actions\n\n.. image:: https://readthedocs.org/projects/parmoo/badge/?maxAge=2592000\n    :target: https://parmoo.readthedocs.org/en/latest\n    :alt: Documentation Status\n\n.. image:: https://joss.theoj.org/papers/10.21105/joss.04468/status.svg\n   :target: https://doi.org/10.21105/joss.04468\n   :alt: JOSS DOI\n\n.. image:: https://coveralls.io/repos/github/parmoo/parmoo/badge.svg?branch=main\n   :target: https://coveralls.io/github/parmoo/parmoo?branch=main\n\n|\n\nParMOO: Python library for parallel multiobjective simulation optimization\n==========================================================================\n\nParMOO is a parallel multiobjective optimization solver that seeks to\nexploit simulation-based structure in objective and constraint functions.\n\nTo exploit structure, ParMOO models *simulations* separately from\n*objectives* and *constraints*. In our language:\n\n * a **design variable** is an input to the problem, which we can directly\n   control;\n * a **simulation** is an expensive or time-consuming process, including\n   real-world experimentation, which is treated as a blackbox function\n   of the design variables and evaluated sparingly;\n * an **objective** is an algebraic function of the design variables\n   and/or simulation outputs, which we would like to optimize; and\n * a **constraint** is an algebraic function of the design variables\n   and/or simulation outputs, which cannot exceed a specified bound.\n\n.. figure:: docs/img/des-sim-obj-space.png\n    :alt: Designs, simulations, and objectives\n    :align: center\n\n|\n\nTo solve a multiobjective optimization problem (MOOP), we use surrogate\nmodels of the simulation outputs, together with the algebraic definition of\nthe objectives and constraints.\n\nParMOO is implemented in Python. In order to achieve scalable parallelism,\nwe use libEnsemble_ to distribute batches of simulation evaluations across\nparallel resources.\n\nDependencies\n------------\n\nParMOO has been tested on Unix/Linux and MacOS systems.\n\nParMOO's base has the following dependencies:\n\n * Python_ 3.8+\n * jax_ -- for algorithmic differentiation and just-in-time (jit) compilation\n * numpy_ -- for data structures and performant numerical linear algebra\n * scipy_ -- for scientific calculations needed for specific modules\n * pandas_ -- for exporting the resulting databases\n\nAdditional dependencies are needed to use the additional features in\n``parmoo.extras``:\n\n * libEnsemble_ -- for managing parallel simulation evaluations\n\nAnd for using the Pareto front visualization library in ``parmoo.viz``:\n\n * plotly_ -- for generating interactive plots\n * dash_ -- for hosting interactive plots in your browser\n * kaleido_ -- for exporting static plots post-interaction\n\nInstallation\n------------\n\nThe easiest way to install ParMOO is via the Python package index, PyPI\n(commonly called ``pip``):\n\n.. code-block:: bash\n\n    pip install \u003c --user \u003e parmoo\n\nwhere the braces around ``\u003c --user \u003e`` indicate that the ``--user`` flag is\noptional.\n\nTo install *all* dependencies (including libEnsemble) use:\n\n.. code-block:: bash\n\n    pip install \u003c --user \u003e \"parmoo[extras]\"\n\nYou can also clone this project from our GitHub_ and ``pip`` install it\nin-place, so that you can easily pull the latest version or checkout\nthe ``develop`` branch for pre-release features.\nOn Debian-based systems with a bash shell, this looks like:\n\n.. code-block:: bash\n\n   git clone https://github.com/parmoo/parmoo\n   cd parmoo\n   pip install -e .\n\nAlternatively, the latest release of ParMOO (including all required and\noptional dependencies) can be installed from the ``conda-forge`` channel using:\n\n.. code-block:: bash\n\n   conda install --channel=conda-forge parmoo\n\nBefore doing so, it is recommended to create a new conda environment using:\n\n.. code-block:: bash\n\n   conda create --name channel-name\n   conda activate channel-name\n\nTesting\n-------\n\nIf you have pytest_ with the pytest-cov_ plugin and flake8_ installed,\nthen you can test your installation.\n\n.. code-block:: bash\n\n   python3 setup.py test\n\nThese tests are run regularly using GitHub Actions_.\n\nBasic Usage\n-----------\n\nParMOO uses numpy_ and jax_ in an object-oriented design, based around the\n``MOOP`` class.\n\nBefore getting started, note that jax_ runs in single (32-bit) precision\nby default. To run in double precision, the following code is needed at\nstartup:\n\n.. code-block:: python\n\n    import jax\n    jax.config.update(\"jax_enable_x64\", True)\n\nThis will be done automatically when importing certain modules in ParMOO,\nwhich are only compatible with double precision.\nHowever, in many use cases, 32-bit precision may be enough and provides\nsubstantial speedup in iteration tasks.\n\nOnce the precision is set, to get started, create a ``MOOP`` object.\n\n.. code-block:: python\n\n   from parmoo import MOOP\n   from parmoo.optimizers import LocalGPS\n\n   my_moop = MOOP(LocalGPS)\n\nTo summarize the framework, in each iteration ParMOO models each simulation\nusing a computationally cheap surrogate, then solves one or more scalarizations\nof the objectives, which are specified by acquisition functions.\nRead more about this framework at our ReadTheDocs_ page.\nIn the above example, ``LocalGPS`` is the class of optimizers that the\n``my_moop`` will use to solve the scalarized surrogate problems.\n\nNext, add design variables to the problem as follows using the\n``MOOP.addDesign(*args)`` method. In this example, we define one continuous\nand one categorical design variable.\nOther options include integer, custom, and raw (using raw variables is not\nrecommended except for expert users).\n\n.. code-block:: python\n\n   # Add a single continuous design variable in the range [0.0, 1.0]\n   my_moop.addDesign({'name': \"x1\", # optional, name\n                      'des_type': \"continuous\", # optional, type of variable\n                      'lb': 0.0, # required, lower bound\n                      'ub': 1.0, # required, upper bound\n                      'tol': 1.0e-8 # optional tolerance\n                     })\n   # Add a second categorical design variable with 3 levels\n   my_moop.addDesign({'name': \"x2\", # optional, name\n                      'des_type': \"categorical\", # required, type of variable\n                      'levels': [\"good\", \"bad\"] # required, category names\n                     })\n\nNext, add simulations to the problem as follows using the\n``MOOP.addSimulation`` method. In this example, we define a toy simulation\n``sim_func(x)``.\n\n.. code-block:: python\n\n   import numpy as np\n   from parmoo.searches import LatinHypercube\n   from parmoo.surrogates import GaussRBF\n\n   # Define a toy simulation for the problem, whose outputs are quadratic\n   def sim_func(x):\n      if x[\"x2\"] == \"good\":\n         return np.array([(x[\"x1\"] - 0.2) ** 2, (x[\"x1\"] - 0.8) ** 2])\n      else:\n         return np.array([99.9, 99.9])\n   # Add the simulation to the problem\n   my_moop.addSimulation({'name': \"MySim\", # Optional name for this simulation\n                          'm': 2, # This simulation has 2 outputs\n                          'sim_func': sim_func, # Our sample sim from above\n                          'search': LatinHypercube, # Use a LHS search\n                          'surrogate': GaussRBF, # Use a Gaussian RBF surrogate\n                          'hyperparams': {}, # Hyperparams passed to internals\n                          'sim_db': { # Optional dict of precomputed points\n                                     'search_budget': 10 # Set search budget\n                                    },\n                         })\n\nNow we can add objectives and constraints using ``MOOP.addObjective(*args)``\nand ``MOOP.addConstraint(*args)``. In this example, there are 2 objectives\n(each corresponding to a single simulation output) and one constraint.\n\n.. code-block:: python\n\n   # First objective just returns the first simulation output\n   def f1(x, s): return s[\"MySim\"][0]\n   my_moop.addObjective({'name': \"f1\", 'obj_func': f1})\n   # Second objective just returns the second simulation output\n   def f2(x, s): return s[\"MySim\"][1]\n   my_moop.addObjective({'name': \"f2\", 'obj_func': f2})\n   # Add a single constraint, that x[0] \u003e= 0.1\n   def c1(x, s): return 0.1 - x[\"x1\"]\n   my_moop.addConstraint({'name': \"c1\", 'constraint': c1})\n\nFinally, we must add one or more acquisition functions using\n``MOOP.addAcquisition(*args)``. These are used to scalarize the surrogate\nproblems. The number of acquisition functions typically determines the\nnumber of simulation evaluations per batch. This is useful to know if you\nare using a parallel solver.\n\n.. code-block:: python\n\n   from parmoo.acquisitions import RandomConstraint\n\n   # Add 3 acquisition functions\n   for i in range(3):\n      my_moop.addAcquisition({'acquisition': RandomConstraint,\n                              'hyperparams': {}})\n\nFinally, the MOOP is solved using the ``MOOP.solve(budget)`` method, and the\nresults can be viewed using ``MOOP.getPF()`` method.\n\n.. code-block:: python\n\n   import pandas as pd\n\n   my_moop.solve(5) # Solve with 5 iterations of ParMOO algorithm\n   results = my_moop.getPF(format=\"pandas\") # Extract the results as pandas df\n\nAfter executing the above block of code, the ``results`` variable points to\na pandas_ dataframe, each of whose rows corresponds to a nondominated\nobjective value in the ``my_moop`` object's final database.\nYou can reference individual columns in the ``results`` array by using the\n``name`` keys that were assigned during ``my_moop``'s construction, or\nplot the results by using the viz_ library.\n\nCongratulations, you now know enough to get started solving MOOPs with\nParMOO!\n\nNext steps:\n\n * Learn more about all that ParMOO has to offer (including saving and\n   checkpointing, INFO-level logging, advanced problem definitions, and\n   different surrogate and solver options) at our ReadTheDocs_ page.\n * Explore the advanced examples (including a ``libEnsemble`` example)\n   in the ``examples`` directory.\n * Install libEnsemble_ and get started solving MOOPs in parallel.\n * See some of our pre-built solvers in the parmoo_solver_farm_.\n * To interactively explore your solutions, install its extra dependencies and\n   use our built-in viz_ tool.\n * For more advice, consult our FAQs_.\n\nResources\n---------\n\nTo seek support or report issues, e-mail:\n\n * ``parmoo@lbl.gov``\n\nOur full documentation is hosted on:\n\n * ReadTheDocs_\n\nRecent versions of ParMOO are also incorporated in:\n\n * BANDFramework_\n\nPlease read our LICENSE_ and CONTRIBUTING_ files.\n\nCiting ParMOO\n-------------\n\nPlease use one or more of the following to cite ParMOO.\n\nOur JOSS paper:\n\n.. code-block:: bibtex\n\n    @article{parmoo,\n        author={Chang, Tyler H. and Wild, Stefan M.},\n        title={{ParMOO}: A {P}ython Library for Parallel Multiobjective Simulation Optimization},\n        journal = {Journal of Open Source Software},\n        volume = {8},\n        number = {82},\n        pages = {4468},\n        year = {2023},\n        doi = {10.21105/joss.04468}\n    }\n\nOur online documentation:\n\n.. code-block:: bibtex\n\n    @techreport{parmoo-docs,\n        title       = {{ParMOO}: {P}ython Library for Parallel Multiobjective Simulation Optimization},\n        author      = {Chang, Tyler H. and Wild, Stefan M. and Dickinson, Hyrum},\n        institution = {Argonne National Laboratory},\n        number      = {Version 0.4.1},\n        year        = {2024},\n        url         = {https://parmoo.readthedocs.io/en/latest}\n    }\n\nOur design principles paper:\n\n.. code-block:: bibtex\n\n    @techreport{ParMOODesign24,\n        title = {Designing a Framework for Solving Multiobjective Simulation Optimization Problems},\n        author = {Tyler H. Chang and Stefan M. Wild},\n        institution = {arXiv},\n        number = {2304.06881},\n        year = {2024},\n        url = {https://arxiv.org/abs/2304.06881},\n    }\n\n\n.. _Actions: https://github.com/parmoo/parmoo/actions\n.. _BANDFramework: https://github.com/bandframework/bandframework\n.. _CONTRIBUTING: https://github.com/parmoo/parmoo/blob/main/CONTRIBUTING.rst\n.. _dash: https://dash.plotly.com\n.. _FAQs: https://parmoo.readthedocs.io/en/latest/faqs.html\n.. _flake8: https://flake8.pycqa.org/en/latest\n.. _GitHub: https://github.com/parmoo/parmoo\n.. _jax: https://jax.readthedocs.io/en/latest/\n.. _kaleido: https://github.com/plotly/Kaleido\n.. _libEnsemble: https://github.com/Libensemble/libensemble\n.. _LICENSE: https://github.com/parmoo/parmoo/blob/main/LICENSE\n.. _numpy: https://numpy.org\n.. _pandas: https://pandas.pydata.org\n.. _parmoo_solver_farm: https://github.com/parmoo/parmoo-solver-farm\n.. _plotly: https://plotly.com/python\n.. _pytest: https://docs.pytest.org/en/7.0.x\n.. _pytest-cov: https://pytest-cov.readthedocs.io/en/latest\n.. _Python: https://www.python.org/downloads\n.. _ReadTheDocs: https://parmoo.readthedocs.org\n.. _scipy: https://scipy.org\n.. _viz: https://parmoo.readthedocs.io/en/latest/modules/viz.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fparmoo%2Fparmoo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fparmoo%2Fparmoo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fparmoo%2Fparmoo/lists"}