"""Dosing analysis agent.""" from __future__ import annotations from app.common.types import PolyGuardState from app.knowledge.drug_catalog import DRUG_CLASSES from app.models.dosing.dose_policy_features import build_dose_features from app.models.dosing.infer import infer_dosing_quality from app.models.dosing.pkpd_state import PKPDState from app.models.dosing.surrogate_pkpd import step_pkpd class DosingAgent: name = "DosingAgent" def run(self, state: PolyGuardState) -> dict: sensitive_classes = {"anticoagulant", "sedative", "glucose_lowering"} dose_sensitive = [ m.drug for m in state.patient.medications if DRUG_CLASSES.get(m.drug) in sensitive_classes ][:3] analyses: list[dict] = [] for drug in dose_sensitive: feats = build_dose_features(state.patient, drug) base_state = PKPDState( effect_level=min(1.0, 0.35 + feats["adherence"] * 0.45), toxicity_level=min(1.0, 0.08 + feats["organ_stress"] * 0.4), underdose_risk=max(0.0, 1.0 - (0.35 + feats["adherence"] * 0.45)), organ_stress=feats["organ_stress"], interaction_load=feats["interaction_load"], ) lower = infer_dosing_quality(step_pkpd(base_state, dose_delta=-0.2, organ_factor=feats["organ_stress"], interaction_factor=feats["interaction_load"])) hold = infer_dosing_quality(step_pkpd(base_state, dose_delta=0.0, organ_factor=feats["organ_stress"], interaction_factor=feats["interaction_load"])) higher = infer_dosing_quality(step_pkpd(base_state, dose_delta=0.2, organ_factor=feats["organ_stress"], interaction_factor=feats["interaction_load"])) analyses.append( { "drug": drug, "features": feats, "options": { "reduce": lower, "hold": hold, "increase": higher, }, } ) return { "dose_sensitive_drugs": dose_sensitive, "dosing_active": bool(dose_sensitive), "recommend_mode": "DOSE_OPT" if dose_sensitive else "REGIMEN_OPT", "analyses": analyses, }