pub(crate) use super::*;
#[test]
fn falsify_cma_001_step_size_positivity() {
let sphere = |x: &[f64]| x.iter().map(|xi| xi * xi).sum();
let mut cma = CmaEs::new(5).with_seed(42);
let space = SearchSpace::continuous(5, -5.0, 5.0);
cma.optimize(&sphere, &space, Budget::Evaluations(5000));
assert!(
cma.sigma > 0.0,
"FALSIFIED CMA-001: sigma = {} <= 0 after optimization",
cma.sigma
);
assert!(
cma.sigma.is_finite(),
"FALSIFIED CMA-001: sigma = {} (not finite)",
cma.sigma
);
}
#[test]
fn falsify_cma_002_covariance_positive_definite() {
let sphere = |x: &[f64]| x.iter().map(|xi| xi * xi).sum();
let mut cma = CmaEs::new(5).with_seed(42);
let space = SearchSpace::continuous(5, -5.0, 5.0);
cma.optimize(&sphere, &space, Budget::Evaluations(5000));
for (i, &c) in cma.c_diag.iter().enumerate() {
assert!(
c > 0.0,
"FALSIFIED CMA-002: c_diag[{i}] = {c} <= 0 (not positive definite)"
);
assert!(
c.is_finite(),
"FALSIFIED CMA-002: c_diag[{i}] = {c} (not finite)"
);
}
}
#[test]
fn falsify_cma_003_weight_normalization() {
for dim in [2, 5, 10, 20] {
let cma = CmaEs::new(dim);
let sum: f64 = cma.weights.iter().sum();
assert!(
(sum - 1.0).abs() < 1e-10,
"FALSIFIED CMA-003: sum(weights) = {sum} for dim={dim}, expected 1.0"
);
for (i, &w) in cma.weights.iter().enumerate() {
assert!(
w > 0.0,
"FALSIFIED CMA-003: weight[{i}] = {w} <= 0 for dim={dim}"
);
}
}
}
#[test]
fn falsify_cma_004_covariance_symmetry() {
let sphere = |x: &[f64]| x.iter().map(|xi| xi * xi).sum();
let mut cma = CmaEs::new(5).with_seed(42);
let space = SearchSpace::continuous(5, -5.0, 5.0);
cma.optimize(&sphere, &space, Budget::Evaluations(3000));
assert_eq!(
cma.c_diag.len(),
5,
"FALSIFIED CMA-004: c_diag length {} != dim 5",
cma.c_diag.len()
);
for (i, &c) in cma.c_diag.iter().enumerate() {
assert!(
c.is_finite(),
"FALSIFIED CMA-004: c_diag[{i}] = {c} (not finite, symmetry meaningless)"
);
}
}
#[test]
fn falsify_cma_006_dimension_one_boundary() {
let quadratic = |x: &[f64]| x[0] * x[0];
let mut cma = CmaEs::new(1).with_seed(42);
let space = SearchSpace::continuous(1, -10.0, 10.0);
let result = cma.optimize(&quadratic, &space, Budget::Evaluations(2000));
assert!(
result.objective_value < 0.1,
"FALSIFIED CMA-006: dim=1 objective = {} >= 0.1 (should converge on quadratic)",
result.objective_value
);
assert!(
cma.sigma > 0.0,
"FALSIFIED CMA-006: sigma = {} <= 0 for dim=1",
cma.sigma
);
assert_eq!(
cma.c_diag.len(),
1,
"FALSIFIED CMA-006: c_diag.len() = {} for dim=1",
cma.c_diag.len()
);
assert!(
cma.c_diag[0] > 0.0,
"FALSIFIED CMA-006: c_diag[0] = {} <= 0 for dim=1",
cma.c_diag[0]
);
}
mod cma_proptest_falsify {
use super::*;
use proptest::prelude::*;
proptest! {
#![proptest_config(ProptestConfig::with_cases(20))]
#[test]
fn falsify_cma_001_prop_step_size_positive(
dim in 2..=10usize,
seed in 0..500u64,
) {
let sphere = |x: &[f64]| -> f64 { x.iter().map(|xi| xi * xi).sum() };
let mut cma = CmaEs::new(dim).with_seed(seed);
let space = SearchSpace::continuous(dim, -5.0, 5.0);
cma.optimize(&sphere, &space, Budget::Evaluations(1000));
prop_assert!(
cma.sigma > 0.0,
"FALSIFIED CMA-001-prop: sigma={} <= 0 for dim={}, seed={}",
cma.sigma, dim, seed
);
}
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(50))]
#[test]
fn falsify_cma_003_prop_weight_normalization(
dim in 1..=30usize,
) {
let cma = CmaEs::new(dim);
let sum: f64 = cma.weights.iter().sum();
prop_assert!(
(sum - 1.0).abs() < 1e-10,
"FALSIFIED CMA-003-prop: sum(weights)={} for dim={}",
sum, dim
);
for (i, &w) in cma.weights.iter().enumerate() {
prop_assert!(
w > 0.0,
"FALSIFIED CMA-003-prop: weight[{}]={} <= 0 for dim={}",
i, w, dim
);
}
}
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(20))]
#[test]
fn falsify_cma_006_prop_dim1_convergence(
seed in 0..500u64,
) {
let quadratic = |x: &[f64]| -> f64 { x[0] * x[0] };
let mut cma = CmaEs::new(1).with_seed(seed);
let space = SearchSpace::continuous(1, -10.0, 10.0);
let result = cma.optimize(&quadratic, &space, Budget::Evaluations(2000));
prop_assert!(
result.objective_value < 1.0,
"FALSIFIED CMA-006-prop: dim=1 obj={} for seed={}",
result.objective_value, seed
);
prop_assert!(
cma.sigma > 0.0,
"FALSIFIED CMA-006-prop: sigma={} <= 0 for seed={}",
cma.sigma, seed
);
}
}
}