Coverage for src / local_deep_research / advanced_search_system / evidence / base_evidence.py: 81%

30 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2026-01-11 00:51 +0000

1""" 

2Base evidence classes for the advanced search system. 

3""" 

4 

5from dataclasses import dataclass, field 

6from datetime import datetime, UTC 

7from enum import Enum 

8from typing import Any, Dict, Optional 

9 

10 

11class EvidenceType(Enum): 

12 """Types of evidence with inherent reliability scores.""" 

13 

14 DIRECT_STATEMENT = "direct_statement" 

15 OFFICIAL_RECORD = "official_record" 

16 RESEARCH_FINDING = "research_finding" 

17 NEWS_REPORT = "news_report" 

18 STATISTICAL_DATA = "statistical_data" 

19 INFERENCE = "inference" 

20 CORRELATION = "correlation" 

21 SPECULATION = "speculation" 

22 

23 @property 

24 def base_confidence(self) -> float: 

25 """Get base confidence for this evidence type.""" 

26 confidence_map = { 

27 EvidenceType.DIRECT_STATEMENT: 0.95, 

28 EvidenceType.OFFICIAL_RECORD: 0.90, 

29 EvidenceType.RESEARCH_FINDING: 0.85, 

30 EvidenceType.STATISTICAL_DATA: 0.85, 

31 EvidenceType.NEWS_REPORT: 0.75, 

32 EvidenceType.INFERENCE: 0.50, 

33 EvidenceType.CORRELATION: 0.30, 

34 EvidenceType.SPECULATION: 0.10, 

35 } 

36 return confidence_map.get(self, 0.5) 

37 

38 

39@dataclass 

40class Evidence: 

41 """Evidence supporting or refuting a claim.""" 

42 

43 claim: str 

44 type: EvidenceType 

45 source: str 

46 confidence: float = 0.0 

47 reasoning: Optional[str] = None 

48 raw_text: Optional[str] = None 

49 timestamp: str = field( 

50 default_factory=lambda: datetime.now(UTC).isoformat() 

51 ) 

52 metadata: Dict[str, Any] = field(default_factory=dict) 

53 

54 def __post_init__(self): 

55 """Calculate initial confidence if not provided.""" 

56 if self.confidence == 0.0: 

57 self.confidence = self.type.base_confidence