capability_grower_configuration_comparison/
compare_partial_subbranch_probability.rs1crate::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}