scirs2_integrate/analysis/ml_prediction/
features.rs

1//! Feature Extraction for Bifurcation Prediction
2//!
3//! This module contains feature extraction configurations for time series,
4//! phase space, frequency domain, topological, and statistical features.
5
6/// Feature extraction configuration
7#[derive(Debug, Clone)]
8pub struct FeatureExtraction {
9    /// Time series features
10    pub time_series_features: TimeSeriesFeatures,
11    /// Phase space features
12    pub phase_space_features: PhaseSpaceFeatures,
13    /// Frequency domain features
14    pub frequency_features: FrequencyFeatures,
15    /// Topological features
16    pub topological_features: TopologicalFeatures,
17    /// Statistical features
18    pub statistical_features: StatisticalFeatures,
19    /// Feature normalization method
20    pub normalization: FeatureNormalization,
21}
22
23/// Time series feature extraction
24#[derive(Debug, Clone)]
25pub struct TimeSeriesFeatures {
26    /// Window size for feature extraction
27    pub window_size: usize,
28    /// Overlap between windows
29    pub overlap: f64,
30    /// Extract trend features
31    pub trend_features: bool,
32    /// Extract seasonality features
33    pub seasonality_features: bool,
34    /// Extract autocorrelation features
35    pub autocorr_features: bool,
36    /// Maximum lag for autocorrelation
37    pub max_lag: usize,
38    /// Extract change point features
39    pub change_point_features: bool,
40}
41
42/// Phase space feature extraction
43#[derive(Debug, Clone)]
44pub struct PhaseSpaceFeatures {
45    /// Embedding dimension
46    pub embedding_dim: usize,
47    /// Time delay for embedding
48    pub time_delay: usize,
49    /// Extract attractor features
50    pub attractor_features: bool,
51    /// Extract recurrence features
52    pub recurrence_features: bool,
53    /// Recurrence threshold
54    pub recurrence_threshold: f64,
55    /// Extract Poincaré map features
56    pub poincare_features: bool,
57}
58
59/// Frequency domain features
60#[derive(Debug, Clone)]
61pub struct FrequencyFeatures {
62    /// Extract power spectral density features
63    pub psd_features: bool,
64    /// Number of frequency bins
65    pub frequency_bins: usize,
66    /// Extract dominant frequency features
67    pub dominant_freq_features: bool,
68    /// Extract spectral entropy
69    pub spectral_entropy: bool,
70    /// Extract wavelet features
71    pub wavelet_features: bool,
72    /// Wavelet type
73    pub wavelet_type: WaveletType,
74}
75
76/// Wavelet types for feature extraction
77#[derive(Debug, Clone, Copy)]
78pub enum WaveletType {
79    Daubechies(usize),
80    Morlet,
81    Mexican,
82    Gabor,
83}
84
85/// Topological feature extraction
86#[derive(Debug, Clone)]
87pub struct TopologicalFeatures {
88    /// Extract persistent homology features
89    pub persistent_homology: bool,
90    /// Maximum persistence dimension
91    pub max_dimension: usize,
92    /// Extract Betti numbers
93    pub betti_numbers: bool,
94    /// Extract topological complexity measures
95    pub complexity_measures: bool,
96}
97
98/// Statistical feature extraction
99#[derive(Debug, Clone)]
100pub struct StatisticalFeatures {
101    /// Extract moment-based features
102    pub moments: bool,
103    /// Extract quantile features
104    pub quantiles: bool,
105    /// Quantile levels to extract
106    pub quantile_levels: Vec<f64>,
107    /// Extract distribution shape features
108    pub distributionshape: bool,
109    /// Extract correlation features
110    pub correlation_features: bool,
111    /// Extract entropy measures
112    pub entropy_measures: bool,
113}
114
115/// Feature normalization methods
116#[derive(Debug, Clone, Copy)]
117pub enum FeatureNormalization {
118    /// No normalization
119    None,
120    /// Z-score normalization
121    ZScore,
122    /// Min-max scaling
123    MinMax,
124    /// Robust scaling (median and IQR)
125    Robust,
126    /// Quantile uniform transformation
127    QuantileUniform,
128    /// Power transformation (Box-Cox)
129    PowerTransform,
130}
131
132impl Default for FeatureExtraction {
133    fn default() -> Self {
134        Self {
135            time_series_features: TimeSeriesFeatures::default(),
136            phase_space_features: PhaseSpaceFeatures::default(),
137            frequency_features: FrequencyFeatures::default(),
138            topological_features: TopologicalFeatures::default(),
139            statistical_features: StatisticalFeatures::default(),
140            normalization: FeatureNormalization::ZScore,
141        }
142    }
143}
144
145impl Default for TimeSeriesFeatures {
146    fn default() -> Self {
147        Self {
148            window_size: 100,
149            overlap: 0.5,
150            trend_features: true,
151            seasonality_features: true,
152            autocorr_features: true,
153            max_lag: 20,
154            change_point_features: false,
155        }
156    }
157}
158
159impl Default for PhaseSpaceFeatures {
160    fn default() -> Self {
161        Self {
162            embedding_dim: 3,
163            time_delay: 1,
164            attractor_features: true,
165            recurrence_features: false,
166            recurrence_threshold: 0.1,
167            poincare_features: false,
168        }
169    }
170}
171
172impl Default for FrequencyFeatures {
173    fn default() -> Self {
174        Self {
175            psd_features: true,
176            frequency_bins: 64,
177            dominant_freq_features: true,
178            spectral_entropy: false,
179            wavelet_features: false,
180            wavelet_type: WaveletType::Daubechies(4),
181        }
182    }
183}
184
185impl Default for TopologicalFeatures {
186    fn default() -> Self {
187        Self {
188            persistent_homology: false,
189            max_dimension: 2,
190            betti_numbers: false,
191            complexity_measures: false,
192        }
193    }
194}
195
196impl Default for StatisticalFeatures {
197    fn default() -> Self {
198        Self {
199            moments: true,
200            quantiles: true,
201            quantile_levels: vec![0.25, 0.5, 0.75],
202            distributionshape: true,
203            correlation_features: false,
204            entropy_measures: false,
205        }
206    }
207}