use std::cmp::Ordering;
#[derive(Debug,Clone)]
pub struct IndividualWrapper<T: Individual> {
pub individual: T,
pub fitness: f64,
pub num_of_mutations: u32,
pub id: u32,
}
impl<T: Individual> PartialEq for IndividualWrapper<T> {
fn eq(&self, other: &IndividualWrapper<T>) -> bool {
self.fitness == other.fitness
}
}
impl<T: Individual> Eq for IndividualWrapper<T> {}
impl<T: Individual> Ord for IndividualWrapper<T> {
fn cmp(&self, other: &IndividualWrapper<T>) -> Ordering {
self.partial_cmp(other).expect("Fitness of Individual is NaN")
}
}
impl<T: Individual> PartialOrd for IndividualWrapper<T> {
fn partial_cmp(&self, other: &IndividualWrapper<T>) -> Option<Ordering> {
self.fitness.partial_cmp(&other.fitness)
}
}
pub trait Individual {
fn mutate(&mut self);
fn calculate_fitness(&mut self) -> f64;
fn reset(&mut self);
fn new_fittest_found(&mut self) {
}
}
#[cfg(test)]
mod test {
use super::{IndividualWrapper, Individual};
struct IndividualTest1;
impl Individual for IndividualTest1 {
fn mutate(&mut self) {
}
fn calculate_fitness(&mut self) -> f64 {
0.0
}
fn reset(&mut self) {
}
}
#[test]
fn compare1() {
let individual1 = IndividualWrapper{individual: IndividualTest1, fitness: 1.2, num_of_mutations: 21, id: 1};
let individual2 = IndividualWrapper{individual: IndividualTest1, fitness: 5.93, num_of_mutations: 7, id: 1};
assert!(individual2 > individual1);
}
#[test]
fn compare2() {
let individual1 = IndividualWrapper{individual: IndividualTest1, fitness: 3.78, num_of_mutations: 21, id: 1};
let individual2 = IndividualWrapper{individual: IndividualTest1, fitness: 7.12, num_of_mutations: 7, id: 1};
assert!(individual1 < individual2);
}
#[test]
fn compare3() {
let individual1 = IndividualWrapper{individual: IndividualTest1, fitness: 21.996, num_of_mutations: 11, id: 1};
let individual2 = IndividualWrapper{individual: IndividualTest1, fitness: 21.996, num_of_mutations: 34, id: 1};
assert!(individual1 == individual2);
}
}