pharmsol/
lib.rs

1pub mod data;
2pub mod error;
3#[cfg(feature = "exa")]
4pub mod exa;
5pub mod optimize;
6pub mod simulator;
7
8//extension traits
9pub use crate::data::builder::SubjectBuilderExt;
10pub use crate::data::Interpolation::*;
11pub use crate::data::*;
12pub use crate::equation::*;
13pub use crate::optimize::effect::get_e2;
14pub use crate::optimize::spp::SppOptimizer;
15pub use crate::simulator::equation::{self, ODE};
16pub use error::PharmsolError;
17#[cfg(feature = "exa")]
18pub use exa::*;
19pub use nalgebra::dmatrix;
20pub use std::collections::HashMap;
21
22pub mod prelude {
23    pub mod data {
24        pub use crate::data::{
25            error_model::ErrorModels, parser::read_pmetrics, Covariates, Data, Event, Occasion,
26            Subject,
27        };
28    }
29    pub mod simulator {
30        pub use crate::simulator::{
31            equation,
32            equation::Equation,
33            likelihood::{psi, PopulationPredictions, Prediction, SubjectPredictions},
34        };
35    }
36    pub mod models {
37        pub use crate::simulator::equation::analytical::one_compartment;
38        pub use crate::simulator::equation::analytical::one_compartment_with_absorption;
39        pub use crate::simulator::equation::analytical::three_compartments;
40        pub use crate::simulator::equation::analytical::three_compartments_with_absorption;
41        pub use crate::simulator::equation::analytical::two_compartments;
42        pub use crate::simulator::equation::analytical::two_compartments_with_absorption;
43    }
44
45    //extension traits
46    pub use crate::data::builder::SubjectBuilderExt;
47    pub use crate::data::Interpolation::*;
48    pub use crate::data::*;
49
50    #[macro_export]
51    macro_rules! fetch_params {
52        ($p:expr, $($name:ident),*) => {
53            let p = $p;
54            let mut idx = 0;
55            $(
56                #[allow(unused_mut)]
57                let mut $name = p[idx];
58                idx += 1;
59            )*
60            let _ = idx; // Consume idx to avoid unused_assignments warning
61        };
62    }
63    #[macro_export]
64    macro_rules! fetch_cov {
65        ($cov:expr, $t:expr, $($name:ident),*) => {
66            $(
67                let $name = match $cov.get_covariate(stringify!($name)) {
68                    Some(cov) => cov.interpolate($t).unwrap(),
69                    None => panic!("Covariate {} not found", stringify!($name)),
70                };
71
72            )*
73        };
74    }
75    #[macro_export]
76    macro_rules! lag {
77        ($($k:expr => $v:expr),* $(,)?) => {{
78            core::convert::From::from([$(($k, $v),)*])
79        }};
80    }
81
82    #[macro_export]
83    macro_rules! fa {
84        ($($k:expr => $v:expr),* $(,)?) => {{
85            core::convert::From::from([$(($k, $v),)*])
86        }};
87    }
88}
89
90#[cfg(test)]
91mod tests {
92    use super::*;
93
94    #[test]
95    fn test_fetch_params_macro() {
96        // Test basic parameter fetching
97        let params = vec![1.0, 2.5, 3.7];
98
99        fetch_params!(params, ka, ke, v);
100
101        assert_eq!(ka, 1.0);
102        assert_eq!(ke, 2.5);
103        assert_eq!(v, 3.7);
104    }
105}