dfbench 0.2.2__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dfbench-0.2.2 → dfbench-0.3.0}/.gitignore +1 -5
- {dfbench-0.2.2 → dfbench-0.3.0}/PKG-INFO +2 -5
- {dfbench-0.2.2 → dfbench-0.3.0}/README.md +0 -3
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Implementing-a-New-Algorithm.md +6 -2
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Objective-API-Reference.md +1 -1
- {dfbench-0.2.2 → dfbench-0.3.0}/pyproject.toml +2 -2
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/_dfo_common.py +5 -5
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/_scipy_common.py +4 -4
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/omads_mads.py +2 -3
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/pdfo/lincoa.py +5 -17
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/cmaes_sep_cma.py +3 -4
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/evosax_es.py +6 -8
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/evox_es.py +5 -13
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/evox_pso.py +2 -8
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/jax_es.py +6 -8
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/nevergrad/ngopt.py +2 -6
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/nevergrad/oneplusone.py +2 -6
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/nevergrad/tbpsa.py +2 -6
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/pycma_cmaes.py +12 -16
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/generative/vae_sampling.py +1 -2
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/global_search/basin_hopping.py +2 -3
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/_common.py +6 -17
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/ax_baxus.py +2 -3
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/ax_saasbo.py +20 -21
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/botorch/_botorch_common.py +3 -3
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/botorch/botorch_bo.py +7 -8
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/botorch/botorch_gebo.py +4 -5
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/botorch/botorch_linebo.py +2 -3
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/botorch/botorch_qkg.py +2 -3
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/botorch/botorch_qnei.py +2 -3
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/botorch/botorch_rembo.py +2 -3
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/botorch/botorch_turbo.py +4 -5
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/hebo_bo.py +3 -4
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/restir.py +1 -2
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/smac_bo.py +3 -4
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/turbo_lbfgs.py +3 -4
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/algorithm.py +2 -1
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/display.py +1 -1
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/objective.py +5 -5
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/problems/base_problem.py +6 -0
- dfbench-0.3.0/tests/slow/test_problem_bounds_gradients.py +106 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_objective_invariants.py +7 -7
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_objective_penalty_fn.py +0 -1
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_objective_randomness.py +1 -1
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_scipy_wrapper.py +1 -17
- {dfbench-0.2.2 → dfbench-0.3.0}/LICENSE +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Algorithm-Status.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Algorithms.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Architecture-Overview.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Benchmarking.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/FAQ.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Home.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Installation.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Metrics-Reference.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Problems.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Storage-and-Checkpointing.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Testing.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/Utilities-and-Helpers.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/_Sidebar.md +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/algorithm-status/main.typ +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/docs/algorithm-status/template.typ +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/nelder_mead.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/pdfo/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/pdfo/newuoa.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/pdfo/uobyqa.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/powell.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/derivative_free/pybobyqa.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/nevergrad/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/evolutionary/nevergrad/_common.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/global_search/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/global_search/dual_annealing.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/global_search/random_search.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/adam_gd.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/custom_jax.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/lbfgs_gd.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/na_adam_gd.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/_common.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/adabelief.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/adadelta.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/adafactor.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/adagrad.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/adam.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/adamax.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/adamaxw.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/adamw.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/adan.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/amsgrad.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/lamb.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/lion.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/lookahead.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/nadam.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/nadamw.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/noisy_sgd.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/novograd.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/oadam.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/ogd.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/polyak_sgd.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/radam.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/rmsprop.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/rprop.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/sam.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/schedule_free_adam.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/sgd.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/sign.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/sm3.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/sophia.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax/yogi.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/optax_lbfgs.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/sa_gd.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/bfgs.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/cobyla.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/cobyqa.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/dogleg.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/lbfgsb.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/newton_cg.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/nonlinear_cg.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/slsqp.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/sr1.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/tnc.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/trust_constr.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/trust_krylov.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/gradient_based/scipy/trust_ncg.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/surrogate_based/botorch/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/utils/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/utils/gp.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/utils/initial_design.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/utils/misc.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/algorithms/utils/weighted_acq.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/benchmark/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/benchmark/benchmark.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/benchmark/metrics.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/_init_env.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/config.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/problem.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/storage/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/storage/backends.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/storage/exporter.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/storage/manager.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/storage/resolver.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/storage/saveconfig.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/storage/serializers.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/storage/state.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/core/utils.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/problems/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/problems/uifo/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/problems/uifo/uifo_problem.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/problems/voyager/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/problems/voyager/constrained_voyager_problem.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/problems/voyager/voyager_problem.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/src/dfbench/problems/voyager/voyager_tuning_problem.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/conftest.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/slow/__init__.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/slow/test_algorithms_integration.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/slow/test_benchmark_full.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/slow/test_problems_full.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_algorithm_protocol.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_algorithms_uniform.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_algorithms_unit.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_api_imports.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_benchmark_smoke.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_bo_batch.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_cma_family.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_config.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_custom_jax_batch.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_dfo_algorithms.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_display.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_init_env.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_metrics.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_objective_space_mode.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_problem_bounds_overrides.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_problem_protocol.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_problem_spec.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_storage.py +0 -0
- {dfbench-0.2.2 → dfbench-0.3.0}/tests/test_utils.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dfbench
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: dfbench: A Black-Box Optimization Framework for JAX-Differentiable Gravitational Wave Detector Discovery
|
|
5
5
|
Project-URL: Homepage, https://github.com/artificial-scientist-lab/Differometor-Benchmark
|
|
6
6
|
Project-URL: Repository, https://github.com/artificial-scientist-lab/Differometor-Benchmark
|
|
7
7
|
Project-URL: Documentation, https://github.com/artificial-scientist-lab/Differometor-Benchmark/tree/main/docs
|
|
@@ -90,9 +90,6 @@ Provides-Extra: torch
|
|
|
90
90
|
Requires-Dist: torch>=2.9.1; extra == 'torch'
|
|
91
91
|
Description-Content-Type: text/markdown
|
|
92
92
|
|
|
93
|
-
> [!IMPORTANT]
|
|
94
|
-
> **BETA RELEASE:** This repository is currently in beta. The official competition will start on **July ~7**.
|
|
95
|
-
|
|
96
93
|
# Differometor Benchmark
|
|
97
94
|
|
|
98
95
|
[](https://pypi.python.org/pypi/dfbench)
|
|
@@ -98,7 +98,6 @@ class MyAlgorithm(OptimizationAlgorithm):
|
|
|
98
98
|
"""
|
|
99
99
|
# ─── 1. Setup references ───
|
|
100
100
|
obj = objective
|
|
101
|
-
problem = obj.problem
|
|
102
101
|
|
|
103
102
|
# Sets unbounded mode, algorithm_str, seeds np/JAX, returns resolved seed + JAX key
|
|
104
103
|
random_seed, key = self.prepare(
|
|
@@ -179,7 +178,6 @@ The base class `OptimizationAlgorithm.optimize()` contains a commented blueprint
|
|
|
179
178
|
|
|
180
179
|
```python
|
|
181
180
|
obj = objective
|
|
182
|
-
problem = obj.problem
|
|
183
181
|
random_seed, key = self.prepare(
|
|
184
182
|
obj,
|
|
185
183
|
unbounded=False,
|
|
@@ -187,6 +185,12 @@ random_seed, key = self.prepare(
|
|
|
187
185
|
)
|
|
188
186
|
```
|
|
189
187
|
|
|
188
|
+
The problem instance wrapped by the `Objective` is private. Use the public
|
|
189
|
+
Objective API directly: `obj.bounds` for the `(2, n_params)` bounds,
|
|
190
|
+
`obj.n_params` for the dimension, `obj.problem_name` for the display name,
|
|
191
|
+
`obj.value_function(unbounded=False)` for the raw bounded objective, and
|
|
192
|
+
`obj.penalty_fn` / `obj.power_thresholds` for the penalty contract.
|
|
193
|
+
|
|
190
194
|
`prepare()` is called as `prepare(obj, unbounded, random_seed, algorithm_str=None, **kwargs)`. It sets `obj.unbounded`, `obj.algorithm_str`, seeds `np.random` and JAX, and returns `(random_seed, key)`. If `random_seed=None` is passed, a seed is generated via system entropy. You can also configure the Objective manually instead of calling `prepare()`.
|
|
191
195
|
|
|
192
196
|
**Choose `unbounded`:**
|
|
@@ -447,7 +447,7 @@ bounded ≈ lb + (ub - lb) * forward(random_params_unbounded(...))
|
|
|
447
447
|
|----------|------|-------------|
|
|
448
448
|
| `bounds` | `Array[2, n_params]` | Lower and upper parameter bounds (or $\pm\infty$ when unbounded). |
|
|
449
449
|
| `n_params` | `int` | Number of optimizable parameters. |
|
|
450
|
-
| `
|
|
450
|
+
| `problem_name` | `str` | Display name of the wrapped problem. |
|
|
451
451
|
| `penalty_fn` | `Callable \| None` | The wrapped problem's penalty function, or `None` if the problem does not expose one. Update it via `set_penalty_fn(fn)`. |
|
|
452
452
|
| `power_thresholds` | `dict[str, float] \| None` | Per-group power thresholds (`hard`, `soft`, `detector`) for problems that opt into the penalty contract, or `None`. Constants; do not change across evaluations. |
|
|
453
453
|
|
|
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dfbench"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "
|
|
7
|
+
version = "0.3.0"
|
|
8
|
+
description = "dfbench: A Black-Box Optimization Framework for JAX-Differentiable Gravitational Wave Detector Discovery"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.14"
|
|
11
11
|
license = "MIT"
|
|
@@ -81,7 +81,7 @@ def random_bounded_start(
|
|
|
81
81
|
(x0, new_key): x0 is a 1-D ``np.ndarray`` of shape ``(n_params,)``.
|
|
82
82
|
"""
|
|
83
83
|
key, subkey = random.split(key)
|
|
84
|
-
lower, upper = obj.
|
|
84
|
+
lower, upper = obj.bounds
|
|
85
85
|
x0_jax = random.uniform(subkey, shape=(obj.n_params,), minval=lower, maxval=upper)
|
|
86
86
|
return np.asarray(x0_jax, dtype=np.float64), key
|
|
87
87
|
|
|
@@ -92,15 +92,15 @@ def clip_to_bounds(x: np.ndarray, obj: Objective) -> np.ndarray:
|
|
|
92
92
|
Returns:
|
|
93
93
|
Clipped copy of *x*.
|
|
94
94
|
"""
|
|
95
|
-
lower = np.asarray(obj.
|
|
96
|
-
upper = np.asarray(obj.
|
|
95
|
+
lower = np.asarray(obj.bounds[0], dtype=np.float64)
|
|
96
|
+
upper = np.asarray(obj.bounds[1], dtype=np.float64)
|
|
97
97
|
return np.clip(x, lower, upper)
|
|
98
98
|
|
|
99
99
|
|
|
100
100
|
def solver_bounds_np(obj: Objective) -> tuple[np.ndarray, np.ndarray]:
|
|
101
101
|
"""Return ``(lower, upper)`` as plain NumPy float64 arrays."""
|
|
102
|
-
lower = np.asarray(obj.
|
|
103
|
-
upper = np.asarray(obj.
|
|
102
|
+
lower = np.asarray(obj.bounds[0], dtype=np.float64)
|
|
103
|
+
upper = np.asarray(obj.bounds[1], dtype=np.float64)
|
|
104
104
|
return lower, upper
|
|
105
105
|
|
|
106
106
|
|
|
@@ -36,15 +36,15 @@ _NAN_PENALTY = 1e30
|
|
|
36
36
|
|
|
37
37
|
def scipy_bounds(obj: Objective) -> Bounds:
|
|
38
38
|
"""Convert problem bounds to :class:`scipy.optimize.Bounds`."""
|
|
39
|
-
lb = np.asarray(obj.
|
|
40
|
-
ub = np.asarray(obj.
|
|
39
|
+
lb = np.asarray(obj.bounds[0], dtype=np.float64)
|
|
40
|
+
ub = np.asarray(obj.bounds[1], dtype=np.float64)
|
|
41
41
|
return Bounds(lb, ub)
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
def scipy_bounds_list(obj: Objective) -> list[tuple[float, float]]:
|
|
45
45
|
"""Return bounds as ``[(lb0, ub0), ...]`` (format used by *dual_annealing*)."""
|
|
46
|
-
lb = np.asarray(obj.
|
|
47
|
-
ub = np.asarray(obj.
|
|
46
|
+
lb = np.asarray(obj.bounds[0], dtype=np.float64)
|
|
47
|
+
ub = np.asarray(obj.bounds[1], dtype=np.float64)
|
|
48
48
|
return list(zip(lb.tolist(), ub.tolist()))
|
|
49
49
|
|
|
50
50
|
|
|
@@ -102,11 +102,10 @@ def _run_omads(
|
|
|
102
102
|
"""
|
|
103
103
|
_check_omads_available()
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
bounds = problem.bounds # (2, n_params)
|
|
105
|
+
bounds = obj.bounds # (2, n_params)
|
|
107
106
|
lower = np.array(bounds[0], dtype=np.float64)
|
|
108
107
|
upper = np.array(bounds[1], dtype=np.float64)
|
|
109
|
-
n_params =
|
|
108
|
+
n_params = obj.n_params
|
|
110
109
|
|
|
111
110
|
# Starting point: use best_params if available, else random bounded point
|
|
112
111
|
if obj.best_params is not None:
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
"""LINCOA: LINearly Constrained Optimization Algorithm (via PDFO).
|
|
2
2
|
|
|
3
3
|
LINCOA is a derivative-free trust-region method by M. J. D. Powell that
|
|
4
|
-
handles *bound constraints*
|
|
5
|
-
|
|
6
|
-
When the problem exposes only box bounds (the common case in this benchmark),
|
|
7
|
-
LINCOA automatically uses them. If the problem also exposes linear
|
|
8
|
-
constraints via ``problem.linear_constraints`` (returning a dict with keys
|
|
9
|
-
``A_ub``, ``b_ub`` for ``A_ub @ x <= b_ub``), those are forwarded to the
|
|
10
|
-
solver as well. Problems without any constraints are also supported -
|
|
11
|
-
LINCOA will behave like a bounded NEWUOA.
|
|
4
|
+
handles *bound constraints* natively. Problems without any constraints are
|
|
5
|
+
also supported - LINCOA will behave like a bounded NEWUOA.
|
|
12
6
|
|
|
13
7
|
Defaults are conservative and benchmark-oriented: bounded physical space,
|
|
14
8
|
one restart, ``rhobeg`` derived from the bound range.
|
|
@@ -76,7 +70,7 @@ class PDFOLINCOA(OptimizationAlgorithm):
|
|
|
76
70
|
raise ImportError(
|
|
77
71
|
"PDFO is required for LINCOA. Install with: uv add 'dfbench[dfo]'"
|
|
78
72
|
) from exc
|
|
79
|
-
from scipy.optimize import
|
|
73
|
+
from scipy.optimize import Bounds # noqa: E402
|
|
80
74
|
|
|
81
75
|
obj = objective
|
|
82
76
|
random_seed, key = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
@@ -92,15 +86,9 @@ class PDFOLINCOA(OptimizationAlgorithm):
|
|
|
92
86
|
fun = dfo_objective_wrapper(obj)
|
|
93
87
|
bounds = Bounds(lb=lower, ub=upper)
|
|
94
88
|
|
|
95
|
-
#
|
|
89
|
+
# This batch only supports box bounds; problems with linear
|
|
90
|
+
# constraint metadata are not handled here.
|
|
96
91
|
constraints: list = []
|
|
97
|
-
problem = obj.problem
|
|
98
|
-
if hasattr(problem, "linear_constraints"):
|
|
99
|
-
lc = problem.linear_constraints # type: ignore[attr-defined]
|
|
100
|
-
if lc is not None:
|
|
101
|
-
A_ub = np.asarray(lc["A_ub"], dtype=np.float64)
|
|
102
|
-
b_ub = np.asarray(lc["b_ub"], dtype=np.float64)
|
|
103
|
-
constraints.append(LinearConstraint(A_ub, ub=b_ub))
|
|
104
92
|
|
|
105
93
|
# JIT warmup
|
|
106
94
|
obj.warmup_value()
|
|
@@ -106,14 +106,13 @@ class CMAESSepCMA(OptimizationAlgorithm):
|
|
|
106
106
|
disables stagnation stopping.
|
|
107
107
|
"""
|
|
108
108
|
obj = objective
|
|
109
|
-
problem = obj.problem
|
|
110
109
|
|
|
111
110
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
112
111
|
|
|
113
|
-
lb_np = np.asarray(
|
|
114
|
-
ub_np = np.asarray(
|
|
112
|
+
lb_np = np.asarray(obj.bounds[0])
|
|
113
|
+
ub_np = np.asarray(obj.bounds[1])
|
|
115
114
|
width = ub_np - lb_np
|
|
116
|
-
n =
|
|
115
|
+
n = obj.n_params
|
|
117
116
|
|
|
118
117
|
# The cmaes package has no per-coordinate sigma. On problems where
|
|
119
118
|
# bound widths span orders of magnitude (e.g. Voyager), running the
|
|
@@ -198,15 +198,14 @@ class EvosaxMAES(OptimizationAlgorithm):
|
|
|
198
198
|
max_iterations: Maximum CMA generations. ``None`` = unlimited.
|
|
199
199
|
"""
|
|
200
200
|
obj = objective
|
|
201
|
-
problem = obj.problem
|
|
202
201
|
|
|
203
202
|
random_seed, rng = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
204
203
|
|
|
205
|
-
lb_np = np.asarray(
|
|
206
|
-
ub_np = np.asarray(
|
|
204
|
+
lb_np = np.asarray(obj.bounds[0])
|
|
205
|
+
ub_np = np.asarray(obj.bounds[1])
|
|
207
206
|
lb_jnp = jnp.asarray(lb_np)
|
|
208
207
|
ub_jnp = jnp.asarray(ub_np)
|
|
209
|
-
n =
|
|
208
|
+
n = obj.n_params
|
|
210
209
|
|
|
211
210
|
sigma = float(sigma0 if sigma0 is not None else np.mean(0.3 * (ub_np - lb_np)))
|
|
212
211
|
|
|
@@ -307,15 +306,14 @@ class EvosaxLMMAES(OptimizationAlgorithm):
|
|
|
307
306
|
max_iterations: Maximum generations. ``None`` = unlimited.
|
|
308
307
|
"""
|
|
309
308
|
obj = objective
|
|
310
|
-
problem = obj.problem
|
|
311
309
|
|
|
312
310
|
random_seed, rng = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
313
311
|
|
|
314
|
-
lb_np = np.asarray(
|
|
315
|
-
ub_np = np.asarray(
|
|
312
|
+
lb_np = np.asarray(obj.bounds[0])
|
|
313
|
+
ub_np = np.asarray(obj.bounds[1])
|
|
316
314
|
lb_jnp = jnp.asarray(lb_np)
|
|
317
315
|
ub_jnp = jnp.asarray(ub_np)
|
|
318
|
-
n =
|
|
316
|
+
n = obj.n_params
|
|
319
317
|
|
|
320
318
|
sigma = float(sigma0 if sigma0 is not None else np.mean(0.3 * (ub_np - lb_np)))
|
|
321
319
|
|
|
@@ -68,7 +68,7 @@ class EvoxES(OptimizationAlgorithm):
|
|
|
68
68
|
_variant (str): ES variant name (e.g., "CMAES", "OpenES").
|
|
69
69
|
|
|
70
70
|
Note:
|
|
71
|
-
This algorithm uses
|
|
71
|
+
This algorithm uses the objective function with the problem's bounds.
|
|
72
72
|
The population searches directly in the bounded parameter space.
|
|
73
73
|
|
|
74
74
|
Example:
|
|
@@ -146,17 +146,11 @@ class EvoxES(OptimizationAlgorithm):
|
|
|
146
146
|
**es_kwargs: Variant-specific keyword arguments passed to the EvoX algorithm.
|
|
147
147
|
"""
|
|
148
148
|
obj = objective
|
|
149
|
-
problem = obj.problem
|
|
150
149
|
|
|
151
150
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
152
151
|
torch.manual_seed(random_seed)
|
|
153
152
|
|
|
154
|
-
|
|
155
|
-
if not hasattr(problem, "bounds"):
|
|
156
|
-
raise ValueError(
|
|
157
|
-
f"Problem {type(problem).__name__} must have a 'bounds' attribute."
|
|
158
|
-
)
|
|
159
|
-
problem_bounds = problem.bounds
|
|
153
|
+
problem_bounds = obj.bounds
|
|
160
154
|
lb_np = np.asarray(problem_bounds[0])
|
|
161
155
|
ub_np = np.asarray(problem_bounds[1])
|
|
162
156
|
|
|
@@ -210,7 +204,7 @@ class EvoxES(OptimizationAlgorithm):
|
|
|
210
204
|
|
|
211
205
|
def get_center_init():
|
|
212
206
|
return torch.from_numpy(
|
|
213
|
-
np.random.uniform(lb_np, ub_np, size=
|
|
207
|
+
np.random.uniform(lb_np, ub_np, size=obj.n_params)
|
|
214
208
|
).float()
|
|
215
209
|
|
|
216
210
|
# Initialize based on variant-specific requirements
|
|
@@ -241,7 +235,7 @@ class EvoxES(OptimizationAlgorithm):
|
|
|
241
235
|
if "init_mean" not in es_kwargs:
|
|
242
236
|
es_kwargs["init_mean"] = get_center_init()
|
|
243
237
|
if "init_covar" not in es_kwargs:
|
|
244
|
-
es_kwargs["init_covar"] = torch.eye(
|
|
238
|
+
es_kwargs["init_covar"] = torch.eye(obj.n_params).float() * (
|
|
245
239
|
default_sigma**2
|
|
246
240
|
)
|
|
247
241
|
algorithm = AlgorithmClass(pop_size=pop_size, **es_kwargs)
|
|
@@ -250,9 +244,7 @@ class EvoxES(OptimizationAlgorithm):
|
|
|
250
244
|
if "init_mean" not in es_kwargs:
|
|
251
245
|
es_kwargs["init_mean"] = get_center_init()
|
|
252
246
|
if "init_std" not in es_kwargs:
|
|
253
|
-
es_kwargs["init_std"] = (
|
|
254
|
-
torch.ones(problem.n_params).float() * default_sigma
|
|
255
|
-
)
|
|
247
|
+
es_kwargs["init_std"] = torch.ones(obj.n_params).float() * default_sigma
|
|
256
248
|
algorithm = AlgorithmClass(pop_size=pop_size, **es_kwargs)
|
|
257
249
|
|
|
258
250
|
elif self._variant == "DES":
|
|
@@ -41,7 +41,7 @@ class EvoxPSO(OptimizationAlgorithm):
|
|
|
41
41
|
_variant (str): PSO variant name (uppercase, e.g., "PSO", "CLPSO").
|
|
42
42
|
|
|
43
43
|
Note:
|
|
44
|
-
This algorithm uses
|
|
44
|
+
This algorithm uses the objective function with the problem's bounds.
|
|
45
45
|
The swarm searches directly in the bounded parameter space.
|
|
46
46
|
|
|
47
47
|
Example:
|
|
@@ -114,17 +114,11 @@ class EvoxPSO(OptimizationAlgorithm):
|
|
|
114
114
|
**pso_kwargs: Variant-specific keyword arguments passed to the EvoX algorithm.
|
|
115
115
|
"""
|
|
116
116
|
obj = objective
|
|
117
|
-
problem = obj.problem
|
|
118
117
|
|
|
119
118
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
120
119
|
torch.manual_seed(random_seed)
|
|
121
120
|
|
|
122
|
-
|
|
123
|
-
if not hasattr(problem, "bounds"):
|
|
124
|
-
raise ValueError(
|
|
125
|
-
f"Problem {type(problem).__name__} must have a 'bounds' attribute."
|
|
126
|
-
)
|
|
127
|
-
problem_bounds = problem.bounds
|
|
121
|
+
problem_bounds = obj.bounds
|
|
128
122
|
lb = j2t(problem_bounds[0])
|
|
129
123
|
ub = j2t(problem_bounds[1])
|
|
130
124
|
|
|
@@ -126,13 +126,12 @@ class JAXOnePlusOneES(OptimizationAlgorithm):
|
|
|
126
126
|
means unlimited (budget governs stopping).
|
|
127
127
|
"""
|
|
128
128
|
obj = objective
|
|
129
|
-
problem = obj.problem
|
|
130
129
|
|
|
131
130
|
random_seed, rng = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
132
131
|
|
|
133
|
-
lb = jnp.asarray(
|
|
134
|
-
ub = jnp.asarray(
|
|
135
|
-
n =
|
|
132
|
+
lb = jnp.asarray(obj.bounds[0])
|
|
133
|
+
ub = jnp.asarray(obj.bounds[1])
|
|
134
|
+
n = obj.n_params
|
|
136
135
|
|
|
137
136
|
if init_params is None:
|
|
138
137
|
rng, init_rng = jax.random.split(rng)
|
|
@@ -279,13 +278,12 @@ class JAXMuLambdaES(OptimizationAlgorithm):
|
|
|
279
278
|
raise ValueError(f"(μ,λ)-ES requires mu < lam, got mu={mu}, lam={lam}.")
|
|
280
279
|
|
|
281
280
|
obj = objective
|
|
282
|
-
problem = obj.problem
|
|
283
281
|
|
|
284
282
|
random_seed, rng = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
285
283
|
|
|
286
|
-
lb = jnp.asarray(
|
|
287
|
-
ub = jnp.asarray(
|
|
288
|
-
n =
|
|
284
|
+
lb = jnp.asarray(obj.bounds[0])
|
|
285
|
+
ub = jnp.asarray(obj.bounds[1])
|
|
286
|
+
n = obj.n_params
|
|
289
287
|
|
|
290
288
|
if init_params is None:
|
|
291
289
|
rng, init_rng = jax.random.split(rng)
|
|
@@ -64,17 +64,13 @@ class NevergradNGOpt(OptimizationAlgorithm):
|
|
|
64
64
|
n_restarts: Number of independent restarts. Budget is split evenly.
|
|
65
65
|
"""
|
|
66
66
|
obj = objective
|
|
67
|
-
problem = obj.problem
|
|
68
67
|
|
|
69
68
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
70
69
|
|
|
71
|
-
|
|
72
|
-
raise ValueError("NGOpt requires a bounded problem (problem.bounds).")
|
|
73
|
-
|
|
74
|
-
bounds = problem.bounds
|
|
70
|
+
bounds = obj.bounds
|
|
75
71
|
lb = np.asarray(bounds[0], dtype=np.float64)
|
|
76
72
|
ub = np.asarray(bounds[1], dtype=np.float64)
|
|
77
|
-
n_params = int(
|
|
73
|
+
n_params = int(obj.n_params)
|
|
78
74
|
|
|
79
75
|
budget_per_restart = max_iterations // n_restarts if max_iterations else None
|
|
80
76
|
|
|
@@ -64,17 +64,13 @@ class NevergradOnePlusOne(OptimizationAlgorithm):
|
|
|
64
64
|
n_restarts: Number of independent restarts. Budget is split evenly.
|
|
65
65
|
"""
|
|
66
66
|
obj = objective
|
|
67
|
-
problem = obj.problem
|
|
68
67
|
|
|
69
68
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
70
69
|
|
|
71
|
-
|
|
72
|
-
raise ValueError("OnePlusOne requires a bounded problem (problem.bounds).")
|
|
73
|
-
|
|
74
|
-
bounds = problem.bounds
|
|
70
|
+
bounds = obj.bounds
|
|
75
71
|
lb = np.asarray(bounds[0], dtype=np.float64)
|
|
76
72
|
ub = np.asarray(bounds[1], dtype=np.float64)
|
|
77
|
-
n_params = int(
|
|
73
|
+
n_params = int(obj.n_params)
|
|
78
74
|
|
|
79
75
|
# Budget per restart
|
|
80
76
|
budget_per_restart = max_iterations // n_restarts if max_iterations else None
|
|
@@ -73,17 +73,13 @@ class NevergradTBPSA(OptimizationAlgorithm):
|
|
|
73
73
|
counts against the Objective budget. Set >1 for noisy problems.
|
|
74
74
|
"""
|
|
75
75
|
obj = objective
|
|
76
|
-
problem = obj.problem
|
|
77
76
|
|
|
78
77
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
79
78
|
|
|
80
|
-
|
|
81
|
-
raise ValueError("TBPSA requires a bounded problem (problem.bounds).")
|
|
82
|
-
|
|
83
|
-
bounds = problem.bounds
|
|
79
|
+
bounds = obj.bounds
|
|
84
80
|
lb = np.asarray(bounds[0], dtype=np.float64)
|
|
85
81
|
ub = np.asarray(bounds[1], dtype=np.float64)
|
|
86
|
-
n_params = int(
|
|
82
|
+
n_params = int(obj.n_params)
|
|
87
83
|
|
|
88
84
|
budget_per_restart = max_iterations // n_restarts if max_iterations else None
|
|
89
85
|
|
|
@@ -208,14 +208,13 @@ class PyCMACMAES(OptimizationAlgorithm):
|
|
|
208
208
|
means unlimited (budget and convergence govern stopping).
|
|
209
209
|
"""
|
|
210
210
|
obj = objective
|
|
211
|
-
problem = obj.problem
|
|
212
211
|
|
|
213
212
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
214
213
|
|
|
215
|
-
lb_np = np.asarray(
|
|
216
|
-
ub_np = np.asarray(
|
|
214
|
+
lb_np = np.asarray(obj.bounds[0])
|
|
215
|
+
ub_np = np.asarray(obj.bounds[1])
|
|
217
216
|
width = ub_np - lb_np
|
|
218
|
-
n =
|
|
217
|
+
n = obj.n_params
|
|
219
218
|
|
|
220
219
|
# Build the initial mean in unit-cube coordinates.
|
|
221
220
|
if init_params is None:
|
|
@@ -304,14 +303,13 @@ class PyCMAActiveCMAES(OptimizationAlgorithm):
|
|
|
304
303
|
max_iterations: Maximum CMA generations. ``None`` = unlimited.
|
|
305
304
|
"""
|
|
306
305
|
obj = objective
|
|
307
|
-
problem = obj.problem
|
|
308
306
|
|
|
309
307
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
310
308
|
|
|
311
|
-
lb_np = np.asarray(
|
|
312
|
-
ub_np = np.asarray(
|
|
309
|
+
lb_np = np.asarray(obj.bounds[0])
|
|
310
|
+
ub_np = np.asarray(obj.bounds[1])
|
|
313
311
|
width = ub_np - lb_np
|
|
314
|
-
n =
|
|
312
|
+
n = obj.n_params
|
|
315
313
|
|
|
316
314
|
# Build the initial mean in unit-cube coordinates.
|
|
317
315
|
if init_params is None:
|
|
@@ -406,14 +404,13 @@ class PyCMAIPOP(OptimizationAlgorithm):
|
|
|
406
404
|
(independent of the overall budget). ``None`` = unlimited.
|
|
407
405
|
"""
|
|
408
406
|
obj = objective
|
|
409
|
-
problem = obj.problem
|
|
410
407
|
|
|
411
408
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
412
409
|
|
|
413
|
-
lb_np = np.asarray(
|
|
414
|
-
ub_np = np.asarray(
|
|
410
|
+
lb_np = np.asarray(obj.bounds[0])
|
|
411
|
+
ub_np = np.asarray(obj.bounds[1])
|
|
415
412
|
width = ub_np - lb_np
|
|
416
|
-
n =
|
|
413
|
+
n = obj.n_params
|
|
417
414
|
|
|
418
415
|
base_pop = pop_size or _default_pop_size(n)
|
|
419
416
|
# sigma is a dimensionless fraction of the unit cube.
|
|
@@ -521,14 +518,13 @@ class PyCMABIPOP(OptimizationAlgorithm):
|
|
|
521
518
|
``None`` = unlimited.
|
|
522
519
|
"""
|
|
523
520
|
obj = objective
|
|
524
|
-
problem = obj.problem
|
|
525
521
|
|
|
526
522
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
527
523
|
|
|
528
|
-
lb_np = np.asarray(
|
|
529
|
-
ub_np = np.asarray(
|
|
524
|
+
lb_np = np.asarray(obj.bounds[0])
|
|
525
|
+
ub_np = np.asarray(obj.bounds[1])
|
|
530
526
|
width = ub_np - lb_np
|
|
531
|
-
n =
|
|
527
|
+
n = obj.n_params
|
|
532
528
|
|
|
533
529
|
base_pop = pop_size or _default_pop_size(n)
|
|
534
530
|
# sigma is a dimensionless fraction of the unit cube.
|
|
@@ -326,12 +326,11 @@ class VAESampling(OptimizationAlgorithm):
|
|
|
326
326
|
raise ValueError("top_k must be a fraction in (0, 1].")
|
|
327
327
|
|
|
328
328
|
obj = objective
|
|
329
|
-
problem = obj.problem
|
|
330
329
|
|
|
331
330
|
random_seed, _ = self.prepare(obj, unbounded=True, random_seed=random_seed)
|
|
332
331
|
torch.manual_seed(random_seed)
|
|
333
332
|
|
|
334
|
-
input_dim =
|
|
333
|
+
input_dim = obj.n_params
|
|
335
334
|
latent_dim = input_dim // latent_dim_factor + 1
|
|
336
335
|
|
|
337
336
|
# Create VAE
|
|
@@ -87,7 +87,6 @@ class BasinHopping(OptimizationAlgorithm):
|
|
|
87
87
|
of the bound range per dimension).
|
|
88
88
|
"""
|
|
89
89
|
obj = objective
|
|
90
|
-
problem = obj.problem
|
|
91
90
|
|
|
92
91
|
random_seed, _key = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
93
92
|
|
|
@@ -120,8 +119,8 @@ class BasinHopping(OptimizationAlgorithm):
|
|
|
120
119
|
minimizer_kwargs["bounds"] = scipy_bounds(obj)
|
|
121
120
|
|
|
122
121
|
# ── Bounded step-taker ────────────────────────────────────────
|
|
123
|
-
lb = np.asarray(
|
|
124
|
-
ub = np.asarray(
|
|
122
|
+
lb = np.asarray(obj.bounds[0], dtype=np.float64)
|
|
123
|
+
ub = np.asarray(obj.bounds[1], dtype=np.float64)
|
|
125
124
|
take_step = BoundedStep(stepsize, lb, ub)
|
|
126
125
|
|
|
127
126
|
x0 = np.asarray(params, dtype=np.float64)
|
|
@@ -95,27 +95,16 @@ class SciPyObjectiveAdapter:
|
|
|
95
95
|
"""Return SciPy bounds in physical space when requested."""
|
|
96
96
|
if not self.config.use_bounds:
|
|
97
97
|
return None
|
|
98
|
-
problem_bounds = np.asarray(self.obj.
|
|
98
|
+
problem_bounds = np.asarray(self.obj.bounds, dtype=float)
|
|
99
99
|
return Bounds(problem_bounds[0], problem_bounds[1], keep_feasible=True)
|
|
100
100
|
|
|
101
101
|
@property
|
|
102
102
|
def constraints(self) -> tuple:
|
|
103
|
-
"""Return supported SciPy constraints
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
"linear_constraints",
|
|
109
|
-
"nonlinear_constraints",
|
|
110
|
-
):
|
|
111
|
-
if not hasattr(problem, attr_name):
|
|
112
|
-
continue
|
|
113
|
-
value = getattr(problem, attr_name)
|
|
114
|
-
if value not in (None, (), [], {}):
|
|
115
|
-
raise NotImplementedError(
|
|
116
|
-
"Problem exposes constraint metadata via "
|
|
117
|
-
f"'{attr_name}', but this batch only supports box constraints."
|
|
118
|
-
)
|
|
103
|
+
"""Return supported SciPy constraints.
|
|
104
|
+
|
|
105
|
+
This batch only supports box bounds; problems with constraint
|
|
106
|
+
metadata are not handled here.
|
|
107
|
+
"""
|
|
119
108
|
return ()
|
|
120
109
|
|
|
121
110
|
def warmup(self) -> None:
|
|
@@ -133,14 +133,13 @@ class BAxUS(OptimizationAlgorithm):
|
|
|
133
133
|
**bo_kwargs: Extra kwargs for acquisition optimisation.
|
|
134
134
|
"""
|
|
135
135
|
obj = objective
|
|
136
|
-
|
|
137
|
-
D = problem.n_params
|
|
136
|
+
D = obj.n_params
|
|
138
137
|
|
|
139
138
|
random_seed, _ = self.prepare(obj, unbounded=False, random_seed=random_seed)
|
|
140
139
|
torch.manual_seed(random_seed)
|
|
141
140
|
rng = torch.Generator(device="cpu").manual_seed(random_seed)
|
|
142
141
|
|
|
143
|
-
bounds = get_problem_bounds_torch(
|
|
142
|
+
bounds = get_problem_bounds_torch(obj.bounds, self.device, self.dtype)
|
|
144
143
|
|
|
145
144
|
if d_init is None:
|
|
146
145
|
d_init = min(5, D)
|