Skip to main content

light_curve_feature/
feature.rs

1use crate::data::TimeSeries;
2use crate::evaluator::*;
3use crate::extractor::FeatureExtractor;
4use crate::features::*;
5use crate::float_trait::Float;
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    Chi2Pvar,
31    Cusum,
32    Duration,
33    Eta,
34    EtaE,
35    ExcessVariance,
36    InterPercentileRange,
37    Kurtosis,
38    LaflerKinmanStringLength,
39    LinearFit,
40    LinearTrend,
41    LinexpFit,
42    MagnitudePercentageRatio,
43    MaximumSlope,
44    MaximumTimeInterval,
45    MinimumTimeInterval,
46    Mean,
47    MeanVariance,
48    Median,
49    MedianAbsoluteDeviation,
50    MedianBufferRangePercentage(MedianBufferRangePercentage<T>),
51    ObservationCount,
52    OtsuSplit,
53    PercentAmplitude,
54    PercentDifferenceMagnitudePercentile,
55    Periodogram(Periodogram<T, Self>),
56    _PeriodogramPeaks(PeriodogramPeaks),
57    ReducedChi2,
58    Roms,
59    Skew,
60    StandardDeviation,
61    StetsonK,
62    TimeMean,
63    TimeStandardDeviation,
64    Transformed(Transformed<T, Self, Transformer<T>>),
65    VillarFit,
66    WeightedMean,
67}
68
69#[cfg(test)]
70mod tests {
71    use super::*;
72
73    #[test]
74    fn test_feature_partial_eq() {
75        // Test unit struct features
76        let amplitude1: Feature<f64> = Amplitude::default().into();
77        let amplitude2: Feature<f64> = Amplitude::default().into();
78        assert_eq!(amplitude1, amplitude2);
79
80        let mean1: Feature<f64> = Mean::default().into();
81        let mean2: Feature<f64> = Mean::default().into();
82        assert_eq!(mean1, mean2);
83
84        // Test that different features are not equal
85        assert_ne!(amplitude1, mean1);
86
87        // Test parametric features
88        let beyond1: Feature<f64> = BeyondNStd::default().into();
89        let beyond2: Feature<f64> = BeyondNStd::default().into();
90        assert_eq!(beyond1, beyond2);
91
92        let beyond3: Feature<f64> = BeyondNStd::new(2.0).into();
93        assert_ne!(beyond1, beyond3);
94    }
95}