use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ContradictionEvidence {
pub rid_a: String,
pub rid_b: String,
pub source_a: Option<String>,
pub source_b: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct EvidenceWindow {
pub context_variance_threshold: f32,
pub temporal_spread_days_threshold: f32,
pub contradiction_density_threshold: f32,
pub entity_ambiguity_threshold: f32,
}
impl Default for EvidenceWindow {
fn default() -> Self {
Self {
context_variance_threshold: 0.7,
temporal_spread_days_threshold: 90.0,
contradiction_density_threshold: 0.2,
entity_ambiguity_threshold: 0.5,
}
}
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct EvidenceSnapshot {
pub context_variance: f32,
pub temporal_spread_days: f32,
pub contradiction_density: f32,
pub entity_ambiguity_score: f32,
pub alternate_entities: Vec<String>,
pub unresolved_context_dimensions: Vec<String>,
pub contradictions: Vec<ContradictionEvidence>,
pub window: EvidenceWindow,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_window_thresholds_match_rfc() {
let w = EvidenceWindow::default();
assert_eq!(w.context_variance_threshold, 0.7);
assert_eq!(w.temporal_spread_days_threshold, 90.0);
assert_eq!(w.contradiction_density_threshold, 0.2);
assert_eq!(w.entity_ambiguity_threshold, 0.5);
}
#[test]
fn default_snapshot_is_all_zero() {
let s = EvidenceSnapshot::default();
assert_eq!(s.context_variance, 0.0);
assert_eq!(s.temporal_spread_days, 0.0);
assert_eq!(s.contradiction_density, 0.0);
assert!(s.alternate_entities.is_empty());
assert!(s.unresolved_context_dimensions.is_empty());
assert!(s.contradictions.is_empty());
}
}