quantwave_core/regimes/
ensemble.rs1use crate::regimes::MarketRegime;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct RegimeEnsemble {
12 pub weights: Vec<f64>,
13}
14
15impl RegimeEnsemble {
16 pub fn new(weights: Vec<f64>) -> Self {
17 Self { weights }
18 }
19
20 pub fn vote(&self, regimes: &[MarketRegime]) -> MarketRegime {
25 if regimes.is_empty() {
26 return MarketRegime::Steady;
27 }
28
29 let mut scores: std::collections::HashMap<MarketRegime, f64> =
30 std::collections::HashMap::new();
31
32 for (i, ®ime) in regimes.iter().enumerate() {
33 let weight = self.weights.get(i).unwrap_or(&1.0);
34 *scores.entry(regime).or_insert(0.0) += weight;
35 }
36
37 scores
39 .into_iter()
40 .max_by(|a, b| a.1.partial_cmp(&b.1).unwrap_or(std::cmp::Ordering::Equal))
41 .map(|(regime, _)| regime)
42 .unwrap_or(MarketRegime::Steady)
43 }
44}