Skip to main content

sim_lib_interference_compute/
evidence.rs

1//! Bounded, fail-closed physical-provider evidence.
2
3use std::fmt;
4
5use crate::DifferentialReport;
6
7/// Number of same-profile executions required by the hardware contract.
8pub const HARDWARE_DETERMINISM_REPEATS: usize = 100;
9
10/// Whether a physical-provider observation can satisfy the hardware gate.
11#[derive(Clone, Copy, Debug, Eq, PartialEq)]
12pub enum HardwareMeasurementResult {
13    /// A physical adapter was measured and every contract passed.
14    MeasuredPass,
15    /// A physical adapter was measured and at least one contract failed.
16    MeasuredFail,
17    /// No qualifying physical adapter was measured.
18    NotMeasured,
19}
20
21impl HardwareMeasurementResult {
22    fn as_str(self) -> &'static str {
23        match self {
24            Self::MeasuredPass => "measured-pass",
25            Self::MeasuredFail => "measured-fail",
26            Self::NotMeasured => "not-measured",
27        }
28    }
29}
30
31/// Provider-independent measurements used to classify one hardware run.
32#[derive(Clone, Copy, Debug, PartialEq)]
33pub struct HardwareEvidenceMetrics {
34    /// Number of admitted physical field tiles.
35    pub tiles: usize,
36    /// Number of resident final-component segments.
37    pub segments: u64,
38    /// Largest residual phase argument sent to Tensor trigonometry.
39    pub max_abs_psi: f64,
40    /// Intermediate host materializations.
41    pub intermediate_materializations: u64,
42    /// Final component host materializations.
43    pub final_materializations: u64,
44    /// Same-profile execution count.
45    pub repeats: usize,
46    /// Whether every repeat produced bit-identical component planes.
47    pub deterministic: bool,
48}
49
50/// Sanitized differential, lifecycle, and determinism evidence for one profile.
51#[derive(Clone, Debug, PartialEq)]
52pub struct HardwareEvidenceReport {
53    adapter_id: String,
54    profile_id: String,
55    tiles: usize,
56    segments: u64,
57    max_abs_psi: f64,
58    max_component_abs: f64,
59    max_phase_abs: f64,
60    intermediate_materializations: u64,
61    final_materializations: u64,
62    repeats: usize,
63    result: HardwareMeasurementResult,
64}
65
66impl HardwareEvidenceReport {
67    /// Records that no qualifying physical adapter was measured.
68    ///
69    /// This result deliberately cannot satisfy [`Self::satisfies_hardware_gate`].
70    pub fn not_measured(adapter_id: impl Into<String>, profile_id: impl Into<String>) -> Self {
71        Self {
72            adapter_id: nonempty_or_unavailable(adapter_id.into()),
73            profile_id: nonempty_or_unavailable(profile_id.into()),
74            tiles: 0,
75            segments: 0,
76            max_abs_psi: 0.0,
77            max_component_abs: 0.0,
78            max_phase_abs: 0.0,
79            intermediate_materializations: 0,
80            final_materializations: 0,
81            repeats: 0,
82            result: HardwareMeasurementResult::NotMeasured,
83        }
84    }
85
86    /// Builds measured evidence from the shared differential report.
87    pub fn measured(
88        adapter_id: impl Into<String>,
89        profile_id: impl Into<String>,
90        metrics: HardwareEvidenceMetrics,
91        differential: &DifferentialReport,
92    ) -> Self {
93        let lifecycle =
94            metrics.intermediate_materializations == 0 && metrics.final_materializations == 2;
95        let finite = metrics.max_abs_psi.is_finite()
96            && differential.max_component_absolute_error().is_finite()
97            && differential.max_phase_absolute_error().is_finite();
98        let passed = differential.passed()
99            && metrics.deterministic
100            && lifecycle
101            && finite
102            && metrics.repeats == HARDWARE_DETERMINISM_REPEATS;
103        Self {
104            adapter_id: nonempty_or_unavailable(adapter_id.into()),
105            profile_id: nonempty_or_unavailable(profile_id.into()),
106            tiles: metrics.tiles,
107            segments: metrics.segments,
108            max_abs_psi: metrics.max_abs_psi,
109            max_component_abs: differential.max_component_absolute_error(),
110            max_phase_abs: differential.max_phase_absolute_error(),
111            intermediate_materializations: metrics.intermediate_materializations,
112            final_materializations: metrics.final_materializations,
113            repeats: metrics.repeats,
114            result: if passed {
115                HardwareMeasurementResult::MeasuredPass
116            } else {
117                HardwareMeasurementResult::MeasuredFail
118            },
119        }
120    }
121
122    /// Returns the explicit measurement classification.
123    pub fn result(&self) -> HardwareMeasurementResult {
124        self.result
125    }
126
127    /// Returns true only for a qualifying 100-repeat measured pass.
128    pub fn satisfies_hardware_gate(&self) -> bool {
129        self.result == HardwareMeasurementResult::MeasuredPass
130            && self.repeats == HARDWARE_DETERMINISM_REPEATS
131    }
132}
133
134impl fmt::Display for HardwareEvidenceReport {
135    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
136        writeln!(
137            formatter,
138            "provider=wgpu adapter={} profile={} dtype=f32 tiles={} segments={}",
139            self.adapter_id, self.profile_id, self.tiles, self.segments
140        )?;
141        writeln!(
142            formatter,
143            "max_abs_psi={:.9e} max_component_abs={:.9e} max_phase_abs={:.9e}",
144            self.max_abs_psi, self.max_component_abs, self.max_phase_abs
145        )?;
146        write!(
147            formatter,
148            "intermediate_materializations={} final_materializations={} repeats={}\nresult={}",
149            self.intermediate_materializations,
150            self.final_materializations,
151            self.repeats,
152            self.result.as_str()
153        )
154    }
155}
156
157fn nonempty_or_unavailable(value: String) -> String {
158    if value.trim().is_empty() {
159        "unavailable".to_owned()
160    } else {
161        value
162    }
163}