use super::session::{CodeCell, EntrenarSession};
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct RuchySession {
pub session_id: String,
pub title: String,
pub username: Option<String>,
pub start_time: chrono::DateTime<chrono::Utc>,
pub end_time: Option<chrono::DateTime<chrono::Utc>>,
pub kernel: Option<String>,
pub cells: Vec<RuchyCell>,
pub variables: HashMap<String, String>,
pub training_runs: Vec<TrainingRun>,
}
#[derive(Debug, Clone)]
pub struct RuchyCell {
pub id: String,
pub cell_type: String,
pub source: String,
pub outputs: Vec<String>,
pub execution_count: Option<u32>,
pub executed_at: Option<chrono::DateTime<chrono::Utc>>,
}
#[derive(Debug, Clone)]
pub struct TrainingRun {
pub run_id: String,
pub model: String,
pub dataset: Option<String>,
pub epochs: u32,
pub losses: Vec<f64>,
pub metrics: HashMap<String, Vec<f64>>,
}
impl From<RuchySession> for EntrenarSession {
fn from(ruchy: RuchySession) -> Self {
let mut session = EntrenarSession::new(&ruchy.session_id, &ruchy.title);
session.user = ruchy.username;
session.created_at = ruchy.start_time;
session.ended_at = ruchy.end_time;
session.model_architecture = ruchy.kernel;
for cell in ruchy.cells {
if cell.cell_type == "code" {
let code_cell = CodeCell {
execution_order: cell.execution_count.unwrap_or(0),
source: cell.source,
output: cell.outputs.first().cloned(),
timestamp: cell.executed_at.unwrap_or(ruchy.start_time),
duration_ms: None,
};
session.code_history.push(code_cell);
}
}
for run in ruchy.training_runs {
for loss in run.losses {
session.metrics.add_loss(loss);
}
for (name, values) in run.metrics {
for value in values {
session.metrics.add_custom(&name, value);
}
}
if session.dataset_id.is_none() {
session.dataset_id = run.dataset;
}
}
session.config = ruchy.variables;
session
}
}