#ode #models #observation #analytical #pharmacometric #pk-pd

pharmsol

Rust library for solving analytic and ode-defined pharmacometric models

37 releases (6 breaking)

new 0.7.7 Feb 23, 2025
0.7.1 Oct 17, 2024
0.3.1 Jul 28, 2024

#13 in Simulation

Download history 5/week @ 2024-11-01 2/week @ 2024-11-08 3/week @ 2024-12-06 4/week @ 2024-12-13 1/week @ 2024-12-20 187/week @ 2025-01-31 225/week @ 2025-02-07 25/week @ 2025-02-14

437 downloads per month
Used in pmcore

GPL-3.0 license

125KB
3K SLoC

pharmsol

Build Documentation crates.io

Simulate PK/PD profiles using ODE and analytical models.

Example

ODE based model.

    use pharmsol::*;

    // Subject data can be generated using the builder pattern
    let subject = Subject::builder("id1")
        .bolus(0.0, 100.0, 0)
        .repeat(2, 0.5)
        .observation(0.5, 0.1, 0)
        .observation(1.0, 0.4, 0)
        .observation(2.0, 1.0, 0)
        .observation(2.5, 1.1, 0)
        .covariate("wt", 0.0, 80.0)
        .covariate("wt", 1.0, 83.0)
        .covariate("age", 0.0, 25.0)
        .build();

    let ode = equation::ODE::new(
        |x, p, t, dx, _rateiv, cov| {
            // The following are helper functions to fetch parameters and covariates
            fetch_cov!(cov, t, _wt, _age);
            fetch_params!(p, ka, ke, _tlag, _v);

            // The ODEs are defined here
            dx[0] = -ka * x[0];
            dx[1] = ka * x[0] - ke * x[1];
        },
        |p| {
            fetch_params!(p, _ka, _ke, tlag, _v);
            lag! {0=>tlag}
        },
        |_p| fa! {},
        |_p, _t, _cov, _x| {},
        |x, p, _t, _cov, y| {
            fetch_params!(p, _ka, _ke, _tlag, v);
            // This equation specifies the output, e.g. the measured concentrations
            y[0] = x[1] / v;
        },
        (2, 1),
    );

    let op = ode.estimate_predictions(&subject, &vec![0.3, 0.5, 0.1, 70.0]);
    // println!("{op:#?}");
    let _ = op.run();

Analytic based model.

use pharmsol::*;
let analytical = equation::Analytical::new(
    one_compartment_with_absorption,
    |_p, _cov| {},
    |p| {
        fetch_params!(p, _ka, _ke, tlag, _v);
        lag! {0=>tlag}
    },
    |_p| fa! {},
    |_p, _t, _cov, _x| {},
    |x, p, _t, _cov, y| {
        fetch_params!(p, _ka, _ke, _tlag, v);
        y[0] = x[1] / v;
    },
    (2, 1),
);
let op = analytical.simulate_subject(&subject, &vec![0.3, 0.5, 0.1, 70.0]);
println!("{op:#?}");

Supported analytical models

We are working to support all the standard analytical models.

  • One-compartment with IV infusion
  • One-compartment with IV infusion and oral absorption
  • Two-compartment with IV infusion
  • Two-compartment with IV infusion and oral absorption
  • Three-compartmental models

Links

Documentation Benchmarks

Dependencies

~23–32MB
~517K SLoC