Skip to content

Commit 7682cf6

Browse files
committed
wip
1 parent 66ab49d commit 7682cf6

File tree

1 file changed

+65
-39
lines changed

1 file changed

+65
-39
lines changed

src/experiment_runner/adaptive_runner.rs

Lines changed: 65 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@ use rand::prelude::*;
1010
use rand::rng;
1111
use serde_json::json;
1212
use std::collections::HashMap;
13+
use std::f64::INFINITY;
1314
use std::fs;
15+
use std::iter::Take;
16+
use std::slice::Iter;
1417
use std::sync::Arc;
1518
use std::time::Duration;
19+
use serde::de::Unexpected::Float;
1620
use tokio::sync::Semaphore;
1721

1822
/// Detailed tracking of evolutionary events
@@ -242,8 +246,19 @@ impl AdaptiveExperimentRunner {
242246
problem.get_name(), all_best_genomes.len());
243247

244248
// Convert best genomes to optimizers
245-
let mut optimizers = Vec::new();
246-
for (i, genome) in all_best_genomes.iter().enumerate() {
249+
let mut optimizers: Vec<(String, Arc<dyn Optimizer>)> = Vec::new();
250+
let best: Vec<OptimizerGenome> = all_best_genomes.iter().into_group_map_by(|x| x.optimizer_type.to_string()).values().flat_map(
251+
|genomes| {
252+
let mut x1: Vec<OptimizerGenome> = genomes.iter().map(|x| (*x).clone()).collect_vec();
253+
x1.sort_by(|a, b| {
254+
let fitness_a = a.fitness.unwrap_or(INFINITY);
255+
let fitness_b = b.fitness.unwrap_or(INFINITY);
256+
fitness_a.partial_cmp(&fitness_b).unwrap_or(std::cmp::Ordering::Equal)
257+
});
258+
x1.into_iter().take(1) // Take the best (1) genome from each family
259+
}
260+
).collect_vec();
261+
for (i, genome) in best.iter().enumerate() {
247262
let family_name = format!("{:?}", genome.optimizer_type);
248263
let name = format!(
249264
"{}-Evolved-{}-{}",
@@ -258,7 +273,10 @@ impl AdaptiveExperimentRunner {
258273
optimizers.push((name, genome.to_optimizer()));
259274
}
260275

261-
problem_best_optimizers.insert(problem.get_name(), optimizers);
276+
problem_best_optimizers.insert(
277+
problem.get_name(),
278+
optimizers
279+
);
262280
}
263281

264282
Ok(problem_best_optimizers)
@@ -1193,42 +1211,50 @@ impl AdaptiveExperimentRunner {
11931211
info!("Championship includes {} problems", problems.len());
11941212

11951213
// For each problem, run benchmarks with its evolved optimizers
1196-
for (problem_idx, problem) in problems.iter().enumerate() {
1197-
let problem_name = problem.get_name();
1198-
info!(
1199-
"Running championship for problem {}/{}: {}",
1200-
problem_idx + 1,
1201-
problems.len(),
1202-
problem_name
1203-
);
1214+
// for (problem_idx, problem) in problems.iter().enumerate() {
1215+
// let problem_name = problem.get_name();
1216+
// info!(
1217+
// "Running championship for problem {}/{}: {}",
1218+
// problem_idx + 1,
1219+
// problems.len(),
1220+
// problem_name
1221+
// );
1222+
//
1223+
// if let Some(optimizers) = evolved_optimizers.get(&problem_name) {
1224+
// info!(
1225+
// "Running championship for {} with {} evolved optimizers",
1226+
// problem_name,
1227+
// optimizers.len()
1228+
// );
1229+
// for (opt_idx, (opt_name, _)) in optimizers.iter().enumerate() {
1230+
// debug!(
1231+
// "Championship optimizer {}/{}: {}",
1232+
// opt_idx + 1,
1233+
// optimizers.len(),
1234+
// opt_name
1235+
// );
1236+
// }
1237+
//
1238+
// // Run comparative benchmarks for this problem
1239+
// debug!("Starting comparative benchmarks for {}", problem_name);
1240+
// let mut runner: ExperimentRunner = self.base_runner.clone();
1241+
// runner.output_dir = format!("{}/championship/{}", self.base_runner.output_dir, problem_name.replace(" ", "_"));
1242+
// runner.report_generator.output_dir = runner.output_dir.clone();
1243+
// runner.plotting_manager.output_dir = runner.output_dir.clone();
1244+
// runner.run_comparative_benchmarks(vec![problem.clone()], optimizers.clone()).await?;
1245+
// info!("Championship completed for problem: {}", problem_name);
1246+
// } else {
1247+
// warn!("No evolved optimizers found for problem: {}", problem_name);
1248+
// }
1249+
// }
1250+
1251+
// Run comparative benchmarks for this problem
1252+
let mut runner: ExperimentRunner = self.base_runner.clone();
1253+
runner.run_comparative_benchmarks(
1254+
problems,
1255+
evolved_optimizers.values().flatten().map(|x| (x.0.to_string(), x.1.clone())).collect_vec()
1256+
).await?;
12041257

1205-
if let Some(optimizers) = evolved_optimizers.get(&problem_name) {
1206-
info!(
1207-
"Running championship for {} with {} evolved optimizers",
1208-
problem_name,
1209-
optimizers.len()
1210-
);
1211-
for (opt_idx, (opt_name, _)) in optimizers.iter().enumerate() {
1212-
debug!(
1213-
"Championship optimizer {}/{}: {}",
1214-
opt_idx + 1,
1215-
optimizers.len(),
1216-
opt_name
1217-
);
1218-
}
1219-
1220-
// Run comparative benchmarks for this problem
1221-
debug!("Starting comparative benchmarks for {}", problem_name);
1222-
let mut runner: ExperimentRunner = self.base_runner.clone();
1223-
runner.output_dir = format!("{}/championship/{}", self.base_runner.output_dir, problem_name.replace(" ", "_"));
1224-
runner.report_generator.output_dir = runner.output_dir.clone();
1225-
runner.plotting_manager.output_dir = runner.output_dir.clone();
1226-
runner.run_comparative_benchmarks(vec![problem.clone()], optimizers.clone()).await?;
1227-
info!("Championship completed for problem: {}", problem_name);
1228-
} else {
1229-
warn!("No evolved optimizers found for problem: {}", problem_name);
1230-
}
1231-
}
12321258
info!("All championship benchmarks completed successfully");
12331259

12341260
Ok(())
@@ -1626,4 +1652,4 @@ pub async fn run_adaptive_benchmark(
16261652
info!("Results saved to: {}", output_dir.display());
16271653

16281654
Ok(())
1629-
}
1655+
}

0 commit comments

Comments
 (0)