File indexing completed on 2026-11-09 09:29:52
0001 """Minimal PyMOO optimizer-only DTLZ2 example."""
0002
0003 from __future__ import annotations
0004
0005 import sys
0006 from pathlib import Path
0007 from typing import List
0008
0009 REPO_ROOT = Path(__file__).resolve().parents[3]
0010 if str(REPO_ROOT) not in sys.path:
0011 sys.path.insert(0, str(REPO_ROOT))
0012
0013 from aid2e.utilities import build_optimizer_from_config
0014 from aid2e.utilities.configurations import load_config
0015 from examples.dtlz2.dtlz2_evaluator import design_vector, dtlz2_both_objectives
0016
0017
0018 DEFAULT_CONFIG_PATH = REPO_ROOT / "examples" / "dtlz2" / "configurations" / "dtlz2_pymoo_joblib.yml"
0019
0020
0021 def main(argv: List[str]) -> int:
0022 config_file = Path(argv[1]).resolve() if len(argv) >= 2 else DEFAULT_CONFIG_PATH
0023 config = load_config(str(config_file))
0024 optimizer_config = config.optimizer.parse_algorithm_params()
0025 if optimizer_config is None:
0026 raise RuntimeError("No registered optimizer config model found for PyMOO example.")
0027
0028 optimizer = build_optimizer_from_config(config.problem, config.optimizer)
0029
0030 print("Backend: pymoo")
0031 print(f"Config: {config_file}")
0032 print(f"Objectives: {[objective.name for objective in config.problem.objectives]}")
0033 print(f"Design variables: {len(config.problem.design_config.get_flat_parameters())}")
0034 print(f"Resolved algorithm: {optimizer.resolved_algorithm}")
0035 print(f"Generations: {optimizer_config.n_iterations}")
0036 print(f"Population size: {optimizer_config.pop_size}")
0037 print(
0038 f"\n{'Trial':<6} {'Gen':<6} {'x1':<10} {'x2':<10} {'x3':<10} "
0039 f"{'f1':<12} {'f2':<12}"
0040 )
0041 print("-" * 76)
0042
0043 for generation in range(optimizer_config.n_iterations):
0044 candidates = optimizer.suggest_candidates()
0045 start_index = len(optimizer.get_trials()) - len(candidates)
0046 for offset, parameters in enumerate(candidates):
0047 trial_index = start_index + offset
0048 metrics = dtlz2_both_objectives(design_vector(parameters))
0049 optimizer.update_with_results(
0050 trial_index=trial_index,
0051 parameters=parameters,
0052 metrics=metrics,
0053 )
0054 vector = design_vector(parameters)
0055 print(
0056 f"{trial_index + 1:<6} {generation + 1:<6} "
0057 f"{vector[0]:<10.4f} {vector[1]:<10.4f} {vector[2]:<10.4f} "
0058 f"{metrics['f1']:<12.6f} {metrics['f2']:<12.6f}"
0059 )
0060
0061 results = optimizer.get_optimization_results()
0062 pareto_front = optimizer.get_pareto_front()
0063
0064 print("\nSummary")
0065 print(f"Trials recorded: {results['n_trials']}")
0066 print(f"Pareto points: {len(pareto_front)}")
0067 return 0
0068
0069
0070 if __name__ == "__main__":
0071 raise SystemExit(main(sys.argv))