#[derive(Clone, Copy, Debug)]
pub struct Prices {
pub e_sample: f64,
pub e_read: f64,
pub e_write: f64,
pub reflash_hz_cap: Option<f64>,
}
pub const Z1_SPICE: Prices = Prices {
e_sample: 7.09e-15,
e_read: 1.692e-12,
e_write: 153.6e-12,
reflash_hz_cap: Some(1.0),
};
#[derive(Clone, Copy, Debug, Default)]
pub struct Ledger {
pub samples: u64,
pub reads: u64,
pub writes: u64,
}
impl Ledger {
pub fn joules(&self, p: &Prices) -> f64 {
self.samples as f64 * p.e_sample + self.reads as f64 * p.e_read + self.writes as f64 * p.e_write
}
pub fn shares(&self, p: &Prices) -> (f64, f64, f64) {
let s = self.samples as f64 * p.e_sample;
let r = self.reads as f64 * p.e_read;
let w = self.writes as f64 * p.e_write;
let t = (s + r + w).max(1e-300);
(s / t, r / t, w / t)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn write_to_sample_ratio_is_the_finding() {
let ratio = Z1_SPICE.e_write / Z1_SPICE.e_sample;
assert!((ratio - 21664.0).abs() < 100.0, "write/sample = {ratio}");
let rr = Z1_SPICE.e_read / Z1_SPICE.e_sample;
assert!((rr - 238.6).abs() < 5.0, "read/sample = {rr}");
}
}