use crate::traits::GeneT;
use std::borrow::Cow;
pub trait ChromosomeT: Clone + Default + Send + Sync + 'static {
type Gene: GeneT;
fn new() -> Self {
Default::default()
}
fn default(mut self) -> Self {
self.set_fitness(f64::NAN);
self.set_age(0);
self.set_dna(Cow::Borrowed(&[]));
self
}
fn new_gene() -> Self::Gene {
Self::Gene::new()
}
fn dna(&self) -> &[Self::Gene];
fn dna_mut(&mut self) -> &mut [Self::Gene];
fn set_dna<'a>(&mut self, dna: Cow<'a, [Self::Gene]>) -> &mut Self;
fn set_gene(&mut self, gene_index: usize, gene: Self::Gene) -> &mut Self {
let len = self.dna().len();
if gene_index >= len {
log::warn!(
"set_gene: index {} is out of bounds (DNA length {}), ignoring",
gene_index,
len
);
return self;
}
self.dna_mut()[gene_index] = gene;
self
}
fn set_fitness_fn<F>(&mut self, fitness_fn: F) -> &mut Self
where
F: Fn(&[Self::Gene]) -> f64 + Send + Sync + 'static;
fn calculate_fitness(&mut self);
fn fitness(&self) -> f64;
fn set_fitness(&mut self, fitness: f64) -> &mut Self;
fn set_age(&mut self, age: usize) -> &mut Self;
fn age(&self) -> usize;
fn fitness_distance(&self, fitness_target: &f64) -> f64 {
(fitness_target - self.fitness()).abs()
}
}