pub struct BatchEngineProblem<C, T>where
C: Chromosome,{
pub objective: Objective,
pub codec: Arc<dyn Codec<C, T>>,
pub batch_fitness_fn: Arc<dyn Fn(Vec<T>) -> Vec<Score> + Send + Sync>,
}Expand description
A specialized implementation of the Problem trait optimized for batch evaluation.
BatchEngineProblem is designed for problems where batch fitness evaluation is significantly more efficient than individual evaluation. It uses a batch fitness function that can process multiple phenotypes at once, potentially leveraging vectorization, shared computations, or parallel processing.
§Generic Parameters
C: The Chromosome type that represents the genetic materialT: The phenotype type that represents the decoded individual
§Examples
use radiate_core::*;
use std::sync::Arc;
// Create a simple fitness function
let batch_fitness_fn = Arc::new(|phenotypes: Vec<Vec<f32>>| {
phenotypes.iter().map(|p| {
Score::from(p.iter().cloned().fold(0.0, f32::max))
}).collect()
});
let problem = BatchEngineProblem {
codec: Arc::new(FloatCodec::vector(5, 0.0..1.0)),
batch_fitness_fn,
objective: Objective::Single(Optimize::Maximize),
};§Use Cases
Use BatchEngineProblem when:
- Your fitness function can benefit from vectorization
- There are shared computations between multiple individuals
- The problem domain supports efficient batch processing
- You’re evaluating large populations where batch overhead is amortized
- You need parts or the whole of a population to be evaluated together
Fields§
§objective: Objective§codec: Arc<dyn Codec<C, T>>§batch_fitness_fn: Arc<dyn Fn(Vec<T>) -> Vec<Score> + Send + Sync>Trait Implementations§
Source§impl<C: Chromosome, T> Problem<C, T> for BatchEngineProblem<C, T>
Implementation of Problem for BatchEngineProblem.
impl<C: Chromosome, T> Problem<C, T> for BatchEngineProblem<C, T>
Implementation of Problem for BatchEngineProblem.
This implementation provides both individual and batch evaluation methods.
The individual evaluation method (eval) is implemented by wrapping the
phenotype in a single-element slice and calling the batch function, then
extracting the first result. This ensures consistency between individual
and batch evaluation while maintaining the benefits of batch processing.
Source§fn eval(&self, individual: &Genotype<C>) -> RadiateResult<Score>
fn eval(&self, individual: &Genotype<C>) -> RadiateResult<Score>
Source§fn eval_batch(&self, individuals: &[Genotype<C>]) -> RadiateResult<Vec<Score>>
fn eval_batch(&self, individuals: &[Genotype<C>]) -> RadiateResult<Vec<Score>>
impl<C: Chromosome, T> Send for BatchEngineProblem<C, T>
Mark BatchEngineProblem as thread-safe for parallel execution.
This implementation is safe because:
Arc<dyn Codec<C, T>>isSend + SyncwhenCandTareSend + SyncArc<dyn Fn(&[T]) -> Vec<Score> + Send + Sync>isSend + Syncby construction- The struct contains no interior mutability
- Batch operations are designed to be thread-safe