use serde::{Deserialize, Serialize};
use tatara_lisp::DeriveTataraDomain;
use crate::SpecError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct Delta {
speedup_bp: u32,
}
impl Delta {
#[must_use]
pub fn measured(before: u64, after: u64) -> Option<Self> {
if after == 0 || after >= before {
return None;
}
let ratio_bp = (u128::from(before) * 10_000) / u128::from(after);
let bp = u32::try_from(ratio_bp.saturating_sub(10_000)).unwrap_or(u32::MAX);
Self::from_bp(bp)
}
#[must_use]
pub fn from_bp(speedup_bp: u32) -> Option<Self> {
(speedup_bp != 0).then_some(Self { speedup_bp })
}
#[must_use]
pub fn speedup_bp(self) -> u32 {
self.speedup_bp
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum Technique {
ReprSwap,
DropUnobservedOrder,
SkipRedundantStore,
HoistInvariant,
ForceOrderChange,
ResolutionChange,
MemoizeIdempotentQuery,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum ProofTier {
Rejected,
ForceOrderProof,
CouplingProof,
ByteSufficient,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum LeverStatus {
Proposed,
Landed,
Proven,
Discarded,
Deferred,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum MeasuredKind {
Pending,
Improved,
NoImprovement,
Regressed,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum Ceiling {
NotApplicable,
PartialCorpus,
PersistentLazyDesign,
NoPureFn,
ExternalObservation,
}
#[derive(DeriveTataraDomain, Serialize, Deserialize, Debug, Clone)]
#[tatara(keyword = "defperf-lever")]
pub struct PerfLever {
pub name: String,
pub attacks: Vec<String>,
pub technique: Technique,
#[serde(rename = "proofTier")]
pub proof_tier: ProofTier,
pub status: LeverStatus,
pub measured: MeasuredKind,
#[serde(rename = "speedupBp")]
pub speedup_bp: u32,
pub ceiling: Ceiling,
}
#[must_use]
pub fn earned_tier(technique: Technique) -> ProofTier {
match technique {
Technique::ReprSwap
| Technique::DropUnobservedOrder
| Technique::SkipRedundantStore
| Technique::MemoizeIdempotentQuery => ProofTier::ByteSufficient,
Technique::HoistInvariant => ProofTier::CouplingProof,
Technique::ForceOrderChange => ProofTier::ForceOrderProof,
Technique::ResolutionChange => ProofTier::Rejected,
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum HonestyViolation {
TierOverclaim { claimed: ProofTier, earned: ProofTier },
ProvenWithoutImprovement,
ImprovedButZeroDelta,
NonImprovementCarriesDelta,
RejectedWithoutCeiling,
DiscardedWithoutCause,
}
impl std::fmt::Display for HonestyViolation {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::TierOverclaim { claimed, earned } => write!(
f,
"claimed proof-tier {claimed:?} exceeds the {earned:?} that a technique of this class earns"
),
Self::ProvenWithoutImprovement => {
write!(f, "status Proven requires a measured Improved (null-as-win)")
}
Self::ImprovedButZeroDelta => {
write!(f, "measured Improved requires a non-zero speedup (null delta)")
}
Self::NonImprovementCarriesDelta => {
write!(f, "a non-Improved measurement must carry a zero speedup")
}
Self::RejectedWithoutCeiling => {
write!(f, "a Rejected proof-tier must name its ceiling")
}
Self::DiscardedWithoutCause => write!(
f,
"a Discarded lever must state a regression, a null measurement, or a ceiling"
),
}
}
}
impl PerfLever {
#[must_use]
pub fn delta(&self) -> Option<Delta> {
match self.measured {
MeasuredKind::Improved => Delta::from_bp(self.speedup_bp),
_ => None,
}
}
#[must_use]
pub fn honesty_violation(&self) -> Option<HonestyViolation> {
let earned = earned_tier(self.technique);
if self.proof_tier > earned {
return Some(HonestyViolation::TierOverclaim {
claimed: self.proof_tier,
earned,
});
}
if self.status == LeverStatus::Proven && self.measured != MeasuredKind::Improved {
return Some(HonestyViolation::ProvenWithoutImprovement);
}
if self.measured == MeasuredKind::Improved && self.speedup_bp == 0 {
return Some(HonestyViolation::ImprovedButZeroDelta);
}
if self.measured != MeasuredKind::Improved && self.speedup_bp != 0 {
return Some(HonestyViolation::NonImprovementCarriesDelta);
}
if self.proof_tier == ProofTier::Rejected && self.ceiling == Ceiling::NotApplicable {
return Some(HonestyViolation::RejectedWithoutCeiling);
}
if self.status == LeverStatus::Discarded
&& self.measured == MeasuredKind::Pending
&& self.ceiling == Ceiling::NotApplicable
{
return Some(HonestyViolation::DiscardedWithoutCause);
}
None
}
#[must_use]
pub fn is_honest(&self) -> bool {
self.honesty_violation().is_none()
}
}
pub trait PerfEnvironment {
fn cost_reading(&self) -> u64;
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LeverAudit {
pub name: String,
pub observed_cost: u64,
}
pub fn apply<E: PerfEnvironment>(lever: &PerfLever, env: &E) -> Result<LeverAudit, SpecError> {
if let Some(violation) = lever.honesty_violation() {
return Err(SpecError::Interp {
phase: "honesty".into(),
message: violation.to_string(),
});
}
Ok(LeverAudit {
name: lever.name.clone(),
observed_cost: env.cost_reading(),
})
}
pub const CANONICAL_PERF_LISP: &str = include_str!("../specs/perf.lisp");
pub fn load_canonical_levers() -> Result<Vec<PerfLever>, SpecError> {
crate::loader::load_all::<PerfLever>(CANONICAL_PERF_LISP)
}
#[cfg(test)]
mod tests {
use super::*;
struct MockPerf {
cost: u64,
}
impl PerfEnvironment for MockPerf {
fn cost_reading(&self) -> u64 {
self.cost
}
}
fn lever(name: &str) -> PerfLever {
load_canonical_levers()
.unwrap()
.into_iter()
.find(|l| l.name == name)
.unwrap_or_else(|| panic!("canonical lever {name}"))
}
#[test]
fn canonical_lisp_loads_this_sessions_levers() {
let levers = load_canonical_levers().unwrap();
assert_eq!(levers.len(), 20, "authored levers");
}
#[test]
fn every_authored_lever_is_honest() {
for l in load_canonical_levers().unwrap() {
assert!(
l.is_honest(),
"authored lever `{}` is dishonest: {:?}",
l.name,
l.honesty_violation()
);
}
}
#[test]
fn null_measurement_recorded_as_proven_is_caught() {
let mut bug = lever("m0-resolver");
bug.status = LeverStatus::Proven; assert_eq!(
bug.honesty_violation(),
Some(HonestyViolation::ProvenWithoutImprovement)
);
}
#[test]
fn improved_with_zero_speedup_is_caught() {
let mut bug = lever("m0-resolver");
bug.measured = MeasuredKind::Improved; bug.speedup_bp = 0; assert_eq!(
bug.honesty_violation(),
Some(HonestyViolation::ImprovedButZeroDelta)
);
}
#[test]
fn a_regression_has_no_delta_inhabitant() {
assert!(Delta::measured(1000, 1300).is_none(), "a slowdown is not a Delta");
assert!(Delta::measured(1000, 1000).is_none(), "a null is not a Delta");
assert!(Delta::measured(0, 0).is_none(), "a zero baseline is not a Delta");
assert!(Delta::from_bp(0).is_none(), "a zero speedup is not a Delta");
let d = Delta::measured(1000, 500).expect("2x speedup is a Delta");
assert_eq!(d.speedup_bp(), 10_000, "2x (1000→500) is +100% = 10_000 bp faster");
assert_eq!(
Delta::measured(3000, 1000).unwrap().speedup_bp(),
20_000,
"3x is +200% = 20_000 bp"
);
}
#[test]
fn a_resolution_change_claiming_byte_sufficiency_is_caught() {
let mut bug = lever("positional-frames");
bug.proof_tier = ProofTier::ByteSufficient;
assert_eq!(
bug.honesty_violation(),
Some(HonestyViolation::TierOverclaim {
claimed: ProofTier::ByteSufficient,
earned: ProofTier::Rejected,
})
);
}
#[test]
fn a_repr_swap_may_honestly_claim_byte_sufficiency() {
let nanbox = lever("nanbox-upvalues");
assert_eq!(nanbox.technique, Technique::ReprSwap);
assert_eq!(nanbox.proof_tier, ProofTier::ByteSufficient);
assert!(nanbox.is_honest());
}
#[test]
fn apply_errors_on_a_dishonest_lever_never_silent_ok() {
let mut bug = lever("positional-frames");
bug.proof_tier = ProofTier::ByteSufficient; let env = MockPerf { cost: 100 };
let err = apply(&bug, &env).unwrap_err();
match err {
SpecError::Interp { phase, .. } => assert_eq!(phase, "honesty"),
other => panic!("expected an Interp honesty error, got {other:?}"),
}
}
#[test]
fn apply_records_provenance_for_an_honest_lever() {
let honest = lever("nanbox-upvalues");
let env = MockPerf { cost: 4_242 };
let audit = apply(&honest, &env).unwrap();
assert_eq!(audit.name, "nanbox-upvalues");
assert_eq!(audit.observed_cost, 4_242, "the env reading is recorded as provenance");
}
#[test]
fn mis_attribution_is_out_of_scope_by_construction() {
let honest = lever("nanbox-upvalues");
assert!(honest.is_honest());
}
}