use crate::facts::{bits_to_f32, InferenceFact, KEY_FINAL_LOGITS, KEY_LAYER_OUTPUT};
use dzero::{AlphaKey, FactStore};
use std::sync::{Arc, Mutex};
#[derive(Clone, Debug)]
pub struct OracleCapture {
pub layer_idx: u32,
pub position: u32,
pub rms: f32,
pub checksum: i64,
}
#[derive(Clone, Debug)]
pub struct LogitCapture {
pub position: u32,
pub rms: f32,
pub checksum: i64,
}
pub struct VaultOracleObserver {
pub captures: Arc<Mutex<Vec<OracleCapture>>>,
}
impl VaultOracleObserver {
pub fn new() -> Self {
Self {
captures: Arc::new(Mutex::new(Vec::new())),
}
}
pub fn rule(
&self,
) -> impl Fn(&InferenceFact, &FactStore<InferenceFact>) -> Vec<InferenceFact> + Send + Sync
{
let captures = self.captures.clone();
move |fact, _store| {
if let InferenceFact::LayerOutput {
layer_idx,
position,
rms_bits,
checksum,
} = fact
{
captures.lock().unwrap().push(OracleCapture {
layer_idx: *layer_idx,
position: *position,
rms: bits_to_f32(*rms_bits),
checksum: *checksum,
});
vec![InferenceFact::WriteOracleRow {
layer_idx: *layer_idx,
}]
} else {
vec![]
}
}
}
pub fn alpha_key() -> AlphaKey {
AlphaKey(KEY_LAYER_OUTPUT)
}
pub fn drain(&self) -> Vec<OracleCapture> {
self.captures.lock().unwrap().drain(..).collect()
}
}
impl Default for VaultOracleObserver {
fn default() -> Self {
Self::new()
}
}
pub struct CandleCompareObserver {
pub capture: Arc<Mutex<Option<LogitCapture>>>,
}
impl CandleCompareObserver {
pub fn new() -> Self {
Self {
capture: Arc::new(Mutex::new(None)),
}
}
pub fn rule(
&self,
) -> impl Fn(&InferenceFact, &FactStore<InferenceFact>) -> Vec<InferenceFact> + Send + Sync
{
let capture = self.capture.clone();
move |fact, _store| {
if let InferenceFact::FinalLogits {
position,
rms_bits,
checksum,
} = fact
{
*capture.lock().unwrap() = Some(LogitCapture {
position: *position,
rms: bits_to_f32(*rms_bits),
checksum: *checksum,
});
vec![InferenceFact::TriggerCandleCompare {
rms_bits: *rms_bits,
checksum: *checksum,
}]
} else {
vec![]
}
}
}
pub fn alpha_key() -> AlphaKey {
AlphaKey(KEY_FINAL_LOGITS)
}
pub fn take(&self) -> Option<LogitCapture> {
self.capture.lock().unwrap().take()
}
}
impl Default for CandleCompareObserver {
fn default() -> Self {
Self::new()
}
}
pub const FINAL_LOGITS_LAYER: u32 = u32::MAX;
#[derive(Clone, Debug)]
pub struct CertResult {
pub layer_idx: u32,
pub position: u32,
pub observed_rms: f32,
pub expected_rms: f32,
pub rel_delta: f32,
pub checksum_match: bool,
pub passed: bool,
pub is_final_logits: bool,
}
fn rel_delta(observed: f32, expected: f32) -> f32 {
if expected == 0.0 {
if observed == 0.0 {
0.0
} else {
f32::INFINITY
}
} else {
(observed - expected).abs() / expected.abs()
}
}
pub struct CertificationObserver {
pub layer_tolerance: f32,
pub logits_tolerance: f32,
pub results: Arc<Mutex<Vec<CertResult>>>,
}
impl CertificationObserver {
pub const DEFAULT_LAYER_TOLERANCE: f32 = 2.0;
pub const DEFAULT_LOGITS_TOLERANCE: f32 = 4.0;
pub fn new(layer_tolerance: f32, logits_tolerance: f32) -> Self {
Self {
layer_tolerance,
logits_tolerance,
results: Arc::new(Mutex::new(Vec::new())),
}
}
pub fn with_defaults() -> Self {
Self::new(
Self::DEFAULT_LAYER_TOLERANCE,
Self::DEFAULT_LOGITS_TOLERANCE,
)
}
pub fn layer_rule(
&self,
) -> impl Fn(&InferenceFact, &FactStore<InferenceFact>) -> Vec<InferenceFact> + Send + Sync
{
let results = self.results.clone();
let tolerance = self.layer_tolerance;
move |fact, store| {
let InferenceFact::LayerOutput {
layer_idx,
position,
rms_bits,
checksum,
} = fact
else {
return vec![];
};
for f in store.facts.iter() {
let InferenceFact::VaultOracle {
layer_idx: oracle_layer,
position: oracle_pos,
expected_rms_bits,
checksum: oracle_checksum,
..
} = f
else {
continue;
};
if *oracle_layer != *layer_idx as i32 || *oracle_pos != *position {
continue;
}
return certify(
&results,
*layer_idx,
*position,
*rms_bits,
*checksum,
*expected_rms_bits,
*oracle_checksum,
tolerance,
false,
);
}
vec![]
}
}
pub fn logits_rule(
&self,
) -> impl Fn(&InferenceFact, &FactStore<InferenceFact>) -> Vec<InferenceFact> + Send + Sync
{
let results = self.results.clone();
let tolerance = self.logits_tolerance;
move |fact, store| {
let InferenceFact::FinalLogits {
position,
rms_bits,
checksum,
} = fact
else {
return vec![];
};
for f in store.facts.iter() {
let InferenceFact::VaultOracle {
layer_idx: oracle_layer,
position: oracle_pos,
expected_rms_bits,
checksum: oracle_checksum,
..
} = f
else {
continue;
};
if *oracle_layer != -1 || *oracle_pos != *position {
continue;
}
return certify(
&results,
FINAL_LOGITS_LAYER,
*position,
*rms_bits,
*checksum,
*expected_rms_bits,
*oracle_checksum,
tolerance,
true,
);
}
vec![]
}
}
pub fn layer_alpha_key() -> AlphaKey {
AlphaKey(KEY_LAYER_OUTPUT)
}
pub fn logits_alpha_key() -> AlphaKey {
AlphaKey(KEY_FINAL_LOGITS)
}
pub fn drain(&self) -> Vec<CertResult> {
self.results.lock().unwrap().drain(..).collect()
}
}
#[allow(clippy::too_many_arguments)]
fn certify(
results: &Arc<Mutex<Vec<CertResult>>>,
layer_idx: u32,
position: u32,
observed_rms_bits: u32,
observed_checksum: i64,
expected_rms_bits: u32,
oracle_checksum: i64,
tolerance: f32,
is_final_logits: bool,
) -> Vec<InferenceFact> {
let observed_rms = bits_to_f32(observed_rms_bits);
let expected_rms = bits_to_f32(expected_rms_bits);
let delta = rel_delta(observed_rms, expected_rms);
let checksum_match = observed_checksum == oracle_checksum;
let passed = delta < tolerance;
results.lock().unwrap().push(CertResult {
layer_idx,
position,
observed_rms,
expected_rms,
rel_delta: delta,
checksum_match,
passed,
is_final_logits,
});
if passed {
vec![InferenceFact::CertificationPass {
layer_idx,
position,
rms_delta_bits: delta.to_bits(),
}]
} else {
vec![InferenceFact::CertificationFail {
layer_idx,
position,
rms_delta_bits: delta.to_bits(),
observed_rms_bits,
expected_rms_bits,
checksum_match,
}]
}
}
pub struct LayerStabilityObserver;
impl LayerStabilityObserver {
pub fn alpha_key() -> AlphaKey {
AlphaKey(KEY_LAYER_OUTPUT) }
pub fn rule(
) -> impl Fn(&InferenceFact, &FactStore<InferenceFact>) -> Vec<InferenceFact> + Send + Sync
{
|fact, _store| {
if let InferenceFact::LayerOutput {
layer_idx,
rms_bits,
..
} = fact
{
let rms = bits_to_f32(*rms_bits);
if rms > 0.0 && rms < 1000.0 && !rms.is_nan() && !rms.is_infinite() {
vec![InferenceFact::LayerOutputStable {
layer_idx: *layer_idx,
}]
} else {
vec![] }
} else {
vec![]
}
}
}
}