use super::{LeakMonitor, MonitorConfig};
const MATH_EPSILON: f64 = 1e-10;
#[derive(Debug, Clone)]
pub struct ConformanceResult {
pub requirement_id: &'static str,
pub description: &'static str,
pub level: RequirementLevel,
pub status: TestStatus,
pub evidence: String,
pub confidence: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RequirementLevel {
Must,
Should,
May,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TestStatus {
Pass,
Fail,
Skip,
XFail,
}
pub struct EProcessConformanceHarness {
tests: Vec<ConformanceTest>,
results: Vec<ConformanceResult>,
}
pub struct ConformanceTest {
pub id: &'static str,
pub description: &'static str,
pub level: RequirementLevel,
pub test_fn: fn() -> ConformanceResult,
}
impl EProcessConformanceHarness {
pub fn new() -> Self {
let tests = vec![
ConformanceTest {
id: "MART-001",
description: "Likelihood ratio normalization maintains E[LR] ≤ 1",
level: RequirementLevel::Must,
test_fn: test_likelihood_ratio_expectation,
},
ConformanceTest {
id: "MART-002",
description: "Supermartingale property under exponential null",
level: RequirementLevel::Must,
test_fn: test_supermartingale_property,
},
ConformanceTest {
id: "MART-003",
description: "Alert threshold respects Ville's inequality bound",
level: RequirementLevel::Must,
test_fn: test_ville_inequality_bound,
},
ConformanceTest {
id: "MART-004",
description: "E-value remains finite under realistic load",
level: RequirementLevel::Must,
test_fn: test_numerical_stability,
},
ConformanceTest {
id: "MART-005",
description: "Alert rate converges to α under null hypothesis",
level: RequirementLevel::Should,
test_fn: test_false_positive_rate_convergence,
},
ConformanceTest {
id: "MART-006",
description: "Peak e-value tracking is monotonic",
level: RequirementLevel::Should,
test_fn: test_peak_tracking_monotonic,
},
ConformanceTest {
id: "MART-007",
description: "Reset preserves configuration invariants",
level: RequirementLevel::Should,
test_fn: test_reset_preserves_invariants,
},
ConformanceTest {
id: "MART-008",
description: "Log-space computation prevents underflow",
level: RequirementLevel::Must,
test_fn: test_log_space_stability,
},
];
Self {
tests,
results: Vec::new(),
}
}
pub fn run_all(&mut self) {
self.results.clear();
for test in &self.tests {
let result = (test.test_fn)();
self.results.push(ConformanceResult {
requirement_id: test.id,
description: test.description,
level: test.level,
status: result.status,
evidence: result.evidence,
confidence: result.confidence,
});
}
}
pub fn compliance_matrix(&self) -> String {
let mut output = String::new();
output.push_str("# E-Process Martingale Conformance Matrix\n\n");
output.push_str("| Req ID | Level | Status | Description | Evidence |\n");
output.push_str("|--------|-------|--------|-------------|----------|\n");
let mut must_total = 0;
let mut must_pass = 0;
let mut should_total = 0;
let mut should_pass = 0;
for result in &self.results {
let status_str = match result.status {
TestStatus::Pass => "✅ PASS",
TestStatus::Fail => "❌ FAIL",
TestStatus::Skip => "⏸️ SKIP",
TestStatus::XFail => "⚠️ XFAIL",
};
let level_str = match result.level {
RequirementLevel::Must => {
must_total += 1;
if result.status == TestStatus::Pass {
must_pass += 1;
}
"MUST"
}
RequirementLevel::Should => {
should_total += 1;
if result.status == TestStatus::Pass {
should_pass += 1;
}
"SHOULD"
}
RequirementLevel::May => "MAY",
};
output.push_str(&format!(
"| {} | {} | {} | {} | {} |\n",
result.requirement_id,
level_str,
status_str,
result.description,
result.evidence.chars().take(50).collect::<String>()
));
}
output.push_str("\n## Compliance Summary\n\n");
let must_score = if must_total > 0 {
(must_pass as f64 / must_total as f64) * 100.0
} else {
100.0
};
let should_score = if should_total > 0 {
(should_pass as f64 / should_total as f64) * 100.0
} else {
100.0
};
output.push_str(&format!(
"**MUST Requirements**: {}/{} ({:.1}%)\n",
must_pass, must_total, must_score
));
output.push_str(&format!(
"**SHOULD Requirements**: {}/{} ({:.1}%)\n",
should_pass, should_total, should_score
));
if must_score >= 95.0 {
output.push_str(
"\n✅ **CONFORMANT**: Implementation satisfies martingale requirements\n",
);
} else {
output.push_str(
"\n❌ **NON-CONFORMANT**: Critical mathematical requirements not satisfied\n",
);
}
output
}
pub fn failed_requirements(&self) -> Vec<&ConformanceResult> {
self.results
.iter()
.filter(|r| r.status == TestStatus::Fail)
.collect()
}
pub fn results(&self) -> &[ConformanceResult] {
&self.results
}
}
fn deterministic_exponential_null_sample(
sequence: usize,
observation: usize,
sequence_count: usize,
observations_per_sequence: usize,
expected_lifetime_ns: u64,
) -> u64 {
debug_assert!(sequence < sequence_count);
debug_assert!(observation < observations_per_sequence);
let total_samples = sequence_count
.checked_mul(observations_per_sequence)
.expect("e-process conformance sample grid overflowed");
let sample_index = observation
.checked_mul(sequence_count)
.and_then(|offset| offset.checked_add(sequence))
.expect("e-process conformance sample index overflowed");
let u = (sample_index as f64 + 0.5) / total_samples as f64;
let sample = -(expected_lifetime_ns as f64) * (1.0 - u).ln();
sample as u64
}
fn test_likelihood_ratio_expectation() -> ConformanceResult {
let mu = 1_000_000.0; let normalizer = 1.0 + (-1.0_f64).exp();
let theoretical_unnormalized = 1.0 + (-1.0_f64).exp(); let theoretical_normalized = theoretical_unnormalized / normalizer;
let samples = 10_000;
let mut lr_sum = 0.0;
for i in 0..samples {
let u = (i as f64 + 0.5) / samples as f64; let x = -mu * (1.0 - u).ln();
let ratio = x / mu;
let lr = ratio.max(1.0) / normalizer;
lr_sum += lr;
}
let empirical_mean = lr_sum / samples as f64;
let error = (empirical_mean - 1.0).abs();
if error < 0.01 && (theoretical_normalized - 1.0).abs() < MATH_EPSILON {
ConformanceResult {
requirement_id: "MART-001",
description: "Likelihood ratio expectation ≤ 1",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: format!(
"Theoretical E[LR] = {:.6}, Empirical = {:.6}, Error = {:.6}",
theoretical_normalized, empirical_mean, error
),
confidence: 0.99,
}
} else {
ConformanceResult {
requirement_id: "MART-001",
description: "Likelihood ratio expectation ≤ 1",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: format!(
"VIOLATION: Theoretical E[LR] = {:.6}, Empirical = {:.6}, Error = {:.6}",
theoretical_normalized, empirical_mean, error
),
confidence: 0.99,
}
}
}
fn test_supermartingale_property() -> ConformanceResult {
let config = MonitorConfig {
alpha: 0.01,
expected_lifetime_ns: 1_000_000, min_observations: 3,
};
let num_sequences = 100usize;
let observations_per_sequence = 50usize;
let mut final_e_values = Vec::new();
for seq in 0..num_sequences {
let mut monitor = LeakMonitor::new(config);
for i in 0..observations_per_sequence {
let age = deterministic_exponential_null_sample(
seq,
i,
num_sequences,
observations_per_sequence,
config.expected_lifetime_ns,
);
monitor.observe(age);
}
final_e_values.push(monitor.e_value());
}
let mean_e_value: f64 = final_e_values.iter().sum::<f64>() / final_e_values.len() as f64;
let max_e_value = final_e_values.iter().fold(0.0f64, |a, &b| a.max(b));
let martingale_ok = mean_e_value <= 1.5; let bounded_ok = max_e_value <= 100.0;
if martingale_ok && bounded_ok {
ConformanceResult {
requirement_id: "MART-002",
description: "Supermartingale property under H0",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: format!(
"Mean final e-value = {:.4}, Max = {:.4} across {} sequences",
mean_e_value, max_e_value, num_sequences
),
confidence: 0.95,
}
} else {
ConformanceResult {
requirement_id: "MART-002",
description: "Supermartingale property under H0",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: format!(
"VIOLATION: Mean final e-value = {:.4} > 1.5 or Max = {:.4} > 100",
mean_e_value, max_e_value
),
confidence: 0.95,
}
}
}
fn test_ville_inequality_bound() -> ConformanceResult {
let alphas = [0.001, 0.01, 0.05, 0.1];
let mut all_correct = true;
let mut evidence_parts = Vec::new();
for &alpha in &alphas {
let config = MonitorConfig {
alpha,
expected_lifetime_ns: 1_000_000,
min_observations: 3,
};
let monitor = LeakMonitor::new(config);
let expected_threshold = 1.0 / alpha;
let actual_threshold = monitor.threshold();
let threshold_correct = (actual_threshold - expected_threshold).abs() < MATH_EPSILON;
if !threshold_correct {
all_correct = false;
}
evidence_parts.push(format!(
"α={:.3}: threshold {:.1} (expected {:.1})",
alpha, actual_threshold, expected_threshold
));
}
if all_correct {
ConformanceResult {
requirement_id: "MART-003",
description: "Alert threshold = 1/α for Ville's inequality",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: evidence_parts.join("; "),
confidence: 1.0,
}
} else {
ConformanceResult {
requirement_id: "MART-003",
description: "Alert threshold = 1/α for Ville's inequality",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: format!("VIOLATION: {}", evidence_parts.join("; ")),
confidence: 1.0,
}
}
}
fn test_numerical_stability() -> ConformanceResult {
let mut monitor = LeakMonitor::new(MonitorConfig {
alpha: 0.01,
expected_lifetime_ns: 1_000_000,
min_observations: 3,
});
let test_cases = [
(1_000_000_000u64, "very large age"), (100u64, "very small age"), (u64::MAX / 2, "near-max age"), ];
let mut all_stable = true;
let mut evidence_parts = Vec::new();
for (age, description) in &test_cases {
let before_e = monitor.e_value();
monitor.observe(*age);
let after_e = monitor.e_value();
let is_finite = after_e.is_finite();
let not_explosive = after_e < 1e100; let stable = is_finite && not_explosive;
if !stable {
all_stable = false;
}
evidence_parts.push(format!(
"{}: e-value {:.2e} → {:.2e} ({})",
description,
before_e,
after_e,
if stable { "stable" } else { "UNSTABLE" }
));
}
if all_stable {
ConformanceResult {
requirement_id: "MART-004",
description: "Numerical stability under extreme inputs",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: evidence_parts.join("; "),
confidence: 0.99,
}
} else {
ConformanceResult {
requirement_id: "MART-004",
description: "Numerical stability under extreme inputs",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: format!("VIOLATION: {}", evidence_parts.join("; ")),
confidence: 0.99,
}
}
}
fn test_false_positive_rate_convergence() -> ConformanceResult {
let alpha = 0.05; let config = MonitorConfig {
alpha,
expected_lifetime_ns: 1_000_000,
min_observations: 10,
};
let num_trials = 1000usize; let observations_per_trial = 20usize;
let mut alert_count = 0;
for trial in 0..num_trials {
let mut monitor = LeakMonitor::new(config);
for i in 0..observations_per_trial {
let age = deterministic_exponential_null_sample(
trial,
i,
num_trials,
observations_per_trial,
config.expected_lifetime_ns,
);
monitor.observe(age);
}
if monitor.is_alert() {
alert_count += 1;
}
}
let observed_rate = alert_count as f64 / num_trials as f64;
let expected_rate = alpha;
let stderr = (alpha * (1.0 - alpha) / num_trials as f64).sqrt();
let margin = 2.0 * stderr;
let within_bounds = observed_rate <= expected_rate + margin;
if within_bounds {
ConformanceResult {
requirement_id: "MART-005",
description: "False positive rate ≤ α under null",
level: RequirementLevel::Should,
status: TestStatus::Pass,
evidence: format!(
"Observed rate {:.4}, Expected upper bound {:.4} + {:.4} ({}/{})",
observed_rate, expected_rate, margin, alert_count, num_trials
),
confidence: 0.95,
}
} else {
ConformanceResult {
requirement_id: "MART-005",
description: "False positive rate ≤ α under null",
level: RequirementLevel::Should,
status: TestStatus::Fail,
evidence: format!(
"VIOLATION: Rate {:.4} exceeds upper bound {:.4} ({}/{})",
observed_rate,
expected_rate + margin,
alert_count,
num_trials
),
confidence: 0.95,
}
}
}
fn test_peak_tracking_monotonic() -> ConformanceResult {
let mut monitor = LeakMonitor::new(MonitorConfig::default());
let ages = [500_000u64, 2_000_000, 1_000_000, 5_000_000, 800_000];
let mut is_monotonic = true;
let mut evidence_parts = Vec::new();
for &age in &ages {
let before_peak = monitor.peak_e_value();
monitor.observe(age);
let after_peak = monitor.peak_e_value();
let current_e = monitor.e_value();
let peak_monotonic = after_peak >= before_peak - MATH_EPSILON;
let peak_valid = after_peak >= current_e - MATH_EPSILON;
if !peak_monotonic || !peak_valid {
is_monotonic = false;
}
evidence_parts.push(format!(
"age={}ns: peak {:.4}→{:.4}, current={:.4}",
age, before_peak, after_peak, current_e
));
}
if is_monotonic {
ConformanceResult {
requirement_id: "MART-006",
description: "Peak e-value tracking is monotonic",
level: RequirementLevel::Should,
status: TestStatus::Pass,
evidence: evidence_parts.join("; "),
confidence: 1.0,
}
} else {
ConformanceResult {
requirement_id: "MART-006",
description: "Peak e-value tracking is monotonic",
level: RequirementLevel::Should,
status: TestStatus::Fail,
evidence: format!("VIOLATION: {}", evidence_parts.join("; ")),
confidence: 1.0,
}
}
}
fn test_reset_preserves_invariants() -> ConformanceResult {
let config = MonitorConfig {
alpha: 0.025,
expected_lifetime_ns: 2_000_000,
min_observations: 7,
};
let mut monitor = LeakMonitor::new(config);
monitor.observe(10_000_000);
monitor.observe(50_000_000);
let config_before = *monitor.config();
let threshold_before = monitor.threshold();
monitor.reset();
let config_after = *monitor.config();
let threshold_after = monitor.threshold();
let e_value_after = monitor.e_value();
let observations_after = monitor.observations();
let peak_after = monitor.peak_e_value();
let config_preserved = (config_before.alpha - config_after.alpha).abs() < MATH_EPSILON
&& config_before.expected_lifetime_ns == config_after.expected_lifetime_ns
&& config_before.min_observations == config_after.min_observations;
let threshold_preserved = (threshold_before - threshold_after).abs() < MATH_EPSILON;
let state_reset = (e_value_after - 1.0).abs() < MATH_EPSILON
&& observations_after == 0
&& (peak_after - 1.0).abs() < MATH_EPSILON;
if config_preserved && threshold_preserved && state_reset {
ConformanceResult {
requirement_id: "MART-007",
description: "Reset preserves config, resets state",
level: RequirementLevel::Should,
status: TestStatus::Pass,
evidence: format!(
"Config preserved, e-value={:.6}, obs={}, peak={:.6}",
e_value_after, observations_after, peak_after
),
confidence: 1.0,
}
} else {
ConformanceResult {
requirement_id: "MART-007",
description: "Reset preserves config, resets state",
level: RequirementLevel::Should,
status: TestStatus::Fail,
evidence: format!(
"VIOLATION: config_ok={}, threshold_ok={}, state_ok={}",
config_preserved, threshold_preserved, state_reset
),
confidence: 1.0,
}
}
}
fn test_log_space_stability() -> ConformanceResult {
let mut monitor = LeakMonitor::new(MonitorConfig {
alpha: 0.001, expected_lifetime_ns: 1_000_000,
min_observations: 3,
});
let small_ages = vec![100_000u64; 1000];
let mut all_finite = true;
let mut evidence_parts = Vec::new();
for (i, &age) in small_ages.iter().enumerate() {
monitor.observe(age);
let e_val = monitor.e_value();
if !e_val.is_finite() || e_val < 0.0 {
all_finite = false;
evidence_parts.push(format!("obs {}: e-value became {}", i, e_val));
break;
}
if i % 100 == 99 {
evidence_parts.push(format!("obs {}: e-value = {:.2e}", i + 1, e_val));
}
}
let final_e = monitor.e_value();
let obs_count = monitor.observations();
if all_finite && final_e >= 0.0 && obs_count == small_ages.len() as u64 {
ConformanceResult {
requirement_id: "MART-008",
description: "Log-space computation prevents underflow",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: format!(
"Handled {} observations, final e-value = {:.2e}",
obs_count, final_e
),
confidence: 0.99,
}
} else {
ConformanceResult {
requirement_id: "MART-008",
description: "Log-space computation prevents underflow",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: format!(
"VIOLATION: finite={}, final_e={:.2e}, obs={}",
all_finite, final_e, obs_count
),
confidence: 0.99,
}
}
}
impl Default for EProcessConformanceHarness {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
#![allow(
clippy::pedantic,
clippy::nursery,
clippy::expect_fun_call,
clippy::map_unwrap_or,
clippy::cast_possible_wrap,
clippy::future_not_send
)]
use super::*;
#[test]
fn conformance_harness_runs_all_tests() {
let mut harness = EProcessConformanceHarness::new();
harness.run_all();
assert_eq!(harness.results.len(), 8);
let matrix = harness.compliance_matrix();
assert!(matrix.contains("E-Process Martingale Conformance Matrix"));
let must_count = harness
.results
.iter()
.filter(|r| r.level == RequirementLevel::Must)
.count();
assert!(must_count >= 4); }
#[test]
fn individual_mathematical_test_runs() {
let result = test_likelihood_ratio_expectation();
assert!(result.requirement_id == "MART-001");
let result = test_ville_inequality_bound();
assert!(result.requirement_id == "MART-003");
assert!(result.confidence > 0.0);
}
}