do_memory_mcp/patterns/predictive/
mod.rs1#[allow(clippy::cast_precision_loss)]
7#[allow(clippy::cast_possible_wrap)]
8#[allow(clippy::cast_sign_loss)]
9use anyhow::Result;
10use std::collections::HashMap;
11use tracing::{info, instrument};
12
13pub mod anomaly;
15pub mod causal;
16pub mod dbscan;
17pub mod extraction;
18pub mod forecasting;
19pub mod kdtree;
20
21#[cfg(test)]
22mod dbscan_tests;
23
24pub use anomaly::AnomalyDetector;
26pub use causal::CausalAnalyzer;
27pub use dbscan::{AdaptiveDBSCAN, Cluster, ClusterLabel, DBSCANConfig, StreamingClusters};
28pub use forecasting::{
29 engine::ForecastingEngine,
30 ets_types::{ETSErrorType, ETSSeasonalType, ETSTrendType, SeasonalityResult},
31 types::{ForecastResult, PredictiveConfig, PredictiveMetadata, PredictiveResults},
32};
33pub use kdtree::{KDTree, Point};
34
35pub use anomaly::AnomalyResult;
37pub use causal::{CausalResult, CausalType};
38pub use extraction::{
39 ClusterCharacteristics, ExtractedPattern, ExtractionConfig, PatternExtractor, PatternType,
40};
41
42#[instrument(skip(data))]
44pub fn run_predictive_analysis(
45 data: &HashMap<String, Vec<f64>>,
46 config: PredictiveConfig,
47) -> Result<PredictiveResults> {
48 let start_time = std::time::Instant::now();
49
50 info!("Starting comprehensive predictive analysis");
51
52 let mut forecaster = ForecastingEngine::with_config(config.clone())?;
54 let forecasts = forecaster.forecast(data)?;
55
56 let mut anomaly_detector = AnomalyDetector::with_config(config.clone())?;
58 let anomalies = anomaly_detector.detect_anomalies(data)?;
59
60 let causal_analyzer = CausalAnalyzer::with_config(config.clone())?;
62 let causal_relationships = causal_analyzer.analyze_causality(data)?;
63
64 let duration = start_time.elapsed();
66 let metadata = PredictiveMetadata {
67 variables_analyzed: data.len(),
68 duration_ms: duration.as_millis() as u64,
69 memory_usage: data.values().map(|v| v.len() * 8).sum(),
70 methods_used: vec![
71 "ETS Forecasting".to_string(),
72 "DBSCAN Anomaly Detection".to_string(),
73 "Granger Causality".to_string(),
74 ],
75 };
76
77 let results = PredictiveResults {
78 forecasts,
79 anomalies,
80 causal_relationships,
81 metadata,
82 };
83
84 info!(
85 "Predictive analysis completed in {}ms",
86 results.metadata.duration_ms
87 );
88
89 Ok(results)
90}