quantrs2_device/quantum_ml_integration/
simplemlanomalydetector_traits.rs

1//! # SimpleMLAnomalyDetector - Trait Implementations
2//!
3//! This module contains trait implementations for `SimpleMLAnomalyDetector`.
4//!
5//! ## Implemented Traits
6//!
7//! - `AnomalyDetector`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10
11// Import types from sibling modules
12use super::types::*;
13// Merged into super::types
14// Merged into super::types
15// Import traits from functions module
16use super::functions::AnomalyDetector;
17
18use std::time::Instant;
19
20impl AnomalyDetector for SimpleMLAnomalyDetector {
21    fn detect(&self, data: &[(Instant, f64)]) -> Vec<DetectedAnomaly> {
22        if data.len() < 3 {
23            return Vec::new();
24        }
25        let values: Vec<f64> = data.iter().map(|(_, v)| *v).collect();
26        let mean = values.iter().sum::<f64>() / values.len() as f64;
27        let variance =
28            values.iter().map(|x| (x - mean).powi(2)).sum::<f64>() / (values.len() - 1) as f64;
29        let std_dev = variance.sqrt();
30        data.iter()
31            .enumerate()
32            .filter_map(|(i, &(timestamp, value))| {
33                if (value - mean).abs() > self.threshold * std_dev {
34                    Some(DetectedAnomaly {
35                        anomaly_type: AnomalyType::PerformanceDegradation,
36                        severity: (value - mean).abs() / std_dev,
37                        description: format!(
38                            "Value {value} deviates significantly from mean {mean}"
39                        ),
40                        timestamp,
41                        affected_metrics: vec!["performance".to_string()],
42                    })
43                } else {
44                    None
45                }
46            })
47            .collect()
48    }
49    fn update(&mut self, _data: &[(Instant, f64)]) {}
50    fn threshold(&self) -> f64 {
51        self.threshold
52    }
53    fn set_threshold(&mut self, threshold: f64) {
54        self.threshold = threshold;
55    }
56}