1use serde::{Deserialize, Serialize};
2
3pub const DEFAULT_MODEL_TERMS: [i32; 3] = [1, 2, 10];
5pub const DEFAULT_MODEL_DIMENSION: u32 = 4;
6pub const DEFAULT_POLYNOMIAL_ORDER: u32 = 4;
7pub const DEFAULT_NUM_TAU: u32 = 2;
8pub const DEFAULT_WINDOW_LENGTH: u32 = 200;
9pub const DEFAULT_WINDOW_STEP: u32 = 100;
10pub const DEFAULT_DELAYS: [i32; 2] = [7, 10];
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct TimeRange {
15 pub start: f64,
16 pub end: f64,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct PreprocessingOptions {
23 pub highpass: Option<f64>,
24 pub lowpass: Option<f64>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct AlgorithmSelection {
30 pub enabled_variants: Vec<String>,
31 #[serde(skip_serializing_if = "Option::is_none")]
40 pub select_mask: Option<String>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct WindowParameters {
46 pub window_length: u32,
47 pub window_step: u32,
48 #[serde(skip_serializing_if = "Option::is_none")]
50 pub ct_window_length: Option<u32>,
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub ct_window_step: Option<u32>,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct DelayParameters {
60 pub delays: Vec<i32>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct ModelParameters {
68 pub dm: u32, pub order: u32, pub nr_tau: u32, }
72
73#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
75#[serde(rename_all = "snake_case")]
76pub enum CcdConditioningStrategy {
77 AllSelected,
79 AutoTargetSparse,
81 AutoSharedParents,
83 AutoGroupOmp,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct VariantChannelConfig {
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub selected_channels: Option<Vec<usize>>,
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub ct_channel_pairs: Option<Vec<[usize; 2]>>,
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub cd_channel_pairs: Option<Vec<[usize; 2]>>,
99 #[serde(skip_serializing_if = "Option::is_none")]
102 pub conditioning_channels: Option<Vec<usize>>,
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub conditioning_strategy: Option<CcdConditioningStrategy>,
106 #[serde(skip_serializing_if = "Option::is_none")]
108 pub surrogate_shifts: Option<Vec<usize>>,
109 #[serde(skip_serializing_if = "Option::is_none")]
111 pub temporal_lambda: Option<f64>,
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub max_active_sources: Option<usize>,
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct DDARequest {
120 pub file_path: String,
121 #[serde(alias = "channel_list")]
122 pub channels: Option<Vec<usize>>, pub time_range: TimeRange,
124 pub preprocessing_options: PreprocessingOptions,
125 pub algorithm_selection: AlgorithmSelection,
126 pub window_parameters: WindowParameters,
127 pub delay_parameters: DelayParameters,
128 #[serde(skip_serializing_if = "Option::is_none")]
131 pub ct_channel_pairs: Option<Vec<[usize; 2]>>,
132 #[serde(skip_serializing_if = "Option::is_none")]
136 pub cd_channel_pairs: Option<Vec<[usize; 2]>>,
137 #[serde(skip_serializing_if = "Option::is_none")]
140 pub model_parameters: Option<ModelParameters>,
141 #[serde(
144 default,
145 skip_serializing_if = "Option::is_none",
146 alias = "model_params",
147 alias = "model_encoding",
148 alias = "model"
149 )]
150 pub model_terms: Option<Vec<i32>>,
151 #[serde(skip_serializing_if = "Option::is_none")]
154 pub variant_configs: Option<std::collections::HashMap<String, VariantChannelConfig>>,
155 #[serde(skip_serializing_if = "Option::is_none")]
158 pub sampling_rate: Option<f64>,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize)]
163pub struct VariantResult {
164 pub variant_id: String, pub variant_name: String, pub q_matrix: Vec<Vec<f64>>, #[serde(skip_serializing_if = "Option::is_none")]
168 pub channel_labels: Option<Vec<String>>, #[serde(skip_serializing_if = "Option::is_none")]
170 pub error_values: Option<Vec<f64>>, }
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
175pub struct DDAResult {
176 pub id: String,
177 pub file_path: String,
178 pub channels: Vec<String>,
179 pub q_matrix: Vec<Vec<f64>>, pub variant_results: Option<Vec<VariantResult>>, pub raw_output: Option<String>, pub window_parameters: WindowParameters,
183 pub delay_parameters: DelayParameters,
184 pub created_at: String,
185 #[serde(skip_serializing_if = "Option::is_none")]
186 pub error_values: Option<Vec<f64>>, }
188
189impl DDAResult {
190 pub fn new(
191 id: String,
192 file_path: String,
193 channels: Vec<String>,
194 q_matrix: Vec<Vec<f64>>,
195 window_parameters: WindowParameters,
196 delay_parameters: DelayParameters,
197 ) -> Self {
198 Self {
199 id,
200 file_path,
201 channels,
202 q_matrix,
203 variant_results: None,
204 raw_output: None,
205 window_parameters,
206 delay_parameters,
207 created_at: chrono::Utc::now().to_rfc3339(),
208 error_values: None,
209 }
210 }
211
212 pub fn with_raw_output(mut self, raw_output: String) -> Self {
213 self.raw_output = Some(raw_output);
214 self
215 }
216
217 pub fn with_variant_results(mut self, variant_results: Vec<VariantResult>) -> Self {
218 self.variant_results = Some(variant_results);
219 self
220 }
221
222 pub fn with_error_values(mut self, error_values: Vec<f64>) -> Self {
223 self.error_values = Some(error_values);
224 self
225 }
226}