Release Notes
Below are the release notes for ParMOO.
May reference issues on: https://github.com/parmoo/parmoo/issues
Release 0.5.1
- Date:
Jan 22, 2026
Patch an issue in conda forge release caused by plotly dropping chrome from its distribution.
Minor changes:
Register a new pytest marker
requires_chromein thepyproject.toml, and use it to mark all unit tests that requirechrome. This allows us to run conda forge tests with thepytest -m 'not requires_chrome'marker since chrome cannot be installed on the conda forge runners.
Release 0.5.0
- Date:
Jan 14, 2026
Update and internal refactor for long-term maintainability. Primarily addresses items in #109, with little to no change to public user interface.
Major changes:
Break up the
MOOPclass into a jax-enabledMOOP_baseclass that handles problem representation and jax functionsCreate a separate simulation-optimization-specific
Databaseclass that theMOOPclass can use to handle all database operationsReplace a lot of the user-definition checks in the
MOOPclass with utility functions to clean up the code footprint and improve testing and error handlingRestructure the
MOOPclass and its base to make things that just describe problem setup and representation all encapsulated in theMOOP_baseclass, leaving themoop.pyfile to contain only code that describes the actual optimization algorithm (in terms of high-level operations defined in theMOOP_base)Break up the
structs.pyfile, and put each base class in the corresponding directory. This will be easier to navigate and maintain going forward as we are starting to have a lot of base classes that are mostly unrelatedReplace
setup.py(which is deprecated) withpyproject.toml; in particular this slightly changes the development and testing workflowUpdate documentation to reflect above changes
Fix spellcheck configuration file to ignore code blocks and links
Add a link-checker workflow (manually triggered) to check dead links in the documentation
After this release, only the following bullet remains to close #109:
Restructure the unit tests to test each of these new files individually and with higher coverage. Also take this opportunity to improve readability by moving redundant setup code into a new parmoo/tests/unit_tests/setup.py utility file.
Release 0.4.1
- Date:
Aug 30, 2024
Hotfix to packaging in setup.py:
Added the
embeddersmodule, which was accidentally omitted in v0.4.0Updated the release process to ensure this doesn’t get missed again
Release 0.4.0
- Date:
Aug 27, 2024
Major interface-breaking refactor of core MOOP builder and libraries plus
minor bug-fixes.
Major changes:
Under the hood, ParMOO now uses
jax[cpu]for all gradient evaluations, constraint evaluations, and function evaluations (but not simulation evaluations) on the critical path; this means that objective and constraint functions can be just-in-time (jit) compiled, which can give massive performance improvements. However, not all Python features are supported byjax.jit(), so users must be careful to write their objective and constraint functions mindfullyIn order for jax to be effective, we have updated the interfaces to avoid using optional arguments – this affects the objective and constraint function interfaces, and a separate gradient function must be provided by the user (as opposed to an optional
derargument, as previously used)In order to make it easier to support mixed variable types in jax and for future maintainability, all design variables have been replaced by a library of design variable
Embedderclasses (corresponding ABCs also added to thestructs.py)In order to make ParMOO more maintainable and for jax to work smoothly, we have dropped support for unnamed variables – Closes #31
All
SurrogateFunctionandAcquisitionFunctionlibraries have been updated to be more jax-friendlyThe
SurrogateOptimizerclass has been refactored to include a callback to observe simulation evaluation results. It has also been given almost full control over when model improvement steps are called in order to make implementing many DFO methods easierThe pattern search family of optimizers has been greatly improved
PyDOEhas been dropped since most relevant DOEs now appear in the newly addedscipy.stats.qmcmoduleSwitching to
PyDOErequired us to change how the numpy random seed is set. A random seed object is now passed as a hyperparameter to ParMOO and propagated to all libraries, which is the recommended wayUpdated docs to reflect above changes
Style changes:
Overhauled some of the unit tests
Style fixes throughout
Renamed several methods and classes to have a consistent naming convention
Interface breaking:
The
Embedderclass is now used to define custom design variables (see Major changes)jax is now used to evaluate gradients in the
SurrogateOptimizerclass (see Major changes) – this alone should not break the interface most use-cases, but may lead to decreased performance if not careful (see notes on achieving good performance in jax in the docs). Additionally, jax defaults to single precision so double precision must be set manually using ajax.configcommand (see docs)
SurrogateFunction,SurrogateOptimizer, andAcquisitionFunctioninterfaces have changed (only affects users using custom methods)The random seed must now be set using a numpy random seed object (see Major changes and examples in the docs)
We no longer support unnamed variables (see Major changes)
Gradient functions are now provided via an additional key in the dictionary, and cannot be set using an optional argument (see Major changes and examples in the updated docs)
Many library functions, methods, and classes have been renamed for consistency. In some cases, the old names remain as aliases for backward compatibility. See Style changes
New features:
ParMOO now supports jax for autograd (see Major changes above)
SurrogateOptimizeris now notified of the results of each simulation evaluation. (This allows checks for sufficient improvements)Numerous new
AcquisitionFunctiontypes addedAdded an option to create a private workdir for each libEnsemble thread – Closes #82
Minor changes:
Updates to support
numpy 2.0Added a code coverage badge and updated the release process to reflect the extra steps needed to make this work – Closes #21 and #93
Requirements:
Added
jax[cpu]to list of requirementsRemoved
pyDOEfrom list of requirements, in favor ofscipy.stats(added inscipy 1.10.0)Released the lock on
libensembleversion (from Release 0.3.1)Updated all version requirements to be new enough to support
numpy 2.0
Release 0.3.1
- Date:
Sep 25, 2023
Bug-fixes and minor restructuring for future releases.
Fixed several serious bugs/limitations:
Introduced in v0.3.0: when generating batches, a bug was introduced into the lines of code that filter out duplicate candidates, resulting in significantly decreased performance but no errors being raised
Allow for ParMOO to still generate target points for the
AcquisitionFunction, even when there are no feasible points in the databaseIncrease the number of characters allowed in a name when working with libEnsemble from 10 to 40 characters
Broke the
MOOP.iterate()method apart into 2 functions (iterateandfilterBatch), which makes the code more maintainable and allows for future improvements to thelibE_MOOPparallelismUpdated deprecated keys in
.readthedocs.ymlconfig file
Release 0.3.0
- Date:
Jul 6, 2023
Significant structural changes for long-term support of future solvers, bug-fixes, and significant improvements to documentation.
Major Changes:
surrogates.GaussRBFandsurrogates.LocalGaussRBFnow calculate model-form uncertaintiesstructural changes to
MOOPclass to support propagation of uncertainty informationadded
EI_RandomConstraintacquisition, which can be used to implement Bayesian optimization – note that for large budgets, this is not currently recommended due to computational expense of numerical integrationupdated
LocalGPSto use trust regions, when provided, and perform multiple restarts
SurrogateOptimizerclass now has access to more information about the objective, including raw simulation outputs, in order to support more diverse structure-exploiting solversAdded additional stopping criteria to both
MOOP.solve()andlibE_MOOP.solve()– all stopping criteria are now optional (although at least one must be specified) but they are ordered such that callingMOOP.solve(k), wherekis a positional input, will pass to theiter_maxcriteria and produce the same behavior as before – closes #18
API Changes:
In most cases, none. However, it is possible that if users were previously passing arguments to the
MOOP.solve()method explicitly, then the name of the first positional argument has changed:budget->max_itersFor users implementing their own
searches,surrogates,optimizers, oracquisitions, several classes in thestructsmodule have been updated to support the present restructuring of theMOOPclass
Docs:
Updated Quickstart guide and README to demonstrate recommended inputs and settings for ParMOO – this includes no more
lambdafunctions, which closes #50Added a FAQ page with additional usage details and responses to frequent questions – the answers in which close #61
Added a new tutorial on how to perform high-dimensional multiobjective optimization on a limited budget with ParMOO
Changed examples and documentation to use and discuss pandas dataframes, which generally produce more legible outputs
Updated
libE_MOOPexample to demonstrate how to retrieve data in a way that is threadsafe for both Python MP and MPI usage
Requirements:
We now require scipy v1.10 or newer, due to usage of QMC integration tools
At the time of this release, libEnsemble is using a deprecated version of Pydantic – for this release only we have fixed the requirement on libEnsemble to v0.9.2, but we will relax this requirement in the future once they have patched the issue
Bug-fixes:
Fixed an issue where in rare cases, problems with too many categorical variables could produce unexpected batch sizes
Errors in definition of test problems: DTLZ5, 6, and 7 (new implementations have been confirmed against
pymoo)Fixed an issue which occasionally caused the
libE_MOOPclass to error out during post-run cleanup when used with MPIPatched an issue with
format="pandas"option forMOOP.getSimulationData()class and added a similar option to alllibE_MOOP“getter” functions
Minor changes:
Fixed typos in docs/doc-strings
Updated styles to comply with new
flake8recommendationsNew unit tests added
Added warnings when ParMOO is run with bad budget settings
Release 0.2.2
- Date:
Apr 25, 2023
Hot-fix for a minor issue in the plotting library without workaround.
Resolves #58
Release 0.2.1
- Date:
Apr 10, 2023
Minor performance improvements, maintenance, and restructuring of test cases.
Both Gaussian RBF surrogates in
parmoo/surrogates/gaussian_proc.pynow use the current mean of the response values as the prior instead of the zero function. This greatly improves convergence rates in practice, especially for our structure-exploiting methods.Using an old version of
plotly/dashfor now because of a dash issue described in plotly/dash#2460Added additional tests to check gradient calculations of
GaussRBFsurrogates.Added whitespace to pass new
flake8standards.Added year to JOSS publication in several places
Added “et al.” to our docs configuration file after author names, to credit additional contributors in our documentation.
Release 0.2.0
- Date:
Feb 2, 2023
Official release corresponding to accepted JOSS article.
Added support for a wider variety of design variables (including integer types), as well as support for “custom” design variables that use user-provided custom embedders/extractors Documentation on design variables has been expanded accordingly. Although design variables are still specified through dicts not classes, this addresses and therefore closes the primary issue raised in parmoo/parmoo#28
Updated
extras/libe.pycorresponding to interface changes made in libEnsemble Release 0.8.0. This also addresses the issues on MacOS, referenced in parmoo/parmoo#34Added a post-run visualization library and corresponding documentation, closing issue parmoo/parmoo#27
Allow solvers to start from an initial point that is infeasible, so that problems with relaxable constraints and a very small feasible set can still be solved
Various style changes and additional usage environments requested by JOSS reviewers openjournals/joss-reviews#4468 including parmoo/parmoo#32
Added support for multistart optimization solvers when solving surrogate problems. This is particularly important for the global
GaussRBFsurrogateFixed an issue in how model improvement points are calculated, as implemented in the
surrogate.improvemethod for each GaussRBF variation insurrogates/gaussian_proc.py, which was created when adding support for custom design variablesThe default design tolerance for continuous variables now depends upon the value of
ub - lb
Note:
Dropped support for Python 3.6, due to changes to GitHub Actions documented on actions/setup-python#544
Known issues:
The visualization library uses advanced plotly/dash features, which may not support the chrome browser, as described in parmoo/parmoo#37
Release 0.1.0
- Date:
May 10, 2022
Initial release.
Known issues and desired features will be raised on GitHub post-release.
Known issues:
update unit tests to use sim/obj/const libraries
restructure test suite, unit tests are currently not usable as additional documentation
solve()method(s) should support additional stopping criteriaallow for maximizing objectives and constraint lower bounds without “hacky” solution (negating values)
missing functions from DTLZ libraries
README.mdneeds a code coverage badge
Desired features:
update, test, and merge-in MDML interface
allow user to choose whether or not to use named variables via
useNamesmethod, or similaradd a funcx simulation interface, using libEnsemble release 0.9
add predictor interface and standalone module
a GUI interface for creating MOOPs
static visualization tools for plotting results (from
MOOP.getPF()method)a visualization dashboard for viewing progress interactively
design variable types should be a class, with embed/extract methods that can be called by
MOOP.__embed__()andMOOP.__extract__()