polyguard-openenv / app /models /dosing /surrogate_pkpd.py
TheJackBright's picture
Deploy PolyGuard OpenEnv Space
877add7 verified
"""Surrogate PK/PD transition."""
from __future__ import annotations
from app.models.dosing.pkpd_state import PKPDState
def step_pkpd(
state: PKPDState,
dose_delta: float,
organ_factor: float = 0.0,
interaction_factor: float = 0.0,
) -> PKPDState:
# Effect benefits modestly from dose increases, but toxicity amplifies with organ stress + interactions.
effective_delta = dose_delta * (1.0 - min(0.6, organ_factor * 0.4))
new_effect = max(0.0, min(1.0, state.effect_level + 0.28 * effective_delta - 0.05 * interaction_factor))
toxicity_gain = max(0.0, dose_delta) * (0.35 + organ_factor * 0.25 + interaction_factor * 0.2)
new_toxicity = max(0.0, min(1.0, (state.toxicity_level * 0.85) + toxicity_gain))
new_underdose = max(0.0, min(1.0, 1.0 - new_effect + max(0.0, -dose_delta) * 0.15))
return PKPDState(
effect_level=new_effect,
toxicity_level=new_toxicity,
underdose_risk=new_underdose,
organ_stress=max(0.0, min(1.0, organ_factor)),
interaction_load=max(0.0, min(1.0, interaction_factor)),
)