From eb883fa96721f0664d9ad412a4d2c2bf01b559de Mon Sep 17 00:00:00 2001 From: Dvermetten Date: Tue, 21 Apr 2026 11:56:34 +0200 Subject: [PATCH 1/9] Update UI of the table --- docs/index.html | 164 ++++++++++++++++++++++--- docs/javascript.html | 140 +++++++++++++++++++--- docs/problems.html | 25 +++- docs/table_styles.css | 273 +++++++++++++++++++++++++++++++++++++++--- yaml_to_html.py | 52 +++++++- 5 files changed, 594 insertions(+), 60 deletions(-) diff --git a/docs/index.html b/docs/index.html index c544e1f..d39b48e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -24,7 +24,20 @@

OPL – Optimisation problem library

Submit problems and corrections on GitHub with pull requests / issues, through the Google form, or by email: koen.van.der.blom@cwi.nl

- + +
+
+
Visible columns
+
+ + +
+
+ +
+
+
+
@@ -1215,46 +1228,161 @@

OPL – Optimisation problem library

name
name textual description suite/generator/single objectives dimensionality variable type constraints dynamic noise multi-fidelity source (real-world/artificial) reference implementation
+ + + +
+

Problem details

+

Click a table row to inspect full details.

+
+
+ diff --git a/docs/javascript.html b/docs/javascript.html index a194ca7..73f9e58 100644 --- a/docs/javascript.html +++ b/docs/javascript.html @@ -1,44 +1,150 @@ diff --git a/docs/problems.html b/docs/problems.html index 4c2be02..768796d 100644 --- a/docs/problems.html +++ b/docs/problems.html @@ -1,4 +1,17 @@ - + +
+
+
Visible columns
+
+ + +
+
+ +
+
+
+
@@ -1188,4 +1201,12 @@ -
namehttps://gitlab.com/verel/pubo-importance-benchmark
name textual description suite/generator/single objectives dimensionality variable type constraints dynamic noise multi-fidelity source (real-world/artificial) reference implementation
\ No newline at end of file +name textual description suite/generator/single objectives dimensionality variable type constraints dynamic noise multi-fidelity source (real-world/artificial) reference implementation + + + +
+

Problem details

+

Click a table row to inspect full details.

+
+
diff --git a/docs/table_styles.css b/docs/table_styles.css index 05418c8..439f38c 100644 --- a/docs/table_styles.css +++ b/docs/table_styles.css @@ -1,35 +1,274 @@ -/* Apply to everything */ +:root { + --opl-bg: #f5f7fb; + --opl-surface: #ffffff; + --opl-text: #12263a; + --opl-muted: #607389; + --opl-border: #d7e1ec; + --opl-accent: #0f6c8b; + --opl-accent-soft: #eaf4fa; + --opl-heading: "Segoe UI", "Trebuchet MS", sans-serif; + --opl-body: "Tahoma", "Verdana", sans-serif; +} + * { - font-family: sans-serif; + box-sizing: border-box; } body { margin: 1vw; - background-color: WhiteSmoke; + font-family: var(--opl-body); + color: var(--opl-text); + background: + radial-gradient(circle at 4% 2%, #e6edf7 0, #e6edf700 34%), + radial-gradient(circle at 92% 4%, #ecf3df 0, #ecf3df00 38%), + var(--opl-bg); +} + +h2 { + font-family: var(--opl-heading); + letter-spacing: 0.01em; +} + +.table-shell { + margin-top: 1rem; + border: 1px solid var(--opl-border); + border-radius: 16px; + background: var(--opl-surface); + box-shadow: 0 14px 30px rgba(17, 37, 61, 0.08); + overflow: hidden; +} + +.table-toolbar { + display: grid; + gap: 0.65rem; + padding: 0.9rem 1rem; + border-bottom: 1px solid var(--opl-border); + background: linear-gradient(90deg, #f7fafc, #edf6fb); +} + +.toolbar-title { + font-size: 0.78rem; + text-transform: uppercase; + letter-spacing: 0.08em; + font-weight: 700; + color: var(--opl-muted); +} + +.toolbar-actions { + display: flex; + flex-wrap: wrap; + gap: 0.45rem; +} + +.toolbar-btn { + border: 1px solid #b8c8df; + background: #fff; + color: #1b3249; + border-radius: 8px; + padding: 0.36rem 0.62rem; + font-size: 0.8rem; + font-weight: 600; + cursor: pointer; + transition: all 120ms ease; +} + +.toolbar-btn:hover { + background: #eff6fb; + border-color: #94adc9; +} + +.toolbar-btn:active { + transform: translateY(1px); +} + +.column-controls { + display: flex; + flex-wrap: wrap; + gap: 0.45rem; +} + +.column-chip { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.35rem 0.65rem; + border-radius: 999px; + border: 1px solid var(--opl-border); + background: #fff; + font-size: 0.82rem; + cursor: pointer; + user-select: none; + transition: all 120ms ease; +} + +.column-chip:hover { + border-color: #b8c8df; + background: #f7fbfd; +} + +.column-chip.is-off { + color: var(--opl-muted); + background: #f1f5f9; +} + +.column-chip input { + accent-color: var(--opl-accent); +} + +.table-wrap { + overflow-x: auto; + padding: 0.45rem; +} + +#problems { + width: 100%; + min-width: 980px; + border-collapse: separate; + border-spacing: 0; +} + +#problems thead th { + background: #f9fcff; + color: #1d324a; + border-bottom: 1px solid var(--opl-border); + font-weight: 700; + white-space: nowrap; +} + +#problems td { + vertical-align: top; + line-height: 1.4; +} + +#problems th:first-child { + position: sticky; + left: 0; + z-index: 5; + background: #f9fcff; + box-shadow: 1px 0 0 0 var(--opl-border); +} + +#problems td:first-child { + position: sticky; + left: 0; + z-index: 2; + background: #fcfeff; + box-shadow: 1px 0 0 0 var(--opl-border); +} + +#problems tbody tr:nth-of-type(odd) td { + background: #fcfeff; +} + +#problems tbody tr:nth-of-type(even) td { + background: #f8fbfe; +} + +#problems tbody tr:hover td { + background: var(--opl-accent-soft); +} + +#problems tbody tr:hover td:first-child { + background: #deedf6; +} + +#problems tbody tr.is-active td { + background: #dceefa; } -input[type=text] { - background-color: #3CBC8D; - color: white; +#problems tbody tr.is-active td:first-child { + background: #cce5f5; } -.styled-table { - font-size: 0.9em; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.15); +#problems a { + color: #085f75; } -.styled-table thead tr { - background-color: AntiqueWhite; +#problems thead input { + width: 100%; + padding: 0.35rem 0.45rem; + border-radius: 6px; + border: 1px solid var(--opl-border); + background: #fff; + color: var(--opl-text); } -.styled-table tbody tr:nth-of-type(odd) { - background-color: SeaShell; +.details-shell { + margin-top: 0.9rem; + padding: 0.9rem 1rem; + border: 1px solid var(--opl-border); + border-radius: 14px; + background: var(--opl-surface); + box-shadow: 0 10px 24px rgba(17, 37, 61, 0.06); } -.styled-table tbody tr:nth-of-type(even) { - background-color: Snow; +.details-title { + margin: 0 0 0.3rem; + font-family: var(--opl-heading); + font-size: 1.02rem; } -.styled-table tbody tr:hover { - filter: brightness(.975); +.details-hint { + margin: 0 0 0.75rem; + color: var(--opl-muted); + font-size: 0.88rem; +} + +.details-grid { + margin: 0; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 0.6rem; +} + +.detail-item { + margin: 0; + border: 1px solid var(--opl-border); + border-radius: 10px; + padding: 0.55rem 0.65rem; + background: #fbfdff; +} + +.detail-item dt { + margin: 0; + color: #23415e; + font-size: 0.74rem; + text-transform: uppercase; + letter-spacing: 0.04em; + font-weight: 700; +} + +.detail-item dd { + margin: 0.35rem 0 0; + color: var(--opl-text); + font-size: 0.86rem; + line-height: 1.4; + overflow-wrap: anywhere; +} + +.details-empty { + color: var(--opl-muted); + font-style: italic; +} + +@media (max-width: 900px) { + body { + margin: 0.6rem; + } + + .table-toolbar { + padding: 0.8rem; + } + + .column-chip { + font-size: 0.76rem; + } + + .details-shell { + padding: 0.8rem; + } + + .details-grid { + grid-template-columns: 1fr; + } } diff --git a/yaml_to_html.py b/yaml_to_html.py index a9a219f..1bef2dd 100755 --- a/yaml_to_html.py +++ b/yaml_to_html.py @@ -3,6 +3,7 @@ import pandas as pd import yaml import shutil +from html import escape import re @@ -30,8 +31,8 @@ def repl(m): html_index = f"{html_dir}index.html" # Load data -with open(yaml_file) as in_file: - data = pd.json_normalize(yaml.safe_load(in_file)) +with open(yaml_file) as yaml_input: + data = pd.json_normalize(yaml.safe_load(yaml_input)) # Choose desired columns all_columns = False @@ -68,12 +69,51 @@ def repl(m): idx = table.index('') final_table = table[:idx] + "" + " ".join([""+ i +"" for i in data.columns])+" " + table[idx:] +default_hidden_columns = {"textual description", "reference", "implementation"} + +column_toggles = "".join( + [ + ( + f'' + ) + for i, col in enumerate(data.columns) + ] +) + +modern_table_block = f""" +
+
+
Visible columns
+
+ + +
+
+ {column_toggles} +
+
+
+ {final_table} +
+
+ +
+

Problem details

+

Click a table row to inspect full details.

+
+
+""" + # Write table to file with open(html_table, "w") as table_file: - table_file.write(final_table) + table_file.write(modern_table_block) # Merge table and scripts into HTML page with open(html_index, "wb") as output_file: - for in_file in [html_header, html_table, html_scripts, html_footer]: - with open(in_file, "rb") as in_file: - shutil.copyfileobj(in_file, output_file) + for part_path in [html_header, html_table, html_scripts, html_footer]: + with open(part_path, "rb") as part_file: + shutil.copyfileobj(part_file, output_file) From 5d1c6b9910a103c86c98c191c89a51de62313de9 Mon Sep 17 00:00:00 2001 From: Dvermetten Date: Tue, 21 Apr 2026 12:30:15 +0200 Subject: [PATCH 2/9] Remove gradient because Koen doesn't like it --- docs/table_styles.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/table_styles.css b/docs/table_styles.css index 439f38c..e352e97 100644 --- a/docs/table_styles.css +++ b/docs/table_styles.css @@ -19,8 +19,6 @@ body { font-family: var(--opl-body); color: var(--opl-text); background: - radial-gradient(circle at 4% 2%, #e6edf7 0, #e6edf700 34%), - radial-gradient(circle at 92% 4%, #ecf3df 0, #ecf3df00 38%), var(--opl-bg); } From ec7576dcec93d21a3b04fc7f4082532479e306c2 Mon Sep 17 00:00:00 2001 From: Dvermetten Date: Tue, 21 Apr 2026 14:01:54 +0200 Subject: [PATCH 3/9] Further separation of html from conversion script --- docs/index.html | 1 - docs/problems.html | 1 - docs/table_styles.css | 8 ++++++++ docs/table_template.html | 21 +++++++++++++++++++++ yaml_to_html.py | 36 +++++++++++------------------------- 5 files changed, 40 insertions(+), 27 deletions(-) create mode 100644 docs/table_template.html diff --git a/docs/index.html b/docs/index.html index d39b48e..26a801d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -24,7 +24,6 @@

OPL – Optimisation problem library

Submit problems and corrections on GitHub with pull requests / issues, through the Google form, or by email: koen.van.der.blom@cwi.nl

-
Visible columns
diff --git a/docs/problems.html b/docs/problems.html index 768796d..d3040ea 100644 --- a/docs/problems.html +++ b/docs/problems.html @@ -1,4 +1,3 @@ -
Visible columns
diff --git a/docs/table_styles.css b/docs/table_styles.css index e352e97..1c53f6d 100644 --- a/docs/table_styles.css +++ b/docs/table_styles.css @@ -8,6 +8,7 @@ --opl-accent-soft: #eaf4fa; --opl-heading: "Segoe UI", "Trebuchet MS", sans-serif; --opl-body: "Tahoma", "Verdana", sans-serif; + --opl-table-font-size: 0.86rem; } * { @@ -123,6 +124,7 @@ h2 { min-width: 980px; border-collapse: separate; border-spacing: 0; + font-size: var(--opl-table-font-size); } #problems thead th { @@ -136,6 +138,11 @@ h2 { #problems td { vertical-align: top; line-height: 1.4; + font-size: inherit; +} + +#problems td * { + font-size: inherit; } #problems th:first-child { @@ -189,6 +196,7 @@ h2 { border: 1px solid var(--opl-border); background: #fff; color: var(--opl-text); + font-size: inherit; } .details-shell { diff --git a/docs/table_template.html b/docs/table_template.html new file mode 100644 index 0000000..270d61f --- /dev/null +++ b/docs/table_template.html @@ -0,0 +1,21 @@ +
+
+
Visible columns
+
+ + +
+
+ __COLUMN_TOGGLES__ +
+
+
+ __TABLE__ +
+
+ +
+

Problem details

+

Click a table row to inspect full details.

+
+
diff --git a/yaml_to_html.py b/yaml_to_html.py index 1bef2dd..87e8cce 100755 --- a/yaml_to_html.py +++ b/yaml_to_html.py @@ -29,6 +29,7 @@ def repl(m): html_scripts = f"{html_dir}javascript.html" html_footer = f"{html_dir}footer.html" html_index = f"{html_dir}index.html" +html_table_template = f"{html_dir}table_template.html" # Load data with open(yaml_file) as yaml_input: @@ -84,33 +85,18 @@ def repl(m): ] ) -modern_table_block = f""" -
-
-
Visible columns
-
- - -
-
- {column_toggles} -
-
-
- {final_table} -
-
- -
-

Problem details

-

Click a table row to inspect full details.

-
-
-""" +with open(html_table_template, encoding="utf-8") as template_file: + table_template = template_file.read() + +table_markup = ( + table_template + .replace("__COLUMN_TOGGLES__", column_toggles) + .replace("__TABLE__", final_table) +) # Write table to file -with open(html_table, "w") as table_file: - table_file.write(modern_table_block) +with open(html_table, "w", encoding="utf-8") as table_file: + table_file.write(table_markup) # Merge table and scripts into HTML page with open(html_index, "wb") as output_file: From c9d37c80560f5d2a39ec74c41553f377f74387b2 Mon Sep 17 00:00:00 2001 From: Vanessa <3634850+CIGbalance@users.noreply.github.com> Date: Tue, 21 Apr 2026 17:06:54 +0200 Subject: [PATCH 4/9] adding merge script (#138) * adding merge script (untested) * making tests not fail * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Change example problem format to YAML Updated example problem format from JSON to YAML. * requested changes * follow new workflow * tested script now * remove from PR * remove unnecessary changes here * undoing changes * removing additional changes * undoing changes * remove file again * finishing merge * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * new_data None * imports * removing no changes * add typing * change to manual mode * updated for new workflow * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * some additional review updates * check format fixes * do not write if failing --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- utils/README.md | 26 ++++++++---- utils/merge_yaml.py | 96 ++++++++++++++++++++++++++++++++++++++++++ utils/validate_yaml.py | 41 ++++++++++++------ 3 files changed, 142 insertions(+), 21 deletions(-) create mode 100644 utils/merge_yaml.py diff --git a/utils/README.md b/utils/README.md index 2ad9e5e..263edda 100644 --- a/utils/README.md +++ b/utils/README.md @@ -1,19 +1,18 @@ # OPL YAML utils -This folder contains utility scripts for working with the YAML format to describe problems in context of OPL. They are mainly intended to be run automatically via GitHub Actions to make collaboration easier. +This folder contains utility scripts for working with the YAML format to describe problems in context of OPL. Some of them are mainly intended to be run automatically via GitHub Actions to make collaboration easier, others are utility functions for maintainers. The intended way of adding a new problem to the repository is thus as follows: -* Create a file in 'utils/new_problem.yaml' based on the template (see below). +* Create a new yaml file based on the template (see below). +* Run the [merge script](merge_yaml.py) locally to update the [problems.yaml](../problems.yaml) file and check that the formatting is correct. * Create a PR with the changes (for example with a fork). What happens in the background then is: -* On PR creation and commits to the PR, the [validate_yaml.py](validate_yaml.py) script is run to check that the YAML file is valid and consistent. It is expecting the changes to be in the [new_problem.yaml](new_problem.yaml) file. +* On PR creation and commits to the PR, the [validate_yaml.py](validate_yaml.py) script is run to check that the [problems.yaml](../problems.yaml) file is still valid and consistent. * Then the PR should be reviewed manually. -* When the PR is merged into the main branch, a second script runs (which doesn't exist yet), that adds the content of [new_problem.yaml](new_problem.yaml) to the [problems.yaml](../problems.yaml) file, and reverts the changes to the new_problem.yaml. - -:warning: Note that the GitHubActions do not exist yet either, this is a WIP. +* When the PR is merged into the main branch with changes to problems.yaml, the checks are run again. ## validate_yaml.py @@ -21,13 +20,24 @@ This script checks the new content for the following: * The YAML syntax is valid and is in expected format * The required fields are present. -* Specific fields are unique across the new set of problems (e.g. name) +* Specific fields are unique across the set of problems (e.g. name) + +:warning: Execute from root of the repository. Tested with python 3.12 + +```bash +pip install -r utils/requirements.txt +python utils/validate_yaml.py problems.yaml +``` + +## merge_yaml.py + +This script merges a new problem description in a separate yaml file into the main [problems.yaml](../problems.yaml) file. It runs the validation checks from the above script before merging and deletes the separate yaml file after merging. :warning: Execute from root of the repository. Tested with python 3.12 ```bash pip install -r utils/requirements.txt -python utils/validate_yaml.py utils/new_problem.yaml +python utils/merge_yaml.py new_problem.yaml problems.yaml ``` ## new problem example diff --git a/utils/merge_yaml.py b/utils/merge_yaml.py new file mode 100644 index 0000000..6705197 --- /dev/null +++ b/utils/merge_yaml.py @@ -0,0 +1,96 @@ +import yaml +import sys +from pathlib import Path +from typing import List, Dict + +# Add parent directory to sys.path +parent = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(parent)) + +from utils.validate_yaml import read_data, validate_data, validate_yaml + + +def write_data(filepath: str, data: List[Dict]) -> bool: + try: + with open(filepath, "w") as f: + yaml.safe_dump(data, f, sort_keys=False) + print(f"::notice::Wrote data to {filepath}.") + except FileNotFoundError: + print(f"::error::File not found: {filepath}") + return False + except OSError as e: + print(f"::error::Error writing file {filepath}: {e}") + return False + except yaml.YAMLError as e: + print(f"::error::YAML syntax error: {e}") + return False + return True + + +def update_existing_data( + existing_data: List[Dict], new_data: List[Dict], out_file: str +) -> bool: + existing_data.extend(new_data) + # validate merged data before writing + valid = validate_data(existing_data) + if not valid: + print(f"::error::Merged data is not valid, cannot write to {out_file}.") + return False + write_success = write_data(out_file, existing_data) + return write_success + + +def merge_new_problems(new_problems_yaml_path: str, big_yaml_path: str) -> bool: + # Read and validate new data + new_data_status, new_data = read_data(new_problems_yaml_path) + if new_data_status != 0 or new_data is None: + print( + f"::error::New problems data could not be read from {new_problems_yaml_path}." + ) + return False + valid = validate_data(new_data) + if not valid: + print(f"::error::New problems data in {new_problems_yaml_path} is not valid.") + return False + + # Read existing data + existing_data_status, existing_data = read_data(big_yaml_path) + if existing_data_status != 0 or existing_data is None: + print( + f"::error::Existing problems data could not be read from {big_yaml_path}." + ) + return False + + # All valid, we can now just merge the dicts + assert existing_data is not None + assert new_data is not None + updated = update_existing_data(existing_data, new_data, big_yaml_path) + if not updated: + print(f"::error::Failed to update existing problems data in {big_yaml_path}.") + return False + + # Validate resulting data + final_status, final_data = validate_yaml(big_yaml_path) + if final_status != 0 or final_data is None: + print( + f"::error::Merged data in {big_yaml_path} is not valid after merging new problems." + ) + return False + + print( + f"::notice::Merged {len(new_data)} new problems into {big_yaml_path}. {new_problems_yaml_path} can now be deleted." + ) + return True + + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: python merge_yaml.py ") + sys.exit(1) + new_problems_yaml_path = sys.argv[1] + big_yaml_path = sys.argv[2] + status = merge_new_problems(new_problems_yaml_path, big_yaml_path) + if not status: + sys.exit(1) + else: + sys.exit(0) diff --git a/utils/validate_yaml.py b/utils/validate_yaml.py index 34f1899..79f4238 100644 --- a/utils/validate_yaml.py +++ b/utils/validate_yaml.py @@ -2,6 +2,7 @@ import sys from pathlib import Path +from typing import List, Dict, Tuple # Add parent directory to sys.path parent = Path(__file__).resolve().parent.parent @@ -16,7 +17,7 @@ UNIQUE_WARNING_FIELDS = ["reference", "implementation"] -def read_data(filepath): +def read_data(filepath: str) -> Tuple[int, List[Dict] | None]: try: with open(filepath, "r") as f: data = yaml.safe_load(f) @@ -29,8 +30,11 @@ def read_data(filepath): return 1, None -def check_format(data): +def check_format(data: List[Dict]) -> bool: num_problems = len(data) + if not isinstance(data, list): + print("::error::YAML file should contain a list of entries.") + return False if len(data) < 1: print("::error::YAML file should contain at least one top level entry.") return False @@ -42,14 +46,16 @@ def check_format(data): return False unique_fields.append({k: v for k, v in entry.items() if k in UNIQUE_FIELDS}) for k in UNIQUE_FIELDS: - values = [entry[k] for entry in unique_fields] + values = [ + entry[k] for entry in unique_fields if k in entry and entry[k] is not None + ] if len(values) != len(set(values)): print(f"::error::Field '{k}' must be unique across all entries.") return False return True -def check_fields(data): +def check_fields(data: Dict) -> bool: missing = [field for field in REQUIRED_FIELDS if field not in data] if missing: print(f"::error::Missing required fields: {', '.join(missing)}") @@ -79,7 +85,7 @@ def check_fields(data): return True -def check_novelty(data, checked_data): +def check_novelty(data: Dict, checked_data: List[Dict]) -> bool: for field in UNIQUE_FIELDS + UNIQUE_WARNING_FIELDS: # skip empty fields if not data.get(field): @@ -101,13 +107,10 @@ def check_novelty(data, checked_data): return True -def validate_yaml(filepath): - status, data = read_data(filepath) - if status != 0: - sys.exit(1) - if not check_format(data): - sys.exit(1) +def validate_data(data: List[Dict]) -> bool: assert data is not None + if not check_format(data): + return False checked_data = [] @@ -115,12 +118,24 @@ def validate_yaml(filepath): # Check required and unique fields if not check_fields(new_data) or not check_novelty(new_data, checked_data): print(f"::error::Validation failed for entry {i+1}.") - sys.exit(1) + return False checked_data.append(new_data) # Add to checked data for novelty checks # YAML is valid if we reach this point print("YAML syntax is valid.") - sys.exit(0) + + return True + + +def validate_yaml(filepath: str) -> None: + status, data = read_data(filepath) + if status != 0 or data is None: + sys.exit(1) + valid = validate_data(data) + if not valid: + sys.exit(1) + else: + sys.exit(0) if __name__ == "__main__": From f6ec9efeae4c0fc5580f9748b12cf068730ef510 Mon Sep 17 00:00:00 2001 From: Dvermetten Date: Tue, 21 Apr 2026 18:00:14 +0200 Subject: [PATCH 5/9] Display code snippets --- docs/index.html | 370 ++++++++++++++++++++++++++++++--------- docs/javascript.html | 205 ++++++++++++++++++++++ docs/problems.html | 165 ++++++++--------- docs/table_styles.css | 97 ++++++++++ docs/table_template.html | 9 + yaml_to_html.py | 38 +++- 6 files changed, 727 insertions(+), 157 deletions(-) diff --git a/docs/index.html b/docs/index.html index 9b4cad3..78f6a70 100644 --- a/docs/index.html +++ b/docs/index.html @@ -55,7 +55,7 @@

OPL – Optimisation problem library

- + BBOB suite @@ -70,7 +70,7 @@

OPL – Optimisation problem library

https://doi.org/10.1080/10556788.2020.1808977 https://github.com/numbbo/coco - + BBOB-biobj suite @@ -85,7 +85,7 @@

OPL – Optimisation problem library

https://doi.org/10.48550/arXiv.1604.00359 https://github.com/numbbo/coco - + BBOB-noisy suite @@ -100,7 +100,7 @@

OPL – Optimisation problem library

https://hal.inria.fr/inria-00369466 https://web.archive.org/web/20210416065610/https://coco.gforge.inria.fr/doku.php?id=downloads - + BBOB-largescale suite @@ -115,7 +115,7 @@

OPL – Optimisation problem library

https://doi.org/10.48550/arXiv.1903.06396 https://github.com/numbbo/coco - + BBOB-mixint suite @@ -130,7 +130,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3321707.3321868 https://github.com/numbbo/coco - + BBOB-biobj-mixint suite @@ -145,7 +145,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3321707.3321868 https://github.com/numbbo/coco - + BBOB-constrained suite @@ -160,7 +160,7 @@

OPL – Optimisation problem library

http://numbbo.github.io/coco-doc/bbob-constrained/ https://github.com/numbbo/coco - + MOrepo suite @@ -175,7 +175,7 @@

OPL – Optimisation problem library

https://github.com/MCDMSociety/MOrepo - + ZDT suite @@ -190,7 +190,7 @@

OPL – Optimisation problem library

https://doi.org/10.1162/106365600568202 https://github.com/anyoptimization/pymoo - + DTLZ suite @@ -205,7 +205,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/CEC.2002.1007032 https://pymoo.org/problems/many/dtlz.html - + WFG suite @@ -220,7 +220,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/TEVC.2005.861417 https://pymoo.org/problems/many/wfg.html - + CDMP suite @@ -235,7 +235,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3321707.3321878 ? - + SDP suite @@ -250,7 +250,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/TCYB.2019.2896021 ? - + MaOP suite @@ -265,7 +265,7 @@

OPL – Optimisation problem library

https://doi.org/10.1016/j.swevo.2019.02.003 ? - + BP suite @@ -280,7 +280,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/CEC.2019.8790277 ? - + GPD generator @@ -295,7 +295,7 @@

OPL – Optimisation problem library

https://doi.org/10.1016/j.asoc.2020.106139 ? - + ETMOF suite @@ -310,7 +310,7 @@

OPL – Optimisation problem library

https://doi.org/10.48550/arXiv.2110.08033 https://github.com/songbai-liu/etmo - + MMOPP suite @@ -325,7 +325,7 @@

OPL – Optimisation problem library

http://www5.zzu.edu.cn/system/_content/download.jsp?urltype=news.DownloadAttachUrl&owner=1327567121&wbfileid=4764412 http://www5.zzu.edu.cn/ecilab/info/1036/1251.htm - + CFD expensive evaluations 30s-15m suite @@ -340,7 +340,7 @@

OPL – Optimisation problem library

https://doi.org/10.1007/978-3-319-99259-4_24 https://bitbucket.org/arahat/cfd-test-problem-suite - + GBEA expensive evaluations 5s-35s, RW-GAN-Mario and TopTrumps are part of GBEA suite @@ -355,7 +355,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3321707.3321805 https://github.com/ttusar/coco-gbea - + Car structure 54 constraints suite @@ -370,7 +370,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3205651.3205702 http://ladse.eng.isas.jaxa.jp/benchmark/ - + EMO2017 suite @@ -385,7 +385,7 @@

OPL – Optimisation problem library

https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/ https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/downloads/realworld-problems-bbcomp-EMO-2017.zip - + JSEC2019 expensive evaluations 3s; 22 constraints single @@ -400,7 +400,7 @@

OPL – Optimisation problem library

http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html - + RE suite @@ -415,7 +415,7 @@

OPL – Optimisation problem library

https://doi.org/10.1016/j.asoc.2020.106078 https://github.com/ryojitanabe/reproblems - + CRE suite @@ -430,7 +430,7 @@

OPL – Optimisation problem library

https://doi.org/10.1016/j.asoc.2020.106078 https://github.com/ryojitanabe/reproblems - + Radar waveform single @@ -445,7 +445,7 @@

OPL – Optimisation problem library

https://doi.org/10.1007/978-3-540-70928-2_53 http://code.evanhughes.org/ - + MF2 suite @@ -460,7 +460,7 @@

OPL – Optimisation problem library

https://doi.org/10.21105/joss.02049 https://github.com/sjvrijn/mf2 - + AMVOP suite @@ -475,7 +475,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/TEVC.2013.2281531 ? - + RWMVOP suite @@ -490,7 +490,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/TEVC.2013.2281531 ? - + SBOX-COST problems from BBOB but allows instances with the optimum close to the boundary suite @@ -505,7 +505,7 @@

OPL – Optimisation problem library

https://doi.org/10.48550/arXiv.2305.12221 https://github.com/IOHprofiler/IOHexperimenter/ - + ρMNK-Landscapes tunable variable and objective dimensions; tunable multimodality and correlation between objectives generator @@ -520,7 +520,7 @@

OPL – Optimisation problem library

https://doi.org/10.1016/j.ejor.2012.12.019 https://gitlab.com/aliefooghe/mocobench/ - + mUBQP tunable variable and objective dimensions; tunable density and correlation between objectives generator @@ -535,7 +535,7 @@

OPL – Optimisation problem library

https://doi.org/10.1016/j.asoc.2013.11.008 https://gitlab.com/aliefooghe/mocobench/ - + ρmTSP tunable variable and objective dimensions; tunable instance type (euclidian/random); tunable correlation between objectives generator @@ -550,7 +550,7 @@

OPL – Optimisation problem library

https://doi.org/10.1007/978-3-319-45823-6_40 https://gitlab.com/aliefooghe/mocobench/ - + CEC2015-DMOO suite @@ -565,7 +565,7 @@

OPL – Optimisation problem library

Benchmark Functions for CEC 2015 Special Session and Competition on Dynamic Multi-objective Optimization - + Ealain Real-world-like, easily extensible to increase complexity generator @@ -580,7 +580,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3638530.3654299 https://github.com/qrenau/Ealain - + MA-BBOB Generator that creates affine combinations of BBOB functions generator @@ -595,7 +595,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3673908 https://github.com/IOHprofiler/IOHexperimenter/blob/master/example/Competitions/MA-BBOB/Example_MABBOB.ipynb - + MPM2 nonlinear nonseparable nonsymmetric; scalable in terms of time to evaluate the objective function generator @@ -610,7 +610,7 @@

OPL – Optimisation problem library

https://ls11-www.cs.tu-dortmund.de/_media/techreports/tr15-01.pdf https://github.com/jakobbossek/smoof/blob/master/inst/mpm2.py - + Convex DTLZ2 Variant of DTLZ2 with a convex Pareto front (instead of concave) single @@ -625,7 +625,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/TEVC.2013.2281535 ? - + Inverted DTLZ1 Variant of DTLZ1 with an inverted Pareto front single @@ -640,7 +640,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/TEVC.2013.2281534 ? - + Minus DTLZ Variant of DTLZ that minimises the inverse of the base DTLZ functions suite @@ -655,7 +655,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/TEVC.2016.2587749 ? - + Minus WFG Variant of WFG that minimises the inverse of the base WFG functions suite @@ -670,7 +670,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/TEVC.2016.2587749 ? - + L1-ZDT Variant of ZDT with linkages between variables within one of two groups but not between variables in a different group; Linear recombination operators can potentially take advantage of the problem structure suite @@ -685,7 +685,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/1143997.1144179 ? - + L2-ZDT Variant of ZDT with linkages between all variables; Linear recombination operators can potentially take advantage of the problem structure suite @@ -700,7 +700,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/1143997.1144179 ? - + L3-ZDT Variant of L2-ZDT using a mapping to prevent linear recombination operators from potentially taking advantage of the problem structure suite @@ -715,7 +715,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/1143997.1144179 ? - + L2-DTLZ Variant of DTLZ2 and DTLZ3 with linkages between all variables; Linear recombination operators can potentially take advantage of the problem structure suite @@ -730,7 +730,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/1143997.1144179 ? - + L3-DTLZ Variant of L2-DTLZ using a mapping to prevent linear recombination operators from potentially taking advantage of the problem structure suite @@ -745,7 +745,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/1143997.1144179 ? - + CEC2018 DT - CEC2018 Competition on Dynamic Multiobjective Optimisation 14 problems. Time-dependent: Pareto front/Pareto set geometry; irregular Pareto front shapes; variable-linkage; number of disconnected Pareto front segments; etc. suite @@ -760,7 +760,7 @@

OPL – Optimisation problem library

https://www.academia.edu/download/94499025/TR-CEC2018-DMOP-Competition.pdf https://pymoo.org/problems/dynamic/df.html - + MODAct - multiobjective design of actuators Realistic Constrained Multi-Objective Optimization Benchmark Problems from Design. Need the https://github.com/epfl-lamd/modact package installed; evaluation times around 20ms suite @@ -775,7 +775,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/TEVC.2020.3020046 https://pymoo.org/problems/constrained/modact.html - + IOHClustering Set of benchmark problems from clustering: optimization task is selecting cluster centers for a given set of data, with the number of clusters defining problem dimensionality. Includes both a suite and a generator. Based on ML clustering datasets suite; generator @@ -790,7 +790,7 @@

OPL – Optimisation problem library

https://arxiv.org/pdf/2505.09233 https://github.com/IOHprofiler/IOHClustering - + GNBG-II Generalized Numerical Benchmark Generator (version 2). Also in IOH https://github.com/IOHprofiler/IOHGNBG suite; generator @@ -805,7 +805,7 @@

OPL – Optimisation problem library

https://dl.acm.org/doi/pdf/10.1145/3712255.3734271 https://github.com/rohitsalgotra/GNBG-II - + GNBG Generalized Numerical Benchmark Generator suite; generator @@ -820,7 +820,7 @@

OPL – Optimisation problem library

https://arxiv.org/abs/2312.07083 https://github.com/Danial-Yazdani/GNBG-Generator - + DynamicBinVal Four versions of the dynamic binary value problem suite @@ -835,7 +835,7 @@

OPL – Optimisation problem library

https://arxiv.org/pdf/2404.15837 https://github.com/IOHprofiler/IOHexperimenter - + PBO Suite of 25 binary optimization problems suite @@ -850,7 +850,7 @@

OPL – Optimisation problem library

https://dl.acm.org/doi/pdf/10.1145/3319619.3326810 https://github.com/IOHprofiler/IOHexperimenter - + W-model Tunable generator for binary optimization based on several difficulty features generator @@ -865,7 +865,7 @@

OPL – Optimisation problem library

https://dl.acm.org/doi/abs/10.1145/3205651.3208240?casa_token=S4U_Pi9f6MwAAAAA:U9ztNTPwmupT8K3GamWZfBL7-8fqjxPtr_kprv51vdwA-REsp0EyOFGa99BtbANb0XbqyrVg795hIw https://github.com/thomasWeise/BBDOB_W_Model - + Submodular Optimitzation set of graph-based submodular optimization problems from 4 problem types suite @@ -880,7 +880,7 @@

OPL – Optimisation problem library

https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10254181 https://github.com/IOHprofiler/IOHexperimenter - + CEC2013 suite used for cec2013 competition. Also in IOH https://github.com/IOHprofiler/IOHexperimenter suite @@ -895,7 +895,7 @@

OPL – Optimisation problem library

https://peerj.com/articles/cs-2671/CEC2013.pdf https://github.com/P-N-Suganthan/CEC2013 - + CEC2022 suite used for cec2022 competition. Also in IOH https://github.com/IOHprofiler/IOHexperimenter suite @@ -910,7 +910,7 @@

OPL – Optimisation problem library

https://github.com/P-N-Suganthan/2022-SO-BO/blob/main/CEC2022%20TR.pdf https://github.com/P-N-Suganthan/2022-SO-BO - + Onemax+Sphere / Zeromax+Sphere single @@ -925,7 +925,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3449726.3459521 None - + Onemax+Sphere / DeceptiveTrap+RotatedEllipsoid single @@ -940,7 +940,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3449726.3459521 None - + InverseDeceptiveTrap+RotatedEllipsoid / DeceptiveTrap+RotatedEllipsoid single @@ -955,7 +955,7 @@

OPL – Optimisation problem library

https://doi.org/10.1145/3449726.3459521 None - + PorkchopPlotInterplanetaryTrajectory suite @@ -970,7 +970,7 @@

OPL – Optimisation problem library

https://doi.org/10.1109/CEC65147.2025.11042973 https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world - + KinematicsRobotArm suite @@ -985,7 +985,7 @@

OPL – Optimisation problem library

https://doi.org/10.1023/A:1013258808932 https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world - + VehicleDynamics suite @@ -1000,7 +1000,7 @@

OPL – Optimisation problem library

https://www.scitepress.org/Papers/2023/121580/121580.pdf https://zenodo.org/records/8307853 - + MECHBench This is a set of problems with inspiration from Structural Mechanics Design Optimization. The suite comprises three physical models, from which the user may define different kind of problems which impact the final design output. Problem Suite @@ -1015,7 +1015,7 @@

OPL – Optimisation problem library

https://arxiv.org/abs/2511.10821 https://github.com/BayesOptApp/MECHBench - + EXPObench Wind farm layout optimization, gas filter design, pipe shape optimization, hyperparameter tuning, and hospital simulation Problem Suite @@ -1030,7 +1030,7 @@

OPL – Optimisation problem library

https://doi.org/10.1016/j.asoc.2023.110744 https://github.com/AlgTUDelft/ExpensiveOptimBenchmark - + Gasoline direct injection engine design A multi-objective optimization problem seeking to minimize fuel consumption and NOx emissions over a two-minute dynamic duty cycle, subject to five constraints (turbine inlet temperature, number of knock occurrences, peak cylinder pressure, peak cylinder pressure rise, total work). Seven decision variables are defined: four define the hardware choices of cylinder compression ratio, turbo machinery and EGR cooler sizing; three relate to control variables that parameterise the engine control logic. Single Problem @@ -1045,7 +1045,7 @@

OPL – Optimisation problem library

https://doi.org/10.1016/j.ejor.2022.08.032 - + BEACON Generator for bi-objective benchmark problems with explicitly controlled correlations in continuous spaces. Generator @@ -1060,7 +1060,7 @@

OPL – Optimisation problem library

https://dl.acm.org/doi/10.1145/3712255.3734303 https://github.com/Stebbet/BEACON/ - + TulipaEnergy Determine the optimal investment and operation decisions for different types of assets in the energy system (production, consumption, conversion, storage, and transport), while minimizing loss of load. Problem Suite @@ -1075,7 +1075,7 @@

OPL – Optimisation problem library

See https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/40-scientific-foundation/45-scientific-references https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/ - + ATO Parameters of the Modules of the Automatic Train Operation should be optimized. The parameters are continuous with different ranges. There are two objectives (minimizing energy consumption, minimizing driving duration. Single Problem @@ -1090,7 +1090,7 @@

OPL – Optimisation problem library

- - + Brachytherapy treatment planning Treatment planning for internal radiation therapy Problem Suite @@ -1105,7 +1105,7 @@

OPL – Optimisation problem library

https://www.sciencedirect.com/science/article/pii/S1538472123016781 - + FleetOpt Healthcare organisation in the UK provided data about their current fleet of vehicles to conduct non-emergency heathcare trips in the Argyll and Bute region of Scotland, UK. They also provided historical data about the trips the vehicles took and about the bases which the vehicles return to. The aim is to reduce the existing fleet of vehicles while still ensuring all trips can be covered. Moving a vehicle from one base to another to help cover trips is OK as long as the original base can still cover its trips. Link to paper with more details: https://dl.acm.org/doi/abs/10.1145/3638530.3664137 Single Problem @@ -1120,7 +1120,7 @@

OPL – Optimisation problem library

https://dl.acm.org/doi/abs/10.1145/3638530.3664137 Not public: was done for real client with their private data - + Building spatial design Optimise the spatial layout of a building to: minimise energy consumption for climate control, and minimise the strain on the structure Single Problem @@ -1135,7 +1135,7 @@

OPL – Optimisation problem library

https://hdl.handle.net/1887/81789 https://github.com/TUe-excellent-buildings/BSO-toolbox - + Electric Motor Design Optimization The goal is to find a design of a synchronous electric motor for power steering systems that minimizes costs and satisfies all constraints. Single Problem @@ -1150,7 +1150,7 @@

OPL – Optimisation problem library

https://dis.ijs.si/tea/Publications/Tusar23Multistep.pdf (paper in Slovene) Implementation not freely available - + BONO-Bench Bi-objective problem generator and suite with scalable continuous decision space. Features complex problem properties (different types of multimodality and challenges in decision and objective space) as well as Pareto front approximations with error guarantees for the hypervolume and exact R2 indicators. Generator @@ -1165,7 +1165,7 @@

OPL – Optimisation problem library

https://github.com/schaepermeier/bonobench - + RandOptGen RandOptGen: A Unified Random Problem Generator for Single-and Multi-Objective Optimization Problems with Mixed-Variable Input Spaces Generator @@ -1180,7 +1180,7 @@

OPL – Optimisation problem library

https://github.com/MALEO-research-group/RandOptGen - + CUTEr A constrained and unconstrained testing environment Problem Suite @@ -1195,7 +1195,7 @@

OPL – Optimisation problem library

https://dl.acm.org/doi/10.1145/962437.962439 Not Found - + CUTEst The Constrained and Unconstrained Testing Environment with safe threads (CUTEst) for optimization software Problem Suite @@ -1210,7 +1210,7 @@

OPL – Optimisation problem library

https://link.springer.com/article/10.1007/s10589-014-9687-3 https://github.com/jfowkes/pycutest - + PUBOi A benchmark in which variable importance is tunable, based on the Walsh function Generator @@ -1234,10 +1234,24 @@

OPL – Optimisation problem library

Problem details

Click a table row to inspect full details.

+
+

README.md

+

README content for this snippet folder will appear here.

+
+

Snippet: call_{problem_id}.py

+

Open snippet folder

+

Select a problem to check for an available code snippet.

+
+