diff --git a/server/src/services/analytic_service/pattern_detector.rs b/server/src/services/analytic_service/pattern_detector.rs index 1fd30ed..c9e522d 100644 --- a/server/src/services/analytic_service/pattern_detector.rs +++ b/server/src/services/analytic_service/pattern_detector.rs @@ -59,41 +59,47 @@ impl PatternDetector { let mut results = Vec::new(); // let mut i = 0; - // let m = &self.learning_results.model; - - // // TODO: here we ignoring gaps in data - // while i < ts.len() - self.learning_results.model.len() { - // let mut backet = Vec::::new(); - - // for j in 0..m.len() { - // backet.push(nan_to_zero(ts[j + i].1)); - // } - - // let c = PatternDetector::corr_aligned(&backet, &m); - - // if c >= CORR_THRESHOLD { - // let from = ts[i].0; - // let to = ts[i + backet.len() - 1].0; - // results.push((from, to)); - // } - - // i += m.len(); - // } let pt = &self.learning_results.patterns; + let apt = &self.learning_results.anti_patterns; + for i in 0..ts.len() { + + let mut pattern_match_score = 0f64; + let mut pattern_match_len = 0usize; + let mut anti_pattern_match_score = 0f64; + for p in pt { if i + p.len() < ts.len() { let mut backet = Vec::::new(); for j in 0..p.len() { backet.push(nan_to_zero(ts[i + j].1)); } - if PatternDetector::corr_aligned(p, &backet) >= CORR_THRESHOLD { - results.push((ts[i].0, ts[i + p.len() - 1].0)); + let score = PatternDetector::corr_aligned(p, &backet); + if score > pattern_match_score { + pattern_match_score = score; + pattern_match_len = p.len(); + } + } + } + + for p in apt { + if i + p.len() < ts.len() { + let mut backet = Vec::::new(); + for j in 0..p.len() { + backet.push(nan_to_zero(ts[i + j].1)); + } + let score = PatternDetector::corr_aligned(p, &backet); + if score > anti_pattern_match_score { + anti_pattern_match_score = score; } } } + + if pattern_match_score > anti_pattern_match_score && pattern_match_score >= CORR_THRESHOLD { + results.push((ts[i].0, ts[i + pattern_match_len - 1].0)); + } } return results;