capability_grower_configuration_comparison/
compare_ai_confidence.rs1crate::ix!();
3
4pub trait CompareAiConfidence {
5 fn compare_ai_confidence(&self, other: &GrowerTreeConfiguration) -> CompareOutcome;
6}
7
8impl CompareAiConfidence for GrowerTreeConfiguration {
9 fn compare_ai_confidence(&self, other: &GrowerTreeConfiguration) -> CompareOutcome {
10 match (self.ai_confidence(), other.ai_confidence()) {
11 (None, None) => CompareOutcome::Exact,
12 (None, Some(_)) | (Some(_), None) => CompareOutcome::Partial(0.5),
13 (Some(a), Some(b)) => {
14 let diff_factor = (*a.base_factor() as i32 - *b.base_factor() as i32).abs();
16 let diff_mult = (a.factor_multiplier() - b.factor_multiplier()).abs();
17
18 if diff_factor == 0 && diff_mult < 0.01 {
20 CompareOutcome::Exact
21 }
22 else if diff_factor <= 2 && diff_mult < 1.0 {
24 let score = (1.0 - diff_mult).max(0.0);
26 CompareOutcome::Partial(score)
27 }
28 else {
29 CompareOutcome::Incompatible
30 }
31 }
32 }
33 }
34}
35
36#[cfg(test)]
37mod compare_ai_confidence_tests {
38 use super::*;
39
40 #[traced_test]
41 fn none_none() {
42 let a = GrowerTreeConfiguration::default();
43 let b = a.clone();
44 assert_eq!(a.compare_ai_confidence(&b), CompareOutcome::Exact);
45 }
46
47 #[traced_test]
48 fn same_factors_exact() {
49 let ai = AiTreeBranchingConfidenceConfigurationBuilder::default()
50 .base_factor(5)
51 .factor_multiplier(0.7)
52 .build().unwrap();
53 let a = GrowerTreeConfiguration::default()
54 .to_builder().ai_confidence(Some(ai.clone())).build().unwrap();
55 let b = a.clone();
56 assert_eq!(a.compare_ai_confidence(&b), CompareOutcome::Exact);
57 }
58
59 #[traced_test]
60 fn same_base_different_multiplier_partial() {
61 let ac1 = AiTreeBranchingConfidenceConfigurationBuilder::default()
63 .base_factor(4).factor_multiplier(0.2).build().unwrap();
64 let ac2 = AiTreeBranchingConfidenceConfigurationBuilder::default()
65 .base_factor(4).factor_multiplier(0.8).build().unwrap();
66
67 let a = GrowerTreeConfiguration::default()
68 .to_builder().ai_confidence(Some(ac1)).build().unwrap();
69 let b = a.to_builder().ai_confidence(Some(ac2)).build().unwrap();
70 let out = a.compare_ai_confidence(&b);
71 match out {
72 CompareOutcome::Partial(score) => {
73 assert!(score > 0.1 && score < 1.0, "expected partial score, got {:?}", score);
74 }
75 other => panic!("Expected partial match, got {:?}", other),
76 }
77 }
78
79 #[traced_test]
80 fn none_some_incompatible() {
81 let conf = AiTreeBranchingConfidenceConfigurationBuilder::default()
82 .base_factor(3).factor_multiplier(1.0).build().unwrap();
83 let a = GrowerTreeConfiguration::default();
84 let b = a.to_builder().ai_confidence(Some(conf)).build().unwrap();
85 assert_eq!(a.compare_ai_confidence(&b), CompareOutcome::Partial(0.5));
95 }
96}