Skip to main content

light_curve_feature/
feature.rs

1use crate::evaluator::*;
2use crate::extractor::FeatureExtractor;
3use crate::features::*;
4use crate::float_trait::Float;
5use crate::time_series::TimeSeries;
6use crate::transformers::Transformer;
7
8use enum_dispatch::enum_dispatch;
9use std::fmt::Debug;
10
11/// All features are available as variants of this enum
12///
13/// Consider to import [crate::FeatureEvaluator] as well
14#[enum_dispatch(FeatureEvaluator<T>, FeatureNamesDescriptionsTrait, EvaluatorInfoTrait)]
15#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, PartialEq)]
16#[serde(bound = "T: Float")]
17#[non_exhaustive]
18pub enum Feature<T>
19where
20    T: Float,
21{
22    // extractor
23    FeatureExtractor(FeatureExtractor<T, Self>),
24    // features
25    Amplitude,
26    AndersonDarlingNormal,
27    Bins(Bins<T, Self>),
28    BazinFit,
29    BeyondNStd(BeyondNStd<T>),
30    Cusum,
31    Duration,
32    Eta,
33    EtaE,
34    ExcessVariance,
35    InterPercentileRange,
36    Kurtosis,
37    LinearFit,
38    LinearTrend,
39    LinexpFit,
40    MagnitudePercentageRatio,
41    MaximumSlope,
42    MaximumTimeInterval,
43    MinimumTimeInterval,
44    Mean,
45    MeanVariance,
46    Median,
47    MedianAbsoluteDeviation,
48    MedianBufferRangePercentage(MedianBufferRangePercentage<T>),
49    ObservationCount,
50    OtsuSplit,
51    PercentAmplitude,
52    PercentDifferenceMagnitudePercentile,
53    Periodogram(Periodogram<T, Self>),
54    _PeriodogramPeaks,
55    ReducedChi2,
56    Roms,
57    Skew,
58    StandardDeviation,
59    StetsonK,
60    TimeMean,
61    TimeStandardDeviation,
62    Transformed(Transformed<T, Self, Transformer<T>>),
63    VillarFit,
64    WeightedMean,
65}
66
67#[cfg(test)]
68mod tests {
69    use super::*;
70
71    #[test]
72    fn test_feature_partial_eq() {
73        // Test unit struct features
74        let amplitude1: Feature<f64> = Amplitude::default().into();
75        let amplitude2: Feature<f64> = Amplitude::default().into();
76        assert_eq!(amplitude1, amplitude2);
77
78        let mean1: Feature<f64> = Mean::default().into();
79        let mean2: Feature<f64> = Mean::default().into();
80        assert_eq!(mean1, mean2);
81
82        // Test that different features are not equal
83        assert_ne!(amplitude1, mean1);
84
85        // Test parametric features
86        let beyond1: Feature<f64> = BeyondNStd::default().into();
87        let beyond2: Feature<f64> = BeyondNStd::default().into();
88        assert_eq!(beyond1, beyond2);
89
90        let beyond3: Feature<f64> = BeyondNStd::new(2.0).into();
91        assert_ne!(beyond1, beyond3);
92    }
93}