dfbench 0.2.0__tar.gz → 0.2.1__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.
Files changed (183) hide show
  1. {dfbench-0.2.0 → dfbench-0.2.1}/.gitignore +1 -0
  2. {dfbench-0.2.0 → dfbench-0.2.1}/PKG-INFO +23 -20
  3. {dfbench-0.2.0 → dfbench-0.2.1}/README.md +22 -19
  4. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Objective-API-Reference.md +8 -6
  5. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Problems.md +2 -2
  6. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Storage-and-Checkpointing.md +36 -12
  7. {dfbench-0.2.0 → dfbench-0.2.1}/pyproject.toml +1 -1
  8. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/botorch/botorch_bo.py +8 -2
  9. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/botorch/botorch_turbo.py +8 -2
  10. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/objective.py +33 -23
  11. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/storage/__init__.py +8 -8
  12. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/storage/backends.py +27 -3
  13. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/storage/manager.py +21 -15
  14. dfbench-0.2.1/src/dfbench/core/storage/resolver.py +115 -0
  15. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/storage/saveconfig.py +16 -12
  16. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/storage/state.py +16 -4
  17. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/problems/base_problem.py +8 -2
  18. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/problems/uifo/uifo_problem.py +32 -15
  19. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/problems/voyager/constrained_voyager_problem.py +25 -5
  20. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/problems/voyager/voyager_problem.py +37 -20
  21. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/problems/voyager/voyager_tuning_problem.py +37 -20
  22. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_problem_spec.py +2 -2
  23. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_storage.py +98 -14
  24. dfbench-0.2.0/src/dfbench/core/storage/resolver.py +0 -101
  25. {dfbench-0.2.0 → dfbench-0.2.1}/LICENSE +0 -0
  26. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Algorithm-Status.md +0 -0
  27. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Algorithms.md +0 -0
  28. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Architecture-Overview.md +0 -0
  29. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Benchmarking.md +0 -0
  30. {dfbench-0.2.0 → dfbench-0.2.1}/docs/FAQ.md +0 -0
  31. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Home.md +0 -0
  32. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Implementing-a-New-Algorithm.md +0 -0
  33. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Installation.md +0 -0
  34. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Metrics-Reference.md +0 -0
  35. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Testing.md +0 -0
  36. {dfbench-0.2.0 → dfbench-0.2.1}/docs/Utilities-and-Helpers.md +0 -0
  37. {dfbench-0.2.0 → dfbench-0.2.1}/docs/_Sidebar.md +0 -0
  38. {dfbench-0.2.0 → dfbench-0.2.1}/docs/algorithm-status/main.typ +0 -0
  39. {dfbench-0.2.0 → dfbench-0.2.1}/docs/algorithm-status/template.typ +0 -0
  40. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/__init__.py +0 -0
  41. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/__init__.py +0 -0
  42. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/__init__.py +0 -0
  43. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/_dfo_common.py +0 -0
  44. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/_scipy_common.py +0 -0
  45. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/nelder_mead.py +0 -0
  46. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/omads_mads.py +0 -0
  47. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/pdfo/__init__.py +0 -0
  48. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/pdfo/lincoa.py +0 -0
  49. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/pdfo/newuoa.py +0 -0
  50. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/pdfo/uobyqa.py +0 -0
  51. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/powell.py +0 -0
  52. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/derivative_free/pybobyqa.py +0 -0
  53. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/__init__.py +0 -0
  54. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/cmaes_sep_cma.py +0 -0
  55. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/evosax_es.py +0 -0
  56. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/evox_es.py +0 -0
  57. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/evox_pso.py +0 -0
  58. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/jax_es.py +0 -0
  59. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/nevergrad/__init__.py +0 -0
  60. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/nevergrad/_common.py +0 -0
  61. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/nevergrad/ngopt.py +0 -0
  62. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/nevergrad/oneplusone.py +0 -0
  63. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/nevergrad/tbpsa.py +0 -0
  64. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/pycma_cmaes.py +0 -0
  65. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/evolutionary/random_search.py +0 -0
  66. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/generative/vae_sampling.py +0 -0
  67. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/global_search/__init__.py +0 -0
  68. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/global_search/basin_hopping.py +0 -0
  69. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/global_search/dual_annealing.py +0 -0
  70. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/__init__.py +0 -0
  71. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/adam_gd.py +0 -0
  72. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/custom_jax.py +0 -0
  73. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/lbfgs_gd.py +0 -0
  74. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/na_adam_gd.py +0 -0
  75. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/__init__.py +0 -0
  76. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/_common.py +0 -0
  77. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/adabelief.py +0 -0
  78. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/adadelta.py +0 -0
  79. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/adafactor.py +0 -0
  80. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/adagrad.py +0 -0
  81. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/adam.py +0 -0
  82. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/adamax.py +0 -0
  83. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/adamaxw.py +0 -0
  84. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/adamw.py +0 -0
  85. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/adan.py +0 -0
  86. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/amsgrad.py +0 -0
  87. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/lamb.py +0 -0
  88. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/lion.py +0 -0
  89. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/lookahead.py +0 -0
  90. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/nadam.py +0 -0
  91. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/nadamw.py +0 -0
  92. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/noisy_sgd.py +0 -0
  93. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/novograd.py +0 -0
  94. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/oadam.py +0 -0
  95. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/ogd.py +0 -0
  96. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/polyak_sgd.py +0 -0
  97. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/radam.py +0 -0
  98. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/rmsprop.py +0 -0
  99. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/rprop.py +0 -0
  100. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/sam.py +0 -0
  101. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/schedule_free_adam.py +0 -0
  102. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/sgd.py +0 -0
  103. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/sign.py +0 -0
  104. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/sm3.py +0 -0
  105. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/sophia.py +0 -0
  106. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax/yogi.py +0 -0
  107. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/optax_lbfgs.py +0 -0
  108. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/sa_gd.py +0 -0
  109. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/__init__.py +0 -0
  110. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/_common.py +0 -0
  111. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/bfgs.py +0 -0
  112. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/cobyla.py +0 -0
  113. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/cobyqa.py +0 -0
  114. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/dogleg.py +0 -0
  115. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/lbfgsb.py +0 -0
  116. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/newton_cg.py +0 -0
  117. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/nonlinear_cg.py +0 -0
  118. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/slsqp.py +0 -0
  119. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/sr1.py +0 -0
  120. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/tnc.py +0 -0
  121. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/trust_constr.py +0 -0
  122. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/trust_krylov.py +0 -0
  123. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/gradient_based/scipy/trust_ncg.py +0 -0
  124. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/__init__.py +0 -0
  125. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/ax_baxus.py +0 -0
  126. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/ax_saasbo.py +0 -0
  127. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/botorch/__init__.py +0 -0
  128. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/botorch/_botorch_common.py +0 -0
  129. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/botorch/botorch_gebo.py +0 -0
  130. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/botorch/botorch_linebo.py +0 -0
  131. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/botorch/botorch_qkg.py +0 -0
  132. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/botorch/botorch_qnei.py +0 -0
  133. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/botorch/botorch_rembo.py +0 -0
  134. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/hebo_bo.py +0 -0
  135. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/restir.py +0 -0
  136. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/smac_bo.py +0 -0
  137. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/surrogate_based/turbo_lbfgs.py +0 -0
  138. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/utils/__init__.py +0 -0
  139. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/utils/gp.py +0 -0
  140. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/utils/initial_design.py +0 -0
  141. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/utils/misc.py +0 -0
  142. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/algorithms/utils/weighted_acq.py +0 -0
  143. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/benchmark/__init__.py +0 -0
  144. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/benchmark/benchmark.py +0 -0
  145. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/benchmark/metrics.py +0 -0
  146. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/_init_env.py +0 -0
  147. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/algorithm.py +0 -0
  148. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/config.py +0 -0
  149. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/display.py +0 -0
  150. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/problem.py +0 -0
  151. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/storage/exporter.py +0 -0
  152. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/storage/serializers.py +0 -0
  153. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/core/utils.py +0 -0
  154. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/problems/__init__.py +0 -0
  155. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/problems/uifo/__init__.py +0 -0
  156. {dfbench-0.2.0 → dfbench-0.2.1}/src/dfbench/problems/voyager/__init__.py +0 -0
  157. {dfbench-0.2.0 → dfbench-0.2.1}/tests/__init__.py +0 -0
  158. {dfbench-0.2.0 → dfbench-0.2.1}/tests/conftest.py +0 -0
  159. {dfbench-0.2.0 → dfbench-0.2.1}/tests/slow/__init__.py +0 -0
  160. {dfbench-0.2.0 → dfbench-0.2.1}/tests/slow/test_algorithms_integration.py +0 -0
  161. {dfbench-0.2.0 → dfbench-0.2.1}/tests/slow/test_benchmark_full.py +0 -0
  162. {dfbench-0.2.0 → dfbench-0.2.1}/tests/slow/test_problems_full.py +0 -0
  163. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_algorithm_protocol.py +0 -0
  164. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_algorithms_uniform.py +0 -0
  165. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_algorithms_unit.py +0 -0
  166. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_api_imports.py +0 -0
  167. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_benchmark_smoke.py +0 -0
  168. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_bo_batch.py +0 -0
  169. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_cma_family.py +0 -0
  170. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_config.py +0 -0
  171. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_custom_jax_batch.py +0 -0
  172. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_dfo_algorithms.py +0 -0
  173. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_display.py +0 -0
  174. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_init_env.py +0 -0
  175. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_metrics.py +0 -0
  176. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_objective_invariants.py +0 -0
  177. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_objective_penalty_fn.py +0 -0
  178. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_objective_randomness.py +0 -0
  179. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_objective_space_mode.py +0 -0
  180. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_problem_bounds_overrides.py +0 -0
  181. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_problem_protocol.py +0 -0
  182. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_scipy_wrapper.py +0 -0
  183. {dfbench-0.2.0 → dfbench-0.2.1}/tests/test_utils.py +0 -0
@@ -23,6 +23,7 @@ temp/
23
23
  results/
24
24
  notebooks/
25
25
  .DS_Store
26
+ .github/
26
27
 
27
28
  # IDE related
28
29
  .vscode/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dfbench
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Differometor Benchmark - Optimization algorithms and problem definitions
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
@@ -88,11 +88,14 @@ Provides-Extra: torch
88
88
  Requires-Dist: torch>=2.9.1; extra == 'torch'
89
89
  Description-Content-Type: text/markdown
90
90
 
91
+ > [!IMPORTANT]
92
+ > **BETA RELEASE:** This repository is currently in beta. The official competition will start on **July ~7**.
93
+
91
94
  # Differometor Benchmark
92
95
 
93
96
  A benchmarking framework for optimization algorithms on gravitational-wave detector design problems, built on top of the [Differometor](https://github.com/artificial-scientist-lab/Differometor) simulator.
94
97
 
95
- > **For detailed documentation, see the [Wiki](docs/Home.md).**
98
+ > **For detailed documentation, see the [Wiki](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki).**
96
99
 
97
100
  ## TL;DR (I want to try my own algorithm)
98
101
 
@@ -171,11 +174,11 @@ This adds negligible overhead compared to the objective function itself.
171
174
 
172
175
  Both constrained problems accept a `power_penalty_fn(value, threshold)` callable to control how power-constraint violations are penalized. Built-in presets: `squashed_relu_penalty` (default), `relu_penalty`, `zero_penalty`. Feel free to try own ones. The penalty function can also be swapped after construction via `obj.set_penalty_fn(fn)` (before `obj.start_logging()`), which re-traces the objective so the change takes effect. The unconstrained Voyager problems reject this call because they have no power-constraint path.
173
176
 
174
- Constrained problems also expose aux diagnostics. `obj.value_aux(params)` and `obj.vmap_value_aux(batch)` return `(loss, aux)` where `aux` carries the loss decomposition, a physical `is_feasible` flag, per-constraint violations, and the raw per-group power arrays. Enable `save` tokens like `is_feasible`, `power_values`, or the `aux` alias and the standard `obj.value` / `obj.value_and_grad` loop records the enabled aux fields in the same forward pass, with no code change. See [Problems](docs/Problems.md) for the aux schema and [Objective API Reference](docs/Objective-API-Reference.md) for the full method set.
177
+ Constrained problems also expose aux diagnostics. `obj.value_aux(params)` and `obj.vmap_value_aux(batch)` return `(loss, aux)` where `aux` carries the loss decomposition, a physical `is_feasible` flag, per-constraint violations, and the raw per-group power arrays. Enable `save` tokens like `is_feasible`, `power_values`, or the `aux` alias and the standard `obj.value` / `obj.value_and_grad` loop records the enabled aux fields in the same forward pass, with no code change. See [Problems](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Problems) for the aux schema and [Objective API Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Objective-API-Reference) for the full method set.
175
178
 
176
179
  All problems also support `bounds_overrides` (e.g. `{"tuning": (0, 45)}`) to narrow default property bounds and `signal_floor` to floor detector signal magnitudes before sensitivity normalization. `signal_floor` defaults to `1e-20`. Use `problem.print_bounds()` to inspect effective bounds.
177
180
 
178
- See [Problems](docs/Problems.md) for details on loss computation, parameter meanings, and constraints.
181
+ See [Problems](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Problems) for details on loss computation, parameter meanings, and constraints.
179
182
 
180
183
  ---
181
184
 
@@ -212,7 +215,7 @@ pip install -e . # CPU-only editable install
212
215
  pip install -e ".[all,cuda13,analysis]" # All backends, CUDA 13, and analysis extras
213
216
  ```
214
217
 
215
- See [Installation](docs/Installation.md) for GPU setup details and HPC notes.
218
+ See [Installation](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Installation) for GPU setup details and HPC notes.
216
219
 
217
220
  ---
218
221
 
@@ -235,7 +238,7 @@ OptimizationAlgorithm.optimize()
235
238
 
236
239
  **Design Idea:** Algorithms never create their own `Objective`, they receive a pre-configured one. This lets the benchmark harness or user script control budgets, seeds, and history settings uniformly. The algorithm only has to implement its optimization logic.
237
240
 
238
- See [Architecture Overview](docs/Architecture-Overview.md) for full design details.
241
+ See [Architecture Overview](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Architecture-Overview) for full design details.
239
242
 
240
243
  ---
241
244
 
@@ -337,7 +340,7 @@ benchmark.print_summary(results)
337
340
  - `save_csv`: Writes a CSV with all metrics computed at evenly-spaced time points.
338
341
  - `save_run_data`: Persists raw loss/params/time histories to NPZ files for later re-evaluation.
339
342
 
340
- See [Benchmarking](docs/Benchmarking.md) for full configuration options and [Metrics Reference](docs/Metrics-Reference.md) for what gets computed.
343
+ See [Benchmarking](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Benchmarking) for full configuration options and [Metrics Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Metrics-Reference) for what gets computed.
341
344
 
342
345
  ### Native-JAX Custom/Hybrid Batch
343
346
 
@@ -360,7 +363,7 @@ see `scripts/voyager_native_jax_custom_batch.py`.
360
363
 
361
364
  The interface is designed to make this as simple as possible. You write the optimization logic; `Objective` handles everything else (timing, logging, budget enforcement, file I/O).
362
365
 
363
- > **Full step-by-step tutorial:** [Implementing a New Algorithm](docs/Implementing-a-New-Algorithm.md)
366
+ > **Full step-by-step tutorial:** [Implementing a New Algorithm](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Implementing-a-New-Algorithm)
364
367
 
365
368
  ### The Contract
366
369
 
@@ -495,7 +498,7 @@ obj.loss_history # full loss history
495
498
  obj.time_steps # elapsed time at each evaluation
496
499
  ```
497
500
 
498
- See [Objective API Reference](docs/Objective-API-Reference.md) for the complete interface.
501
+ See [Objective API Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Objective-API-Reference) for the complete interface.
499
502
 
500
503
  ---
501
504
 
@@ -538,7 +541,7 @@ See [Objective API Reference](docs/Objective-API-Reference.md) for the complete
538
541
  | `ReSTIR` | Surrogate | GPU-native kNN surrogate, scales to 100k+ candidates |
539
542
  | `VAESampling` | Generative | Latent-space compression + BO |
540
543
 
541
- See [Algorithms](docs/Algorithms.md) for hyperparameter details and usage examples.
544
+ See [Algorithms](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Algorithms) for hyperparameter details and usage examples.
542
545
 
543
546
  ---
544
547
 
@@ -568,13 +571,13 @@ For in-depth documentation beyond this README:
568
571
 
569
572
  | Page | Content |
570
573
  |------|---------|
571
- | [Architecture Overview](docs/Architecture-Overview.md) | Design, module map, data-flow diagrams |
572
- | [Objective API Reference](docs/Objective-API-Reference.md) | Complete `Objective` class reference |
573
- | [Problems](docs/Problems.md) | Loss computation, parameter meanings, constraints |
574
- | [Algorithms](docs/Algorithms.md) | All built-in algorithms with hyperparameters |
575
- | [Implementing a New Algorithm](docs/Implementing-a-New-Algorithm.md) | Full step-by-step contributor tutorial |
576
- | [Benchmarking](docs/Benchmarking.md) | Running benchmarks, saving/loading results |
577
- | [Metrics Reference](docs/Metrics-Reference.md) | Every benchmark metric explained |
578
- | [Utilities & Helpers](docs/Utilities-and-Helpers.md) | `t2j`/`j2t`, CLI config, inverse sigmoid |
579
- | [Installation](docs/Installation.md) | Environment setup, GPU support, HPC notes |
580
- | [FAQ](docs/FAQ.md) | Common pitfalls and troubleshooting |
574
+ | [Architecture Overview](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Architecture-Overview) | Design, module map, data-flow diagrams |
575
+ | [Objective API Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Objective-API-Reference) | Complete `Objective` class reference |
576
+ | [Problems](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Problems) | Loss computation, parameter meanings, constraints |
577
+ | [Algorithms](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Algorithms) | All built-in algorithms with hyperparameters |
578
+ | [Implementing a New Algorithm](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Implementing-a-New-Algorithm) | Full step-by-step contributor tutorial |
579
+ | [Benchmarking](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Benchmarking) | Running benchmarks, saving/loading results |
580
+ | [Metrics Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Metrics-Reference) | Every benchmark metric explained |
581
+ | [Utilities & Helpers](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Utilities-and-Helpers) | `t2j`/`j2t`, CLI config, inverse sigmoid |
582
+ | [Installation](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Installation) | Environment setup, GPU support, HPC notes |
583
+ | [FAQ](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/FAQ) | Common pitfalls and troubleshooting |
@@ -1,8 +1,11 @@
1
+ > [!IMPORTANT]
2
+ > **BETA RELEASE:** This repository is currently in beta. The official competition will start on **July ~7**.
3
+
1
4
  # Differometor Benchmark
2
5
 
3
6
  A benchmarking framework for optimization algorithms on gravitational-wave detector design problems, built on top of the [Differometor](https://github.com/artificial-scientist-lab/Differometor) simulator.
4
7
 
5
- > **For detailed documentation, see the [Wiki](docs/Home.md).**
8
+ > **For detailed documentation, see the [Wiki](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki).**
6
9
 
7
10
  ## TL;DR (I want to try my own algorithm)
8
11
 
@@ -81,11 +84,11 @@ This adds negligible overhead compared to the objective function itself.
81
84
 
82
85
  Both constrained problems accept a `power_penalty_fn(value, threshold)` callable to control how power-constraint violations are penalized. Built-in presets: `squashed_relu_penalty` (default), `relu_penalty`, `zero_penalty`. Feel free to try own ones. The penalty function can also be swapped after construction via `obj.set_penalty_fn(fn)` (before `obj.start_logging()`), which re-traces the objective so the change takes effect. The unconstrained Voyager problems reject this call because they have no power-constraint path.
83
86
 
84
- Constrained problems also expose aux diagnostics. `obj.value_aux(params)` and `obj.vmap_value_aux(batch)` return `(loss, aux)` where `aux` carries the loss decomposition, a physical `is_feasible` flag, per-constraint violations, and the raw per-group power arrays. Enable `save` tokens like `is_feasible`, `power_values`, or the `aux` alias and the standard `obj.value` / `obj.value_and_grad` loop records the enabled aux fields in the same forward pass, with no code change. See [Problems](docs/Problems.md) for the aux schema and [Objective API Reference](docs/Objective-API-Reference.md) for the full method set.
87
+ Constrained problems also expose aux diagnostics. `obj.value_aux(params)` and `obj.vmap_value_aux(batch)` return `(loss, aux)` where `aux` carries the loss decomposition, a physical `is_feasible` flag, per-constraint violations, and the raw per-group power arrays. Enable `save` tokens like `is_feasible`, `power_values`, or the `aux` alias and the standard `obj.value` / `obj.value_and_grad` loop records the enabled aux fields in the same forward pass, with no code change. See [Problems](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Problems) for the aux schema and [Objective API Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Objective-API-Reference) for the full method set.
85
88
 
86
89
  All problems also support `bounds_overrides` (e.g. `{"tuning": (0, 45)}`) to narrow default property bounds and `signal_floor` to floor detector signal magnitudes before sensitivity normalization. `signal_floor` defaults to `1e-20`. Use `problem.print_bounds()` to inspect effective bounds.
87
90
 
88
- See [Problems](docs/Problems.md) for details on loss computation, parameter meanings, and constraints.
91
+ See [Problems](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Problems) for details on loss computation, parameter meanings, and constraints.
89
92
 
90
93
  ---
91
94
 
@@ -122,7 +125,7 @@ pip install -e . # CPU-only editable install
122
125
  pip install -e ".[all,cuda13,analysis]" # All backends, CUDA 13, and analysis extras
123
126
  ```
124
127
 
125
- See [Installation](docs/Installation.md) for GPU setup details and HPC notes.
128
+ See [Installation](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Installation) for GPU setup details and HPC notes.
126
129
 
127
130
  ---
128
131
 
@@ -145,7 +148,7 @@ OptimizationAlgorithm.optimize()
145
148
 
146
149
  **Design Idea:** Algorithms never create their own `Objective`, they receive a pre-configured one. This lets the benchmark harness or user script control budgets, seeds, and history settings uniformly. The algorithm only has to implement its optimization logic.
147
150
 
148
- See [Architecture Overview](docs/Architecture-Overview.md) for full design details.
151
+ See [Architecture Overview](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Architecture-Overview) for full design details.
149
152
 
150
153
  ---
151
154
 
@@ -247,7 +250,7 @@ benchmark.print_summary(results)
247
250
  - `save_csv`: Writes a CSV with all metrics computed at evenly-spaced time points.
248
251
  - `save_run_data`: Persists raw loss/params/time histories to NPZ files for later re-evaluation.
249
252
 
250
- See [Benchmarking](docs/Benchmarking.md) for full configuration options and [Metrics Reference](docs/Metrics-Reference.md) for what gets computed.
253
+ See [Benchmarking](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Benchmarking) for full configuration options and [Metrics Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Metrics-Reference) for what gets computed.
251
254
 
252
255
  ### Native-JAX Custom/Hybrid Batch
253
256
 
@@ -270,7 +273,7 @@ see `scripts/voyager_native_jax_custom_batch.py`.
270
273
 
271
274
  The interface is designed to make this as simple as possible. You write the optimization logic; `Objective` handles everything else (timing, logging, budget enforcement, file I/O).
272
275
 
273
- > **Full step-by-step tutorial:** [Implementing a New Algorithm](docs/Implementing-a-New-Algorithm.md)
276
+ > **Full step-by-step tutorial:** [Implementing a New Algorithm](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Implementing-a-New-Algorithm)
274
277
 
275
278
  ### The Contract
276
279
 
@@ -405,7 +408,7 @@ obj.loss_history # full loss history
405
408
  obj.time_steps # elapsed time at each evaluation
406
409
  ```
407
410
 
408
- See [Objective API Reference](docs/Objective-API-Reference.md) for the complete interface.
411
+ See [Objective API Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Objective-API-Reference) for the complete interface.
409
412
 
410
413
  ---
411
414
 
@@ -448,7 +451,7 @@ See [Objective API Reference](docs/Objective-API-Reference.md) for the complete
448
451
  | `ReSTIR` | Surrogate | GPU-native kNN surrogate, scales to 100k+ candidates |
449
452
  | `VAESampling` | Generative | Latent-space compression + BO |
450
453
 
451
- See [Algorithms](docs/Algorithms.md) for hyperparameter details and usage examples.
454
+ See [Algorithms](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Algorithms) for hyperparameter details and usage examples.
452
455
 
453
456
  ---
454
457
 
@@ -478,13 +481,13 @@ For in-depth documentation beyond this README:
478
481
 
479
482
  | Page | Content |
480
483
  |------|---------|
481
- | [Architecture Overview](docs/Architecture-Overview.md) | Design, module map, data-flow diagrams |
482
- | [Objective API Reference](docs/Objective-API-Reference.md) | Complete `Objective` class reference |
483
- | [Problems](docs/Problems.md) | Loss computation, parameter meanings, constraints |
484
- | [Algorithms](docs/Algorithms.md) | All built-in algorithms with hyperparameters |
485
- | [Implementing a New Algorithm](docs/Implementing-a-New-Algorithm.md) | Full step-by-step contributor tutorial |
486
- | [Benchmarking](docs/Benchmarking.md) | Running benchmarks, saving/loading results |
487
- | [Metrics Reference](docs/Metrics-Reference.md) | Every benchmark metric explained |
488
- | [Utilities & Helpers](docs/Utilities-and-Helpers.md) | `t2j`/`j2t`, CLI config, inverse sigmoid |
489
- | [Installation](docs/Installation.md) | Environment setup, GPU support, HPC notes |
490
- | [FAQ](docs/FAQ.md) | Common pitfalls and troubleshooting |
484
+ | [Architecture Overview](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Architecture-Overview) | Design, module map, data-flow diagrams |
485
+ | [Objective API Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Objective-API-Reference) | Complete `Objective` class reference |
486
+ | [Problems](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Problems) | Loss computation, parameter meanings, constraints |
487
+ | [Algorithms](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Algorithms) | All built-in algorithms with hyperparameters |
488
+ | [Implementing a New Algorithm](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Implementing-a-New-Algorithm) | Full step-by-step contributor tutorial |
489
+ | [Benchmarking](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Benchmarking) | Running benchmarks, saving/loading results |
490
+ | [Metrics Reference](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Metrics-Reference) | Every benchmark metric explained |
491
+ | [Utilities & Helpers](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Utilities-and-Helpers) | `t2j`/`j2t`, CLI config, inverse sigmoid |
492
+ | [Installation](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/Installation) | Environment setup, GPU support, HPC notes |
493
+ | [FAQ](https://github.com/artificial-scientist-lab/Differometor-Benchmark/wiki/FAQ) | Common pitfalls and troubleshooting |
@@ -22,6 +22,7 @@ Objective(
22
22
  max_time: float | None = None,
23
23
  save_time_steps: bool = True,
24
24
  save_params_history: bool = True,
25
+ save_batched_params_history: bool = False,
25
26
  save: list[str] | None = None,
26
27
  verbose: int = 0,
27
28
  print_every: int = 100,
@@ -46,7 +47,8 @@ Objective(
46
47
  | `max_time` | `float \| None` | `None` | Maximum wall-clock seconds beginning at the time `obj.start_logging()` was called. `None` = unlimited. |
47
48
  | `save_time_steps` | `bool` | `True` | Record elapsed-time timestamp for each evaluation. |
48
49
  | `save_params_history` | `bool` | `True` | Record the parameter vector at each evaluation. |
49
- | `save` | `list[str] \| None` | `None` | List of advanced save tokens for recording additional / batched histories. Standard tokens: `"grad"`, `"hessian"`, `"eval_type"`, `"batched_loss"`, `"batched_grad"`, `"batched_hessian"`, `"batched_param"`, `"batched"` (convenience alias expanding to all four batched tokens). Aux diagnostics tokens (recorded by the `*_aux` evaluation methods on problems that opt into the power-penalty contract): `"sensitivity_loss"`, `"penalty"`, `"is_feasible"`, `"power_values"`, `"violations"`, `"aux"` (convenience alias expanding to all five), plus per-field `batched_*` variants and `"batched_aux"` (see Choosing what to save). The active configuration is recorded as a `SaveConfig` and embedded in every checkpoint so a resumed run can detect mismatches. |
50
+ | `save_batched_params_history` | `bool` | `False` | Store full `(batch, n_params)` parameter arrays for batched evals instead of the reduced representative point. |
51
+ | `save` | `list[str] \| None` | `None` | List of advanced save tokens for recording additional / batched histories. Standard tokens: `"grad"`, `"hessian"`, `"eval_type"`, `"batched_loss"`, `"batched_grad"`, `"batched_hessian"`, `"batched"` (convenience alias expanding to the three batched tokens above). Aux diagnostics tokens (recorded by the `*_aux` evaluation methods on problems that opt into the power-penalty contract): `"sensitivity_loss"`, `"penalty"`, `"is_feasible"`, `"power_values"`, `"violations"`, `"aux"` (convenience alias expanding to all five), plus per-field `batched_*` variants and `"batched_aux"` (see Choosing what to save). The active configuration is recorded as a `SaveConfig` and embedded in every checkpoint so a resumed run can detect mismatches. |
50
52
  | `verbose` | `int` | `0` | Verbosity level. `0` = silent; `1` = periodic progress prints; `2` is WIP. |
51
53
  | `print_every` | `int` | `100` | When `verbose ≥ 1`, print a progress summary every N evaluations. |
52
54
  | `algorithm_str` | `str \| None` | `None` | If `None`, this is set by the algorithm via `prepare()` of `OptimizationAlgorithm`. Optional identifier string used in file names and logs. |
@@ -125,12 +127,13 @@ You do **not** need to handle bounds scaling — the Objective does that automat
125
127
 
126
128
  ### Choosing what to save
127
129
 
128
- The Objective always records losses. Two standard boolean flags control the most commonly toggled histories:
130
+ The Objective always records losses. Three standard boolean flags control the most commonly toggled histories:
129
131
 
130
132
  | Flag | Default | Effect |
131
133
  |------|---------|--------|
132
134
  | `save_time_steps` | `True` | Record elapsed-time timestamps per evaluation |
133
135
  | `save_params_history` | `True` | Record parameter vectors (reduced for batches) |
136
+ | `save_batched_params_history` | `False` | Store full `(batch, n_params)` parameter arrays instead of the reduced representative point |
134
137
 
135
138
  For advanced combinations (gradients, Hessians, eval types, full batched arrays), pass a list of string tokens to `save`:
136
139
 
@@ -142,8 +145,7 @@ For advanced combinations (gradients, Hessians, eval types, full batched arrays)
142
145
  | `"batched_loss"` | Store full `(batch,)` loss vectors instead of batch min |
143
146
  | `"batched_grad"` | Store full `(batch, n_params)` gradient arrays |
144
147
  | `"batched_hessian"` | Store full `(batch, n_params, n_params)` Hessian arrays |
145
- | `"batched_param"` | Store full `(batch, n_params)` parameter arrays |
146
- | `"batched"` | Convenience alias expanding to all four `batched_*` tokens above |
148
+ | `"batched"` | Convenience alias expanding to the three `batched_*` tokens above |
147
149
 
148
150
  Aux diagnostics tokens are recorded by the `*_aux` evaluation methods, and also by the standard loss-bearing methods (`value`, `value_and_grad`, `vmap_value`, `vmap_value_and_grad`, `value_grad_and_hessian`, `vmap_value_grad_and_hessian`) when auto-logging is active. Auto-logging turns on when at least one aux token is in the `save` list and the problem opts into the power-penalty contract (`ConstrainedVoyagerProblem`, `UIFOProblem`); the standard methods then run the aux objective in the same forward pass and populate the aux histories without changing their return signatures (see [Auto-logging aux](#auto-logging-aux-from-the-standard-methods)). Each token controls one aux field, so enabling `is_feasible` does not force storing the bulky `power_values` arrays.
149
151
 
@@ -544,7 +546,7 @@ Saves the full optimization state to a checkpoint file via the internal `Checkpo
544
546
 
545
547
  The checkpoint embeds `RunMetadata` (problem/algo/budget identity, `SaveConfig`, and the problem's typed `ProblemSpec` container; see [Problems](Problems)), so the file is fully self-describing.
546
548
 
547
- Default path (built by `RunPathResolver`): `data/objective_run_data/{budget_dir}/{algo}_{hyper_param_str}/{problem}_{algo}_{timestamp}.npz`
549
+ Default path (built by `RunPathResolver`, then anchored to a directory by `LocalFilesystemBackend`): `<checkpoint_dir>/{budget_dir}/{problem}_{algo}_{hyper_param_str}_{timestamp}.npz`, absolute on disk. `checkpoint_dir` defaults to `./data/objective_run_data`. Set `RunPathResolver(algo_directory=True)` to add an `{algo}_{hyper_param_str}` subdirectory under `{budget_dir}`.
548
550
 
549
551
  The first save without explicit overrides caches the path; subsequent periodic saves overwrite the same file.
550
552
 
@@ -603,7 +605,7 @@ Every evaluation method follows the same pipeline internally:
603
605
  3. **`_log_evals(params, loss, grad, hessian, time_exceeded)`** — record histories; update `best_loss` / `best_params`; update `improvement_count` / `evals_since_improvement`; check eval budget. Receives `time_exceeded` as an explicit parameter from `_log()` to ensure a consistent time snapshot.
604
606
  4. **`_log_to_file()`** — calls `CheckpointManager.tick(eval_count, state_factory)`, which checks the cadence (`save_every`, set from `save_to_file_every`), lazily builds a `RunState` only when a checkpoint is due, saves it through the internal `StorageBackend`, and returns the wall-clock duration of the save. The Objective advances `_start_time` by that duration so the checkpoint write does not consume wall-clock budget.
605
607
 
606
- > **Important:** These are private methods — do not call `_log()`, `_log_evals()`, or `_log_to_file()` directly from algorithm code. If you want manual logging, use the public `log_evaluation(params, loss, grad, hessian=None)` method instead, which delegates to `_log()`. See the [JIT-compiled loop guide](Implementing-a-New-Algorithm.md#custom-jit-compiled-loops-with-log_evaluation) for details.
608
+ > **Important:** These are private methods — do not call `_log()`, `_log_evals()`, or `_log_to_file()` directly from algorithm code. If you want manual logging, use the public `log_evaluation(params, loss, grad, hessian=None)` method instead, which delegates to `_log()`. See the [JIT-compiled loop guide](Implementing-a-New-Algorithm#custom-jit-compiled-loops-with-log_evaluation) for details.
607
609
 
608
610
  Budget enforcement happens *after* the evaluation returns. This means the algorithm always receives a valid result, but once any budget is exceeded the history stops growing and `budget_exceeded` becomes `True`.
609
611
 
@@ -224,12 +224,12 @@ The constrained problems also expose a JIT-compiled `objective_function_aux(para
224
224
  | `sensitivity_loss` | scalar | The unpenalised sensitivity loss. |
225
225
  | `penalty` | scalar | The summed penalty contribution. |
226
226
  | `is_feasible` | scalar bool | `True` iff every per-group power is at or below its threshold. This is a physical check, independent of the active `power_penalty_fn` preset, so it stays meaningful even when the penalty is disabled with `zero_penalty`. |
227
- | `violations` | `(n_constraints, n_freq)` | Per-constraint penalty values. |
227
+ | `violations` | `(n_constraints,)` | Per-constraint penalty values. |
228
228
  | `power_values` | dict with `hard`, `soft`, `detector` leaves | Raw per-group power arrays. |
229
229
 
230
230
  Because `aux` is a JAX pytree, `objective_function_aux` vmapps cleanly: a batched call adds a leading batch dim to every leaf, including the `power_values` sub-arrays.
231
231
 
232
- The `Objective` wraps this with `value_aux`, `value_and_grad_aux`, `vmap_value_aux`, and `vmap_value_and_grad_aux`. These thread aux through logging and the save-token system: each aux field has its own token (`sensitivity_loss`, `penalty`, `is_feasible`, `power_values`, `violations`) plus a `batched_*` variant and `aux` / `batched_aux` convenience aliases. When a `batched_*` token is off and the non-batched token is on, batched aux entries are reduced to the representative point picked by the loss minimum, so the recorded `is_feasible` and `violations` reflect that best point. `Objective.best_is_feasible` reports the feasibility of the best-loss point from that recorded history. Full reference in the [Objective API Reference](Objective-API-Reference.md).
232
+ The `Objective` wraps this with `value_aux`, `value_and_grad_aux`, `vmap_value_aux`, and `vmap_value_and_grad_aux`. These thread aux through logging and the save-token system: each aux field has its own token (`sensitivity_loss`, `penalty`, `is_feasible`, `power_values`, `violations`) plus a `batched_*` variant and `aux` / `batched_aux` convenience aliases. When a `batched_*` token is off and the non-batched token is on, batched aux entries are reduced to the representative point picked by the loss minimum, so the recorded `is_feasible` and `violations` reflect that best point. `Objective.best_is_feasible` reports the feasibility of the best-loss point from that recorded history. Full reference in the [Objective API Reference](Objective-API-Reference).
233
233
 
234
234
  ---
235
235
 
@@ -154,7 +154,7 @@ manager = CheckpointManager(serializer=JsonCheckpointSerializer())
154
154
 
155
155
  ## Storage Backends
156
156
 
157
- A `StorageBackend` is a small protocol (`save_bytes` / `load_bytes` / `exists` / `delete`). Keeping it this narrow means the local filesystem can be swapped for memory, S3, or any other target without touching the serializers or the `CheckpointManager`.
157
+ A `StorageBackend` is a small protocol (`save_bytes` / `load_bytes` / `exists` / `delete` / `resolve`). Keeping it this narrow means the local filesystem can be swapped for memory, S3, or any other target without touching the serializers or the `CheckpointManager`.
158
158
 
159
159
  ### `LocalFilesystemBackend` (default)
160
160
 
@@ -172,27 +172,50 @@ backend = LocalFilesystemBackend(root="./data/objective_run_data")
172
172
 
173
173
  **Why atomic writes:** HPC jobs get killed without warning, and a half-written checkpoint is worse than no checkpoint. The temp-then-replace pattern guarantees a reader always sees either the previous complete file or the new complete file, never a partial one.
174
174
 
175
+ `resolve(key)` returns the absolute on-disk path where `key` lives. `CheckpointManager.save` uses it to hand callers back a path they can `exists()` / `open()` directly.
176
+
175
177
  ---
176
178
 
177
179
  ## `RunPathResolver`: structured path construction
178
180
 
179
- `RunPathResolver` builds filesystem paths from semantic components, so no `./data/...` string is hardcoded inside `Objective`. The root directory is configurable, letting users redirect all artifacts without editing library code.
181
+ `RunPathResolver` builds relative paths from semantic components, so no `./data/...` string is hardcoded inside `Objective`. The storage root (a directory on disk, an S3 prefix, etc.) exists on the `StorageBackend`, not the resolver; the resolver just gives relative paths that the backend joins onto its root.
182
+
183
+ Default path layout (flat inside the budget directory):
184
+
185
+ ```
186
+ {budget_dir}/{problem}_{algo}_{hyper_param_str}_{timestamp}.{ext}
187
+ ```
180
188
 
181
- Saving layout:
189
+ Set `algo_directory=True` to insert an `{algo}_{hyper_param_str}` segment after `{budget_dir}` (collapsing to just `{algo}` when `hyper_param_str` is empty/None):
182
190
 
183
191
  ```
184
- {root}/{budget_dir}/{algo}_{hyper_param_str}/{problem}_{algo}_{timestamp}.{ext}
192
+ {budget_dir}/{algo}_{hyper_param_str}/{problem}_{algo}_{hyper_param_str}_{timestamp}.{ext}
185
193
  ```
186
194
 
187
- where `budget_dir` is e.g. `time100s_evals1000` or `unlimited`. When
188
- `hyper_param_str` is empty/None the directory segment collapses to just
189
- `.../{algo}/...`.
195
+ `budget_dir` is e.g. `time100s_evals1000` or `unlimited`. The algorithm and hyperparameter string are always part of the filename, so a file is self-describing even when copied out of its directory.
190
196
 
191
197
  ```python
192
- from dfbench.core.storage import RunPathResolver
198
+ from dfbench.core.storage import RunPathResolver, LocalFilesystemBackend
199
+
200
+ resolver = RunPathResolver(extension="npz") # flat default
201
+ key = resolver.checkpoint_path(
202
+ problem_name="voyager",
203
+ algorithm_name="adam_gd",
204
+ timestamp="2026-01-01_00-00-00",
205
+ hyper_param_str="lr0.1",
206
+ max_time=100.0,
207
+ max_evals=1000,
208
+ )
209
+ # -> time100s_evals1000/voyager_adam_gd_lr0.1_2026-01-01_00-00-00.npz
210
+
211
+ # The backend joins the key onto its root:
212
+ backend = LocalFilesystemBackend(root="./data/objective_run_data")
213
+ on_disk = backend.resolve(key)
214
+ # -> /cwd/data/objective_run_data/time100s_evals1000/voyager_adam_gd_lr0.1_2026-01-01_00-00-00.npz
193
215
 
194
- resolver = RunPathResolver(root="./data/objective_run_data", extension="npz")
195
- path = resolver.checkpoint_path(
216
+ # Opt into the per-algorithm subdirectory layout:
217
+ resolver = RunPathResolver(extension="npz", algo_directory=True)
218
+ key = resolver.checkpoint_path(
196
219
  problem_name="voyager",
197
220
  algorithm_name="adam_gd",
198
221
  timestamp="2026-01-01_00-00-00",
@@ -200,7 +223,7 @@ path = resolver.checkpoint_path(
200
223
  max_time=100.0,
201
224
  max_evals=1000,
202
225
  )
203
- # ./data/objective_run_data/time100s_evals1000/adam_gd_lr0.1/voyager_adam_gd_2026-01-01_00-00-00.npz
226
+ # -> time100s_evals1000/adam_gd_lr0.1/voyager_adam_gd_lr0.1_2026-01-01_00-00-00.npz
204
227
  ```
205
228
 
206
229
  ---
@@ -241,12 +264,13 @@ from dfbench.core.storage import CheckpointManager, LocalFilesystemBackend, NpzC
241
264
  manager = CheckpointManager(
242
265
  backend=LocalFilesystemBackend(root="./data/objective_run_data"),
243
266
  serializer=NpzCheckpointSerializer(),
244
- resolver=RunPathResolver(root="./data/objective_run_data"),
267
+ resolver=RunPathResolver(),
245
268
  save_every=1000,
246
269
  )
247
270
 
248
271
  # Save
249
272
  path = manager.save(state)
273
+ # `path` is the absolute on-disk Path (backend.resolve(key)); `manager.load(path)` round-trips.
250
274
 
251
275
  # Load
252
276
  state = manager.load(path)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dfbench"
7
- version = "0.2.0"
7
+ version = "0.2.1"
8
8
  description = "Differometor Benchmark - Optimization algorithms and problem definitions"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.14"
@@ -136,7 +136,10 @@ class BotorchBO(OptimizationAlgorithm):
136
136
 
137
137
  # Evaluate initial samples
138
138
  train_Y_raw, valid_mask = evaluate_y(
139
- X=train_X, bounds=problem_bounds_torch, obj=obj
139
+ X=train_X,
140
+ bounds=problem_bounds_torch,
141
+ obj=obj,
142
+ batch_size=self.batch_size,
140
143
  )
141
144
  train_Y_raw = train_Y_raw.unsqueeze(-1)
142
145
 
@@ -192,7 +195,10 @@ class BotorchBO(OptimizationAlgorithm):
192
195
 
193
196
  # Evaluate candidates
194
197
  new_Y_raw, valid_mask_batch = evaluate_y(
195
- candidates, problem_bounds_torch, obj
198
+ candidates,
199
+ problem_bounds_torch,
200
+ obj,
201
+ batch_size=self.batch_size,
196
202
  )
197
203
  new_Y_raw = new_Y_raw.unsqueeze(-1)
198
204
 
@@ -286,7 +286,10 @@ class BotorchTuRBO(OptimizationAlgorithm):
286
286
  train_X = torch.cat([init_X, train_X], dim=0)
287
287
 
288
288
  train_Y_raw, valid_mask = evaluate_y(
289
- X=train_X, bounds=problem_bounds_torch, obj=obj
289
+ X=train_X,
290
+ bounds=problem_bounds_torch,
291
+ obj=obj,
292
+ batch_size=self.batch_size,
290
293
  )
291
294
  train_Y_raw = train_Y_raw.unsqueeze(-1)
292
295
 
@@ -342,7 +345,10 @@ class BotorchTuRBO(OptimizationAlgorithm):
342
345
 
343
346
  # Evaluate new candidates
344
347
  Y_next_raw, valid_mask_next = evaluate_y(
345
- X_next, problem_bounds_torch, obj
348
+ X=X_next,
349
+ bounds=problem_bounds_torch,
350
+ obj=obj,
351
+ batch_size=self.batch_size,
346
352
  )
347
353
  Y_next_raw = Y_next_raw.unsqueeze(-1)
348
354
 
@@ -49,8 +49,8 @@ class Objective:
49
49
 
50
50
  3. **History tracking** – maintains aligned histories of losses, params,
51
51
  gradients, evaluation types, and elapsed time. The ``save`` list of
52
- string tokens (plus the two standard flags ``save_time_steps`` and
53
- ``save_params_history``) controls what is stored; the active
52
+ string tokens (plus the three standard flags ``save_time_steps``,
53
+ ``save_params_history``, and ``save_batched_params_history``) controls what is stored; the active
54
54
  configuration is recorded as a :class:`SaveConfig` and embedded in
55
55
  every checkpoint so a resumed run can detect mismatches.
56
56
 
@@ -217,6 +217,7 @@ class Objective:
217
217
  max_time: float | None = None,
218
218
  save_time_steps: bool = True,
219
219
  save_params_history: bool = True,
220
+ save_batched_params_history: bool = False,
220
221
  save: list[str] | None = None,
221
222
  verbose: int = 0,
222
223
  print_every: int = 100,
@@ -239,11 +240,14 @@ class Objective:
239
240
  max_time: Maximum wall-clock time in seconds. None for unlimited.
240
241
  save_time_steps: Whether to track timestamps for each evaluation.
241
242
  save_params_history: Whether to save parameter history.
243
+ save_batched_params_history: Whether to store full ``(batch, n_params)``
244
+ parameter arrays for batched evals instead of the reduced
245
+ representative point. Defaults to False.
242
246
  save: List of advanced save tokens for recording additional /
243
247
  batched histories. Valid tokens: ``"grad"``, ``"hessian"``,
244
248
  ``"eval_type"``, ``"batched_loss"``, ``"batched_grad"``,
245
- ``"batched_hessian"``, ``"batched_param"``, ``"batched"``
246
- (convenience alias expanding to all four batched tokens).
249
+ ``"batched_hessian"``, ``"batched"``
250
+ (convenience alias expanding to the three batched tokens above).
247
251
  Defaults to ``None`` (no advanced histories).
248
252
  verbose: Verbosity level (0=silent, 1=warnings, 2=info). Defaults to 0.
249
253
  print_every: Print progress every N evaluations (if verbose >= 1). Defaults to 100.
@@ -256,7 +260,7 @@ class Objective:
256
260
  dashboard with progress bars. ``"log"`` prints traditional
257
261
  multi-line log blocks that scroll the terminal.
258
262
  unit_mapping: Optional function that maps unbounded
259
- parameters to the **[0, 1] range** (unit interval). Can be a
263
+ parameters to the [0, 1] range (unit interval). Can be a
260
264
  scalar function (e.g. ``jax.nn.sigmoid``) or a vector function
261
265
  operating element-wise on arrays — both work because JAX
262
266
  broadcasts element-wise operations. The Objective handles
@@ -300,6 +304,7 @@ class Objective:
300
304
  self._save_config = SaveConfig.from_flags(
301
305
  save_time_steps=save_time_steps,
302
306
  save_params_history=save_params_history,
307
+ save_batched_params_history=save_batched_params_history,
303
308
  save=save,
304
309
  )
305
310
  self._display_mode = display_mode
@@ -412,11 +417,12 @@ class Objective:
412
417
  ) -> None:
413
418
  """Assemble the storage stack from user-facing knobs.
414
419
 
415
- Maps ``checkpoint_format`` to a serializer, roots the resolver and
416
- backend at ``checkpoint_dir`` (defaulting to the historical
420
+ Maps ``checkpoint_format`` to a serializer, anchors the backend
421
+ at ``checkpoint_dir`` (defaulting to the historical
417
422
  ``./data/objective_run_data``), and wires the
418
- :class:`CheckpointManager`. Subclasses override this to swap a custom
419
- serializer / backend / resolver / exporter.
423
+ :class:`CheckpointManager`. The resolver just builds relative
424
+ paths; the backend the root. Subclasses override this to
425
+ swap a custom serializer / backend / resolver / exporter.
420
426
  """
421
427
  fmt = checkpoint_format.lower()
422
428
  if fmt not in self._SERIALIZERS:
@@ -427,14 +433,14 @@ class Objective:
427
433
  self._checkpoint_format = fmt
428
434
  self._checkpoint_dir = checkpoint_dir
429
435
  self._serializer = self._SERIALIZERS[fmt]
430
- self._resolver = RunPathResolver(
436
+ self._resolver = RunPathResolver()
437
+ self._backend = LocalFilesystemBackend(
431
438
  root=(
432
439
  str(checkpoint_dir)
433
440
  if checkpoint_dir is not None
434
441
  else "./data/objective_run_data"
435
442
  )
436
443
  )
437
- self._backend = LocalFilesystemBackend(root=self._resolver.root)
438
444
  self._exporter = RunDataExporter()
439
445
  self._checkpoint_manager = CheckpointManager(
440
446
  backend=self._backend,
@@ -1535,10 +1541,11 @@ class Objective:
1535
1541
  custom_path: str | None = None,
1536
1542
  hyper_param_str: str | None = None,
1537
1543
  ) -> Path:
1538
- """Generate run data file path via the configured path resolver.
1544
+ """Generate the run data file path via the resolver + backend.
1539
1545
 
1540
- Delegates to :class:`~dfbench.core.storage.RunPathResolver` so the
1541
- path layout is not hardcoded here.
1546
+ Asks :class:`~dfbench.core.storage.RunPathResolver` for the
1547
+ relative path, then :meth:`StorageBackend.resolve` for the
1548
+ absolute on-disk path, so the layout is not hardcoded here.
1542
1549
 
1543
1550
  Args:
1544
1551
  algorithm_name: Name of the optimization algorithm.
@@ -1548,7 +1555,7 @@ class Objective:
1548
1555
  organization.
1549
1556
 
1550
1557
  Returns:
1551
- Path object for the run data file.
1558
+ Absolute :class:`~pathlib.Path` for the run data file.
1552
1559
  """
1553
1560
  if custom_path is not None:
1554
1561
  return Path(custom_path)
@@ -1556,7 +1563,7 @@ class Objective:
1556
1563
  problem_name = (
1557
1564
  self._problem.name if hasattr(self._problem, "name") else "problem"
1558
1565
  )
1559
- path = self._resolver.checkpoint_path(
1566
+ key = self._resolver.checkpoint_path(
1560
1567
  problem_name=problem_name,
1561
1568
  algorithm_name=algorithm_name,
1562
1569
  timestamp=self._timestamp,
@@ -1564,7 +1571,7 @@ class Objective:
1564
1571
  max_time=self._max_time,
1565
1572
  max_evals=self._max_evals,
1566
1573
  )
1567
- return path
1574
+ return Path(self._backend.resolve(key))
1568
1575
 
1569
1576
  def __repr__(self) -> str:
1570
1577
  """String representation for debugging."""
@@ -2742,10 +2749,12 @@ class Objective:
2742
2749
  Path to the saved run data file.
2743
2750
 
2744
2751
  Example:
2745
- >>> obj.save_run_data(algorithm_name="adam_gd")
2746
- Path('data/objective_run_data/time100s_evals1000/voyager_adam_gd_2026-01-26_15-30-45.npz')
2747
- >>> obj.save_run_data(algorithm_name="adam_gd", hyper_param_str="lr0.1")
2748
- Path('data/objective_run_data/time100s_evals1000/lr0.1/voyager_adam_gd_2026-01-26_15-30-45.npz')
2752
+ >>> path = obj.save_run_data(algorithm_name="adam_gd")
2753
+ >>> path = obj.save_run_data(algorithm_name="adam_gd", hyper_param_str="lr0.1")
2754
+
2755
+ The returned path is absolute (the backend joins the resolver's
2756
+ relative path onto ``checkpoint_dir``). Pass it to
2757
+ ``load_run_data`` to resume.
2749
2758
  """
2750
2759
  if algorithm_name is None:
2751
2760
  algorithm_name = self.algorithm_str or "unknown"
@@ -2782,8 +2791,9 @@ class Objective:
2782
2791
  FileNotFoundError: If run data file doesn't exist.
2783
2792
 
2784
2793
  Example:
2785
- >>> obj.load_run_data("data/objective_run_data/.../voyager_adam_gd_2026-01-26_15-30-45.npz")
2786
- >>> obj.warmup_value_and_grad() # OK — logging not yet active
2794
+ >>> path = obj.save_run_data(algorithm_name="adam_gd")
2795
+ >>> obj.load_run_data(path)
2796
+ >>> obj.warmup_value_and_grad() # OK, logging not yet active
2787
2797
  >>> obj.start_logging() # resume wall-clock timer
2788
2798
  >>> print(f"Resuming from {obj.eval_count} evaluations")
2789
2799
  """