use super::*;
#[test]
fn falsify_mh_001_pso_sphere_convergence() {
let sphere = |x: &[f64]| x.iter().map(|xi| xi * xi).sum();
let mut pso = ParticleSwarm::default().with_seed(42);
let space = SearchSpace::continuous(2, -5.0, 5.0);
let result = pso.optimize(&sphere, &space, Budget::Evaluations(5000));
assert!(
result.objective_value < 1.0,
"FALSIFIED MH-001: PSO sphere objective {} >= 1.0",
result.objective_value
);
}
#[test]
fn falsify_mh_002_pso_solution_dimension() {
let sphere = |x: &[f64]| x.iter().map(|xi| xi * xi).sum();
let mut pso = ParticleSwarm::default().with_seed(42);
let space = SearchSpace::continuous(3, -5.0, 5.0);
let result = pso.optimize(&sphere, &space, Budget::Evaluations(1000));
assert_eq!(
result.solution.len(),
3,
"FALSIFIED MH-002: solution dim {} != search space dim 3",
result.solution.len()
);
}
#[test]
fn falsify_mh_003_pso_within_bounds() {
let sphere = |x: &[f64]| x.iter().map(|xi| xi * xi).sum();
let mut pso = ParticleSwarm::default().with_seed(42);
let space = SearchSpace::continuous(3, -2.0, 2.0);
let result = pso.optimize(&sphere, &space, Budget::Evaluations(2000));
for (i, &v) in result.solution.iter().enumerate() {
assert!(
(-2.0..=2.0).contains(&v),
"FALSIFIED MH-003: solution[{i}]={v} outside bounds [-2, 2]"
);
}
}
mod pso_proptest_falsify {
use super::*;
use proptest::prelude::*;
proptest! {
#![proptest_config(ProptestConfig::with_cases(15))]
#[test]
fn falsify_mh_002_prop_solution_dimension(
dim in 1..=5usize,
seed in 0..200u64,
) {
let sphere = |x: &[f64]| -> f64 { x.iter().map(|xi| xi * xi).sum() };
let mut pso = ParticleSwarm::default().with_seed(seed);
let space = SearchSpace::continuous(dim, -5.0, 5.0);
let result = pso.optimize(&sphere, &space, Budget::Evaluations(1000));
prop_assert_eq!(
result.solution.len(),
dim,
"FALSIFIED MH-002-prop: PSO solution dim {} != {}",
result.solution.len(), dim
);
}
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(15))]
#[test]
fn falsify_mh_003_prop_within_bounds(
dim in 2..=4usize,
seed in 0..200u64,
) {
let sphere = |x: &[f64]| -> f64 { x.iter().map(|xi| xi * xi).sum() };
let mut pso = ParticleSwarm::default().with_seed(seed);
let space = SearchSpace::continuous(dim, -5.0, 5.0);
let result = pso.optimize(&sphere, &space, Budget::Evaluations(2000));
for (i, &v) in result.solution.iter().enumerate() {
prop_assert!(
(-5.0..=5.0).contains(&v),
"FALSIFIED MH-003-prop: PSO solution[{}]={} outside [-5,5]",
i, v
);
}
}
}
}