Skip to main content

graphify_core/
confidence.rs

1use serde::{Deserialize, Serialize};
2
3/// Confidence level for an extracted relationship.
4///
5/// Serializes to `"EXTRACTED"` / `"INFERRED"` / `"AMBIGUOUS"` for Python compatibility.
6#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
7#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
8#[derive(Default)]
9pub enum Confidence {
10    #[default]
11    Extracted,
12    Inferred,
13    Ambiguous,
14}
15
16impl Confidence {
17    /// Default numeric score for each confidence level.
18    pub fn default_score(&self) -> f64 {
19        match self {
20            Confidence::Extracted => 1.0,
21            Confidence::Inferred => 0.7,
22            Confidence::Ambiguous => 0.4,
23        }
24    }
25}
26
27impl std::fmt::Display for Confidence {
28    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
29        match self {
30            Confidence::Extracted => write!(f, "Extracted"),
31            Confidence::Inferred => write!(f, "Inferred"),
32            Confidence::Ambiguous => write!(f, "Ambiguous"),
33        }
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn serialize_to_screaming_snake() {
43        assert_eq!(
44            serde_json::to_string(&Confidence::Extracted).unwrap(),
45            r#""EXTRACTED""#
46        );
47        assert_eq!(
48            serde_json::to_string(&Confidence::Inferred).unwrap(),
49            r#""INFERRED""#
50        );
51        assert_eq!(
52            serde_json::to_string(&Confidence::Ambiguous).unwrap(),
53            r#""AMBIGUOUS""#
54        );
55    }
56
57    #[test]
58    fn deserialize_from_screaming_snake() {
59        let c: Confidence = serde_json::from_str(r#""INFERRED""#).unwrap();
60        assert_eq!(c, Confidence::Inferred);
61    }
62
63    #[test]
64    fn default_scores() {
65        assert!((Confidence::Extracted.default_score() - 1.0).abs() < f64::EPSILON);
66        assert!((Confidence::Inferred.default_score() - 0.7).abs() < f64::EPSILON);
67        assert!((Confidence::Ambiguous.default_score() - 0.4).abs() < f64::EPSILON);
68    }
69
70    #[test]
71    fn default_is_extracted() {
72        assert_eq!(Confidence::default(), Confidence::Extracted);
73    }
74}