capability_grower_configuration_comparison/
compare_partial_subbranch_probability.rs

1// ---------------- [ File: capability-grower-configuration-comparison/src/compare_partial_subbranch_probability.rs ]
2crate::ix!();
3
4pub trait ComparePartialSubbranchProbability {
5    fn compare_partial_subbranch_probability(&self, other: &GrowerTreeConfiguration) -> CompareOutcome;
6}
7
8impl ComparePartialSubbranchProbability for GrowerTreeConfiguration {
9    fn compare_partial_subbranch_probability(&self, other: &GrowerTreeConfiguration) -> CompareOutcome {
10        let diff = (self.partial_subbranch_probability() - other.partial_subbranch_probability()).abs();
11        if diff < 0.01 {
12            CompareOutcome::Exact
13        } else if diff < 0.3 {
14            CompareOutcome::Partial(1.0 - diff)
15        } else {
16            CompareOutcome::Incompatible
17        }
18    }
19}
20
21#[cfg(test)]
22mod compare_partial_subbranch_probability_tests {
23    use super::*;
24
25    #[traced_test]
26    fn exact() {
27        let a = GrowerTreeConfiguration::default()
28            .to_builder().partial_subbranch_probability(0.5).build().unwrap();
29        let b = a.clone();
30        assert_eq!(a.compare_partial_subbranch_probability(&b), CompareOutcome::Exact);
31    }
32
33    #[traced_test]
34    fn partial() {
35        let a = GrowerTreeConfiguration::default()
36            .to_builder().partial_subbranch_probability(0.4).build().unwrap();
37        let b = a.to_builder().partial_subbranch_probability(0.55).build().unwrap();
38        match a.compare_partial_subbranch_probability(&b) {
39            CompareOutcome::Partial(_) => {},
40            other => panic!("expected partial, got {:?}", other),
41        }
42    }
43
44    #[traced_test]
45    fn incompatible() {
46        let a = GrowerTreeConfiguration::default()
47            .to_builder().partial_subbranch_probability(0.0).build().unwrap();
48        let b = a.to_builder().partial_subbranch_probability(1.0).build().unwrap();
49        assert_eq!(a.compare_partial_subbranch_probability(&b), CompareOutcome::Incompatible);
50    }
51}