use super::isa_seed::IsaPlaneCandidate;
use super::pair_kappa::screen_pair;
use ndarray::{Array1, Array2};
fn lcg(s: &mut u64) -> f64 {
*s = s
.wrapping_mul(6364136223846793005)
.wrapping_add(1442695040888963407);
((*s >> 11) as f64) / ((1u64 << 53) as f64)
}
fn lcg_normal(s: &mut u64) -> f64 {
let u1 = lcg(s).max(1e-12);
let u2 = lcg(s);
(-2.0 * u1.ln()).sqrt() * (std::f64::consts::TAU * u2).cos()
}
fn plane_candidate(p: usize, d0: usize, d1: usize, active: &[bool]) -> IsaPlaneCandidate {
let n = active.len();
let mut basis = Array2::<f64>::zeros((p, 2));
basis[[d0, 0]] = 1.0;
basis[[d1, 1]] = 1.0;
let gate_logits: Vec<f64> = active
.iter()
.map(|&a| if a { 0.0 } else { f64::NEG_INFINITY })
.collect();
IsaPlaneCandidate {
basis,
amplitudes: [1.0, 1.0],
phases_turns: Array2::<f64>::zeros((n, 1)),
gate_logits,
kappa: 1.0,
q_hat: active.iter().filter(|&&a| a).count() as f64 / n as f64,
}
}
fn split_single_circle_rho(p: usize, seed: u64) -> (f64, f64, bool) {
let mut s = seed;
let n = 6000usize;
let mut data = Array2::<f64>::zeros((n, p));
let active = vec![true; n]; for i in 0..n {
let th = std::f64::consts::TAU * lcg(&mut s);
data[[i, 0]] += th.cos();
data[[i, 1]] += th.sin();
for j in 0..p {
data[[i, j]] += 0.02 * lcg_normal(&mut s);
}
}
let mean = Array1::<f64>::zeros(p);
let ca = plane_candidate(p, 0, 2, &active);
let cb = plane_candidate(p, 1, 3, &active);
let v = screen_pair(data.view(), &mean, 0, 1, &ca, &cb);
(v.rho, v.z, v.merge_proposed)
}
fn gated_torus_rho(p: usize, q: f64, seed: u64) -> (f64, f64, bool) {
let mut s = seed;
let n = 6000usize;
let mut data = Array2::<f64>::zeros((n, p));
let mut act = vec![false; n];
for i in 0..n {
if lcg(&mut s) < q {
act[i] = true;
let ta = std::f64::consts::TAU * lcg(&mut s);
let tb = std::f64::consts::TAU * lcg(&mut s);
data[[i, 0]] += ta.cos();
data[[i, 1]] += ta.sin();
data[[i, 2]] += tb.cos();
data[[i, 3]] += tb.sin();
}
for j in 0..p {
data[[i, j]] += 0.02 * lcg_normal(&mut s);
}
}
let mean = Array1::<f64>::zeros(p);
let ca = plane_candidate(p, 0, 1, &act);
let cb = plane_candidate(p, 2, 3, &act);
let v = screen_pair(data.view(), &mean, 0, 1, &ca, &cb);
(v.rho, v.z, v.merge_proposed)
}
fn phase_correlated_dense_rho(p: usize, seed: u64) -> (f64, f64, bool) {
let mut s = seed;
let n = 6000usize;
let mut data = Array2::<f64>::zeros((n, p));
let active = vec![true; n];
for i in 0..n {
let ta = std::f64::consts::TAU * lcg(&mut s);
let tb = ta + 0.10 * lcg_normal(&mut s); data[[i, 0]] += ta.cos();
data[[i, 1]] += ta.sin();
data[[i, 2]] += tb.cos();
data[[i, 3]] += tb.sin();
for j in 0..p {
data[[i, j]] += 0.02 * lcg_normal(&mut s);
}
}
let mean = Array1::<f64>::zeros(p);
let ca = plane_candidate(p, 0, 1, &active);
let cb = plane_candidate(p, 2, 3, &active);
let v = screen_pair(data.view(), &mean, 0, 1, &ca, &cb);
(v.rho, v.z, v.merge_proposed)
}
#[test]
fn split_single_circle_is_a_lower_tail_gap() {
for &p in &[512usize, 2048] {
let (rho, z, merge) = split_single_circle_rho(p, 0xA11CE ^ p as u64);
eprintln!("[exp1 split-circle] p={p} ρ={rho:.4} z={z:.3} merge={merge}");
assert!(
(rho - 0.5).abs() < 0.08,
"split single circle must give ρ≈1/2 (complementary energies); p={p} got {rho:.4}"
);
assert!(
!merge,
"the ρ>1 presence screen must NOT fire on the lower-tail split; p={p} z={z:.3}"
);
}
}
#[test]
fn gated_torus_fires_scale_invariant() {
let q = 0.4;
for &p in &[512usize, 2048] {
let (rho, z, merge) = gated_torus_rho(p, q, 0x7013 ^ p as u64);
eprintln!("[exp3 gated-torus] p={p} q={q} ρ={rho:.4} z={z:.3} merge={merge}");
assert!(
merge,
"co-gated torus MUST fire the merge screen; p={p} ρ={rho:.4} z={z:.3}"
);
assert!(
(rho - 1.0 / q).abs() < 0.5,
"co-gated ρ must sit near 1/q=2.5; p={p} got {rho:.4}"
);
}
}
#[test]
fn phase_correlation_is_invisible_to_energy_screen() {
for &p in &[512usize, 2048] {
let (rho, z, merge) = phase_correlated_dense_rho(p, 0xB0BA ^ p as u64);
eprintln!("[exp2 phase-corr dense] p={p} ρ={rho:.4} z={z:.3} merge={merge}");
assert!(
(rho - 1.0).abs() < 0.05,
"dense phase-locked circles must read ρ≈1 to the energy screen; p={p} got {rho:.4}"
);
assert!(
!merge,
"energy screen must NOT fire on a pure phase law at dense presence; p={p}"
);
}
}