#![cfg(feature = "observer-tracing")]
use std::sync::Arc;
use genetic_algorithms::chromosomes::Binary as BinaryChromosome;
use genetic_algorithms::ga::Ga;
use genetic_algorithms::genotypes::Binary as BinaryGene;
use genetic_algorithms::initializers::binary_random_initialization;
use genetic_algorithms::observer::{GaObserver, AllObserver};
use genetic_algorithms::operations::{Crossover, Mutation, Selection, Survivor};
use genetic_algorithms::traits::{ConfigurationT, SelectionConfig, CrossoverConfig, MutationConfig, StoppingConfig};
use genetic_algorithms::configuration::ProblemSolving;
use genetic_algorithms::{TracingObserver, CompositeObserver};
fn build_test_ga(
observer: Arc<dyn GaObserver<BinaryChromosome> + Send + Sync>,
) -> Ga<BinaryChromosome> {
Ga::new()
.with_genes_per_chromosome(8)
.with_population_size(50)
.with_initialization_fn(binary_random_initialization)
.with_fitness_fn(|dna: &[BinaryGene]| {
dna.iter().filter(|g| g.value).count() as f64
})
.with_selection_method(Selection::Tournament)
.with_crossover_method(Crossover::Uniform)
.with_mutation_method(Mutation::BitFlip)
.with_problem_solving(ProblemSolving::Maximization)
.with_survivor_method(Survivor::Fitness)
.with_max_generations(10)
.with_observer(observer)
.build()
.unwrap()
}
#[test]
fn test_tracing_observer_attaches_and_runs() {
let observer = Arc::new(TracingObserver::new());
let mut ga = build_test_ga(observer);
let result = ga.run();
assert!(result.is_ok(), "GA run with TracingObserver returned Err: {:?}", result.err());
}
#[test]
fn test_tracing_observer_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<TracingObserver>();
}
#[test]
fn test_tracing_observer_crate_reexport() {
let _obs = TracingObserver::new();
let _obs2 = TracingObserver::default();
}
#[test]
fn test_tracing_observer_with_logtracer_no_recursion() {
let _ = tracing_log::LogTracer::init();
let subscriber = tracing_subscriber::fmt::Subscriber::builder()
.with_max_level(tracing::Level::TRACE)
.with_test_writer()
.finish();
tracing::subscriber::with_default(subscriber, || {
let observer = Arc::new(TracingObserver::new());
let mut ga = build_test_ga(observer);
let result = ga.run();
assert!(
result.is_ok(),
"GA run with LogTracer + TracingObserver returned Err: {:?}",
result.err()
);
});
}
#[test]
fn test_tracing_observer_in_composite() {
let tracing_obs = Arc::new(TracingObserver::new());
let composite = CompositeObserver::<BinaryChromosome>::new()
.add(tracing_obs as Arc<dyn AllObserver<BinaryChromosome> + Send + Sync>);
let composite_arc: Arc<dyn GaObserver<BinaryChromosome> + Send + Sync> = Arc::new(composite);
let mut ga = build_test_ga(composite_arc);
let result = ga.run();
assert!(result.is_ok(), "GA run with TracingObserver in CompositeObserver returned Err: {:?}", result.err());
}