use dzero::AlphaKey;
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum HaltReason {
EosToken,
MaxTokensReached,
ExtraStopToken,
ControlHalt,
}
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum KernelKind {
Qkv,
AttnOut,
FfnDown,
FfnProj,
FullLayer, }
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum YieldReason {
TdrBudgetExceeded,
LayerBoundary,
}
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum InferenceFact {
LayerOutput {
layer_idx: u32,
position: u32,
rms_bits: u32, checksum: i64,
},
FinalLogits {
position: u32,
rms_bits: u32, checksum: i64,
},
OutputToken {
step: u32,
token_id: u32,
},
LayerOutputStable {
layer_idx: u32,
},
LogitsClean,
WriteOracleRow {
layer_idx: u32,
},
TriggerCandleCompare {
rms_bits: u32,
checksum: i64,
},
DispatchTiming {
layer: u32,
kernel: KernelKind,
elapsed_ms: u32,
},
DispatchCompleted {
layer: u32,
kernel: KernelKind,
elapsed_ms: u32,
},
TdrRiskHigh {
layer: u32,
},
TdrRiskLow {
layer: u32,
},
YieldNow {
layer: u32,
reason: YieldReason,
},
PromptToken {
position: u32,
token_id: u32,
},
EmbeddingRequest {
token_id: u32,
},
EmbeddingReady {
position: u32,
token_id: u32,
},
PrefillBatchReady {
token_count: u32,
},
PrefillComplete {
position: u32,
},
DecodeStep {
step: u32,
token_id: u32,
position: u32,
},
DecodeLogitsReady {
step: u32,
},
KvAdvance {
position: u32,
},
KvWritten,
GenerationHalt {
reason: HaltReason,
},
FamilyContext {
family: String,
quant: String,
has_qk_norm: bool,
},
PerTensorOutput {
layer_idx: u32,
position: u32,
q_rms_bits: u32,
k_rms_bits: u32,
v_rms_bits: u32,
post_rms_bits: u32,
ffn_rms_bits: u32,
output_rms_bits: u32,
q_checksum: i64,
k_checksum: i64,
v_checksum: i64,
post_checksum: i64,
ffn_checksum: i64,
output_checksum: i64,
},
TensorFact {
quant_type: u32,
shape: Vec<u32>,
offset: u64,
arch_params: String,
},
DispatchFact {
quant_type: u32,
formula_index: u32,
offset: u64,
},
VaultOracle {
model_id: u32,
layer_idx: i32,
position: u32,
expected_rms_bits: u32,
checksum: i64,
},
CertificationPass {
layer_idx: u32,
position: u32,
rms_delta_bits: u32,
},
CertificationFail {
layer_idx: u32,
position: u32,
rms_delta_bits: u32,
observed_rms_bits: u32,
expected_rms_bits: u32,
checksum_match: bool,
},
}
pub const KEY_LAYER_OUTPUT: u64 = 1;
pub const KEY_FINAL_LOGITS: u64 = 2;
pub const KEY_OUTPUT_TOKEN: u64 = 3;
pub const KEY_LAYER_STABLE: u64 = 4;
pub const KEY_LOGITS_CLEAN: u64 = 5;
pub const KEY_WRITE_ORACLE: u64 = 6;
pub const KEY_CANDLE_COMPARE: u64 = 7;
pub const KEY_FAMILY_CONTEXT: u64 = 8;
pub const KEY_PER_TENSOR_OUTPUT: u64 = 9;
pub const KEY_DISPATCH_TIMING: u64 = 10;
pub const KEY_TDR_RISK_HIGH: u64 = 11;
pub const KEY_TENSOR_FACT: u64 = 20;
pub const KEY_DISPATCH_FACT: u64 = 21;
pub const KEY_DISPATCH_COMPLETED: u64 = 18;
pub const KEY_KV_ADVANCE: u64 = 25;
pub const KEY_KV_WRITTEN: u64 = 26;
pub const KEY_VAULT_ORACLE: u64 = 22;
pub const KEY_CERT_PASS: u64 = 23;
pub const KEY_CERT_FAIL: u64 = 24;
pub const KEY_PROMPT_TOKEN: u64 = 12;
pub const KEY_EMBEDDING_READY: u64 = 13;
pub const KEY_EMBEDDING_REQUEST: u64 = 19; pub const KEY_PREFILL_BATCH_READY: u64 = 14;
pub const KEY_PREFILL_COMPLETE: u64 = 15;
pub const KEY_DECODE_STEP: u64 = 16;
pub const KEY_DECODE_LOGITS_READY: u64 = 17;
pub fn alpha_key_of(fact: &InferenceFact) -> Option<AlphaKey> {
match fact {
InferenceFact::LayerOutput { .. } => Some(AlphaKey(KEY_LAYER_OUTPUT)),
InferenceFact::FinalLogits { .. } => Some(AlphaKey(KEY_FINAL_LOGITS)),
InferenceFact::OutputToken { .. } => Some(AlphaKey(KEY_OUTPUT_TOKEN)),
InferenceFact::LayerOutputStable { .. } => Some(AlphaKey(KEY_LAYER_STABLE)),
InferenceFact::LogitsClean => Some(AlphaKey(KEY_LOGITS_CLEAN)),
InferenceFact::FamilyContext { .. } => Some(AlphaKey(KEY_FAMILY_CONTEXT)),
InferenceFact::PerTensorOutput { .. } => Some(AlphaKey(KEY_PER_TENSOR_OUTPUT)),
InferenceFact::TensorFact { .. } => Some(AlphaKey(KEY_TENSOR_FACT)),
InferenceFact::DispatchFact { .. } => Some(AlphaKey(KEY_DISPATCH_FACT)),
InferenceFact::DispatchTiming { .. } => Some(AlphaKey(KEY_DISPATCH_TIMING)),
InferenceFact::DispatchCompleted { .. } => Some(AlphaKey(KEY_DISPATCH_COMPLETED)),
InferenceFact::TdrRiskHigh { .. } => Some(AlphaKey(KEY_TDR_RISK_HIGH)),
InferenceFact::TdrRiskLow { .. } => None,
InferenceFact::PromptToken { .. } => Some(AlphaKey(KEY_PROMPT_TOKEN)),
InferenceFact::EmbeddingRequest { .. } => Some(AlphaKey(KEY_EMBEDDING_REQUEST)),
InferenceFact::EmbeddingReady { .. } => Some(AlphaKey(KEY_EMBEDDING_READY)),
InferenceFact::PrefillBatchReady { .. } => Some(AlphaKey(KEY_PREFILL_BATCH_READY)),
InferenceFact::PrefillComplete { .. } => Some(AlphaKey(KEY_PREFILL_COMPLETE)),
InferenceFact::DecodeStep { .. } => Some(AlphaKey(KEY_DECODE_STEP)),
InferenceFact::DecodeLogitsReady { .. } => Some(AlphaKey(KEY_DECODE_LOGITS_READY)),
InferenceFact::KvAdvance { .. } => Some(AlphaKey(KEY_KV_ADVANCE)),
InferenceFact::KvWritten => None,
InferenceFact::WriteOracleRow { .. } => None,
InferenceFact::TriggerCandleCompare { .. } => None,
InferenceFact::YieldNow { .. } => None,
InferenceFact::GenerationHalt { .. } => None,
InferenceFact::VaultOracle { .. } => Some(AlphaKey(KEY_VAULT_ORACLE)),
InferenceFact::CertificationPass { .. } => Some(AlphaKey(KEY_CERT_PASS)),
InferenceFact::CertificationFail { .. } => Some(AlphaKey(KEY_CERT_FAIL)),
}
}
pub fn f32_to_bits(v: f32) -> u32 {
v.to_bits()
}
#[derive(Clone, Debug)]
pub struct CapturedLayer {
pub layer_idx: u32,
pub position: u32,
pub rms: f32,
pub checksum: i64,
pub is_final_logits: bool,
}
pub fn bits_to_f32(bits: u32) -> f32 {
f32::from_bits(bits)
}
pub fn rms(v: &[f32]) -> f32 {
if v.is_empty() {
return 0.0;
}
let sq: f32 = v.iter().map(|x| x * x).sum();
(sq / v.len() as f32).sqrt()
}
pub fn checksum(v: &[f32]) -> i64 {
v.iter()
.map(|x| x.to_bits() as i64)
.fold(0i64, |a, b| a.wrapping_add(b))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn all_tier1_facts_have_alpha_keys() {
let facts = vec![
InferenceFact::LayerOutput {
layer_idx: 0,
position: 1,
rms_bits: 0,
checksum: 0,
},
InferenceFact::FinalLogits {
position: 1,
rms_bits: 0,
checksum: 0,
},
InferenceFact::OutputToken {
step: 0,
token_id: 1,
},
InferenceFact::FamilyContext {
family: "test".to_string(),
quant: "Q4_K_M".to_string(),
has_qk_norm: true,
},
InferenceFact::PerTensorOutput {
layer_idx: 0,
position: 1,
q_rms_bits: 0,
k_rms_bits: 0,
v_rms_bits: 0,
post_rms_bits: 0,
ffn_rms_bits: 0,
output_rms_bits: 0,
q_checksum: 0,
k_checksum: 0,
v_checksum: 0,
post_checksum: 0,
ffn_checksum: 0,
output_checksum: 0,
},
InferenceFact::TensorFact {
quant_type: 14,
shape: vec![256, 32000],
offset: 123456,
arch_params: "llama".to_string(),
},
];
for f in &facts {
assert!(
alpha_key_of(f).is_some(),
"Tier 1 fact must have alpha key: {:?}",
f
);
}
}
#[test]
fn tier3_consequents_have_no_alpha_key() {
let facts = vec![
InferenceFact::WriteOracleRow { layer_idx: 0 },
InferenceFact::TriggerCandleCompare {
rms_bits: 0,
checksum: 0,
},
];
for f in &facts {
assert!(
alpha_key_of(f).is_none(),
"Tier 3 fact must not have alpha key: {:?}",
f
);
}
}
#[test]
fn distinct_variants_have_distinct_keys() {
let k1 = alpha_key_of(&InferenceFact::LayerOutput {
layer_idx: 0,
position: 0,
rms_bits: 0,
checksum: 0,
});
let k2 = alpha_key_of(&InferenceFact::FinalLogits {
position: 0,
rms_bits: 0,
checksum: 0,
});
assert_ne!(
k1, k2,
"LayerOutput and FinalLogits must have distinct alpha keys"
);
}
}