capability_grower_configuration_comparison/
compare_aggregator_preference.rs1crate::ix!();
3
4pub trait CompareAggregatorPreference {
5 fn compare_aggregator_preference(&self, other: &GrowerTreeConfiguration) -> CompareOutcome;
6}
7
8impl CompareAggregatorPreference for GrowerTreeConfiguration {
9 fn compare_aggregator_preference(&self, other: &GrowerTreeConfiguration) -> CompareOutcome {
10 let diff = (self.aggregator_preference() - other.aggregator_preference()).abs();
11 if diff < 0.01 {
12 CompareOutcome::Exact
13 } else if diff < 0.2 {
14 CompareOutcome::Partial(1.0 - diff)
15 } else {
16 CompareOutcome::Incompatible
17 }
18 }
19}
20
21#[cfg(test)]
22mod compare_aggregator_preference_tests {
23 use super::*;
24
25 #[traced_test]
26 fn exact_match() {
27 let a = GrowerTreeConfiguration::default()
28 .to_builder().aggregator_preference(0.5).build().unwrap();
29 let b = a.clone();
30 assert_eq!(a.compare_aggregator_preference(&b), CompareOutcome::Exact);
31 }
32
33 #[traced_test]
34 fn partial() {
35 let a = GrowerTreeConfiguration::default()
36 .to_builder().aggregator_preference(0.3).build().unwrap();
37 let b = a.to_builder().aggregator_preference(0.4).build().unwrap();
38 match a.compare_aggregator_preference(&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().aggregator_preference(0.0).build().unwrap();
48 let b = a.to_builder().aggregator_preference(1.0).build().unwrap();
49 assert_eq!(a.compare_aggregator_preference(&b), CompareOutcome::Incompatible);
50 }
51}