#![allow(dead_code)]
use crate::facts::InferenceFact;
use dzero::{AlphaKey, ClosureProgram, RunBudget, SaturationFabric};
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum TdrFact {
DispatchStart {
layer: u32,
kernel: String,
batch: u32,
quant: u32,
},
DispatchTiming {
layer: u32,
kernel: String,
ms: u32,
},
TdrRisk {
level: u8,
},
SafeChunk {
size: u32,
},
}
pub fn tdr_alpha_key(f: &InferenceFact) -> Option<AlphaKey> {
match f {
InferenceFact::LayerOutput { .. } => Some(AlphaKey(10)), _ => None,
}
}
pub fn build_tdr_program() -> ClosureProgram<InferenceFact> {
let mut prog = ClosureProgram::new();
prog.register(AlphaKey(10), |fact, _store| {
if let InferenceFact::LayerOutput { layer_idx, .. } = fact {
if *layer_idx == 0 {
vec![InferenceFact::WriteOracleRow { layer_idx: 0 }] } else {
vec![]
}
} else {
vec![]
}
});
prog
}
pub struct PrivateTdrNavigator {
fabric: SaturationFabric<InferenceFact>,
}
impl PrivateTdrNavigator {
pub fn new() -> Self {
let program = build_tdr_program();
let key_fn = tdr_alpha_key;
let handler = |c: dzero::Consequent<InferenceFact>,
_store: &mut dzero::FactStore<InferenceFact>|
-> Vec<InferenceFact> {
match c {
dzero::Consequent::Custom(msg) if msg == "apply_chunk" => {
vec![]
}
_ => vec![],
}
};
let fabric = SaturationFabric::new(program, key_fn, handler);
Self { fabric }
}
pub fn emit(&mut self, fact: InferenceFact) {
self.fabric.assert(fact);
}
pub fn run(&mut self) -> bool {
let result = self.fabric.run_to_fixpoint(RunBudget::default());
result.saturated
}
pub fn recommended_chunk(&self) -> u32 {
8 }
}