use serde::{Deserialize, Serialize};
pub const DEFAULT_MODEL_TERMS: [i32; 3] = [1, 2, 10];
pub const DEFAULT_MODEL_DIMENSION: u32 = 4;
pub const DEFAULT_POLYNOMIAL_ORDER: u32 = 4;
pub const DEFAULT_NUM_TAU: u32 = 2;
pub const DEFAULT_WINDOW_LENGTH: u32 = 200;
pub const DEFAULT_WINDOW_STEP: u32 = 100;
pub const DEFAULT_DELAYS: [i32; 2] = [7, 10];
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeRange {
pub start: f64,
pub end: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PreprocessingOptions {
pub highpass: Option<f64>,
pub lowpass: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlgorithmSelection {
pub enabled_variants: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub select_mask: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WindowParameters {
pub window_length: u32,
pub window_step: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub ct_window_length: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ct_window_step: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DelayParameters {
pub delays: Vec<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelParameters {
pub dm: u32, pub order: u32, pub nr_tau: u32, }
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum CcdConditioningStrategy {
AllSelected,
AutoTargetSparse,
AutoSharedParents,
AutoGroupOmp,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VariantChannelConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub selected_channels: Option<Vec<usize>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ct_channel_pairs: Option<Vec<[usize; 2]>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cd_channel_pairs: Option<Vec<[usize; 2]>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub conditioning_channels: Option<Vec<usize>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub conditioning_strategy: Option<CcdConditioningStrategy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub surrogate_shifts: Option<Vec<usize>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temporal_lambda: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_active_sources: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DDARequest {
pub file_path: String,
#[serde(alias = "channel_list")]
pub channels: Option<Vec<usize>>, pub time_range: TimeRange,
pub preprocessing_options: PreprocessingOptions,
pub algorithm_selection: AlgorithmSelection,
pub window_parameters: WindowParameters,
pub delay_parameters: DelayParameters,
#[serde(skip_serializing_if = "Option::is_none")]
pub ct_channel_pairs: Option<Vec<[usize; 2]>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cd_channel_pairs: Option<Vec<[usize; 2]>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model_parameters: Option<ModelParameters>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "model_params",
alias = "model_encoding",
alias = "model"
)]
pub model_terms: Option<Vec<i32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub variant_configs: Option<std::collections::HashMap<String, VariantChannelConfig>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling_rate: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VariantResult {
pub variant_id: String, pub variant_name: String, pub q_matrix: Vec<Vec<f64>>, #[serde(skip_serializing_if = "Option::is_none")]
pub channel_labels: Option<Vec<String>>, #[serde(skip_serializing_if = "Option::is_none")]
pub error_values: Option<Vec<f64>>, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DDAResult {
pub id: String,
pub file_path: String,
pub channels: Vec<String>,
pub q_matrix: Vec<Vec<f64>>, pub variant_results: Option<Vec<VariantResult>>, pub raw_output: Option<String>, pub window_parameters: WindowParameters,
pub delay_parameters: DelayParameters,
pub created_at: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_values: Option<Vec<f64>>, }
impl DDAResult {
pub fn new(
id: String,
file_path: String,
channels: Vec<String>,
q_matrix: Vec<Vec<f64>>,
window_parameters: WindowParameters,
delay_parameters: DelayParameters,
) -> Self {
Self {
id,
file_path,
channels,
q_matrix,
variant_results: None,
raw_output: None,
window_parameters,
delay_parameters,
created_at: chrono::Utc::now().to_rfc3339(),
error_values: None,
}
}
pub fn with_raw_output(mut self, raw_output: String) -> Self {
self.raw_output = Some(raw_output);
self
}
pub fn with_variant_results(mut self, variant_results: Vec<VariantResult>) -> Self {
self.variant_results = Some(variant_results);
self
}
pub fn with_error_values(mut self, error_values: Vec<f64>) -> Self {
self.error_values = Some(error_values);
self
}
}