use std::collections::BTreeMap;
use std::fmt;
use crate::phase::ExecutionPhase;
use crate::phase::ExecutionStep;
use serde::{Deserialize, Serialize};
pub const SCHEMA: &str = "candle-graph/trace/6";
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TraceRunMeta {
pub run_id: String,
pub correlation_id: String,
pub entrypoint: String,
pub phase: ExecutionPhase,
pub timestamp: String,
pub capture_step: u64,
pub warmup_steps: u64,
pub device: String,
pub timing_mode: TimingMode,
pub tags: BTreeMap<String, String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub candle_version: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TimingMode {
Host,
DeviceSynchronized,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SpanKind {
Function,
Op,
Module,
}
impl fmt::Display for SpanKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Function => write!(f, "function"),
Self::Op => write!(f, "op"),
Self::Module => write!(f, "module"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum GradientState {
Present,
Missing,
Zero,
NonFinite,
}
impl fmt::Display for GradientState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Present => write!(f, "present"),
Self::Missing => write!(f, "missing"),
Self::Zero => write!(f, "zero"),
Self::NonFinite => write!(f, "non_finite"),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct TraceSummary {
pub op_count: usize,
pub total_ns: u64,
pub span_count: usize,
pub root_span_count: usize,
pub max_depth: usize,
pub alloc_count: usize,
pub free_count: usize,
pub peak_bytes: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpanRecord {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_id: Option<String>,
pub name: String,
pub kind: SpanKind,
pub measured: bool,
pub start_ns: u64,
#[serde(default)]
pub closed: bool,
#[serde(default)]
pub duration_ns: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub step: Option<ExecutionStep>,
}