use std::collections::HashMap;
use std::time::{Instant, SystemTime};
use crate::error::Result;
use super::{CounterValue, ProfilingConfig};
pub struct TimelineProfiler<T> {
sessions: HashMap<String, TimelineSession>,
timeline_data: Vec<TimelineEntry>,
_phantom: std::marker::PhantomData<T>,
}
#[derive(Debug)]
pub struct TimelineSession {
pub id: String,
pub start_time: Instant,
pub operations: HashMap<String, OperationTimeline>,
pub metadata: TimelineMetadata,
}
#[derive(Debug)]
pub struct OperationTimeline {
pub operation_id: String,
pub start_time: Instant,
pub end_time: Option<Instant>,
pub events: Vec<TimelineEvent>,
pub resource_usage: Vec<ResourceUsagePoint>,
}
#[derive(Debug)]
pub struct TimelineEvent {
pub timestamp: Instant,
pub description: String,
pub data: HashMap<String, String>,
}
#[derive(Debug)]
pub struct ResourceUsagePoint {
pub timestamp: Instant,
pub cpu_utilization: f64,
pub memory_usage: usize,
pub tpu_utilization: f64,
pub power_consumption: f64,
}
#[derive(Debug)]
pub struct TimelineEntry {
pub timestamp: Instant,
pub entry_type: TimelineEntryType,
pub operation_id: Option<String>,
pub data: TimelineEntryData,
}
#[derive(Debug)]
pub enum TimelineEntryType {
OperationStart,
OperationEnd,
ResourceAllocation,
MemoryEvent,
CounterEvent,
}
#[derive(Debug)]
pub enum TimelineEntryData {
Operation(OperationTimelineData),
Resource(ResourceTimelineData),
Memory(MemoryTimelineData),
Counter(CounterTimelineData),
}
#[derive(Debug)]
pub struct OperationTimelineData {
pub name: String,
pub input_sizes: Vec<usize>,
pub output_sizes: Vec<usize>,
pub compute_intensity: f64,
}
#[derive(Debug)]
pub struct ResourceTimelineData {
pub resource_type: String,
pub amount: usize,
pub utilization: f64,
}
#[derive(Debug)]
pub struct MemoryTimelineData {
pub operation_type: String,
pub address: usize,
pub size: usize,
}
#[derive(Debug)]
pub struct CounterTimelineData {
pub counter_name: String,
pub value: CounterValue,
pub delta: Option<f64>,
}
#[derive(Debug, Default)]
pub struct TimelineMetadata {
pub session_name: String,
pub start_time: Option<SystemTime>,
pub end_time: Option<SystemTime>,
pub total_operations: usize,
}
#[derive(Debug)]
pub struct TimelineConfig {
pub detailed_operations: bool,
pub include_resources: bool,
pub resolution_us: u64,
pub max_entries: usize,
}
impl<T> TimelineProfiler<T> {
pub fn new(_config: &ProfilingConfig) -> Self {
Self {
sessions: HashMap::new(),
timeline_data: Vec::new(),
_phantom: std::marker::PhantomData,
}
}
pub fn start_timeline(&mut self, session_id: &str) -> Result<()> {
let session = TimelineSession {
id: session_id.to_string(),
start_time: Instant::now(),
operations: HashMap::new(),
metadata: TimelineMetadata::default(),
};
self.sessions.insert(session_id.to_string(), session);
Ok(())
}
pub fn reset(&mut self) {
self.sessions.clear();
self.timeline_data.clear();
}
}