Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
d7c2516
feat: add BiEGO strategy with vectorization and tests
Paul-Saves Jul 4, 2026
f6f5731
test: add integration and convergence tests for BiEGO hypervolume
Paul-Saves Jul 4, 2026
716dca2
feat: enable multi-objective support in public minimize API and State
Paul-Saves Jul 4, 2026
b760bd5
Merge branch 'main' into feat/mo-api-integration
Paul-Saves Jul 4, 2026
5b22bed
docs: restore and update MO notebook to v0.2.0 API and add BiEGO/MOSE…
Paul-Saves Jul 5, 2026
94d3872
test: add convergence test for multi-objective hypervolume on ZDT1
Paul-Saves Jul 5, 2026
2d1c6ce
test: add IGD+ decay assertion to multi-objective convergence tests
Paul-Saves Jul 5, 2026
097349a
fix: change driver.setup() to driver.start_optim() in convergence tests
Paul-Saves Jul 5, 2026
ba91bea
fix
Paul-Saves Jul 5, 2026
d14d8b7
ruff
Paul-Saves Jul 5, 2026
bc25172
feat: add ZDT1 pareto front plot to MO convergence tests and notebooks
Paul-Saves Jul 5, 2026
8aa5cc9
chore: resolve merge conflicts in state and frameworks
Paul-Saves Jul 5, 2026
b6714a6
fix: resolve remaining merge conflict marker in frameworks.py
Paul-Saves Jul 5, 2026
3657fe6
ruff
Paul-Saves Jul 5, 2026
2ca0c8e
docs: add BiEGO adaptive nadirs tracking and notebook example
Paul-Saves Jul 5, 2026
a934e83
feat: add naive BiEGO formulation without composite adaptation and no…
Paul-Saves Jul 5, 2026
a4b8a78
docs: add hypervolume convergence plots for BiEGO post-processing
Paul-Saves Jul 5, 2026
47fb07b
ruff
Paul-Saves Jul 5, 2026
a6872c3
fix: address Youssef and Remi review feedback for naive BiEGO
Paul-Saves Jul 5, 2026
e0181fc
feat: add multi-fidelity capability to BiEGO (MF-BiEGO) ported from S…
Paul-Saves Jul 5, 2026
d3adcd5
test: add integration test for MF-BiEGO with constraints
Paul-Saves Jul 5, 2026
d0ddcbc
test: improve BiEGO test plots and generate step-by-step nadir tracki…
Paul-Saves Jul 5, 2026
58626c5
feat: add advanced profiles post-processing tool and update MO notebo…
Paul-Saves Jul 5, 2026
f0ae173
fix: ignore infeasible and low-fidelity points when building Pareto F…
Paul-Saves Jul 5, 2026
1d07256
fix: unscale BiEGO adaptive nadir points before plotting them in test…
Paul-Saves Jul 5, 2026
2cad1bf
docs: update multi-objective notebook to descale BiEGO Nadir plots
Paul-Saves Jul 5, 2026
cb6a787
fix: perfectly synchronize BiEGO r_history with iterations so visuali…
Paul-Saves Jul 5, 2026
bdd6072
style: plot current pareto front in distinct orange color for BiEGO v…
Paul-Saves Jul 5, 2026
60e1f83
test: add integration test for MF-BiEGO with constraints and fix samp…
Paul-Saves Jul 5, 2026
84eb8f2
docs, test: increase n_multi_start to 50 in BiEGO tests to avoid EI s…
Paul-Saves Jul 5, 2026
8f83664
fix: pre-sample MC numbers in init_bi_obj_ei_cf to make EI determinis…
Paul-Saves Jul 5, 2026
7bd075b
docs, test: output HV decay curve for tests and interactive animation…
Paul-Saves Jul 5, 2026
ac3a5ea
docs: add mosego mpi and naive biego animations to notebook comparison
Paul-Saves Jul 5, 2026
49e3d5c
test: add multi-algorithm hypervolume decay comparison test
Paul-Saves Jul 5, 2026
9761953
chore: remove scratch/ directory from version control
Paul-Saves Jul 5, 2026
5a72227
docs: fix deprecated smt_optim.adapters import in multi-objective not…
Paul-Saves Jul 5, 2026
d673a78
docs: fix deprecated multi_objective imports in notebook
Paul-Saves Jul 5, 2026
f9238fa
docs: fix deprecated smt_optim.problems import to smt_optim.benchmarks
Paul-Saves Jul 5, 2026
848fec4
fix: restore missing PymooWrapper class to benchmarks.base
Paul-Saves Jul 5, 2026
4c0d311
fix: register multi-objective benchmarks in registry
Paul-Saves Jul 5, 2026
9670806
fix: resolve ValueError in MOSEGO scalarization and logger AttributeE…
Paul-Saves Jul 5, 2026
9417fe6
docs: fix deprecated _points attribute access on OptimizationDataset …
Paul-Saves Jul 5, 2026
2cce9de
docs: remove redundant and broken obj_biego hypervolume cell in notebook
Paul-Saves Jul 5, 2026
e805901
fix: resolve TypeError in PymooWrapper evaluate for multi-fidelity be…
Paul-Saves Jul 5, 2026
659ea08
test: add multi-objective integration tests for MOSEGO and PymooWrapper
Paul-Saves Jul 5, 2026
50b291a
docs: adjust notebook configurations to 40 max_iter, min_max_calls=2 …
Paul-Saves Jul 5, 2026
095e525
docs: restore full 25 frames animation for BiEGO to include the 4 mon…
Paul-Saves Jul 5, 2026
c81a2ec
docs: fix missing prob_definition for ZDT1 problem that caused BiEGO …
Paul-Saves Jul 6, 2026
a2c6f4a
docs: fix plot limits for ZDT1 optimization animations to focus on th…
Paul-Saves Jul 6, 2026
88c3c44
docs: complete the advanced post-processing section with a working hy…
Paul-Saves Jul 6, 2026
1cb64de
fix: convert profiles.py from UTF-16LE to UTF-8 to prevent SyntaxErro…
Paul-Saves Jul 6, 2026
5e8a2c0
fix: remove incomplete duplicate definition of accuracy_profile
Paul-Saves Jul 6, 2026
9bcce7e
fix: resolve module level import warnings and clean up scratch files
Paul-Saves Jul 6, 2026
9987f36
fix: move imports before module level variables in registry.py to sat…
Paul-Saves Jul 6, 2026
e3fceb2
ruff
Paul-Saves Jul 6, 2026
8f85a75
docs: adjust BiEGO animation axis limits dynamically to always show n…
Paul-Saves Jul 6, 2026
302e14e
clean
Paul-Saves Jul 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/source/api/acquisition_strategies.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,8 @@ Acquisition Strategies

.. automodule:: smt_optim.acquisition_strategies.mfsego

.. automodule:: smt_optim.acquisition_strategies.biego

.. automodule:: smt_optim.acquisition_strategies.mosego

.. automodule:: smt_optim.acquisition_strategies.vfpi
204 changes: 104 additions & 100 deletions docs/source/benchmark_registry.ipynb
Original file line number Diff line number Diff line change
@@ -1,55 +1,45 @@
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# Benchmark problem registry",
"id": "255f316d1ab23dbc"
"id": "255f316d1ab23dbc",
"metadata": {},
"source": "# Benchmark problem registry"
},
{
"cell_type": "code",
"execution_count": 1,
"id": "c9b79250d8aa49a6",
"metadata": {
"tags": [
"hide-cell"
],
"ExecuteTime": {
"end_time": "2026-06-25T14:22:03.907234043Z",
"start_time": "2026-06-25T14:22:02.446925336Z"
}
},
"tags": [
"hide-cell"
]
},
"cell_type": "code",
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import itables\n",
"itables.init_notebook_mode()\n",
"\n",
"from smt_optim.benchmarks.registry import list_problems, get_problem"
],
"id": "c9b79250d8aa49a6",
"outputs": [
{
"data": {
"text/plain": [
"<IPython.core.display.HTML object>"
],
"text/html": [
"<script type=\"module\">\n",
" const { set_or_remove_dark_class } = await import(window._itables_2_8_0);\n",
" set_or_remove_dark_class();\n",
"</script>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<IPython.core.display.HTML object>"
],
"text/html": [
"<script>\n",
"function injectCSS(base64CSS) {\n",
Expand Down Expand Up @@ -173,71 +163,56 @@
"(you should not see this message - is your notebook <it>trusted</it>?)\n",
"</noscript>\n",
"</div>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 1
"source": [
"import pandas as pd\n",
"import itables\n",
"from smt_optim.benchmarks.registry import list_problems, get_problem\n",
"\n",
"\n",
"itables.init_notebook_mode()\n",
"\n"
]
},
{
"metadata": {},
"cell_type": "markdown",
"id": "33d48929fba08de1",
"metadata": {},
"source": [
"\n",
"## Benchmark problems collection\n",
"\n",
"The table below lists the available problems in SMT-optim, along with some of their properties.\n"
],
"id": "33d48929fba08de1"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "initial_id",
"metadata": {
"collapsed": true,
"tags": [
"hide-input"
],
"ExecuteTime": {
"end_time": "2026-06-25T14:22:03.971420624Z",
"start_time": "2026-06-25T14:22:03.909394524Z"
}
},
"collapsed": true,
"tags": [
"hide-input"
]
},
"source": [
"\n",
"problems = list_problems(\n",
" num_dim=None,\n",
" num_obj=None,\n",
" num_cstr=None,\n",
" num_fidelity=None,\n",
")\n",
"\n",
"rows = []\n",
"\n",
"for prob in problems:\n",
" rows.append({\n",
" \"Problem\": prob.__class__.__name__,\n",
" \"Dimensions\": prob.num_dim,\n",
" \"Constraints\": prob.num_cstr,\n",
" \"Objectives\": prob.num_obj,\n",
" \"Fidelity\": prob.num_fidelity,\n",
" \"Tags\": prob.tags,\n",
" })\n",
"\n",
"df = pd.DataFrame(data=rows).sort_values(by=[\"Objectives\", \"Fidelity\", \"Problem\", \"Dimensions\", \"Constraints\"])\n",
"itables.show(df, showIndex=False)"
],
"outputs": [
{
"data": {
"text/plain": [
"<IPython.core.display.HTML object>"
],
"text/html": [
"<!--| quarto-html-table-processing: none -->\n",
"<table id=\"itables_f383dbc6_a5e6_412f_803e_8825d80e373b\">\n",
Expand Down Expand Up @@ -370,20 +345,50 @@
" }\n",
" })();\n",
"</script>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 2
"source": [
"problems = list_problems(\n",
" num_dim=None,\n",
" num_obj=None,\n",
" num_cstr=None,\n",
" num_fidelity=None,\n",
")\n",
"\n",
"rows = []\n",
"\n",
"for prob in problems:\n",
" rows.append(\n",
" {\n",
" \"Problem\": prob.__class__.__name__,\n",
" \"Dimensions\": prob.num_dim,\n",
" \"Constraints\": prob.num_cstr,\n",
" \"Objectives\": prob.num_obj,\n",
" \"Fidelity\": prob.num_fidelity,\n",
" \"Tags\": prob.tags,\n",
" }\n",
" )\n",
"\n",
"df = pd.DataFrame(data=rows).sort_values(\n",
" by=[\"Objectives\", \"Fidelity\", \"Problem\", \"Dimensions\", \"Constraints\"]\n",
")\n",
"itables.show(df, showIndex=False)"
]
},
{
"metadata": {},
"cell_type": "markdown",
"id": "c53ef42e82e3b7",
"metadata": {},
"source": [
"### Obtaining benchmark problems\n",
"\n",
Expand All @@ -394,27 +399,18 @@
"### Variable dimension\n",
"\n",
"The dimension of some problem can be set by the user. These problems can be identified with the `n_variable` tag. The dimension can be set with the `set_dim` class method. The code snippet below fetches the Ackley test problem, sets the number of variable to 5, and then to 10.\n"
],
"id": "c53ef42e82e3b7"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "d57c1411c00173e1",
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-25T14:22:04.029692248Z",
"start_time": "2026-06-25T14:22:03.973644159Z"
}
},
"cell_type": "code",
"source": [
"ackley = get_problem(\"Ackley\")\n",
"\n",
"ackley.set_dim(5)\n",
"print(f\"bounds.shape[0] = {ackley.bounds.shape[0]}\")\n",
"\n",
"ackley.set_dim(10)\n",
"print(f\"bounds.shape[0] = {ackley.bounds.shape[0]}\")"
],
"id": "d57c1411c00173e1",
"outputs": [
{
"name": "stdout",
Expand All @@ -425,11 +421,20 @@
]
}
],
"execution_count": 3
"source": [
"ackley = get_problem(\"Ackley\")\n",
"\n",
"ackley.set_dim(5)\n",
"print(f\"bounds.shape[0] = {ackley.bounds.shape[0]}\")\n",
"\n",
"ackley.set_dim(10)\n",
"print(f\"bounds.shape[0] = {ackley.bounds.shape[0]}\")"
]
},
{
"metadata": {},
"cell_type": "markdown",
"id": "b6bf846c205b6a58",
"metadata": {},
"source": [
"### Multi-fidelity problems\n",
"\n",
Expand All @@ -456,35 +461,29 @@
"value = problem.constraints[constraint_id: int][fidelity_level: int](x: np.ndarray)\n",
"```\n",
"\n"
],
"id": "b6bf846c205b6a58"
]
},
{
"metadata": {},
"cell_type": "markdown",
"id": "2830f66c10eaa8a9",
"metadata": {},
"source": [
"\n",
"### Mixed-variable problems\n",
"\n",
"The `bounds` attribute of mixed-variable problems is set to `None`. Users should instead refer to the `design_space` attribute which provides the SMT's `DesignSpace` object with respect to the problem. The code snippet below illustrates this for the mixed-variable Branin test problem.\n"
],
"id": "2830f66c10eaa8a9"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "f754bceff4736a52",
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-25T14:22:04.079269561Z",
"start_time": "2026-06-25T14:22:04.031613341Z"
}
},
"cell_type": "code",
"source": [
"mixvar_branin = get_problem(\"MixVarBranin\")\n",
"\n",
"print(f\"------- bounds -------\\n{mixvar_branin.bounds}\")\n",
"print(f\"---- design_space ----\\n{mixvar_branin.design_space}\")"
],
"id": "f754bceff4736a52",
"outputs": [
{
"name": "stdout",
Expand All @@ -501,7 +500,12 @@
]
}
],
"execution_count": 4
"source": [
"mixvar_branin = get_problem(\"MixVarBranin\")\n",
"\n",
"print(f\"------- bounds -------\\n{mixvar_branin.bounds}\")\n",
"print(f\"---- design_space ----\\n{mixvar_branin.design_space}\")"
]
}
],
"metadata": {
Expand All @@ -525,4 +529,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
}
}
Loading
Loading