use criterion::*;
use genetic_algorithm::chromosome::Chromosome;
use genetic_algorithm::fitness::placeholders::CountTrue;
use genetic_algorithm::fitness::Fitness;
use genetic_algorithm::genotype::{BinaryGenotype, Genotype};
use genetic_algorithm::population::Population;
use rand::prelude::*;
use rand::rngs::SmallRng;
pub fn criterion_benchmark(c: &mut Criterion) {
let mut rng = SmallRng::from_entropy();
let population_sizes = vec![100, 1000];
let mut group = c.benchmark_group("population");
let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
group.plot_config(plot_config);
let genotype = BinaryGenotype::builder()
.with_genes_size(100)
.with_genes_hashing(true)
.build()
.unwrap();
for population_size in &population_sizes {
group.throughput(Throughput::Elements(*population_size as u64));
let chromosomes = (0..*population_size)
.map(|_| Chromosome::new(genotype.random_genes_factory(&mut rng)))
.collect();
let population = &mut Population::new(chromosomes, true);
CountTrue.call_for_population(population, &genotype, None, None);
group.bench_with_input(
BenchmarkId::new(
"fitness_score_cardinality (known score), low",
population_size,
),
population_size,
|b, &_population_size| {
b.iter_batched(
|| population.clone(),
|data| data.fitness_score_cardinality(),
BatchSize::SmallInput,
)
},
);
let random_chromosome = population.chromosomes.choose(&mut rng).unwrap();
let chromosomes = (0..*population_size)
.map(|_| random_chromosome.clone())
.collect();
let population = &mut Population::new(chromosomes, true);
CountTrue.call_for_population(population, &genotype, None, None);
group.bench_with_input(
BenchmarkId::new(
"fitness_score_cardinality (known score), high",
population_size,
),
population_size,
|b, &_population_size| {
b.iter_batched(
|| population.clone(),
|data| data.fitness_score_cardinality(),
BatchSize::SmallInput,
)
},
);
let chromosomes = (0..*population_size)
.map(|_| Chromosome::new(genotype.random_genes_factory(&mut rng)))
.collect();
let population = &mut Population::new(chromosomes, true);
group.bench_with_input(
BenchmarkId::new("genes_cardinality (unknown hash), low", population_size),
population_size,
|b, &_population_size| {
b.iter_batched(
|| population.clone(),
|data| {
data.chromosomes.iter().for_each(|c| {
c.calculate_hash();
});
data.genes_cardinality()
},
BatchSize::SmallInput,
)
},
);
let random_chromosome = population.chromosomes.choose(&mut rng).unwrap();
let chromosomes = (0..*population_size)
.map(|_| random_chromosome.clone())
.collect();
let population = &mut Population::new(chromosomes, true);
group.bench_with_input(
BenchmarkId::new("genes_cardinality (unknown hash), high", population_size),
population_size,
|b, &_population_size| {
b.iter_batched(
|| population.clone(),
|data| {
data.chromosomes.iter().for_each(|c| {
c.calculate_hash();
});
data.genes_cardinality()
},
BatchSize::SmallInput,
)
},
);
}
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);