use num::Float;
use crate::genetic::{Population, Selection};
pub struct CheckChromoInterval<G: Float> {
intervals: Vec<(G, G)>,
}
impl<G: Float> CheckChromoInterval<G> {
pub fn new(intervals: Vec<(G, G)>) -> Self {
Self { intervals }
}
}
impl<G: Float> Selection<Vec<G>> for CheckChromoInterval<G> {
fn kill(&mut self, population: &mut Population<Vec<G>>) {
for individual in population.iter_mut() {
assert_eq!(individual.get_chromosomes().len(), self.intervals.len());
for (chromo, interval) in individual
.get_chromosomes()
.iter()
.zip(self.intervals.iter())
{
if !chromo.is_finite() || *chromo < interval.0 || *chromo > interval.1 {
individual.kill();
break;
}
}
}
}
}