#[cfg(feature = "parallel")]
pub trait MultiObjectiveFitness<G>: Send + Sync {
fn num_objectives(&self) -> usize;
fn evaluate(&self, genome: &G) -> Vec<f64>;
}
#[cfg(not(feature = "parallel"))]
pub trait MultiObjectiveFitness<G> {
fn num_objectives(&self) -> usize;
fn evaluate(&self, genome: &G) -> Vec<f64>;
}
pub struct ClosureMultiObjective<G, F> {
num_objectives: usize,
f: F,
_phantom: std::marker::PhantomData<fn() -> G>,
}
impl<G, F> ClosureMultiObjective<G, F>
where
F: Fn(&G) -> Vec<f64>,
{
pub fn new(num_objectives: usize, f: F) -> Self {
Self {
num_objectives,
f,
_phantom: std::marker::PhantomData,
}
}
}
#[cfg(feature = "parallel")]
impl<G, F> MultiObjectiveFitness<G> for ClosureMultiObjective<G, F>
where
F: Fn(&G) -> Vec<f64> + Send + Sync,
{
fn num_objectives(&self) -> usize {
self.num_objectives
}
fn evaluate(&self, genome: &G) -> Vec<f64> {
(self.f)(genome)
}
}
#[cfg(not(feature = "parallel"))]
impl<G, F> MultiObjectiveFitness<G> for ClosureMultiObjective<G, F>
where
F: Fn(&G) -> Vec<f64>,
{
fn num_objectives(&self) -> usize {
self.num_objectives
}
fn evaluate(&self, genome: &G) -> Vec<f64> {
(self.f)(genome)
}
}