use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct WitnessSample<T> {
pub label: String,
pub observed: T,
pub expected: T,
}
impl<T> WitnessSample<T> {
pub fn new(label: impl Into<String>, observed: T, expected: T) -> Self {
Self {
label: label.into(),
observed,
expected,
}
}
pub fn is_satisfied(&self) -> bool
where
T: PartialEq,
{
self.observed == self.expected
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ValuationAdditivityWitness {
pub prime: u64,
pub samples: Vec<WitnessSample<(i64, i64, i64)>>,
}
impl ValuationAdditivityWitness {
pub fn from_samples(prime: u64, samples: Vec<WitnessSample<(i64, i64, i64)>>) -> Self {
Self { prime, samples }
}
pub fn passed(&self) -> usize {
self.samples
.iter()
.filter(|s| s.observed == s.expected)
.count()
}
pub fn total(&self) -> usize {
self.samples.len()
}
pub fn is_satisfied(&self) -> bool {
self.samples.iter().all(|s| s.observed == s.expected)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UltrametricWitness {
pub prime: u64,
pub samples: Vec<WitnessSample<i64>>,
}
impl UltrametricWitness {
pub fn from_samples(prime: u64, samples: Vec<WitnessSample<i64>>) -> Self {
Self { prime, samples }
}
pub fn passed(&self) -> usize {
self.samples
.iter()
.filter(|s| s.observed == s.expected)
.count()
}
pub fn total(&self) -> usize {
self.samples.len()
}
pub fn is_satisfied(&self) -> bool {
self.samples.iter().all(|s| s.observed == s.expected)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PrecisionPreservationWitness {
pub prime: u64,
pub precision: u32,
pub samples: Vec<WitnessSample<u32>>,
}
impl PrecisionPreservationWitness {
pub fn from_samples(prime: u64, precision: u32, samples: Vec<WitnessSample<u32>>) -> Self {
Self {
prime,
precision,
samples,
}
}
pub fn passed(&self) -> usize {
self.samples
.iter()
.filter(|s| s.observed == s.expected)
.count()
}
pub fn total(&self) -> usize {
self.samples.len()
}
pub fn is_satisfied(&self) -> bool {
self.samples.iter().all(|s| s.observed == s.expected)
}
}