use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct SecureFieldMirror {
pub a: u32,
pub b: u32,
pub c: u32,
pub d: u32,
}
impl SecureFieldMirror {
pub fn as_f32(&self) -> f32 {
self.a as f32 / (0x7fff_ffff_u32 as f32)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RoundPolyViz {
pub c0: SecureFieldMirror,
pub c1: SecureFieldMirror,
pub c2: SecureFieldMirror,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RoundPolyDeg3Viz {
pub c0: SecureFieldMirror,
pub c1: SecureFieldMirror,
pub c2: SecureFieldMirror,
pub c3: SecureFieldMirror,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum LayerKind {
MatMul,
Activation,
LayerNorm,
RMSNorm,
Add,
Mul,
Attention,
Embedding,
Dequantize,
Quantize,
Input,
Unknown,
}
impl LayerKind {
pub fn color_rgb(&self) -> [u8; 3] {
match self {
LayerKind::MatMul => [0x42, 0x9b, 0xf5], LayerKind::Activation => [0xf5, 0xa5, 0x42], LayerKind::LayerNorm => [0x4c, 0xc6, 0x71], LayerKind::RMSNorm => [0x38, 0xb2, 0xac], LayerKind::Add => [0xa0, 0xa0, 0xa0], LayerKind::Mul => [0xa8, 0x55, 0xd4], LayerKind::Attention => [0xf5, 0xd0, 0x42], LayerKind::Embedding => [0xec, 0x6e, 0xad], LayerKind::Dequantize => [0xff, 0x8c, 0x00], LayerKind::Quantize => [0xff, 0x4c, 0x4c], LayerKind::Input => [0x80, 0x80, 0xff], LayerKind::Unknown => [0x60, 0x60, 0x60], }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LayerProofKind {
Sumcheck,
LogUp,
Linear,
Skipped,
Deferred,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CircuitNodeMeta {
pub layer_idx: usize,
pub node_id: usize,
pub kind: LayerKind,
pub input_shape: (usize, usize),
pub output_shape: (usize, usize),
pub trace_cost: usize,
pub input_layers: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GpuSnapshot {
pub device_id: usize,
pub device_name: String,
pub utilization: f32,
pub free_memory_bytes: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActivationStats {
pub mean: f32,
pub std_dev: f32,
pub min: f32,
pub max: f32,
pub sparsity: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LogLevel {
Trace,
Debug,
Info,
Warn,
Error,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub enum ProofEvent {
CircuitCompiled {
total_layers: usize,
input_shape: (usize, usize),
output_shape: (usize, usize),
nodes: Vec<CircuitNodeMeta>,
has_simd: bool,
simd_num_blocks: usize,
},
LayerActivation {
layer_idx: usize,
node_id: usize,
kind: LayerKind,
output_shape: (usize, usize),
output_sample: Vec<u32>,
stats: ActivationStats,
},
AttentionHeatmap {
layer_idx: usize,
head_idx: usize,
num_heads: usize,
seq_len: usize,
scores: Vec<f32>,
},
ProofStart {
model_name: Option<String>,
backend: String,
num_layers: usize,
input_shape: (usize, usize),
output_shape: (usize, usize),
},
LayerStart {
layer_idx: usize,
kind: LayerKind,
input_shape: (usize, usize),
output_shape: (usize, usize),
trace_cost: usize,
claim_value_approx: f32,
gpu_device: Option<usize>,
},
SumcheckRound {
layer_idx: usize,
round: usize,
total_rounds: usize,
poly_deg2: Option<RoundPolyViz>,
poly_deg3: Option<RoundPolyDeg3Viz>,
claim_value_approx: f32,
},
LayerEnd {
layer_idx: usize,
kind: LayerProofKind,
final_claim_value_approx: f32,
duration_ms: u64,
rounds_completed: usize,
},
ProofComplete {
duration_ms: u64,
num_layer_proofs: usize,
num_weight_openings: usize,
weight_binding_mode: String,
},
WeightOpeningStart {
weight_node_id: usize,
eval_point_len: usize,
},
WeightOpeningEnd {
weight_node_id: usize,
duration_ms: u64,
commitment_hex: String,
},
AggregatedBindingStart {
num_claims: usize,
num_matrices: usize,
},
AggregatedBindingEnd {
duration_ms: u64,
estimated_calldata_felts: usize,
},
GpuStatus {
devices: Vec<GpuSnapshot>,
matmul_done: usize,
matmul_total: usize,
layers_done: usize,
layers_total: usize,
},
StarkProofStart {
num_activation_layers: usize,
num_add_layers: usize,
num_layernorm_layers: usize,
},
StarkProofEnd {
duration_ms: u64,
},
Log {
level: LogLevel,
message: String,
},
}