metrale_circuit/venn/
measurements.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2
3//! 2026-09-29: The rows of `docs/kernel-perf/measurements.toml` an evidence record can cite,
4//! keyed `<kernel> @ <regime>`. The numbers stay in that file (its schema and checks are
5//! KERNEL-PERF.md's); the manifest only maps a row to a family's parameter point.
6//!
7//! Owner: metrale-circuit (venn).
8//! Invariants: a key names at most one row; a duplicate key is a load error.
9
10use std::collections::BTreeMap;
11
12use serde::Deserialize;
13
14/// 2026-09-29: What an evidence cell shows of one row.
15#[derive(Debug, Clone, Copy, PartialEq)]
16pub struct Measured {
17    /// 2026-09-29: Measured kernel time.
18    pub time_us: f64,
19    /// 2026-09-29: Roofline floor over measured time, percent.
20    pub pct_of_floor: f64,
21}
22
23/// 2026-09-29: The rows by key.
24pub type Measurements = BTreeMap<String, Measured>;
25
26#[derive(Deserialize)]
27struct File {
28    m: Vec<Row>,
29}
30
31#[derive(Deserialize)]
32struct Row {
33    kernel: String,
34    regime: String,
35    time_us: f64,
36    pct_of_floor: f64,
37}
38
39/// 2026-09-29: Parse measurements.toml (only the fields evidence shows; the file's other
40/// fields are its generator's business).
41pub fn parse_measurements(text: &str) -> Result<Measurements, String> {
42    let file: File = toml::from_str(text).map_err(|e| format!("measurements.toml: {e}"))?;
43    let mut out = Measurements::new();
44    for r in file.m {
45        let key = format!("{} @ {}", r.kernel, r.regime);
46        let row = Measured {
47            time_us: r.time_us,
48            pct_of_floor: r.pct_of_floor,
49        };
50        if out.insert(key.clone(), row).is_some() {
51            return Err(format!("measurements.toml: `{key}` names two rows"));
52        }
53    }
54    Ok(out)
55}