use itertools::Itertools;
use lgp::core::engines::core_engine::HyperParametersBuilder;
use lgp::core::engines::status_engine::{Status, StatusEngine};
use lgp::core::instruction::InstructionGeneratorParametersBuilder;
use lgp::core::program::ProgramGeneratorParametersBuilder;
use lgp::problems::iris::IrisEngine;
fn main() {
println!("=== Iris Classification LGP Example ===\n");
let instruction_parameters = InstructionGeneratorParametersBuilder::default()
.n_actions(3) .n_inputs(4) .n_extras(2) .external_factor(1.0) .build()
.expect("Failed to build instruction parameters");
let program_parameters = ProgramGeneratorParametersBuilder::default()
.max_instructions(50) .instruction_generator_parameters(instruction_parameters)
.build()
.expect("Failed to build program parameters");
let parameters = HyperParametersBuilder::<IrisEngine>::default()
.program_parameters(program_parameters)
.population_size(100) .n_generations(50) .n_trials(1) .mutation_percent(0.5)
.crossover_percent(0.5)
.gap(0.5)
.default_fitness(0.0) .build()
.expect("Failed to build hyperparameters");
println!("Configuration:");
println!(" Population size: {}", parameters.population_size);
println!(" Generations: {}", parameters.n_generations);
println!(
" Max instructions: {}",
parameters.program_parameters.max_instructions
);
println!();
println!("Starting evolution...\n");
println!("(Note: Iris dataset is downloaded on first run)\n");
let populations: Vec<_> = parameters
.build_engine()
.take(parameters.n_generations)
.collect_vec();
println!("Generation | Best Accuracy | Median Accuracy");
println!("-----------+---------------+----------------");
for (gen, population) in populations.iter().enumerate() {
if (gen + 1) % 10 == 0 || gen == 0 || gen == populations.len() - 1 {
let best = StatusEngine::get_fitness(population.first().unwrap());
let median = StatusEngine::get_fitness(&population[population.len() / 2]);
let best_pct = (best / 150.0) * 100.0;
let median_pct = (median / 150.0) * 100.0;
println!(
"{:>10} | {:>12.1}% | {:>14.1}%",
gen + 1,
best_pct,
median_pct
);
}
}
let final_population = populations.last().unwrap();
let best_program = final_population.first().unwrap();
let best_fitness = StatusEngine::get_fitness(best_program);
let accuracy = (best_fitness / 150.0) * 100.0;
println!();
println!("=== Evolution Complete ===");
println!(
"Best accuracy: {:.1}% ({:.0}/150 correct)",
accuracy, best_fitness
);
if accuracy >= 95.0 {
println!("Excellent! Near-perfect classification achieved.");
} else if accuracy >= 90.0 {
println!("Great result! Strong classification performance.");
} else if accuracy >= 80.0 {
println!("Good result. Consider more generations for improvement.");
} else {
println!("The classifier needs more evolution or parameter tuning.");
}
}