File size: 1,616 Bytes
630d650
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import datetime as _dt
import uuid
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional


CANCER_RISK_TEMPLATE_COLUMNS: List[str] = [
    "record_id",
    "chemical_name",
    "casrn",
    "route",
    "exposure_value",
    "exposure_unit",
    "body_weight_kg",
    "csf_value",
    "csf_unit",
    "iur_value",
    "air_conc_value",
    "air_conc_unit",
    "source_reference",
]


def default_run_id(prefix: str = "run") -> str:
    ts = _dt.datetime.utcnow().strftime("%Y%m%d_%H%M%S")
    return f"{prefix}_{ts}_{uuid.uuid4().hex[:8]}"


@dataclass
class RegulatoryClause:
    clause_id: str
    framework: str
    title: str
    description: str
    required_fields: List[str] = field(default_factory=list)
    required_evidence_terms: List[str] = field(default_factory=list)
    acceptance_rule: str = "all_required_fields"
    applicability: Dict[str, Any] = field(default_factory=dict)
    source_reference: str = ""


@dataclass
class ClauseEvaluation:
    clause_id: str
    framework: str
    status: str
    fields_present: List[str] = field(default_factory=list)
    missing_fields: List[str] = field(default_factory=list)
    evidence_hits: List[str] = field(default_factory=list)
    prompt: str = ""
    reason: str = ""


RISK_TIER_THRESHOLDS = {
    "low": 1e-6,
    "moderate": 1e-4,
}


def classify_risk_tier(value: Optional[float]) -> str:
    if value is None:
        return "unknown"
    if value < RISK_TIER_THRESHOLDS["low"]:
        return "de_minimis"
    if value <= RISK_TIER_THRESHOLDS["moderate"]:
        return "monitor"
    return "high_priority"