atelier_data 0.0.15

Data Artifacts and I/O for the atelier-rs engine
use serde::Deserialize;

#[derive(Debug, Deserialize, Clone)]
pub enum Models {
    Uniform,
    GBM,
    Hawkes,
    GD,
}

#[derive(Debug, Deserialize, Clone)]
pub struct ModelConfig {
    pub id: Option<String>,
    pub label: Option<Models>,
    pub description: Option<String>,
    pub params_labels: Option<Vec<String>>,
    pub params_values: Option<Vec<f64>>,
    pub seed: Option<u64>,
}

impl ModelConfig {
    pub fn builder() -> ModelConfigBuilder {
        ModelConfigBuilder::new()
    }
}

#[derive(Debug, Deserialize, Clone, Default)]
pub struct ModelConfigBuilder {
    pub id: Option<String>,
    pub label: Option<Models>,
    pub description: Option<String>,
    pub params_labels: Option<Vec<String>>,
    pub params_values: Option<Vec<f64>>,
    pub seed: Option<u64>,
}

impl ModelConfigBuilder {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn id(mut self, id: String) -> Self {
        self.id = Some(id);
        self
    }

    pub fn label(mut self, label: Models) -> Self {
        self.label = Some(label);
        self
    }

    pub fn description(mut self, description: String) -> Self {
        self.description = Some(description);
        self
    }

    pub fn params_labels(mut self, params_labels: Vec<String>) -> Self {
        self.params_labels = Some(params_labels);
        self
    }

    pub fn params_values(mut self, params_values: Vec<f64>) -> Self {
        self.params_values = Some(params_values);
        self
    }

    pub fn build(self) -> Result<ModelConfig, &'static str> {
        let id = self.id.ok_or("Missing Model's id")?;
        let label = self.label.ok_or("Missing Model's label")?;
        let description = self.description.ok_or("Missing Model's description")?;
        let params_labels = self.params_labels.ok_or("Missing Model's params_labels")?;
        let params_values = self.params_values.ok_or("Missing Model's params_values")?;

        Ok(ModelConfig {
            id: Some(id),
            label: Some(label),
            description: Some(description),
            params_labels: Some(params_labels),
            params_values: Some(params_values),
            seed: self.seed,
        })
    }
}