Skip to main content

entrenar/merge/ensemble/
config.rs

1//! ENT-032: Ensemble configuration struct
2
3use super::strategy::EnsembleStrategy;
4use super::Model;
5
6/// Configuration for ensemble merging
7#[derive(Clone, Debug, Default)]
8pub struct EnsembleConfig {
9    /// Base model for delta-based methods (TIES, DARE)
10    /// If None, uses first model as base for delta methods
11    pub base: Option<Model>,
12
13    /// Merging strategy
14    pub strategy: EnsembleStrategy,
15}
16
17impl EnsembleConfig {
18    /// Create config for weighted averaging
19    pub fn weighted_average(weights: Vec<f32>) -> Self {
20        Self { base: None, strategy: EnsembleStrategy::WeightedAverage { weights } }
21    }
22
23    /// Create config for uniform averaging
24    pub fn uniform_average() -> Self {
25        Self { base: None, strategy: EnsembleStrategy::WeightedAverage { weights: Vec::new() } }
26    }
27
28    /// Create config for TIES merging
29    pub fn ties(base: Model, density: f32) -> Self {
30        Self { base: Some(base), strategy: EnsembleStrategy::Ties { density } }
31    }
32
33    /// Create config for DARE merging
34    pub fn dare(base: Model, drop_prob: f32, seed: Option<u64>) -> Self {
35        Self { base: Some(base), strategy: EnsembleStrategy::Dare { drop_prob, seed } }
36    }
37
38    /// Create config for iterative SLERP
39    pub fn iterative_slerp(t: f32) -> Self {
40        Self { base: None, strategy: EnsembleStrategy::IterativeSlerp { t } }
41    }
42
43    /// Create config for hierarchical merging
44    pub fn hierarchical(leaf_strategy: EnsembleStrategy) -> Self {
45        Self {
46            base: None,
47            strategy: EnsembleStrategy::Hierarchical { leaf_strategy: Box::new(leaf_strategy) },
48        }
49    }
50
51    /// Set base model for delta-based methods
52    pub fn with_base(mut self, base: Model) -> Self {
53        self.base = Some(base);
54        self
55    }
56}