fn main() -> Result<(), pharmsol::PharmsolError> {
use pharmsol::prelude::*;
let subject = Subject::builder("subject_001")
.infusion(0.0, 500.0, 0, 0.5)
.covariate("wt", 0.0, 70.0)
.observation(0.5, 8.5, 0)
.observation(1.0, 6.2, 0)
.observation(2.0, 4.1, 0)
.observation(4.0, 2.3, 0)
.observation(6.0, 1.5, 0)
.observation(8.0, 1.1, 0)
.observation(12.0, 0.7, 0)
.missing_observation(24.0, 0)
.build();
let ode = equation::ODE::new(
|x, p, t, dx, _b, rateiv, cov| {
fetch_cov!(cov, t, wt);
fetch_params!(p, cl, v, vp, q);
let wt_ratio = wt / 85.0;
let v_scaled = v * wt_ratio;
let vp_scaled = vp * wt_ratio;
let cl_scaled = cl * wt_ratio.powf(0.75);
let q_scaled = q * wt_ratio.powf(0.75);
let ke = cl_scaled / v_scaled; let kcp = q_scaled / v_scaled; let kpc = q_scaled / vp_scaled;
dx[0] = -ke * x[0] - kcp * x[0] + kpc * x[1] + rateiv[0];
dx[1] = kcp * x[0] - kpc * x[1];
},
|_p, _t, _cov| lag! {},
|_p, _t, _cov| fa! {},
|_p, _t, _cov, _x| {},
|x, p, t, cov, y| {
fetch_cov!(cov, t, wt);
fetch_params!(p, _cl, v, _vp, _q);
let wt_ratio = wt / 85.0;
let v_scaled = v * wt_ratio;
y[0] = x[0] / v_scaled;
},
)
.with_nstates(2)
.with_nout(1);
let cl = 5.0; let v = 50.0; let vp = 100.0; let q = 10.0; let params = vec![cl, v, vp, q];
let predictions = ode.estimate_predictions(&subject, ¶ms)?;
println!("\n╔════════════════════════════════════════════════════════════╗");
println!("║ Two-Compartment Model Predictions ║");
println!("╠════════════════════════════════════════════════════════════╣");
println!("║ Parameters: ║");
println!(
"║ CL = {:.1} L/hr, V = {:.1} L, Vp = {:.1} L, Q = {:.1} L/hr ║",
cl, v, vp, q
);
println!("║ Weight = 70 kg (scaled from 85 kg reference) ║");
println!("╠═════════════╦══════════════════════════════════════════════╣");
println!("║ Time (hr) ║ Predicted Concentration ║");
println!("╠═════════════╬══════════════════════════════════════════════╣");
for pred in predictions.predictions() {
println!(
"║ {:>10.2} ║ {:>18.4} mg/L ║",
pred.time(),
pred.prediction()
);
}
println!("╚═════════════╩══════════════════════════════════════════════╝\n");
Ok(())
}