@@ -20,6 +20,7 @@ pub struct EvaluatorInfo {
2020 pub m_required : bool ,
2121 pub w_required : bool ,
2222 pub sorting_required : bool ,
23+ pub variability_required : bool ,
2324}
2425
2526#[ derive( Clone , Debug ) ]
@@ -69,6 +70,11 @@ pub trait EvaluatorInfoTrait {
6970 fn is_sorting_required ( & self ) -> bool {
7071 self . get_info ( ) . sorting_required
7172 }
73+
74+ /// If feature requires magnitude array elements to be different
75+ fn is_variability_required ( & self ) -> bool {
76+ self . get_info ( ) . variability_required
77+ }
7278}
7379
7480// impl<P> EvaluatorInfoTrait for P
@@ -124,8 +130,14 @@ pub trait FeatureEvaluator<T: Float>:
124130 + DeserializeOwned
125131 + JsonSchema
126132{
133+ /// Version of [FeatureEvaluator::eval] which can panic for incorrect input
134+ fn eval_no_ts_check ( & self , ts : & mut TimeSeries < T > ) -> Result < Vec < T > , EvaluatorError > ;
135+
127136 /// Vector of feature values or `EvaluatorError`
128- fn eval ( & self , ts : & mut TimeSeries < T > ) -> Result < Vec < T > , EvaluatorError > ;
137+ fn eval ( & self , ts : & mut TimeSeries < T > ) -> Result < Vec < T > , EvaluatorError > {
138+ self . check_ts ( ts) ?;
139+ self . eval_no_ts_check ( ts)
140+ }
129141
130142 /// Returns vector of feature values and fill invalid components with given value
131143 fn eval_or_fill ( & self , ts : & mut TimeSeries < T > , fill_value : T ) -> Vec < T > {
@@ -135,44 +147,31 @@ pub trait FeatureEvaluator<T: Float>:
135147 }
136148 }
137149
150+ fn check_ts ( & self , ts : & mut TimeSeries < T > ) -> Result < ( ) , EvaluatorError > {
151+ self . check_ts_length ( ts) ?;
152+ self . check_ts_variability ( ts)
153+ }
154+
138155 /// Checks if [TimeSeries] has enough points to evaluate the feature
139- fn check_ts_length ( & self , ts : & TimeSeries < T > ) -> Result < usize , EvaluatorError > {
156+ fn check_ts_length ( & self , ts : & TimeSeries < T > ) -> Result < ( ) , EvaluatorError > {
140157 let length = ts. lenu ( ) ;
141158 if length < self . min_ts_length ( ) {
142159 Err ( EvaluatorError :: ShortTimeSeries {
143160 actual : length,
144161 minimum : self . min_ts_length ( ) ,
145162 } )
146163 } else {
147- Ok ( length )
164+ Ok ( ( ) )
148165 }
149166 }
150- }
151167
152- pub fn get_nonzero_m_std < T : Float > ( ts : & mut TimeSeries < T > ) -> Result < T , EvaluatorError > {
153- let std = ts. m . get_std ( ) ;
154- if std. is_zero ( ) || ts. is_plateau ( ) {
155- Err ( EvaluatorError :: FlatTimeSeries )
156- } else {
157- Ok ( std)
158- }
159- }
160-
161- pub fn get_nonzero_m_std2 < T : Float > ( ts : & mut TimeSeries < T > ) -> Result < T , EvaluatorError > {
162- let std2 = ts. m . get_std2 ( ) ;
163- if std2. is_zero ( ) || ts. is_plateau ( ) {
164- Err ( EvaluatorError :: FlatTimeSeries )
165- } else {
166- Ok ( std2)
167- }
168- }
169-
170- pub fn get_nonzero_reduced_chi2 < T : Float > ( ts : & mut TimeSeries < T > ) -> Result < T , EvaluatorError > {
171- let reduced_chi2 = ts. get_m_reduced_chi2 ( ) ;
172- if reduced_chi2. is_zero ( ) || ts. is_plateau ( ) {
173- Err ( EvaluatorError :: FlatTimeSeries )
174- } else {
175- Ok ( reduced_chi2)
168+ /// Checks if [TimeSeries] meets variability requirement
169+ fn check_ts_variability ( & self , ts : & mut TimeSeries < T > ) -> Result < ( ) , EvaluatorError > {
170+ if self . is_variability_required ( ) && ts. is_plateau ( ) {
171+ Err ( EvaluatorError :: FlatTimeSeries )
172+ } else {
173+ Ok ( ( ) )
174+ }
176175 }
177176}
178177
0 commit comments