sim_lib_interference_compute/
evidence.rs1use std::fmt;
4
5use crate::DifferentialReport;
6
7pub const HARDWARE_DETERMINISM_REPEATS: usize = 100;
9
10#[derive(Clone, Copy, Debug, Eq, PartialEq)]
12pub enum HardwareMeasurementResult {
13 MeasuredPass,
15 MeasuredFail,
17 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#[derive(Clone, Copy, Debug, PartialEq)]
33pub struct HardwareEvidenceMetrics {
34 pub tiles: usize,
36 pub segments: u64,
38 pub max_abs_psi: f64,
40 pub intermediate_materializations: u64,
42 pub final_materializations: u64,
44 pub repeats: usize,
46 pub deterministic: bool,
48}
49
50#[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 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 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 pub fn result(&self) -> HardwareMeasurementResult {
124 self.result
125 }
126
127 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}