Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-11-09 09:29:52

0001 """Minimal Ax 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_ax_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 Ax example.")
0027 
0028     optimizer = build_optimizer_from_config(config.problem, config.optimizer)
0029 
0030     print("Backend: ax")
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"Generator: {optimizer_config.generator}")
0035     print(f"Initial samples: {optimizer_config.n_initial_samples}")
0036     print(f"Evaluation budget: {optimizer_config.n_iterations}")
0037     print(f"Batch size: {optimizer_config.batch_size}")
0038     print(
0039         f"\n{'Trial':<6} {'Phase':<10} {'x1':<10} {'x2':<10} {'x3':<10} "
0040         f"{'f1':<12} {'f2':<12}"
0041     )
0042     print("-" * 80)
0043 
0044     remaining_init = min(optimizer_config.n_initial_samples, optimizer_config.n_iterations)
0045     init_batch = 0
0046     while remaining_init > 0:
0047         init_batch += 1
0048         current_batch = min(optimizer_config.batch_size, remaining_init)
0049         candidates = optimizer.suggest_candidates(n_candidates=current_batch)
0050         start_index = len(optimizer.get_trials()) - len(candidates)
0051         for offset, parameters in enumerate(candidates):
0052             trial_index = start_index + offset
0053             metrics = dtlz2_both_objectives(design_vector(parameters))
0054             optimizer.update_with_results(
0055                 trial_index=trial_index,
0056                 parameters=parameters,
0057                 metrics=metrics,
0058             )
0059             vector = design_vector(parameters)
0060             print(
0061                 f"{trial_index + 1:<6} {'init':<10} "
0062                 f"{vector[0]:<10.4f} {vector[1]:<10.4f} {vector[2]:<10.4f} "
0063                 f"{metrics['f1']:<12.6f} {metrics['f2']:<12.6f}"
0064             )
0065         remaining_init -= current_batch
0066 
0067     for iteration, start in enumerate(range(
0068         len(optimizer.get_trials()), optimizer_config.n_iterations, optimizer_config.batch_size
0069     )):
0070         candidates = optimizer.suggest_candidates(
0071             n_candidates=min(optimizer_config.batch_size, optimizer_config.n_iterations - start)
0072         )
0073         start_index = len(optimizer.get_trials()) - len(candidates)
0074         for offset, parameters in enumerate(candidates):
0075             trial_index = start_index + offset
0076             metrics = dtlz2_both_objectives(design_vector(parameters))
0077             optimizer.update_with_results(
0078                 trial_index=trial_index,
0079                 parameters=parameters,
0080                 metrics=metrics,
0081             )
0082             vector = design_vector(parameters)
0083             print(
0084                 f"{trial_index + 1:<6} {f'iter-{iteration + 1}':<10} "
0085                 f"{vector[0]:<10.4f} {vector[1]:<10.4f} {vector[2]:<10.4f} "
0086                 f"{metrics['f1']:<12.6f} {metrics['f2']:<12.6f}"
0087             )
0088 
0089     results = optimizer.get_optimization_results()
0090     pareto_front = optimizer.get_pareto_front()
0091 
0092     print("\nSummary")
0093     print(f"Trials recorded: {results['n_trials']}")
0094     print(f"Pareto points: {len(pareto_front)}")
0095     return 0
0096 
0097 
0098 if __name__ == "__main__":
0099     raise SystemExit(main(sys.argv))