capability_grower_configuration/
ai_tree_branching_confidence_configuration.rs

1// ---------------- [ File: capability-grower-configuration/src/ai_tree_branching_confidence_configuration.rs ]
2crate::ix!();
3
4/// This struct should define how AI confidence modifies branching factor:
5///
6/// If present, we interpret these fields to scale or reduce the final branch factor based on AI's
7/// certainty.
8///
9#[derive(
10    Copy,
11    SaveLoad,
12    Debug, 
13    Clone, 
14    PartialEq, 
15    Getters, 
16    Builder, 
17    Default, 
18    Serialize, 
19    Deserialize, 
20    AiJsonTemplate,
21    AiJsonTemplateWithJustification,
22)]
23#[builder(pattern="owned", setter(into))]
24#[getset(get="pub")]
25pub struct AiTreeBranchingConfidenceConfiguration {
26
27    /// This number should be the base factor we add or multiply if the AI is highly confident.
28    ///
29    #[serde(deserialize_with = "fuzzy_u8")]
30    base_factor: u8,
31
32    /// This fraction >= 0 indicates how strongly AI confidence modifies branch factor.
33    ///
34    /// 0 = no effect, higher = stronger effect.
35    ///
36    factor_multiplier: f32,
37}
38
39impl AiTreeBranchingConfidenceConfiguration {
40    pub fn validate(&self) -> Result<(), GrowerTreeConfigurationError> {
41        if self.factor_multiplier < 0.0 {
42            return Err(GrowerTreeConfigurationError::AIConfidenceFactorNegative);
43        }
44        Ok(())
45    }
46}
47
48impl FuzzyFromJsonValue for JustifiedAiTreeBranchingConfidenceConfiguration {
49    fn fuzzy_from_json_value(value: &JsonValue)
50        -> Result<Self, FuzzyFromJsonValueError>
51    {
52        trace!("(JustifiedAiTreeBranchingConfidenceConfiguration) Entering fuzzy_from_json_value");
53
54        // 1) If null => default
55        if value.is_null() {
56            debug!("(JustifiedAiTreeBranchingConfidenceConfiguration) Null => returning base_factor=0, factor_multiplier=0");
57            return Ok(Self {
58                base_factor: 0,
59                base_factor_confidence: 0.0,
60                base_factor_justification: String::new(),
61                factor_multiplier: 0.0,
62                factor_multiplier_confidence: 0.0,
63                factor_multiplier_justification: String::new(),
64            });
65        }
66
67        // 2) Must be object => parse
68        let mut obj = match value.as_object() {
69            Some(m) => {
70                trace!("(JustifiedAiTreeBranchingConfidenceConfiguration) Found object => flattening if needed.");
71                m.clone()
72            }
73            None => {
74                error!("(JustifiedAiTreeBranchingConfidenceConfiguration) Not an object => fail!");
75                return Err(FuzzyFromJsonValueError::NotAnObject {
76                    target_type: "JustifiedAiTreeBranchingConfidenceConfiguration",
77                    actual: value.clone(),
78                });
79            }
80        };
81
82        flatten_all_fields(&mut obj);
83
84        // base_factor => fuzzy_u8
85        let base_factor_val = match obj.get("base_factor") {
86            Some(x) => {
87                match fuzzy_u8(x) {
88                    Ok(u) => {
89                        trace!("(JustifiedAiTreeBranchingConfidenceConfiguration) base_factor => {}", u);
90                        u
91                    }
92                    Err(e) => {
93                        error!("(JustifiedAiTreeBranchingConfidenceConfiguration) base_factor parse error => {:?}", e);
94                        return Err(FuzzyFromJsonValueError::Other {
95                            target_type: "JustifiedAiTreeBranchingConfidenceConfiguration",
96                            detail: format!("Cannot parse base_factor as u8: {:?}", e),
97                        });
98                    }
99                }
100            }
101            None => {
102                error!("(JustifiedAiTreeBranchingConfidenceConfiguration) Missing 'base_factor' => cannot parse!");
103                return Err(FuzzyFromJsonValueError::MissingField {
104                    field_name: "base_factor",
105                    target_type: "JustifiedAiTreeBranchingConfidenceConfiguration",
106                });
107            }
108        };
109        let base_conf = get_f64_field(&obj, "base_factor_confidence", "JustifiedAiTreeBranchingConfidenceConfiguration")
110            .unwrap_or(0.0);
111        let base_just = get_string_field(&obj, "base_factor_justification", "JustifiedAiTreeBranchingConfidenceConfiguration")
112            .unwrap_or_default();
113
114        // factor_multiplier => f32
115        let fm_f64 = get_f64_field(&obj, "factor_multiplier", "JustifiedAiTreeBranchingConfidenceConfiguration")
116            .unwrap_or(0.0);
117        let factor_multi = fm_f64 as f32;
118        let fm_conf = get_f64_field(&obj, "factor_multiplier_confidence", "JustifiedAiTreeBranchingConfidenceConfiguration")
119            .unwrap_or(0.0);
120        let fm_just = get_string_field(&obj, "factor_multiplier_justification", "JustifiedAiTreeBranchingConfidenceConfiguration")
121            .unwrap_or_default();
122
123        trace!("(JustifiedAiTreeBranchingConfidenceConfiguration) Successfully parsed => returning final struct.");
124        Ok(Self {
125            base_factor: base_factor_val,
126            base_factor_confidence: base_conf,
127            base_factor_justification: base_just,
128            factor_multiplier: factor_multi,
129            factor_multiplier_confidence: fm_conf,
130            factor_multiplier_justification: fm_just,
131        })
132    }
133}