Skip to main content

sciforge_hub/engine/experience/
runner.rs

1//! Experiment runner.
2//!
3//! [`ExperimentRunner`] takes an [`Experiment`], dispatches it to the
4//! correct domain handler, and returns a [`RunOutput`] variant (scalar,
5//! vector, matrix, text, …).
6
7use super::experiment::Experiment;
8use crate::domain::common::errors::HubResult;
9
10/// Typed output of an experiment execution.
11#[derive(Debug, Clone)]
12pub enum RunOutput {
13    Scalar(f64),
14    Vector(Vec<f64>),
15    Pair(f64, f64),
16    Triple(f64, f64, f64),
17    Matrix(Vec<Vec<f64>>),
18    Boolean(bool),
19    Text(String),
20    Complex(f64, f64),
21    ComplexVector(Vec<(f64, f64)>),
22    ComplexMatrix(Vec<Vec<(f64, f64)>>),
23    PolynomialOut(Vec<f64>),
24    TensorOut {
25        data: Vec<f64>,
26        shape: Vec<usize>,
27    },
28    SparseOut {
29        rows: usize,
30        cols: usize,
31        row_ptr: Vec<usize>,
32        col_idx: Vec<usize>,
33        values: Vec<f64>,
34    },
35    Integer(i64),
36    IntVector(Vec<i64>),
37    PairVec(Vec<(f64, f64)>),
38    TimeSeries {
39        times: Vec<f64>,
40        values: Vec<f64>,
41    },
42}
43
44/// Dispatches experiments to domain handlers and returns results.
45pub struct ExperimentRunner;
46
47impl Default for ExperimentRunner {
48    fn default() -> Self {
49        Self
50    }
51}
52
53impl ExperimentRunner {
54    /// Creates a new runner.
55    pub fn new() -> Self {
56        Self
57    }
58
59    /// Runs the experiment and returns the typed output.
60    pub fn run(&self, experiment: &Experiment) -> HubResult<RunOutput> {
61        crate::engine::dispatch::dispatch(experiment)
62    }
63}