use std::env;
use std::path::PathBuf;
use optirustic::algorithms::{Algorithm, ExportHistory, NSGA2Arg, StoppingCondition, NSGA2};
use optirustic::core::builtin_problems::SCHProblem;
use optirustic::core::OError;
use optirustic::metrics::HyperVolume;
fn main() -> Result<(), OError> {
let problem = SCHProblem::create()?;
let out_path = PathBuf::from(&env::current_dir().expect("Cannot fetch current directory"))
.join("examples")
.join("results")
.join("convergence");
let export_history = ExportHistory::new(100, &out_path)?;
let args = NSGA2Arg {
number_of_individuals: 10,
stopping_condition: StoppingCondition::MaxGeneration(1000),
crossover_operator_options: None,
mutation_operator_options: None,
parallel: Some(false),
export_history: Some(export_history),
resume_from_file: None,
seed: Some(10),
};
let mut algo = NSGA2::new(problem, args)?;
algo.run()?;
let mut results = algo.get_results();
let serialised_data = NSGA2::read_json_files(&out_path)?;
let ref_point = HyperVolume::estimate_reference_point_from_files(&serialised_data, None)?;
println!("Reference point: {:?}", ref_point);
let serialised_data = NSGA2::read_json_file(&out_path.join("History_NSGA2_gen200.json"))?;
let hv = HyperVolume::from_file(&serialised_data, &ref_point)?;
println!(
"Hyper-volume at generation #{} is {}",
hv.generation, hv.value
);
let hv = HyperVolume::from_individual(&mut results.individuals, &ref_point)?;
println!("Hyper-volume at last generation is {}", hv);
let all_serialise_data = NSGA2::read_json_files(&out_path)?;
let hvs = HyperVolume::from_files(&all_serialise_data, &ref_point)?;
println!("Hyper-volumes generations: {:?}", hvs.generations());
println!("Hyper-volumes values: {:?}", hvs.values());
Ok(())
}