v0.4.0
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 by
jax.jit(), so users must be careful to write their objective and
constraint functions mindfully - In 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 optionalderargument, 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 variableEmbedderclasses (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-friendly - The
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 easier - The pattern search family of optimizers has been greatly improved
PyDOEhas been dropped since most relevant DOEs now appear in the newly
addedscipy.stats.qmcmodule- Switching 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 way - Updated 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, andAcquisitionFunction
interfaces 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 added - Added an option to create a private workdir for each libEnsemble thread --
Closes #82
Minor changes:
- Updates to support
numpy 2.0 - Added 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 requirements - Removed
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