@@ -10,9 +10,13 @@ use rand::prelude::*;
1010use rand:: rng;
1111use serde_json:: json;
1212use std:: collections:: HashMap ;
13+ use std:: f64:: INFINITY ;
1314use std:: fs;
15+ use std:: iter:: Take ;
16+ use std:: slice:: Iter ;
1417use std:: sync:: Arc ;
1518use std:: time:: Duration ;
19+ use serde:: de:: Unexpected :: Float ;
1620use 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