From abab41c0fef482f27c13037a372c55bf21381e74 Mon Sep 17 00:00:00 2001 From: Markus Hovd Date: Tue, 18 Feb 2025 14:22:53 +0100 Subject: [PATCH] Refactor project structure (#80) * Project structure Routines is now under /src, and not /src/algorithms. Cleaned up mod-files and lib.rs * Update README.md * Simplify prelude --- README.md | 4 +-- examples/bimodal_ke/main.rs | 1 - examples/debug.rs | 5 +++- examples/drusano/main.rs | 5 +++- examples/meta/main.rs | 1 - examples/theophylline/main.rs | 5 +++- examples/toml.rs | 2 +- examples/two_eq_lag/main.rs | 6 +---- meta_rust.csv | 2 -- src/algorithms/mod.rs | 8 +++--- src/algorithms/npag.rs | 19 +++++++------ src/algorithms/npod.rs | 10 +++---- src/algorithms/postprob.rs | 8 ++++-- src/algorithms/routines/mod.rs | 27 ------------------- src/algorithms/routines/optimization/optim.rs | 22 --------------- src/lib.rs | 18 ++++++------- .../prune.rs => routines/condensation/mod.rs} | 0 .../routines/evaluation/ipm.rs | 0 .../routines/evaluation/ipm_faer.rs | 0 src/routines/evaluation/mod.rs | 2 ++ .../routines/evaluation/qr.rs | 0 .../routines/expansion/adaptative_grid.rs | 2 +- src/routines/expansion/mod.rs | 1 + .../routines/initialization/latin.rs | 0 .../routines/initialization/mod.rs | 2 +- .../routines/initialization/sobol.rs | 16 ++++++++--- src/{ => routines}/logger.rs | 4 +-- src/routines/mod.rs | 16 +++++++++++ .../optimization/mod.rs} | 0 src/{algorithms => }/routines/output.rs | 2 +- src/{algorithms => }/routines/settings.rs | 0 31 files changed, 85 insertions(+), 103 deletions(-) delete mode 100644 meta_rust.csv delete mode 100644 src/algorithms/routines/mod.rs delete mode 100644 src/algorithms/routines/optimization/optim.rs rename src/{algorithms/routines/condensation/prune.rs => routines/condensation/mod.rs} (100%) rename src/{algorithms => }/routines/evaluation/ipm.rs (100%) rename src/{algorithms => }/routines/evaluation/ipm_faer.rs (100%) create mode 100644 src/routines/evaluation/mod.rs rename src/{algorithms => }/routines/evaluation/qr.rs (100%) rename src/{algorithms => }/routines/expansion/adaptative_grid.rs (98%) create mode 100644 src/routines/expansion/mod.rs rename src/{algorithms => }/routines/initialization/latin.rs (100%) rename src/{algorithms => }/routines/initialization/mod.rs (98%) rename src/{algorithms => }/routines/initialization/sobol.rs (90%) rename src/{ => routines}/logger.rs (96%) create mode 100644 src/routines/mod.rs rename src/{algorithms/routines/optimization/d_optimizer.rs => routines/optimization/mod.rs} (100%) rename src/{algorithms => }/routines/output.rs (99%) rename src/{algorithms => }/routines/settings.rs (100%) diff --git a/README.md b/README.md index 0e9c8e284..a9ffc4237 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # PMcore -![Build](https://github.com/LAPKB/PMcore/actions/workflows/rust.yml/badge.svg) +[![Build](https://github.com/LAPKB/PMcore/actions/workflows/rust.yml/badge.svg)](https://github.com/LAPKB/PMcore/actions/workflows/rust.yml) [![Documentation](https://github.com/LAPKB/PMcore/actions/workflows/docs.yml/badge.svg)](https://lapkb.github.io/PMcore/pmcore/) -![Security Audit](https://github.com/LAPKB/PMcore/actions/workflows/security_audit.yml/badge.svg) +[![Security Audit](https://github.com/LAPKB/PMcore/actions/workflows/security_audit.yml/badge.svg)](https://github.com/LAPKB/PMcore/actions/workflows/security_audit.yml) [![crates.io](https://img.shields.io/crates/v/pmcore.svg)](https://crates.io/crates/pmcore) diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 640e44adf..83dc14b4c 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -1,4 +1,3 @@ -use logger::setup_log; use pmcore::prelude::*; fn main() { let eq = equation::ODE::new( diff --git a/examples/debug.rs b/examples/debug.rs index 842e9146c..b9cd1c13b 100644 --- a/examples/debug.rs +++ b/examples/debug.rs @@ -1,7 +1,10 @@ use algorithms::{npag::NPAG, Algorithm}; use ipm::burke; use logger::setup_log; -use pmcore::prelude::*; +use pmcore::{ + prelude::*, + routines::{evaluation::ipm, logger, settings}, +}; fn main() { let ode = equation::ODE::new( |x, p, _t, dx, rateiv, _cov| { diff --git a/examples/drusano/main.rs b/examples/drusano/main.rs index 21440ab5c..dde98e671 100644 --- a/examples/drusano/main.rs +++ b/examples/drusano/main.rs @@ -4,7 +4,10 @@ use argmin::{ solver::neldermead::NelderMead, }; use logger::setup_log; -use pmcore::prelude::*; +use pmcore::{ + prelude::*, + routines::{logger, settings}, +}; use std::process::exit; #[allow(unused_variables)] fn main() { diff --git a/examples/meta/main.rs b/examples/meta/main.rs index 834827fdd..db4f26632 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -2,7 +2,6 @@ #![allow(unused_variables)] #![allow(unused_imports)] -use logger::setup_log; use pmcore::prelude::*; fn main() { diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index 576e9d289..8ebbca786 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -1,4 +1,7 @@ -use pmcore::prelude::{models::one_compartment_with_absorption, *}; +use pmcore::{ + prelude::{models::one_compartment_with_absorption, *}, + routines::settings, +}; fn main() { // let eq = Equation::new_ode( diff --git a/examples/toml.rs b/examples/toml.rs index f51b0347e..49fbc10c2 100644 --- a/examples/toml.rs +++ b/examples/toml.rs @@ -1,4 +1,4 @@ -use pmcore::prelude::*; +use pmcore::routines::settings; fn main() { let path = "examples/bimodal_ke/config.toml".to_string(); diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index 197a2043e..c82b54895 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -1,12 +1,8 @@ #![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_imports)] -use std::path::Path; -use data::read_pmetrics; -use logger::setup_log; -use ndarray::Array2; -use pmcore::prelude::{models::one_compartment_with_absorption, simulator::Equation, *}; +use pmcore::prelude::*; fn main() { let eq = equation::ODE::new( diff --git a/meta_rust.csv b/meta_rust.csv deleted file mode 100644 index 12159aaec..000000000 --- a/meta_rust.csv +++ /dev/null @@ -1,2 +0,0 @@ -converged,ncycles -true,110 diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index 1436d39ca..281b05d55 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -1,23 +1,21 @@ use std::fs; use std::path::Path; -use crate::prelude::{self, settings::Settings}; - +use crate::routines::output::NPResult; +use crate::routines::settings::Settings; use anyhow::{bail, Result}; use anyhow::{Context, Error}; use ndarray::Array2; use npag::*; use npod::NPOD; -use output::NPResult; use pharmsol::prelude::{data::Data, simulator::Equation}; use postprob::POSTPROB; -use prelude::*; + // use self::{data::Subject, simulator::Equation}; pub mod npag; pub mod npod; pub mod postprob; -pub mod routines; pub trait Algorithm { fn new(config: Settings, equation: E, data: Data) -> Result, Error> diff --git a/src/algorithms/npag.rs b/src/algorithms/npag.rs index a02361d30..21e931bb1 100644 --- a/src/algorithms/npag.rs +++ b/src/algorithms/npag.rs @@ -1,10 +1,11 @@ -use crate::prelude::{ - algorithms::Algorithm, - ipm::burke, - output::{CycleLog, NPCycle, NPResult}, - qr, - settings::Settings, -}; +use crate::prelude::algorithms::Algorithm; + +pub use crate::routines::evaluation::ipm::burke; +pub use crate::routines::evaluation::qr; +use crate::routines::settings::Settings; + +use crate::routines::output::{CycleLog, NPCycle, NPResult}; + use anyhow::Error; use anyhow::Result; use pharmsol::{ @@ -15,10 +16,12 @@ use pharmsol::{ Subject, }; +use crate::routines::initialization; + use ndarray::{Array, Array1, Array2, ArrayBase, Axis, Dim, OwnedRepr}; use ndarray_stats::{DeviationExt, QuantileExt}; -use super::{adaptative_grid::adaptative_grid, initialization}; +use crate::routines::expansion::adaptative_grid::adaptative_grid; const THETA_E: f64 = 1e-4; // Convergence criteria const THETA_G: f64 = 1e-4; // Objective function convergence criteria diff --git a/src/algorithms/npod.rs b/src/algorithms/npod.rs index 4d2e1c15b..2138858c5 100644 --- a/src/algorithms/npod.rs +++ b/src/algorithms/npod.rs @@ -1,9 +1,9 @@ use crate::prelude::{ algorithms::Algorithm, - ipm::burke, - output::{CycleLog, NPCycle, NPResult}, - qr, - settings::Settings, + routines::evaluation::ipm::burke, + routines::evaluation::qr, + routines::output::{CycleLog, NPCycle, NPResult}, + routines::settings::Settings, }; use anyhow::Error; use anyhow::Result; @@ -21,7 +21,7 @@ use ndarray::{ }; use ndarray_stats::{DeviationExt, QuantileExt}; -use super::{condensation::prune::prune, initialization, optimization::d_optimizer::SppOptimizer}; +use crate::routines::{condensation::prune, initialization, optimization::SppOptimizer}; const THETA_F: f64 = 1e-2; const THETA_D: f64 = 1e-4; diff --git a/src/algorithms/postprob.rs b/src/algorithms/postprob.rs index 50e33b9bc..d8dde26ec 100644 --- a/src/algorithms/postprob.rs +++ b/src/algorithms/postprob.rs @@ -1,4 +1,4 @@ -use crate::prelude::{algorithms::Algorithm, ipm::burke, output::NPResult, settings::Settings}; +use crate::prelude::algorithms::Algorithm; use anyhow::{Error, Result}; use pharmsol::prelude::{ data::{Data, ErrorModel, ErrorType}, @@ -7,7 +7,11 @@ use pharmsol::prelude::{ use ndarray::{Array1, Array2}; -use super::{initialization, output::CycleLog}; +use crate::routines::evaluation::ipm::burke; +use crate::routines::initialization; +use crate::routines::output::CycleLog; +use crate::routines::output::NPResult; +use crate::routines::settings::Settings; /// Posterior probability algorithm /// Reweights the prior probabilities to the observed data and error model diff --git a/src/algorithms/routines/mod.rs b/src/algorithms/routines/mod.rs deleted file mode 100644 index 138982aac..000000000 --- a/src/algorithms/routines/mod.rs +++ /dev/null @@ -1,27 +0,0 @@ -/// Routines for initializing the grid -pub mod initialization; -pub mod optimization { - pub mod d_optimizer; - pub mod optim; -} - -/// Routines for writing results to file, such as predicted values -pub mod output; -/// Routines for condensing grids -pub mod condensation { - pub mod prune; -} -/// Routines for expanding grids -pub mod expansion { - pub mod adaptative_grid; -} - -/// Provides routines for reading and parsing settings -pub mod settings; -pub mod evaluation { - - /// Interior point method for solving the optimization problem - pub mod ipm; - pub mod ipm_faer; - pub mod qr; -} diff --git a/src/algorithms/routines/optimization/optim.rs b/src/algorithms/routines/optimization/optim.rs deleted file mode 100644 index d75f13a7d..000000000 --- a/src/algorithms/routines/optimization/optim.rs +++ /dev/null @@ -1,22 +0,0 @@ -// use crate::prelude::*; -// use argmin::core::CostFunction; -// use datafile::Scenario; -// use ndarray::{Array1, Array2}; -// use sigma::ErrorModel; - -// use self::simulator::likelihood::SubjectPredictions; - -// struct GamLam<'a> { -// prediction: &'a SubjectPredictions, -// scenarios: &'a Vec, -// ep: ErrorModel<'a>, -// } - -// impl<'a> CostFunction for GamLam<'a> { -// type Param = f64; -// type Output = f64; -// fn cost(&self, _param: &Self::Param) -> Result { -// let prob = self.prediction.likelihood(&self.ep); -// Ok(prob.sum()) -// } -// } diff --git a/src/lib.rs b/src/lib.rs index 9a5e884de..1909698e3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,8 +50,9 @@ /// Provides the various algorithms used within the framework // pub mod algorithms; pub mod algorithms; -/// Logger functionality for the framework using [tracing] -pub mod logger; + +/// Routines +pub mod routines; // Re-export commonly used items pub use anyhow::Result; @@ -63,14 +64,11 @@ pub mod prelude { pub use super::Result; pub use crate::algorithms; pub use crate::algorithms::dispatch_algorithm; - pub use crate::algorithms::routines::condensation; - pub use crate::algorithms::routines::expansion::*; - pub use crate::algorithms::routines::initialization::*; - pub use crate::algorithms::routines::optimization; - pub use crate::logger; - pub use crate::prelude::evaluation::*; - // pub use crate::algorithms::routines::settings::*; - pub use crate::algorithms::routines::*; + pub use crate::routines; + pub use crate::routines::logger; + pub use crate::routines::logger::setup_log; + pub use crate::routines::settings; + //Alma re-exports pub mod simulator { pub use pharmsol::prelude::simulator::*; diff --git a/src/algorithms/routines/condensation/prune.rs b/src/routines/condensation/mod.rs similarity index 100% rename from src/algorithms/routines/condensation/prune.rs rename to src/routines/condensation/mod.rs diff --git a/src/algorithms/routines/evaluation/ipm.rs b/src/routines/evaluation/ipm.rs similarity index 100% rename from src/algorithms/routines/evaluation/ipm.rs rename to src/routines/evaluation/ipm.rs diff --git a/src/algorithms/routines/evaluation/ipm_faer.rs b/src/routines/evaluation/ipm_faer.rs similarity index 100% rename from src/algorithms/routines/evaluation/ipm_faer.rs rename to src/routines/evaluation/ipm_faer.rs diff --git a/src/routines/evaluation/mod.rs b/src/routines/evaluation/mod.rs new file mode 100644 index 000000000..b9ad757e7 --- /dev/null +++ b/src/routines/evaluation/mod.rs @@ -0,0 +1,2 @@ +pub mod ipm; +pub mod qr; diff --git a/src/algorithms/routines/evaluation/qr.rs b/src/routines/evaluation/qr.rs similarity index 100% rename from src/algorithms/routines/evaluation/qr.rs rename to src/routines/evaluation/qr.rs diff --git a/src/algorithms/routines/expansion/adaptative_grid.rs b/src/routines/expansion/adaptative_grid.rs similarity index 98% rename from src/algorithms/routines/expansion/adaptative_grid.rs rename to src/routines/expansion/adaptative_grid.rs index 35ccb048c..8d14d7dfd 100644 --- a/src/algorithms/routines/expansion/adaptative_grid.rs +++ b/src/routines/expansion/adaptative_grid.rs @@ -1,6 +1,6 @@ use ndarray::{Array, Array2}; -use crate::algorithms::routines::condensation::prune::prune; +use crate::routines::condensation::prune; /// Implements the adaptive grid algorithm for support point expansion. /// diff --git a/src/routines/expansion/mod.rs b/src/routines/expansion/mod.rs new file mode 100644 index 000000000..a84c84fad --- /dev/null +++ b/src/routines/expansion/mod.rs @@ -0,0 +1 @@ +pub mod adaptative_grid; diff --git a/src/algorithms/routines/initialization/latin.rs b/src/routines/initialization/latin.rs similarity index 100% rename from src/algorithms/routines/initialization/latin.rs rename to src/routines/initialization/latin.rs diff --git a/src/algorithms/routines/initialization/mod.rs b/src/routines/initialization/mod.rs similarity index 98% rename from src/algorithms/routines/initialization/mod.rs rename to src/routines/initialization/mod.rs index c36bb9425..91459f2d5 100644 --- a/src/algorithms/routines/initialization/mod.rs +++ b/src/routines/initialization/mod.rs @@ -6,7 +6,7 @@ use anyhow::{bail, Context, Result}; use ndarray::{Array1, Array2}; use pharmsol::prelude::EstimateTheta; -use crate::prelude::settings::Settings; +use crate::routines::settings::Settings; pub mod latin; pub mod sobol; diff --git a/src/algorithms/routines/initialization/sobol.rs b/src/routines/initialization/sobol.rs similarity index 90% rename from src/algorithms/routines/initialization/sobol.rs rename to src/routines/initialization/sobol.rs index a3d2e47a0..8b0cba031 100644 --- a/src/algorithms/routines/initialization/sobol.rs +++ b/src/routines/initialization/sobol.rs @@ -45,12 +45,15 @@ pub fn generate( } #[cfg(test)] -use crate::prelude::*; - #[test] fn basic_sobol() { assert_eq!( - initialization::sobol::generate(5, &vec![(0., 1.), (0., 1.), (0., 1.)], 347).unwrap(), + crate::routines::initialization::sobol::generate( + 5, + &vec![(0., 1.), (0., 1.), (0., 1.)], + 347 + ) + .unwrap(), ndarray::array![ [0.10731887817382813, 0.14647412300109863, 0.5851038694381714], [0.9840304851531982, 0.7633365392684937, 0.19097506999969482], @@ -64,7 +67,12 @@ fn basic_sobol() { #[test] fn scaled_sobol() { assert_eq!( - initialization::sobol::generate(5, &vec![(0., 1.), (0., 2.), (-1., 1.)], 347).unwrap(), + crate::routines::initialization::sobol::generate( + 5, + &vec![(0., 1.), (0., 2.), (-1., 1.)], + 347 + ) + .unwrap(), ndarray::array![ [ 0.10731887817382813, diff --git a/src/logger.rs b/src/routines/logger.rs similarity index 96% rename from src/logger.rs rename to src/routines/logger.rs index 3c73f6555..c2bfb8d3b 100644 --- a/src/logger.rs +++ b/src/routines/logger.rs @@ -1,7 +1,7 @@ use std::time::Instant; -use crate::algorithms::routines::settings::Settings; -use crate::prelude::output::OutputFile; +use crate::routines::output::OutputFile; +use crate::routines::settings::Settings; use anyhow::Result; use tracing_subscriber::fmt::time::FormatTime; use tracing_subscriber::fmt::{self}; diff --git a/src/routines/mod.rs b/src/routines/mod.rs new file mode 100644 index 000000000..25c311da3 --- /dev/null +++ b/src/routines/mod.rs @@ -0,0 +1,16 @@ +// Routines for condensation +pub mod condensation; +// Routines for evaluation +pub mod evaluation; +// Routines for expansion +pub mod expansion; +// Routines for initialization +pub mod initialization; +// Routines for logging +pub mod logger; +// Routines for optimization +pub mod optimization; +// Routines for output +pub mod output; +// Routines for settings +pub mod settings; diff --git a/src/algorithms/routines/optimization/d_optimizer.rs b/src/routines/optimization/mod.rs similarity index 100% rename from src/algorithms/routines/optimization/d_optimizer.rs rename to src/routines/optimization/mod.rs diff --git a/src/algorithms/routines/output.rs b/src/routines/output.rs similarity index 99% rename from src/algorithms/routines/output.rs rename to src/routines/output.rs index b5fb433ce..ec4534ccd 100644 --- a/src/algorithms/routines/output.rs +++ b/src/routines/output.rs @@ -7,7 +7,7 @@ use pharmsol::prelude::data::*; use pharmsol::prelude::simulator::Equation; use serde::Serialize; // use pharmsol::Cache; -use settings::Settings; +use crate::routines::settings::Settings; use std::fs::{create_dir_all, File, OpenOptions}; use std::path::{Path, PathBuf}; /// Defines the result objects from an NPAG run diff --git a/src/algorithms/routines/settings.rs b/src/routines/settings.rs similarity index 100% rename from src/algorithms/routines/settings.rs rename to src/routines/settings.rs