use crate::configuration::ProblemSolving;
use crate::traits::{ChromosomeT, GeneT};
use log::info;
use std::collections::HashSet;
pub fn mass_deduplication<U: ChromosomeT>(
chromosomes: &mut Vec<U>,
problem_solving: ProblemSolving,
) {
if chromosomes.is_empty() {
return;
}
let original_len = chromosomes.len();
match problem_solving {
ProblemSolving::Maximization => {
chromosomes.sort_by(|a, b| {
b.fitness()
.partial_cmp(&a.fitness())
.unwrap_or(std::cmp::Ordering::Equal)
});
}
ProblemSolving::Minimization | ProblemSolving::FixedFitness => {
chromosomes.sort_by(|a, b| {
a.fitness()
.partial_cmp(&b.fitness())
.unwrap_or(std::cmp::Ordering::Equal)
});
}
}
let mut seen: HashSet<Vec<i32>> = HashSet::new();
chromosomes.retain(|c| {
let key: Vec<i32> = c.dna().iter().map(|g| g.id()).collect();
seen.insert(key)
});
let removed = original_len - chromosomes.len();
info!(
target = "extension_events",
method = "mass_deduplication";
"MassDeduplication applied: removed {} duplicates, {} unique remain",
removed,
chromosomes.len()
);
}