From 7262a8d9b3062e60c033b410315dba68eea5b53b Mon Sep 17 00:00:00 2001 From: Olaf Mersmann Date: Mon, 20 Apr 2026 15:17:51 +0200 Subject: [PATCH 01/20] feat: Add new schema definition Adds a formal schema definition for problems, generators, suites and implementations. These are packaged in a bare bones python module named opltools. A minimal usage example is located in examples/demo.py. To check if a given yaml file adheres to the schema, there's an included cli tool. Run uv run opl validate my-file.yaml to check it. --- examples/demo.py | 35 ++++++ pyproject.toml | 21 ++++ src/opltools/__init__.py | 1 + src/opltools/cli.py | 42 +++++++ src/opltools/py.typed | 0 src/opltools/schema.py | 149 +++++++++++++++++++++++ src/opltools/utils.py | 61 ++++++++++ uv.lock | 250 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 559 insertions(+) create mode 100644 examples/demo.py create mode 100644 pyproject.toml create mode 100644 src/opltools/__init__.py create mode 100644 src/opltools/cli.py create mode 100644 src/opltools/py.typed create mode 100644 src/opltools/schema.py create mode 100644 src/opltools/utils.py create mode 100644 uv.lock diff --git a/examples/demo.py b/examples/demo.py new file mode 100644 index 0000000..7f56445 --- /dev/null +++ b/examples/demo.py @@ -0,0 +1,35 @@ +from opltools import * +from pydantic_yaml import to_yaml_str +from opltools.schema import Implementation + +things = {} + +things["impl_py_cocoex"] = Implementation( + name="coco-experiment Python module", + description="Python bindings for the experiment part of the COCO framework", + language="python", + links=[ + Link(type="repository", url="https://github.com/numbbo/coco-experiment"), + Link(type="package", url="https://pypi.org/project/coco-experiment/") + ], + evaluation_time="sub second" +) + +for fnr in range(1, 25): + id = f"fn_bbob_f{fnr}" + things[f"fn_bbob_f{fnr}"] = Problem( + name=f"BBOB F_{fnr}", + objectives={1}, + variables=Variables(continuous=ValueRange(min=1, max=80)), + implementations=["impl_py_cocoex"] + ) + +things["suite_bbob"] = Suite( + name="BBOB", + problems={f"fn_bbob_f{fnr}" for fnr in range(1, 25)}, + implementations=["impl_py_cocoex"] +) + +library = Library(things) + +print(to_yaml_str(library)) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6cbebfc --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,21 @@ +[project] +name = "opltools" +version = "0.1.0" +description = "Tools to manage the Optimization Problem Library" +readme = "README.md" +authors = [ + { name = "Olaf Mersmann", email = "olafm@p-value.net" } +] +requires-python = ">=3.12" +dependencies = [ + "pydantic>=2.13.3", + "pydantic-yaml>=1.6.0", + "pyyaml>=6.0.3", +] + +[project.scripts] +opl = "opltools.cli:main" + +[build-system] +requires = ["uv_build>=0.11.7,<0.12.0"] +build-backend = "uv_build" diff --git a/src/opltools/__init__.py b/src/opltools/__init__.py new file mode 100644 index 0000000..23e80ae --- /dev/null +++ b/src/opltools/__init__.py @@ -0,0 +1 @@ +from .schema import * diff --git a/src/opltools/cli.py b/src/opltools/cli.py new file mode 100644 index 0000000..2f6191d --- /dev/null +++ b/src/opltools/cli.py @@ -0,0 +1,42 @@ +import sys +import argparse +from pydantic import ValidationError +from pydantic_yaml import parse_yaml_raw_as + +from .schema import Library + + +def cmd_validate(args): + try: + with open(args.file) as f: + raw = f.read() + except OSError as e: + print(f"Error reading file: {e}", file=sys.stderr) + return 1 + + try: + parse_yaml_raw_as(Library, raw) + print(f"{args.file}: OK") + return 0 + except ValidationError as e: + for error in e.errors(): + loc = " -> ".join(str(p) for p in error["loc"]) if error["loc"] else "(root)" + print(f"{args.file}: {loc}: {error['msg']}") + return 1 + + +def main(): + parser = argparse.ArgumentParser(prog="opl", description="OPL tools") + subparsers = parser.add_subparsers(dest="command", required=True) + + validate_parser = subparsers.add_parser("validate", help="Validate a YAML file against the Library schema") + validate_parser.add_argument("file", help="YAML file to validate") + + args = parser.parse_args() + + if args.command == "validate": + sys.exit(cmd_validate(args)) + + +if __name__ == "__main__": + main() diff --git a/src/opltools/py.typed b/src/opltools/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/src/opltools/schema.py b/src/opltools/schema.py new file mode 100644 index 0000000..b64c3b6 --- /dev/null +++ b/src/opltools/schema.py @@ -0,0 +1,149 @@ +from enum import Enum +from typing_extensions import Self +from pydantic import BaseModel, RootModel, ConfigDict, model_validator + +from .utils import ValueRange, union_range + + +class OPLType(Enum): + problem = "problem" + suite = "suite" + generator = "generator" + implementation = 'implementation' + + +class YesNoSome(Enum): + yes = "yes" + no = "no" + some = "some" + unknown = "?" + + +class Link(BaseModel): + type: str | None = None + url: str + + +class Thing(BaseModel): + type: OPLType + model_config = ConfigDict(extra='allow') + + +class Objectives(RootModel): + root: int | set[int] | ValueRange = 0 + + def union(self, other: Self) -> Self: + self.root = union_range(self.root, other.root) + return self + + +class Variables(BaseModel): + continuous: int | set[int] | ValueRange = 0 + integer: int | set[int] | ValueRange = 0 + binary: int | set[int] | ValueRange = 0 + categorical: int | set[int] | ValueRange = 0 + + def union(self, other: Self) -> Self: + self.continuous = union_range(self.continuous, other.continuous) + self.integer = union_range(self.integer, other.integer) + self.binary = union_range(self.integer, other.binary) + self.categorical = union_range(self.integer, other.categorical) + return self + + +class Constraints(BaseModel): + box: int | set[int] | ValueRange = 0 + linear: int | set[int] | ValueRange = 0 + function: int | set[int] | ValueRange = 0 + + def union(self, other: Variables) -> Self: + self.box = union_range(self.box, other.box) + self.linear = union_range(self.linear, other.linear) + self.function = union_range(self.function, other.function) + return self + + +class Reference(BaseModel): + title: str + authors: list[str] + link: Link | None = None + + +class Usage(BaseModel): + language: str + code: str + + +class Implementation(Thing): + type: OPLType= OPLType.implementation + name: str + description: str + links: list[Link] | None = None + language: str | None = None + evaluation_time: str | None = None + requirements: str | list[str] | None = None + + +class ProblemLike(Thing): + name: str + long_name: str | None = None + description: str | None = None + tags: set[str] | None = None + references: set[Reference] | None = None + implementations: set[str] | None = None + objectives: set[int] | None = None + variables: Variables | None = None + constraints: Constraints | None = None + soft_constraints: Constraints | None = None + dynamic_type: set[str] | None = None + noise_type: set[str] | None = None + allows_partial_evaluation: YesNoSome | None = None + can_evaluate_objectives_independently: YesNoSome | None = None + modality: set[str] | None = None + fidelity_levels: set[int] | None = None + code_examples: set[str] | None = None + source: set[str] | None = None + + +class Problem(ProblemLike): + type:OPLType = OPLType.problem + instances: ValueRange | list[str] | None = None + + +class Suite(ProblemLike): + type:OPLType = OPLType.suite + problems: set[str] | None = None + + +class Generator(ProblemLike): + type:OPLType = OPLType.generator + + +class Library(RootModel): + root: dict[str, Problem | Generator | Suite | Implementation] | None + + def _check_id_references(self, ids, type:OPLType) -> None: + if not self.root: return + for id in ids: + if id in self.root: + if self.root[id].type != type: + raise ValueError(f"ID {id} is a {self.root[id].name}, expected a {type.name}") + else: + raise ValueError(f"Missing {type.name} with id '{id}'") + + def _fixup_fidelity(self, suite: Suite) -> Suite: + return suite + + @model_validator(mode="after") + def validate(self) -> Self: + if not self.root: return self + + # Make sure all problems referenced in suites exists + for id, thing in self.root.items(): + if isinstance(thing, Suite) and thing.problems: + for problem_id in thing.problems: + if problem_id not in self.root: + raise ValueError(f"Suite {id} references problem with undefined id '{problem_id}'.") + if self.root[problem_id].type != OPLType.problem: + raise ValueError(f"Suite {id} references problem with id '{problem_id}' but id is a {self.root[problem_id].type.name}.") + return self diff --git a/src/opltools/utils.py b/src/opltools/utils.py new file mode 100644 index 0000000..5217053 --- /dev/null +++ b/src/opltools/utils.py @@ -0,0 +1,61 @@ +from typing_extensions import Self +from pydantic import BaseModel, model_validator + + +class ValueRange(BaseModel): + min: int | None + max: int | None + + @model_validator(mode="after") + def _check(self) -> Self: + if not self.min and not self.max: + raise ValueError("Variable range should have at least a min or max value.") + return self + + +def _none_min(a, b): + if a and b: + return min(a, b) + elif a: + return a + else: + return b + + +def _none_max(a, b): + if a and b: + return max(a, b) + elif a: + return a + else: + return b + + +def union_range( + a: int | set[int] | ValueRange, + b: int | set[int] | ValueRange +) -> int | set[int] | ValueRange: + if isinstance(a, int): + a = { a } + if isinstance(b, int): + b = { b } + + if isinstance(a, set) and isinstance(b, set): + res = a.union(b) + return res.pop() if len(res) == 1 else res + elif isinstance(a, ValueRange) and isinstance(b, ValueRange): + return ValueRange(min=_none_min(a.min, b.min), max=_none_max(a.max, b.max)) + + if isinstance(a, set): + a, b = b, a + if isinstance(a, ValueRange) and isinstance(b, set): + res = ValueRange(min=a.min, max=a.max) + if res.min: + for v in b: + res.min = min(v, res.min) + if res.max: + for v in b: + res.max = max(v, res.max)# + return res + + raise Exception("BAM") diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..337dd60 --- /dev/null +++ b/uv.lock @@ -0,0 +1,250 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "opltools" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "pydantic" }, + { name = "pydantic-yaml" }, + { name = "pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "pydantic", specifier = ">=2.13.3" }, + { name = "pydantic-yaml", specifier = ">=1.6.0" }, + { name = "pyyaml", specifier = ">=6.0.3" }, +] + +[[package]] +name = "pydantic" +version = "2.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, + { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, + { url = "https://files.pythonhosted.org/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, + { url = "https://files.pythonhosted.org/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, + { url = "https://files.pythonhosted.org/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, + { url = "https://files.pythonhosted.org/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, + { url = "https://files.pythonhosted.org/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, + { url = "https://files.pythonhosted.org/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, + { url = "https://files.pythonhosted.org/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, + { url = "https://files.pythonhosted.org/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, + { url = "https://files.pythonhosted.org/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, + { url = "https://files.pythonhosted.org/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, + { url = "https://files.pythonhosted.org/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, + { url = "https://files.pythonhosted.org/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, + { url = "https://files.pythonhosted.org/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, + { url = "https://files.pythonhosted.org/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, + { url = "https://files.pythonhosted.org/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, + { url = "https://files.pythonhosted.org/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, + { url = "https://files.pythonhosted.org/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, + { url = "https://files.pythonhosted.org/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, + { url = "https://files.pythonhosted.org/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, + { url = "https://files.pythonhosted.org/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, + { url = "https://files.pythonhosted.org/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, + { url = "https://files.pythonhosted.org/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, + { url = "https://files.pythonhosted.org/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, + { url = "https://files.pythonhosted.org/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, + { url = "https://files.pythonhosted.org/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, + { url = "https://files.pythonhosted.org/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, + { url = "https://files.pythonhosted.org/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, + { url = "https://files.pythonhosted.org/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, + { url = "https://files.pythonhosted.org/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, + { url = "https://files.pythonhosted.org/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, + { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, + { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, + { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, + { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, +] + +[[package]] +name = "pydantic-yaml" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "ruamel-yaml" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/6c/6bc8f39406cdeed864578df88f52a63db27bd24aa8473206d650bc4fa1d8/pydantic_yaml-1.6.0.tar.gz", hash = "sha256:ce5f10b65d95ca45846a36ea8dae54e550fa3058e7d6218e0179184d9bf6f660", size = 25782, upload-time = "2025-08-08T21:01:13.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/39/8d263fbcb409a8f5dd78ac8f89f1e6af1d4e4d9fbb7f856ca3245b354809/pydantic_yaml-1.6.0-py3-none-any.whl", hash = "sha256:02cb800b455b68daeeb74ad736c252a94a0b203da5fbbeef02539d468e1d98f8", size = 22511, upload-time = "2025-08-08T21:01:11.425Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.15' and platform_python_implementation == 'CPython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/2b/7a1f1ebcd6b3f14febdc003e658778d81e76b40df2267904ee6b13f0c5c6/ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c", size = 149602, upload-time = "2025-12-17T20:02:55.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/fe/b6045c782f1fd1ae317d2a6ca1884857ce5c20f59befe6ab25a8603c43a7/ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d", size = 121594, upload-time = "2025-12-17T20:02:07.657Z" }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/97/60fda20e2fb54b83a61ae14648b0817c8f5d84a3821e40bfbdae1437026a/ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600", size = 225794, upload-time = "2025-11-16T16:12:59.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/4b/5fde11a0722d676e469d3d6f78c6a17591b9c7e0072ca359801c4bd17eee/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff", size = 149088, upload-time = "2025-11-16T16:13:22.836Z" }, + { url = "https://files.pythonhosted.org/packages/85/82/4d08ac65ecf0ef3b046421985e66301a242804eb9a62c93ca3437dc94ee0/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2", size = 134553, upload-time = "2025-11-16T16:13:24.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/cb/22366d68b280e281a932403b76da7a988108287adff2bfa5ce881200107a/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1", size = 737468, upload-time = "2025-11-16T20:22:47.335Z" }, + { url = "https://files.pythonhosted.org/packages/71/73/81230babf8c9e33770d43ed9056f603f6f5f9665aea4177a2c30ae48e3f3/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71845d377c7a47afc6592aacfea738cc8a7e876d586dfba814501d8c53c1ba60", size = 753349, upload-time = "2025-11-16T16:13:26.269Z" }, + { url = "https://files.pythonhosted.org/packages/61/62/150c841f24cda9e30f588ef396ed83f64cfdc13b92d2f925bb96df337ba9/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e5499db1ccbc7f4b41f0565e4f799d863ea720e01d3e99fa0b7b5fcd7802c9", size = 788211, upload-time = "2025-11-16T16:13:27.441Z" }, + { url = "https://files.pythonhosted.org/packages/30/93/e79bd9cbecc3267499d9ead919bd61f7ddf55d793fb5ef2b1d7d92444f35/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b293a37dc97e2b1e8a1aec62792d1e52027087c8eea4fc7b5abd2bdafdd6642", size = 743203, upload-time = "2025-11-16T16:13:28.671Z" }, + { url = "https://files.pythonhosted.org/packages/8d/06/1eb640065c3a27ce92d76157f8efddb184bd484ed2639b712396a20d6dce/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:512571ad41bba04eac7268fe33f7f4742210ca26a81fe0c75357fa682636c690", size = 747292, upload-time = "2025-11-16T20:22:48.584Z" }, + { url = "https://files.pythonhosted.org/packages/a5/21/ee353e882350beab65fcc47a91b6bdc512cace4358ee327af2962892ff16/ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5e9f630c73a490b758bf14d859a39f375e6999aea5ddd2e2e9da89b9953486a", size = 771624, upload-time = "2025-11-16T16:13:29.853Z" }, + { url = "https://files.pythonhosted.org/packages/57/34/cc1b94057aa867c963ecf9ea92ac59198ec2ee3a8d22a126af0b4d4be712/ruamel_yaml_clib-0.2.15-cp312-cp312-win32.whl", hash = "sha256:f4421ab780c37210a07d138e56dd4b51f8642187cdfb433eb687fe8c11de0144", size = 100342, upload-time = "2025-11-16T16:13:31.067Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e5/8925a4208f131b218f9a7e459c0d6fcac8324ae35da269cb437894576366/ruamel_yaml_clib-0.2.15-cp312-cp312-win_amd64.whl", hash = "sha256:2b216904750889133d9222b7b873c199d48ecbb12912aca78970f84a5aa1a4bc", size = 119013, upload-time = "2025-11-16T16:13:32.164Z" }, + { url = "https://files.pythonhosted.org/packages/17/5e/2f970ce4c573dc30c2f95825f2691c96d55560268ddc67603dc6ea2dd08e/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dcec721fddbb62e60c2801ba08c87010bd6b700054a09998c4d09c08147b8fb", size = 147450, upload-time = "2025-11-16T16:13:33.542Z" }, + { url = "https://files.pythonhosted.org/packages/d6/03/a1baa5b94f71383913f21b96172fb3a2eb5576a4637729adbf7cd9f797f8/ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471", size = 133139, upload-time = "2025-11-16T16:13:34.587Z" }, + { url = "https://files.pythonhosted.org/packages/dc/19/40d676802390f85784235a05788fd28940923382e3f8b943d25febbb98b7/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46895c17ead5e22bea5e576f1db7e41cb273e8d062c04a6a49013d9f60996c25", size = 731474, upload-time = "2025-11-16T20:22:49.934Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bb/6ef5abfa43b48dd55c30d53e997f8f978722f02add61efba31380d73e42e/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a", size = 748047, upload-time = "2025-11-16T16:13:35.633Z" }, + { url = "https://files.pythonhosted.org/packages/ff/5d/e4f84c9c448613e12bd62e90b23aa127ea4c46b697f3d760acc32cb94f25/ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf", size = 782129, upload-time = "2025-11-16T16:13:36.781Z" }, + { url = "https://files.pythonhosted.org/packages/de/4b/e98086e88f76c00c88a6bcf15eae27a1454f661a9eb72b111e6bbb69024d/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab0df0648d86a7ecbd9c632e8f8d6b21bb21b5fc9d9e095c796cacf32a728d2d", size = 736848, upload-time = "2025-11-16T16:13:37.952Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5c/5964fcd1fd9acc53b7a3a5d9a05ea4f95ead9495d980003a557deb9769c7/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:331fb180858dd8534f0e61aa243b944f25e73a4dae9962bd44c46d1761126bbf", size = 741630, upload-time = "2025-11-16T20:22:51.718Z" }, + { url = "https://files.pythonhosted.org/packages/07/1e/99660f5a30fceb58494598e7d15df883a07292346ef5696f0c0ae5dee8c6/ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4c928ddf6bce586285daa6d90680b9c291cfd045fc40aad34e445d57b1bf51", size = 766619, upload-time = "2025-11-16T16:13:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/fa0344a9327b58b54970e56a27b32416ffbcfe4dcc0700605516708579b2/ruamel_yaml_clib-0.2.15-cp313-cp313-win32.whl", hash = "sha256:bf0846d629e160223805db9fe8cc7aec16aaa11a07310c50c8c7164efa440aec", size = 100171, upload-time = "2025-11-16T16:13:40.456Z" }, + { url = "https://files.pythonhosted.org/packages/06/c4/c124fbcef0684fcf3c9b72374c2a8c35c94464d8694c50f37eef27f5a145/ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl", hash = "sha256:45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6", size = 118845, upload-time = "2025-11-16T16:13:41.481Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bd/ab8459c8bb759c14a146990bf07f632c1cbec0910d4853feeee4be2ab8bb/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:753faf20b3a5906faf1fc50e4ddb8c074cb9b251e00b14c18b28492f933ac8ef", size = 147248, upload-time = "2025-11-16T16:13:42.872Z" }, + { url = "https://files.pythonhosted.org/packages/69/f2/c4cec0a30f1955510fde498aac451d2e52b24afdbcb00204d3a951b772c3/ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:480894aee0b29752560a9de46c0e5f84a82602f2bc5c6cde8db9a345319acfdf", size = 133764, upload-time = "2025-11-16T16:13:43.932Z" }, + { url = "https://files.pythonhosted.org/packages/82/c7/2480d062281385a2ea4f7cc9476712446e0c548cd74090bff92b4b49e898/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d3b58ab2454b4747442ac76fab66739c72b1e2bb9bd173d7694b9f9dbc9c000", size = 730537, upload-time = "2025-11-16T20:22:52.918Z" }, + { url = "https://files.pythonhosted.org/packages/75/08/e365ee305367559f57ba6179d836ecc3d31c7d3fdff2a40ebf6c32823a1f/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfd309b316228acecfa30670c3887dcedf9b7a44ea39e2101e75d2654522acd4", size = 746944, upload-time = "2025-11-16T16:13:45.338Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/8b56b08db91e569d0a4fbfa3e492ed2026081bdd7e892f63ba1c88a2f548/ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2812ff359ec1f30129b62372e5f22a52936fac13d5d21e70373dbca5d64bb97c", size = 778249, upload-time = "2025-11-16T16:13:46.871Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1d/70dbda370bd0e1a92942754c873bd28f513da6198127d1736fa98bb2a16f/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7e74ea87307303ba91073b63e67f2c667e93f05a8c63079ee5b7a5c8d0d7b043", size = 737140, upload-time = "2025-11-16T16:13:48.349Z" }, + { url = "https://files.pythonhosted.org/packages/5b/87/822d95874216922e1120afb9d3fafa795a18fdd0c444f5c4c382f6dac761/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:713cd68af9dfbe0bb588e144a61aad8dcc00ef92a82d2e87183ca662d242f524", size = 741070, upload-time = "2025-11-16T20:22:54.151Z" }, + { url = "https://files.pythonhosted.org/packages/b9/17/4e01a602693b572149f92c983c1f25bd608df02c3f5cf50fd1f94e124a59/ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:542d77b72786a35563f97069b9379ce762944e67055bea293480f7734b2c7e5e", size = 765882, upload-time = "2025-11-16T16:13:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/9f/17/7999399081d39ebb79e807314de6b611e1d1374458924eb2a489c01fc5ad/ruamel_yaml_clib-0.2.15-cp314-cp314-win32.whl", hash = "sha256:424ead8cef3939d690c4b5c85ef5b52155a231ff8b252961b6516ed7cf05f6aa", size = 102567, upload-time = "2025-11-16T16:13:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/67/be582a7370fdc9e6846c5be4888a530dcadd055eef5b932e0e85c33c7d73/ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467", size = 122847, upload-time = "2025-11-16T16:13:51.807Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] From 4abca168c3304df15fe141f433f5c8fd5f304896 Mon Sep 17 00:00:00 2001 From: Olaf Mersmann Date: Tue, 21 Apr 2026 13:33:22 +0200 Subject: [PATCH 02/20] chore: Clean up imports --- examples/demo.py | 2 +- pyproject.toml | 9 +++++++++ src/opltools/__init__.py | 16 +++++++++++++++- src/opltools/schema.py | 11 +++++++++++ uv.lock | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 2 deletions(-) diff --git a/examples/demo.py b/examples/demo.py index 7f56445..2743648 100644 --- a/examples/demo.py +++ b/examples/demo.py @@ -1,4 +1,4 @@ -from opltools import * +from opltools import Suite, Problem, Library, Link, Variables, ValueRange from pydantic_yaml import to_yaml_str from opltools.schema import Implementation diff --git a/pyproject.toml b/pyproject.toml index 6cbebfc..7bcd7ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,3 +19,12 @@ opl = "opltools.cli:main" [build-system] requires = ["uv_build>=0.11.7,<0.12.0"] build-backend = "uv_build" + +[dependency-groups] +dev = [ + "ruff>=0.15.11", +] + +[tool.ruff] +# In addition to the standard set of exclusions, omit all tests, plus a specific file. +extend-exclude = ["utils/*.py"] diff --git a/src/opltools/__init__.py b/src/opltools/__init__.py index 23e80ae..f1b4fe9 100644 --- a/src/opltools/__init__.py +++ b/src/opltools/__init__.py @@ -1 +1,15 @@ -from .schema import * +from .schema import Problem, Suite, Generator, Implementation, Library, YesNoSome, Link, Reference, Variables, ValueRange, Constraints + +__all__ = [ + "Problem", + "Suite", + "Generator", + "Implementation", + "Library", + "YesNoSome", + "Link", + "Reference", + "Constraints", + "Variables", + "ValueRange" +] diff --git a/src/opltools/schema.py b/src/opltools/schema.py index b64c3b6..3f9035d 100644 --- a/src/opltools/schema.py +++ b/src/opltools/schema.py @@ -147,3 +147,14 @@ def validate(self) -> Self: if self.root[problem_id].type != OPLType.problem: raise ValueError(f"Suite {id} references problem with id '{problem_id}' but id is a {self.root[problem_id].type.name}.") return self + +__all__ = [ + "Problem", + "Suite", + "Generator", + "Implementation", + "Library", + "YesNoSome", + "Link", + "Reference" +] diff --git a/uv.lock b/uv.lock index 337dd60..003f725 100644 --- a/uv.lock +++ b/uv.lock @@ -21,6 +21,11 @@ dependencies = [ { name = "pyyaml" }, ] +[package.dev-dependencies] +dev = [ + { name = "ruff" }, +] + [package.metadata] requires-dist = [ { name = "pydantic", specifier = ">=2.13.3" }, @@ -28,6 +33,9 @@ requires-dist = [ { name = "pyyaml", specifier = ">=6.0.3" }, ] +[package.metadata.requires-dev] +dev = [{ name = "ruff", specifier = ">=0.15.11" }] + [[package]] name = "pydantic" version = "2.13.3" @@ -228,6 +236,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/67/be582a7370fdc9e6846c5be4888a530dcadd055eef5b932e0e85c33c7d73/ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467", size = 122847, upload-time = "2025-11-16T16:13:51.807Z" }, ] +[[package]] +name = "ruff" +version = "0.15.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/8d/192f3d7103816158dfd5ea50d098ef2aec19194e6cbccd4b3485bdb2eb2d/ruff-0.15.11.tar.gz", hash = "sha256:f092b21708bf0e7437ce9ada249dfe688ff9a0954fc94abab05dcea7dcd29c33", size = 4637264, upload-time = "2026-04-16T18:46:26.58Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/1e/6aca3427f751295ab011828e15e9bf452200ac74484f1db4be0197b8170b/ruff-0.15.11-py3-none-linux_armv6l.whl", hash = "sha256:e927cfff503135c558eb581a0c9792264aae9507904eb27809cdcff2f2c847b7", size = 10607943, upload-time = "2026-04-16T18:46:05.967Z" }, + { url = "https://files.pythonhosted.org/packages/e7/26/1341c262e74f36d4e84f3d6f4df0ac68cd53331a66bfc5080daa17c84c0b/ruff-0.15.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7a1b5b2938d8f890b76084d4fa843604d787a912541eae85fd7e233398bbb73e", size = 10988592, upload-time = "2026-04-16T18:46:00.742Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/850b1d6ffa9564fbb6740429bad53df1094082fe515c8c1e74b6d8d05f18/ruff-0.15.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d4176f3d194afbdaee6e41b9ccb1a2c287dba8700047df474abfbe773825d1cb", size = 10338501, upload-time = "2026-04-16T18:46:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/f2/11/cc1284d3e298c45a817a6aadb6c3e1d70b45c9b36d8d9cce3387b495a03a/ruff-0.15.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b17c886fb88203ced3afe7f14e8d5ae96e9d2f4ccc0ee66aa19f2c2675a27e4", size = 10670693, upload-time = "2026-04-16T18:46:41.941Z" }, + { url = "https://files.pythonhosted.org/packages/ce/9e/f8288b034ab72b371513c13f9a41d9ba3effac54e24bfb467b007daee2ca/ruff-0.15.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:49fafa220220afe7758a487b048de4c8f9f767f37dfefad46b9dd06759d003eb", size = 10416177, upload-time = "2026-04-16T18:46:21.717Z" }, + { url = "https://files.pythonhosted.org/packages/85/71/504d79abfd3d92532ba6bbe3d1c19fada03e494332a59e37c7c2dabae427/ruff-0.15.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2ab8427e74a00d93b8bda1307b1e60970d40f304af38bccb218e056c220120d", size = 11221886, upload-time = "2026-04-16T18:46:15.086Z" }, + { url = "https://files.pythonhosted.org/packages/43/5a/947e6ab7a5ad603d65b474be15a4cbc6d29832db5d762cd142e4e3a74164/ruff-0.15.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:195072c0c8e1fc8f940652073df082e37a5d9cb43b4ab1e4d0566ab8977a13b7", size = 12075183, upload-time = "2026-04-16T18:46:07.944Z" }, + { url = "https://files.pythonhosted.org/packages/9f/a1/0b7bb6268775fdd3a0818aee8efd8f5b4e231d24dd4d528ced2534023182/ruff-0.15.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3a0996d486af3920dec930a2e7daed4847dfc12649b537a9335585ada163e9e", size = 11516575, upload-time = "2026-04-16T18:46:31.687Z" }, + { url = "https://files.pythonhosted.org/packages/30/c3/bb5168fc4d233cc06e95f482770d0f3c87945a0cd9f614b90ea8dc2f2833/ruff-0.15.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bef2cb556d509259f1fe440bb9cd33c756222cf0a7afe90d15edf0866702431", size = 11306537, upload-time = "2026-04-16T18:46:36.988Z" }, + { url = "https://files.pythonhosted.org/packages/e4/92/4cfae6441f3967317946f3b788136eecf093729b94d6561f963ed810c82e/ruff-0.15.11-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:030d921a836d7d4a12cf6e8d984a88b66094ccb0e0f17ddd55067c331191bf19", size = 11296813, upload-time = "2026-04-16T18:46:24.182Z" }, + { url = "https://files.pythonhosted.org/packages/43/26/972784c5dde8313acde8ac71ba8ac65475b85db4a2352a76c9934361f9bc/ruff-0.15.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0e783b599b4577788dbbb66b9addcef87e9a8832f4ce0c19e34bf55543a2f890", size = 10633136, upload-time = "2026-04-16T18:46:39.802Z" }, + { url = "https://files.pythonhosted.org/packages/5b/53/3985a4f185020c2f367f2e08a103032e12564829742a1b417980ce1514a0/ruff-0.15.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ae90592246625ba4a34349d68ec28d4400d75182b71baa196ddb9f82db025ef5", size = 10424701, upload-time = "2026-04-16T18:46:10.381Z" }, + { url = "https://files.pythonhosted.org/packages/d3/57/bf0dfb32241b56c83bb663a826133da4bf17f682ba8c096973065f6e6a68/ruff-0.15.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1f111d62e3c983ed20e0ca2e800f8d77433a5b1161947df99a5c2a3fb60514f0", size = 10873887, upload-time = "2026-04-16T18:46:29.157Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/e48076b2a57dc33ee8c7a957296f97c744ca891a8ffb4ffb1aaa3b3f517d/ruff-0.15.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:06f483d6646f59eaffba9ae30956370d3a886625f511a3108994000480621d1c", size = 11404316, upload-time = "2026-04-16T18:46:19.462Z" }, + { url = "https://files.pythonhosted.org/packages/88/27/0195d15fe7a897cbcba0904792c4b7c9fdd958456c3a17d2ea6093716a9a/ruff-0.15.11-py3-none-win32.whl", hash = "sha256:476a2aa56b7da0b73a3ee80b6b2f0e19cce544245479adde7baa65466664d5f3", size = 10655535, upload-time = "2026-04-16T18:46:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5e/c927b325bd4c1d3620211a4b96f47864633199feed60fa936025ab27e090/ruff-0.15.11-py3-none-win_amd64.whl", hash = "sha256:8b6756d88d7e234fb0c98c91511aae3cd519d5e3ed271cae31b20f39cb2a12a3", size = 11779692, upload-time = "2026-04-16T18:46:17.268Z" }, + { url = "https://files.pythonhosted.org/packages/63/b6/aeadee5443e49baa2facd51131159fd6301cc4ccfc1541e4df7b021c37dd/ruff-0.15.11-py3-none-win_arm64.whl", hash = "sha256:063fed18cc1bbe0ee7393957284a6fe8b588c6a406a285af3ee3f46da2391ee4", size = 11032614, upload-time = "2026-04-16T18:46:34.487Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" From 5f3c3856bd01c8b9a7b0644383e4819586199bbb Mon Sep 17 00:00:00 2001 From: Olaf Mersmann Date: Tue, 21 Apr 2026 13:49:10 +0200 Subject: [PATCH 03/20] feat: Add minimal unit tests for opltools Add a minimal (AI generated) set of unit tests for opltools. Run the tests on push and for pull requests. --- .github/workflows/check_python_package.yaml | 33 ++++ pyproject.toml | 4 +- src/opltools/schema.py | 6 +- tests/__init__.py | 0 tests/test_constraints.py | 17 ++ tests/test_generator.py | 7 + tests/test_implementation.py | 31 ++++ tests/test_library.py | 52 ++++++ tests/test_link.py | 19 +++ tests/test_objectives.py | 31 ++++ tests/test_opltype.py | 15 ++ tests/test_problem.py | 28 ++++ tests/test_problemlike.py | 26 +++ tests/test_reference.py | 24 +++ tests/test_suite.py | 12 ++ tests/test_thing.py | 16 ++ tests/test_usage.py | 15 ++ tests/test_valuerange.py | 25 +++ tests/test_variables.py | 28 ++++ tests/test_yesnosome.py | 15 ++ uv.lock | 167 +++++++++++++++++++- 21 files changed, 567 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/check_python_package.yaml create mode 100644 tests/__init__.py create mode 100644 tests/test_constraints.py create mode 100644 tests/test_generator.py create mode 100644 tests/test_implementation.py create mode 100644 tests/test_library.py create mode 100644 tests/test_link.py create mode 100644 tests/test_objectives.py create mode 100644 tests/test_opltype.py create mode 100644 tests/test_problem.py create mode 100644 tests/test_problemlike.py create mode 100644 tests/test_reference.py create mode 100644 tests/test_suite.py create mode 100644 tests/test_thing.py create mode 100644 tests/test_usage.py create mode 100644 tests/test_valuerange.py create mode 100644 tests/test_variables.py create mode 100644 tests/test_yesnosome.py diff --git a/.github/workflows/check_python_package.yaml b/.github/workflows/check_python_package.yaml new file mode 100644 index 0000000..5bd82ab --- /dev/null +++ b/.github/workflows/check_python_package.yaml @@ -0,0 +1,33 @@ +name: Check + +on: + push: + pull_request: + branches: ["main"] + +jobs: + test: + strategy: + fail-fast: false + matrix: + runs-on: [ubuntu-latest, macos-latest, windows-latest] + python-version: ["3.10", "3.11", "3.12", "3.13"] + runs-on: ${{matrix.runs-on}} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Install uv + uses: astral-sh/setup-uv@v7 + with: + python-version: ${{ matrix.python-version }} + + - name: Install the project + run: uv sync --all-extras --dev + + - name: Lint with ruff + run: uv run ruff check --output-format=github . + + - name: Run tests + run: uv run pytest --cov=opltools --cov-report=term-missing diff --git a/pyproject.toml b/pyproject.toml index 7bcd7ed..1be5cae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ readme = "README.md" authors = [ { name = "Olaf Mersmann", email = "olafm@p-value.net" } ] -requires-python = ">=3.12" +requires-python = ">=3.10" dependencies = [ "pydantic>=2.13.3", "pydantic-yaml>=1.6.0", @@ -22,6 +22,8 @@ build-backend = "uv_build" [dependency-groups] dev = [ + "pytest>=9.0.3", + "pytest-cov>=7.1.0", "ruff>=0.15.11", ] diff --git a/src/opltools/schema.py b/src/opltools/schema.py index 3f9035d..d2ae81f 100644 --- a/src/opltools/schema.py +++ b/src/opltools/schema.py @@ -123,7 +123,8 @@ class Library(RootModel): root: dict[str, Problem | Generator | Suite | Implementation] | None def _check_id_references(self, ids, type:OPLType) -> None: - if not self.root: return + if not self.root: + return for id in ids: if id in self.root: if self.root[id].type != type: @@ -136,7 +137,8 @@ def _fixup_fidelity(self, suite: Suite) -> Suite: @model_validator(mode="after") def validate(self) -> Self: - if not self.root: return self + if not self.root: + return self # Make sure all problems referenced in suites exists for id, thing in self.root.items(): diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_constraints.py b/tests/test_constraints.py new file mode 100644 index 0000000..419902f --- /dev/null +++ b/tests/test_constraints.py @@ -0,0 +1,17 @@ +from opltools.schema import Constraints + + +class TestConstraints: + def test_defaults(self): + c = Constraints() + assert c.box == 0 + assert c.linear == 0 + assert c.function == 0 + + def test_union(self): + a = Constraints(box=1, linear=2, function=3) + b = Constraints(box=4, linear=5, function=6) + a.union(b) + assert a.box == {1, 4} + assert a.linear == {2, 5} + assert a.function == {3, 6} diff --git a/tests/test_generator.py b/tests/test_generator.py new file mode 100644 index 0000000..9d32ea0 --- /dev/null +++ b/tests/test_generator.py @@ -0,0 +1,7 @@ +from opltools.schema import Generator, OPLType + + +class TestGenerator: + def test_defaults(self): + g = Generator(name="G1") + assert g.type is OPLType.generator diff --git a/tests/test_implementation.py b/tests/test_implementation.py new file mode 100644 index 0000000..b579fba --- /dev/null +++ b/tests/test_implementation.py @@ -0,0 +1,31 @@ +from opltools.schema import Implementation, Link, OPLType + + +class TestImplementation: + def test_defaults(self): + impl = Implementation(name="impl1", description="An implementation") + assert impl.type is OPLType.implementation + assert impl.name == "impl1" + assert impl.description == "An implementation" + assert impl.links is None + assert impl.language is None + assert impl.requirements is None + + def test_full(self): + impl = Implementation( + name="impl1", + description="desc", + links=[Link(url="https://example.org")], + language="python", + evaluation_time="fast", + requirements=["numpy", "scipy"], + ) + assert impl.language == "python" + assert impl.requirements == ["numpy", "scipy"] + assert len(impl.links) == 1 + + def test_requirements_as_string(self): + impl = Implementation( + name="impl1", description="d", requirements="numpy" + ) + assert impl.requirements == "numpy" diff --git a/tests/test_library.py b/tests/test_library.py new file mode 100644 index 0000000..f1df4b4 --- /dev/null +++ b/tests/test_library.py @@ -0,0 +1,52 @@ +import pytest +from pydantic import ValidationError + +from opltools.schema import ( + Generator, + Implementation, + Library, + Problem, + Suite, +) + + +class TestLibrary: + def test_empty(self): + lib = Library(root=None) + assert lib.root is None + + def test_single_problem(self): + lib = Library(root={"p1": Problem(name="P1")}) + assert "p1" in lib.root + assert isinstance(lib.root["p1"], Problem) + + def test_multiple_things(self): + lib = Library(root={ + "p1": Problem(name="P1"), + "p2": Problem(name="P2"), + "g1": Generator(name="G1"), + "s1": Suite(name="S1", problems={"p1", "p2"}), + "impl1": Implementation(name="impl1", description="d"), + }) + assert len(lib.root) == 5 + assert isinstance(lib.root["p1"], Problem) + assert isinstance(lib.root["g1"], Generator) + assert isinstance(lib.root["s1"], Suite) + assert isinstance(lib.root["impl1"], Implementation) + + def test_suite_references_missing_problem(self): + with pytest.raises(ValidationError, match="undefined id"): + Library(root={ + "s1": Suite(name="S1", problems={"does-not-exist"}), + }) + + def test_suite_references_non_problem(self): + with pytest.raises(ValidationError, match="but id is a"): + Library(root={ + "g1": Generator(name="G1"), + "s1": Suite(name="S1", problems={"g1"}), + }) + + def test_suite_with_no_problems_is_valid(self): + lib = Library(root={"s1": Suite(name="S1")}) + assert lib.root["s1"].problems is None diff --git a/tests/test_link.py b/tests/test_link.py new file mode 100644 index 0000000..6f8a31c --- /dev/null +++ b/tests/test_link.py @@ -0,0 +1,19 @@ +import pytest +from pydantic import ValidationError + +from opltools.schema import Link + + +class TestLink: + def test_minimal(self): + link = Link(url="https://example.org") + assert link.url == "https://example.org" + assert link.type is None + + def test_with_type(self): + link = Link(type="homepage", url="https://example.org") + assert link.type == "homepage" + + def test_url_required(self): + with pytest.raises(ValidationError): + Link() diff --git a/tests/test_objectives.py b/tests/test_objectives.py new file mode 100644 index 0000000..944404d --- /dev/null +++ b/tests/test_objectives.py @@ -0,0 +1,31 @@ +from opltools.schema import Objectives +from opltools.utils import ValueRange + + +class TestObjectives: + def test_default(self): + obj = Objectives() + assert obj.root == 0 + + def test_int(self): + assert Objectives(root=3).root == 3 + + def test_set(self): + assert Objectives(root={1, 2, 3}).root == {1, 2, 3} + + def test_range(self): + obj = Objectives(root=ValueRange(min=1, max=5)) + assert obj.root.min == 1 + assert obj.root.max == 5 + + def test_union_ints(self): + a = Objectives(root=1) + b = Objectives(root=2) + a.union(b) + assert a.root == {1, 2} + + def test_union_same_int(self): + a = Objectives(root=1) + b = Objectives(root=1) + a.union(b) + assert a.root == 1 diff --git a/tests/test_opltype.py b/tests/test_opltype.py new file mode 100644 index 0000000..db42057 --- /dev/null +++ b/tests/test_opltype.py @@ -0,0 +1,15 @@ +import pytest + +from opltools.schema import OPLType + + +class TestOPLType: + def test_from_string(self): + assert OPLType("problem") is OPLType.problem + assert OPLType("implementation") is OPLType.implementation + assert OPLType("suite") is OPLType.suite + assert OPLType("generator") is OPLType.generator + + def test_bad_string(self): + with pytest.raises(ValueError): + OPLType("foo") diff --git a/tests/test_problem.py b/tests/test_problem.py new file mode 100644 index 0000000..2fb9ab2 --- /dev/null +++ b/tests/test_problem.py @@ -0,0 +1,28 @@ +from opltools.schema import Constraints, OPLType, Problem, Variables +from opltools.utils import ValueRange + + +class TestProblem: + def test_defaults(self): + p = Problem(name="P1") + assert p.type is OPLType.problem + assert p.name == "P1" + assert p.instances is None + + def test_with_variables_and_constraints(self): + p = Problem( + name="P1", + variables=Variables(continuous=3), + constraints=Constraints(linear=2), + ) + assert p.variables.continuous == 3 + assert p.constraints.linear == 2 + + def test_instances_list(self): + p = Problem(name="P1", instances=["i1", "i2"]) + assert p.instances == ["i1", "i2"] + + def test_instances_range(self): + p = Problem(name="P1", instances=ValueRange(min=1, max=10)) + assert p.instances.min == 1 + assert p.instances.max == 10 diff --git a/tests/test_problemlike.py b/tests/test_problemlike.py new file mode 100644 index 0000000..9e6a4a6 --- /dev/null +++ b/tests/test_problemlike.py @@ -0,0 +1,26 @@ +import pytest +from pydantic import ValidationError + +from opltools.schema import Problem, ProblemLike, YesNoSome + + +class TestProblemLike: + def test_shared_fields(self): + p = Problem( + name="P1", + long_name="Problem 1", + description="desc", + tags={"convex", "smooth"}, + allows_partial_evaluation=YesNoSome.yes, + can_evaluate_objectives_independently=YesNoSome.no, + modality={"unimodal"}, + fidelity_levels={1, 2, 3}, + ) + assert p.long_name == "Problem 1" + assert p.tags == {"convex", "smooth"} + assert p.allows_partial_evaluation is YesNoSome.yes + assert p.fidelity_levels == {1, 2, 3} + + def test_problemlike_not_directly_useful_without_type(self): + with pytest.raises(ValidationError): + ProblemLike(name="X") diff --git a/tests/test_reference.py b/tests/test_reference.py new file mode 100644 index 0000000..ef6cbd5 --- /dev/null +++ b/tests/test_reference.py @@ -0,0 +1,24 @@ +import pytest +from pydantic import ValidationError + +from opltools.schema import Link, Reference + + +class TestReference: + def test_minimal(self): + ref = Reference(title="A paper", authors=["Alice", "Bob"]) + assert ref.title == "A paper" + assert ref.authors == ["Alice", "Bob"] + assert ref.link is None + + def test_with_link(self): + ref = Reference( + title="A paper", + authors=["Alice"], + link=Link(url="https://example.org"), + ) + assert ref.link.url == "https://example.org" + + def test_requires_authors(self): + with pytest.raises(ValidationError): + Reference(title="A paper") diff --git a/tests/test_suite.py b/tests/test_suite.py new file mode 100644 index 0000000..ab686db --- /dev/null +++ b/tests/test_suite.py @@ -0,0 +1,12 @@ +from opltools.schema import OPLType, Suite + + +class TestSuite: + def test_defaults(self): + s = Suite(name="S1") + assert s.type is OPLType.suite + assert s.problems is None + + def test_with_problems(self): + s = Suite(name="S1", problems={"p1", "p2"}) + assert s.problems == {"p1", "p2"} diff --git a/tests/test_thing.py b/tests/test_thing.py new file mode 100644 index 0000000..e92f795 --- /dev/null +++ b/tests/test_thing.py @@ -0,0 +1,16 @@ +import pytest +from pydantic import ValidationError + +from opltools.schema import OPLType, Thing + + +class TestThing: + def test_type_required(self): + with pytest.raises(ValidationError): + Thing() + + def test_allows_extra_fields(self): + thing = Thing(type=OPLType.problem, something_extra="value", count=3) + assert thing.type is OPLType.problem + assert thing.something_extra == "value" + assert thing.count == 3 diff --git a/tests/test_usage.py b/tests/test_usage.py new file mode 100644 index 0000000..2073f93 --- /dev/null +++ b/tests/test_usage.py @@ -0,0 +1,15 @@ +import pytest +from pydantic import ValidationError + +from opltools.schema import Usage + + +class TestUsage: + def test_basic(self): + u = Usage(language="python", code="print('hi')") + assert u.language == "python" + assert u.code == "print('hi')" + + def test_requires_fields(self): + with pytest.raises(ValidationError): + Usage(language="python") diff --git a/tests/test_valuerange.py b/tests/test_valuerange.py new file mode 100644 index 0000000..19729b6 --- /dev/null +++ b/tests/test_valuerange.py @@ -0,0 +1,25 @@ +import pytest +from pydantic import ValidationError + +from opltools.utils import ValueRange + + +class TestValueRange: + def test_valid(self): + r = ValueRange(min=1, max=10) + assert r.min == 1 + assert r.max == 10 + + def test_min_only(self): + r = ValueRange(min=1, max=None) + assert r.min == 1 + assert r.max is None + + def test_max_only(self): + r = ValueRange(min=None, max=10) + assert r.min is None + assert r.max == 10 + + def test_both_none_rejected(self): + with pytest.raises(ValidationError, match="at least a min or max"): + ValueRange(min=None, max=None) diff --git a/tests/test_variables.py b/tests/test_variables.py new file mode 100644 index 0000000..f5c35d6 --- /dev/null +++ b/tests/test_variables.py @@ -0,0 +1,28 @@ +from opltools.schema import Variables +from opltools.utils import ValueRange + + +class TestVariables: + def test_defaults(self): + v = Variables() + assert v.continuous == 0 + assert v.integer == 0 + assert v.binary == 0 + assert v.categorical == 0 + + def test_explicit_values(self): + v = Variables(continuous=5, integer=2, binary=1, categorical=3) + assert v.continuous == 5 + assert v.integer == 2 + + def test_range_values(self): + v = Variables(continuous=ValueRange(min=1, max=10)) + assert v.continuous.min == 1 + assert v.continuous.max == 10 + + def test_union(self): + a = Variables(continuous=1, integer=2) + b = Variables(continuous=3, integer=4) + a.union(b) + assert a.continuous == {1, 3} + assert a.integer == {2, 4} diff --git a/tests/test_yesnosome.py b/tests/test_yesnosome.py new file mode 100644 index 0000000..d996329 --- /dev/null +++ b/tests/test_yesnosome.py @@ -0,0 +1,15 @@ +import pytest + +from opltools.schema import YesNoSome + + +class TestYesNoSome: + def test_from_string(self): + assert YesNoSome("yes") == YesNoSome.yes + assert YesNoSome("no") == YesNoSome.no + assert YesNoSome("some") == YesNoSome.some + assert YesNoSome("?") == YesNoSome.unknown + + def test_bad_string(self): + with pytest.raises(ValueError): + YesNoSome("foo") diff --git a/uv.lock b/uv.lock index 003f725..1c38533 100644 --- a/uv.lock +++ b/uv.lock @@ -11,6 +11,108 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.13.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, + { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, + { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, + { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, + { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, + { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, + { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, + { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, + { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, + { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, + { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, + { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, + { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, + { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, + { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, + { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, + { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, + { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, + { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, + { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, + { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, + { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, + { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, + { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, + { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, + { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, + { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, + { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, + { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, + { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, + { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, + { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, + { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "opltools" version = "0.1.0" @@ -23,6 +125,8 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "pytest" }, + { name = "pytest-cov" }, { name = "ruff" }, ] @@ -34,7 +138,29 @@ requires-dist = [ ] [package.metadata.requires-dev] -dev = [{ name = "ruff", specifier = ">=0.15.11" }] +dev = [ + { name = "pytest", specifier = ">=9.0.3" }, + { name = "pytest-cov", specifier = ">=7.1.0" }, + { name = "ruff", specifier = ">=0.15.11" }, +] + +[[package]] +name = "packaging" +version = "26.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/de/0d2b39fb4af88a0258f3bac87dfcbb48e73fbdea4a2ed0e2213f9a4c2f9a/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de", size = 215519, upload-time = "2026-04-14T21:12:49.362Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", size = 95831, upload-time = "2026-04-14T21:12:47.56Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] [[package]] name = "pydantic" @@ -140,6 +266,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ba/39/8d263fbcb409a8f5dd78ac8f89f1e6af1d4e4d9fbb7f856ca3245b354809/pydantic_yaml-1.6.0-py3-none-any.whl", hash = "sha256:02cb800b455b68daeeb74ad736c252a94a0b203da5fbbeef02539d468e1d98f8", size = 22511, upload-time = "2025-08-08T21:01:11.425Z" }, ] +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + [[package]] name = "pyyaml" version = "6.0.3" From 0c653062364ae712d10284df0b423944680dffc6 Mon Sep 17 00:00:00 2001 From: Olaf Mersmann Date: Tue, 21 Apr 2026 18:59:46 +0200 Subject: [PATCH 04/20] feat: Rework variable and constraint format Variables and constraints are now lists (technically sets) with a description of each type. This is more flexible than the previous approach and allows iterative refinement. --- examples/demo.py | 12 +-- pyproject.toml | 5 ++ src/opltools/__init__.py | 20 ++++- src/opltools/cli.py | 8 +- src/opltools/schema.py | 150 +++++++++++++++++++++++++------------- src/opltools/utils.py | 16 ++-- src/opltools/yesnosome.py | 28 +++++++ tests/test_constraints.py | 28 +++---- tests/test_library.py | 34 ++++++++- tests/test_problem.py | 12 +-- tests/test_union_range.py | 61 ++++++++++++++++ tests/test_variables.py | 35 ++++----- tests/test_yesnosome.py | 24 ++++++ 13 files changed, 320 insertions(+), 113 deletions(-) create mode 100644 src/opltools/yesnosome.py create mode 100644 tests/test_union_range.py diff --git a/examples/demo.py b/examples/demo.py index 2743648..0b866c2 100644 --- a/examples/demo.py +++ b/examples/demo.py @@ -1,4 +1,4 @@ -from opltools import Suite, Problem, Library, Link, Variables, ValueRange +from opltools import Suite, Problem, Library, Link, Variable, ValueRange from pydantic_yaml import to_yaml_str from opltools.schema import Implementation @@ -10,9 +10,9 @@ language="python", links=[ Link(type="repository", url="https://github.com/numbbo/coco-experiment"), - Link(type="package", url="https://pypi.org/project/coco-experiment/") + Link(type="package", url="https://pypi.org/project/coco-experiment/"), ], - evaluation_time="sub second" + evaluation_time="sub second", ) for fnr in range(1, 25): @@ -20,14 +20,14 @@ things[f"fn_bbob_f{fnr}"] = Problem( name=f"BBOB F_{fnr}", objectives={1}, - variables=Variables(continuous=ValueRange(min=1, max=80)), - implementations=["impl_py_cocoex"] + variables={Variable(type="continuous", dim=ValueRange(min=1, max=80))}, + implementations=["impl_py_cocoex"], ) things["suite_bbob"] = Suite( name="BBOB", problems={f"fn_bbob_f{fnr}" for fnr in range(1, 25)}, - implementations=["impl_py_cocoex"] + implementations=["impl_py_cocoex"], ) library = Library(things) diff --git a/pyproject.toml b/pyproject.toml index 1be5cae..9be5ec9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,11 @@ dependencies = [ [project.scripts] opl = "opltools.cli:main" +[project.optional-dependencies] +cli = [ + "rich>=15.0.0", +] + [build-system] requires = ["uv_build>=0.11.7,<0.12.0"] build-backend = "uv_build" diff --git a/src/opltools/__init__.py b/src/opltools/__init__.py index f1b4fe9..b959bf9 100644 --- a/src/opltools/__init__.py +++ b/src/opltools/__init__.py @@ -1,4 +1,16 @@ -from .schema import Problem, Suite, Generator, Implementation, Library, YesNoSome, Link, Reference, Variables, ValueRange, Constraints +from .schema import ( + Problem, + Suite, + Generator, + Implementation, + Library, + YesNoSome, + Link, + Reference, + Variable, + ValueRange, + Constraint, +) __all__ = [ "Problem", @@ -9,7 +21,7 @@ "YesNoSome", "Link", "Reference", - "Constraints", - "Variables", - "ValueRange" + "Constraint", + "Variable", + "ValueRange", ] diff --git a/src/opltools/cli.py b/src/opltools/cli.py index 2f6191d..4a35d92 100644 --- a/src/opltools/cli.py +++ b/src/opltools/cli.py @@ -20,7 +20,9 @@ def cmd_validate(args): return 0 except ValidationError as e: for error in e.errors(): - loc = " -> ".join(str(p) for p in error["loc"]) if error["loc"] else "(root)" + loc = ( + " -> ".join(str(p) for p in error["loc"]) if error["loc"] else "(root)" + ) print(f"{args.file}: {loc}: {error['msg']}") return 1 @@ -29,7 +31,9 @@ def main(): parser = argparse.ArgumentParser(prog="opl", description="OPL tools") subparsers = parser.add_subparsers(dest="command", required=True) - validate_parser = subparsers.add_parser("validate", help="Validate a YAML file against the Library schema") + validate_parser = subparsers.add_parser( + "validate", help="Validate a YAML file against the Library schema" + ) validate_parser.add_argument("file", help="YAML file to validate") args = parser.parse_args() diff --git a/src/opltools/schema.py b/src/opltools/schema.py index d2ae81f..19a1d36 100644 --- a/src/opltools/schema.py +++ b/src/opltools/schema.py @@ -2,6 +2,7 @@ from typing_extensions import Self from pydantic import BaseModel, RootModel, ConfigDict, model_validator +from .yesnosome import YesNoSome from .utils import ValueRange, union_range @@ -9,24 +10,20 @@ class OPLType(Enum): problem = "problem" suite = "suite" generator = "generator" - implementation = 'implementation' - - -class YesNoSome(Enum): - yes = "yes" - no = "no" - some = "some" - unknown = "?" + implementation = "implementation" class Link(BaseModel): type: str | None = None url: str + def __hash__(self): + return hash(self.type) + hash(self.url) + class Thing(BaseModel): type: OPLType - model_config = ConfigDict(extra='allow') + model_config = ConfigDict(extra="allow") class Objectives(RootModel): @@ -37,30 +34,42 @@ def union(self, other: Self) -> Self: return self -class Variables(BaseModel): - continuous: int | set[int] | ValueRange = 0 - integer: int | set[int] | ValueRange = 0 - binary: int | set[int] | ValueRange = 0 - categorical: int | set[int] | ValueRange = 0 +class VariableType(Enum): + continuous = "continuous" + integer = "integer" + binary = "binary" + categorical = "categorical" + unknown = "unknown" - def union(self, other: Self) -> Self: - self.continuous = union_range(self.continuous, other.continuous) - self.integer = union_range(self.integer, other.integer) - self.binary = union_range(self.integer, other.binary) - self.categorical = union_range(self.integer, other.categorical) - return self +class Variable(BaseModel): + type: VariableType = VariableType.unknown + dim: int | set[int] | ValueRange | None = 0 -class Constraints(BaseModel): - box: int | set[int] | ValueRange = 0 - linear: int | set[int] | ValueRange = 0 - function: int | set[int] | ValueRange = 0 + def __hash__(self): + if isinstance(self.dim, set): + dim_hash = hash(frozenset(self.dim)) + else: + dim_hash = hash(self.dim) + return hash(self.type) + dim_hash - def union(self, other: Variables) -> Self: - self.box = union_range(self.box, other.box) - self.linear = union_range(self.linear, other.linear) - self.function = union_range(self.function, other.function) - return self + +class ConstraintType(Enum): + box = "box" + linear = "linear" + function = "function" + unknown = "unknown" + + +class Constraint(BaseModel): + type: ConstraintType = ConstraintType.unknown + hard: YesNoSome | None = None + equality: YesNoSome | None = None + number: int | set[int] | ValueRange | None = None + + def __hash__(self): + number = frozenset(self.number) if isinstance(self.number, set) else self.number + return hash((self.type, self.hard, self.equality, number)) class Reference(BaseModel): @@ -68,6 +77,13 @@ class Reference(BaseModel): authors: list[str] link: Link | None = None + def __hash__(self): + return ( + hash(self.title) + + sum([hash(author) for author in self.authors]) + + hash(self.link) + ) + class Usage(BaseModel): language: str @@ -75,7 +91,7 @@ class Usage(BaseModel): class Implementation(Thing): - type: OPLType= OPLType.implementation + type: OPLType = OPLType.implementation name: str description: str links: list[Link] | None = None @@ -92,9 +108,8 @@ class ProblemLike(Thing): references: set[Reference] | None = None implementations: set[str] | None = None objectives: set[int] | None = None - variables: Variables | None = None - constraints: Constraints | None = None - soft_constraints: Constraints | None = None + variables: set[Variable] | None = None + constraints: set[Constraint] | None = None dynamic_type: set[str] | None = None noise_type: set[str] | None = None allows_partial_evaluation: YesNoSome | None = None @@ -104,59 +119,90 @@ class ProblemLike(Thing): code_examples: set[str] | None = None source: set[str] | None = None + def __hash__(self): + return hash((self.type, self.name)) + class Problem(ProblemLike): - type:OPLType = OPLType.problem + type: OPLType = OPLType.problem instances: ValueRange | list[str] | None = None class Suite(ProblemLike): - type:OPLType = OPLType.suite + type: OPLType = OPLType.suite problems: set[str] | None = None class Generator(ProblemLike): - type:OPLType = OPLType.generator + type: OPLType = OPLType.generator class Library(RootModel): - root: dict[str, Problem | Generator | Suite | Implementation] | None + root: dict[str, Problem | Generator | Suite | Implementation] = {} - def _check_id_references(self, ids, type:OPLType) -> None: - if not self.root: - return + def _check_id_references(self, ids, type: OPLType) -> None: for id in ids: if id in self.root: if self.root[id].type != type: - raise ValueError(f"ID {id} is a {self.root[id].name}, expected a {type.name}") + raise ValueError( + f"ID {id} is a {self.root[id].name}, expected a {type.name}" + ) else: raise ValueError(f"Missing {type.name} with id '{id}'") - def _fixup_fidelity(self, suite: Suite) -> Suite: + # For a given suite, make sure the fidelty_levels property contains + # the fidelity_levels of all problems in the suite. + def _fixup_suite_fidelity(self, suite: Suite): + if suite.problems: + if not suite.fidelity_levels: + suite.fidelity_levels = set() + for pid in suite.problems: + problem = self.root[pid] + assert isinstance(problem, Problem) + if problem.fidelity_levels: + suite.fidelity_levels.update(problem.fidelity_levels) + return suite - @model_validator(mode="after") - def validate(self) -> Self: - if not self.root: - return self + def _fixup_suite_variables(self, suite: Suite): + if not suite.problems: + return + if suite.variables is None: + suite.variables = set() + for pid in suite.problems: + problem = self.root[pid] + assert isinstance(problem, Problem) + if problem.variables is not None: + suite.variables.update(problem.variables) + + @model_validator(mode="after") + def _validate(self) -> Self: # Make sure all problems referenced in suites exists for id, thing in self.root.items(): if isinstance(thing, Suite) and thing.problems: for problem_id in thing.problems: if problem_id not in self.root: - raise ValueError(f"Suite {id} references problem with undefined id '{problem_id}'.") + raise ValueError( + f"Suite {id} references problem with undefined id '{problem_id}'." + ) if self.root[problem_id].type != OPLType.problem: - raise ValueError(f"Suite {id} references problem with id '{problem_id}' but id is a {self.root[problem_id].type.name}.") + raise ValueError( + f"Suite {id} references problem with id '{problem_id}' but id is a {self.root[problem_id].type.name}." + ) + self._fixup_suite_fidelity(thing) return self + __all__ = [ - "Problem", - "Suite", + "Constraint", "Generator", "Implementation", "Library", - "YesNoSome", "Link", - "Reference" + "Problem", + "Reference", + "Suite", + "Variable", + "YesNoSome", ] diff --git a/src/opltools/utils.py b/src/opltools/utils.py index 5217053..a05a9b7 100644 --- a/src/opltools/utils.py +++ b/src/opltools/utils.py @@ -4,14 +4,17 @@ class ValueRange(BaseModel): min: int | None - max: int | None + max: int | None = None @model_validator(mode="after") def _check(self) -> Self: - if not self.min and not self.max: + if self.min is None and self.max is None: raise ValueError("Variable range should have at least a min or max value.") return self + def __hash__(self): + return hash((self.min, self.max)) + def _none_min(a, b): if a and b: @@ -32,13 +35,12 @@ def _none_max(a, b): def union_range( - a: int | set[int] | ValueRange, - b: int | set[int] | ValueRange + a: int | set[int] | ValueRange, b: int | set[int] | ValueRange ) -> int | set[int] | ValueRange: if isinstance(a, int): - a = { a } + a = {a} if isinstance(b, int): - b = { b } + b = {b} if isinstance(a, set) and isinstance(b, set): res = a.union(b) @@ -55,7 +57,7 @@ def union_range( res.min = min(v, res.min) if res.max: for v in b: - res.max = max(v, res.max)# + res.max = max(v, res.max) # return res raise Exception("BAM") diff --git a/src/opltools/yesnosome.py b/src/opltools/yesnosome.py new file mode 100644 index 0000000..e10b24a --- /dev/null +++ b/src/opltools/yesnosome.py @@ -0,0 +1,28 @@ +from enum import Enum + + +class YesNoSome(Enum): + yes = "yes" + no = "no" + some = "some" + unknown = "?" + + +def union( + a: YesNoSome | set[YesNoSome], b: YesNoSome | set[YesNoSome] +) -> YesNoSome | set[YesNoSome]: + result = set() + if isinstance(a, YesNoSome): + result.add(a) + else: + result.update(a) + + if isinstance(b, YesNoSome): + result.add(b) + else: + result.update(b) + + if len(result) == 1: + return result.pop() + else: + return result diff --git a/tests/test_constraints.py b/tests/test_constraints.py index 419902f..782677e 100644 --- a/tests/test_constraints.py +++ b/tests/test_constraints.py @@ -1,17 +1,17 @@ -from opltools.schema import Constraints +from opltools.schema import Constraint, YesNoSome -class TestConstraints: - def test_defaults(self): - c = Constraints() - assert c.box == 0 - assert c.linear == 0 - assert c.function == 0 +class TestConstraint: + def test_default(self): + c = Constraint(type="box") + assert c.hard is None + assert c.equality is None + assert c.number is None - def test_union(self): - a = Constraints(box=1, linear=2, function=3) - b = Constraints(box=4, linear=5, function=6) - a.union(b) - assert a.box == {1, 4} - assert a.linear == {2, 5} - assert a.function == {3, 6} + def test_hard(self): + c = Constraint(type="box", hard="yes") + assert c.hard == YesNoSome.yes + + def test_number(self): + c = Constraint(type="linear", number=5) + assert c.number == 5 diff --git a/tests/test_library.py b/tests/test_library.py index f1df4b4..b7dc328 100644 --- a/tests/test_library.py +++ b/tests/test_library.py @@ -12,8 +12,8 @@ class TestLibrary: def test_empty(self): - lib = Library(root=None) - assert lib.root is None + lib = Library(root={}) + assert lib.root == {} def test_single_problem(self): lib = Library(root={"p1": Problem(name="P1")}) @@ -50,3 +50,33 @@ def test_suite_references_non_problem(self): def test_suite_with_no_problems_is_valid(self): lib = Library(root={"s1": Suite(name="S1")}) assert lib.root["s1"].problems is None + + def test_fixup_fidelity_populates_from_problems(self): + lib = Library(root={ + "p1": Problem(name="P1", fidelity_levels={1, 2}), + "p2": Problem(name="P2", fidelity_levels={2, 3}), + "s1": Suite(name="S1", problems={"p1", "p2"}), + }) + assert lib.root["s1"].fidelity_levels == {1, 2, 3} + + def test_fixup_fidelity_extends_existing(self): + lib = Library(root={ + "p1": Problem(name="P1", fidelity_levels={5}), + "s1": Suite(name="S1", problems={"p1"}, fidelity_levels={10}), + }) + assert lib.root["s1"].fidelity_levels == {5, 10} + + def test_fixup_fidelity_with_problems_without_levels(self): + lib = Library(root={ + "p1": Problem(name="P1"), + "p2": Problem(name="P2", fidelity_levels={7}), + "s1": Suite(name="S1", problems={"p1", "p2"}), + }) + assert lib.root["s1"].fidelity_levels == {7} + + def test_fixup_fidelity_all_problems_without_levels(self): + lib = Library(root={ + "p1": Problem(name="P1"), + "s1": Suite(name="S1", problems={"p1"}), + }) + assert lib.root["s1"].fidelity_levels == set() diff --git a/tests/test_problem.py b/tests/test_problem.py index 2fb9ab2..f3a9498 100644 --- a/tests/test_problem.py +++ b/tests/test_problem.py @@ -1,4 +1,4 @@ -from opltools.schema import Constraints, OPLType, Problem, Variables +from opltools.schema import OPLType, Problem from opltools.utils import ValueRange @@ -9,14 +9,14 @@ def test_defaults(self): assert p.name == "P1" assert p.instances is None - def test_with_variables_and_constraints(self): + def test_with_tags_and_objectives(self): p = Problem( name="P1", - variables=Variables(continuous=3), - constraints=Constraints(linear=2), + tags={"convex", "smooth"}, + objectives={1, 2}, ) - assert p.variables.continuous == 3 - assert p.constraints.linear == 2 + assert p.tags == {"convex", "smooth"} + assert p.objectives == {1, 2} def test_instances_list(self): p = Problem(name="P1", instances=["i1", "i2"]) diff --git a/tests/test_union_range.py b/tests/test_union_range.py new file mode 100644 index 0000000..aff681c --- /dev/null +++ b/tests/test_union_range.py @@ -0,0 +1,61 @@ +from opltools.utils import ValueRange, union_range + + +class TestUnionRange: + def test_int_and_same_int(self): + assert union_range(3, 3) == 3 + + def test_int_and_different_int(self): + assert union_range(1, 2) == {1, 2} + + def test_int_and_set(self): + assert union_range(1, {2, 3}) == {1, 2, 3} + + def test_set_and_set(self): + assert union_range({1, 2}, {2, 3}) == {1, 2, 3} + + def test_set_collapses_to_int(self): + assert union_range({5}, {5}) == 5 + + def test_range_and_range(self): + a = ValueRange(min=1, max=5) + b = ValueRange(min=3, max=10) + result = union_range(a, b) + assert isinstance(result, ValueRange) + assert result.min == 1 + assert result.max == 10 + + def test_range_and_range_with_none_bounds(self): + a = ValueRange(min=1, max=None) + b = ValueRange(min=None, max=10) + result = union_range(a, b) + assert result.min == 1 + assert result.max == 10 + + def test_range_and_set_extends_max(self): + r = ValueRange(min=1, max=5) + result = union_range(r, {10}) + assert isinstance(result, ValueRange) + assert result.min == 1 + assert result.max == 10 + + def test_range_and_set_extends_min(self): + r = ValueRange(min=5, max=10) + result = union_range(r, {1}) + assert isinstance(result, ValueRange) + assert result.min == 1 + assert result.max == 10 + + def test_set_and_range_swapped(self): + r = ValueRange(min=5, max=10) + result = union_range({1}, r) + assert isinstance(result, ValueRange) + assert result.min == 1 + assert result.max == 10 + + def test_int_and_range(self): + r = ValueRange(min=5, max=10) + result = union_range(1, r) + assert isinstance(result, ValueRange) + assert result.min == 1 + assert result.max == 10 diff --git a/tests/test_variables.py b/tests/test_variables.py index f5c35d6..1345655 100644 --- a/tests/test_variables.py +++ b/tests/test_variables.py @@ -1,28 +1,23 @@ -from opltools.schema import Variables +from opltools.schema import Variable, VariableType from opltools.utils import ValueRange -class TestVariables: +class TestVariable: def test_defaults(self): - v = Variables() - assert v.continuous == 0 - assert v.integer == 0 - assert v.binary == 0 - assert v.categorical == 0 + v = Variable() + assert v.type is VariableType.unknown + assert v.dim == 0 def test_explicit_values(self): - v = Variables(continuous=5, integer=2, binary=1, categorical=3) - assert v.continuous == 5 - assert v.integer == 2 + v = Variable(type="continuous", dim=5) + assert v.type is VariableType.continuous + assert v.dim == 5 - def test_range_values(self): - v = Variables(continuous=ValueRange(min=1, max=10)) - assert v.continuous.min == 1 - assert v.continuous.max == 10 + def test_range_dim(self): + v = Variable(type="integer", dim=ValueRange(min=1, max=10)) + assert v.dim.min == 1 + assert v.dim.max == 10 - def test_union(self): - a = Variables(continuous=1, integer=2) - b = Variables(continuous=3, integer=4) - a.union(b) - assert a.continuous == {1, 3} - assert a.integer == {2, 4} + def test_set_dim(self): + v = Variable(type="binary", dim={2, 4}) + assert v.dim == {2, 4} diff --git a/tests/test_yesnosome.py b/tests/test_yesnosome.py index d996329..7667cd4 100644 --- a/tests/test_yesnosome.py +++ b/tests/test_yesnosome.py @@ -1,6 +1,7 @@ import pytest from opltools.schema import YesNoSome +from opltools.yesnosome import union class TestYesNoSome: @@ -13,3 +14,26 @@ def test_from_string(self): def test_bad_string(self): with pytest.raises(ValueError): YesNoSome("foo") + + +class TestUnion: + def test_same_single(self): + assert union(YesNoSome.yes, YesNoSome.yes) == YesNoSome.yes + + def test_different_singles(self): + assert union(YesNoSome.yes, YesNoSome.no) == {YesNoSome.yes, YesNoSome.no} + + def test_single_and_set(self): + result = union(YesNoSome.yes, {YesNoSome.no, YesNoSome.some}) + assert result == {YesNoSome.yes, YesNoSome.no, YesNoSome.some} + + def test_set_and_single(self): + result = union({YesNoSome.some}, YesNoSome.yes) + assert result == {YesNoSome.yes, YesNoSome.some} + + def test_set_and_set(self): + result = union({YesNoSome.yes, YesNoSome.no}, {YesNoSome.no, YesNoSome.some}) + assert result == {YesNoSome.yes, YesNoSome.no, YesNoSome.some} + + def test_set_collapses_to_single(self): + assert union({YesNoSome.yes}, {YesNoSome.yes}) == YesNoSome.yes From a0aab0141136e6c213b9aaaf70b0d2457ab91fb9 Mon Sep 17 00:00:00 2001 From: Olaf Mersmann Date: Tue, 21 Apr 2026 18:59:46 +0200 Subject: [PATCH 05/20] feat: Add COBI suite as another example Co-authored-by: Vanessa --- examples/cobi.py | 62 +++++++++++++ uv.lock | 226 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 286 insertions(+), 2 deletions(-) create mode 100644 examples/cobi.py diff --git a/examples/cobi.py b/examples/cobi.py new file mode 100644 index 0000000..2e534e4 --- /dev/null +++ b/examples/cobi.py @@ -0,0 +1,62 @@ +from opltools import Implementation, Generator, Reference, Library, Variable, Constraint +from pydantic_yaml import to_yaml_str + +things = {} + +things["cobi_impl"] = Implementation( + name="COBI Implementation", + description="Python library for COBI (COnstrained BI-objective optimization) problem generator", + language="python", + links=[ + { + "type": "repository", + "url": "https://github.com/numbbo/cobi-problem-generator/", + }, + { + "type": "v0.5.0", + "url": "https://github.com/numbbo/cobi-problem-generator/releases/tag/v0.5.0", + }, + ], + requirements="https://github.com/numbbo/cobi-problem-generator/blob/main/requirements.txt", +) + +things["cobi_problem"] = Generator( + name="COBI Problem", + description="Generator of COnstrained BI-objective optimization problems", + tags={ + "constrained", + "bi-objective", + "continuous", + "black-box", + "location", + "multi-peak", + "convex-quadratic", + }, + references=[ + Reference( + title="Pareto Set Characterization in Constrained Multiobjective Optimization and the COBI Problem Generator", + authors=["Anne Auger", "Dimo Brockhoff", "Luka Opravš", "Tea Tušar"], + link={"type": "arxiv", "url": "https://arxiv.org/abs/2604.09131"}, + ) + ], + objectives={2}, + variables=[Variable(type="continuous", dim={"min": 1})], + implementations={"cobi_impl"}, + can_evaluate_objectives_independently="no", + constraints=[ + # FIXME: Check + Constraint(type="box", hard="yes", number={"min": 1}), + Constraint(type="linear", hard="yes", number={"min": 1}), + Constraint(type="function", hard="yes", number={"min": 1}), + ], + noise_type={"none"}, + dynamic_type=None, + allows_partial_evaluation="no", + modality={"multi-modal per objective"}, + fidelity_levels={1}, + source={"artificial"}, + code_examples={"./code_153.py"}, +) +library = Library(things) + +print(to_yaml_str(library)) diff --git a/uv.lock b/uv.lock index 1c38533..9850ab7 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 3 -requires-python = ">=3.12" +requires-python = ">=3.10" [[package]] name = "annotated-types" @@ -26,6 +26,35 @@ version = "7.13.5" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/69/33/e8c48488c29a73fd089f9d71f9653c1be7478f2ad6b5bc870db11a55d23d/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5", size = 219255, upload-time = "2026-03-17T10:29:51.081Z" }, + { url = "https://files.pythonhosted.org/packages/da/bd/b0ebe9f677d7f4b74a3e115eec7ddd4bcf892074963a00d91e8b164a6386/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf", size = 219772, upload-time = "2026-03-17T10:29:52.867Z" }, + { url = "https://files.pythonhosted.org/packages/48/cc/5cb9502f4e01972f54eedd48218bb203fe81e294be606a2bc93970208013/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8", size = 246532, upload-time = "2026-03-17T10:29:54.688Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d8/3217636d86c7e7b12e126e4f30ef1581047da73140614523af7495ed5f2d/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4", size = 248333, upload-time = "2026-03-17T10:29:56.221Z" }, + { url = "https://files.pythonhosted.org/packages/2b/30/2002ac6729ba2d4357438e2ed3c447ad8562866c8c63fc16f6dfc33afe56/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d", size = 250211, upload-time = "2026-03-17T10:29:57.938Z" }, + { url = "https://files.pythonhosted.org/packages/6c/85/552496626d6b9359eb0e2f86f920037c9cbfba09b24d914c6e1528155f7d/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930", size = 252125, upload-time = "2026-03-17T10:29:59.388Z" }, + { url = "https://files.pythonhosted.org/packages/44/21/40256eabdcbccdb6acf6b381b3016a154399a75fe39d406f790ae84d1f3c/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d", size = 247219, upload-time = "2026-03-17T10:30:01.199Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/96e2a6c3f21a0ea77d7830b254a1542d0328acc8d7bdf6a284ba7e529f77/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40", size = 248248, upload-time = "2026-03-17T10:30:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/da/ba/8477f549e554827da390ec659f3c38e4b6d95470f4daafc2d8ff94eaa9c2/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878", size = 246254, upload-time = "2026-03-17T10:30:04.832Z" }, + { url = "https://files.pythonhosted.org/packages/55/59/bc22aef0e6aa179d5b1b001e8b3654785e9adf27ef24c93dc4228ebd5d68/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400", size = 250067, upload-time = "2026-03-17T10:30:06.535Z" }, + { url = "https://files.pythonhosted.org/packages/de/1b/c6a023a160806a5137dca53468fd97530d6acad24a22003b1578a9c2e429/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0", size = 246521, upload-time = "2026-03-17T10:30:08.486Z" }, + { url = "https://files.pythonhosted.org/packages/2d/3f/3532c85a55aa2f899fa17c186f831cfa1aa434d88ff792a709636f64130e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0", size = 247126, upload-time = "2026-03-17T10:30:09.966Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2e/b9d56af4a24ef45dfbcda88e06870cb7d57b2b0bfa3a888d79b4c8debd76/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58", size = 221860, upload-time = "2026-03-17T10:30:11.393Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cc/d938417e7a4d7f0433ad4edee8bb2acdc60dc7ac5af19e2a07a048ecbee3/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e", size = 222788, upload-time = "2026-03-17T10:30:12.886Z" }, + { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, + { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, + { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, + { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, + { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, + { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, + { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, + { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, + { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, @@ -104,6 +133,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, ] +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + [[package]] name = "iniconfig" version = "2.3.0" @@ -113,6 +159,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "opltools" version = "0.1.0" @@ -123,6 +190,11 @@ dependencies = [ { name = "pyyaml" }, ] +[package.optional-dependencies] +cli = [ + { name = "rich" }, +] + [package.dev-dependencies] dev = [ { name = "pytest" }, @@ -135,7 +207,9 @@ requires-dist = [ { name = "pydantic", specifier = ">=2.13.3" }, { name = "pydantic-yaml", specifier = ">=1.6.0" }, { name = "pyyaml", specifier = ">=6.0.3" }, + { name = "rich", marker = "extra == 'cli'", specifier = ">=15.0.0" }, ] +provides-extras = ["cli"] [package.metadata.requires-dev] dev = [ @@ -186,6 +260,35 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/22/98/b50eb9a411e87483b5c65dba4fa430a06bac4234d3403a40e5a9905ebcd0/pydantic_core-2.46.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1da3786b8018e60349680720158cc19161cc3b4bdd815beb0a321cd5ce1ad5b1", size = 2108971, upload-time = "2026-04-20T14:43:51.945Z" }, + { url = "https://files.pythonhosted.org/packages/08/4b/f364b9d161718ff2217160a4b5d41ce38de60aed91c3689ebffa1c939d23/pydantic_core-2.46.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc0988cb29d21bf4a9d5cf2ef970b5c0e38d8d8e107a493278c05dc6c1dda69f", size = 1949588, upload-time = "2026-04-20T14:44:10.386Z" }, + { url = "https://files.pythonhosted.org/packages/8f/8b/30bd03ee83b2f5e29f5ba8e647ab3c456bf56f2ec72fdbcc0215484a0854/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f9067c3bfadd04c55484b89c0d267981b2f3512850f6f66e1e74204a4e4ce3", size = 1975986, upload-time = "2026-04-20T14:43:57.106Z" }, + { url = "https://files.pythonhosted.org/packages/3c/54/13ccf954d84ec275d5d023d5786e4aa48840bc9f161f2838dc98e1153518/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a642ac886ecf6402d9882d10c405dcf4b902abeb2972cd5fb4a48c83cd59279a", size = 2055830, upload-time = "2026-04-20T14:44:15.499Z" }, + { url = "https://files.pythonhosted.org/packages/be/0e/65f38125e660fdbd72aa858e7dfae893645cfa0e7b13d333e174a367cd23/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79f561438481f28681584b89e2effb22855e2179880314bcddbf5968e935e807", size = 2222340, upload-time = "2026-04-20T14:41:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/d1/88/f3ab7739efe0e7e80777dbb84c59eb98518e3f57ea433206194c2e425272/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57a973eae4665352a47cf1a99b4ee864620f2fe663a217d7a8da68a1f3a5bfda", size = 2280727, upload-time = "2026-04-20T14:41:30.461Z" }, + { url = "https://files.pythonhosted.org/packages/2a/6d/c228219080817bec4982f9531cadb18da6aaa770fdeb114f49c237ac2c9f/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83d002b97072a53ea150d63e0a3adfae5670cef5aa8a6e490240e482d3b22e57", size = 2092158, upload-time = "2026-04-20T14:44:07.305Z" }, + { url = "https://files.pythonhosted.org/packages/0f/b1/525a16711e7c6d61635fac3b0bd54600b5c5d9f60c6fc5aaab26b64a2297/pydantic_core-2.46.3-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b40ddd51e7c44b28cfaef746c9d3c506d658885e0a46f9eeef2ee815cbf8e045", size = 2116626, upload-time = "2026-04-20T14:42:34.118Z" }, + { url = "https://files.pythonhosted.org/packages/ef/7c/17d30673351439a6951bf54f564cf2443ab00ae264ec9df00e2efd710eb5/pydantic_core-2.46.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac5ec7fb9b87f04ee839af2d53bcadea57ded7d229719f56c0ed895bff987943", size = 2160691, upload-time = "2026-04-20T14:41:14.023Z" }, + { url = "https://files.pythonhosted.org/packages/86/66/af8adbcbc0886ead7f1a116606a534d75a307e71e6e08226000d51b880d2/pydantic_core-2.46.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a3b11c812f61b3129c4905781a2601dfdfdea5fe1e6c1cfb696b55d14e9c054f", size = 2182543, upload-time = "2026-04-20T14:40:48.886Z" }, + { url = "https://files.pythonhosted.org/packages/b0/37/6de71e0f54c54a4190010f57deb749e1ddf75c568ada3b1320b70067f121/pydantic_core-2.46.3-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:1108da631e602e5b3c38d6d04fe5bb3bfa54349e6918e3ca6cf570b2e2b2f9d4", size = 2324513, upload-time = "2026-04-20T14:42:36.121Z" }, + { url = "https://files.pythonhosted.org/packages/51/b1/9fc74ce94f603d5ef59ff258ca9c2c8fb902fb548d340a96f77f4d1c3b7f/pydantic_core-2.46.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de885175515bcfa98ae618c1df7a072f13d179f81376c8007112af20567fd08a", size = 2361853, upload-time = "2026-04-20T14:43:24.886Z" }, + { url = "https://files.pythonhosted.org/packages/40/d0/4c652fc592db35f100279ee751d5a145aca1b9a7984b9684ba7c1b5b0535/pydantic_core-2.46.3-cp310-cp310-win32.whl", hash = "sha256:d11058e3201527d41bc6b545c79187c9e4bf85e15a236a6007f0e991518882b7", size = 1980465, upload-time = "2026-04-20T14:44:46.239Z" }, + { url = "https://files.pythonhosted.org/packages/27/b8/a920453c38afbe1f355e1ea0b0d94a0a3e0b0879d32d793108755fa171d5/pydantic_core-2.46.3-cp310-cp310-win_amd64.whl", hash = "sha256:3612edf65c8ea67ac13616c4d23af12faef1ae435a8a93e5934c2a0cbbdd1fd6", size = 2073884, upload-time = "2026-04-20T14:43:01.201Z" }, + { url = "https://files.pythonhosted.org/packages/22/a2/1ba90a83e85a3f94c796b184f3efde9c72f2830dcda493eea8d59ba78e6d/pydantic_core-2.46.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ab124d49d0459b2373ecf54118a45c28a1e6d4192a533fbc915e70f556feb8e5", size = 2106740, upload-time = "2026-04-20T14:41:20.932Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f6/99ae893c89a0b9d3daec9f95487aa676709aa83f67643b3f0abaf4ab628a/pydantic_core-2.46.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cca67d52a5c7a16aed2b3999e719c4bcf644074eac304a5d3d62dd70ae7d4b2c", size = 1948293, upload-time = "2026-04-20T14:43:42.115Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b8/2e8e636dc9e3f16c2e16bf0849e24be82c5ee82c603c65fc0326666328fc/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c024e08c0ba23e6fd68c771a521e9d6a792f2ebb0fa734296b36394dc30390e", size = 1973222, upload-time = "2026-04-20T14:41:57.841Z" }, + { url = "https://files.pythonhosted.org/packages/34/36/0e730beec4d83c5306f417afbd82ff237d9a21e83c5edf675f31ed84c1fe/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6645ce7eec4928e29a1e3b3d5c946621d105d3e79f0c9cddf07c2a9770949287", size = 2053852, upload-time = "2026-04-20T14:40:43.077Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f0/3071131f47e39136a17814576e0fada9168569f7f8c0e6ac4d1ede6a4958/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a712c7118e6c5ea96562f7b488435172abb94a3c53c22c9efc1412264a45cbbe", size = 2221134, upload-time = "2026-04-20T14:43:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a9/a2dc023eec5aa4b02a467874bad32e2446957d2adcab14e107eab502e978/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69a868ef3ff206343579021c40faf3b1edc64b1cc508ff243a28b0a514ccb050", size = 2279785, upload-time = "2026-04-20T14:41:19.285Z" }, + { url = "https://files.pythonhosted.org/packages/0a/44/93f489d16fb63fbd41c670441536541f6e8cfa1e5a69f40bc9c5d30d8c90/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc7e8c32db809aa0f6ea1d6869ebc8518a65d5150fdfad8bcae6a49ae32a22e2", size = 2089404, upload-time = "2026-04-20T14:43:10.108Z" }, + { url = "https://files.pythonhosted.org/packages/2a/78/8692e3aa72b2d004f7a5d937f1dfdc8552ba26caf0bec75f342c40f00dec/pydantic_core-2.46.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3481bd1341dc85779ee506bc8e1196a277ace359d89d28588a9468c3ecbe63fa", size = 2114898, upload-time = "2026-04-20T14:44:51.475Z" }, + { url = "https://files.pythonhosted.org/packages/6a/62/e83133f2e7832532060175cebf1f13748f4c7e7e7165cdd1f611f174494b/pydantic_core-2.46.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8690eba565c6d68ffd3a8655525cbdd5246510b44a637ee2c6c03a7ebfe64d3c", size = 2157856, upload-time = "2026-04-20T14:43:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ec/6a500e3ad7718ee50583fae79c8651f5d37e3abce1fa9ae177ae65842c53/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4de88889d7e88d50d40ee5b39d5dac0bcaef9ba91f7e536ac064e6b2834ecccf", size = 2180168, upload-time = "2026-04-20T14:42:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/d8/53/8267811054b1aa7fc1dc7ded93812372ef79a839f5e23558136a6afbfde1/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e480080975c1ef7f780b8f99ed72337e7cc5efea2e518a20a692e8e7b278eb8b", size = 2322885, upload-time = "2026-04-20T14:41:05.253Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c1/1c0acdb3aa0856ddc4ecc55214578f896f2de16f400cf51627eb3c26c1c4/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de3a5c376f8cd94da9a1b8fd3dd1c16c7a7b216ed31dc8ce9fd7a22bf13b836e", size = 2360328, upload-time = "2026-04-20T14:41:43.991Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d0/ef39cd0f4a926814f360e71c1adeab48ad214d9727e4deb48eedfb5bce1a/pydantic_core-2.46.3-cp311-cp311-win32.whl", hash = "sha256:fc331a5314ffddd5385b9ee9d0d2fee0b13c27e0e02dad71b1ae5d6561f51eeb", size = 1979464, upload-time = "2026-04-20T14:43:12.215Z" }, + { url = "https://files.pythonhosted.org/packages/18/9c/f41951b0d858e343f1cf09398b2a7b3014013799744f2c4a8ad6a3eec4f2/pydantic_core-2.46.3-cp311-cp311-win_amd64.whl", hash = "sha256:b5b9c6cf08a8a5e502698f5e153056d12c34b8fb30317e0c5fd06f45162a6346", size = 2070837, upload-time = "2026-04-20T14:41:47.707Z" }, + { url = "https://files.pythonhosted.org/packages/9f/1e/264a17cd582f6ed50950d4d03dd5fefd84e570e238afe1cb3e25cf238769/pydantic_core-2.46.3-cp311-cp311-win_arm64.whl", hash = "sha256:5dfd51cf457482f04ec49491811a2b8fd5b843b64b11eecd2d7a1ee596ea78a6", size = 2053647, upload-time = "2026-04-20T14:42:27.535Z" }, { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, @@ -246,10 +349,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/66/7f/03dbad45cd3aa9083fbc93c210ae8b005af67e4136a14186950a747c6874/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:9715525891ed524a0a1eb6d053c74d4d4ad5017677fb00af0b7c2644a31bae46", size = 2105683, upload-time = "2026-04-20T14:42:19.779Z" }, + { url = "https://files.pythonhosted.org/packages/26/22/4dc186ac8ea6b257e9855031f51b62a9637beac4d68ac06bee02f046f836/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:9d2f400712a99a013aff420ef1eb9be077f8189a36c1e3ef87660b4e1088a874", size = 1940052, upload-time = "2026-04-20T14:43:59.274Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ca/d376391a5aff1f2e8188960d7873543608130a870961c2b6b5236627c116/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd2aab0e2e9dc2daf36bd2686c982535d5e7b1d930a1344a7bb6e82baab42a76", size = 1988172, upload-time = "2026-04-20T14:41:17.469Z" }, + { url = "https://files.pythonhosted.org/packages/0e/6b/523b9f85c23788755d6ab949329de692a2e3a584bc6beb67fef5e035aa9d/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9d76736da5f362fabfeea6a69b13b7f2be405c6d6966f06b2f6bfff7e64531", size = 2128596, upload-time = "2026-04-20T14:40:41.707Z" }, { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, + { url = "https://files.pythonhosted.org/packages/1f/da/99d40830684f81dec901cac521b5b91c095394cc1084b9433393cde1c2df/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:13afdd885f3d71280cf286b13b310ee0f7ccfefd1dbbb661514a474b726e2f25", size = 2107973, upload-time = "2026-04-20T14:42:06.175Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/87024121818d75bbb2a98ddbaf638e40e7a18b5e0f5492c9ca4b1b316107/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f91c0aff3e3ee0928edd1232c57f643a7a003e6edf1860bc3afcdc749cb513f3", size = 1947191, upload-time = "2026-04-20T14:43:14.319Z" }, + { url = "https://files.pythonhosted.org/packages/60/62/0c1acfe10945b83a6a59d19fbaa92f48825381509e5701b855c08f13db76/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6529d1d128321a58d30afcc97b49e98836542f68dd41b33c2e972bb9e5290536", size = 2123791, upload-time = "2026-04-20T14:43:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/3b2393b4c8f44285561dc30b00cf307a56a2eff7c483a824db3b8221ca51/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:975c267cff4f7e7272eacbe50f6cc03ca9a3da4c4fbd66fffd89c94c1e311aa1", size = 2153197, upload-time = "2026-04-20T14:44:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ba/75/5af02fb35505051eee727c061f2881c555ab4f8ddb2d42da715a42c9731b/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2b8e4f2bbdf71415c544b4b1138b8060db7b6611bc927e8064c769f64bed651c", size = 2181073, upload-time = "2026-04-20T14:43:20.729Z" }, + { url = "https://files.pythonhosted.org/packages/10/92/7e0e1bd9ca3c68305db037560ca2876f89b2647deb2f8b6319005de37505/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e61ea8e9fff9606d09178f577ff8ccdd7206ff73d6552bcec18e1033c4254b85", size = 2315886, upload-time = "2026-04-20T14:44:04.826Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d8/101655f27eaf3e44558ead736b2795d12500598beed4683f279396fa186e/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b504bda01bafc69b6d3c7a0c7f039dcf60f47fab70e06fe23f57b5c75bdc82b8", size = 2360528, upload-time = "2026-04-20T14:40:47.431Z" }, + { url = "https://files.pythonhosted.org/packages/07/0f/1c34a74c8d07136f0d729ffe5e1fdab04fbdaa7684f61a92f92511a84a15/pydantic_core-2.46.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b00b76f7142fc60c762ce579bd29c8fa44aaa56592dd3c54fab3928d0d4ca6ff", size = 2184144, upload-time = "2026-04-20T14:42:57Z" }, ] [[package]] @@ -281,10 +396,12 @@ version = "9.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ @@ -296,7 +413,7 @@ name = "pytest-cov" version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage" }, + { name = "coverage", extra = ["toml"] }, { name = "pluggy" }, { name = "pytest" }, ] @@ -311,6 +428,24 @@ version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, @@ -351,6 +486,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + [[package]] name = "ruamel-yaml" version = "0.18.17" @@ -369,6 +517,26 @@ version = "0.2.15" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ea/97/60fda20e2fb54b83a61ae14648b0817c8f5d84a3821e40bfbdae1437026a/ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600", size = 225794, upload-time = "2025-11-16T16:12:59.761Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/5a/4ab767cd42dcd65b83c323e1620d7c01ee60a52f4032fb7b61501f45f5c2/ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88eea8baf72f0ccf232c22124d122a7f26e8a24110a0273d9bcddcb0f7e1fa03", size = 147454, upload-time = "2025-11-16T16:13:02.54Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/184173ac1e74fd35d308108bcbf83904d6ef8439c70763189225a166b238/ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b6f7d74d094d1f3a4e157278da97752f16ee230080ae331fcc219056ca54f77", size = 132467, upload-time = "2025-11-16T16:13:03.539Z" }, + { url = "https://files.pythonhosted.org/packages/49/1b/2d2077a25fe682ae335007ca831aff42e3cbc93c14066675cf87a6c7fc3e/ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4be366220090d7c3424ac2b71c90d1044ea34fca8c0b88f250064fd06087e614", size = 693454, upload-time = "2025-11-16T20:22:41.083Z" }, + { url = "https://files.pythonhosted.org/packages/90/16/e708059c4c429ad2e33be65507fc1730641e5f239fb2964efc1ba6edea94/ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f66f600833af58bea694d5892453f2270695b92200280ee8c625ec5a477eed3", size = 700345, upload-time = "2025-11-16T16:13:04.771Z" }, + { url = "https://files.pythonhosted.org/packages/d9/79/0e8ef51df1f0950300541222e3332f20707a9c210b98f981422937d1278c/ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da3d6adadcf55a93c214d23941aef4abfd45652110aed6580e814152f385b862", size = 731306, upload-time = "2025-11-16T16:13:06.312Z" }, + { url = "https://files.pythonhosted.org/packages/a6/f4/2cdb54b142987ddfbd01fc45ac6bd882695fbcedb9d8bbf796adc3fc3746/ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9fde97ecb7bb9c41261c2ce0da10323e9227555c674989f8d9eb7572fc2098d", size = 692415, upload-time = "2025-11-16T16:13:07.465Z" }, + { url = "https://files.pythonhosted.org/packages/a0/07/40b5fc701cce8240a3e2d26488985d3bbdc446e9fe397c135528d412fea6/ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:05c70f7f86be6f7bee53794d80050a28ae7e13e4a0087c1839dcdefd68eb36b6", size = 705007, upload-time = "2025-11-16T20:22:42.856Z" }, + { url = "https://files.pythonhosted.org/packages/82/19/309258a1df6192fb4a77ffa8eae3e8150e8d0ffa56c1b6fa92e450ba2740/ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f1d38cbe622039d111b69e9ca945e7e3efebb30ba998867908773183357f3ed", size = 723974, upload-time = "2025-11-16T16:13:08.72Z" }, + { url = "https://files.pythonhosted.org/packages/67/3a/d6ee8263b521bfceb5cd2faeb904a15936480f2bb01c7ff74a14ec058ca4/ruamel_yaml_clib-0.2.15-cp310-cp310-win32.whl", hash = "sha256:fe239bdfdae2302e93bd6e8264bd9b71290218fff7084a9db250b55caaccf43f", size = 102836, upload-time = "2025-11-16T16:13:10.27Z" }, + { url = "https://files.pythonhosted.org/packages/ed/03/92aeb5c69018387abc49a8bb4f83b54a0471d9ef48e403b24bac68f01381/ruamel_yaml_clib-0.2.15-cp310-cp310-win_amd64.whl", hash = "sha256:468858e5cbde0198337e6a2a78eda8c3fb148bdf4c6498eaf4bc9ba3f8e780bd", size = 121917, upload-time = "2025-11-16T16:13:12.145Z" }, + { url = "https://files.pythonhosted.org/packages/2c/80/8ce7b9af532aa94dd83360f01ce4716264db73de6bc8efd22c32341f6658/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c583229f336682b7212a43d2fa32c30e643d3076178fb9f7a6a14dde85a2d8bd", size = 147998, upload-time = "2025-11-16T16:13:13.241Z" }, + { url = "https://files.pythonhosted.org/packages/53/09/de9d3f6b6701ced5f276d082ad0f980edf08ca67114523d1b9264cd5e2e0/ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56ea19c157ed8c74b6be51b5fa1c3aff6e289a041575f0556f66e5fb848bb137", size = 132743, upload-time = "2025-11-16T16:13:14.265Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f7/73a9b517571e214fe5c246698ff3ed232f1ef863c8ae1667486625ec688a/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5fea0932358e18293407feb921d4f4457db837b67ec1837f87074667449f9401", size = 731459, upload-time = "2025-11-16T20:22:44.338Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a2/0dc0013169800f1c331a6f55b1282c1f4492a6d32660a0cf7b89e6684919/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71831bd61fbdb7aa0399d5c4da06bea37107ab5c79ff884cc07f2450910262", size = 749289, upload-time = "2025-11-16T16:13:15.633Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ed/3fb20a1a96b8dc645d88c4072df481fe06e0289e4d528ebbdcc044ebc8b3/ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617d35dc765715fa86f8c3ccdae1e4229055832c452d4ec20856136acc75053f", size = 777630, upload-time = "2025-11-16T16:13:16.898Z" }, + { url = "https://files.pythonhosted.org/packages/60/50/6842f4628bc98b7aa4733ab2378346e1441e150935ad3b9f3c3c429d9408/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b45498cc81a4724a2d42273d6cfc243c0547ad7c6b87b4f774cb7bcc131c98d", size = 744368, upload-time = "2025-11-16T16:13:18.117Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b0/128ae8e19a7d794c2e36130a72b3bb650ce1dd13fb7def6cf10656437dcf/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:def5663361f6771b18646620fca12968aae730132e104688766cf8a3b1d65922", size = 745233, upload-time = "2025-11-16T20:22:45.833Z" }, + { url = "https://files.pythonhosted.org/packages/75/05/91130633602d6ba7ce3e07f8fc865b40d2a09efd4751c740df89eed5caf9/ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:014181cdec565c8745b7cbc4de3bf2cc8ced05183d986e6d1200168e5bb59490", size = 770963, upload-time = "2025-11-16T16:13:19.344Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4b/fd4542e7f33d7d1bc64cc9ac9ba574ce8cf145569d21f5f20133336cdc8c/ruamel_yaml_clib-0.2.15-cp311-cp311-win32.whl", hash = "sha256:d290eda8f6ada19e1771b54e5706b8f9807e6bb08e873900d5ba114ced13e02c", size = 102640, upload-time = "2025-11-16T16:13:20.498Z" }, + { url = "https://files.pythonhosted.org/packages/bb/eb/00ff6032c19c7537371e3119287999570867a0eafb0154fccc80e74bf57a/ruamel_yaml_clib-0.2.15-cp311-cp311-win_amd64.whl", hash = "sha256:bdc06ad71173b915167702f55d0f3f027fc61abd975bd308a0968c02db4a4c3e", size = 121996, upload-time = "2025-11-16T16:13:21.855Z" }, { url = "https://files.pythonhosted.org/packages/72/4b/5fde11a0722d676e469d3d6f78c6a17591b9c7e0072ca359801c4bd17eee/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff", size = 149088, upload-time = "2025-11-16T16:13:22.836Z" }, { url = "https://files.pythonhosted.org/packages/85/82/4d08ac65ecf0ef3b046421985e66301a242804eb9a62c93ca3437dc94ee0/ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2", size = 134553, upload-time = "2025-11-16T16:13:24.151Z" }, { url = "https://files.pythonhosted.org/packages/b9/cb/22366d68b280e281a932403b76da7a988108287adff2bfa5ce881200107a/ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1", size = 737468, upload-time = "2025-11-16T20:22:47.335Z" }, @@ -426,6 +594,60 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/b6/aeadee5443e49baa2facd51131159fd6301cc4ccfc1541e4df7b021c37dd/ruff-0.15.11-py3-none-win_arm64.whl", hash = "sha256:063fed18cc1bbe0ee7393957284a6fe8b588c6a406a285af3ee3f46da2391ee4", size = 11032614, upload-time = "2026-04-16T18:46:34.487Z" }, ] +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" From 0d4225c12a4b9e269e3edeb161ee62bd7a42ca8a Mon Sep 17 00:00:00 2001 From: Olaf Mersmann Date: Tue, 21 Apr 2026 18:59:46 +0200 Subject: [PATCH 06/20] feat: Add example EMDO problem Manual translation of the EMDO problem from the old problems.yaml file to the new format to check if schema supports storing all information from old format. --- examples/emdo.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 examples/emdo.py diff --git a/examples/emdo.py b/examples/emdo.py new file mode 100644 index 0000000..49bbd56 --- /dev/null +++ b/examples/emdo.py @@ -0,0 +1,82 @@ +from opltools import Library, Problem, Implementation +from pydantic_yaml import to_yaml_str + +#! - name: Electric Motor Design Optimization +#! suite/generator/single: Single Problem +#! variable type: Continuous, Integer +#! dimensionality: '13' +#! objectives: '1' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'yes' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! source (real-world/artificial): Real-World Application +#! implementation: Implementation not freely available +#! textual description: The goal is to find a design of a synchronous electric motor +#! for power steering systems that minimizes costs and satisfies all constraints. +#! reference: https://dis.ijs.si/tea/Publications/Tusar23Multistep.pdf (paper in Slovene) +#! other info: +#! partial evaluations: 'no' +#! full name: Electric Motor Design Optimization +#! constraint properties: Hard Constraints, Soft Constraints, Box Constraints +#! number of constraints: '12' +#! description of multimodality: Constraints are multimodal +#! key challenges / characteristics: Time-consuming solution evaluation, highly-constrained +#! problem +#! scientific motivation: Challenging to find good solutions in a limited time +#! limitations: 'Unavailability, even if available, it wouldn''t be helpful to use +#! for benchmarking due taking a long time to evaluate a single solution ' +#! implementation languages: Python +#! approximate evaluation time: 8 minutes +#! general: This is not an available problem, but could be interesting to show to +#! researchers which difficulties appear in real-world problems + +library = Library({ + "impl_emdo": Implementation( + name="Electric Motor Design Optimization", + description="Not publicly available", + language="python", + evaluation_time="8 minutes" + ), + "fn_emdo": Problem( + name="Electric Motor Design Optimization", + description="""# Goal +Find a design of a synchronous electric motor for power steering systems that minimizes costs and satisfies all constraints. + +# Motivation +Challenging to find good solutions in a limited time + +# Key Challenges +* Time-consuming solution evaluation, +* highly-constrained problem +* Constraints are multimodal + +This is not an available problem, but could be interesting to show to researchers which difficulties appear in real-world problems""", + objectives=[1], + variables=[ + {"type": "continuous", "dim": {"min": None, "max": 13}}, + {"type": "integer", "dim": {"min": None, "max": 13}}, + ], + modality=["multimodal"], + allows_partial_evaluation="no", + constraints=[ + {"type": "box", "hard": "some", "number": 12} + ], + dynamic_type=["no"], + noise_type=["yes"], + fidelity_levels=[1], + source=["real-world"], + references=[ + { + "title": "A Multi-Step Evaluation Process in Electric Motor Design", + "lang": "sj", + "authors": ["Tea Tušar", "Peter Korošec", "Bogdan Filipič"], + "link": {"url": "https://dis.ijs.si/tea/Publications/Tusar23Multistep.pdf"} + } + ], + implementations=["impl_emdo"] + ) +}) + +print(to_yaml_str(library)) From 4da69487c86bbb11cfb485ca0bf5cf2b5688959b Mon Sep 17 00:00:00 2001 From: Olaf Mersmann Date: Wed, 22 Apr 2026 13:50:16 +0200 Subject: [PATCH 07/20] chore: Convert problem.yaml to new schema Adds an LLM generated generator for the problems defined in the old problem.yaml to generate a new style problem.yaml. For future fixes, it is probably best to update examples/problem.py, regenerate the yaml and then merge it with the old yaml by replacing entries based on id. That way additional entries added later are not clobbbered. --- examples/problems.py | 2995 ++++++++++++++++++++++++++ problems.yaml | 4754 +++++++++++++++++++++++++++++++----------- 2 files changed, 6488 insertions(+), 1261 deletions(-) create mode 100644 examples/problems.py diff --git a/examples/problems.py b/examples/problems.py new file mode 100644 index 0000000..0e387d7 --- /dev/null +++ b/examples/problems.py @@ -0,0 +1,2995 @@ +"""Conversion of problems.yaml into the opltools schema. + +Every entry from the original YAML is preserved as a `#!` comment block +directly above the Python object(s) it was converted into. Where the +original YAML carried information that does not fit into the new schema, +a `FIXME` comment is used to flag the loss. + +IDs use the prefixes: + fn_ - single Problem + suite_ - Suite + gen_ - Generator + impl_ - Implementation +""" + +from opltools import ( + Library, + Problem, + Suite, + Generator, + Implementation, + Reference, + Link, + Variable, + Constraint, + ValueRange, +) +from pydantic_yaml import to_yaml_str + +things = {} + + +# ===================================================================== +# Shared implementations (reused by multiple YAML entries). +# ===================================================================== + +things["impl_coco"] = Implementation( + name="COCO framework", + description="Comparing Continuous Optimizers: black-box optimization benchmarking platform", + language="C/Python", + links=[Link(type="repository", url="https://github.com/numbbo/coco")], +) + +things["impl_coco_legacy"] = Implementation( + name="COCO legacy (bbob-noisy)", + description="Archived COCO download page that hosted the bbob-noisy suite", + language="C/Python", + links=[ + Link( + type="archive", + url="https://web.archive.org/web/20210416065610/https://coco.gforge.inria.fr/doku.php?id=downloads", + ) + ], +) + +things["impl_iohexperimenter"] = Implementation( + name="IOHexperimenter", + description="IOHprofiler experimenter framework", + language="C++/Python", + links=[Link(type="repository", url="https://github.com/IOHprofiler/IOHexperimenter")], +) + +things["impl_pymoo"] = Implementation( + name="pymoo", + description="Multi-objective optimization in Python", + language="Python", + links=[Link(type="repository", url="https://github.com/anyoptimization/pymoo")], +) + +things["impl_mocobench"] = Implementation( + name="mocobench", + description="Multi-objective combinatorial optimization benchmark", + language="C++", + links=[Link(type="repository", url="https://gitlab.com/aliefooghe/mocobench/")], +) + +things["impl_reproblems"] = Implementation( + name="reproblems", + description="Real-world inspired multi-objective optimization problem suite", + language="Python", + links=[Link(type="repository", url="https://github.com/ryojitanabe/reproblems")], +) + + +# ===================================================================== +# Entries +# ===================================================================== + +#! - name: BBOB +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1080/10556788.2020.1808977 +#! implementation: https://github.com/numbbo/coco +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_bbob"] = Suite( + name="BBOB", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + modality={"multimodal"}, + references=[ + Reference( + title="COCO: a platform for comparing continuous optimizers in a black-box setting", + authors=[], + link=Link(url="https://doi.org/10.1080/10556788.2020.1808977"), + ) + ], + implementations={"impl_coco"}, +) + +#! - name: BBOB-biobj +#! suite/generator/single: suite +#! objectives: '2' +#! dimensionality: 2-40 +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.48550/arXiv.1604.00359 +#! implementation: https://github.com/numbbo/coco +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_bbob_biobj"] = Suite( + name="BBOB-biobj", + objectives={2}, + variables=[Variable(type="continuous", dim=ValueRange(min=2, max=40))], + modality={"multimodal"}, + references=[ + Reference( + title="BBOB bi-objective test suite", + authors=[], + link=Link(url="https://doi.org/10.48550/arXiv.1604.00359"), + ) + ], + implementations={"impl_coco"}, +) + +#! - name: BBOB-noisy +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'yes' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://hal.inria.fr/inria-00369466 +#! implementation: https://web.archive.org/web/20210416065610/https://coco.gforge.inria.fr/doku.php?id=downloads +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_bbob_noisy"] = Suite( + name="BBOB-noisy", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + modality={"multimodal"}, + noise_type={"noisy"}, + references=[ + Reference( + title="Real-parameter black-box optimization benchmarking: noisy functions definitions", + authors=[], + link=Link(url="https://hal.inria.fr/inria-00369466"), + ) + ], + implementations={"impl_coco_legacy"}, +) + +#! - name: BBOB-largescale +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: 20-640 +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.48550/arXiv.1903.06396 +#! implementation: https://github.com/numbbo/coco +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_bbob_largescale"] = Suite( + name="BBOB-largescale", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=20, max=640))], + modality={"multimodal"}, + references=[ + Reference( + title="BBOB large-scale test suite", + authors=[], + link=Link(url="https://doi.org/10.48550/arXiv.1903.06396"), + ) + ], + implementations={"impl_coco"}, +) + +#! - name: BBOB-mixint +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: 5-160 +#! variable type: integer;continuous;mixed +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/3321707.3321868 +#! implementation: https://github.com/numbbo/coco +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_bbob_mixint"] = Suite( + name="BBOB-mixint", + objectives={1}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=5, max=160)), + Variable(type="integer", dim=ValueRange(min=5, max=160)), + ], + modality={"multimodal"}, + references=[ + Reference( + title="BBOB mixed-integer test suite", + authors=[], + link=Link(url="https://doi.org/10.1145/3321707.3321868"), + ) + ], + implementations={"impl_coco"}, +) + +#! - name: BBOB-biobj-mixint +#! suite/generator/single: suite +#! objectives: '2' +#! dimensionality: 5-160 +#! variable type: integer;continuous;mixed +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/3321707.3321868 +#! implementation: https://github.com/numbbo/coco +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_bbob_biobj_mixint"] = Suite( + name="BBOB-biobj-mixint", + objectives={2}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=5, max=160)), + Variable(type="integer", dim=ValueRange(min=5, max=160)), + ], + modality={"multimodal"}, + references=[ + Reference( + title="BBOB bi-objective mixed-integer test suite", + authors=[], + link=Link(url="https://doi.org/10.1145/3321707.3321868"), + ) + ], + implementations={"impl_coco"}, +) + +#! - name: BBOB-constrained +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: 2-40 +#! variable type: continuous +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: http://numbbo.github.io/coco-doc/bbob-constrained/ +#! implementation: https://github.com/numbbo/coco +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_bbob_constrained"] = Suite( + name="BBOB-constrained", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=2, max=40))], + constraints=[Constraint(hard="yes")], + modality={"multimodal"}, + references=[ + Reference( + title="bbob-constrained documentation", + authors=[], + link=Link(url="http://numbbo.github.io/coco-doc/bbob-constrained/"), + ) + ], + implementations={"impl_coco"}, +) + +#! - name: MOrepo +#! suite/generator/single: suite +#! objectives: '2' +#! dimensionality: '?' +#! variable type: combinatorial +#! constraints: '?' +#! dynamic: '?' +#! noise: '?' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: '' +#! implementation: https://github.com/MCDMSociety/MOrepo +#! source (real-world/artificial): '' +#! textual description: '' +things["impl_morepo"] = Implementation( + name="MOrepo", + description="Multi-objective optimisation problem repository", + links=[Link(type="repository", url="https://github.com/MCDMSociety/MOrepo")], +) +# FIXME: "combinatorial" has no direct VariableType; dimensionality "?" unknown. +things["suite_morepo"] = Suite( + name="MOrepo", + objectives={2}, + variables=[Variable(type="unknown")], + constraints=[Constraint(hard="?")], + dynamic_type={"unknown"}, + noise_type={"unknown"}, + implementations={"impl_morepo"}, +) + +#! - name: ZDT +#! suite/generator/single: suite +#! objectives: '2' +#! dimensionality: scalable +#! variable type: continuous;binary +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1162/106365600568202 +#! implementation: https://github.com/anyoptimization/pymoo +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_zdt"] = Suite( + name="ZDT", + objectives={2}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="binary", dim=ValueRange(min=1)), + ], + references=[ + Reference( + title="Comparison of multiobjective evolutionary algorithms: empirical results", + authors=["Eckart Zitzler", "Kalyanmoy Deb", "Lothar Thiele"], + link=Link(url="https://doi.org/10.1162/106365600568202"), + ) + ], + implementations={"impl_pymoo"}, +) + +#! - name: DTLZ +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/CEC.2002.1007032 +#! implementation: https://pymoo.org/problems/many/dtlz.html +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_dtlz"] = Suite( + name="DTLZ", + # FIXME: original "2+" - schema requires set[int]; truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + references=[ + Reference( + title="Scalable multi-objective optimization test problems", + authors=["Kalyanmoy Deb", "Lothar Thiele", "Marco Laumanns", "Eckart Zitzler"], + link=Link(url="https://doi.org/10.1109/CEC.2002.1007032"), + ) + ], + implementations={"impl_pymoo"}, +) + +#! - name: WFG +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/TEVC.2005.861417 +#! implementation: https://pymoo.org/problems/many/wfg.html +#! source (real-world/artificial): '' +#! textual description: '' +things["suite_wfg"] = Suite( + name="WFG", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + references=[ + Reference( + title="A review of multiobjective test problems and a scalable test problem toolkit", + authors=["Simon Huband", "Philip Hingston", "Luigi Barone", "Lyndon While"], + link=Link(url="https://doi.org/10.1109/TEVC.2005.861417"), + ) + ], + implementations={"impl_pymoo"}, +) + +#! - name: CDMP +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'yes' +#! dynamic: '?' +#! noise: '?' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/3321707.3321878 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: '' +# FIXME: implementation unknown. +things["suite_cdmp"] = Suite( + name="CDMP", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + constraints=[Constraint(hard="yes")], + dynamic_type={"unknown"}, + noise_type={"unknown"}, + references=[ + Reference( + title="CDMP benchmark", + authors=[], + link=Link(url="https://doi.org/10.1145/3321707.3321878"), + ) + ], +) + +#! - name: SDP +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'yes' +#! noise: '?' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/TCYB.2019.2896021 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: '' +# FIXME: implementation unknown. +things["suite_sdp"] = Suite( + name="SDP", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + dynamic_type={"dynamic"}, + noise_type={"unknown"}, + references=[ + Reference( + title="SDP dynamic multi-objective benchmark", + authors=[], + link=Link(url="https://doi.org/10.1109/TCYB.2019.2896021"), + ) + ], +) + +#! - name: MaOP +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: '?' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1016/j.swevo.2019.02.003 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: '' +# FIXME: implementation unknown. +things["suite_maop"] = Suite( + name="MaOP", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + noise_type={"unknown"}, + references=[ + Reference( + title="MaOP benchmark", + authors=[], + link=Link(url="https://doi.org/10.1016/j.swevo.2019.02.003"), + ) + ], +) + +#! - name: BP +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: '?' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/CEC.2019.8790277 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: '' +# FIXME: implementation unknown. +things["suite_bp"] = Suite( + name="BP", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + noise_type={"unknown"}, + references=[ + Reference( + title="BP benchmark", + authors=[], + link=Link(url="https://doi.org/10.1109/CEC.2019.8790277"), + ) + ], +) + +#! - name: GPD +#! suite/generator/single: generator +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: optional +#! dynamic: 'no' +#! noise: optional +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1016/j.asoc.2020.106139 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: '' +# FIXME: implementation unknown. +things["gen_gpd"] = Generator( + name="GPD", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + constraints=[Constraint(hard="some")], + noise_type={"optional"}, + references=[ + Reference( + title="GPD generator", + authors=[], + link=Link(url="https://doi.org/10.1016/j.asoc.2020.106139"), + ) + ], +) + +#! - name: ETMOF +#! suite/generator/single: suite +#! objectives: 2-50 +#! dimensionality: 25-10000 +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'yes' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.48550/arXiv.2110.08033 +#! implementation: https://github.com/songbai-liu/etmo +#! source (real-world/artificial): '' +#! textual description: '' +things["impl_etmof"] = Implementation( + name="ETMOF", + description="Evolutionary many-task optimization framework", + links=[Link(type="repository", url="https://github.com/songbai-liu/etmo")], +) +things["suite_etmof"] = Suite( + name="ETMOF", + objectives=set(range(2, 51)), + variables=[Variable(type="continuous", dim=ValueRange(min=25, max=10000))], + dynamic_type={"dynamic"}, + references=[ + Reference( + title="Evolutionary many-task optimization framework", + authors=[], + link=Link(url="https://doi.org/10.48550/arXiv.2110.08033"), + ) + ], + implementations={"impl_etmof"}, +) + +#! - name: MMOPP +#! suite/generator/single: suite +#! objectives: 2-7 +#! dimensionality: '?' +#! variable type: '?' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: http://www5.zzu.edu.cn/system/_content/download.jsp?urltype=news.DownloadAttachUrl&owner=1327567121&wbfileid=4764412 +#! implementation: http://www5.zzu.edu.cn/ecilab/info/1036/1251.htm +#! source (real-world/artificial): '' +#! textual description: '' +things["impl_mmopp"] = Implementation( + name="MMOPP", + description="ECI lab distribution page for MMOPP", + links=[Link(type="website", url="http://www5.zzu.edu.cn/ecilab/info/1036/1251.htm")], +) +# FIXME: variable type and dimensionality unknown ("?"). +things["suite_mmopp"] = Suite( + name="MMOPP", + objectives=set(range(2, 8)), + variables=[Variable(type="unknown")], + constraints=[Constraint(hard="yes")], + modality={"multimodal"}, + references=[ + Reference( + title="MMOPP technical report", + authors=[], + link=Link( + url="http://www5.zzu.edu.cn/system/_content/download.jsp?urltype=news.DownloadAttachUrl&owner=1327567121&wbfileid=4764412" + ), + ) + ], + implementations={"impl_mmopp"}, +) + +#! - name: CFD +#! suite/generator/single: suite +#! objectives: 1-2 +#! dimensionality: scalable +#! variable type: '?' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1007/978-3-319-99259-4_24 +#! implementation: https://bitbucket.org/arahat/cfd-test-problem-suite +#! source (real-world/artificial): real world +#! textual description: expensive evaluations 30s-15m +things["impl_cfd"] = Implementation( + name="CFD test problem suite", + description="Expensive real-world CFD-based test problems", + evaluation_time="30s-15m", + links=[Link(type="repository", url="https://bitbucket.org/arahat/cfd-test-problem-suite")], +) +# FIXME: variable type unknown. +things["suite_cfd"] = Suite( + name="CFD", + description="expensive evaluations 30s-15m", + objectives={1, 2}, + variables=[Variable(type="unknown", dim=ValueRange(min=1))], + constraints=[Constraint(hard="yes")], + source={"real-world"}, + references=[ + Reference( + title="CFD test problem suite", + authors=[], + link=Link(url="https://doi.org/10.1007/978-3-319-99259-4_24"), + ) + ], + implementations={"impl_cfd"}, +) + +#! - name: GBEA +#! suite/generator/single: suite +#! objectives: 1-2 +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'yes' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/3321707.3321805 +#! implementation: 'https://github.com/ttusar/coco-gbea' +#! source (real-world/artificial): real world +#! textual description: 'expensive evaluations 5s-35s, RW-GAN-Mario and TopTrumps are part of GBEA' +things["impl_gbea"] = Implementation( + name="coco-gbea", + description="Game-Benchmark for Evolutionary Algorithms (COCO fork)", + evaluation_time="5s-35s", + links=[Link(type="repository", url="https://github.com/ttusar/coco-gbea")], +) +things["suite_gbea"] = Suite( + name="GBEA", + description="expensive evaluations 5s-35s, RW-GAN-Mario and TopTrumps are part of GBEA", + objectives={1, 2}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + noise_type={"noisy"}, + modality={"multimodal"}, + source={"real-world"}, + references=[ + Reference( + title="Game benchmark for evolutionary algorithms", + authors=[], + link=Link(url="https://doi.org/10.1145/3321707.3321805"), + ) + ], + implementations={"impl_gbea"}, +) + +#! - name: Car structure +#! suite/generator/single: suite +#! objectives: '2' +#! dimensionality: 144-222 +#! variable type: discrete +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/3205651.3205702 +#! implementation: http://ladse.eng.isas.jaxa.jp/benchmark/ +#! source (real-world/artificial): real world +#! textual description: 54 constraints +things["impl_car_structure"] = Implementation( + name="Car-structure benchmark", + description="JAXA LADSE benchmark problems", + links=[Link(type="website", url="http://ladse.eng.isas.jaxa.jp/benchmark/")], +) +# FIXME: "discrete" has no direct VariableType - using integer. +things["suite_car_structure"] = Suite( + name="Car structure", + description="54 constraints", + objectives={2}, + variables=[Variable(type="integer", dim=ValueRange(min=144, max=222))], + constraints=[Constraint(hard="yes", number=54)], + source={"real-world"}, + references=[ + Reference( + title="Car structure design benchmark", + authors=[], + link=Link(url="https://doi.org/10.1145/3205651.3205702"), + ) + ], + implementations={"impl_car_structure"}, +) + +#! - name: EMO2017 +#! suite/generator/single: suite +#! objectives: '2' +#! dimensionality: 4-24 +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/ +#! implementation: https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/downloads/realworld-problems-bbcomp-EMO-2017.zip +#! source (real-world/artificial): real world +#! textual description: '' +things["impl_emo2017"] = Implementation( + name="EMO 2017 real-world problems", + description="BBComp EMO-2017 real-world problem archive", + links=[ + Link( + type="download", + url="https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/downloads/realworld-problems-bbcomp-EMO-2017.zip", + ) + ], +) +things["suite_emo2017"] = Suite( + name="EMO2017", + objectives={2}, + variables=[Variable(type="continuous", dim=ValueRange(min=4, max=24))], + source={"real-world"}, + references=[ + Reference( + title="BBComp EMO 2017", + authors=[], + link=Link(url="https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/"), + ) + ], + implementations={"impl_emo2017"}, +) + +#! - name: JSEC2019 +#! suite/generator/single: single +#! objectives: 1-5 +#! dimensionality: '32' +#! variable type: continuous +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html +#! implementation: http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html +#! source (real-world/artificial): real world +#! textual description: expensive evaluations 3s; 22 constraints +things["impl_jsec2019"] = Implementation( + name="JSEC 2019 competition", + description="JPNSEC EC-Symposium 2019 competition problem", + evaluation_time="3s", + links=[ + Link( + type="website", + url="http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html", + ) + ], +) +things["fn_jsec2019"] = Problem( + name="JSEC2019", + description="expensive evaluations 3s; 22 constraints", + objectives={1, 2, 3, 4, 5}, + variables=[Variable(type="continuous", dim=32)], + constraints=[Constraint(hard="yes", number=22)], + source={"real-world"}, + references=[ + Reference( + title="JPNSEC EC-Symposium 2019 competition", + authors=[], + link=Link( + url="http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html" + ), + ) + ], + implementations={"impl_jsec2019"}, +) + +#! - name: RE +#! suite/generator/single: suite +#! objectives: 2-9 +#! dimensionality: 2-7 +#! variable type: continuous;integer;mixed +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1016/j.asoc.2020.106078 +#! implementation: https://github.com/ryojitanabe/reproblems +#! source (real-world/artificial): real world like +#! textual description: '' +things["suite_re"] = Suite( + name="RE", + objectives=set(range(2, 10)), + variables=[ + Variable(type="continuous", dim=ValueRange(min=2, max=7)), + Variable(type="integer", dim=ValueRange(min=2, max=7)), + ], + source={"real-world-like"}, + references=[ + Reference( + title="Easy-to-evaluate real-world multi-objective optimization problems", + authors=["Ryoji Tanabe", "Hisao Ishibuchi"], + link=Link(url="https://doi.org/10.1016/j.asoc.2020.106078"), + ) + ], + implementations={"impl_reproblems"}, +) + +#! - name: CRE +#! suite/generator/single: suite +#! objectives: 2-5 +#! dimensionality: 3-7 +#! variable type: continuous;integer;mixed +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1016/j.asoc.2020.106078 +#! implementation: https://github.com/ryojitanabe/reproblems +#! source (real-world/artificial): real world like +#! textual description: '' +things["suite_cre"] = Suite( + name="CRE", + objectives={2, 3, 4, 5}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=3, max=7)), + Variable(type="integer", dim=ValueRange(min=3, max=7)), + ], + constraints=[Constraint(hard="yes")], + source={"real-world-like"}, + references=[ + Reference( + title="Easy-to-evaluate real-world multi-objective optimization problems", + authors=["Ryoji Tanabe", "Hisao Ishibuchi"], + link=Link(url="https://doi.org/10.1016/j.asoc.2020.106078"), + ) + ], + implementations={"impl_reproblems"}, +) + +#! - name: Radar waveform +#! suite/generator/single: single +#! objectives: '9' +#! dimensionality: 4-12 +#! variable type: integer +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1007/978-3-540-70928-2_53 +#! implementation: http://code.evanhughes.org/ +#! source (real-world/artificial): real world +#! textual description: '' +things["impl_radar_waveform"] = Implementation( + name="Evan Hughes radar waveform code", + description="Radar waveform design reference implementation", + links=[Link(type="website", url="http://code.evanhughes.org/")], +) +things["fn_radar_waveform"] = Problem( + name="Radar waveform", + objectives={9}, + variables=[Variable(type="integer", dim=ValueRange(min=4, max=12))], + constraints=[Constraint(hard="yes")], + source={"real-world"}, + references=[ + Reference( + title="Radar waveform design", + authors=[], + link=Link(url="https://doi.org/10.1007/978-3-540-70928-2_53"), + ) + ], + implementations={"impl_radar_waveform"}, +) + +#! - name: MF2 +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: 1-n +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'yes' +#! reference: https://doi.org/10.21105/joss.02049 +#! implementation: https://github.com/sjvrijn/mf2 +#! source (real-world/artificial): '' +#! textual description: '' +things["impl_mf2"] = Implementation( + name="mf2", + description="Multi-fidelity test function collection", + language="Python", + links=[Link(type="repository", url="https://github.com/sjvrijn/mf2")], +) +things["suite_mf2"] = Suite( + name="MF2", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + fidelity_levels={1, 2}, + references=[ + Reference( + title="mf2: a collection of multi-fidelity benchmark functions in Python", + authors=[], + link=Link(url="https://doi.org/10.21105/joss.02049"), + ) + ], + implementations={"impl_mf2"}, +) + +#! - name: AMVOP +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: mixed continuous+ordinal+categorical+both +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/TEVC.2013.2281531 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: '' +# FIXME: implementation unknown. "ordinal" not representable, using integer+categorical+continuous. +things["suite_amvop"] = Suite( + name="AMVOP", + objectives={1}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="integer", dim=ValueRange(min=1)), + Variable(type="categorical", dim=ValueRange(min=1)), + ], + modality={"multimodal"}, + references=[ + Reference( + title="AMVOP", + authors=[], + link=Link(url="https://doi.org/10.1109/TEVC.2013.2281531"), + ) + ], +) + +#! - name: RWMVOP +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous;mixed continuous+ordinal+categorical+both +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/TEVC.2013.2281531 +#! implementation: '?' +#! source (real-world/artificial): real world +#! textual description: '' +# FIXME: implementation unknown. +things["suite_rwmvop"] = Suite( + name="RWMVOP", + objectives={1}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="integer", dim=ValueRange(min=1)), + Variable(type="categorical", dim=ValueRange(min=1)), + ], + constraints=[Constraint(hard="yes")], + source={"real-world"}, + references=[ + Reference( + title="RWMVOP", + authors=[], + link=Link(url="https://doi.org/10.1109/TEVC.2013.2281531"), + ) + ], +) + +#! - name: SBOX-COST +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.48550/arXiv.2305.12221 +#! implementation: https://github.com/IOHprofiler/IOHexperimenter/ +#! source (real-world/artificial): '' +#! textual description: problems from BBOB but allows instances with the optimum close to the +#! boundary +things["suite_sbox_cost"] = Suite( + name="SBOX-COST", + description="problems from BBOB but allows instances with the optimum close to the boundary", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + modality={"multimodal"}, + references=[ + Reference( + title="SBOX-COST", + authors=[], + link=Link(url="https://doi.org/10.48550/arXiv.2305.12221"), + ) + ], + implementations={"impl_iohexperimenter"}, +) + +#! - name: "\u03C1MNK-Landscapes" +#! suite/generator/single: generator +#! objectives: scalable +#! dimensionality: scalable +#! variable type: binary +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1016/j.ejor.2012.12.019 +#! implementation: https://gitlab.com/aliefooghe/mocobench/ +#! source (real-world/artificial): '' +#! textual description: tunable variable and objective dimensions; tunable multimodality and +#! correlation between objectives +things["gen_rho_mnk_landscapes"] = Generator( + name="ρMNK-Landscapes", + description="tunable variable and objective dimensions; tunable multimodality and correlation between objectives", + # FIXME: original "scalable" - truncated to 1..10. + objectives=set(range(1, 11)), + variables=[Variable(type="binary", dim=ValueRange(min=1))], + modality={"multimodal"}, + references=[ + Reference( + title="On the design of multi-objective evolutionary algorithms based on NK-landscapes", + authors=[], + link=Link(url="https://doi.org/10.1016/j.ejor.2012.12.019"), + ) + ], + implementations={"impl_mocobench"}, +) + +#! - name: mUBQP +#! suite/generator/single: generator +#! objectives: scalable +#! dimensionality: scalable +#! variable type: binary +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: yes (quadratic) +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1016/j.asoc.2013.11.008 +#! implementation: https://gitlab.com/aliefooghe/mocobench/ +#! source (real-world/artificial): '' +#! textual description: tunable variable and objective dimensions; tunable density and correlation +#! between objectives +things["gen_mubqp"] = Generator( + name="mUBQP", + description="tunable variable and objective dimensions; tunable density and correlation between objectives", + # FIXME: original "scalable" - truncated to 1..10. + objectives=set(range(1, 11)), + variables=[Variable(type="binary", dim=ValueRange(min=1))], + modality={"multimodal", "quadratic"}, + references=[ + Reference( + title="mUBQP benchmark", + authors=[], + link=Link(url="https://doi.org/10.1016/j.asoc.2013.11.008"), + ) + ], + implementations={"impl_mocobench"}, +) + +#! - name: "\u03C1mTSP" +#! suite/generator/single: generator +#! objectives: scalable +#! dimensionality: scalable +#! variable type: permutations +#! constraints: no (apart from being permutations) +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: yes (quadratic) +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1007/978-3-319-45823-6_40 +#! implementation: https://gitlab.com/aliefooghe/mocobench/ +#! source (real-world/artificial): '' +#! textual description: tunable variable and objective dimensions; tunable instance type (euclidian/random); +#! tunable correlation between objectives +# FIXME: "permutations" has no direct VariableType; constraints are implicit permutations. +things["gen_rho_mtsp"] = Generator( + name="ρmTSP", + description="tunable variable and objective dimensions; tunable instance type (euclidean/random); tunable correlation between objectives", + # FIXME: original "scalable" - truncated to 1..10. + objectives=set(range(1, 11)), + variables=[Variable(type="unknown", dim=ValueRange(min=1))], + modality={"multimodal", "quadratic"}, + references=[ + Reference( + title="On the impact of multi-objective scalability for the ρmTSP", + authors=[], + link=Link(url="https://doi.org/10.1007/978-3-319-45823-6_40"), + ) + ], + implementations={"impl_mocobench"}, +) + +#! - name: CEC2015-DMOO +#! suite/generator/single: suite +#! objectives: 2-3 +#! dimensionality: '?' +#! variable type: continuous +#! constraints: '?' +#! dynamic: 'yes' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: Benchmark Functions for CEC 2015 Special Session and Competition on Dynamic +#! Multi-objective Optimization +#! implementation: '' +#! source (real-world/artificial): '' +#! textual description: '' +# FIXME: reference is a title-only string; implementation unavailable; dimensionality unknown. +things["suite_cec2015_dmoo"] = Suite( + name="CEC2015-DMOO", + objectives={2, 3}, + variables=[Variable(type="continuous")], + constraints=[Constraint(hard="?")], + dynamic_type={"dynamic"}, + references=[ + Reference( + title="Benchmark Functions for CEC 2015 Special Session and Competition on Dynamic Multi-objective Optimization", + authors=[], + ) + ], +) + +#! - name: Ealain +#! suite/generator/single: generator +#! objectives: 1+ +#! dimensionality: scalable +#! variable type: continuous,binary,integer +#! constraints: optional +#! dynamic: optional +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: optional +#! reference: https://doi.org/10.1145/3638530.3654299 +#! implementation: https://github.com/qrenau/Ealain +#! source (real-world/artificial): Real-world-like +#! textual description: Real-world-like, easily extensible to increase complexity +things["impl_ealain"] = Implementation( + name="Ealain", + description="Real-world-like extensible benchmark problem generator", + links=[Link(type="repository", url="https://github.com/qrenau/Ealain")], +) +things["gen_ealain"] = Generator( + name="Ealain", + description="Real-world-like, easily extensible to increase complexity", + # FIXME: original "1+" - truncated to 1..10. + objectives=set(range(1, 11)), + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="binary", dim=ValueRange(min=1)), + Variable(type="integer", dim=ValueRange(min=1)), + ], + constraints=[Constraint(hard="some")], + dynamic_type={"optional"}, + fidelity_levels={1, 2}, + source={"real-world-like"}, + references=[ + Reference( + title="Ealain", + authors=[], + link=Link(url="https://doi.org/10.1145/3638530.3654299"), + ) + ], + implementations={"impl_ealain"}, +) + +#! - name: MA-BBOB +#! suite/generator/single: generator +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/3673908 +#! implementation: https://github.com/IOHprofiler/IOHexperimenter/blob/master/example/Competitions/MA-BBOB/Example_MABBOB.ipynb +#! source (real-world/artificial): artificial +#! textual description: Generator that creates affine combinations of BBOB functions +things["impl_ma_bbob"] = Implementation( + name="MA-BBOB (IOHexperimenter)", + description="Example notebook for MA-BBOB in IOHexperimenter", + links=[ + Link( + type="example", + url="https://github.com/IOHprofiler/IOHexperimenter/blob/master/example/Competitions/MA-BBOB/Example_MABBOB.ipynb", + ) + ], +) +things["gen_ma_bbob"] = Generator( + name="MA-BBOB", + description="Generator that creates affine combinations of BBOB functions", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + modality={"multimodal"}, + source={"artificial"}, + references=[ + Reference( + title="MA-BBOB", + authors=[], + link=Link(url="https://doi.org/10.1145/3673908"), + ) + ], + implementations={"impl_ma_bbob", "impl_iohexperimenter"}, +) + +#! - name: MPM2 +#! suite/generator/single: generator +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://ls11-www.cs.tu-dortmund.de/_media/techreports/tr15-01.pdf +#! implementation: https://github.com/jakobbossek/smoof/blob/master/inst/mpm2.py +#! source (real-world/artificial): '' +#! textual description: nonlinear nonseparable nonsymmetric; scalable in terms of time to evaluate +#! the objective function +things["impl_mpm2"] = Implementation( + name="MPM2 (smoof)", + description="Python implementation of MPM2 distributed with smoof", + language="Python", + links=[ + Link( + type="source", + url="https://github.com/jakobbossek/smoof/blob/master/inst/mpm2.py", + ) + ], +) +things["gen_mpm2"] = Generator( + name="MPM2", + description="nonlinear nonseparable nonsymmetric; scalable in terms of time to evaluate the objective function", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + modality={"multimodal"}, + references=[ + Reference( + title="MPM2 technical report TR15-01", + authors=[], + link=Link(url="https://ls11-www.cs.tu-dortmund.de/_media/techreports/tr15-01.pdf"), + ) + ], + implementations={"impl_mpm2"}, +) + +#! - name: Convex DTLZ2 +#! suite/generator/single: single +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/TEVC.2013.2281535 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: Variant of DTLZ2 with a convex Pareto front (instead of concave) +# FIXME: implementation unknown. +things["fn_convex_dtlz2"] = Problem( + name="Convex DTLZ2", + description="Variant of DTLZ2 with a convex Pareto front (instead of concave)", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + references=[ + Reference( + title="Convex DTLZ2", + authors=[], + link=Link(url="https://doi.org/10.1109/TEVC.2013.2281535"), + ) + ], +) + +#! - name: Inverted DTLZ1 +#! suite/generator/single: single +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/TEVC.2013.2281534 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: Variant of DTLZ1 with an inverted Pareto front +# FIXME: implementation unknown. +things["fn_inverted_dtlz1"] = Problem( + name="Inverted DTLZ1", + description="Variant of DTLZ1 with an inverted Pareto front", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + references=[ + Reference( + title="Inverted DTLZ1", + authors=[], + link=Link(url="https://doi.org/10.1109/TEVC.2013.2281534"), + ) + ], +) + +#! - name: Minus DTLZ +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/TEVC.2016.2587749 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: Variant of DTLZ that minimises the inverse of the base DTLZ functions +# FIXME: implementation unknown. +things["suite_minus_dtlz"] = Suite( + name="Minus DTLZ", + description="Variant of DTLZ that minimises the inverse of the base DTLZ functions", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + references=[ + Reference( + title="Minus DTLZ / Minus WFG", + authors=[], + link=Link(url="https://doi.org/10.1109/TEVC.2016.2587749"), + ) + ], +) + +#! - name: Minus WFG +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/TEVC.2016.2587749 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: Variant of WFG that minimises the inverse of the base WFG functions +# FIXME: implementation unknown. +things["suite_minus_wfg"] = Suite( + name="Minus WFG", + description="Variant of WFG that minimises the inverse of the base WFG functions", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + references=[ + Reference( + title="Minus DTLZ / Minus WFG", + authors=[], + link=Link(url="https://doi.org/10.1109/TEVC.2016.2587749"), + ) + ], +) + +#! - name: L1-ZDT +#! suite/generator/single: suite +#! objectives: '2' +#! dimensionality: scalable +#! variable type: continuous;binary +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/1143997.1144179 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: 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 +# FIXME: implementation unknown. +things["suite_l1_zdt"] = Suite( + name="L1-ZDT", + description="Variant of ZDT with linkages between variables within groups", + objectives={2}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="binary", dim=ValueRange(min=1)), + ], + references=[ + Reference( + title="Linkage ZDT/DTLZ variants", + authors=[], + link=Link(url="https://doi.org/10.1145/1143997.1144179"), + ) + ], +) + +#! - name: L2-ZDT +#! suite/generator/single: suite +#! objectives: '2' +#! dimensionality: scalable +#! variable type: continuous;binary +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/1143997.1144179 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: Variant of ZDT with linkages between all variables; Linear recombination +#! operators can potentially take advantage of the problem structure +# FIXME: implementation unknown. +things["suite_l2_zdt"] = Suite( + name="L2-ZDT", + description="Variant of ZDT with linkages between all variables", + objectives={2}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="binary", dim=ValueRange(min=1)), + ], + references=[ + Reference( + title="Linkage ZDT/DTLZ variants", + authors=[], + link=Link(url="https://doi.org/10.1145/1143997.1144179"), + ) + ], +) + +#! - name: L3-ZDT +#! suite/generator/single: suite +#! objectives: '2' +#! dimensionality: scalable +#! variable type: continuous;binary +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/1143997.1144179 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: Variant of L2-ZDT using a mapping to prevent linear recombination operators +#! from potentially taking advantage of the problem structure +# FIXME: implementation unknown. +things["suite_l3_zdt"] = Suite( + name="L3-ZDT", + description="Variant of L2-ZDT with anti-linkage mapping", + objectives={2}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="binary", dim=ValueRange(min=1)), + ], + references=[ + Reference( + title="Linkage ZDT/DTLZ variants", + authors=[], + link=Link(url="https://doi.org/10.1145/1143997.1144179"), + ) + ], +) + +#! - name: L2-DTLZ +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/1143997.1144179 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: Variant of DTLZ2 and DTLZ3 with linkages between all variables; Linear +#! recombination operators can potentially take advantage of the problem structure +# FIXME: implementation unknown. +things["suite_l2_dtlz"] = Suite( + name="L2-DTLZ", + description="Variant of DTLZ2/DTLZ3 with linkages between all variables", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + references=[ + Reference( + title="Linkage ZDT/DTLZ variants", + authors=[], + link=Link(url="https://doi.org/10.1145/1143997.1144179"), + ) + ], +) + +#! - name: L3-DTLZ +#! suite/generator/single: suite +#! objectives: 2+ +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/1143997.1144179 +#! implementation: '?' +#! source (real-world/artificial): '' +#! textual description: Variant of L2-DTLZ using a mapping to prevent linear recombination operators +#! from potentially taking advantage of the problem structure +# FIXME: implementation unknown. +things["suite_l3_dtlz"] = Suite( + name="L3-DTLZ", + description="Variant of L2-DTLZ with anti-linkage mapping", + # FIXME: original "2+" - truncated to 2..10. + objectives=set(range(2, 11)), + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + references=[ + Reference( + title="Linkage ZDT/DTLZ variants", + authors=[], + link=Link(url="https://doi.org/10.1145/1143997.1144179"), + ) + ], +) + +#! - name: CEC2018 DT - CEC2018 Competition on Dynamic Multiobjective Optimisation +#! suite/generator/single: suite +#! objectives: 2 or 3 +#! dimensionality: scalable? +#! variable type: '?' +#! constraints: 'no' +#! dynamic: 'yes' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://www.academia.edu/download/94499025/TR-CEC2018-DMOP-Competition.pdf +#! implementation: https://pymoo.org/problems/dynamic/df.html +#! source (real-world/artificial): artificial +#! textual description: '14 problems. Time-dependent: Pareto front/Pareto set geometry; +#! irregular Pareto front shapes; variable-linkage; number of disconnected Pareto +#! front segments; etc.' +# FIXME: variable type unknown. +things["suite_cec2018_dt"] = Suite( + name="CEC2018 DT", + long_name="CEC2018 Competition on Dynamic Multiobjective Optimisation", + description="14 problems. Time-dependent: Pareto front/Pareto set geometry; irregular Pareto front shapes; variable-linkage; number of disconnected Pareto front segments; etc.", + objectives={2, 3}, + variables=[Variable(type="unknown", dim=ValueRange(min=1))], + dynamic_type={"dynamic"}, + source={"artificial"}, + references=[ + Reference( + title="CEC2018 DMOP Competition TR", + authors=[], + link=Link(url="https://www.academia.edu/download/94499025/TR-CEC2018-DMOP-Competition.pdf"), + ) + ], + implementations={"impl_pymoo"}, +) + +#! - name: MODAct - multiobjective design of actuators +#! suite/generator/single: suite +#! objectives: 2 3 4 or 5 +#! dimensionality: '20' +#! variable type: mixed; integer and continuous +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/TEVC.2020.3020046 +#! implementation: https://pymoo.org/problems/constrained/modact.html +#! source (real-world/artificial): real-world +#! textual description: Realistic Constrained Multi-Objective Optimization Benchmark +#! Problems from Design. Need the https://github.com/epfl-lamd/modact package installed; evaluation +#! times around 20ms +things["impl_modact"] = Implementation( + name="modact", + description="EPFL-LAMD modact package", + evaluation_time="20ms", + links=[Link(type="repository", url="https://github.com/epfl-lamd/modact")], +) +things["suite_modact"] = Suite( + name="MODAct", + long_name="multiobjective design of actuators", + description="Realistic Constrained Multi-Objective Optimization Benchmark Problems from Design.", + objectives={2, 3, 4, 5}, + variables=[ + Variable(type="continuous", dim=20), + Variable(type="integer", dim=20), + ], + constraints=[Constraint(hard="yes")], + source={"real-world"}, + references=[ + Reference( + title="MODAct", + authors=[], + link=Link(url="https://doi.org/10.1109/TEVC.2020.3020046"), + ) + ], + implementations={"impl_modact", "impl_pymoo"}, +) + +#! - name: IOHClustering +#! suite/generator/single: suite; generator +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no ' +#! reference: https://arxiv.org/pdf/2505.09233 +#! implementation: https://github.com/IOHprofiler/IOHClustering +#! source (real-world/artificial): artificial, but based on real data +#! textual description: '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' +things["impl_iohclustering"] = Implementation( + name="IOHClustering", + description="Clustering-based optimization benchmark built on ML datasets", + links=[Link(type="repository", url="https://github.com/IOHprofiler/IOHClustering")], +) +things["suite_iohclustering"] = Suite( + name="IOHClustering", + description="Set of benchmark problems from clustering: optimization task is selecting cluster centers for a given set of data.", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + modality={"multimodal"}, + source={"artificial-from-real-data"}, + references=[ + Reference( + title="IOHClustering", + authors=[], + link=Link(url="https://arxiv.org/pdf/2505.09233"), + ) + ], + implementations={"impl_iohclustering"}, +) +things["gen_iohclustering"] = Generator( + name="IOHClustering", + description="Generator counterpart of the IOHClustering suite.", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + modality={"multimodal"}, + source={"artificial-from-real-data"}, + references=[ + Reference( + title="IOHClustering", + authors=[], + link=Link(url="https://arxiv.org/pdf/2505.09233"), + ) + ], + implementations={"impl_iohclustering"}, +) + +#! - name: GNBG-II +#! suite/generator/single: suite; generator +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://dl.acm.org/doi/pdf/10.1145/3712255.3734271 +#! implementation: https://github.com/rohitsalgotra/GNBG-II +#! source (real-world/artificial): artificial +#! textual description: Generalized Numerical Benchmark Generator (version 2). Also in IOH https://github.com/IOHprofiler/IOHGNBG +things["impl_gnbg_ii"] = Implementation( + name="GNBG-II", + description="Generalized Numerical Benchmark Generator version 2", + links=[Link(type="repository", url="https://github.com/rohitsalgotra/GNBG-II")], +) +things["impl_iohgnbg"] = Implementation( + name="IOHGNBG", + description="IOHprofiler version of GNBG", + links=[Link(type="repository", url="https://github.com/IOHprofiler/IOHGNBG")], +) +things["suite_gnbg_ii"] = Suite( + name="GNBG-II", + description="Generalized Numerical Benchmark Generator (version 2). Also available in IOH.", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + source={"artificial"}, + references=[ + Reference( + title="GNBG-II", + authors=[], + link=Link(url="https://dl.acm.org/doi/pdf/10.1145/3712255.3734271"), + ) + ], + implementations={"impl_gnbg_ii", "impl_iohgnbg"}, +) +things["gen_gnbg_ii"] = Generator( + name="GNBG-II", + description="Generator counterpart of GNBG-II.", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + source={"artificial"}, + references=[ + Reference( + title="GNBG-II", + authors=[], + link=Link(url="https://dl.acm.org/doi/pdf/10.1145/3712255.3734271"), + ) + ], + implementations={"impl_gnbg_ii", "impl_iohgnbg"}, +) + +#! - name: GNBG +#! suite/generator/single: suite; generator +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://arxiv.org/abs/2312.07083 +#! implementation: https://github.com/Danial-Yazdani/GNBG-Generator +#! source (real-world/artificial): artificial +#! textual description: Generalized Numerical Benchmark Generator +things["impl_gnbg"] = Implementation( + name="GNBG Generator", + description="Generalized Numerical Benchmark Generator", + links=[Link(type="repository", url="https://github.com/Danial-Yazdani/GNBG-Generator")], +) +things["suite_gnbg"] = Suite( + name="GNBG", + description="Generalized Numerical Benchmark Generator", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + source={"artificial"}, + references=[ + Reference( + title="GNBG", + authors=[], + link=Link(url="https://arxiv.org/abs/2312.07083"), + ) + ], + implementations={"impl_gnbg"}, +) +things["gen_gnbg"] = Generator( + name="GNBG", + description="Generator counterpart of GNBG.", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + source={"artificial"}, + references=[ + Reference( + title="GNBG", + authors=[], + link=Link(url="https://arxiv.org/abs/2312.07083"), + ) + ], + implementations={"impl_gnbg"}, +) + +#! - name: DynamicBinVal +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: binary +#! constraints: 'no' +#! dynamic: 'yes' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://arxiv.org/pdf/2404.15837 +#! implementation: https://github.com/IOHprofiler/IOHexperimenter +#! source (real-world/artificial): artificial +#! textual description: Four versions of the dynamic binary value problem +things["suite_dynamicbinval"] = Suite( + name="DynamicBinVal", + description="Four versions of the dynamic binary value problem", + objectives={1}, + variables=[Variable(type="binary", dim=ValueRange(min=1))], + dynamic_type={"dynamic"}, + source={"artificial"}, + references=[ + Reference( + title="DynamicBinVal", + authors=[], + link=Link(url="https://arxiv.org/pdf/2404.15837"), + ) + ], + implementations={"impl_iohexperimenter"}, +) + +#! - name: PBO +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: binary +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://dl.acm.org/doi/pdf/10.1145/3319619.3326810 +#! implementation: https://github.com/IOHprofiler/IOHexperimenter +#! source (real-world/artificial): artificial +#! textual description: Suite of 25 binary optimization problems +things["suite_pbo"] = Suite( + name="PBO", + description="Suite of 25 binary optimization problems", + objectives={1}, + variables=[Variable(type="binary", dim=ValueRange(min=1))], + source={"artificial"}, + references=[ + Reference( + title="PBO benchmarks", + authors=[], + link=Link(url="https://dl.acm.org/doi/pdf/10.1145/3319619.3326810"), + ) + ], + implementations={"impl_iohexperimenter"}, +) + +#! - name: W-model +#! suite/generator/single: generator +#! objectives: '1' +#! dimensionality: scalable +#! variable type: binary +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://dl.acm.org/doi/abs/10.1145/3205651.3208240?casa_token=S4U_Pi9f6MwAAAAA:U9ztNTPwmupT8K3GamWZfBL7-8fqjxPtr_kprv51vdwA-REsp0EyOFGa99BtbANb0XbqyrVg795hIw +#! implementation: https://github.com/thomasWeise/BBDOB_W_Model +#! source (real-world/artificial): artificial +#! textual description: Tunable generator for binary optimization based on several +#! difficulty features +things["impl_wmodel"] = Implementation( + name="BBDOB W-Model", + description="Tunable generator for binary optimization", + links=[Link(type="repository", url="https://github.com/thomasWeise/BBDOB_W_Model")], +) +things["gen_wmodel"] = Generator( + name="W-model", + description="Tunable generator for binary optimization based on several difficulty features", + objectives={1}, + variables=[Variable(type="binary", dim=ValueRange(min=1))], + source={"artificial"}, + references=[ + Reference( + title="W-model", + authors=[], + link=Link( + url="https://dl.acm.org/doi/abs/10.1145/3205651.3208240" + ), + ) + ], + implementations={"impl_wmodel"}, +) + +#! - name: Submodular Optimitzation +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: binary +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10254181 +#! implementation: https://github.com/IOHprofiler/IOHexperimenter +#! source (real-world/artificial): artificial +#! textual description: set of graph-based submodular optimization problems from 4 +#! problem types +things["suite_submodular"] = Suite( + name="Submodular Optimization", + description="set of graph-based submodular optimization problems from 4 problem types", + objectives={1}, + variables=[Variable(type="binary", dim=ValueRange(min=1))], + source={"artificial"}, + references=[ + Reference( + title="Submodular optimization benchmark", + authors=[], + link=Link(url="https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10254181"), + ) + ], + implementations={"impl_iohexperimenter"}, +) + +#! - name: CEC2013 +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://peerj.com/articles/cs-2671/CEC2013.pdf +#! implementation: https://github.com/P-N-Suganthan/CEC2013 +#! source (real-world/artificial): artificial +#! textual description: suite used for cec2013 competition. Also in IOH https://github.com/IOHprofiler/IOHexperimenter +things["impl_cec2013"] = Implementation( + name="CEC2013 reference code", + description="Suganthan's reference implementation", + links=[Link(type="repository", url="https://github.com/P-N-Suganthan/CEC2013")], +) +things["suite_cec2013"] = Suite( + name="CEC2013", + description="suite used for cec2013 competition. Also in IOH.", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + source={"artificial"}, + references=[ + Reference( + title="CEC2013 definitions", + authors=[], + link=Link(url="https://peerj.com/articles/cs-2671/CEC2013.pdf"), + ) + ], + implementations={"impl_cec2013", "impl_iohexperimenter"}, +) + +#! - name: CEC2022 +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: scalable +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '?' +#! multi-fidelity: 'no' +#! reference: https://github.com/P-N-Suganthan/2022-SO-BO/blob/main/CEC2022%20TR.pdf +#! implementation: https://github.com/P-N-Suganthan/2022-SO-BO +#! source (real-world/artificial): artificial +#! textual description: suite used for cec2022 competition. Also in IOH https://github.com/IOHprofiler/IOHexperimenter +things["impl_cec2022"] = Implementation( + name="CEC2022 reference code", + description="Suganthan's reference implementation", + links=[Link(type="repository", url="https://github.com/P-N-Suganthan/2022-SO-BO")], +) +things["suite_cec2022"] = Suite( + name="CEC2022", + description="suite used for cec2022 competition. Also in IOH.", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + source={"artificial"}, + references=[ + Reference( + title="CEC2022 TR", + authors=[], + link=Link(url="https://github.com/P-N-Suganthan/2022-SO-BO/blob/main/CEC2022%20TR.pdf"), + ) + ], + implementations={"impl_cec2022", "impl_iohexperimenter"}, +) + +#! - name: Onemax+Sphere / Zeromax+Sphere +#! suite/generator/single: single +#! objectives: '2' +#! dimensionality: scalable +#! variable type: binary and continuous;mixed; +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/3449726.3459521 +#! implementation: +#! source (real-world/artificial): 'artificial' +#! textual description: '' +# FIXME: no implementation provided. +things["fn_onemax_sphere_zeromax_sphere"] = Problem( + name="Onemax+Sphere / Zeromax+Sphere", + objectives={2}, + variables=[ + Variable(type="binary", dim=ValueRange(min=1)), + Variable(type="continuous", dim=ValueRange(min=1)), + ], + source={"artificial"}, + references=[ + Reference( + title="Onemax+Sphere / Zeromax+Sphere", + authors=[], + link=Link(url="https://doi.org/10.1145/3449726.3459521"), + ) + ], +) + +#! - name: Onemax+Sphere / DeceptiveTrap+RotatedEllipsoid +#! suite/generator/single: single +#! objectives: '2' +#! dimensionality: scalable +#! variable type: binary and continuous;mixed; +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/3449726.3459521 +#! implementation: +#! source (real-world/artificial): 'artificial' +#! textual description: '' +# FIXME: no implementation provided. +things["fn_onemax_sphere_deceptive_rotell"] = Problem( + name="Onemax+Sphere / DeceptiveTrap+RotatedEllipsoid", + objectives={2}, + variables=[ + Variable(type="binary", dim=ValueRange(min=1)), + Variable(type="continuous", dim=ValueRange(min=1)), + ], + source={"artificial"}, + references=[ + Reference( + title="Mixed-variable multi-objective test problems", + authors=[], + link=Link(url="https://doi.org/10.1145/3449726.3459521"), + ) + ], +) + +#! - name: InverseDeceptiveTrap+RotatedEllipsoid / DeceptiveTrap+RotatedEllipsoid +#! suite/generator/single: single +#! objectives: '2' +#! dimensionality: scalable +#! variable type: binary and continuous;mixed; +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: '' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1145/3449726.3459521 +#! implementation: +#! source (real-world/artificial): 'artificial' +#! textual description: '' +# FIXME: no implementation provided. +things["fn_invdeceptive_deceptive_rotell"] = Problem( + name="InverseDeceptiveTrap+RotatedEllipsoid / DeceptiveTrap+RotatedEllipsoid", + objectives={2}, + variables=[ + Variable(type="binary", dim=ValueRange(min=1)), + Variable(type="continuous", dim=ValueRange(min=1)), + ], + source={"artificial"}, + references=[ + Reference( + title="Mixed-variable multi-objective test problems", + authors=[], + link=Link(url="https://doi.org/10.1145/3449726.3459521"), + ) + ], +) + +#! - name: PorkchopPlotInterplanetaryTrajectory +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: 2 +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1109/CEC65147.2025.11042973 +#! implementation: https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world +#! source (real-world/artificial): 'real-world' +#! textual description: '' +things["impl_transfer_rf_bbob_rw"] = Implementation( + name="Transfer Random Forests BBOB Real-world", + description="Real-world BBOB-like problem implementations (Porkchop, KinematicsRobotArm)", + links=[ + Link( + type="repository", + url="https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world", + ) + ], +) +things["suite_porkchop"] = Suite( + name="PorkchopPlotInterplanetaryTrajectory", + objectives={1}, + variables=[Variable(type="continuous", dim=2)], + modality={"multimodal"}, + source={"real-world"}, + references=[ + Reference( + title="Porkchop plot interplanetary trajectory benchmark", + authors=[], + link=Link(url="https://doi.org/10.1109/CEC65147.2025.11042973"), + ) + ], + implementations={"impl_transfer_rf_bbob_rw"}, +) + +#! - name: KinematicsRobotArm +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: 21 +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'no' +#! multi-fidelity: 'no' +#! reference: https://doi.org/10.1023/A:1013258808932 +#! implementation: https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world +#! source (real-world/artificial): 'real-world' +#! textual description: '' +things["suite_kinematics_robotarm"] = Suite( + name="KinematicsRobotArm", + objectives={1}, + variables=[Variable(type="continuous", dim=21)], + modality={"unimodal"}, + source={"real-world"}, + references=[ + Reference( + title="Kinematics of a robot arm", + authors=[], + link=Link(url="https://doi.org/10.1023/A:1013258808932"), + ) + ], + implementations={"impl_transfer_rf_bbob_rw"}, +) + +#! - name: VehicleDynamics +#! suite/generator/single: suite +#! objectives: '1' +#! dimensionality: 2 +#! variable type: continuous +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! reference: https://www.scitepress.org/Papers/2023/121580/121580.pdf +#! implementation: https://zenodo.org/records/8307853 +#! source (real-world/artificial): 'real-world' +#! textual description: '' +things["impl_vehicle_dynamics"] = Implementation( + name="VehicleDynamics (Zenodo)", + description="Zenodo archive for the vehicle dynamics benchmark", + links=[Link(type="archive", url="https://zenodo.org/records/8307853")], +) +things["suite_vehicle_dynamics"] = Suite( + name="VehicleDynamics", + objectives={1}, + variables=[Variable(type="continuous", dim=2)], + modality={"multimodal"}, + source={"real-world"}, + references=[ + Reference( + title="VehicleDynamics benchmark", + authors=[], + link=Link(url="https://www.scitepress.org/Papers/2023/121580/121580.pdf"), + ) + ], + implementations={"impl_vehicle_dynamics"}, +) + +#! - name: MECHBench +#! suite/generator/single: Problem Suite +#! variable type: Continuous +#! dimensionality: scalable' +#! objectives: '1' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! source (real-world/artificial): Real-World Application +#! implementation: https://github.com/BayesOptApp/MECHBench +#! textual description: 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. +#! reference: https://arxiv.org/abs/2511.10821 +#! other info: +#! partial evaluations: 'no' +#! full name: MECHBench +#! constraint properties: Hard Constraints +#! number of constraints: 1 or 2 +#! description of multimodality: Unstructured or non isotropic multimodality +#! key challenges / characteristics: Embeds physical simulations and is flexible +#! and modular +#! scientific motivation: Bridge the black-box optimization techniques to a Mechanical +#! Design Problem which require these kinds of algorithms +#! limitations: The models do not include fracture or damage mechanics, just plasticity. +#! implementation languages: Python +#! approximate evaluation time: Times -> from 1 minute to 7 minutes +things["impl_mechbench"] = Implementation( + name="MECHBench", + description="Structural mechanics design optimization benchmark", + language="Python", + evaluation_time="1-7 minutes", + links=[Link(type="repository", url="https://github.com/BayesOptApp/MECHBench")], +) +things["suite_mechbench"] = Suite( + name="MECHBench", + long_name="MECHBench", + description="Set of problems inspired by Structural Mechanics Design Optimization. Embeds physical simulations (plasticity only, no fracture/damage). Unstructured/non-isotropic multimodality.", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + constraints=[Constraint(hard="yes", number={1, 2})], + modality={"multimodal"}, + allows_partial_evaluation="no", + source={"real-world"}, + references=[ + Reference( + title="MECHBench", + authors=[], + link=Link(url="https://arxiv.org/abs/2511.10821"), + ) + ], + implementations={"impl_mechbench"}, +) + +#! - name: EXPObench +#! suite/generator/single: Problem Suite +#! variable type: Continuous, Integer, Categorical, Conditional +#! dimensionality: 10 to 135 +#! objectives: '1' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'yes' +#! multimodal: Unknown +#! multi-fidelity: 'no' +#! source (real-world/artificial): Real-World Application +#! implementation: https://github.com/AlgTUDelft/ExpensiveOptimBenchmark +#! textual description: Wind farm layout optimization, gas filter design, pipe shape +#! optimization, hyperparameter tuning, and hospital simulation +#! reference: https://doi.org/10.1016/j.asoc.2023.110744 +#! other info: +#! partial evaluations: 'no' +#! full name: EXPensive Optimization benchmark library +#! constraint properties: Hard Constraints, Soft Constraints, Box Constraints, only +#! box constraints implemented, others appear as penalty in objective +#! number of constraints: 2 per variable (box), other constraints unknown (simulator +#! fails) +#! form of noise model: real-life (unknown) +#! type of noise space: Observational +#! key challenges / characteristics: Expensive objectives +#! scientific motivation: Address the lack of real-life expensive benchmarks +#! limitations: single-objective only, constraints are handled naively (penalty in +#! objective), no parallelization +#! implementation languages: Python +#! approximate evaluation time: 2 to 80 seconds +# FIXME: "Conditional" variable type has no schema representation; box number expressed as 2 per variable cannot be encoded. +things["impl_expobench"] = Implementation( + name="EXPObench", + description="EXPensive Optimization benchmark library (wind farm layout, gas filter design, pipe shape, hyperparameter tuning, hospital simulation)", + language="Python", + evaluation_time="2 to 80 seconds", + links=[Link(type="repository", url="https://github.com/AlgTUDelft/ExpensiveOptimBenchmark")], +) +things["suite_expobench"] = Suite( + name="EXPObench", + long_name="EXPensive Optimization benchmark library", + description="Wind farm layout optimization, gas filter design, pipe shape optimization, hyperparameter tuning, and hospital simulation", + objectives={1}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=10, max=135)), + Variable(type="integer", dim=ValueRange(min=10, max=135)), + Variable(type="categorical", dim=ValueRange(min=10, max=135)), + ], + constraints=[ + Constraint(type="box", hard="yes"), + Constraint(hard="some"), + ], + noise_type={"observational", "real-life"}, + allows_partial_evaluation="no", + source={"real-world"}, + references=[ + Reference( + title="EXPObench", + authors=[], + link=Link(url="https://doi.org/10.1016/j.asoc.2023.110744"), + ) + ], + implementations={"impl_expobench"}, +) + +#! - name: Gasoline direct injection engine design +#! suite/generator/single: Single Problem +#! variable type: Continuous, Ordinal +#! dimensionality: '7' +#! objectives: '2' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: Unknown +#! multi-fidelity: 'yes' +#! source (real-world/artificial): Real-World Application +#! implementation: https://doi.org/10.1016/j.ejor.2022.08.032 +#! textual description: ... +#! other info: +#! partial evaluations: Unknown +#! constraint properties: Hard Constraints, Soft Constraints +#! number of constraints: '5' +#! key challenges / characteristics: Expensive +#! limitations: Proprietary +#! implementation languages: Matlab Simulink and Wave RT co-simulation +# FIXME: "Ordinal" variable type not in schema; falling back to integer. +things["impl_gasoline"] = Implementation( + name="Gasoline direct injection engine design", + description="Proprietary Matlab Simulink + Wave RT co-simulation", + language="Matlab Simulink / Wave RT", + links=[Link(type="paper", url="https://doi.org/10.1016/j.ejor.2022.08.032")], +) +things["fn_gasoline"] = Problem( + name="Gasoline direct injection engine design", + description="Multi-objective optimization to minimize fuel consumption and NOx emissions over a two-minute dynamic duty cycle, subject to five constraints (turbine inlet temperature, knock occurrences, peak cylinder pressure, peak cylinder pressure rise, total work). Seven decision variables cover hardware choices and engine control parameters.", + objectives={2}, + variables=[ + Variable(type="continuous", dim=7), + Variable(type="integer", dim=7), + ], + constraints=[Constraint(hard="yes", number=5)], + fidelity_levels={1, 2}, + source={"real-world"}, + references=[ + Reference( + title="Gasoline direct injection engine design", + authors=[], + link=Link(url="https://doi.org/10.1016/j.ejor.2022.08.032"), + ) + ], + implementations={"impl_gasoline"}, +) + +#! - name: BEACON +#! suite/generator/single: Generator +#! variable type: Continuous +#! dimensionality: scalable +#! objectives: '2' +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! source (real-world/artificial): Artificially Generated +#! implementation: https://github.com/Stebbet/BEACON/ +#! textual description: Generator for bi-objective benchmark problems with explicitly +#! controlled correlations in continuous spaces. +#! reference: https://dl.acm.org/doi/10.1145/3712255.3734303 +#! other info: +#! partial evaluations: 'no' +#! full name: Continuous Bi-objective Benchmark problems with Explicit Adjustable +#! COrrelatioN control +#! constraint properties: Box Constraints +#! number of constraints: '0' +#! description of multimodality: Random +#! key challenges / characteristics: Multimodal, different correlations among objectives +#! scientific motivation: Controlled correlation among objectives +#! limitations: No analytical Pareto front, only bi-objective +#! implementation languages: Python +#! approximate evaluation time: Negligible +things["impl_beacon"] = Implementation( + name="BEACON", + description="Continuous Bi-objective Benchmark with Explicit Adjustable COrrelatioN control", + language="Python", + evaluation_time="negligible", + links=[Link(type="repository", url="https://github.com/Stebbet/BEACON/")], +) +things["gen_beacon"] = Generator( + name="BEACON", + long_name="Continuous Bi-objective Benchmark problems with Explicit Adjustable COrrelatioN control", + description="Generator for bi-objective benchmark problems with explicitly controlled correlations in continuous spaces. Multimodal with random structure.", + objectives={2}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + constraints=[Constraint(type="box", hard="yes", number=0)], + modality={"multimodal"}, + allows_partial_evaluation="no", + source={"artificial"}, + references=[ + Reference( + title="BEACON", + authors=[], + link=Link(url="https://dl.acm.org/doi/10.1145/3712255.3734303"), + ) + ], + implementations={"impl_beacon"}, +) + +#! - name: TulipaEnergy +#! suite/generator/single: Problem Suite +#! variable type: Continuous +#! dimensionality: scalable +#! objectives: '1' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'yes' +#! multimodal: 'no' +#! multi-fidelity: 'yes' +#! source (real-world/artificial): Real-World Application +#! implementation: https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/ +#! textual description: Determine the optimal investment and operation decisions for +#! different types of assets in the energy system ... minimizing loss of load. +#! reference: See https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/40-scientific-foundation/45-scientific-references +#! other info: +#! partial evaluations: Unknown +#! full name: TulipaEnergyModel.jl +#! constraint properties: Hard Constraints, Soft Constraints +#! number of constraints: millions +#! type of dynamicism: none +#! form of noise model: depends on input — still working on stochastic inputs +#! type of noise space: Parameter +#! key challenges / characteristics: modeled as a potentially very large linear program +#! scientific motivation: new techniques for solving large whitebox linear optimization problems +#! limitations: not yet stochastic +#! implementation languages: Julia / JMP +#! approximate evaluation time: from minutes to hours +#! links to usage examples: https://github.com/TulipaEnergy/Tulipa-OBZ-CaseStudy +# FIXME: "number of constraints: millions" cannot be expressed precisely. +things["impl_tulipa"] = Implementation( + name="TulipaEnergyModel.jl", + description="Large linear program for optimal investment and operation of energy systems", + language="Julia / JuMP", + evaluation_time="minutes to hours", + links=[ + Link(type="website", url="https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/"), + Link(type="example", url="https://github.com/TulipaEnergy/Tulipa-OBZ-CaseStudy"), + ], +) +things["suite_tulipa_energy"] = Suite( + name="TulipaEnergy", + long_name="TulipaEnergyModel.jl", + description="Determine the optimal investment and operation decisions for different assets in the energy system (production, consumption, conversion, storage, transport) while minimizing loss of load. Modelled as a potentially very large linear program with multiple fidelity levels.", + objectives={1}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + constraints=[Constraint(hard="yes"), Constraint(hard="some")], + noise_type={"parameter"}, + modality={"unimodal"}, + fidelity_levels={1, 2}, + source={"real-world"}, + references=[ + Reference( + title="TulipaEnergyModel.jl scientific references", + authors=[], + link=Link( + url="https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/40-scientific-foundation/45-scientific-references" + ), + ) + ], + implementations={"impl_tulipa"}, +) + +#! - name: ATO +#! suite/generator/single: Single Problem +#! variable type: Continuous +#! dimensionality: '10' +#! objectives: '2' +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'no' +#! multi-fidelity: 'no' +#! source (real-world/artificial): Real-World Application +#! implementation: '-' +#! textual description: 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. +#! other info: +#! partial evaluations: 'no' +# FIXME: no implementation available. +things["fn_ato"] = Problem( + name="ATO", + description="Parameters of the Modules of the Automatic Train Operation are optimized; two objectives: minimizing energy consumption and minimizing driving duration.", + objectives={2}, + variables=[Variable(type="continuous", dim=10)], + modality={"unimodal"}, + allows_partial_evaluation="no", + source={"real-world"}, +) + +#! - name: Brachytherapy treatment planning +#! suite/generator/single: Problem Suite +#! variable type: Continuous +#! dimensionality: 100-500 +#! objectives: 2-3 +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'yes' +#! source (real-world/artificial): Real-World Application +#! textual description: Treatment planning for internal radiation therapy +#! reference: https://www.sciencedirect.com/science/article/pii/S1538472123016781 +#! other info: +#! partial evaluations: 'yes' +#! full name: Brachytherapy treatment planning +#! constraint properties: Hard Constraints +#! number of constraints: scalable +#! key challenges / characteristics: Multi-objective; aggregated objectives +#! limitations: No public source code +# FIXME: no public source code; no implementation URL. +things["suite_brachytherapy"] = Suite( + name="Brachytherapy treatment planning", + long_name="Brachytherapy treatment planning", + description="Treatment planning for internal radiation therapy. Multi-objective with aggregated objectives; no public source code.", + objectives={2, 3}, + variables=[Variable(type="continuous", dim=ValueRange(min=100, max=500))], + constraints=[Constraint(hard="yes", number=ValueRange(min=1))], + modality={"multimodal"}, + fidelity_levels={1, 2}, + allows_partial_evaluation="yes", + source={"real-world"}, + references=[ + Reference( + title="Brachytherapy treatment planning", + authors=[], + link=Link(url="https://www.sciencedirect.com/science/article/pii/S1538472123016781"), + ) + ], +) + +#! - name: FleetOpt +#! suite/generator/single: Single Problem +#! variable type: Integer +#! dimensionality: 'Upper level: 54; lower level: 13208' +#! objectives: '1' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: Unknown +#! multi-fidelity: 'no' +#! source (real-world/artificial): Real-World Application +#! implementation: 'Not public: was done for real client with their private data' +#! textual description: Healthcare organisation in the UK ... +#! reference: https://dl.acm.org/doi/abs/10.1145/3638530.3664137 +#! other info: +#! partial evaluations: 'yes' +# FIXME: bilevel dimensionality (upper 54 / lower 13208) expressed as {54, 13208}; impl not public. +things["fn_fleetopt"] = Problem( + name="FleetOpt", + description="UK healthcare organisation fleet optimisation: reduce the fleet of non-emergency healthcare trip vehicles while still ensuring all trips can be covered. Bilevel: upper level 54 vars, lower level 13208 vars.", + objectives={1}, + variables=[Variable(type="integer", dim={54, 13208})], + constraints=[Constraint(hard="yes")], + allows_partial_evaluation="yes", + source={"real-world"}, + references=[ + Reference( + title="FleetOpt", + authors=[], + link=Link(url="https://dl.acm.org/doi/abs/10.1145/3638530.3664137"), + ) + ], +) + +#! - name: Building spatial design +#! suite/generator/single: Single Problem +#! variable type: Continuous, Boolean +#! dimensionality: scalable depending on problem size (e.g. 90 for) +#! objectives: '2' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: Unknown +#! multi-fidelity: 'no' +#! source (real-world/artificial): Real-World Application +#! implementation: https://github.com/TUe-excellent-buildings/BSO-toolbox +#! textual description: 'Optimise the spatial layout of a building to: minimise energy +#! consumption for climate control, and minimise the strain on the structure' +#! reference: https://hdl.handle.net/1887/81789 +#! other info: +#! partial evaluations: 'no' +#! constraint properties: Hard Constraints, Box Constraints, Permutation Constraints +#! number of constraints: 2065 (as example, depends on problem size) +#! implementation languages: C++ +#! approximate evaluation time: Roughly 1 second per evaluation for the smallest +#! considered design, and roughly 40 seconds for the larger designs we considered. +# FIXME: Permutation Constraints not representable in ConstraintType; using multiple Constraint objects. +things["impl_bso_toolbox"] = Implementation( + name="BSO-toolbox", + description="Building Spatial Design toolbox (TU/e)", + language="C++", + evaluation_time="~1s (smallest) to ~40s (larger)", + links=[Link(type="repository", url="https://github.com/TUe-excellent-buildings/BSO-toolbox")], +) +things["fn_building_spatial"] = Problem( + name="Building spatial design", + description="Optimise the spatial layout of a building to minimise energy consumption for climate control and minimise the strain on the structure. Many hard constraints; mixed-variable (continuous+binary); expensive evaluations.", + objectives={2}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="binary", dim=ValueRange(min=1)), + ], + constraints=[ + Constraint(hard="yes"), + Constraint(type="box", hard="yes"), + ], + allows_partial_evaluation="no", + source={"real-world"}, + references=[ + Reference( + title="Building spatial design", + authors=[], + link=Link(url="https://hdl.handle.net/1887/81789"), + ) + ], + implementations={"impl_bso_toolbox"}, +) + +#! - name: Electric Motor Design Optimization +#! suite/generator/single: Single Problem +#! variable type: Continuous, Integer +#! dimensionality: '13' +#! objectives: '1' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'yes' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! source (real-world/artificial): Real-World Application +#! implementation: Implementation not freely available +#! textual description: The goal is to find a design of a synchronous electric motor +#! for power steering systems that minimizes costs and satisfies all constraints. +#! reference: https://dis.ijs.si/tea/Publications/Tusar23Multistep.pdf (paper in Slovene) +#! other info: +#! partial evaluations: 'no' +#! full name: Electric Motor Design Optimization +#! constraint properties: Hard Constraints, Soft Constraints, Box Constraints +#! number of constraints: '12' +#! description of multimodality: Constraints are multimodal +#! key challenges / characteristics: Time-consuming solution evaluation, highly-constrained +#! scientific motivation: Challenging to find good solutions in a limited time +#! limitations: 'Unavailability ...' +#! implementation languages: Python +#! approximate evaluation time: 8 minutes +#! general: This is not an available problem, but could be interesting to show to +#! researchers which difficulties appear in real-world problems +things["impl_emdo"] = Implementation( + name="Electric Motor Design Optimization", + description="Not publicly available", + language="Python", + evaluation_time="8 minutes", +) +things["fn_emdo"] = Problem( + name="Electric Motor Design Optimization", + long_name="Electric Motor Design Optimization", + description="""# Goal +Find a design of a synchronous electric motor for power steering systems that minimizes costs and satisfies all constraints. + +# Motivation +Challenging to find good solutions in a limited time. + +# Key Challenges +* Time-consuming solution evaluation +* Highly-constrained problem +* Constraints are multimodal + +This is not an available problem, but could be interesting to show to researchers which difficulties appear in real-world problems.""", + objectives={1}, + variables=[ + Variable(type="continuous", dim=13), + Variable(type="integer", dim=13), + ], + constraints=[ + Constraint(hard="yes", number=12), + Constraint(hard="some"), + Constraint(type="box", hard="yes"), + ], + noise_type={"noisy"}, + modality={"multimodal"}, + allows_partial_evaluation="no", + source={"real-world"}, + references=[ + Reference( + title="A Multi-Step Evaluation Process in Electric Motor Design", + authors=["Tea Tušar", "Peter Korošec", "Bogdan Filipič"], + link=Link(url="https://dis.ijs.si/tea/Publications/Tusar23Multistep.pdf"), + ) + ], + implementations={"impl_emdo"}, +) + +#! - name: BONO-Bench +#! suite/generator/single: Generator +#! variable type: Continuous +#! dimensionality: scalable +#! objectives: '2' +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! source (real-world/artificial): Artificially Generated +#! implementation: https://github.com/schaepermeier/bonobench +#! textual description: 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. +#! other info: +#! partial evaluations: 'no' +#! full name: Bi-objective Numerical Optimization Benchmark (BONO-Bench) +#! constraint properties: Box Constraints +#! implementation languages: Python +things["impl_bonobench"] = Implementation( + name="BONO-Bench", + description="Bi-objective Numerical Optimization Benchmark (BONO-Bench)", + language="Python", + links=[Link(type="repository", url="https://github.com/schaepermeier/bonobench")], +) +things["gen_bono_bench"] = Generator( + name="BONO-Bench", + long_name="Bi-objective Numerical Optimization Benchmark", + description="Bi-objective problem generator and suite with scalable continuous decision space. Features complex problem properties and Pareto front approximations with error guarantees for the hypervolume and exact R2 indicators.", + objectives={2}, + variables=[Variable(type="continuous", dim=ValueRange(min=1))], + constraints=[Constraint(type="box", hard="yes")], + modality={"multimodal"}, + allows_partial_evaluation="no", + source={"artificial"}, + implementations={"impl_bonobench"}, +) + +#! - name: RandOptGen +#! suite/generator/single: Generator +#! variable type: Continuous, Integer, Boolean +#! dimensionality: scalable +#! objectives: scalable +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! source (real-world/artificial): Artificially Generated +#! implementation: https://github.com/MALEO-research-group/RandOptGen +#! textual description: 'RandOptGen: A Unified Random Problem Generator for Single-and +#! Multi-Objective Optimization Problems with Mixed-Variable Input Spaces' +#! other info: +#! partial evaluations: 'no' +#! full name: RandOptGen +#! implementation languages: Python +#! approximate evaluation time: milliseconds +#! links to usage examples: https://doi.org/10.1145/3712256.3726478 +things["impl_randoptgen"] = Implementation( + name="RandOptGen", + description="Unified Random Problem Generator for Single- and Multi-Objective Optimization with Mixed-Variable Input Spaces", + language="Python", + evaluation_time="milliseconds", + links=[ + Link(type="repository", url="https://github.com/MALEO-research-group/RandOptGen"), + Link(type="example", url="https://doi.org/10.1145/3712256.3726478"), + ], +) +things["gen_randoptgen"] = Generator( + name="RandOptGen", + long_name="RandOptGen", + description="A Unified Random Problem Generator for Single- and Multi-Objective Optimization Problems with Mixed-Variable Input Spaces.", + # FIXME: original "scalable" - truncated to 1..10. + objectives=set(range(1, 11)), + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="integer", dim=ValueRange(min=1)), + Variable(type="binary", dim=ValueRange(min=1)), + ], + modality={"multimodal"}, + allows_partial_evaluation="no", + source={"artificial"}, + implementations={"impl_randoptgen"}, +) + +#! - name: CUTEr +#! suite/generator/single: Problem Suite +#! variable type: Continuous, Integer, Boolean +#! dimensionality: scalable +#! objectives: '1' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: Unknown +#! multi-fidelity: 'no' +#! source (real-world/artificial): Artificially Generated +#! implementation: Not Found +#! textual description: A constrained and unconstrained testing environment +#! reference: https://dl.acm.org/doi/10.1145/962437.962439 +#! other info: +#! partial evaluations: 'no' +# FIXME: implementation not found. +things["suite_cuter"] = Suite( + name="CUTEr", + description="A constrained and unconstrained testing environment.", + objectives={1}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="integer", dim=ValueRange(min=1)), + Variable(type="binary", dim=ValueRange(min=1)), + ], + constraints=[Constraint(hard="yes")], + allows_partial_evaluation="no", + source={"artificial"}, + references=[ + Reference( + title="CUTEr", + authors=[], + link=Link(url="https://dl.acm.org/doi/10.1145/962437.962439"), + ) + ], +) + +#! - name: CUTEst +#! suite/generator/single: Problem Suite +#! variable type: Continuous, Integer, Boolean +#! dimensionality: scalable +#! objectives: '1' +#! constraints: 'yes' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: 'yes' +#! multi-fidelity: 'no' +#! source (real-world/artificial): Artificially Generated +#! implementation: https://github.com/jfowkes/pycutest +#! textual description: The Constrained and Unconstrained Testing Environment with +#! safe threads (CUTEst) for optimization software +#! reference: https://link.springer.com/article/10.1007/s10589-014-9687-3 +#! other info: +#! partial evaluations: 'no' +#! full name: 'Constrained and Unconstrained Testing Environment with safe threads ' +#! constraint properties: Soft Constraints, Box Constraints +#! number of constraints: scalable +#! implementation languages: Python, C++, Fortran +#! general: 'Python implementation: https://github.com/jfowkes/pycutest' +things["impl_pycutest"] = Implementation( + name="pycutest", + description="Python interface to CUTEst", + language="Python / C++ / Fortran", + links=[Link(type="repository", url="https://github.com/jfowkes/pycutest")], +) +things["suite_cutest"] = Suite( + name="CUTEst", + long_name="Constrained and Unconstrained Testing Environment with safe threads", + description="CUTEst for optimization software", + objectives={1}, + variables=[ + Variable(type="continuous", dim=ValueRange(min=1)), + Variable(type="integer", dim=ValueRange(min=1)), + Variable(type="binary", dim=ValueRange(min=1)), + ], + constraints=[ + Constraint(hard="some", number=ValueRange(min=1)), + Constraint(type="box", hard="yes"), + ], + modality={"multimodal"}, + allows_partial_evaluation="no", + source={"artificial"}, + references=[ + Reference( + title="CUTEst", + authors=[], + link=Link(url="https://link.springer.com/article/10.1007/s10589-014-9687-3"), + ) + ], + implementations={"impl_pycutest"}, +) + +#! - name: PUBOi +#! suite/generator/single: Generator +#! variable type: Boolean +#! dimensionality: scalable +#! objectives: '1' +#! constraints: 'no' +#! dynamic: 'no' +#! noise: 'no' +#! multimodal: Unknown +#! multi-fidelity: 'no' +#! source (real-world/artificial): Artificially Generated +#! implementation: https://gitlab.com/verel/pubo-importance-benchmark +#! textual description: A benchmark in which variable importance is tunable, based +#! on the Walsh function +#! reference: https://link.springer.com/chapter/10.1007/978-3-031-04148-8_12 +#! other info: +#! partial evaluations: 'no' +#! full name: Polynomial Unconstrained Binary Optimization +#! key challenges / characteristics: Tunable variable importance +#! implementation languages: Python, C++ +things["impl_puboi"] = Implementation( + name="PUBO Importance Benchmark", + description="A benchmark in which variable importance is tunable, based on the Walsh function", + language="Python / C++", + links=[Link(type="repository", url="https://gitlab.com/verel/pubo-importance-benchmark")], +) + +things["gen_puboi"] = Generator( + name="PUBOi", + long_name="Polynomial Unconstrained Binary Optimization with tunable importance", + description="A benchmark in which variable importance is tunable, based on the Walsh function.", + objectives={1}, + variables=[Variable(type="binary", dim=ValueRange(min=1))], + allows_partial_evaluation="no", + source={"artificial"}, + references=[ + Reference( + title="PUBOi", + authors=[], + link=Link(url="https://link.springer.com/chapter/10.1007/978-3-031-04148-8_12"), + ) + ], + implementations={"impl_puboi"}, +) + + +library = Library(things) + +# Make sure model is really valid +Library.model_validate(library) + +if __name__ == "__main__": + print(to_yaml_str(library)) diff --git a/problems.yaml b/problems.yaml index 4328038..24caa52 100644 --- a/problems.yaml +++ b/problems.yaml @@ -1,1264 +1,3496 @@ -- name: BBOB - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.1080/10556788.2020.1808977 - implementation: https://github.com/numbbo/coco - source (real-world/artificial): '' - textual description: '' -- name: BBOB-biobj - suite/generator/single: suite - objectives: '2' - dimensionality: 2-40 - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.48550/arXiv.1604.00359 - implementation: https://github.com/numbbo/coco - source (real-world/artificial): '' - textual description: '' -- name: BBOB-noisy - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'yes' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://hal.inria.fr/inria-00369466 - implementation: https://web.archive.org/web/20210416065610/https://coco.gforge.inria.fr/doku.php?id=downloads - source (real-world/artificial): '' - textual description: '' -- name: BBOB-largescale - suite/generator/single: suite - objectives: '1' - dimensionality: 20-640 - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.48550/arXiv.1903.06396 - implementation: https://github.com/numbbo/coco - source (real-world/artificial): '' - textual description: '' -- name: BBOB-mixint - suite/generator/single: suite - objectives: '1' - dimensionality: 5-160 - variable type: integer;continuous;mixed - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/3321707.3321868 - implementation: https://github.com/numbbo/coco - source (real-world/artificial): '' - textual description: '' -- name: BBOB-biobj-mixint - suite/generator/single: suite - objectives: '2' - dimensionality: 5-160 - variable type: integer;continuous;mixed - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/3321707.3321868 - implementation: https://github.com/numbbo/coco - source (real-world/artificial): '' - textual description: '' -- name: BBOB-constrained - suite/generator/single: suite - objectives: '1' - dimensionality: 2-40 - variable type: continuous - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: http://numbbo.github.io/coco-doc/bbob-constrained/ - implementation: https://github.com/numbbo/coco - source (real-world/artificial): '' - textual description: '' -- name: MOrepo - suite/generator/single: suite - objectives: '2' - dimensionality: '?' - variable type: combinatorial - constraints: '?' - dynamic: '?' - noise: '?' - multimodal: '?' - multi-fidelity: 'no' - reference: '' - implementation: https://github.com/MCDMSociety/MOrepo - source (real-world/artificial): '' - textual description: '' -- name: ZDT - suite/generator/single: suite - objectives: '2' - dimensionality: scalable - variable type: continuous;binary - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1162/106365600568202 - implementation: https://github.com/anyoptimization/pymoo - source (real-world/artificial): '' - textual description: '' -- name: DTLZ - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/CEC.2002.1007032 - implementation: https://pymoo.org/problems/many/dtlz.html - source (real-world/artificial): '' - textual description: '' -- name: WFG - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/TEVC.2005.861417 - implementation: https://pymoo.org/problems/many/wfg.html - source (real-world/artificial): '' - textual description: '' -- name: CDMP - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'yes' - dynamic: '?' - noise: '?' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/3321707.3321878 - implementation: '?' - source (real-world/artificial): '' - textual description: '' -- name: SDP - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'yes' - noise: '?' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/TCYB.2019.2896021 - implementation: '?' - source (real-world/artificial): '' - textual description: '' -- name: MaOP - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: '?' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1016/j.swevo.2019.02.003 - implementation: '?' - source (real-world/artificial): '' - textual description: '' -- name: BP - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: '?' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/CEC.2019.8790277 - implementation: '?' - source (real-world/artificial): '' - textual description: '' -- name: GPD - suite/generator/single: generator - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: optional - dynamic: 'no' - noise: optional - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1016/j.asoc.2020.106139 - implementation: '?' - source (real-world/artificial): '' - textual description: '' -- name: ETMOF - suite/generator/single: suite - objectives: 2-50 - dimensionality: 25-10000 - variable type: continuous - constraints: 'no' - dynamic: 'yes' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.48550/arXiv.2110.08033 - implementation: https://github.com/songbai-liu/etmo - source (real-world/artificial): '' - textual description: '' -- name: MMOPP - suite/generator/single: suite - objectives: 2-7 - dimensionality: '?' - variable type: '?' - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: http://www5.zzu.edu.cn/system/_content/download.jsp?urltype=news.DownloadAttachUrl&owner=1327567121&wbfileid=4764412 - implementation: http://www5.zzu.edu.cn/ecilab/info/1036/1251.htm - source (real-world/artificial): '' - textual description: '' -- name: CFD - suite/generator/single: suite - objectives: 1-2 - dimensionality: scalable - variable type: '?' - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1007/978-3-319-99259-4_24 - implementation: https://bitbucket.org/arahat/cfd-test-problem-suite - source (real-world/artificial): real world - textual description: expensive evaluations 30s-15m -- name: GBEA - suite/generator/single: suite - objectives: 1-2 - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'yes' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/3321707.3321805 - implementation: 'https://github.com/ttusar/coco-gbea' - source (real-world/artificial): real world - textual description: 'expensive evaluations 5s-35s, RW-GAN-Mario and TopTrumps are part of GBEA' -- name: Car structure - suite/generator/single: suite - objectives: '2' - dimensionality: 144-222 - variable type: discrete - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/3205651.3205702 - implementation: http://ladse.eng.isas.jaxa.jp/benchmark/ - source (real-world/artificial): real world - textual description: 54 constraints -- name: EMO2017 - suite/generator/single: suite - objectives: '2' - dimensionality: 4-24 - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/ - implementation: https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/downloads/realworld-problems-bbcomp-EMO-2017.zip - source (real-world/artificial): real world - textual description: '' -- name: JSEC2019 - suite/generator/single: single - objectives: 1-5 - dimensionality: '32' - variable type: continuous - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html - implementation: http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html - source (real-world/artificial): real world - textual description: expensive evaluations 3s; 22 constraints -- name: RE - suite/generator/single: suite - objectives: 2-9 - dimensionality: 2-7 - variable type: continuous;integer;mixed - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1016/j.asoc.2020.106078 - implementation: https://github.com/ryojitanabe/reproblems - source (real-world/artificial): real world like - textual description: '' -- name: CRE - suite/generator/single: suite - objectives: 2-5 - dimensionality: 3-7 - variable type: continuous;integer;mixed - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1016/j.asoc.2020.106078 - implementation: https://github.com/ryojitanabe/reproblems - source (real-world/artificial): real world like - textual description: '' -- name: Radar waveform - suite/generator/single: single - objectives: '9' - dimensionality: 4-12 - variable type: integer - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1007/978-3-540-70928-2_53 - implementation: http://code.evanhughes.org/ - source (real-world/artificial): real world - textual description: '' -- name: MF2 - suite/generator/single: suite - objectives: '1' - dimensionality: 1-n - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'yes' - reference: https://doi.org/10.21105/joss.02049 - implementation: https://github.com/sjvrijn/mf2 - source (real-world/artificial): '' - textual description: '' -- name: AMVOP - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: mixed continuous+ordinal+categorical+both - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/TEVC.2013.2281531 - implementation: '?' - source (real-world/artificial): '' - textual description: '' -- name: RWMVOP - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: continuous;mixed continuous+ordinal+categorical+both - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/TEVC.2013.2281531 - implementation: '?' - source (real-world/artificial): real world - textual description: '' -- name: SBOX-COST - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.48550/arXiv.2305.12221 - implementation: https://github.com/IOHprofiler/IOHexperimenter/ - source (real-world/artificial): '' - textual description: problems from BBOB but allows instances with the optimum close to the - boundary -- name: "\u03C1MNK-Landscapes" - suite/generator/single: generator - objectives: scalable - dimensionality: scalable - variable type: binary - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.1016/j.ejor.2012.12.019 - implementation: https://gitlab.com/aliefooghe/mocobench/ - source (real-world/artificial): '' - textual description: tunable variable and objective dimensions; tunable multimodality and +fn_ato: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: 'Parameters of the Modules of the Automatic Train Operation are optimized; + two objectives: minimizing energy consumption and minimizing driving duration.' + dynamic_type: null + fidelity_levels: null + implementations: null + instances: null + long_name: null + modality: + - unimodal + name: ATO + noise_type: null + objectives: + - 2 + references: null + source: + - real-world + tags: null + type: problem + variables: + - dim: 10 + type: continuous +fn_building_spatial: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: box + - equality: null + hard: yes + number: null + type: unknown + description: Optimise the spatial layout of a building to minimise energy + consumption for climate control and minimise the strain on the structure. + Many hard constraints; mixed-variable (continuous+binary); expensive + evaluations. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_bso_toolbox + instances: null + long_name: null + modality: null + name: Building spatial design + noise_type: null + objectives: + - 2 + references: + - authors: [] + link: + type: null + url: https://hdl.handle.net/1887/81789 + title: Building spatial design + source: + - real-world + tags: null + type: problem + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: continuous +fn_convex_dtlz2: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Variant of DTLZ2 with a convex Pareto front (instead of concave) + dynamic_type: null + fidelity_levels: null + implementations: null + instances: null + long_name: null + modality: null + name: Convex DTLZ2 + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/TEVC.2013.2281535 + title: Convex DTLZ2 + source: null + tags: null + type: problem + variables: + - dim: + max: null + min: 1 + type: continuous +fn_emdo: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: 12 + type: unknown + - equality: null + hard: yes + number: null + type: box + - equality: null + hard: some + number: null + type: unknown + description: "# Goal\nFind a design of a synchronous electric motor for power steering + systems that minimizes costs and satisfies all constraints.\n\n# Motivation\n\ + Challenging to find good solutions in a limited time.\n\n# Key Challenges\n* Time-consuming + solution evaluation\n* Highly-constrained problem\n* Constraints are multimodal\n\ + \nThis is not an available problem, but could be interesting to show to researchers + which difficulties appear in real-world problems." + dynamic_type: null + fidelity_levels: null + implementations: + - impl_emdo + instances: null + long_name: Electric Motor Design Optimization + modality: + - multimodal + name: Electric Motor Design Optimization + noise_type: + - noisy + objectives: + - 1 + references: + - authors: + - Tea Tušar + - Peter Korošec + - Bogdan Filipič + link: + type: null + url: https://dis.ijs.si/tea/Publications/Tusar23Multistep.pdf + title: A Multi-Step Evaluation Process in Electric Motor Design + source: + - real-world + tags: null + type: problem + variables: + - dim: 13 + type: integer + - dim: 13 + type: continuous +fn_fleetopt: + allows_partial_evaluation: yes + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: 'UK healthcare organisation fleet optimisation: reduce the fleet of + non-emergency healthcare trip vehicles while still ensuring all trips can be covered. + Bilevel: upper level 54 vars, lower level 13208 vars.' + dynamic_type: null + fidelity_levels: null + implementations: null + instances: null + long_name: null + modality: null + name: FleetOpt + noise_type: null + objectives: + - 1 + references: + - authors: [] + link: + type: null + url: https://dl.acm.org/doi/abs/10.1145/3638530.3664137 + title: FleetOpt + source: + - real-world + tags: null + type: problem + variables: + - dim: + - 13208 + - 54 + type: integer +fn_gasoline: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: 5 + type: unknown + description: Multi-objective optimization to minimize fuel consumption and NOx + emissions over a two-minute dynamic duty cycle, subject to five constraints + (turbine inlet temperature, knock occurrences, peak cylinder pressure, peak + cylinder pressure rise, total work). Seven decision variables cover hardware + choices and engine control parameters. + dynamic_type: null + fidelity_levels: + - 1 + - 2 + implementations: + - impl_gasoline + instances: null + long_name: null + modality: null + name: Gasoline direct injection engine design + noise_type: null + objectives: + - 2 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1016/j.ejor.2022.08.032 + title: Gasoline direct injection engine design + source: + - real-world + tags: null + type: problem + variables: + - dim: 7 + type: integer + - dim: 7 + type: continuous +fn_invdeceptive_deceptive_rotell: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: null + instances: null + long_name: null + modality: null + name: InverseDeceptiveTrap+RotatedEllipsoid / DeceptiveTrap+RotatedEllipsoid + noise_type: null + objectives: + - 2 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3449726.3459521 + title: Mixed-variable multi-objective test problems + source: + - artificial + tags: null + type: problem + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: continuous +fn_inverted_dtlz1: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Variant of DTLZ1 with an inverted Pareto front + dynamic_type: null + fidelity_levels: null + implementations: null + instances: null + long_name: null + modality: null + name: Inverted DTLZ1 + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/TEVC.2013.2281534 + title: Inverted DTLZ1 + source: null + tags: null + type: problem + variables: + - dim: + max: null + min: 1 + type: continuous +fn_jsec2019: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: 22 + type: unknown + description: expensive evaluations 3s; 22 constraints + dynamic_type: null + fidelity_levels: null + implementations: + - impl_jsec2019 + instances: null + long_name: null + modality: null + name: JSEC2019 + noise_type: null + objectives: + - 1 + - 2 + - 3 + - 4 + - 5 + references: + - authors: [] + link: + type: null + url: + http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html + title: JPNSEC EC-Symposium 2019 competition + source: + - real-world + tags: null + type: problem + variables: + - dim: 32 + type: continuous +fn_onemax_sphere_deceptive_rotell: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: null + instances: null + long_name: null + modality: null + name: Onemax+Sphere / DeceptiveTrap+RotatedEllipsoid + noise_type: null + objectives: + - 2 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3449726.3459521 + title: Mixed-variable multi-objective test problems + source: + - artificial + tags: null + type: problem + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: continuous +fn_onemax_sphere_zeromax_sphere: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: null + instances: null + long_name: null + modality: null + name: Onemax+Sphere / Zeromax+Sphere + noise_type: null + objectives: + - 2 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3449726.3459521 + title: Onemax+Sphere / Zeromax+Sphere + source: + - artificial + tags: null + type: problem + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: continuous +fn_radar_waveform: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_radar_waveform + instances: null + long_name: null + modality: null + name: Radar waveform + noise_type: null + objectives: + - 9 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1007/978-3-540-70928-2_53 + title: Radar waveform design + source: + - real-world + tags: null + type: problem + variables: + - dim: + max: 12 + min: 4 + type: integer +gen_beacon: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: 0 + type: box + description: Generator for bi-objective benchmark problems with explicitly + controlled correlations in continuous spaces. Multimodal with random + structure. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_beacon + long_name: Continuous Bi-objective Benchmark problems with Explicit Adjustable + COrrelatioN control + modality: + - multimodal + name: BEACON + noise_type: null + objectives: + - 2 + references: + - authors: [] + link: + type: null + url: https://dl.acm.org/doi/10.1145/3712255.3734303 + title: BEACON + source: + - artificial + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: continuous +gen_bono_bench: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: box + description: Bi-objective problem generator and suite with scalable continuous + decision space. Features complex problem properties and Pareto front + approximations with error guarantees for the hypervolume and exact R2 + indicators. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_bonobench + long_name: Bi-objective Numerical Optimization Benchmark + modality: + - multimodal + name: BONO-Bench + noise_type: null + objectives: + - 2 + references: null + source: + - artificial + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: continuous +gen_ealain: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: some + number: null + type: unknown + description: Real-world-like, easily extensible to increase complexity + dynamic_type: + - optional + fidelity_levels: + - 1 + - 2 + implementations: + - impl_ealain + long_name: null + modality: null + name: Ealain + noise_type: null + objectives: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3638530.3654299 + title: Ealain + source: + - real-world-like + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: integer + - dim: + max: null + min: 1 + type: continuous +gen_gnbg: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Generator counterpart of GNBG. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_gnbg + long_name: null + modality: null + name: GNBG + noise_type: null + objectives: + - 1 + references: + - authors: [] + link: + type: null + url: https://arxiv.org/abs/2312.07083 + title: GNBG + source: + - artificial + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: continuous +gen_gnbg_ii: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Generator counterpart of GNBG-II. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_iohgnbg + - impl_gnbg_ii + long_name: null + modality: null + name: GNBG-II + noise_type: null + objectives: + - 1 + references: + - authors: [] + link: + type: null + url: https://dl.acm.org/doi/pdf/10.1145/3712255.3734271 + title: GNBG-II + source: + - artificial + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: continuous +gen_gpd: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: some + number: null + type: unknown + description: null + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: GPD + noise_type: + - optional + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1016/j.asoc.2020.106139 + title: GPD generator + source: null + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: continuous +gen_iohclustering: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Generator counterpart of the IOHClustering suite. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_iohclustering + long_name: null + modality: + - multimodal + name: IOHClustering + noise_type: null + objectives: + - 1 + references: + - authors: [] + link: + type: null + url: https://arxiv.org/pdf/2505.09233 + title: IOHClustering + source: + - artificial-from-real-data + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: continuous +gen_ma_bbob: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Generator that creates affine combinations of BBOB functions + dynamic_type: null + fidelity_levels: null + implementations: + - impl_iohexperimenter + - impl_ma_bbob + long_name: null + modality: + - multimodal + name: MA-BBOB + noise_type: null + objectives: + - 1 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3673908 + title: MA-BBOB + source: + - artificial + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: continuous +gen_mpm2: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: nonlinear nonseparable nonsymmetric; scalable in terms of time to + evaluate the objective function + dynamic_type: null + fidelity_levels: null + implementations: + - impl_mpm2 + long_name: null + modality: + - multimodal + name: MPM2 + noise_type: null + objectives: + - 1 + references: + - authors: [] + link: + type: null + url: https://ls11-www.cs.tu-dortmund.de/_media/techreports/tr15-01.pdf + title: MPM2 technical report TR15-01 + source: null + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: continuous +gen_mubqp: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: tunable variable and objective dimensions; tunable density and correlation between objectives -- name: mUBQP - suite/generator/single: generator - objectives: scalable - dimensionality: scalable - variable type: binary - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: yes (quadratic) - multi-fidelity: 'no' - reference: https://doi.org/10.1016/j.asoc.2013.11.008 - implementation: https://gitlab.com/aliefooghe/mocobench/ - source (real-world/artificial): '' - textual description: tunable variable and objective dimensions; tunable density and correlation - between objectives -- name: "\u03C1mTSP" - suite/generator/single: generator - objectives: scalable - dimensionality: scalable - variable type: permutations - constraints: no (apart from being permutations) - dynamic: 'no' - noise: 'no' - multimodal: yes (quadratic) - multi-fidelity: 'no' - reference: https://doi.org/10.1007/978-3-319-45823-6_40 - implementation: https://gitlab.com/aliefooghe/mocobench/ - source (real-world/artificial): '' - textual description: tunable variable and objective dimensions; tunable instance type (euclidian/random); - tunable correlation between objectives -- name: CEC2015-DMOO - suite/generator/single: suite - objectives: 2-3 - dimensionality: '?' - variable type: continuous - constraints: '?' - dynamic: 'yes' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: Benchmark Functions for CEC 2015 Special Session and Competition on Dynamic - Multi-objective Optimization - implementation: '' - source (real-world/artificial): '' - textual description: '' -- name: Ealain - suite/generator/single: generator - objectives: 1+ - dimensionality: scalable - variable type: continuous,binary,integer - constraints: optional - dynamic: optional - noise: 'no' - multimodal: '?' - multi-fidelity: optional - reference: https://doi.org/10.1145/3638530.3654299 - implementation: https://github.com/qrenau/Ealain - source (real-world/artificial): Real-world-like - textual description: Real-world-like, easily extensible to increase complexity -- name: MA-BBOB - suite/generator/single: generator - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/3673908 - implementation: https://github.com/IOHprofiler/IOHexperimenter/blob/master/example/Competitions/MA-BBOB/Example_MABBOB.ipynb - source (real-world/artificial): artificial - textual description: Generator that creates affine combinations of BBOB functions -- name: MPM2 - suite/generator/single: generator - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://ls11-www.cs.tu-dortmund.de/_media/techreports/tr15-01.pdf - implementation: https://github.com/jakobbossek/smoof/blob/master/inst/mpm2.py - source (real-world/artificial): '' - textual description: nonlinear nonseparable nonsymmetric; scalable in terms of time to evaluate - the objective function -- name: Convex DTLZ2 - suite/generator/single: single - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/TEVC.2013.2281535 - implementation: '?' - source (real-world/artificial): '' - textual description: Variant of DTLZ2 with a convex Pareto front (instead of concave) -- name: Inverted DTLZ1 - suite/generator/single: single - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/TEVC.2013.2281534 - implementation: '?' - source (real-world/artificial): '' - textual description: Variant of DTLZ1 with an inverted Pareto front -- name: Minus DTLZ - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/TEVC.2016.2587749 - implementation: '?' - source (real-world/artificial): '' - textual description: Variant of DTLZ that minimises the inverse of the base DTLZ functions -- name: Minus WFG - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/TEVC.2016.2587749 - implementation: '?' - source (real-world/artificial): '' - textual description: Variant of WFG that minimises the inverse of the base WFG functions -- name: L1-ZDT - suite/generator/single: suite - objectives: '2' - dimensionality: scalable - variable type: continuous;binary - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/1143997.1144179 - implementation: '?' - source (real-world/artificial): '' - textual description: 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 -- name: L2-ZDT - suite/generator/single: suite - objectives: '2' - dimensionality: scalable - variable type: continuous;binary - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/1143997.1144179 - implementation: '?' - source (real-world/artificial): '' - textual description: Variant of ZDT with linkages between all variables; Linear recombination - operators can potentially take advantage of the problem structure -- name: L3-ZDT - suite/generator/single: suite - objectives: '2' - dimensionality: scalable - variable type: continuous;binary - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/1143997.1144179 - implementation: '?' - source (real-world/artificial): '' - textual description: Variant of L2-ZDT using a mapping to prevent linear recombination operators - from potentially taking advantage of the problem structure -- name: L2-DTLZ - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/1143997.1144179 - implementation: '?' - source (real-world/artificial): '' - textual description: Variant of DTLZ2 and DTLZ3 with linkages between all variables; Linear - recombination operators can potentially take advantage of the problem structure -- name: L3-DTLZ - suite/generator/single: suite - objectives: 2+ - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/1143997.1144179 - implementation: '?' - source (real-world/artificial): '' - textual description: Variant of L2-DTLZ using a mapping to prevent linear recombination operators - from potentially taking advantage of the problem structure -- name: CEC2018 DT - CEC2018 Competition on Dynamic Multiobjective Optimisation - suite/generator/single: suite - objectives: 2 or 3 - dimensionality: scalable? - variable type: '?' - constraints: 'no' - dynamic: 'yes' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://www.academia.edu/download/94499025/TR-CEC2018-DMOP-Competition.pdf - implementation: https://pymoo.org/problems/dynamic/df.html - source (real-world/artificial): artificial - textual description: '14 problems. Time-dependent: Pareto front/Pareto set geometry; - irregular Pareto front shapes; variable-linkage; number of disconnected Pareto - front segments; etc.' -- name: MODAct - multiobjective design of actuators - suite/generator/single: suite - objectives: 2 3 4 or 5 - dimensionality: '20' - variable type: mixed; integer and continuous - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/TEVC.2020.3020046 - implementation: https://pymoo.org/problems/constrained/modact.html - source (real-world/artificial): real-world - textual description: Realistic Constrained Multi-Objective Optimization Benchmark - Problems from Design. Need the https://github.com/epfl-lamd/modact package installed; evaluation - times around 20ms -- name: IOHClustering - suite/generator/single: suite; generator - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no ' - reference: https://arxiv.org/pdf/2505.09233 - implementation: https://github.com/IOHprofiler/IOHClustering - source (real-world/artificial): artificial, but based on real data - textual description: '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' -- name: GNBG-II - suite/generator/single: suite; generator - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://dl.acm.org/doi/pdf/10.1145/3712255.3734271 - implementation: https://github.com/rohitsalgotra/GNBG-II - source (real-world/artificial): artificial - textual description: Generalized Numerical Benchmark Generator (version 2). Also in IOH https://github.com/IOHprofiler/IOHGNBG -- name: GNBG - suite/generator/single: suite; generator - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://arxiv.org/abs/2312.07083 - implementation: https://github.com/Danial-Yazdani/GNBG-Generator - source (real-world/artificial): artificial - textual description: Generalized Numerical Benchmark Generator -- name: DynamicBinVal - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: binary - constraints: 'no' - dynamic: 'yes' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://arxiv.org/pdf/2404.15837 - implementation: https://github.com/IOHprofiler/IOHexperimenter - source (real-world/artificial): artificial - textual description: Four versions of the dynamic binary value problem -- name: PBO - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: binary - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://dl.acm.org/doi/pdf/10.1145/3319619.3326810 - implementation: https://github.com/IOHprofiler/IOHexperimenter - source (real-world/artificial): artificial - textual description: Suite of 25 binary optimization problems -- name: W-model - suite/generator/single: generator - objectives: '1' - dimensionality: scalable - variable type: binary - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://dl.acm.org/doi/abs/10.1145/3205651.3208240?casa_token=S4U_Pi9f6MwAAAAA:U9ztNTPwmupT8K3GamWZfBL7-8fqjxPtr_kprv51vdwA-REsp0EyOFGa99BtbANb0XbqyrVg795hIw - implementation: https://github.com/thomasWeise/BBDOB_W_Model - source (real-world/artificial): artificial - textual description: Tunable generator for binary optimization based on several + dynamic_type: null + fidelity_levels: null + implementations: + - impl_mocobench + long_name: null + modality: + - multimodal + - quadratic + name: mUBQP + noise_type: null + objectives: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1016/j.asoc.2013.11.008 + title: mUBQP benchmark + source: null + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: binary +gen_puboi: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: A benchmark in which variable importance is tunable, based on the + Walsh function. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_puboi + long_name: Polynomial Unconstrained Binary Optimization with tunable + importance + modality: null + name: PUBOi + noise_type: null + objectives: + - 1 + references: + - authors: [] + link: + type: null + url: https://link.springer.com/chapter/10.1007/978-3-031-04148-8_12 + title: PUBOi + source: + - artificial + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: binary +gen_randoptgen: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: A Unified Random Problem Generator for Single- and + Multi-Objective Optimization Problems with Mixed-Variable Input Spaces. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_randoptgen + long_name: RandOptGen + modality: + - multimodal + name: RandOptGen + noise_type: null + objectives: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + references: null + source: + - artificial + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: integer + - dim: + max: null + min: 1 + type: continuous +gen_rho_mnk_landscapes: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: tunable variable and objective dimensions; tunable multimodality + and correlation between objectives + dynamic_type: null + fidelity_levels: null + implementations: + - impl_mocobench + long_name: null + modality: + - multimodal + name: ρMNK-Landscapes + noise_type: null + objectives: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1016/j.ejor.2012.12.019 + title: On the design of multi-objective evolutionary algorithms based on + NK-landscapes + source: null + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: binary +gen_rho_mtsp: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: tunable variable and objective dimensions; tunable instance type + (euclidean/random); tunable correlation between objectives + dynamic_type: null + fidelity_levels: null + implementations: + - impl_mocobench + long_name: null + modality: + - multimodal + - quadratic + name: ρmTSP + noise_type: null + objectives: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1007/978-3-319-45823-6_40 + title: On the impact of multi-objective scalability for the ρmTSP + source: null + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: unknown +gen_wmodel: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Tunable generator for binary optimization based on several difficulty features -- name: Submodular Optimitzation - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: binary - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10254181 - implementation: https://github.com/IOHprofiler/IOHexperimenter - source (real-world/artificial): artificial - textual description: set of graph-based submodular optimization problems from 4 - problem types -- name: CEC2013 - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://peerj.com/articles/cs-2671/CEC2013.pdf - implementation: https://github.com/P-N-Suganthan/CEC2013 - source (real-world/artificial): artificial - textual description: suite used for cec2013 competition. Also in IOH https://github.com/IOHprofiler/IOHexperimenter -- name: CEC2022 - suite/generator/single: suite - objectives: '1' - dimensionality: scalable - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '?' - multi-fidelity: 'no' - reference: https://github.com/P-N-Suganthan/2022-SO-BO/blob/main/CEC2022%20TR.pdf - implementation: https://github.com/P-N-Suganthan/2022-SO-BO - source (real-world/artificial): artificial - textual description: suite used for cec2022 competition. Also in IOH https://github.com/IOHprofiler/IOHexperimenter -- name: Onemax+Sphere / Zeromax+Sphere - suite/generator/single: single - objectives: '2' - dimensionality: scalable - variable type: binary and continuous;mixed; - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/3449726.3459521 - implementation: - source (real-world/artificial): 'artificial' - textual description: '' -- name: Onemax+Sphere / DeceptiveTrap+RotatedEllipsoid - suite/generator/single: single - objectives: '2' - dimensionality: scalable - variable type: binary and continuous;mixed; - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/3449726.3459521 - implementation: - source (real-world/artificial): 'artificial' - textual description: '' -- name: InverseDeceptiveTrap+RotatedEllipsoid / DeceptiveTrap+RotatedEllipsoid - suite/generator/single: single - objectives: '2' - dimensionality: scalable - variable type: binary and continuous;mixed; - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: '' - multi-fidelity: 'no' - reference: https://doi.org/10.1145/3449726.3459521 - implementation: - source (real-world/artificial): 'artificial' - textual description: '' -- name: PorkchopPlotInterplanetaryTrajectory - suite/generator/single: suite - objectives: '1' - dimensionality: 2 - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://doi.org/10.1109/CEC65147.2025.11042973 - implementation: https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world - source (real-world/artificial): 'real-world' - textual description: '' -- name: KinematicsRobotArm - suite/generator/single: suite - objectives: '1' - dimensionality: 21 - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'no' - multi-fidelity: 'no' - reference: https://doi.org/10.1023/A:1013258808932 - implementation: https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world - source (real-world/artificial): 'real-world' - textual description: '' -- name: VehicleDynamics - suite/generator/single: suite - objectives: '1' - dimensionality: 2 - variable type: continuous - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - reference: https://www.scitepress.org/Papers/2023/121580/121580.pdf - implementation: https://zenodo.org/records/8307853 - source (real-world/artificial): 'real-world' - textual description: '' -- name: MECHBench - suite/generator/single: Problem Suite - variable type: Continuous - dimensionality: scalable' - objectives: '1' - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - source (real-world/artificial): Real-World Application - implementation: https://github.com/BayesOptApp/MECHBench - textual description: 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. - reference: https://arxiv.org/abs/2511.10821 - other info: - partial evaluations: 'no' - full name: MECHBench - constraint properties: Hard Constraints - number of constraints: 1 or 2 - description of multimodality: Unstructured or non isotropic multimodality - key challenges / characteristics: Embeds physical simulations and is flexible - and modular - scientific motivation: Bridge the black-box optimization techniques to a Mechanical - Design Problem which require these kinds of algorithms - limitations: The models do not include fracture or damage mechanics, just plasticity. - implementation languages: Python - approximate evaluation time: Times -> from 1 minute to 7 minutes -- name: EXPObench - suite/generator/single: Problem Suite - variable type: Continuous, Integer, Categorical, Conditional - dimensionality: 10 to 135 - objectives: '1' - constraints: 'yes' - dynamic: 'no' - noise: 'yes' - multimodal: Unknown - multi-fidelity: 'no' - source (real-world/artificial): Real-World Application - implementation: https://github.com/AlgTUDelft/ExpensiveOptimBenchmark - textual description: Wind farm layout optimization, gas filter design, pipe shape + dynamic_type: null + fidelity_levels: null + implementations: + - impl_wmodel + long_name: null + modality: null + name: W-model + noise_type: null + objectives: + - 1 + references: + - authors: [] + link: + type: null + url: https://dl.acm.org/doi/abs/10.1145/3205651.3208240 + title: W-model + source: + - artificial + tags: null + type: generator + variables: + - dim: + max: null + min: 1 + type: binary +impl_beacon: + description: Continuous Bi-objective Benchmark with Explicit Adjustable + COrrelatioN control + evaluation_time: negligible + language: Python + links: + - type: repository + url: https://github.com/Stebbet/BEACON/ + name: BEACON + requirements: null + type: implementation +impl_bonobench: + description: Bi-objective Numerical Optimization Benchmark (BONO-Bench) + evaluation_time: null + language: Python + links: + - type: repository + url: https://github.com/schaepermeier/bonobench + name: BONO-Bench + requirements: null + type: implementation +impl_bso_toolbox: + description: Building Spatial Design toolbox (TU/e) + evaluation_time: ~1s (smallest) to ~40s (larger) + language: C++ + links: + - type: repository + url: https://github.com/TUe-excellent-buildings/BSO-toolbox + name: BSO-toolbox + requirements: null + type: implementation +impl_car_structure: + description: JAXA LADSE benchmark problems + evaluation_time: null + language: null + links: + - type: website + url: http://ladse.eng.isas.jaxa.jp/benchmark/ + name: Car-structure benchmark + requirements: null + type: implementation +impl_cec2013: + description: Suganthan's reference implementation + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/P-N-Suganthan/CEC2013 + name: CEC2013 reference code + requirements: null + type: implementation +impl_cec2022: + description: Suganthan's reference implementation + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/P-N-Suganthan/2022-SO-BO + name: CEC2022 reference code + requirements: null + type: implementation +impl_cfd: + description: Expensive real-world CFD-based test problems + evaluation_time: 30s-15m + language: null + links: + - type: repository + url: https://bitbucket.org/arahat/cfd-test-problem-suite + name: CFD test problem suite + requirements: null + type: implementation +impl_coco: + description: 'Comparing Continuous Optimizers: black-box optimization benchmarking + platform' + evaluation_time: null + language: C/Python + links: + - type: repository + url: https://github.com/numbbo/coco + name: COCO framework + requirements: null + type: implementation +impl_coco_legacy: + description: Archived COCO download page that hosted the bbob-noisy suite + evaluation_time: null + language: C/Python + links: + - type: archive + url: + https://web.archive.org/web/20210416065610/https://coco.gforge.inria.fr/doku.php?id=downloads + name: COCO legacy (bbob-noisy) + requirements: null + type: implementation +impl_ealain: + description: Real-world-like extensible benchmark problem generator + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/qrenau/Ealain + name: Ealain + requirements: null + type: implementation +impl_emdo: + description: Not publicly available + evaluation_time: 8 minutes + language: Python + links: null + name: Electric Motor Design Optimization + requirements: null + type: implementation +impl_emo2017: + description: BBComp EMO-2017 real-world problem archive + evaluation_time: null + language: null + links: + - type: download + url: + https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/downloads/realworld-problems-bbcomp-EMO-2017.zip + name: EMO 2017 real-world problems + requirements: null + type: implementation +impl_etmof: + description: Evolutionary many-task optimization framework + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/songbai-liu/etmo + name: ETMOF + requirements: null + type: implementation +impl_expobench: + description: EXPensive Optimization benchmark library (wind farm layout, gas + filter design, pipe shape, hyperparameter tuning, hospital simulation) + evaluation_time: 2 to 80 seconds + language: Python + links: + - type: repository + url: https://github.com/AlgTUDelft/ExpensiveOptimBenchmark + name: EXPObench + requirements: null + type: implementation +impl_gasoline: + description: Proprietary Matlab Simulink + Wave RT co-simulation + evaluation_time: null + language: Matlab Simulink / Wave RT + links: + - type: paper + url: https://doi.org/10.1016/j.ejor.2022.08.032 + name: Gasoline direct injection engine design + requirements: null + type: implementation +impl_gbea: + description: Game-Benchmark for Evolutionary Algorithms (COCO fork) + evaluation_time: 5s-35s + language: null + links: + - type: repository + url: https://github.com/ttusar/coco-gbea + name: coco-gbea + requirements: null + type: implementation +impl_gnbg: + description: Generalized Numerical Benchmark Generator + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/Danial-Yazdani/GNBG-Generator + name: GNBG Generator + requirements: null + type: implementation +impl_gnbg_ii: + description: Generalized Numerical Benchmark Generator version 2 + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/rohitsalgotra/GNBG-II + name: GNBG-II + requirements: null + type: implementation +impl_iohclustering: + description: Clustering-based optimization benchmark built on ML datasets + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/IOHprofiler/IOHClustering + name: IOHClustering + requirements: null + type: implementation +impl_iohexperimenter: + description: IOHprofiler experimenter framework + evaluation_time: null + language: C++/Python + links: + - type: repository + url: https://github.com/IOHprofiler/IOHexperimenter + name: IOHexperimenter + requirements: null + type: implementation +impl_iohgnbg: + description: IOHprofiler version of GNBG + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/IOHprofiler/IOHGNBG + name: IOHGNBG + requirements: null + type: implementation +impl_jsec2019: + description: JPNSEC EC-Symposium 2019 competition problem + evaluation_time: 3s + language: null + links: + - type: website + url: + http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html + name: JSEC 2019 competition + requirements: null + type: implementation +impl_ma_bbob: + description: Example notebook for MA-BBOB in IOHexperimenter + evaluation_time: null + language: null + links: + - type: example + url: + https://github.com/IOHprofiler/IOHexperimenter/blob/master/example/Competitions/MA-BBOB/Example_MABBOB.ipynb + name: MA-BBOB (IOHexperimenter) + requirements: null + type: implementation +impl_mechbench: + description: Structural mechanics design optimization benchmark + evaluation_time: 1-7 minutes + language: Python + links: + - type: repository + url: https://github.com/BayesOptApp/MECHBench + name: MECHBench + requirements: null + type: implementation +impl_mf2: + description: Multi-fidelity test function collection + evaluation_time: null + language: Python + links: + - type: repository + url: https://github.com/sjvrijn/mf2 + name: mf2 + requirements: null + type: implementation +impl_mmopp: + description: ECI lab distribution page for MMOPP + evaluation_time: null + language: null + links: + - type: website + url: http://www5.zzu.edu.cn/ecilab/info/1036/1251.htm + name: MMOPP + requirements: null + type: implementation +impl_mocobench: + description: Multi-objective combinatorial optimization benchmark + evaluation_time: null + language: C++ + links: + - type: repository + url: https://gitlab.com/aliefooghe/mocobench/ + name: mocobench + requirements: null + type: implementation +impl_modact: + description: EPFL-LAMD modact package + evaluation_time: 20ms + language: null + links: + - type: repository + url: https://github.com/epfl-lamd/modact + name: modact + requirements: null + type: implementation +impl_morepo: + description: Multi-objective optimisation problem repository + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/MCDMSociety/MOrepo + name: MOrepo + requirements: null + type: implementation +impl_mpm2: + description: Python implementation of MPM2 distributed with smoof + evaluation_time: null + language: Python + links: + - type: source + url: https://github.com/jakobbossek/smoof/blob/master/inst/mpm2.py + name: MPM2 (smoof) + requirements: null + type: implementation +impl_puboi: + description: A benchmark in which variable importance is tunable, based on the + Walsh function + evaluation_time: null + language: Python / C++ + links: + - type: repository + url: https://gitlab.com/verel/pubo-importance-benchmark + name: PUBO Importance Benchmark + requirements: null + type: implementation +impl_pycutest: + description: Python interface to CUTEst + evaluation_time: null + language: Python / C++ / Fortran + links: + - type: repository + url: https://github.com/jfowkes/pycutest + name: pycutest + requirements: null + type: implementation +impl_pymoo: + description: Multi-objective optimization in Python + evaluation_time: null + language: Python + links: + - type: repository + url: https://github.com/anyoptimization/pymoo + name: pymoo + requirements: null + type: implementation +impl_radar_waveform: + description: Radar waveform design reference implementation + evaluation_time: null + language: null + links: + - type: website + url: http://code.evanhughes.org/ + name: Evan Hughes radar waveform code + requirements: null + type: implementation +impl_randoptgen: + description: Unified Random Problem Generator for Single- and Multi-Objective + Optimization with Mixed-Variable Input Spaces + evaluation_time: milliseconds + language: Python + links: + - type: repository + url: https://github.com/MALEO-research-group/RandOptGen + - type: example + url: https://doi.org/10.1145/3712256.3726478 + name: RandOptGen + requirements: null + type: implementation +impl_reproblems: + description: Real-world inspired multi-objective optimization problem suite + evaluation_time: null + language: Python + links: + - type: repository + url: https://github.com/ryojitanabe/reproblems + name: reproblems + requirements: null + type: implementation +impl_transfer_rf_bbob_rw: + description: Real-world BBOB-like problem implementations (Porkchop, + KinematicsRobotArm) + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world + name: Transfer Random Forests BBOB Real-world + requirements: null + type: implementation +impl_tulipa: + description: Large linear program for optimal investment and operation of + energy systems + evaluation_time: minutes to hours + language: Julia / JuMP + links: + - type: website + url: https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/ + - type: example + url: https://github.com/TulipaEnergy/Tulipa-OBZ-CaseStudy + name: TulipaEnergyModel.jl + requirements: null + type: implementation +impl_vehicle_dynamics: + description: Zenodo archive for the vehicle dynamics benchmark + evaluation_time: null + language: null + links: + - type: archive + url: https://zenodo.org/records/8307853 + name: VehicleDynamics (Zenodo) + requirements: null + type: implementation +impl_wmodel: + description: Tunable generator for binary optimization + evaluation_time: null + language: null + links: + - type: repository + url: https://github.com/thomasWeise/BBDOB_W_Model + name: BBDOB W-Model + requirements: null + type: implementation +suite_amvop: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: + - multimodal + name: AMVOP + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/TEVC.2013.2281531 + title: AMVOP + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: categorical + - dim: + max: null + min: 1 + type: integer + - dim: + max: null + min: 1 + type: continuous +suite_bbob: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_coco + long_name: null + modality: + - multimodal + name: BBOB + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1080/10556788.2020.1808977 + title: 'COCO: a platform for comparing continuous optimizers in a black-box setting' + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_bbob_biobj: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_coco + long_name: null + modality: + - multimodal + name: BBOB-biobj + noise_type: null + objectives: + - 2 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.48550/arXiv.1604.00359 + title: BBOB bi-objective test suite + source: null + tags: null + type: suite + variables: + - dim: + max: 40 + min: 2 + type: continuous +suite_bbob_biobj_mixint: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_coco + long_name: null + modality: + - multimodal + name: BBOB-biobj-mixint + noise_type: null + objectives: + - 2 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3321707.3321868 + title: BBOB bi-objective mixed-integer test suite + source: null + tags: null + type: suite + variables: + - dim: + max: 160 + min: 5 + type: integer + - dim: + max: 160 + min: 5 + type: continuous +suite_bbob_constrained: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_coco + long_name: null + modality: + - multimodal + name: BBOB-constrained + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: http://numbbo.github.io/coco-doc/bbob-constrained/ + title: bbob-constrained documentation + source: null + tags: null + type: suite + variables: + - dim: + max: 40 + min: 2 + type: continuous +suite_bbob_largescale: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_coco + long_name: null + modality: + - multimodal + name: BBOB-largescale + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.48550/arXiv.1903.06396 + title: BBOB large-scale test suite + source: null + tags: null + type: suite + variables: + - dim: + max: 640 + min: 20 + type: continuous +suite_bbob_mixint: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_coco + long_name: null + modality: + - multimodal + name: BBOB-mixint + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3321707.3321868 + title: BBOB mixed-integer test suite + source: null + tags: null + type: suite + variables: + - dim: + max: 160 + min: 5 + type: integer + - dim: + max: 160 + min: 5 + type: continuous +suite_bbob_noisy: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_coco_legacy + long_name: null + modality: + - multimodal + name: BBOB-noisy + noise_type: + - noisy + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://hal.inria.fr/inria-00369466 + title: 'Real-parameter black-box optimization benchmarking: noisy functions definitions' + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_bp: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: BP + noise_type: + - unknown + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/CEC.2019.8790277 + title: BP benchmark + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_brachytherapy: + allows_partial_evaluation: yes + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: + max: null + min: 1 + type: unknown + description: Treatment planning for internal radiation therapy. + Multi-objective with aggregated objectives; no public source code. + dynamic_type: null + fidelity_levels: + - 1 + - 2 + implementations: null + long_name: Brachytherapy treatment planning + modality: + - multimodal + name: Brachytherapy treatment planning + noise_type: null + objectives: + - 2 + - 3 + problems: null + references: + - authors: [] + link: + type: null + url: https://www.sciencedirect.com/science/article/pii/S1538472123016781 + title: Brachytherapy treatment planning + source: + - real-world + tags: null + type: suite + variables: + - dim: + max: 500 + min: 100 + type: continuous +suite_car_structure: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: 54 + type: unknown + description: 54 constraints + dynamic_type: null + fidelity_levels: null + implementations: + - impl_car_structure + long_name: null + modality: null + name: Car structure + noise_type: null + objectives: + - 2 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3205651.3205702 + title: Car structure design benchmark + source: + - real-world + tags: null + type: suite + variables: + - dim: + max: 222 + min: 144 + type: integer +suite_cdmp: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: null + dynamic_type: + - unknown + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: CDMP + noise_type: + - unknown + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3321707.3321878 + title: CDMP benchmark + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_cec2013: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: suite used for cec2013 competition. Also in IOH. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_cec2013 + - impl_iohexperimenter + long_name: null + modality: null + name: CEC2013 + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://peerj.com/articles/cs-2671/CEC2013.pdf + title: CEC2013 definitions + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_cec2015_dmoo: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: '?' + number: null + type: unknown + description: null + dynamic_type: + - dynamic + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: CEC2015-DMOO + noise_type: null + objectives: + - 2 + - 3 + problems: null + references: + - authors: [] + link: null + title: Benchmark Functions for CEC 2015 Special Session and Competition on + Dynamic Multi-objective Optimization + source: null + tags: null + type: suite + variables: + - dim: 0 + type: continuous +suite_cec2018_dt: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: '14 problems. Time-dependent: Pareto front/Pareto set geometry; irregular + Pareto front shapes; variable-linkage; number of disconnected Pareto front segments; + etc.' + dynamic_type: + - dynamic + fidelity_levels: null + implementations: + - impl_pymoo + long_name: CEC2018 Competition on Dynamic Multiobjective Optimisation + modality: null + name: CEC2018 DT + noise_type: null + objectives: + - 2 + - 3 + problems: null + references: + - authors: [] + link: + type: null + url: + https://www.academia.edu/download/94499025/TR-CEC2018-DMOP-Competition.pdf + title: CEC2018 DMOP Competition TR + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: unknown +suite_cec2022: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: suite used for cec2022 competition. Also in IOH. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_iohexperimenter + - impl_cec2022 + long_name: null + modality: null + name: CEC2022 + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: + https://github.com/P-N-Suganthan/2022-SO-BO/blob/main/CEC2022%20TR.pdf + title: CEC2022 TR + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_cfd: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: expensive evaluations 30s-15m + dynamic_type: null + fidelity_levels: null + implementations: + - impl_cfd + long_name: null + modality: null + name: CFD + noise_type: null + objectives: + - 1 + - 2 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1007/978-3-319-99259-4_24 + title: CFD test problem suite + source: + - real-world + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: unknown +suite_cre: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_reproblems + long_name: null + modality: null + name: CRE + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + problems: null + references: + - authors: + - Ryoji Tanabe + - Hisao Ishibuchi + link: + type: null + url: https://doi.org/10.1016/j.asoc.2020.106078 + title: Easy-to-evaluate real-world multi-objective optimization problems + source: + - real-world-like + tags: null + type: suite + variables: + - dim: + max: 7 + min: 3 + type: integer + - dim: + max: 7 + min: 3 + type: continuous +suite_cuter: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: A constrained and unconstrained testing environment. + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: CUTEr + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://dl.acm.org/doi/10.1145/962437.962439 + title: CUTEr + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: integer + - dim: + max: null + min: 1 + type: continuous +suite_cutest: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: some + number: + max: null + min: 1 + type: unknown + - equality: null + hard: yes + number: null + type: box + description: CUTEst for optimization software + dynamic_type: null + fidelity_levels: null + implementations: + - impl_pycutest + long_name: Constrained and Unconstrained Testing Environment with safe threads + modality: + - multimodal + name: CUTEst + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://link.springer.com/article/10.1007/s10589-014-9687-3 + title: CUTEst + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: integer + - dim: + max: null + min: 1 + type: continuous +suite_dtlz: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_pymoo + long_name: null + modality: null + name: DTLZ + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: + - Kalyanmoy Deb + - Lothar Thiele + - Marco Laumanns + - Eckart Zitzler + link: + type: null + url: https://doi.org/10.1109/CEC.2002.1007032 + title: Scalable multi-objective optimization test problems + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_dynamicbinval: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Four versions of the dynamic binary value problem + dynamic_type: + - dynamic + fidelity_levels: null + implementations: + - impl_iohexperimenter + long_name: null + modality: null + name: DynamicBinVal + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://arxiv.org/pdf/2404.15837 + title: DynamicBinVal + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: binary +suite_emo2017: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_emo2017 + long_name: null + modality: null + name: EMO2017 + noise_type: null + objectives: + - 2 + problems: null + references: + - authors: [] + link: + type: null + url: https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/ + title: BBComp EMO 2017 + source: + - real-world + tags: null + type: suite + variables: + - dim: + max: 24 + min: 4 + type: continuous +suite_etmof: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: + - dynamic + fidelity_levels: null + implementations: + - impl_etmof + long_name: null + modality: null + name: ETMOF + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + - 15 + - 16 + - 17 + - 18 + - 19 + - 20 + - 21 + - 22 + - 23 + - 24 + - 25 + - 26 + - 27 + - 28 + - 29 + - 30 + - 31 + - 32 + - 33 + - 34 + - 35 + - 36 + - 37 + - 38 + - 39 + - 40 + - 41 + - 42 + - 43 + - 44 + - 45 + - 46 + - 47 + - 48 + - 49 + - 50 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.48550/arXiv.2110.08033 + title: Evolutionary many-task optimization framework + source: null + tags: null + type: suite + variables: + - dim: + max: 10000 + min: 25 + type: continuous +suite_expobench: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: box + - equality: null + hard: some + number: null + type: unknown + description: Wind farm layout optimization, gas filter design, pipe shape optimization, hyperparameter tuning, and hospital simulation - reference: https://doi.org/10.1016/j.asoc.2023.110744 - other info: - partial evaluations: 'no' - full name: EXPensive Optimization benchmark library - constraint properties: Hard Constraints, Soft Constraints, Box Constraints, only - box constraints implemented, others appear as penalty in objective - number of constraints: 2 per variable (box), other constraints unknown (simulator - fails) - form of noise model: real-life (unknown) - type of noise space: Observational - key challenges / characteristics: Expensive objectives - scientific motivation: Address the lack of real-life expensive benchmarks - limitations: single-objective only, constraints are handled naively (penalty in - objective), no parallelization - implementation languages: Python - approximate evaluation time: 2 to 80 seconds -- name: Gasoline direct injection engine design - suite/generator/single: Single Problem - variable type: Continuous, Ordinal - dimensionality: '7' - objectives: '2' - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: Unknown - multi-fidelity: 'yes' - source (real-world/artificial): Real-World Application - implementation: https://doi.org/10.1016/j.ejor.2022.08.032 - textual description: '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.' - other info: - partial evaluations: Unknown - constraint properties: Hard Constraints, Soft Constraints - number of constraints: '5' - key challenges / characteristics: Expensive - limitations: Proprietary - implementation languages: Matlab Simulink and Wave RT co-simulation -- name: BEACON - suite/generator/single: Generator - variable type: Continuous - dimensionality: scalable - objectives: '2' - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - source (real-world/artificial): Artificially Generated - implementation: https://github.com/Stebbet/BEACON/ - textual description: Generator for bi-objective benchmark problems with explicitly - controlled correlations in continuous spaces. - reference: https://dl.acm.org/doi/10.1145/3712255.3734303 - other info: - partial evaluations: 'no' - full name: Continuous Bi-objective Benchmark problems with Explicit Adjustable - COrrelatioN control - constraint properties: Box Constraints - number of constraints: '0' - description of multimodality: Random - key challenges / characteristics: Multimodal, different correlations among objectives - scientific motivation: Controlled correlation among objectives - limitations: No analytical Pareto front, only bi-objective - implementation languages: Python - approximate evaluation time: Negligible -- name: TulipaEnergy - suite/generator/single: Problem Suite - variable type: Continuous - dimensionality: scalable - objectives: '1' - constraints: 'yes' - dynamic: 'no' - noise: 'yes' - multimodal: 'no' - multi-fidelity: 'yes' - source (real-world/artificial): Real-World Application - implementation: https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/ - textual description: 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. - reference: See https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/40-scientific-foundation/45-scientific-references - other info: - partial evaluations: Unknown - full name: TulipaEnergyModel.jl - constraint properties: Hard Constraints, Soft Constraints - number of constraints: millions - type of dynamicism: none - form of noise model: "depends on input \u2014 still working on stochastic inputs" - type of noise space: Parameter - key challenges / characteristics: modeled as a potentially very large linear program, - different fidelities possible - scientific motivation: new techniques for solving large whitebox linear optimization - problems - limitations: not yet stochastic - implementation languages: Julia / JMP - approximate evaluation time: from minutes to hours - links to usage examples: https://github.com/TulipaEnergy/Tulipa-OBZ-CaseStudy -- name: ATO - suite/generator/single: Single Problem - variable type: Continuous - dimensionality: '10' - objectives: '2' - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'no' - multi-fidelity: 'no' - source (real-world/artificial): Real-World Application - implementation: '-' - textual description: 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. - other info: - partial evaluations: 'no' -- name: Brachytherapy treatment planning - suite/generator/single: Problem Suite - variable type: Continuous - dimensionality: 100-500 - objectives: 2-3 - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'yes' - source (real-world/artificial): Real-World Application - textual description: Treatment planning for internal radiation therapy - reference: https://www.sciencedirect.com/science/article/pii/S1538472123016781 - other info: - partial evaluations: 'yes' - full name: Brachytherapy treatment planning - constraint properties: Hard Constraints - number of constraints: scalable - key challenges / characteristics: Multi-objective; aggregated objectives - limitations: No public source code -- name: FleetOpt - suite/generator/single: Single Problem - variable type: Integer - dimensionality: 'Upper level: 54; lower level: 13208' - objectives: '1' - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: Unknown - multi-fidelity: 'no' - source (real-world/artificial): Real-World Application - implementation: 'Not public: was done for real client with their private data' - textual description: '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' - reference: https://dl.acm.org/doi/abs/10.1145/3638530.3664137 - other info: - partial evaluations: 'yes' -- name: Building spatial design - suite/generator/single: Single Problem - variable type: Continuous, Boolean - dimensionality: scalable depending on problem size (e.g. 90 for) - objectives: '2' - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: Unknown - multi-fidelity: 'no' - source (real-world/artificial): Real-World Application - implementation: https://github.com/TUe-excellent-buildings/BSO-toolbox - textual description: 'Optimise the spatial layout of a building to: minimise energy - consumption for climate control, and minimise the strain on the structure' - reference: https://hdl.handle.net/1887/81789 - other info: - partial evaluations: 'no' - full name: Building spatial design - constraint properties: Hard Constraints, Box Constraints, Permutation Constraints - number of constraints: 2065 (as example, depends on problem size) - key challenges / characteristics: Many hard constraints (simulator cannot evaluate - the solution if these are violated); Mixed-variable search space (continuous - + binary); Multiple objectives; (Somewhat) expensive solution evaluations - implementation languages: C++ - approximate evaluation time: Roughly 1 second per evaluation for the smallest - considered design, and roughly 40 seconds for the larger designs we considered. - (Even the larger designs we considered are still relatively small for the considered - problem.) -- name: Electric Motor Design Optimization - suite/generator/single: Single Problem - variable type: Continuous, Integer - dimensionality: '13' - objectives: '1' - constraints: 'yes' - dynamic: 'no' - noise: 'yes' - multimodal: 'yes' - multi-fidelity: 'no' - source (real-world/artificial): Real-World Application - implementation: Implementation not freely available - textual description: The goal is to find a design of a synchronous electric motor - for power steering systems that minimizes costs and satisfies all constraints. - reference: https://dis.ijs.si/tea/Publications/Tusar23Multistep.pdf (paper in Slovene) - other info: - partial evaluations: 'no' - full name: Electric Motor Design Optimization - constraint properties: Hard Constraints, Soft Constraints, Box Constraints - number of constraints: '12' - description of multimodality: Constraints are multimodal - key challenges / characteristics: Time-consuming solution evaluation, highly-constrained - problem - scientific motivation: Challenging to find good solutions in a limited time - limitations: 'Unavailability, even if available, it wouldn''t be helpful to use - for benchmarking due taking a long time to evaluate a single solution ' - implementation languages: Python - approximate evaluation time: 8 minutes - general: This is not an available problem, but could be interesting to show to - researchers which difficulties appear in real-world problems -- name: BONO-Bench - suite/generator/single: Generator - variable type: Continuous - dimensionality: scalable - objectives: '2' - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - source (real-world/artificial): Artificially Generated - implementation: https://github.com/schaepermeier/bonobench - textual description: 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. - other info: - partial evaluations: 'no' - full name: Bi-objective Numerical Optimization Benchmark (BONO-Bench) - constraint properties: Box Constraints - implementation languages: Python -- name: RandOptGen - suite/generator/single: Generator - variable type: Continuous, Integer, Boolean - dimensionality: scalable - objectives: scalable - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - source (real-world/artificial): Artificially Generated - implementation: https://github.com/MALEO-research-group/RandOptGen - textual description: 'RandOptGen: A Unified Random Problem Generator for Single-and - Multi-Objective Optimization Problems with Mixed-Variable Input Spaces' - other info: - partial evaluations: 'no' - full name: RandOptGen - implementation languages: Python - approximate evaluation time: milliseconds - links to usage examples: https://doi.org/10.1145/3712256.3726478 -- name: CUTEr - suite/generator/single: Problem Suite - variable type: Continuous, Integer, Boolean - dimensionality: scalable - objectives: '1' - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: Unknown - multi-fidelity: 'no' - source (real-world/artificial): Artificially Generated - implementation: Not Found - textual description: A constrained and unconstrained testing environment - reference: https://dl.acm.org/doi/10.1145/962437.962439 - other info: - partial evaluations: 'no' -- name: CUTEst - suite/generator/single: Problem Suite - variable type: Continuous, Integer, Boolean - dimensionality: scalable - objectives: '1' - constraints: 'yes' - dynamic: 'no' - noise: 'no' - multimodal: 'yes' - multi-fidelity: 'no' - source (real-world/artificial): Artificially Generated - implementation: https://github.com/jfowkes/pycutest - textual description: The Constrained and Unconstrained Testing Environment with - safe threads (CUTEst) for optimization software - reference: https://link.springer.com/article/10.1007/s10589-014-9687-3 - other info: - partial evaluations: 'no' - full name: 'Constrained and Unconstrained Testing Environment with safe threads ' - constraint properties: Soft Constraints, Box Constraints - number of constraints: scalable - implementation languages: Python, C++, Fortran - general: 'Python implementation: https://github.com/jfowkes/pycutest' -- name: PUBOi - suite/generator/single: Generator - variable type: Boolean - dimensionality: scalable - objectives: '1' - constraints: 'no' - dynamic: 'no' - noise: 'no' - multimodal: Unknown - multi-fidelity: 'no' - source (real-world/artificial): Artificially Generated - implementation: https://gitlab.com/verel/pubo-importance-benchmark - textual description: A benchmark in which variable importance is tunable, based - on the Walsh function - reference: https://link.springer.com/chapter/10.1007/978-3-031-04148-8_12 - other info: - partial evaluations: 'no' - full name: Polynomial Unconstrained Binary Optimization - key challenges / characteristics: Tunable variable importance - implementation languages: Python, C++ + dynamic_type: null + fidelity_levels: null + implementations: + - impl_expobench + long_name: EXPensive Optimization benchmark library + modality: null + name: EXPObench + noise_type: + - real-life + - observational + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1016/j.asoc.2023.110744 + title: EXPObench + source: + - real-world + tags: null + type: suite + variables: + - dim: + max: 135 + min: 10 + type: integer + - dim: + max: 135 + min: 10 + type: categorical + - dim: + max: 135 + min: 10 + type: continuous +suite_gbea: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: expensive evaluations 5s-35s, RW-GAN-Mario and TopTrumps are part + of GBEA + dynamic_type: null + fidelity_levels: null + implementations: + - impl_gbea + long_name: null + modality: + - multimodal + name: GBEA + noise_type: + - noisy + objectives: + - 1 + - 2 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/3321707.3321805 + title: Game benchmark for evolutionary algorithms + source: + - real-world + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_gnbg: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Generalized Numerical Benchmark Generator + dynamic_type: null + fidelity_levels: null + implementations: + - impl_gnbg + long_name: null + modality: null + name: GNBG + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://arxiv.org/abs/2312.07083 + title: GNBG + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_gnbg_ii: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Generalized Numerical Benchmark Generator (version 2). Also + available in IOH. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_iohgnbg + - impl_gnbg_ii + long_name: null + modality: null + name: GNBG-II + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://dl.acm.org/doi/pdf/10.1145/3712255.3734271 + title: GNBG-II + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_iohclustering: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: 'Set of benchmark problems from clustering: optimization task is selecting + cluster centers for a given set of data.' + dynamic_type: null + fidelity_levels: null + implementations: + - impl_iohclustering + long_name: null + modality: + - multimodal + name: IOHClustering + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://arxiv.org/pdf/2505.09233 + title: IOHClustering + source: + - artificial-from-real-data + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_kinematics_robotarm: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_transfer_rf_bbob_rw + long_name: null + modality: + - unimodal + name: KinematicsRobotArm + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1023/A:1013258808932 + title: Kinematics of a robot arm + source: + - real-world + tags: null + type: suite + variables: + - dim: 21 + type: continuous +suite_l1_zdt: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Variant of ZDT with linkages between variables within groups + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: L1-ZDT + noise_type: null + objectives: + - 2 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/1143997.1144179 + title: Linkage ZDT/DTLZ variants + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: continuous +suite_l2_dtlz: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Variant of DTLZ2/DTLZ3 with linkages between all variables + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: L2-DTLZ + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/1143997.1144179 + title: Linkage ZDT/DTLZ variants + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_l2_zdt: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Variant of ZDT with linkages between all variables + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: L2-ZDT + noise_type: null + objectives: + - 2 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/1143997.1144179 + title: Linkage ZDT/DTLZ variants + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: continuous +suite_l3_dtlz: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Variant of L2-DTLZ with anti-linkage mapping + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: L3-DTLZ + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/1143997.1144179 + title: Linkage ZDT/DTLZ variants + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_l3_zdt: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Variant of L2-ZDT with anti-linkage mapping + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: L3-ZDT + noise_type: null + objectives: + - 2 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1145/1143997.1144179 + title: Linkage ZDT/DTLZ variants + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: continuous +suite_maop: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: MaOP + noise_type: + - unknown + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1016/j.swevo.2019.02.003 + title: MaOP benchmark + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_mechbench: + allows_partial_evaluation: no + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: + - 1 + - 2 + type: unknown + description: Set of problems inspired by Structural Mechanics Design + Optimization. Embeds physical simulations (plasticity only, no + fracture/damage). Unstructured/non-isotropic multimodality. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_mechbench + long_name: MECHBench + modality: + - multimodal + name: MECHBench + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://arxiv.org/abs/2511.10821 + title: MECHBench + source: + - real-world + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_mf2: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: + - 1 + - 2 + implementations: + - impl_mf2 + long_name: null + modality: null + name: MF2 + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.21105/joss.02049 + title: 'mf2: a collection of multi-fidelity benchmark functions in Python' + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_minus_dtlz: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Variant of DTLZ that minimises the inverse of the base DTLZ + functions + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: Minus DTLZ + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/TEVC.2016.2587749 + title: Minus DTLZ / Minus WFG + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_minus_wfg: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Variant of WFG that minimises the inverse of the base WFG + functions + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: Minus WFG + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/TEVC.2016.2587749 + title: Minus DTLZ / Minus WFG + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_mmopp: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_mmopp + long_name: null + modality: + - multimodal + name: MMOPP + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + problems: null + references: + - authors: [] + link: + type: null + url: + http://www5.zzu.edu.cn/system/_content/download.jsp?urltype=news.DownloadAttachUrl&owner=1327567121&wbfileid=4764412 + title: MMOPP technical report + source: null + tags: null + type: suite + variables: + - dim: 0 + type: unknown +suite_modact: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: Realistic Constrained Multi-Objective Optimization Benchmark + Problems from Design. + dynamic_type: null + fidelity_levels: null + implementations: + - impl_pymoo + - impl_modact + long_name: multiobjective design of actuators + modality: null + name: MODAct + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/TEVC.2020.3020046 + title: MODAct + source: + - real-world + tags: null + type: suite + variables: + - dim: 20 + type: continuous + - dim: 20 + type: integer +suite_morepo: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: '?' + number: null + type: unknown + description: null + dynamic_type: + - unknown + fidelity_levels: null + implementations: + - impl_morepo + long_name: null + modality: null + name: MOrepo + noise_type: + - unknown + objectives: + - 2 + problems: null + references: null + source: null + tags: null + type: suite + variables: + - dim: 0 + type: unknown +suite_pbo: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: Suite of 25 binary optimization problems + dynamic_type: null + fidelity_levels: null + implementations: + - impl_iohexperimenter + long_name: null + modality: null + name: PBO + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://dl.acm.org/doi/pdf/10.1145/3319619.3326810 + title: PBO benchmarks + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: binary +suite_porkchop: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_transfer_rf_bbob_rw + long_name: null + modality: + - multimodal + name: PorkchopPlotInterplanetaryTrajectory + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/CEC65147.2025.11042973 + title: Porkchop plot interplanetary trajectory benchmark + source: + - real-world + tags: null + type: suite + variables: + - dim: 2 + type: continuous +suite_re: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_reproblems + long_name: null + modality: null + name: RE + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + problems: null + references: + - authors: + - Ryoji Tanabe + - Hisao Ishibuchi + link: + type: null + url: https://doi.org/10.1016/j.asoc.2020.106078 + title: Easy-to-evaluate real-world multi-objective optimization problems + source: + - real-world-like + tags: null + type: suite + variables: + - dim: + max: 7 + min: 2 + type: integer + - dim: + max: 7 + min: 2 + type: continuous +suite_rwmvop: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: yes + number: null + type: unknown + description: null + dynamic_type: null + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: RWMVOP + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/TEVC.2013.2281531 + title: RWMVOP + source: + - real-world + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: categorical + - dim: + max: null + min: 1 + type: integer + - dim: + max: null + min: 1 + type: continuous +suite_sbox_cost: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: problems from BBOB but allows instances with the optimum close to + the boundary + dynamic_type: null + fidelity_levels: null + implementations: + - impl_iohexperimenter + long_name: null + modality: + - multimodal + name: SBOX-COST + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.48550/arXiv.2305.12221 + title: SBOX-COST + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_sdp: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: + - dynamic + fidelity_levels: null + implementations: null + long_name: null + modality: null + name: SDP + noise_type: + - unknown + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: [] + link: + type: null + url: https://doi.org/10.1109/TCYB.2019.2896021 + title: SDP dynamic multi-objective benchmark + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_submodular: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: set of graph-based submodular optimization problems from 4 + problem types + dynamic_type: null + fidelity_levels: null + implementations: + - impl_iohexperimenter + long_name: null + modality: null + name: Submodular Optimization + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10254181 + title: Submodular optimization benchmark + source: + - artificial + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: binary +suite_tulipa_energy: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: + - equality: null + hard: some + number: null + type: unknown + - equality: null + hard: yes + number: null + type: unknown + description: Determine the optimal investment and operation decisions for + different assets in the energy system (production, consumption, conversion, + storage, transport) while minimizing loss of load. Modelled as a potentially + very large linear program with multiple fidelity levels. + dynamic_type: null + fidelity_levels: + - 1 + - 2 + implementations: + - impl_tulipa + long_name: TulipaEnergyModel.jl + modality: + - unimodal + name: TulipaEnergy + noise_type: + - parameter + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: + https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/40-scientific-foundation/45-scientific-references + title: TulipaEnergyModel.jl scientific references + source: + - real-world + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_vehicle_dynamics: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_vehicle_dynamics + long_name: null + modality: + - multimodal + name: VehicleDynamics + noise_type: null + objectives: + - 1 + problems: null + references: + - authors: [] + link: + type: null + url: https://www.scitepress.org/Papers/2023/121580/121580.pdf + title: VehicleDynamics benchmark + source: + - real-world + tags: null + type: suite + variables: + - dim: 2 + type: continuous +suite_wfg: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_pymoo + long_name: null + modality: null + name: WFG + noise_type: null + objectives: + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + problems: null + references: + - authors: + - Simon Huband + - Philip Hingston + - Luigi Barone + - Lyndon While + link: + type: null + url: https://doi.org/10.1109/TEVC.2005.861417 + title: A review of multiobjective test problems and a scalable test problem + toolkit + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: continuous +suite_zdt: + allows_partial_evaluation: null + can_evaluate_objectives_independently: null + code_examples: null + constraints: null + description: null + dynamic_type: null + fidelity_levels: null + implementations: + - impl_pymoo + long_name: null + modality: null + name: ZDT + noise_type: null + objectives: + - 2 + problems: null + references: + - authors: + - Eckart Zitzler + - Kalyanmoy Deb + - Lothar Thiele + link: + type: null + url: https://doi.org/10.1162/106365600568202 + title: 'Comparison of multiobjective evolutionary algorithms: empirical results' + source: null + tags: null + type: suite + variables: + - dim: + max: null + min: 1 + type: binary + - dim: + max: null + min: 1 + type: continuous + From d107213fc0a0720a5821d7712fcf9c1d42fb17ac Mon Sep 17 00:00:00 2001 From: Dvermetten Date: Wed, 22 Apr 2026 16:54:36 +0200 Subject: [PATCH 08/20] Initial version of new yaml to html conversion --- docs/index.html | 4737 ++++++++++++++++++++++++++++---------- docs/javascript.html | 196 +- docs/problems.html | 4537 ++++++++++++++++++++++++++---------- docs/table_styles.css | 28 + docs/table_template.html | 18 +- yaml_to_html.py | 812 ++++++- 6 files changed, 7752 insertions(+), 2576 deletions(-) diff --git a/docs/index.html b/docs/index.html index 78f6a70..ce97309 100644 --- a/docs/index.html +++ b/docs/index.html @@ -24,1233 +24,3332 @@

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
-
- - -
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
nametextual descriptionsuite/generator/singleobjectivesdimensionalityvariable typeconstraintsdynamicnoisemulti-fidelitysource (real-world/artificial)referenceimplementation
BBOBsuite1scalablecontinuousnonononohttps://doi.org/10.1080/10556788.2020.1808977https://github.com/numbbo/coco
BBOB-biobjsuite22-40continuousnonononohttps://doi.org/10.48550/arXiv.1604.00359https://github.com/numbbo/coco
BBOB-noisysuite1scalablecontinuousnonoyesnohttps://hal.inria.fr/inria-00369466https://web.archive.org/web/20210416065610/https://coco.gforge.inria.fr/doku.php?id=downloads
BBOB-largescalesuite120-640continuousnonononohttps://doi.org/10.48550/arXiv.1903.06396https://github.com/numbbo/coco
BBOB-mixintsuite15-160integer;continuous;mixednonononohttps://doi.org/10.1145/3321707.3321868https://github.com/numbbo/coco
BBOB-biobj-mixintsuite25-160integer;continuous;mixednonononohttps://doi.org/10.1145/3321707.3321868https://github.com/numbbo/coco
BBOB-constrainedsuite12-40continuousyesnononohttp://numbbo.github.io/coco-doc/bbob-constrained/https://github.com/numbbo/coco
MOreposuite2?combinatorial???nohttps://github.com/MCDMSociety/MOrepo
ZDTsuite2scalablecontinuous;binarynonononohttps://doi.org/10.1162/106365600568202https://github.com/anyoptimization/pymoo
DTLZsuite2+scalablecontinuousnonononohttps://doi.org/10.1109/CEC.2002.1007032https://pymoo.org/problems/many/dtlz.html
WFGsuite2+scalablecontinuousnonononohttps://doi.org/10.1109/TEVC.2005.861417https://pymoo.org/problems/many/wfg.html
CDMPsuite2+scalablecontinuousyes??nohttps://doi.org/10.1145/3321707.3321878?
SDPsuite2+scalablecontinuousnoyes?nohttps://doi.org/10.1109/TCYB.2019.2896021?
MaOPsuite2+scalablecontinuousnono?nohttps://doi.org/10.1016/j.swevo.2019.02.003?
BPsuite2+scalablecontinuousnono?nohttps://doi.org/10.1109/CEC.2019.8790277?
GPDgenerator2+scalablecontinuousoptionalnooptionalnohttps://doi.org/10.1016/j.asoc.2020.106139?
ETMOFsuite2-5025-10000continuousnoyesnonohttps://doi.org/10.48550/arXiv.2110.08033https://github.com/songbai-liu/etmo
MMOPPsuite2-7??yesnononohttp://www5.zzu.edu.cn/system/_content/download.jsp?urltype=news.DownloadAttachUrl&owner=1327567121&wbfileid=4764412http://www5.zzu.edu.cn/ecilab/info/1036/1251.htm
CFDexpensive evaluations 30s-15msuite1-2scalable?yesnononoreal worldhttps://doi.org/10.1007/978-3-319-99259-4_24https://bitbucket.org/arahat/cfd-test-problem-suite
GBEAexpensive evaluations 5s-35s, RW-GAN-Mario and TopTrumps are part of GBEAsuite1-2scalablecontinuousnonoyesnoreal worldhttps://doi.org/10.1145/3321707.3321805https://github.com/ttusar/coco-gbea
Car structure54 constraintssuite2144-222discreteyesnononoreal worldhttps://doi.org/10.1145/3205651.3205702http://ladse.eng.isas.jaxa.jp/benchmark/
EMO2017suite24-24continuousnonononoreal worldhttps://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/downloads/realworld-problems-bbcomp-EMO-2017.zip
JSEC2019expensive evaluations 3s; 22 constraintssingle1-532continuousyesnononoreal worldhttp://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.htmlhttp://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.html
REsuite2-92-7continuous;integer;mixednonononoreal world likehttps://doi.org/10.1016/j.asoc.2020.106078https://github.com/ryojitanabe/reproblems
CREsuite2-53-7continuous;integer;mixedyesnononoreal world likehttps://doi.org/10.1016/j.asoc.2020.106078https://github.com/ryojitanabe/reproblems
Radar waveformsingle94-12integeryesnononoreal worldhttps://doi.org/10.1007/978-3-540-70928-2_53http://code.evanhughes.org/
MF2suite11-ncontinuousnononoyeshttps://doi.org/10.21105/joss.02049https://github.com/sjvrijn/mf2
AMVOPsuite1scalablemixed continuous+ordinal+categorical+bothnonononohttps://doi.org/10.1109/TEVC.2013.2281531?
RWMVOPsuite1scalablecontinuous;mixed continuous+ordinal+categorical+bothyesnononoreal worldhttps://doi.org/10.1109/TEVC.2013.2281531?
SBOX-COSTproblems from BBOB but allows instances with the optimum close to the boundarysuite1scalablecontinuousnonononohttps://doi.org/10.48550/arXiv.2305.12221https://github.com/IOHprofiler/IOHexperimenter/
ρMNK-Landscapestunable variable and objective dimensions; tunable multimodality and correlation between objectivesgeneratorscalablescalablebinarynonononohttps://doi.org/10.1016/j.ejor.2012.12.019https://gitlab.com/aliefooghe/mocobench/
mUBQPtunable variable and objective dimensions; tunable density and correlation between objectivesgeneratorscalablescalablebinarynonononohttps://doi.org/10.1016/j.asoc.2013.11.008https://gitlab.com/aliefooghe/mocobench/
ρmTSPtunable variable and objective dimensions; tunable instance type (euclidian/random); tunable correlation between objectivesgeneratorscalablescalablepermutationsno (apart from being permutations)nononohttps://doi.org/10.1007/978-3-319-45823-6_40https://gitlab.com/aliefooghe/mocobench/
CEC2015-DMOOsuite2-3?continuous?yesnonoBenchmark Functions for CEC 2015 Special Session and Competition on Dynamic Multi-objective Optimization
EalainReal-world-like, easily extensible to increase complexitygenerator1+scalablecontinuous,binary,integeroptionaloptionalnooptionalReal-world-likehttps://doi.org/10.1145/3638530.3654299https://github.com/qrenau/Ealain
MA-BBOBGenerator that creates affine combinations of BBOB functionsgenerator1scalablecontinuousnonononoartificialhttps://doi.org/10.1145/3673908https://github.com/IOHprofiler/IOHexperimenter/blob/master/example/Competitions/MA-BBOB/Example_MABBOB.ipynb
MPM2nonlinear nonseparable nonsymmetric; scalable in terms of time to evaluate the objective functiongenerator1scalablecontinuousnonononohttps://ls11-www.cs.tu-dortmund.de/_media/techreports/tr15-01.pdfhttps://github.com/jakobbossek/smoof/blob/master/inst/mpm2.py
Convex DTLZ2Variant of DTLZ2 with a convex Pareto front (instead of concave)single2+scalablecontinuousnonononohttps://doi.org/10.1109/TEVC.2013.2281535?
Inverted DTLZ1Variant of DTLZ1 with an inverted Pareto frontsingle2+scalablecontinuousnonononohttps://doi.org/10.1109/TEVC.2013.2281534?
Minus DTLZVariant of DTLZ that minimises the inverse of the base DTLZ functionssuite2+scalablecontinuousnonononohttps://doi.org/10.1109/TEVC.2016.2587749?
Minus WFGVariant of WFG that minimises the inverse of the base WFG functionssuite2+scalablecontinuousnonononohttps://doi.org/10.1109/TEVC.2016.2587749?
L1-ZDTVariant 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 structuresuite2scalablecontinuous;binarynonononohttps://doi.org/10.1145/1143997.1144179?
L2-ZDTVariant of ZDT with linkages between all variables; Linear recombination operators can potentially take advantage of the problem structuresuite2scalablecontinuous;binarynonononohttps://doi.org/10.1145/1143997.1144179?
L3-ZDTVariant of L2-ZDT using a mapping to prevent linear recombination operators from potentially taking advantage of the problem structuresuite2scalablecontinuous;binarynonononohttps://doi.org/10.1145/1143997.1144179?
L2-DTLZVariant of DTLZ2 and DTLZ3 with linkages between all variables; Linear recombination operators can potentially take advantage of the problem structuresuite2+scalablecontinuousnonononohttps://doi.org/10.1145/1143997.1144179?
L3-DTLZVariant of L2-DTLZ using a mapping to prevent linear recombination operators from potentially taking advantage of the problem structuresuite2+scalablecontinuousnonononohttps://doi.org/10.1145/1143997.1144179?
CEC2018 DT - CEC2018 Competition on Dynamic Multiobjective Optimisation14 problems. Time-dependent: Pareto front/Pareto set geometry; irregular Pareto front shapes; variable-linkage; number of disconnected Pareto front segments; etc.suite2 or 3scalable??noyesnonoartificialhttps://www.academia.edu/download/94499025/TR-CEC2018-DMOP-Competition.pdfhttps://pymoo.org/problems/dynamic/df.html
MODAct - multiobjective design of actuatorsRealistic Constrained Multi-Objective Optimization Benchmark Problems from Design. Need the https://github.com/epfl-lamd/modact package installed; evaluation times around 20mssuite2 3 4 or 520mixed; integer and continuousyesnononoreal-worldhttps://doi.org/10.1109/TEVC.2020.3020046https://pymoo.org/problems/constrained/modact.html
IOHClusteringSet 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 datasetssuite; generator1scalablecontinuousnonononoartificial, but based on real datahttps://arxiv.org/pdf/2505.09233https://github.com/IOHprofiler/IOHClustering
GNBG-IIGeneralized Numerical Benchmark Generator (version 2). Also in IOH https://github.com/IOHprofiler/IOHGNBGsuite; generator1scalablecontinuousnonononoartificialhttps://dl.acm.org/doi/pdf/10.1145/3712255.3734271https://github.com/rohitsalgotra/GNBG-II
GNBGGeneralized Numerical Benchmark Generatorsuite; generator1scalablecontinuousnonononoartificialhttps://arxiv.org/abs/2312.07083https://github.com/Danial-Yazdani/GNBG-Generator
DynamicBinValFour versions of the dynamic binary value problemsuite1scalablebinarynoyesnonoartificialhttps://arxiv.org/pdf/2404.15837https://github.com/IOHprofiler/IOHexperimenter
PBOSuite of 25 binary optimization problemssuite1scalablebinarynonononoartificialhttps://dl.acm.org/doi/pdf/10.1145/3319619.3326810https://github.com/IOHprofiler/IOHexperimenter
W-modelTunable generator for binary optimization based on several difficulty featuresgenerator1scalablebinarynonononoartificialhttps://dl.acm.org/doi/abs/10.1145/3205651.3208240?casa_token=S4U_Pi9f6MwAAAAA:U9ztNTPwmupT8K3GamWZfBL7-8fqjxPtr_kprv51vdwA-REsp0EyOFGa99BtbANb0XbqyrVg795hIwhttps://github.com/thomasWeise/BBDOB_W_Model
Submodular Optimitzationset of graph-based submodular optimization problems from 4 problem typessuite1scalablebinarynonononoartificialhttps://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10254181https://github.com/IOHprofiler/IOHexperimenter
CEC2013suite used for cec2013 competition. Also in IOH https://github.com/IOHprofiler/IOHexperimentersuite1scalablecontinuousnonononoartificialhttps://peerj.com/articles/cs-2671/CEC2013.pdfhttps://github.com/P-N-Suganthan/CEC2013
CEC2022suite used for cec2022 competition. Also in IOH https://github.com/IOHprofiler/IOHexperimentersuite1scalablecontinuousnonononoartificialhttps://github.com/P-N-Suganthan/2022-SO-BO/blob/main/CEC2022%20TR.pdfhttps://github.com/P-N-Suganthan/2022-SO-BO
Onemax+Sphere / Zeromax+Spheresingle2scalablebinary and continuous;mixed;nonononoartificialhttps://doi.org/10.1145/3449726.3459521None
Onemax+Sphere / DeceptiveTrap+RotatedEllipsoidsingle2scalablebinary and continuous;mixed;nonononoartificialhttps://doi.org/10.1145/3449726.3459521None
InverseDeceptiveTrap+RotatedEllipsoid / DeceptiveTrap+RotatedEllipsoidsingle2scalablebinary and continuous;mixed;nonononoartificialhttps://doi.org/10.1145/3449726.3459521None
PorkchopPlotInterplanetaryTrajectorysuite12continuousnonononoreal-worldhttps://doi.org/10.1109/CEC65147.2025.11042973https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world
KinematicsRobotArmsuite121continuousnonononoreal-worldhttps://doi.org/10.1023/A:1013258808932https://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_world
VehicleDynamicssuite12continuousnonononoreal-worldhttps://www.scitepress.org/Papers/2023/121580/121580.pdfhttps://zenodo.org/records/8307853
MECHBenchThis 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 Suite1scalable'ContinuousyesnononoReal-World Applicationhttps://arxiv.org/abs/2511.10821https://github.com/BayesOptApp/MECHBench
EXPObenchWind farm layout optimization, gas filter design, pipe shape optimization, hyperparameter tuning, and hospital simulationProblem Suite110 to 135Continuous, Integer, Categorical, ConditionalyesnoyesnoReal-World Applicationhttps://doi.org/10.1016/j.asoc.2023.110744https://github.com/AlgTUDelft/ExpensiveOptimBenchmark
Gasoline direct injection engine designA 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 Problem27Continuous, OrdinalyesnonoyesReal-World Applicationhttps://doi.org/10.1016/j.ejor.2022.08.032
BEACONGenerator for bi-objective benchmark problems with explicitly controlled correlations in continuous spaces.Generator2scalableContinuousnonononoArtificially Generatedhttps://dl.acm.org/doi/10.1145/3712255.3734303https://github.com/Stebbet/BEACON/
TulipaEnergyDetermine 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 Suite1scalableContinuousyesnoyesyesReal-World ApplicationSee https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/40-scientific-foundation/45-scientific-referenceshttps://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/
ATOParameters 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 Problem210ContinuousnonononoReal-World Application-
Brachytherapy treatment planningTreatment planning for internal radiation therapyProblem Suite2-3100-500ContinuousyesnonoyesReal-World Applicationhttps://www.sciencedirect.com/science/article/pii/S1538472123016781
FleetOptHealthcare 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.3664137Single Problem1Upper level: 54; lower level: 13208IntegeryesnononoReal-World Applicationhttps://dl.acm.org/doi/abs/10.1145/3638530.3664137Not public: was done for real client with their private data
Building spatial designOptimise the spatial layout of a building to: minimise energy consumption for climate control, and minimise the strain on the structureSingle Problem2scalable depending on problem size (e.g. 90 for)Continuous, BooleanyesnononoReal-World Applicationhttps://hdl.handle.net/1887/81789https://github.com/TUe-excellent-buildings/BSO-toolbox
Electric Motor Design OptimizationThe goal is to find a design of a synchronous electric motor for power steering systems that minimizes costs and satisfies all constraints.Single Problem113Continuous, IntegeryesnoyesnoReal-World Applicationhttps://dis.ijs.si/tea/Publications/Tusar23Multistep.pdf (paper in Slovene)Implementation not freely available
BONO-BenchBi-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.Generator2scalableContinuousnonononoArtificially Generatedhttps://github.com/schaepermeier/bonobench
RandOptGenRandOptGen: A Unified Random Problem Generator for Single-and Multi-Objective Optimization Problems with Mixed-Variable Input SpacesGeneratorscalablescalableContinuous, Integer, BooleannonononoArtificially Generatedhttps://github.com/MALEO-research-group/RandOptGen
CUTErA constrained and unconstrained testing environmentProblem Suite1scalableContinuous, Integer, BooleanyesnononoArtificially Generatedhttps://dl.acm.org/doi/10.1145/962437.962439Not Found
CUTEstThe Constrained and Unconstrained Testing Environment with safe threads (CUTEst) for optimization softwareProblem Suite1scalableContinuous, Integer, BooleanyesnononoArtificially Generatedhttps://link.springer.com/article/10.1007/s10589-014-9687-3https://github.com/jfowkes/pycutest
PUBOiA benchmark in which variable importance is tunable, based on the Walsh functionGenerator1scalableBooleannonononoArtificially Generatedhttps://link.springer.com/chapter/10.1007/978-3-031-04148-8_12https://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
-
-
- -
-

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.

-
-
-
+
+
+
+ Visible Columns +
+ + +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameTypeVariable TypesTotal VariablesObjectivesPropertiesConstraint TypesTotal ConstraintsDynamicsNoisePartial EvaluationsIndependent ObjectivesFidelity LevelsFull NameDescriptionTagsReferencesImplementationsModalityExamplesSourceBinary VarsCategorical VarsContinuous VarsInteger VarsImplementation NamesImplementation LanguagesImplementation Evaluation TimesImplementation LinksImplementation DescriptionsImplementation RequirementsHard Box ConstraintsSoft Box ConstraintsHard Linear ConstraintsSoft Linear ConstraintsHard Function ConstraintsSoft Function Constraints
fn_atoATOProblemcontinuous102noParameters of the Modules of the Automatic Train Operation are optimized; two objectives: minimizing energy consumption and minimizing driving duration.unimodalreal-world10
fn_building_spatialBuilding spatial designProblembinary | continuous>=22unknown | box>=2noOptimise the spatial layout of a building to minimise energy consumption for climate control and minimise the strain on the structure. Many hard constraints; mixed-variable (continuous+binary); expensive evaluations.Building spatial design, https://hdl.handle.net/1887/81789impl_bso_toolboxreal-world>=1>=1BSO-toolboxC++~1s (smallest) to ~40s (larger)https://github.com/TUe-excellent-buildings/BSO-toolboxBuilding Spatial Design toolbox (TU/e)>=1
fn_convex_dtlz2Convex DTLZ2Problemcontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]Variant of DTLZ2 with a convex Pareto front (instead of concave)Convex DTLZ2, https://doi.org/10.1109/TEVC.2013.2281535>=1
fn_emdoElectric Motor Design OptimizationProbleminteger | continuous261noisybox | unknown>=14noisynoElectric Motor Design Optimization# Goal\nFind a design of a synchronous electric motor for power steering systems that minimizes costs and satisfies all constraints.\n\n# Motivation\nChallenging to find good solutions in a limited time.\n\n# Key Challenges\n* Time-consuming solution evaluation\n* Highly-constrained problem\n* Constraints are multimodal\n\nThis is not an available problem, but could be interesting to show to researchers which difficulties appear in real-world problems.A Multi-Step Evaluation Process in Electric Motor Design, Tea Tušar; Peter Korošec; Bogdan Filipič, https://dis.ijs.si/tea/Publications/Tusar23Multistep.pdfimpl_emdomultimodalreal-world1313Electric Motor Design OptimizationPython8 minutesNot publicly available>=1
fn_fleetoptFleetOptProbleminteger{54, 13208}1unknown>=1yesUK healthcare organisation fleet optimisation: reduce the fleet of non-emergency healthcare trip vehicles while still ensuring all trips can be covered. Bilevel: upper level 54 vars, lower level 13208 vars.FleetOpt, https://dl.acm.org/doi/abs/10.1145/3638530.3664137real-world{54, 13208}
fn_gasolineGasoline direct injection engine designProbleminteger | continuous142multi-fidelityunknown5[1, 2]Multi-objective optimization to minimize fuel consumption and NOx emissions over a two-minute dynamic duty cycle, subject to five constraints (turbine inlet temperature, knock occurrences, peak cylinder pressure, peak cylinder pressure rise, total work). Seven decision variables cover hardware choices and engine control parameters.Gasoline direct injection engine design, https://doi.org/10.1016/j.ejor.2022.08.032impl_gasolinereal-world77Gasoline direct injection engine designMatlab Simulink / Wave RThttps://doi.org/10.1016/j.ejor.2022.08.032Proprietary Matlab Simulink + Wave RT co-simulation
fn_invdeceptive_deceptive_rotellInverseDeceptiveTrap+RotatedEllipsoid / DeceptiveTrap+RotatedEllipsoidProblembinary | continuous>=22Mixed-variable multi-objective test problems, https://doi.org/10.1145/3449726.3459521artificial>=1>=1
fn_inverted_dtlz1Inverted DTLZ1Problemcontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]Variant of DTLZ1 with an inverted Pareto frontInverted DTLZ1, https://doi.org/10.1109/TEVC.2013.2281534>=1
fn_jsec2019JSEC2019Problemcontinuous32[1, 2, 3, 4, 5]unknown22expensive evaluations 3s; 22 constraintsJPNSEC EC-Symposium 2019 competition, http://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.htmlimpl_jsec2019real-world32JSEC 2019 competition3shttp://www.jpnsec.org/files/competition2019/EC-Symposium-2019-Competition-English.htmlJPNSEC EC-Symposium 2019 competition problem
fn_onemax_sphere_deceptive_rotellOnemax+Sphere / DeceptiveTrap+RotatedEllipsoidProblembinary | continuous>=22Mixed-variable multi-objective test problems, https://doi.org/10.1145/3449726.3459521artificial>=1>=1
fn_onemax_sphere_zeromax_sphereOnemax+Sphere / Zeromax+SphereProblembinary | continuous>=22Onemax+Sphere / Zeromax+Sphere, https://doi.org/10.1145/3449726.3459521artificial>=1>=1
fn_radar_waveformRadar waveformProbleminteger4-129unknown>=1Radar waveform design, https://doi.org/10.1007/978-3-540-70928-2_53impl_radar_waveformreal-world4-12Evan Hughes radar waveform codehttp://code.evanhughes.org/Radar waveform design reference implementation
gen_beaconBEACONGeneratorcontinuous>=12box0noContinuous Bi-objective Benchmark problems with Explicit Adjustable COrrelatioN controlGenerator for bi-objective benchmark problems with explicitly controlled correlations in continuous spaces. Multimodal with random structure.BEACON, https://dl.acm.org/doi/10.1145/3712255.3734303impl_beaconmultimodalartificial>=1BEACONPythonnegligiblehttps://github.com/Stebbet/BEACON/Continuous Bi-objective Benchmark with Explicit Adjustable COrrelatioN control0
gen_bono_benchBONO-BenchGeneratorcontinuous>=12box>=1noBi-objective Numerical Optimization BenchmarkBi-objective problem generator and suite with scalable continuous decision space. Features complex problem properties and Pareto front approximations with error guarantees for the hypervolume and exact R2 indicators.impl_bonobenchmultimodalartificial>=1BONO-BenchPythonhttps://github.com/schaepermeier/bonobenchBi-objective Numerical Optimization Benchmark (BONO-Bench)>=1
gen_ealainEalainGeneratorbinary | continuous | integer>=3[1, 10, 2, 3, 4, 5, 6, 7, 8, 9]dynamic | multi-fidelityunknown>=1optional[1, 2]Real-world-like, easily extensible to increase complexityEalain, https://doi.org/10.1145/3638530.3654299impl_ealainreal-world-like>=1>=1>=1Ealainhttps://github.com/qrenau/EalainReal-world-like extensible benchmark problem generator
gen_gnbgGNBGGeneratorcontinuous>=11Generator counterpart of GNBG.GNBG, https://arxiv.org/abs/2312.07083impl_gnbgartificial>=1GNBG Generatorhttps://github.com/Danial-Yazdani/GNBG-GeneratorGeneralized Numerical Benchmark Generator
gen_gnbg_iiGNBG-IIGeneratorcontinuous>=11Generator counterpart of GNBG-II.GNBG-II, https://dl.acm.org/doi/pdf/10.1145/3712255.3734271["impl_gnbg_ii", "impl_iohgnbg"]artificial>=1GNBG-II | IOHGNBGhttps://github.com/rohitsalgotra/GNBG-II | https://github.com/IOHprofiler/IOHGNBGGeneralized Numerical Benchmark Generator version 2 | IOHprofiler version of GNBG
gen_gpdGPDGeneratorcontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]noisyunknown>=1optionalGPD generator, https://doi.org/10.1016/j.asoc.2020.106139>=1
gen_iohclusteringIOHClusteringGeneratorcontinuous>=11Generator counterpart of the IOHClustering suite.IOHClustering, https://arxiv.org/pdf/2505.09233impl_iohclusteringmultimodalartificial-from-real-data>=1IOHClusteringhttps://github.com/IOHprofiler/IOHClusteringClustering-based optimization benchmark built on ML datasets
gen_ma_bbobMA-BBOBGeneratorcontinuous>=11Generator that creates affine combinations of BBOB functionsMA-BBOB, https://doi.org/10.1145/3673908["impl_iohexperimenter", "impl_ma_bbob"]multimodalartificial>=1IOHexperimenter | MA-BBOB (IOHexperimenter)C++/Pythonhttps://github.com/IOHprofiler/IOHexperimenter | https://github.com/IOHprofiler/IOHexperimenter/blob/master/example/Competitions/MA-BBOB/Example_MABBOB.ipynbIOHprofiler experimenter framework | Example notebook for MA-BBOB in IOHexperimenter
gen_mpm2MPM2Generatorcontinuous>=11nonlinear nonseparable nonsymmetric; scalable in terms of time to evaluate the objective functionMPM2 technical report TR15-01, https://ls11-www.cs.tu-dortmund.de/_media/techreports/tr15-01.pdfimpl_mpm2multimodal>=1MPM2 (smoof)Pythonhttps://github.com/jakobbossek/smoof/blob/master/inst/mpm2.pyPython implementation of MPM2 distributed with smoof
gen_mubqpmUBQPGeneratorbinary>=1[1, 10, 2, 3, 4, 5, 6, 7, 8, 9]tunable variable and objective dimensions; tunable density and correlation between objectivesmUBQP benchmark, https://doi.org/10.1016/j.asoc.2013.11.008impl_mocobench["multimodal", "quadratic"]>=1mocobenchC++https://gitlab.com/aliefooghe/mocobench/Multi-objective combinatorial optimization benchmark
gen_puboiPUBOiGeneratorbinary>=11noPolynomial Unconstrained Binary Optimization with tunable importanceA benchmark in which variable importance is tunable, based on the Walsh function.PUBOi, https://link.springer.com/chapter/10.1007/978-3-031-04148-8_12impl_puboiartificial>=1PUBO Importance BenchmarkPython / C++https://gitlab.com/verel/pubo-importance-benchmarkA benchmark in which variable importance is tunable, based on the Walsh function
gen_randoptgenRandOptGenGeneratorbinary | continuous | integer>=3[1, 10, 2, 3, 4, 5, 6, 7, 8, 9]noRandOptGenA Unified Random Problem Generator for Single- and Multi-Objective Optimization Problems with Mixed-Variable Input Spaces.impl_randoptgenmultimodalartificial>=1>=1>=1RandOptGenPythonmillisecondshttps://github.com/MALEO-research-group/RandOptGen | https://doi.org/10.1145/3712256.3726478Unified Random Problem Generator for Single- and Multi-Objective Optimization with Mixed-Variable Input Spaces
gen_rho_mnk_landscapesρMNK-LandscapesGeneratorbinary>=1[1, 10, 2, 3, 4, 5, 6, 7, 8, 9]tunable variable and objective dimensions; tunable multimodality and correlation between objectivesOn the design of multi-objective evolutionary algorithms based on NK-landscapes, https://doi.org/10.1016/j.ejor.2012.12.019impl_mocobenchmultimodal>=1mocobenchC++https://gitlab.com/aliefooghe/mocobench/Multi-objective combinatorial optimization benchmark
gen_rho_mtspρmTSPGeneratorunknown>=1[1, 10, 2, 3, 4, 5, 6, 7, 8, 9]tunable variable and objective dimensions; tunable instance type (euclidean/random); tunable correlation between objectivesOn the impact of multi-objective scalability for the ρmTSP, https://doi.org/10.1007/978-3-319-45823-6_40impl_mocobench["multimodal", "quadratic"]mocobenchC++https://gitlab.com/aliefooghe/mocobench/Multi-objective combinatorial optimization benchmark
gen_wmodelW-modelGeneratorbinary>=11Tunable generator for binary optimization based on several difficulty featuresW-model, https://dl.acm.org/doi/abs/10.1145/3205651.3208240impl_wmodelartificial>=1BBDOB W-Modelhttps://github.com/thomasWeise/BBDOB_W_ModelTunable generator for binary optimization
suite_amvopAMVOPSuiteinteger | continuous | categorical>=31AMVOP, https://doi.org/10.1109/TEVC.2013.2281531multimodal>=1>=1>=1
suite_bbobBBOBSuitecontinuous>=11COCO: a platform for comparing continuous optimizers in a black-box setting, https://doi.org/10.1080/10556788.2020.1808977impl_cocomultimodal>=1COCO frameworkC/Pythonhttps://github.com/numbbo/cocoComparing Continuous Optimizers: black-box optimization benchmarking platform
suite_bbob_biobjBBOB-biobjSuitecontinuous2-402BBOB bi-objective test suite, https://doi.org/10.48550/arXiv.1604.00359impl_cocomultimodal2-40COCO frameworkC/Pythonhttps://github.com/numbbo/cocoComparing Continuous Optimizers: black-box optimization benchmarking platform
suite_bbob_biobj_mixintBBOB-biobj-mixintSuitecontinuous | integer10-3202BBOB bi-objective mixed-integer test suite, https://doi.org/10.1145/3321707.3321868impl_cocomultimodal5-1605-160COCO frameworkC/Pythonhttps://github.com/numbbo/cocoComparing Continuous Optimizers: black-box optimization benchmarking platform
suite_bbob_constrainedBBOB-constrainedSuitecontinuous2-401unknown>=1bbob-constrained documentation, http://numbbo.github.io/coco-doc/bbob-constrained/impl_cocomultimodal2-40COCO frameworkC/Pythonhttps://github.com/numbbo/cocoComparing Continuous Optimizers: black-box optimization benchmarking platform
suite_bbob_largescaleBBOB-largescaleSuitecontinuous20-6401BBOB large-scale test suite, https://doi.org/10.48550/arXiv.1903.06396impl_cocomultimodal20-640COCO frameworkC/Pythonhttps://github.com/numbbo/cocoComparing Continuous Optimizers: black-box optimization benchmarking platform
suite_bbob_mixintBBOB-mixintSuitecontinuous | integer10-3201BBOB mixed-integer test suite, https://doi.org/10.1145/3321707.3321868impl_cocomultimodal5-1605-160COCO frameworkC/Pythonhttps://github.com/numbbo/cocoComparing Continuous Optimizers: black-box optimization benchmarking platform
suite_bbob_noisyBBOB-noisySuitecontinuous>=11noisynoisyReal-parameter black-box optimization benchmarking: noisy functions definitions, https://hal.inria.fr/inria-00369466impl_coco_legacymultimodal>=1COCO legacy (bbob-noisy)C/Pythonhttps://web.archive.org/web/20210416065610/https://coco.gforge.inria.fr/doku.php?id=downloadsArchived COCO download page that hosted the bbob-noisy suite
suite_bpBPSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]noisyunknownBP benchmark, https://doi.org/10.1109/CEC.2019.8790277>=1
suite_brachytherapyBrachytherapy treatment planningSuitecontinuous100-500[2, 3]multi-fidelityunknown>=1yes[1, 2]Brachytherapy treatment planningTreatment planning for internal radiation therapy. Multi-objective with aggregated objectives; no public source code.Brachytherapy treatment planning, https://www.sciencedirect.com/science/article/pii/S1538472123016781multimodalreal-world100-500
suite_car_structureCar structureSuiteinteger144-2222unknown5454 constraintsCar structure design benchmark, https://doi.org/10.1145/3205651.3205702impl_car_structurereal-world144-222Car-structure benchmarkhttp://ladse.eng.isas.jaxa.jp/benchmark/JAXA LADSE benchmark problems
suite_cdmpCDMPSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]dynamic | noisyunknown>=1unknownunknownCDMP benchmark, https://doi.org/10.1145/3321707.3321878>=1
suite_cec2013CEC2013Suitecontinuous>=11suite used for cec2013 competition. Also in IOH.CEC2013 definitions, https://peerj.com/articles/cs-2671/CEC2013.pdf["impl_cec2013", "impl_iohexperimenter"]artificial>=1IOHexperimenter | CEC2013 reference codeC++/Pythonhttps://github.com/IOHprofiler/IOHexperimenter | https://github.com/P-N-Suganthan/CEC2013IOHprofiler experimenter framework | Suganthan's reference implementation
suite_cec2015_dmooCEC2015-DMOOSuitecontinuous0[2, 3]dynamicunknown>=1dynamicBenchmark Functions for CEC 2015 Special Session and Competition on Dynamic Multi-objective Optimization0
suite_cec2018_dtCEC2018 DTSuiteunknown>=1[2, 3]dynamicdynamicCEC2018 Competition on Dynamic Multiobjective Optimisation14 problems. Time-dependent: Pareto front/Pareto set geometry; irregular Pareto front shapes; variable-linkage; number of disconnected Pareto front segments; etc.CEC2018 DMOP Competition TR, https://www.academia.edu/download/94499025/TR-CEC2018-DMOP-Competition.pdfimpl_pymooartificialpymooPythonhttps://github.com/anyoptimization/pymooMulti-objective optimization in Python
suite_cec2022CEC2022Suitecontinuous>=11suite used for cec2022 competition. Also in IOH.CEC2022 TR, https://github.com/P-N-Suganthan/2022-SO-BO/blob/main/CEC2022%20TR.pdf["impl_cec2022", "impl_iohexperimenter"]artificial>=1IOHexperimenter | CEC2022 reference codeC++/Pythonhttps://github.com/IOHprofiler/IOHexperimenter | https://github.com/P-N-Suganthan/2022-SO-BOIOHprofiler experimenter framework | Suganthan's reference implementation
suite_cfdCFDSuiteunknown>=1[1, 2]unknown>=1expensive evaluations 30s-15mCFD test problem suite, https://doi.org/10.1007/978-3-319-99259-4_24impl_cfdreal-worldCFD test problem suite30s-15mhttps://bitbucket.org/arahat/cfd-test-problem-suiteExpensive real-world CFD-based test problems
suite_creCRESuiteinteger | continuous6-14[2, 3, 4, 5]unknown>=1Easy-to-evaluate real-world multi-objective optimization problems, Ryoji Tanabe; Hisao Ishibuchi, https://doi.org/10.1016/j.asoc.2020.106078impl_reproblemsreal-world-like3-73-7reproblemsPythonhttps://github.com/ryojitanabe/reproblemsReal-world inspired multi-objective optimization problem suite
suite_cuterCUTErSuitebinary | continuous | integer>=31unknown>=1noA constrained and unconstrained testing environment.CUTEr, https://dl.acm.org/doi/10.1145/962437.962439artificial>=1>=1>=1
suite_cutestCUTEstSuitebinary | continuous | integer>=31unknown | box>=2noConstrained and Unconstrained Testing Environment with safe threadsCUTEst for optimization softwareCUTEst, https://link.springer.com/article/10.1007/s10589-014-9687-3impl_pycutestmultimodalartificial>=1>=1>=1pycutestPython / C++ / Fortranhttps://github.com/jfowkes/pycutestPython interface to CUTEst>=1
suite_dtlzDTLZSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]Scalable multi-objective optimization test problems, Kalyanmoy Deb; Lothar Thiele; Marco Laumanns; Eckart Zitzler, https://doi.org/10.1109/CEC.2002.1007032impl_pymoo>=1pymooPythonhttps://github.com/anyoptimization/pymooMulti-objective optimization in Python
suite_dynamicbinvalDynamicBinValSuitebinary>=11dynamicdynamicFour versions of the dynamic binary value problemDynamicBinVal, https://arxiv.org/pdf/2404.15837impl_iohexperimenterartificial>=1IOHexperimenterC++/Pythonhttps://github.com/IOHprofiler/IOHexperimenterIOHprofiler experimenter framework
suite_emo2017EMO2017Suitecontinuous4-242BBComp EMO 2017, https://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/impl_emo2017real-world4-24EMO 2017 real-world problemshttps://www.ini.rub.de/PEOPLE/glasmtbl/projects/bbcomp/downloads/realworld-problems-bbcomp-EMO-2017.zipBBComp EMO-2017 real-world problem archive
suite_etmofETMOFSuitecontinuous25-10000[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 4, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 5, 50, 6, 7, 8, 9]dynamicdynamicEvolutionary many-task optimization framework, https://doi.org/10.48550/arXiv.2110.08033impl_etmof25-10000ETMOFhttps://github.com/songbai-liu/etmoEvolutionary many-task optimization framework
suite_expobenchEXPObenchSuitecategorical | continuous | integer30-4051noisyunknown | box>=2["observational", "real-life"]noEXPensive Optimization benchmark libraryWind farm layout optimization, gas filter design, pipe shape optimization, hyperparameter tuning, and hospital simulationEXPObench, https://doi.org/10.1016/j.asoc.2023.110744impl_expobenchreal-world10-13510-13510-135EXPObenchPython2 to 80 secondshttps://github.com/AlgTUDelft/ExpensiveOptimBenchmarkEXPensive Optimization benchmark library (wind farm layout, gas filter design, pipe shape, hyperparameter tuning, hospital simulation)>=1
suite_gbeaGBEASuitecontinuous>=1[1, 2]noisynoisyexpensive evaluations 5s-35s, RW-GAN-Mario and TopTrumps are part of GBEAGame benchmark for evolutionary algorithms, https://doi.org/10.1145/3321707.3321805impl_gbeamultimodalreal-world>=1coco-gbea5s-35shttps://github.com/ttusar/coco-gbeaGame-Benchmark for Evolutionary Algorithms (COCO fork)
suite_gnbgGNBGSuitecontinuous>=11Generalized Numerical Benchmark GeneratorGNBG, https://arxiv.org/abs/2312.07083impl_gnbgartificial>=1GNBG Generatorhttps://github.com/Danial-Yazdani/GNBG-GeneratorGeneralized Numerical Benchmark Generator
suite_gnbg_iiGNBG-IISuitecontinuous>=11Generalized Numerical Benchmark Generator (version 2). Also available in IOH.GNBG-II, https://dl.acm.org/doi/pdf/10.1145/3712255.3734271["impl_gnbg_ii", "impl_iohgnbg"]artificial>=1GNBG-II | IOHGNBGhttps://github.com/rohitsalgotra/GNBG-II | https://github.com/IOHprofiler/IOHGNBGGeneralized Numerical Benchmark Generator version 2 | IOHprofiler version of GNBG
suite_iohclusteringIOHClusteringSuitecontinuous>=11Set of benchmark problems from clustering: optimization task is selecting cluster centers for a given set of data.IOHClustering, https://arxiv.org/pdf/2505.09233impl_iohclusteringmultimodalartificial-from-real-data>=1IOHClusteringhttps://github.com/IOHprofiler/IOHClusteringClustering-based optimization benchmark built on ML datasets
suite_kinematics_robotarmKinematicsRobotArmSuitecontinuous211Kinematics of a robot arm, https://doi.org/10.1023/A:1013258808932impl_transfer_rf_bbob_rwunimodalreal-world21Transfer Random Forests BBOB Real-worldhttps://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_worldReal-world BBOB-like problem implementations (Porkchop, KinematicsRobotArm)
suite_l1_zdtL1-ZDTSuitebinary | continuous>=22Variant of ZDT with linkages between variables within groupsLinkage ZDT/DTLZ variants, https://doi.org/10.1145/1143997.1144179>=1>=1
suite_l2_dtlzL2-DTLZSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]Variant of DTLZ2/DTLZ3 with linkages between all variablesLinkage ZDT/DTLZ variants, https://doi.org/10.1145/1143997.1144179>=1
suite_l2_zdtL2-ZDTSuitebinary | continuous>=22Variant of ZDT with linkages between all variablesLinkage ZDT/DTLZ variants, https://doi.org/10.1145/1143997.1144179>=1>=1
suite_l3_dtlzL3-DTLZSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]Variant of L2-DTLZ with anti-linkage mappingLinkage ZDT/DTLZ variants, https://doi.org/10.1145/1143997.1144179>=1
suite_l3_zdtL3-ZDTSuitebinary | continuous>=22Variant of L2-ZDT with anti-linkage mappingLinkage ZDT/DTLZ variants, https://doi.org/10.1145/1143997.1144179>=1>=1
suite_maopMaOPSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]noisyunknownMaOP benchmark, https://doi.org/10.1016/j.swevo.2019.02.003>=1
suite_mechbenchMECHBenchSuitecontinuous>=11unknown{1, 2}noMECHBenchSet of problems inspired by Structural Mechanics Design Optimization. Embeds physical simulations (plasticity only, no fracture/damage). Unstructured/non-isotropic multimodality.MECHBench, https://arxiv.org/abs/2511.10821impl_mechbenchmultimodalreal-world>=1MECHBenchPython1-7 minuteshttps://github.com/BayesOptApp/MECHBenchStructural mechanics design optimization benchmark
suite_mf2MF2Suitecontinuous>=11multi-fidelity[1, 2]mf2: a collection of multi-fidelity benchmark functions in Python, https://doi.org/10.21105/joss.02049impl_mf2>=1mf2Pythonhttps://github.com/sjvrijn/mf2Multi-fidelity test function collection
suite_minus_dtlzMinus DTLZSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]Variant of DTLZ that minimises the inverse of the base DTLZ functionsMinus DTLZ / Minus WFG, https://doi.org/10.1109/TEVC.2016.2587749>=1
suite_minus_wfgMinus WFGSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]Variant of WFG that minimises the inverse of the base WFG functionsMinus DTLZ / Minus WFG, https://doi.org/10.1109/TEVC.2016.2587749>=1
suite_mmoppMMOPPSuiteunknown0[2, 3, 4, 5, 6, 7]unknown>=1MMOPP technical report, http://www5.zzu.edu.cn/system/_content/download.jsp?urltype=news.DownloadAttachUrl&owner=1327567121&wbfileid=4764412impl_mmoppmultimodalMMOPPhttp://www5.zzu.edu.cn/ecilab/info/1036/1251.htmECI lab distribution page for MMOPP
suite_modactMODActSuitecontinuous | integer40[2, 3, 4, 5]unknown>=1multiobjective design of actuatorsRealistic Constrained Multi-Objective Optimization Benchmark Problems from Design.MODAct, https://doi.org/10.1109/TEVC.2020.3020046["impl_modact", "impl_pymoo"]real-world2020modact | pymooPython20mshttps://github.com/epfl-lamd/modact | https://github.com/anyoptimization/pymooEPFL-LAMD modact package | Multi-objective optimization in Python
suite_morepoMOrepoSuiteunknown02dynamic | noisyunknown>=1unknownunknownimpl_morepoMOrepohttps://github.com/MCDMSociety/MOrepoMulti-objective optimisation problem repository
suite_pboPBOSuitebinary>=11Suite of 25 binary optimization problemsPBO benchmarks, https://dl.acm.org/doi/pdf/10.1145/3319619.3326810impl_iohexperimenterartificial>=1IOHexperimenterC++/Pythonhttps://github.com/IOHprofiler/IOHexperimenterIOHprofiler experimenter framework
suite_porkchopPorkchopPlotInterplanetaryTrajectorySuitecontinuous21Porkchop plot interplanetary trajectory benchmark, https://doi.org/10.1109/CEC65147.2025.11042973impl_transfer_rf_bbob_rwmultimodalreal-world2Transfer Random Forests BBOB Real-worldhttps://github.com/ShuaiqunPan/Transfer_Random_forests_BBOB_Real_worldReal-world BBOB-like problem implementations (Porkchop, KinematicsRobotArm)
suite_reRESuitecontinuous | integer4-14[2, 3, 4, 5, 6, 7, 8, 9]Easy-to-evaluate real-world multi-objective optimization problems, Ryoji Tanabe; Hisao Ishibuchi, https://doi.org/10.1016/j.asoc.2020.106078impl_reproblemsreal-world-like2-72-7reproblemsPythonhttps://github.com/ryojitanabe/reproblemsReal-world inspired multi-objective optimization problem suite
suite_rwmvopRWMVOPSuiteinteger | continuous | categorical>=31unknown>=1RWMVOP, https://doi.org/10.1109/TEVC.2013.2281531real-world>=1>=1>=1
suite_sbox_costSBOX-COSTSuitecontinuous>=11problems from BBOB but allows instances with the optimum close to the boundarySBOX-COST, https://doi.org/10.48550/arXiv.2305.12221impl_iohexperimentermultimodal>=1IOHexperimenterC++/Pythonhttps://github.com/IOHprofiler/IOHexperimenterIOHprofiler experimenter framework
suite_sdpSDPSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]dynamic | noisydynamicunknownSDP dynamic multi-objective benchmark, https://doi.org/10.1109/TCYB.2019.2896021>=1
suite_submodularSubmodular OptimizationSuitebinary>=11set of graph-based submodular optimization problems from 4 problem typesSubmodular optimization benchmark, https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10254181impl_iohexperimenterartificial>=1IOHexperimenterC++/Pythonhttps://github.com/IOHprofiler/IOHexperimenterIOHprofiler experimenter framework
suite_tulipa_energyTulipaEnergySuitecontinuous>=11noisy | multi-fidelityunknown>=2parameter[1, 2]TulipaEnergyModel.jlDetermine the optimal investment and operation decisions for different assets in the energy system (production, consumption, conversion, storage, transport) while minimizing loss of load. Modelled as a potentially very large linear program with multiple fidelity levels.TulipaEnergyModel.jl scientific references, https://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/40-scientific-foundation/45-scientific-referencesimpl_tulipaunimodalreal-world>=1TulipaEnergyModel.jlJulia / JuMPminutes to hourshttps://tulipaenergy.github.io/TulipaEnergyModel.jl/stable/ | https://github.com/TulipaEnergy/Tulipa-OBZ-CaseStudyLarge linear program for optimal investment and operation of energy systems
suite_vehicle_dynamicsVehicleDynamicsSuitecontinuous21VehicleDynamics benchmark, https://www.scitepress.org/Papers/2023/121580/121580.pdfimpl_vehicle_dynamicsmultimodalreal-world2VehicleDynamics (Zenodo)https://zenodo.org/records/8307853Zenodo archive for the vehicle dynamics benchmark
suite_wfgWFGSuitecontinuous>=1[10, 2, 3, 4, 5, 6, 7, 8, 9]A review of multiobjective test problems and a scalable test problem toolkit, Simon Huband; Philip Hingston; Luigi Barone; Lyndon While, https://doi.org/10.1109/TEVC.2005.861417impl_pymoo>=1pymooPythonhttps://github.com/anyoptimization/pymooMulti-objective optimization in Python
suite_zdtZDTSuitebinary | continuous>=22Comparison of multiobjective evolutionary algorithms: empirical results, Eckart Zitzler; Kalyanmoy Deb; Lothar Thiele, https://doi.org/10.1162/106365600568202impl_pymoo>=1>=1pymooPythonhttps://github.com/anyoptimization/pymooMulti-objective optimization in Python
ID Name Type Variable Types Total Variables Objectives Properties Constraint Types Total Constraints Dynamics Noise Partial Evaluations Independent Objectives Fidelity Levels Full Name Description Tags References Implementations Modality Examples Source Binary Vars Categorical Vars Continuous Vars Integer Vars Implementation Names Implementation Languages Implementation Evaluation Times Implementation Links Implementation Descriptions Implementation Requirements Hard Box Constraints Soft Box Constraints Hard Linear Constraints Soft Linear Constraints Hard Function Constraints Soft Function Constraints
+
+
+ +
+

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.

+
+
+