From 51f24e24df03f16db66a99d43d8f1b42416a0a57 Mon Sep 17 00:00:00 2001 From: Markus Date: Mon, 25 May 2026 17:24:24 +0200 Subject: [PATCH 01/47] Refactoring --- src/algorithms/nonparametric/mod.rs | 5 + src/algorithms/nonparametric/npag.rs | 98 +++++++++++++++++++- src/algorithms/nonparametric/npod.rs | 11 +++ src/algorithms/nonparametric/postprob.rs | 12 +++ src/api/estimation_problem.rs | 113 +---------------------- src/api/mod.rs | 3 +- 6 files changed, 128 insertions(+), 114 deletions(-) diff --git a/src/algorithms/nonparametric/mod.rs b/src/algorithms/nonparametric/mod.rs index db8459a86..890cc58aa 100644 --- a/src/algorithms/nonparametric/mod.rs +++ b/src/algorithms/nonparametric/mod.rs @@ -26,5 +26,10 @@ pub use npag::NPAG; pub use npod::NPOD; pub use postprob::POSTPROB; +// Re-export per-algorithm configuration structs +pub use npag::Npag; +pub use npod::Npod; +pub use postprob::PostProb; + // Re-export the NP algorithm trait from parent pub use super::Algorithms as NPAlgorithm; diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index e29c004b8..c1d8b459a 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -2,7 +2,6 @@ use crate::algorithms::{ NativeNonparametricConfig, NonparametricAlgorithmInput, Status, StopReason, }; use crate::api::estimation_problem::NonparametricMethod; -use crate::api::Npag; use crate::estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonparametricWorkspace, Psi, Theta, Weights, }; @@ -24,6 +23,103 @@ use crate::estimation::nonparametric::sample_space_for_parameters; use crate::estimation::nonparametric::adaptative_grid; +use serde::{Deserialize, Serialize}; + +/// Configuration options for the Non-Parametric Adaptive Grid (NPAG) algorithm. +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub struct Npag { + pub eps: f64, + pub min_eps: f64, + pub objective_tolerance: f64, + pub pyl_tolerance: f64, + pub prune_threshold: f64, + pub qr_tolerance: f64, + pub grid_tolerance: f64, + pub error_step: f64, + pub min_error_step: f64, + pub error_step_growth: f64, + pub error_step_shrink: f64, +} + +impl Default for Npag { + fn default() -> Self { + Self { + eps: 0.2, + min_eps: 1e-4, + objective_tolerance: 1e-4, + pyl_tolerance: 1e-2, + prune_threshold: 1e-3, + qr_tolerance: 1e-8, + grid_tolerance: 1e-4, + error_step: 0.1, + min_error_step: 0.01, + error_step_growth: 4.0, + error_step_shrink: 0.5, + } + } +} + +impl Npag { + pub fn new() -> Self { + Self::default() + } + + pub fn eps(mut self, eps: f64) -> Self { + self.eps = eps; + self + } + + pub fn min_eps(mut self, min_eps: f64) -> Self { + self.min_eps = min_eps; + self + } + + pub fn objective_tolerance(mut self, tolerance: f64) -> Self { + self.objective_tolerance = tolerance; + self + } + + pub fn pyl_tolerance(mut self, tolerance: f64) -> Self { + self.pyl_tolerance = tolerance; + self + } + + pub fn prune_threshold(mut self, threshold: f64) -> Self { + self.prune_threshold = threshold; + self + } + + pub fn qr_tolerance(mut self, tolerance: f64) -> Self { + self.qr_tolerance = tolerance; + self + } + + pub fn grid_tolerance(mut self, tolerance: f64) -> Self { + self.grid_tolerance = tolerance; + self + } + + pub fn error_step(mut self, step: f64) -> Self { + self.error_step = step; + self + } + + pub fn min_error_step(mut self, step: f64) -> Self { + self.min_error_step = step; + self + } + + pub fn error_step_growth(mut self, factor: f64) -> Self { + self.error_step_growth = factor; + self + } + + pub fn error_step_shrink(mut self, factor: f64) -> Self { + self.error_step_shrink = factor; + self + } +} + #[derive(Debug)] pub struct NPAG { equation: E, diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 83476b89e..dfbea6a8f 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -17,10 +17,21 @@ use pharmsol::{ use ndarray::Array1; use rayon::prelude::{IntoParallelRefMutIterator, ParallelIterator}; +use serde::{Deserialize, Serialize}; const THETA_F: f64 = 1e-2; const THETA_D: f64 = 1e-4; +/// Configuration options for the Non-Parametric Optimal Design (NPOD) algorithm. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +pub struct Npod; + +impl Npod { + pub fn new() -> Self { + Self + } +} + pub struct NPOD { equation: E, psi: Psi, diff --git a/src/algorithms/nonparametric/postprob.rs b/src/algorithms/nonparametric/postprob.rs index 3e778b009..db6f049e2 100644 --- a/src/algorithms/nonparametric/postprob.rs +++ b/src/algorithms/nonparametric/postprob.rs @@ -15,6 +15,18 @@ use pharmsol::prelude::{ use crate::estimation::nonparametric::ipm::burke; use crate::estimation::nonparametric::sample_space_for_parameters; +use serde::{Deserialize, Serialize}; + +/// Configuration options for the posterior probability reweighting algorithm. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +pub struct PostProb; + +impl PostProb { + pub fn new() -> Self { + Self + } +} + /// Posterior probability algorithm /// Reweights the prior probabilities to the observed data and error model pub struct POSTPROB { diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index b82af45ec..79d42fd99 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -2,6 +2,7 @@ use anyhow::Result; use pharmsol::{AssayErrorModel, AssayErrorModels, Data, Equation}; use serde::{Deserialize, Serialize}; +use crate::algorithms::nonparametric::{Npag, Npod, PostProb}; use crate::algorithms::Algorithm; use crate::api::error_models::ErrorModels; use crate::api::SaemConfig; @@ -21,118 +22,6 @@ pub trait MethodSpec { fn attach(self, builder: EstimationProblemBuilder) -> Self::Builder; } -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] -pub struct Npag { - pub eps: f64, - pub min_eps: f64, - pub objective_tolerance: f64, - pub pyl_tolerance: f64, - pub prune_threshold: f64, - pub qr_tolerance: f64, - pub grid_tolerance: f64, - pub error_step: f64, - pub min_error_step: f64, - pub error_step_growth: f64, - pub error_step_shrink: f64, -} - -impl Default for Npag { - fn default() -> Self { - Self { - eps: 0.2, - min_eps: 1e-4, - objective_tolerance: 1e-4, - pyl_tolerance: 1e-2, - prune_threshold: 1e-3, - qr_tolerance: 1e-8, - grid_tolerance: 1e-4, - error_step: 0.1, - min_error_step: 0.01, - error_step_growth: 4.0, - error_step_shrink: 0.5, - } - } -} - -impl Npag { - pub fn new() -> Self { - Self::default() - } - - pub fn eps(mut self, eps: f64) -> Self { - self.eps = eps; - self - } - - pub fn min_eps(mut self, min_eps: f64) -> Self { - self.min_eps = min_eps; - self - } - - pub fn objective_tolerance(mut self, tolerance: f64) -> Self { - self.objective_tolerance = tolerance; - self - } - - pub fn pyl_tolerance(mut self, tolerance: f64) -> Self { - self.pyl_tolerance = tolerance; - self - } - - pub fn prune_threshold(mut self, threshold: f64) -> Self { - self.prune_threshold = threshold; - self - } - - pub fn qr_tolerance(mut self, tolerance: f64) -> Self { - self.qr_tolerance = tolerance; - self - } - - pub fn grid_tolerance(mut self, tolerance: f64) -> Self { - self.grid_tolerance = tolerance; - self - } - - pub fn error_step(mut self, step: f64) -> Self { - self.error_step = step; - self - } - - pub fn min_error_step(mut self, step: f64) -> Self { - self.min_error_step = step; - self - } - - pub fn error_step_growth(mut self, factor: f64) -> Self { - self.error_step_growth = factor; - self - } - - pub fn error_step_shrink(mut self, factor: f64) -> Self { - self.error_step_shrink = factor; - self - } -} - -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] -pub struct Npod; - -impl Npod { - pub fn new() -> Self { - Self - } -} - -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] -pub struct PostProb; - -impl PostProb { - pub fn new() -> Self { - Self - } -} - #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub(crate) enum NonparametricMethod { Npag(Npag), diff --git a/src/api/mod.rs b/src/api/mod.rs index 811abc0c5..03887a297 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -5,10 +5,11 @@ pub mod model_definition; pub mod progress; pub mod saem_config; +pub use crate::algorithms::nonparametric::{Npag, Npod, PostProb}; pub use error_models::ErrorModels; pub use estimation_problem::{ AlgorithmTuning, ConvergenceOptions, EstimationProblem, EstimationProblemBuilder, MethodSpec, - NonparametricEstimationProblemBuilder, Npag, Npod, OutputPlan, PostProb, RuntimeOptions, + NonparametricEstimationProblemBuilder, OutputPlan, RuntimeOptions, }; pub use fit::{fit, fit_with_progress}; pub use model_definition::{ModelDefinition, ModelDefinitionBuilder}; From 47ce30c596e6e59438a368a93c757edc042da87b Mon Sep 17 00:00:00 2001 From: Markus Date: Mon, 25 May 2026 18:14:21 +0200 Subject: [PATCH 02/47] Refactor --- src/algorithms/mod.rs | 64 ++++++++++++++---- src/algorithms/nonparametric/npag.rs | 9 ++- src/api/estimation_problem.rs | 80 +++++------------------ src/api/mod.rs | 2 +- src/bestdose/posterior.rs | 2 +- src/compile/compiled_problem.rs | 13 ++-- src/compile/mod.rs | 2 +- src/estimation/nonparametric/engine.rs | 4 +- src/estimation/nonparametric/summaries.rs | 2 +- src/lib.rs | 2 +- src/results/diagnostics.rs | 2 +- tests/api_smoke_tests.rs | 2 +- tests/compile_layer_tests.rs | 2 +- 13 files changed, 85 insertions(+), 101 deletions(-) diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index d0b11adb9..af871b28b 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -2,7 +2,6 @@ use std::fs; use std::path::Path; use std::time::Instant; -use crate::api::estimation_problem::NonparametricMethod; use crate::api::{OutputPlan, RuntimeOptions}; use crate::estimation::nonparametric::{NonparametricWorkspace, Prior, Psi, Theta}; use crate::model::{ModelDefinition, ParameterSpace}; @@ -14,6 +13,7 @@ use ndarray::{Array, ArrayBase, Dim, OwnedRepr}; use nonparametric::npag::*; use nonparametric::npod::NPOD; use nonparametric::postprob::POSTPROB; +use nonparametric::{Npag, Npod, PostProb}; use pharmsol::prelude::{data::Data, simulator::Equation}; use pharmsol::AssayErrorModels; use pharmsol::{Predictions, Subject}; @@ -24,7 +24,7 @@ pub mod nonparametric; #[derive(Debug, Clone)] pub(crate) struct NonparametricAlgorithmInput { - pub method: NonparametricMethod, + pub algorithm: Algorithm, pub equation: E, pub data: Data, pub parameter_space: ParameterSpace, @@ -45,7 +45,7 @@ pub(crate) struct NativeNonparametricConfig { impl NonparametricAlgorithmInput { pub(crate) fn new( - method: NonparametricMethod, + algorithm: Algorithm, model: ModelDefinition, data: Data, error_models: AssayErrorModels, @@ -59,7 +59,7 @@ impl NonparametricAlgorithmInput { } = model; Self { - method, + algorithm, equation, data, parameter_space: parameters, @@ -70,7 +70,7 @@ impl NonparametricAlgorithmInput { } pub(crate) fn algorithm(&self) -> Algorithm { - self.method.algorithm() + self.algorithm } pub(crate) fn error_models(&self) -> &pharmsol::prelude::data::AssayErrorModels { @@ -115,15 +115,18 @@ impl NonparametricAlgorithmInput { /// Algorithm type enumeration /// -/// This enum represents the baseline algorithms available on the structure branch. +/// Lists every estimation algorithm implemented in `PMcore` together with its +/// configuration payload. Convert from a configuration struct via [`From`] +/// (e.g. `Algorithm::from(Npag::new())`) or pass the configuration directly to +/// [`EstimationProblemBuilder::method`](crate::api::EstimationProblemBuilder::method). #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] pub enum Algorithm { /// Non-Parametric Adaptive Grid - NPAG, + NPAG(Npag), /// Non-Parametric Optimal Design - NPOD, + NPOD(Npod), /// Posterior Probability calculation - POSTPROB, + POSTPROB(PostProb), } impl Algorithm { @@ -131,9 +134,42 @@ impl Algorithm { pub fn is_nonparametric(&self) -> bool { matches!( self, - Algorithm::NPAG | Algorithm::NPOD | Algorithm::POSTPROB + Algorithm::NPAG(_) | Algorithm::NPOD(_) | Algorithm::POSTPROB(_) ) } + + /// Short identifier (e.g. `"NPAG"`) suitable for logs and reports. + pub fn name(&self) -> &'static str { + match self { + Algorithm::NPAG(_) => "NPAG", + Algorithm::NPOD(_) => "NPOD", + Algorithm::POSTPROB(_) => "POSTPROB", + } + } +} + +impl std::fmt::Display for Algorithm { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(self.name()) + } +} + +impl From for Algorithm { + fn from(value: Npag) -> Self { + Algorithm::NPAG(value) + } +} + +impl From for Algorithm { + fn from(value: Npod) -> Self { + Algorithm::NPOD(value) + } +} + +impl From for Algorithm { + fn from(value: PostProb) -> Self { + Algorithm::POSTPROB(value) + } } pub trait Algorithms: Sync + Send + 'static { @@ -418,16 +454,16 @@ pub trait Algorithms: Sync + Send + 'static { pub(crate) fn dispatch_nonparametric_algorithm( input: NonparametricAlgorithmInput, ) -> Result>> { - match input.method { - NonparametricMethod::Npag(_) => { + match input.algorithm { + Algorithm::NPAG(_) => { let algorithm: Box> = NPAG::from_input(input)?; Ok(algorithm) } - NonparametricMethod::Npod(_) => { + Algorithm::NPOD(_) => { let algorithm: Box> = NPOD::from_input(input)?; Ok(algorithm) } - NonparametricMethod::PostProb(_) => { + Algorithm::POSTPROB(_) => { let algorithm: Box> = POSTPROB::from_input(input)?; Ok(algorithm) } diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index c1d8b459a..d1e92f0eb 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,7 +1,6 @@ use crate::algorithms::{ NativeNonparametricConfig, NonparametricAlgorithmInput, Status, StopReason, }; -use crate::api::estimation_problem::NonparametricMethod; use crate::estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonparametricWorkspace, Psi, Theta, Weights, }; @@ -178,9 +177,9 @@ impl NPAG { } pub(crate) fn from_input(input: NonparametricAlgorithmInput) -> Result> { - let method = match input.method { - NonparametricMethod::Npag(method) => method, - _ => unreachable!("NPAG::from_input requires an NPAG method"), + let method = match input.algorithm { + crate::algorithms::Algorithm::NPAG(method) => method, + _ => unreachable!("NPAG::from_input requires an NPAG algorithm"), }; let config = input.native_config()?; let error_models = input.error_models().clone(); @@ -588,7 +587,7 @@ mod tests { )?; let input = NonparametricAlgorithmInput::new( - NonparametricMethod::Npag(method), + crate::algorithms::Algorithm::NPAG(method), model, simple_data(), error_models, diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index 79d42fd99..4db49c8ab 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -2,7 +2,6 @@ use anyhow::Result; use pharmsol::{AssayErrorModel, AssayErrorModels, Data, Equation}; use serde::{Deserialize, Serialize}; -use crate::algorithms::nonparametric::{Npag, Npod, PostProb}; use crate::algorithms::Algorithm; use crate::api::error_models::ErrorModels; use crate::api::SaemConfig; @@ -12,57 +11,6 @@ use crate::model::{ Parameter, VariabilityModel, }; -// ============================================================================= -// Method selection -// ============================================================================= - -pub trait MethodSpec { - type Builder; - - fn attach(self, builder: EstimationProblemBuilder) -> Self::Builder; -} - -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] -pub(crate) enum NonparametricMethod { - Npag(Npag), - Npod(Npod), - PostProb(PostProb), -} - -impl NonparametricMethod { - pub fn algorithm(self) -> Algorithm { - match self { - Self::Npag(_) => Algorithm::NPAG, - Self::Npod(_) => Algorithm::NPOD, - Self::PostProb(_) => Algorithm::POSTPROB, - } - } -} - -impl MethodSpec for Npag { - type Builder = NonparametricEstimationProblemBuilder; - - fn attach(self, builder: EstimationProblemBuilder) -> Self::Builder { - NonparametricEstimationProblemBuilder::new(builder, NonparametricMethod::Npag(self)) - } -} - -impl MethodSpec for Npod { - type Builder = NonparametricEstimationProblemBuilder; - - fn attach(self, builder: EstimationProblemBuilder) -> Self::Builder { - NonparametricEstimationProblemBuilder::new(builder, NonparametricMethod::Npod(self)) - } -} - -impl MethodSpec for PostProb { - type Builder = NonparametricEstimationProblemBuilder; - - fn attach(self, builder: EstimationProblemBuilder) -> Self::Builder { - NonparametricEstimationProblemBuilder::new(builder, NonparametricMethod::PostProb(self)) - } -} - #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(default)] pub struct OutputPlan { @@ -156,7 +104,7 @@ pub struct EstimationProblem { pub(crate) model: ModelDefinition, pub(crate) data: Data, pub(crate) error_models: ErrorModels, - pub(crate) method: NonparametricMethod, + pub(crate) algorithm: Algorithm, pub(crate) output: OutputPlan, pub(crate) runtime: RuntimeOptions, } @@ -193,8 +141,14 @@ pub struct EstimationProblemBuilder { } impl EstimationProblemBuilder { - pub fn method(self, method: M) -> M::Builder { - method.attach(self) + /// Select the estimation algorithm. Accepts any algorithm configuration + /// (e.g. [`Npag`](crate::algorithms::nonparametric::Npag)) that converts + /// into [`Algorithm`]. + pub fn method( + self, + algorithm: impl Into, + ) -> NonparametricEstimationProblemBuilder { + NonparametricEstimationProblemBuilder::new(self, algorithm.into()) } pub fn output_dir(self, path: impl Into) -> Self { @@ -314,15 +268,15 @@ impl EstimationProblemBuilder { pub struct NonparametricEstimationProblemBuilder { builder: EstimationProblemBuilder, - method: NonparametricMethod, + algorithm: Algorithm, error_models: Option, } impl NonparametricEstimationProblemBuilder { - fn new(builder: EstimationProblemBuilder, method: NonparametricMethod) -> Self { + fn new(builder: EstimationProblemBuilder, algorithm: Algorithm) -> Self { Self { builder, - method, + algorithm, error_models: None, } } @@ -361,13 +315,13 @@ impl NonparametricEstimationProblemBuilder { ) -> Self { let NonparametricEstimationProblemBuilder { builder, - method, + algorithm, error_models, } = self; Self { builder: map(builder), - method, + algorithm, error_models, } } @@ -415,7 +369,7 @@ impl NonparametricEstimationProblemBuilder model, data: self.builder.data, error_models: ErrorModels::Nonparametric(error_models), - method: self.method, + algorithm: self.algorithm, output: self.builder.output.unwrap_or_default(), runtime: self.builder.runtime.unwrap_or_default(), }) @@ -427,13 +381,13 @@ impl NonparametricEstimationProblemBuilder ) -> Result { let NonparametricEstimationProblemBuilder { builder, - method, + algorithm, error_models, } = self; Ok(Self { builder: map(builder)?, - method, + algorithm, error_models, }) } diff --git a/src/api/mod.rs b/src/api/mod.rs index 03887a297..3a02a9a4f 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -8,7 +8,7 @@ pub mod saem_config; pub use crate::algorithms::nonparametric::{Npag, Npod, PostProb}; pub use error_models::ErrorModels; pub use estimation_problem::{ - AlgorithmTuning, ConvergenceOptions, EstimationProblem, EstimationProblemBuilder, MethodSpec, + AlgorithmTuning, ConvergenceOptions, EstimationProblem, EstimationProblemBuilder, NonparametricEstimationProblemBuilder, OutputPlan, RuntimeOptions, }; pub use fit::{fit, fit_with_progress}; diff --git a/src/bestdose/posterior.rs b/src/bestdose/posterior.rs index 5e06e7dfe..3d98c5fd5 100644 --- a/src/bestdose/posterior.rs +++ b/src/bestdose/posterior.rs @@ -223,7 +223,7 @@ pub fn npagfull_refinement( max_cycles: config.refinement_cycles(), progress: config.progress(), run_configuration: crate::output::shared::RunConfiguration::new( - Algorithm::NPAG, + Algorithm::NPAG(Npag::default()), &OutputPlan::disabled(), &runtime, config.parameter_names(), diff --git a/src/compile/compiled_problem.rs b/src/compile/compiled_problem.rs index ec010b449..357fb2eef 100644 --- a/src/compile/compiled_problem.rs +++ b/src/compile/compiled_problem.rs @@ -1,7 +1,6 @@ use pharmsol::equation::Equation; use crate::algorithms::Algorithm; -use crate::api::estimation_problem::NonparametricMethod; use crate::api::{ErrorModels, OutputPlan, RuntimeOptions}; use crate::compile::{DesignContext, ExecutionCaches, ObservationIndex}; use crate::model::ModelDefinition; @@ -12,7 +11,7 @@ pub struct CompiledProblem { pub model: ModelDefinition, pub data: Data, error_models: ErrorModels, - method: NonparametricMethod, + algorithm: Algorithm, output: OutputPlan, runtime: RuntimeOptions, pub design: DesignContext, @@ -26,7 +25,7 @@ impl CompiledProblem { model: ModelDefinition, data: Data, error_models: ErrorModels, - method: NonparametricMethod, + algorithm: Algorithm, output: OutputPlan, runtime: RuntimeOptions, design: DesignContext, @@ -37,7 +36,7 @@ impl CompiledProblem { model, data, error_models, - method, + algorithm, output, runtime, design, @@ -46,12 +45,8 @@ impl CompiledProblem { } } - pub(crate) fn method(&self) -> NonparametricMethod { - self.method - } - pub fn algorithm(&self) -> Algorithm { - self.method.algorithm() + self.algorithm } pub fn error_models(&self) -> &ErrorModels { diff --git a/src/compile/mod.rs b/src/compile/mod.rs index 9484b559f..167ef817c 100644 --- a/src/compile/mod.rs +++ b/src/compile/mod.rs @@ -44,7 +44,7 @@ pub fn compile_problem( problem.model, problem.data, problem.error_models, - problem.method, + problem.algorithm, problem.output, problem.runtime, design, diff --git a/src/estimation/nonparametric/engine.rs b/src/estimation/nonparametric/engine.rs index 3f07e8607..f5e91b719 100644 --- a/src/estimation/nonparametric/engine.rs +++ b/src/estimation/nonparametric/engine.rs @@ -48,13 +48,13 @@ impl NonparametricEngine { fn input_from_compiled_problem( problem: CompiledProblem, ) -> Result> { - let method = problem.method(); + let algorithm = problem.algorithm(); let error_models = problem.error_models().models().clone(); let output = problem.output_plan().clone(); let runtime = problem.runtime_options().clone(); let (model, data) = problem.into_parts(); Ok(NonparametricAlgorithmInput::new( - method, + algorithm, model, data, error_models, diff --git a/src/estimation/nonparametric/summaries.rs b/src/estimation/nonparametric/summaries.rs index e0d145af9..0425ea8c0 100644 --- a/src/estimation/nonparametric/summaries.rs +++ b/src/estimation/nonparametric/summaries.rs @@ -13,7 +13,7 @@ pub fn fit_summary(result: &NonparametricWorkspace) -> FitSummar subject_count: result.data().subjects().len(), observation_count: count_observations(result.data()), parameter_count: result.get_theta().parameters().len(), - algorithm: format!("{:?}", result.algorithm()), + algorithm: result.algorithm().to_string(), } } diff --git a/src/lib.rs b/src/lib.rs index 7018af0c0..88c85f370 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -64,7 +64,7 @@ pub mod prelude { pub use crate::api::fit_with_progress; pub use crate::api::{ AlgorithmTuning, ConvergenceOptions, ErrorModels, EstimationProblem, FitProgress, - MethodSpec, ModelDefinition, NonparametricCycleProgress, Npag, Npod, OutputPlan, PostProb, + ModelDefinition, NonparametricCycleProgress, Npag, Npod, OutputPlan, PostProb, RuntimeOptions, }; pub use crate::compile::{CompiledProblem, DesignContext, ObservationIndex}; diff --git a/src/results/diagnostics.rs b/src/results/diagnostics.rs index cfeaf2b5a..b88e1d495 100644 --- a/src/results/diagnostics.rs +++ b/src/results/diagnostics.rs @@ -31,7 +31,7 @@ pub(crate) fn nonparametric_diagnostics( .unwrap_or_else(|| "Continue".to_string()); let mut estimator_metadata = BTreeMap::new(); - estimator_metadata.insert("algorithm".to_string(), format!("{:?}", result.algorithm())); + estimator_metadata.insert("algorithm".to_string(), result.algorithm().to_string()); estimator_metadata.insert("status".to_string(), status); estimator_metadata.insert( "outputs_requested".to_string(), diff --git a/tests/api_smoke_tests.rs b/tests/api_smoke_tests.rs index db82f8655..2ccba6864 100644 --- a/tests/api_smoke_tests.rs +++ b/tests/api_smoke_tests.rs @@ -149,7 +149,7 @@ fn test_problem_compile_preserves_runtime_configuration() -> Result<()> { .build()? .compile()?; - assert_eq!(compiled.algorithm(), Algorithm::NPAG); + assert_eq!(compiled.algorithm().name(), "NPAG"); assert!(!compiled.output_plan().write); assert_eq!(compiled.runtime_options().cycles, 7); assert!(!compiled.runtime_options().cache); diff --git a/tests/compile_layer_tests.rs b/tests/compile_layer_tests.rs index 46f6900bb..19f7b2266 100644 --- a/tests/compile_layer_tests.rs +++ b/tests/compile_layer_tests.rs @@ -86,7 +86,7 @@ fn test_compile_problem_builds_indexes() -> Result<()> { fn test_compile_problem_builds_algorithm_settings() -> Result<()> { let compiled = simple_problem()?.compile()?; - assert_eq!(compiled.algorithm(), Algorithm::NPAG); + assert_eq!(compiled.algorithm().name(), "NPAG"); assert_eq!(compiled.design.parameter_names.len(), 2); assert!(!compiled.output_plan().write); Ok(()) From 786d1548c06135eb0acf9554603c26f88ee945a2 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Tue, 26 May 2026 13:17:34 +0200 Subject: [PATCH 03/47] Rename method --- examples/bimodal_ke/main.rs | 2 +- examples/bimodal_ke_backend_compare.rs | 2 +- examples/drusano/main.rs | 2 +- examples/iov/main.rs | 2 +- examples/meta/main.rs | 2 +- examples/neely/main.rs | 2 +- examples/new_iov/main.rs | 2 +- examples/theophylline/main.rs | 2 +- examples/two_eq_lag/main.rs | 2 +- examples/vanco_sde/main.rs | 2 +- src/api/estimation_problem.rs | 2 +- src/api/fit.rs | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 447e8cc17..9b33ffc72 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -24,7 +24,7 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/bimodal_ke/bimodal_ke.csv")?; let _result = EstimationProblem::builder(eq, data) - .method(Npag::default()) + .algorithm(Npag::default()) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? .error( diff --git a/examples/bimodal_ke_backend_compare.rs b/examples/bimodal_ke_backend_compare.rs index 52e99ad13..6c602025b 100644 --- a/examples/bimodal_ke_backend_compare.rs +++ b/examples/bimodal_ke_backend_compare.rs @@ -205,7 +205,7 @@ fn run_case Result<()> { .parameter(Parameter::bounded("h2s", 0.1, 4.0))? .parameter(Parameter::bounded("h1r1", 5.0, 25.0))? .parameter(Parameter::bounded("h2r2", 10.0, 22.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), diff --git a/examples/iov/main.rs b/examples/iov/main.rs index 5d95ba56a..6851f6146 100644 --- a/examples/iov/main.rs +++ b/examples/iov/main.rs @@ -29,7 +29,7 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/iov/test.csv").unwrap(); EstimationProblem::builder(sde, data) .parameter(Parameter::bounded("ke0", 0.001, 2.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), diff --git a/examples/meta/main.rs b/examples/meta/main.rs index 644cba6a6..e86b9a640 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -47,7 +47,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("vs", 1.0, 10.0)) .unwrap() - .method(Npod::new()) + .algorithm(Npod::new()) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), diff --git a/examples/neely/main.rs b/examples/neely/main.rs index 5f5e7d7fa..a049b55e7 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -68,7 +68,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("theta2", -2.0, 0.5)) .unwrap() - .method(Npag::new()) + .algorithm(Npag::new()) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index 550899020..8a5c9cb42 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -31,7 +31,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("ske", 0.0001, 0.2)) .unwrap() - .method(Npag::new()) + .algorithm(Npag::new()) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index 73f994bc2..ee3bfc906 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -23,7 +23,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("v", 0.001, 50.0)) .unwrap() - .method(Npag::new()) + .algorithm(Npag::new()) .error( "outeq_0", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index e137d6a70..107c8ac99 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -31,7 +31,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("v", 30.0, 120.0)) .unwrap() - .method(Npag::new()) + .algorithm(Npag::new()) .error( "outeq_0", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index 5b9e22ec4..3842b6c7f 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -61,7 +61,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("ske", 0.0001, 0.2)) .unwrap() - .method(Npag::new()) + .algorithm(Npag::new()) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index 4db49c8ab..fa65d378e 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -144,7 +144,7 @@ impl EstimationProblemBuilder { /// Select the estimation algorithm. Accepts any algorithm configuration /// (e.g. [`Npag`](crate::algorithms::nonparametric::Npag)) that converts /// into [`Algorithm`]. - pub fn method( + pub fn algorithm( self, algorithm: impl Into, ) -> NonparametricEstimationProblemBuilder { diff --git a/src/api/fit.rs b/src/api/fit.rs index e9f0a553b..d4f5cb351 100644 --- a/src/api/fit.rs +++ b/src/api/fit.rs @@ -82,7 +82,7 @@ mod tests { let problem = EstimationProblem::builder(equation(), data) .parameter(Parameter::bounded("ke", 0.05, 1.0))? .parameter(Parameter::bounded("v", 5.0, 50.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error("0", assay_error)? .progress(false) .prior(Prior::sobol(8, 7)) From c5121c5fc45d320456016efa3650273e6b1b8f18 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Tue, 26 May 2026 13:20:16 +0200 Subject: [PATCH 04/47] Rename method --- benches/bimodal_ke.rs | 6 +++--- tests/acceptance_baseline_tests.rs | 2 +- tests/api_smoke_tests.rs | 4 ++-- tests/compile_layer_tests.rs | 4 ++-- tests/nonparametric_engine_tests.rs | 2 +- tests/onecomp.rs | 6 +++--- tests/results_summary_tests.rs | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index 25ba91ea8..232453338 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -35,7 +35,7 @@ fn setup_npag() -> Result> { EstimationProblem::builder(create_equation(), data) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error("outeq_1", create_error_model())? .progress(false) .prior(Prior::sobol(2048, 22)) @@ -47,7 +47,7 @@ fn setup_npod() -> Result> { EstimationProblem::builder(create_equation(), data) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? - .method(Npod::new()) + .algorithm(Npod::new()) .error("outeq_1", create_error_model())? .progress(false) .prior(Prior::sobol(2048, 22)) @@ -59,7 +59,7 @@ fn setup_postprob() -> Result> { EstimationProblem::builder(create_equation(), data) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? - .method(PostProb::new()) + .algorithm(PostProb::new()) .error("outeq_1", create_error_model())? .progress(false) .prior(Prior::sobol(2048, 22)) diff --git a/tests/acceptance_baseline_tests.rs b/tests/acceptance_baseline_tests.rs index 933c3198e..11685d4a1 100644 --- a/tests/acceptance_baseline_tests.rs +++ b/tests/acceptance_baseline_tests.rs @@ -37,7 +37,7 @@ fn test_acceptance_baseline_npag_bimodal_ke() -> Result<()> { let result = EstimationProblem::builder(bimodal_ode_equation(), bimodal_data()?) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error( "1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), diff --git a/tests/api_smoke_tests.rs b/tests/api_smoke_tests.rs index 2ccba6864..537ba9807 100644 --- a/tests/api_smoke_tests.rs +++ b/tests/api_smoke_tests.rs @@ -104,7 +104,7 @@ fn test_unified_fit_nonparametric_smoke() -> Result<()> { let result = EstimationProblem::builder(simple_equation(), simple_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error("0", assay_error)? .progress(false) .fit()?; @@ -138,7 +138,7 @@ fn test_problem_compile_preserves_runtime_configuration() -> Result<()> { let compiled = EstimationProblem::builder(simple_equation(), simple_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error("0", assay_error)? .cache(false) .progress(false) diff --git a/tests/compile_layer_tests.rs b/tests/compile_layer_tests.rs index 19f7b2266..509ff7a16 100644 --- a/tests/compile_layer_tests.rs +++ b/tests/compile_layer_tests.rs @@ -66,7 +66,7 @@ fn simple_problem() -> Result> { EstimationProblem::builder(simple_equation(), multi_subject_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error("0", assay_error)? .build() } @@ -110,7 +110,7 @@ fn test_compile_problem_extracts_structured_covariate_values() -> Result<()> { vec![vec![true], vec![false]], )?), })) - .method(Npag::new()) + .algorithm(Npag::new()) .error("0", assay_error)? .build()? .compile()?; diff --git a/tests/nonparametric_engine_tests.rs b/tests/nonparametric_engine_tests.rs index ba2b12ef5..c13f3c917 100644 --- a/tests/nonparametric_engine_tests.rs +++ b/tests/nonparametric_engine_tests.rs @@ -45,7 +45,7 @@ fn test_nonparametric_engine_returns_workspace() -> Result<()> { let compiled = EstimationProblem::builder(simple_equation(), simple_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error("0", assay_error)? .progress(false) .build()? diff --git a/tests/onecomp.rs b/tests/onecomp.rs index 7064c8d53..0fb4bbbff 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -55,7 +55,7 @@ fn test_one_compartment_npag() -> Result<()> { let result = EstimationProblem::builder(eq, data) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), @@ -119,7 +119,7 @@ fn test_one_compartment_npod() -> Result<()> { let result = EstimationProblem::builder(eq, data) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .method(Npod::new()) + .algorithm(Npod::new()) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), @@ -183,7 +183,7 @@ fn test_one_compartment_postprob() -> Result<()> { let result = EstimationProblem::builder(eq, data) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .method(PostProb::new()) + .algorithm(PostProb::new()) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index 44dd13fe8..441f47aac 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -45,7 +45,7 @@ fn test_nonparametric_fit_result_summary_surface() -> Result<()> { let result = EstimationProblem::builder(simple_equation(), simple_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .method(Npag::new()) + .algorithm(Npag::new()) .error("0", assay_error)? .progress(false) .fit()?; From d8529a838c961ebf14d3c0584a7fcbffb5f3b491 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Tue, 26 May 2026 13:38:26 +0200 Subject: [PATCH 05/47] Refactor --- src/algorithms/mod.rs | 6 +- src/algorithms/nonparametric/npag.rs | 3 +- src/api/estimation_problem.rs | 53 ++------------ src/api/fit.rs | 8 +-- src/api/mod.rs | 2 +- src/bestdose/posterior.rs | 1 - src/compile/compiled_problem.rs | 9 +-- src/compile/mod.rs | 1 - src/estimation/nonparametric/engine.rs | 2 - src/estimation/nonparametric/workspace.rs | 20 ++---- src/lib.rs | 6 +- src/output/nonparametric.rs | 11 ++- src/output/shared.rs | 23 +----- src/output/writer.rs | 16 ++--- src/results/artifacts.rs | 88 ----------------------- src/results/diagnostics.rs | 59 --------------- src/results/fit_result.rs | 28 +------- src/results/mod.rs | 12 +--- src/results/predictions.rs | 38 ---------- tests/api_smoke_tests.rs | 1 - tests/compile_layer_tests.rs | 1 - tests/results_summary_tests.rs | 16 +---- 22 files changed, 37 insertions(+), 367 deletions(-) delete mode 100644 src/results/artifacts.rs delete mode 100644 src/results/diagnostics.rs delete mode 100644 src/results/predictions.rs diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index af871b28b..38ec8cebd 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -2,7 +2,7 @@ use std::fs; use std::path::Path; use std::time::Instant; -use crate::api::{OutputPlan, RuntimeOptions}; +use crate::api::RuntimeOptions; use crate::estimation::nonparametric::{NonparametricWorkspace, Prior, Psi, Theta}; use crate::model::{ModelDefinition, ParameterSpace}; use crate::output::shared::RunConfiguration; @@ -29,7 +29,6 @@ pub(crate) struct NonparametricAlgorithmInput { pub data: Data, pub parameter_space: ParameterSpace, pub error_models: AssayErrorModels, - pub output: OutputPlan, pub runtime: RuntimeOptions, } @@ -49,7 +48,6 @@ impl NonparametricAlgorithmInput { model: ModelDefinition, data: Data, error_models: AssayErrorModels, - output: OutputPlan, runtime: RuntimeOptions, ) -> Self { let ModelDefinition { @@ -64,7 +62,6 @@ impl NonparametricAlgorithmInput { data, parameter_space: parameters, error_models, - output, runtime, } } @@ -92,7 +89,6 @@ impl NonparametricAlgorithmInput { pub(crate) fn run_configuration(&self) -> RunConfiguration { RunConfiguration::new( self.algorithm(), - &self.output, &self.runtime, self.parameter_space .iter() diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index d1e92f0eb..343b00cba 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -520,7 +520,7 @@ impl Algorithms for NPAG { #[cfg(test)] mod tests { use super::*; - use crate::api::{OutputPlan, RuntimeOptions}; + use crate::api::RuntimeOptions; use crate::model::{ModelDefinition, Parameter}; use pharmsol::{fa, fetch_params, lag, AssayErrorModel, ErrorPoly, Subject, SubjectBuilderExt}; @@ -591,7 +591,6 @@ mod tests { model, simple_data(), error_models, - OutputPlan::disabled(), RuntimeOptions::default(), ); diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index fa65d378e..e3a240456 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -11,28 +11,6 @@ use crate::model::{ Parameter, VariabilityModel, }; -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(default)] -pub struct OutputPlan { - pub write: bool, - pub path: Option, -} - -impl OutputPlan { - pub fn disabled() -> Self { - Self { - write: false, - path: None, - } - } -} - -impl Default for OutputPlan { - fn default() -> Self { - Self::disabled() - } -} - #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(default)] pub struct ConvergenceOptions { @@ -105,7 +83,6 @@ pub struct EstimationProblem { pub(crate) data: Data, pub(crate) error_models: ErrorModels, pub(crate) algorithm: Algorithm, - pub(crate) output: OutputPlan, pub(crate) runtime: RuntimeOptions, } @@ -114,7 +91,6 @@ impl EstimationProblem { EstimationProblemBuilder { model: ModelDefinition::builder(equation), data, - output: Some(OutputPlan::default()), runtime: Some(RuntimeOptions::default()), } } @@ -136,7 +112,6 @@ impl EstimationPr pub struct EstimationProblemBuilder { model: ModelDefinitionBuilder, data: Data, - output: Option, runtime: Option, } @@ -151,20 +126,6 @@ impl EstimationProblemBuilder { NonparametricEstimationProblemBuilder::new(self, algorithm.into()) } - pub fn output_dir(self, path: impl Into) -> Self { - self.with_output_plan(|output| { - output.write = true; - output.path = Some(path.into()); - }) - } - - pub fn no_output(self) -> Self { - self.with_output_plan(|output| { - output.write = false; - output.path = None; - }) - } - pub fn cycles(self, cycles: usize) -> Self { self.with_runtime_options(|runtime| runtime.cycles = cycles) } @@ -222,14 +183,14 @@ impl EstimationProblemBuilder { let EstimationProblemBuilder { model, data, - output, + runtime, } = self; Ok(Self { model: map(model)?, data, - output, + runtime, }) } @@ -241,25 +202,20 @@ impl EstimationProblemBuilder { let EstimationProblemBuilder { model, data, - output, + runtime, } = self; Self { model: map(model), data, - output, + runtime, } } } impl EstimationProblemBuilder { - fn with_output_plan(mut self, map: impl FnOnce(&mut OutputPlan)) -> Self { - map(self.output.get_or_insert_with(OutputPlan::default)); - self - } - fn with_runtime_options(mut self, map: impl FnOnce(&mut RuntimeOptions)) -> Self { map(self.runtime.get_or_insert_with(RuntimeOptions::default)); self @@ -370,7 +326,6 @@ impl NonparametricEstimationProblemBuilder data: self.builder.data, error_models: ErrorModels::Nonparametric(error_models), algorithm: self.algorithm, - output: self.builder.output.unwrap_or_default(), runtime: self.builder.runtime.unwrap_or_default(), }) } diff --git a/src/api/fit.rs b/src/api/fit.rs index d4f5cb351..1ec7451a4 100644 --- a/src/api/fit.rs +++ b/src/api/fit.rs @@ -11,8 +11,8 @@ pub fn fit( problem: EstimationProblem, ) -> Result> { let compiled = problem.compile()?; - let mut result = nonparametric::fit(compiled)?; - result.write_outputs()?; + let result = nonparametric::fit(compiled)?; + Ok(result) } @@ -25,10 +25,10 @@ where F: FnMut(FitProgress), { let compiled = problem.compile()?; - let mut result = nonparametric::fit_with_progress(compiled, |event| { + let result = nonparametric::fit_with_progress(compiled, |event| { on_progress(FitProgress::NonparametricCycle(event)); })?; - result.write_outputs()?; + Ok(result) } diff --git a/src/api/mod.rs b/src/api/mod.rs index 3a02a9a4f..85fd9789c 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -9,7 +9,7 @@ pub use crate::algorithms::nonparametric::{Npag, Npod, PostProb}; pub use error_models::ErrorModels; pub use estimation_problem::{ AlgorithmTuning, ConvergenceOptions, EstimationProblem, EstimationProblemBuilder, - NonparametricEstimationProblemBuilder, OutputPlan, RuntimeOptions, + NonparametricEstimationProblemBuilder, RuntimeOptions, }; pub use fit::{fit, fit_with_progress}; pub use model_definition::{ModelDefinition, ModelDefinitionBuilder}; diff --git a/src/bestdose/posterior.rs b/src/bestdose/posterior.rs index 3d98c5fd5..da5e206f4 100644 --- a/src/bestdose/posterior.rs +++ b/src/bestdose/posterior.rs @@ -224,7 +224,6 @@ pub fn npagfull_refinement( progress: config.progress(), run_configuration: crate::output::shared::RunConfiguration::new( Algorithm::NPAG(Npag::default()), - &OutputPlan::disabled(), &runtime, config.parameter_names(), ), diff --git a/src/compile/compiled_problem.rs b/src/compile/compiled_problem.rs index 357fb2eef..288b32f45 100644 --- a/src/compile/compiled_problem.rs +++ b/src/compile/compiled_problem.rs @@ -1,7 +1,7 @@ use pharmsol::equation::Equation; use crate::algorithms::Algorithm; -use crate::api::{ErrorModels, OutputPlan, RuntimeOptions}; +use crate::api::{ErrorModels, RuntimeOptions}; use crate::compile::{DesignContext, ExecutionCaches, ObservationIndex}; use crate::model::ModelDefinition; use pharmsol::Data; @@ -12,7 +12,6 @@ pub struct CompiledProblem { pub data: Data, error_models: ErrorModels, algorithm: Algorithm, - output: OutputPlan, runtime: RuntimeOptions, pub design: DesignContext, pub observation_index: ObservationIndex, @@ -26,7 +25,6 @@ impl CompiledProblem { data: Data, error_models: ErrorModels, algorithm: Algorithm, - output: OutputPlan, runtime: RuntimeOptions, design: DesignContext, observation_index: ObservationIndex, @@ -37,7 +35,6 @@ impl CompiledProblem { data, error_models, algorithm, - output, runtime, design, observation_index, @@ -53,10 +50,6 @@ impl CompiledProblem { &self.error_models } - pub fn output_plan(&self) -> &OutputPlan { - &self.output - } - pub fn runtime_options(&self) -> &RuntimeOptions { &self.runtime } diff --git a/src/compile/mod.rs b/src/compile/mod.rs index 167ef817c..d0d3009e1 100644 --- a/src/compile/mod.rs +++ b/src/compile/mod.rs @@ -45,7 +45,6 @@ pub fn compile_problem( problem.data, problem.error_models, problem.algorithm, - problem.output, problem.runtime, design, observation_index, diff --git a/src/estimation/nonparametric/engine.rs b/src/estimation/nonparametric/engine.rs index f5e91b719..f9a22d94b 100644 --- a/src/estimation/nonparametric/engine.rs +++ b/src/estimation/nonparametric/engine.rs @@ -50,7 +50,6 @@ fn input_from_compiled_problem( ) -> Result> { let algorithm = problem.algorithm(); let error_models = problem.error_models().models().clone(); - let output = problem.output_plan().clone(); let runtime = problem.runtime_options().clone(); let (model, data) = problem.into_parts(); Ok(NonparametricAlgorithmInput::new( @@ -58,7 +57,6 @@ fn input_from_compiled_problem( model, data, error_models, - output, runtime, )) } diff --git a/src/estimation/nonparametric/workspace.rs b/src/estimation/nonparametric/workspace.rs index 16463fa67..7b9a034ab 100644 --- a/src/estimation/nonparametric/workspace.rs +++ b/src/estimation/nonparametric/workspace.rs @@ -92,14 +92,6 @@ impl NonparametricWorkspace { self.run_configuration.algorithm } - pub(crate) fn output_folder(&self) -> &str { - self.run_configuration.output_path() - } - - pub(crate) fn should_write_outputs(&self) -> bool { - self.run_configuration.should_write_outputs() - } - pub(crate) fn prediction_interval(&self) -> (f64, f64) { ( self.run_configuration.runtime.idelta, @@ -137,7 +129,7 @@ impl NonparametricWorkspace { Ok(()) } - pub fn write_theta(&self) -> anyhow::Result<()> { + pub fn write_theta(&self, path: &str) -> anyhow::Result<()> { use anyhow::{bail, Context}; use csv::WriterBuilder; @@ -152,7 +144,7 @@ impl NonparametricWorkspace { ); } - let outputfile = crate::output::OutputFile::new(self.output_folder(), "theta.csv") + let outputfile = crate::output::OutputFile::new(path, "theta.csv") .context("Failed to create output file for theta")?; let mut writer = WriterBuilder::new() @@ -172,12 +164,12 @@ impl NonparametricWorkspace { Ok(()) } - pub fn write_posterior(&self) -> anyhow::Result<()> { + pub fn write_posterior(&self, path: &str) -> anyhow::Result<()> { use csv::WriterBuilder; tracing::debug!("Writing posterior parameter probabilities..."); - let outputfile = crate::output::OutputFile::new(self.output_folder(), "posterior.csv")?; + let outputfile = crate::output::OutputFile::new(path, "posterior.csv")?; let mut writer = WriterBuilder::new() .has_headers(true) @@ -217,12 +209,12 @@ impl NonparametricWorkspace { Ok(()) } - pub fn write_covariates(&self) -> anyhow::Result<()> { + pub fn write_covariates(&self, path: &str) -> anyhow::Result<()> { use csv::WriterBuilder; use pharmsol::Event; tracing::debug!("Writing covariates..."); - let outputfile = crate::output::OutputFile::new(self.output_folder(), "covariates.csv")?; + let outputfile = crate::output::OutputFile::new(path, "covariates.csv")?; let mut writer = WriterBuilder::new() .has_headers(true) .from_writer(outputfile.file()); diff --git a/src/lib.rs b/src/lib.rs index 88c85f370..7b8bd9473 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -64,8 +64,7 @@ pub mod prelude { pub use crate::api::fit_with_progress; pub use crate::api::{ AlgorithmTuning, ConvergenceOptions, ErrorModels, EstimationProblem, FitProgress, - ModelDefinition, NonparametricCycleProgress, Npag, Npod, OutputPlan, PostProb, - RuntimeOptions, + ModelDefinition, NonparametricCycleProgress, Npag, Npod, PostProb, RuntimeOptions, }; pub use crate::compile::{CompiledProblem, DesignContext, ObservationIndex}; pub use crate::estimation::nonparametric::{ @@ -78,8 +77,7 @@ pub mod prelude { ParameterVariability, RandomEffectsSpec, VariabilityModel, }; pub use crate::results::{ - ArtifactIndex, DiagnosticsBundle, FitResult, FitSummary, IndividualSummary, - ParameterSummary, PopulationSummary, PredictionsBundle, + FitResult, FitSummary, IndividualSummary, ParameterSummary, PopulationSummary, }; pub use pharmsol::optimize::effect::get_e2; diff --git a/src/output/nonparametric.rs b/src/output/nonparametric.rs index f0fa9d38b..c91a4d513 100644 --- a/src/output/nonparametric.rs +++ b/src/output/nonparametric.rs @@ -30,14 +30,13 @@ pub(crate) fn output_file_names( pub fn write_nonparametric_outputs( result: &mut NonparametricWorkspace, + path: &str, ) -> Result<()> { let parameter_names = result.get_theta().parameters().names(); - result - .cycle_log() - .write(result.output_folder(), ¶meter_names)?; - result.write_theta()?; - result.write_covariates()?; - result.write_posterior()?; + result.cycle_log().write(path, ¶meter_names)?; + result.write_theta(&path)?; + result.write_covariates(&path)?; + result.write_posterior(&path)?; let (idelta, tad) = result.prediction_interval(); result.calculate_predictions(idelta, tad)?; Ok(()) diff --git a/src/output/shared.rs b/src/output/shared.rs index 4836d84fc..80bc31636 100644 --- a/src/output/shared.rs +++ b/src/output/shared.rs @@ -3,9 +3,9 @@ use csv::WriterBuilder; use serde::Serialize; use crate::algorithms::Algorithm; -use crate::api::{OutputPlan, RuntimeOptions}; +use crate::api::RuntimeOptions; use crate::output::OutputFile; -use crate::results::{DiagnosticsBundle, FitSummary}; +use crate::results::FitSummary; pub(crate) fn shared_output_file_names() -> Vec { vec![ @@ -23,7 +23,6 @@ pub(crate) fn shared_output_file_names() -> Vec { #[derive(Debug, Clone, Serialize)] pub(crate) struct RunConfiguration { pub algorithm: Algorithm, - pub output: OutputPlan, pub runtime: RuntimeOptions, pub parameter_names: Vec, } @@ -31,25 +30,15 @@ pub(crate) struct RunConfiguration { impl RunConfiguration { pub(crate) fn new( algorithm: Algorithm, - output: &OutputPlan, runtime: &RuntimeOptions, parameter_names: Vec, ) -> Self { Self { algorithm, - output: output.clone(), runtime: runtime.clone(), parameter_names, } } - - pub(crate) fn output_path(&self) -> &str { - self.output.path.as_deref().unwrap_or("outputs/") - } - - pub(crate) fn should_write_outputs(&self) -> bool { - self.output.write - } } pub(crate) fn write_settings(folder: &str, configuration: &RunConfiguration) -> Result<()> { @@ -86,14 +75,6 @@ pub fn write_summary(folder: &str, summary: &FitSummary) -> Result<()> { Ok(()) } -pub fn write_diagnostics(folder: &str, diagnostics: &DiagnosticsBundle) -> Result<()> { - let outputfile = OutputFile::new(folder, "diagnostics.json")?; - let mut file = outputfile.file_owned(); - let serialized = serde_json::to_string_pretty(diagnostics)?; - std::io::Write::write_all(&mut file, serialized.as_bytes())?; - Ok(()) -} - pub fn write_csv_rows( folder: &str, file_name: &str, diff --git a/src/output/writer.rs b/src/output/writer.rs index 60ef89a9f..2c4b22410 100644 --- a/src/output/writer.rs +++ b/src/output/writer.rs @@ -6,7 +6,7 @@ use crate::estimation::nonparametric as np_estimation; use crate::estimation::nonparametric::NonparametricWorkspace; use crate::output::{nonparametric as np_output, shared}; use crate::results::FitResult; -use crate::results::{nonparametric_diagnostics, FitSummary}; +use crate::results::FitSummary; #[derive(Debug, Clone, Serialize)] struct SharedPredictionRow { @@ -23,9 +23,9 @@ struct SharedPredictionRow { source_method: String, } -pub fn write_result(result: &mut FitResult) -> Result<()> { +pub fn write_result(result: &mut FitResult, path: &str) -> Result<()> { match result { - FitResult::Nonparametric(inner) => write_nonparametric_result(inner)?, + FitResult::Nonparametric(inner) => write_nonparametric_result(inner, path)?, } Ok(()) @@ -33,16 +33,12 @@ pub fn write_result(result: &mut FitResult) -> Result<()> { pub fn write_nonparametric_result( result: &mut NonparametricWorkspace, + path: &str, ) -> Result<()> { - if !result.should_write_outputs() { - return Ok(()); - } - - let folder = result.output_folder().to_string(); + let folder = &path.to_string(); shared::write_settings(&folder, result.run_configuration())?; shared::write_summary(&folder, &nonparametric_summary(result))?; - shared::write_diagnostics(&folder, &nonparametric_diagnostics(result))?; - np_output::write_nonparametric_outputs(result)?; + np_output::write_nonparametric_outputs(result, path)?; if let Some(predictions) = result.predictions() { let rows = predictions diff --git a/src/results/artifacts.rs b/src/results/artifacts.rs deleted file mode 100644 index abd817c3e..000000000 --- a/src/results/artifacts.rs +++ /dev/null @@ -1,88 +0,0 @@ -use std::fs; -use std::path::Path; - -use pharmsol::Equation; -use serde::{Deserialize, Serialize}; - -use crate::estimation::nonparametric::NonparametricWorkspace; -use crate::output::shared::shared_output_file_names; - -#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] -pub struct ArtifactIndex { - pub files: Vec, - pub expected_files: Vec, - pub missing_files: Vec, - pub shared_expected_files: Vec, - pub method_specific_expected_files: Vec, -} - -pub(crate) fn nonparametric_artifacts( - result: &NonparametricWorkspace, -) -> ArtifactIndex { - artifact_index( - result.output_folder(), - result.should_write_outputs(), - crate::output::nonparametric::output_file_names(result), - ) -} - -fn artifact_index( - folder: &str, - should_write_outputs: bool, - mut expected_files: Vec, -) -> ArtifactIndex { - if !should_write_outputs { - return ArtifactIndex::default(); - } - - expected_files.sort(); - expected_files.dedup(); - - let shared_output_files = shared_output_file_names(); - let shared_expected_files = expected_files - .iter() - .filter(|file| shared_output_files.contains(*file)) - .cloned() - .collect::>(); - let method_specific_expected_files = expected_files - .iter() - .filter(|file| !shared_output_files.contains(*file)) - .cloned() - .collect::>(); - - let path = Path::new(folder); - if !path.exists() { - return ArtifactIndex { - files: Vec::new(), - missing_files: expected_files.clone(), - expected_files, - shared_expected_files, - method_specific_expected_files, - }; - } - - let mut files = expected_files - .iter() - .filter(|file| { - fs::metadata(path.join(file)) - .map(|meta| meta.is_file()) - .unwrap_or(false) - }) - .cloned() - .collect::>(); - files.sort(); - - let missing_files = expected_files - .iter() - .filter(|file| !files.contains(file)) - .cloned() - .collect(); - - ArtifactIndex { - files, - expected_files, - missing_files, - shared_expected_files, - method_specific_expected_files, - } -} diff --git a/src/results/diagnostics.rs b/src/results/diagnostics.rs deleted file mode 100644 index b88e1d495..000000000 --- a/src/results/diagnostics.rs +++ /dev/null @@ -1,59 +0,0 @@ -use std::collections::BTreeMap; - -use pharmsol::Equation; -use serde::{Deserialize, Serialize}; - -use crate::estimation::nonparametric::NonparametricWorkspace; - -#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] -pub struct DiagnosticsBundle { - pub warnings: Vec, - pub deferred_features: Vec, - pub convergence_notes: Vec, - pub estimator_metadata: BTreeMap, -} - -pub(crate) fn nonparametric_diagnostics( - result: &NonparametricWorkspace, -) -> DiagnosticsBundle { - let mut convergence_notes = Vec::new(); - if result.converged() { - convergence_notes.push("Estimator reported convergence.".to_string()); - } else { - convergence_notes.push("Estimator stopped without convergence.".to_string()); - } - - let status = result - .cycle_log() - .cycles() - .last() - .map(|cycle| format!("{:?}", cycle.status())) - .unwrap_or_else(|| "Continue".to_string()); - - let mut estimator_metadata = BTreeMap::new(); - estimator_metadata.insert("algorithm".to_string(), result.algorithm().to_string()); - estimator_metadata.insert("status".to_string(), status); - estimator_metadata.insert( - "outputs_requested".to_string(), - result.should_write_outputs().to_string(), - ); - estimator_metadata.insert( - "support_point_count".to_string(), - result.get_theta().nspp().to_string(), - ); - estimator_metadata.insert( - "prediction_cache".to_string(), - if result.predictions().is_some() { - "available".to_string() - } else { - "not_materialized".to_string() - }, - ); - - DiagnosticsBundle { - warnings: Vec::new(), - deferred_features: Vec::new(), - convergence_notes, - estimator_metadata, - } -} diff --git a/src/results/fit_result.rs b/src/results/fit_result.rs index c38532429..7b69c6c2b 100644 --- a/src/results/fit_result.rs +++ b/src/results/fit_result.rs @@ -1,12 +1,8 @@ -use anyhow::Result; use pharmsol::Equation; use crate::estimation::nonparametric; use crate::estimation::nonparametric::NonparametricWorkspace; -use crate::results::{ - nonparametric_artifacts, nonparametric_diagnostics, nonparametric_predictions, ArtifactIndex, - DiagnosticsBundle, FitSummary, IndividualSummary, PopulationSummary, PredictionsBundle, -}; +use crate::results::{FitSummary, IndividualSummary, PopulationSummary}; #[derive(Debug)] pub enum FitResult { @@ -26,10 +22,6 @@ impl FitResult { } } - pub(crate) fn write_outputs(&mut self) -> Result<()> { - crate::output::write_result(self) - } - pub fn summary(&self) -> FitSummary { match self { Self::Nonparametric(result) => nonparametric::fit_summary(result), @@ -48,24 +40,6 @@ impl FitResult { } } - pub fn diagnostics(&self) -> DiagnosticsBundle { - match self { - Self::Nonparametric(result) => nonparametric_diagnostics(result), - } - } - - pub fn predictions(&self) -> PredictionsBundle { - match self { - Self::Nonparametric(result) => nonparametric_predictions(result), - } - } - - pub fn artifacts(&self) -> ArtifactIndex { - match self { - Self::Nonparametric(result) => nonparametric_artifacts(result), - } - } - pub fn as_nonparametric(&self) -> Option<&NonparametricWorkspace> { match self { Self::Nonparametric(result) => Some(result), diff --git a/src/results/mod.rs b/src/results/mod.rs index 3ff684906..2020d341f 100644 --- a/src/results/mod.rs +++ b/src/results/mod.rs @@ -1,15 +1,7 @@ -mod artifacts; -mod diagnostics; mod fit_result; -mod predictions; + mod summary; -pub use artifacts::ArtifactIndex; -pub use diagnostics::DiagnosticsBundle; pub use fit_result::FitResult; -pub use predictions::PredictionsBundle; -pub use summary::{FitSummary, IndividualSummary, ParameterSummary, PopulationSummary}; -pub(crate) use artifacts::nonparametric_artifacts; -pub(crate) use diagnostics::nonparametric_diagnostics; -pub(crate) use predictions::nonparametric_predictions; +pub use summary::{FitSummary, IndividualSummary, ParameterSummary, PopulationSummary}; diff --git a/src/results/predictions.rs b/src/results/predictions.rs deleted file mode 100644 index 8f3118999..000000000 --- a/src/results/predictions.rs +++ /dev/null @@ -1,38 +0,0 @@ -use pharmsol::Equation; -use serde::{Deserialize, Serialize}; - -use crate::estimation::nonparametric::NonparametricWorkspace; -use crate::results::nonparametric_artifacts; - -#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] -pub struct PredictionsBundle { - pub available: bool, - pub row_count: Option, - pub source: Option, - pub artifact: Option, -} - -pub(crate) fn nonparametric_predictions( - result: &NonparametricWorkspace, -) -> PredictionsBundle { - let artifact = nonparametric_artifacts(result) - .files - .into_iter() - .find(|file| file == "predictions.csv"); - - if let Some(predictions) = result.predictions() { - return PredictionsBundle { - available: true, - row_count: Some(predictions.predictions().len()), - source: Some("in_memory".to_string()), - artifact, - }; - } - - PredictionsBundle { - available: artifact.is_some(), - row_count: None, - source: artifact.as_ref().map(|_| "artifact".to_string()), - artifact, - } -} diff --git a/tests/api_smoke_tests.rs b/tests/api_smoke_tests.rs index 537ba9807..55e75551f 100644 --- a/tests/api_smoke_tests.rs +++ b/tests/api_smoke_tests.rs @@ -150,7 +150,6 @@ fn test_problem_compile_preserves_runtime_configuration() -> Result<()> { .compile()?; assert_eq!(compiled.algorithm().name(), "NPAG"); - assert!(!compiled.output_plan().write); assert_eq!(compiled.runtime_options().cycles, 7); assert!(!compiled.runtime_options().cache); assert!(!compiled.runtime_options().progress); diff --git a/tests/compile_layer_tests.rs b/tests/compile_layer_tests.rs index 509ff7a16..39774db5d 100644 --- a/tests/compile_layer_tests.rs +++ b/tests/compile_layer_tests.rs @@ -88,7 +88,6 @@ fn test_compile_problem_builds_algorithm_settings() -> Result<()> { assert_eq!(compiled.algorithm().name(), "NPAG"); assert_eq!(compiled.design.parameter_names.len(), 2); - assert!(!compiled.output_plan().write); Ok(()) } diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index 441f47aac..60735d1de 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -57,20 +57,6 @@ fn test_nonparametric_fit_result_summary_surface() -> Result<()> { assert_eq!(summary.observation_count, 2); assert_eq!(result.population_summary().parameters.len(), 2); assert_eq!(result.individual_summaries().len(), 1); - let diagnostics = result.diagnostics(); - assert_eq!( - diagnostics.estimator_metadata.get("algorithm"), - Some(&"NPAG".to_string()) - ); - assert_eq!( - diagnostics.estimator_metadata.get("outputs_requested"), - Some(&"false".to_string()) - ); - assert!(!diagnostics.convergence_notes.is_empty()); - assert!(diagnostics.deferred_features.is_empty()); - let predictions = result.predictions(); - assert!(!predictions.available); - assert!(result.artifacts().files.is_empty()); - assert!(result.artifacts().expected_files.is_empty()); + Ok(()) } From e62a64ca8e240105b4ccc7e63fdb60be17dbad57 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Wed, 27 May 2026 09:03:34 +0200 Subject: [PATCH 06/47] Refactor --- src/output/mod.rs | 2 -- src/output/nonparametric.rs | 43 ------------------------------ src/output/shared.rs | 13 --------- src/output/writer.rs | 53 +------------------------------------ 4 files changed, 1 insertion(+), 110 deletions(-) delete mode 100644 src/output/nonparametric.rs diff --git a/src/output/mod.rs b/src/output/mod.rs index ffa994aa2..480ab5613 100644 --- a/src/output/mod.rs +++ b/src/output/mod.rs @@ -1,8 +1,6 @@ mod file; pub mod logging; -pub mod nonparametric; pub mod shared; pub mod writer; pub use file::OutputFile; -pub use writer::write_result; diff --git a/src/output/nonparametric.rs b/src/output/nonparametric.rs deleted file mode 100644 index c91a4d513..000000000 --- a/src/output/nonparametric.rs +++ /dev/null @@ -1,43 +0,0 @@ -use anyhow::Result; - -use crate::estimation::nonparametric::NonparametricWorkspace; -use crate::output::shared::shared_output_file_names; - -pub(crate) fn output_file_names( - result: &NonparametricWorkspace, -) -> Vec { - let mut files = shared_output_file_names(); - files.extend( - ["iterations.csv", "theta.csv", "posterior.csv"] - .into_iter() - .map(str::to_string), - ); - - let has_covariates = result.data().subjects().iter().any(|subject| { - subject - .occasions() - .iter() - .any(|occasion| !occasion.covariates().covariates().is_empty()) - }); - if has_covariates { - files.push("covariates.csv".to_string()); - } - - files.sort(); - files.dedup(); - files -} - -pub fn write_nonparametric_outputs( - result: &mut NonparametricWorkspace, - path: &str, -) -> Result<()> { - let parameter_names = result.get_theta().parameters().names(); - result.cycle_log().write(path, ¶meter_names)?; - result.write_theta(&path)?; - result.write_covariates(&path)?; - result.write_posterior(&path)?; - let (idelta, tad) = result.prediction_interval(); - result.calculate_predictions(idelta, tad)?; - Ok(()) -} diff --git a/src/output/shared.rs b/src/output/shared.rs index 80bc31636..035da4bbc 100644 --- a/src/output/shared.rs +++ b/src/output/shared.rs @@ -7,19 +7,6 @@ use crate::api::RuntimeOptions; use crate::output::OutputFile; use crate::results::FitSummary; -pub(crate) fn shared_output_file_names() -> Vec { - vec![ - "settings.json", - "summary.json", - "summary.csv", - "diagnostics.json", - "predictions.csv", - ] - .into_iter() - .map(str::to_string) - .collect() -} - #[derive(Debug, Clone, Serialize)] pub(crate) struct RunConfiguration { pub algorithm: Algorithm, diff --git a/src/output/writer.rs b/src/output/writer.rs index 2c4b22410..d257723f0 100644 --- a/src/output/writer.rs +++ b/src/output/writer.rs @@ -1,13 +1,6 @@ -use anyhow::Result; -use pharmsol::{Censor, Equation}; +use pharmsol::Censor; use serde::Serialize; -use crate::estimation::nonparametric as np_estimation; -use crate::estimation::nonparametric::NonparametricWorkspace; -use crate::output::{nonparametric as np_output, shared}; -use crate::results::FitResult; -use crate::results::FitSummary; - #[derive(Debug, Clone, Serialize)] struct SharedPredictionRow { id: String, @@ -22,47 +15,3 @@ struct SharedPredictionRow { residual_individual: Option, source_method: String, } - -pub fn write_result(result: &mut FitResult, path: &str) -> Result<()> { - match result { - FitResult::Nonparametric(inner) => write_nonparametric_result(inner, path)?, - } - - Ok(()) -} - -pub fn write_nonparametric_result( - result: &mut NonparametricWorkspace, - path: &str, -) -> Result<()> { - let folder = &path.to_string(); - shared::write_settings(&folder, result.run_configuration())?; - shared::write_summary(&folder, &nonparametric_summary(result))?; - np_output::write_nonparametric_outputs(result, path)?; - - if let Some(predictions) = result.predictions() { - let rows = predictions - .predictions() - .iter() - .map(|row| SharedPredictionRow { - id: row.id().to_string(), - time: row.time(), - outeq: row.outeq(), - block: row.block(), - obs: row.obs(), - cens: row.censoring(), - pred_population: row.pop_mean(), - pred_individual: row.post_mean(), - residual_population: row.obs().map(|obs| obs - row.pop_mean()), - residual_individual: row.obs().map(|obs| obs - row.post_mean()), - source_method: "nonparametric".to_string(), - }); - shared::write_csv_rows(&folder, "predictions.csv", rows)?; - } - - Ok(()) -} - -fn nonparametric_summary(result: &NonparametricWorkspace) -> FitSummary { - np_estimation::fit_summary(result) -} From 91ff0f02c718810a6064b380f16a2de6618b991f Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 27 May 2026 16:59:47 +0200 Subject: [PATCH 07/47] Refactor algorithm --- benches/bimodal_ke.rs | 6 +- examples/bimodal_ke/main.rs | 1 + examples/bimodal_ke_backend_compare.rs | 2 +- src/algorithms/mod.rs | 66 ++++++--------- src/algorithms/nonparametric/mod.rs | 13 ++- src/algorithms/nonparametric/npag.rs | 70 ++++------------ .../nonparametric/{postprob.rs => npmap.rs} | 25 +++--- src/algorithms/nonparametric/npod.rs | 21 ++--- src/api/fit.rs | 5 +- src/api/mod.rs | 2 +- src/bestdose/posterior.rs | 21 +---- src/estimation/nonparametric/cycles.rs | 24 ++++-- src/estimation/nonparametric/engine.rs | 6 +- src/estimation/nonparametric/mod.rs | 2 +- src/estimation/nonparametric/summaries.rs | 8 +- src/estimation/nonparametric/workspace.rs | 60 +++++--------- src/lib.rs | 7 +- src/output/mod.rs | 3 - src/output/shared.rs | 81 ------------------- src/results/fit_result.rs | 6 +- tests/acceptance_baseline_tests.rs | 2 +- tests/api_smoke_tests.rs | 4 +- tests/compile_layer_tests.rs | 4 +- tests/nonparametric_engine_tests.rs | 2 +- tests/onecomp.rs | 6 +- tests/results_summary_tests.rs | 2 +- 26 files changed, 146 insertions(+), 303 deletions(-) rename src/algorithms/nonparametric/{postprob.rs => npmap.rs} (85%) delete mode 100644 src/output/shared.rs diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index 232453338..9004aeb1f 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -35,7 +35,7 @@ fn setup_npag() -> Result> { EstimationProblem::builder(create_equation(), data) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("outeq_1", create_error_model())? .progress(false) .prior(Prior::sobol(2048, 22)) @@ -47,7 +47,7 @@ fn setup_npod() -> Result> { EstimationProblem::builder(create_equation(), data) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? - .algorithm(Npod::new()) + .algorithm(Algorithm::NPOD(NpodConfig::default())) .error("outeq_1", create_error_model())? .progress(false) .prior(Prior::sobol(2048, 22)) @@ -59,7 +59,7 @@ fn setup_postprob() -> Result> { EstimationProblem::builder(create_equation(), data) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? - .algorithm(PostProb::new()) + .algorithm(Algorithm::NPMAP(NpmapConfig::default())) .error("outeq_1", create_error_model())? .progress(false) .prior(Prior::sobol(2048, 22)) diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 9b33ffc72..721bfc57d 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -1,4 +1,5 @@ use anyhow::Result; + use pmcore::{output::logging::Logger, prelude::*}; fn main() -> Result<()> { diff --git a/examples/bimodal_ke_backend_compare.rs b/examples/bimodal_ke_backend_compare.rs index 6c602025b..7fa5dc33e 100644 --- a/examples/bimodal_ke_backend_compare.rs +++ b/examples/bimodal_ke_backend_compare.rs @@ -205,7 +205,7 @@ fn run_case NonparametricAlgorithmInput { @@ -86,17 +84,6 @@ impl NonparametricAlgorithmInput { self.runtime.prior.clone().unwrap_or_default() } - pub(crate) fn run_configuration(&self) -> RunConfiguration { - RunConfiguration::new( - self.algorithm(), - &self.runtime, - self.parameter_space - .iter() - .map(|parameter| parameter.name.clone()) - .collect(), - ) - } - pub(crate) fn native_config(&self) -> Result { Ok(NativeNonparametricConfig { ranges: self.parameter_space.finite_ranges()?, @@ -104,7 +91,6 @@ impl NonparametricAlgorithmInput { prior: self.prior(), max_cycles: self.max_cycles(), progress: self.progress_enabled(), - run_configuration: self.run_configuration(), }) } } @@ -118,11 +104,11 @@ impl NonparametricAlgorithmInput { #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] pub enum Algorithm { /// Non-Parametric Adaptive Grid - NPAG(Npag), + NPAG(NpagConfig), /// Non-Parametric Optimal Design - NPOD(Npod), - /// Posterior Probability calculation - POSTPROB(PostProb), + NPOD(NpodConfig), + /// Non-parametric Maximum a Posteriori probability reweighting + NPMAP(NpmapConfig), } impl Algorithm { @@ -130,7 +116,7 @@ impl Algorithm { pub fn is_nonparametric(&self) -> bool { matches!( self, - Algorithm::NPAG(_) | Algorithm::NPOD(_) | Algorithm::POSTPROB(_) + Algorithm::NPAG(_) | Algorithm::NPOD(_) | Algorithm::NPMAP(_) ) } @@ -139,7 +125,7 @@ impl Algorithm { match self { Algorithm::NPAG(_) => "NPAG", Algorithm::NPOD(_) => "NPOD", - Algorithm::POSTPROB(_) => "POSTPROB", + Algorithm::NPMAP(_) => "NPMAP", } } } @@ -150,25 +136,25 @@ impl std::fmt::Display for Algorithm { } } -impl From for Algorithm { - fn from(value: Npag) -> Self { +impl From for Algorithm { + fn from(value: NpagConfig) -> Self { Algorithm::NPAG(value) } } -impl From for Algorithm { - fn from(value: Npod) -> Self { +impl From for Algorithm { + fn from(value: NpodConfig) -> Self { Algorithm::NPOD(value) } } -impl From for Algorithm { - fn from(value: PostProb) -> Self { - Algorithm::POSTPROB(value) +impl From for Algorithm { + fn from(value: NpmapConfig) -> Self { + Algorithm::NPMAP(value) } } -pub trait Algorithms: Sync + Send + 'static { +pub trait NonParametricAlgorithm: Sync + Send + 'static { fn validate_psi(&mut self) -> Result<()> { // Count problematic values in psi let mut nan_count = 0; @@ -437,30 +423,30 @@ pub trait Algorithms: Sync + Send + 'static { /// This method runs the full fitting process, starting with initialization, /// followed by iterative cycles of estimation, condensation, optimization, and evaluation /// until the algorithm converges or meets a stopping criteria. - fn fit(&mut self) -> Result> { + fn fit(&mut self) -> Result> { self.initialize().unwrap(); while let Status::Continue = self.next_cycle()? {} self.into_workspace() } #[allow(clippy::wrong_self_convention)] - fn into_workspace(&self) -> Result>; + fn into_workspace(&self) -> Result>; } pub(crate) fn dispatch_nonparametric_algorithm( input: NonparametricAlgorithmInput, -) -> Result>> { +) -> Result>> { match input.algorithm { Algorithm::NPAG(_) => { - let algorithm: Box> = NPAG::from_input(input)?; + let algorithm: Box> = NPAG::from_input(input)?; Ok(algorithm) } Algorithm::NPOD(_) => { - let algorithm: Box> = NPOD::from_input(input)?; + let algorithm: Box> = NPOD::from_input(input)?; Ok(algorithm) } - Algorithm::POSTPROB(_) => { - let algorithm: Box> = POSTPROB::from_input(input)?; + Algorithm::NPMAP(_) => { + let algorithm: Box> = NPMAP::from_input(input)?; Ok(algorithm) } } @@ -469,7 +455,7 @@ pub(crate) fn dispatch_nonparametric_algorithm( pub(crate) fn run_nonparametric_algorithm_with_progress( input: NonparametricAlgorithmInput, mut on_progress: F, -) -> Result> +) -> Result> where E: Equation + Send + 'static, F: FnMut(usize, f64, Option, u64, Status), @@ -504,7 +490,7 @@ where pub(crate) fn run_nonparametric_algorithm( input: NonparametricAlgorithmInput, -) -> Result> { +) -> Result> { let mut algorithm = dispatch_nonparametric_algorithm(input)?; algorithm.fit() } diff --git a/src/algorithms/nonparametric/mod.rs b/src/algorithms/nonparametric/mod.rs index 890cc58aa..51afb67f6 100644 --- a/src/algorithms/nonparametric/mod.rs +++ b/src/algorithms/nonparametric/mod.rs @@ -18,18 +18,15 @@ // Algorithm implementations pub mod npag; +pub mod npmap; pub mod npod; -pub mod postprob; // Re-export algorithm structs pub use npag::NPAG; +pub use npmap::NPMAP; pub use npod::NPOD; -pub use postprob::POSTPROB; // Re-export per-algorithm configuration structs -pub use npag::Npag; -pub use npod::Npod; -pub use postprob::PostProb; - -// Re-export the NP algorithm trait from parent -pub use super::Algorithms as NPAlgorithm; +pub use npag::NpagConfig; +pub use npmap::NpmapConfig; +pub use npod::NpodConfig; diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 343b00cba..cf3d1fae2 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,10 +1,10 @@ use crate::algorithms::{ - NativeNonparametricConfig, NonparametricAlgorithmInput, Status, StopReason, + Algorithm, NativeNonparametricConfig, NonParametricAlgorithm, NonparametricAlgorithmInput, + Status, StopReason, }; use crate::estimation::nonparametric::{ - calculate_psi, CycleLog, NPCycle, NonparametricWorkspace, Psi, Theta, Weights, + calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }; -use crate::prelude::algorithms::Algorithms; pub(crate) use crate::estimation::nonparametric::ipm::burke; pub(crate) use crate::estimation::nonparametric::qr; @@ -26,7 +26,7 @@ use serde::{Deserialize, Serialize}; /// Configuration options for the Non-Parametric Adaptive Grid (NPAG) algorithm. #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] -pub struct Npag { +pub struct NpagConfig { pub eps: f64, pub min_eps: f64, pub objective_tolerance: f64, @@ -40,7 +40,7 @@ pub struct Npag { pub error_step_shrink: f64, } -impl Default for Npag { +impl Default for NpagConfig { fn default() -> Self { Self { eps: 0.2, @@ -58,7 +58,7 @@ impl Default for Npag { } } -impl Npag { +impl NpagConfig { pub fn new() -> Self { Self::default() } @@ -139,7 +139,7 @@ pub struct NPAG { cycle_log: CycleLog, data: Data, config: NativeNonparametricConfig, - settings: Npag, + settings: NpagConfig, } impl NPAG { @@ -148,7 +148,7 @@ impl NPAG { data: Data, error_models: AssayErrorModels, config: NativeNonparametricConfig, - settings: Npag, + settings: NpagConfig, ) -> Box { let ranges = config.ranges.clone(); let gamma_delta = vec![settings.error_step; error_models.len()]; @@ -196,12 +196,12 @@ impl NPAG { } } -impl Algorithms for NPAG { +impl NonParametricAlgorithm for NPAG { fn equation(&self) -> &E { &self.equation } - fn into_workspace(&self) -> Result> { - NonparametricWorkspace::new( + fn into_workspace(&self) -> Result> { + NonParametricResult::new( self.equation.clone(), self.data.clone(), self.theta.clone(), @@ -210,8 +210,8 @@ impl Algorithms for NPAG { -2. * self.objf, self.cycle, self.status.clone(), - self.config.run_configuration.clone(), self.cycle_log.clone(), + Algorithm::NPAG(NpagConfig::default()), ) } @@ -520,9 +520,8 @@ impl Algorithms for NPAG { #[cfg(test)] mod tests { use super::*; - use crate::api::RuntimeOptions; - use crate::model::{ModelDefinition, Parameter}; - use pharmsol::{fa, fetch_params, lag, AssayErrorModel, ErrorPoly, Subject, SubjectBuilderExt}; + + use pharmsol::{fa, fetch_params, lag, Subject, SubjectBuilderExt}; fn simple_equation() -> pharmsol::equation::ODE { pharmsol::equation::ODE::new( @@ -560,45 +559,4 @@ mod tests { Data::new(vec![subject]) } - - #[test] - fn from_input_uses_npag_method_settings() -> Result<()> { - let method = Npag::new() - .eps(0.125) - .min_eps(0.0025) - .objective_tolerance(3e-5) - .pyl_tolerance(4e-3) - .prune_threshold(2e-3) - .qr_tolerance(9e-7) - .grid_tolerance(8e-4) - .error_step(0.2) - .min_error_step(0.03) - .error_step_growth(3.0) - .error_step_shrink(0.25); - - let model = ModelDefinition::builder(simple_equation()) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? - .build()?; - - let error_models = AssayErrorModels::new().add( - 0, - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), - )?; - - let input = NonparametricAlgorithmInput::new( - crate::algorithms::Algorithm::NPAG(method), - model, - simple_data(), - error_models, - RuntimeOptions::default(), - ); - - let algorithm = NPAG::from_input(input)?; - - assert_eq!(algorithm.settings, method); - assert_eq!(algorithm.eps, method.eps); - assert_eq!(algorithm.gamma_delta, vec![method.error_step]); - Ok(()) - } } diff --git a/src/algorithms/nonparametric/postprob.rs b/src/algorithms/nonparametric/npmap.rs similarity index 85% rename from src/algorithms/nonparametric/postprob.rs rename to src/algorithms/nonparametric/npmap.rs index db6f049e2..d46fe2421 100644 --- a/src/algorithms/nonparametric/postprob.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -1,9 +1,12 @@ use crate::{ - algorithms::{NativeNonparametricConfig, NonparametricAlgorithmInput, Status, StopReason}, + algorithms::{ + NativeNonparametricConfig, NonParametricAlgorithm, NonparametricAlgorithmInput, Status, + StopReason, + }, estimation::nonparametric::{ - calculate_psi, CycleLog, NPCycle, NonparametricWorkspace, Psi, Theta, Weights, + calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }, - prelude::algorithms::Algorithms, + prelude::algorithms::Algorithm, }; use anyhow::{Context, Result}; @@ -19,9 +22,9 @@ use serde::{Deserialize, Serialize}; /// Configuration options for the posterior probability reweighting algorithm. #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] -pub struct PostProb; +pub struct NpmapConfig; -impl PostProb { +impl NpmapConfig { pub fn new() -> Self { Self } @@ -29,7 +32,7 @@ impl PostProb { /// Posterior probability algorithm /// Reweights the prior probabilities to the observed data and error model -pub struct POSTPROB { +pub struct NPMAP { equation: E, psi: Psi, theta: Theta, @@ -43,9 +46,9 @@ pub struct POSTPROB { error_models: AssayErrorModels, } -impl Algorithms for POSTPROB { - fn into_workspace(&self) -> Result> { - NonparametricWorkspace::new( +impl NonParametricAlgorithm for NPMAP { + fn into_workspace(&self) -> Result> { + NonParametricResult::new( self.equation.clone(), self.data.clone(), self.theta.clone(), @@ -54,8 +57,8 @@ impl Algorithms for POSTPROB { self.objf, self.cycle, self.status.clone(), - self.config.run_configuration.clone(), self.cyclelog.clone(), + Algorithm::NPMAP(NpmapConfig::default()), ) } fn error_models(&self) -> &AssayErrorModels { @@ -149,7 +152,7 @@ impl Algorithms for POSTPROB { } } -impl POSTPROB { +impl NPMAP { pub(crate) fn from_input(input: NonparametricAlgorithmInput) -> Result> { let config = input.native_config()?; let error_models = input.error_models().clone(); diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index dfbea6a8f..347a4b221 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -1,10 +1,13 @@ -use crate::algorithms::{NativeNonparametricConfig, NonparametricAlgorithmInput, StopReason}; +use crate::algorithms::nonparametric::npod; +use crate::algorithms::{ + NativeNonparametricConfig, NonParametricAlgorithm, NonparametricAlgorithmInput, StopReason, +}; use crate::estimation::nonparametric::ipm::burke; use crate::estimation::nonparametric::qr; use crate::estimation::nonparametric::{ - calculate_psi, CycleLog, NPCycle, NonparametricWorkspace, Psi, Theta, Weights, + calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }; -use crate::{algorithms::Status, prelude::algorithms::Algorithms}; +use crate::{algorithms::Status, prelude::algorithms::Algorithm}; use pharmsol::ParameterOptimizer; use anyhow::bail; @@ -24,9 +27,9 @@ const THETA_D: f64 = 1e-4; /// Configuration options for the Non-Parametric Optimal Design (NPOD) algorithm. #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] -pub struct Npod; +pub struct NpodConfig; -impl Npod { +impl NpodConfig { pub fn new() -> Self { Self } @@ -50,9 +53,9 @@ pub struct NPOD { config: NativeNonparametricConfig, } -impl Algorithms for NPOD { - fn into_workspace(&self) -> Result> { - NonparametricWorkspace::new( +impl NonParametricAlgorithm for NPOD { + fn into_workspace(&self) -> Result> { + NonParametricResult::new( self.equation.clone(), self.data.clone(), self.theta.clone(), @@ -61,8 +64,8 @@ impl Algorithms for NPOD { -2. * self.objf, self.cycle, self.status.clone(), - self.config.run_configuration.clone(), self.cycle_log.clone(), + Algorithm::NPOD(NpodConfig::default()), ) } diff --git a/src/api/fit.rs b/src/api/fit.rs index 1ec7451a4..b783e9e8a 100644 --- a/src/api/fit.rs +++ b/src/api/fit.rs @@ -1,6 +1,7 @@ use anyhow::Result; use pharmsol::equation::Equation; +use crate::algorithms::Algorithm; use crate::api::estimation_problem::EstimationProblem; use crate::api::progress::FitProgress; use crate::estimation::nonparametric; @@ -39,7 +40,7 @@ mod tests { use super::{fit_with_progress, FitProgress}; use crate::algorithms::Status; - use crate::api::{EstimationProblem, Npag}; + use crate::api::EstimationProblem; use crate::prelude::*; fn equation() -> equation::ODE { @@ -82,7 +83,7 @@ mod tests { let problem = EstimationProblem::builder(equation(), data) .parameter(Parameter::bounded("ke", 0.05, 1.0))? .parameter(Parameter::bounded("v", 5.0, 50.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("0", assay_error)? .progress(false) .prior(Prior::sobol(8, 7)) diff --git a/src/api/mod.rs b/src/api/mod.rs index 85fd9789c..52de4259f 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -5,7 +5,7 @@ pub mod model_definition; pub mod progress; pub mod saem_config; -pub use crate::algorithms::nonparametric::{Npag, Npod, PostProb}; +pub use crate::algorithms::nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; pub use error_models::ErrorModels; pub use estimation_problem::{ AlgorithmTuning, ConvergenceOptions, EstimationProblem, EstimationProblemBuilder, diff --git a/src/bestdose/posterior.rs b/src/bestdose/posterior.rs index da5e206f4..aa207b9a7 100644 --- a/src/bestdose/posterior.rs +++ b/src/bestdose/posterior.rs @@ -55,7 +55,8 @@ use faer::Mat; use crate::algorithms::nonparametric::npag::burke; use crate::algorithms::nonparametric::npag::NPAG; -use crate::algorithms::Algorithms; +use crate::algorithms::NonParametricAlgorithm; + use crate::algorithms::NativeNonparametricConfig; use crate::algorithms::Status; use crate::bestdose::types::BestDoseConfig; @@ -188,17 +189,6 @@ pub fn npagfull_refinement( let mut kept_weights: Vec = Vec::new(); let num_points = filtered_theta.matrix().nrows(); let parameter_space = config.parameter_space().clone(); - let runtime = RuntimeOptions { - cycles: config.refinement_cycles(), - cache: true, - progress: config.progress(), - idelta: config.prediction_interval(), - tad: 0.0, - prior: None, - - convergence: ConvergenceOptions::default(), - tuning: AlgorithmTuning::default(), - }; for i in 0..num_points { tracing::debug!(" Refining point {}/{}", i + 1, num_points); @@ -222,13 +212,8 @@ pub fn npagfull_refinement( prior: Prior::Theta(single_point_theta.clone()), max_cycles: config.refinement_cycles(), progress: config.progress(), - run_configuration: crate::output::shared::RunConfiguration::new( - Algorithm::NPAG(Npag::default()), - &runtime, - config.parameter_names(), - ), }, - Npag::default(), + NpagConfig::default(), ); npag.set_theta(single_point_theta); diff --git a/src/estimation/nonparametric/cycles.rs b/src/estimation/nonparametric/cycles.rs index 6a60e4fd6..8115a9bff 100644 --- a/src/estimation/nonparametric/cycles.rs +++ b/src/estimation/nonparametric/cycles.rs @@ -1,3 +1,5 @@ +use std::{fs::File, path::Path}; + use anyhow::Result; use csv::WriterBuilder; use pharmsol::{AssayErrorModel, AssayErrorModels}; @@ -7,7 +9,6 @@ use crate::{ algorithms::{Status, StopReason}, estimation::nonparametric::median, estimation::nonparametric::theta::Theta, - output::OutputFile, }; #[derive(Debug, Clone, Serialize)] @@ -95,12 +96,12 @@ impl CycleLog { self.cycles.push(cycle); } - pub fn write(&self, folder: &str, parameter_names: &[String]) -> Result<()> { + pub fn write(&self, path: &Path) -> Result<()> { tracing::debug!("Writing cycles..."); - let outputfile = OutputFile::new(folder, "iterations.csv")?; - let mut writer = WriterBuilder::new() - .has_headers(false) - .from_writer(outputfile.file()); + + std::fs::create_dir_all(path)?; + let file = File::create(path)?; + let mut writer = WriterBuilder::new().has_headers(true).from_writer(file); writer.write_field("cycle")?; writer.write_field("converged")?; @@ -124,7 +125,13 @@ impl CycleLog { )?; } - for param_name in parameter_names { + let names = self + .cycles + .first() + .map(|cycle| cycle.theta.param_names()) + .expect("No cycles"); + + for param_name in names { writer.write_field(format!("{}.mean", param_name))?; writer.write_field(format!("{}.median", param_name))?; writer.write_field(format!("{}.sd", param_name))?; @@ -174,7 +181,8 @@ impl CycleLog { writer.write_record(None::<&[u8]>)?; } writer.flush()?; - tracing::debug!("Cycles written to {:?}", &outputfile.relative_path()); + + tracing::debug!("Cycles written to {:?}", path); Ok(()) } } diff --git a/src/estimation/nonparametric/engine.rs b/src/estimation/nonparametric/engine.rs index f9a22d94b..e766cff6f 100644 --- a/src/estimation/nonparametric/engine.rs +++ b/src/estimation/nonparametric/engine.rs @@ -7,7 +7,7 @@ use crate::algorithms::{ }; use crate::api::NonparametricCycleProgress; use crate::compile::CompiledProblem; -use crate::estimation::nonparametric::workspace::NonparametricWorkspace; +use crate::estimation::nonparametric::workspace::NonParametricResult; use crate::results::FitResult; #[derive(Debug, Default, Clone, Copy)] @@ -16,7 +16,7 @@ pub struct NonparametricEngine; impl NonparametricEngine { pub fn fit( problem: CompiledProblem, - ) -> Result> { + ) -> Result> { let input = input_from_compiled_problem(problem)?; run_nonparametric_algorithm(input) } @@ -24,7 +24,7 @@ impl NonparametricEngine { pub fn fit_with_progress( problem: CompiledProblem, mut on_progress: F, - ) -> Result> + ) -> Result> where E: Equation + Clone + Send + 'static, F: FnMut(NonparametricCycleProgress), diff --git a/src/estimation/nonparametric/mod.rs b/src/estimation/nonparametric/mod.rs index b74278d98..7c317dd77 100644 --- a/src/estimation/nonparametric/mod.rs +++ b/src/estimation/nonparametric/mod.rs @@ -27,4 +27,4 @@ pub use statistics::{median, population_mean_median, posterior_mean_median, weig pub use summaries::{fit_summary, individual_summaries, population_summary}; pub use theta::Theta; pub use weights::Weights; -pub use workspace::NonparametricWorkspace; +pub use workspace::NonParametricResult; diff --git a/src/estimation/nonparametric/summaries.rs b/src/estimation/nonparametric/summaries.rs index 0425ea8c0..452b1bdbc 100644 --- a/src/estimation/nonparametric/summaries.rs +++ b/src/estimation/nonparametric/summaries.rs @@ -1,11 +1,11 @@ use ndarray::{Array1, Array2}; use pharmsol::{Data, Equation, Event}; -use crate::estimation::nonparametric::NonparametricWorkspace; +use crate::estimation::nonparametric::NonParametricResult; use crate::estimation::nonparametric::{population_mean_median, posterior_mean_median}; use crate::results::{FitSummary, IndividualSummary, ParameterSummary, PopulationSummary}; -pub fn fit_summary(result: &NonparametricWorkspace) -> FitSummary { +pub fn fit_summary(result: &NonParametricResult) -> FitSummary { FitSummary { objective_function: result.objf(), converged: result.converged(), @@ -17,7 +17,7 @@ pub fn fit_summary(result: &NonparametricWorkspace) -> FitSummar } } -pub fn population_summary(result: &NonparametricWorkspace) -> PopulationSummary { +pub fn population_summary(result: &NonParametricResult) -> PopulationSummary { let theta_matrix = to_ndarray_matrix(result.get_theta().matrix()); let weights = Array1::from_iter(result.weights().iter()); let (mean, median) = population_mean_median(&theta_matrix, &weights) @@ -53,7 +53,7 @@ pub fn population_summary(result: &NonparametricWorkspace) -> Po } pub fn individual_summaries( - result: &NonparametricWorkspace, + result: &NonParametricResult, ) -> Vec { let theta_matrix = to_ndarray_matrix(result.get_theta().matrix()); let psi_matrix = to_ndarray_matrix(result.psi().matrix()); diff --git a/src/estimation/nonparametric/workspace.rs b/src/estimation/nonparametric/workspace.rs index 7b9a034ab..d5adc280f 100644 --- a/src/estimation/nonparametric/workspace.rs +++ b/src/estimation/nonparametric/workspace.rs @@ -1,15 +1,16 @@ +use std::path::Path; + use pharmsol::Equation; -use crate::algorithms::{Status, StopReason}; +use crate::algorithms::{Algorithm, Status, StopReason}; use crate::estimation::nonparametric::{ posterior, CycleLog, NPPredictions, Posterior, Psi, Theta, Weights, }; -use crate::output::shared::RunConfiguration; use crate::results::FitResult; use pharmsol::Data; #[derive(Debug)] -pub struct NonparametricWorkspace { +pub struct NonParametricResult { equation: E, data: Data, theta: Theta, @@ -18,13 +19,13 @@ pub struct NonparametricWorkspace { objf: f64, cycles: usize, status: Status, - run_configuration: RunConfiguration, cyclelog: CycleLog, predictions: Option, posterior: Posterior, + algorithm: Algorithm, } -impl NonparametricWorkspace { +impl NonParametricResult { #[allow(clippy::too_many_arguments)] pub(crate) fn new( equation: E, @@ -35,8 +36,8 @@ impl NonparametricWorkspace { objf: f64, cycles: usize, status: Status, - run_configuration: RunConfiguration, cyclelog: CycleLog, + algorithm: Algorithm, ) -> anyhow::Result { let posterior = posterior::posterior(&psi, &weights)?; @@ -49,10 +50,10 @@ impl NonparametricWorkspace { objf, cycles, status, - run_configuration, cyclelog, predictions: None, posterior, + algorithm, }) } @@ -84,19 +85,8 @@ impl NonparametricWorkspace { &self.cyclelog } - pub(crate) fn run_configuration(&self) -> &RunConfiguration { - &self.run_configuration - } - pub(crate) fn algorithm(&self) -> crate::algorithms::Algorithm { - self.run_configuration.algorithm - } - - pub(crate) fn prediction_interval(&self) -> (f64, f64) { - ( - self.run_configuration.runtime.idelta, - self.run_configuration.runtime.tad, - ) + self.algorithm } pub fn predictions(&self) -> Option<&NPPredictions> { @@ -129,8 +119,8 @@ impl NonparametricWorkspace { Ok(()) } - pub fn write_theta(&self, path: &str) -> anyhow::Result<()> { - use anyhow::{bail, Context}; + pub fn write_theta(&self, path: &Path) -> anyhow::Result<()> { + use anyhow::bail; use csv::WriterBuilder; tracing::debug!("Writing population parameter distribution..."); @@ -144,14 +134,11 @@ impl NonparametricWorkspace { ); } - let outputfile = crate::output::OutputFile::new(path, "theta.csv") - .context("Failed to create output file for theta")?; - - let mut writer = WriterBuilder::new() - .has_headers(true) - .from_writer(outputfile.file()); + std::fs::create_dir_all(path)?; + let file = std::fs::File::create(path)?; + let mut writer = WriterBuilder::new().has_headers(true).from_writer(file); - let mut theta_header = self.run_configuration.parameter_names.clone(); + let mut theta_header = self.theta.param_names().clone(); theta_header.push("prob".to_string()); writer.write_record(&theta_header)?; @@ -169,11 +156,9 @@ impl NonparametricWorkspace { tracing::debug!("Writing posterior parameter probabilities..."); - let outputfile = crate::output::OutputFile::new(path, "posterior.csv")?; - - let mut writer = WriterBuilder::new() - .has_headers(true) - .from_writer(outputfile.file()); + std::fs::create_dir_all(path)?; + let file = std::fs::File::create(path)?; + let mut writer = WriterBuilder::new().has_headers(true).from_writer(file); writer.write_field("id")?; writer.write_field("point")?; @@ -209,15 +194,14 @@ impl NonparametricWorkspace { Ok(()) } - pub fn write_covariates(&self, path: &str) -> anyhow::Result<()> { + pub fn write_covariates(&self, path: &Path) -> anyhow::Result<()> { use csv::WriterBuilder; use pharmsol::Event; tracing::debug!("Writing covariates..."); - let outputfile = crate::output::OutputFile::new(path, "covariates.csv")?; - let mut writer = WriterBuilder::new() - .has_headers(true) - .from_writer(outputfile.file()); + std::fs::create_dir_all(path)?; + let file = std::fs::File::create(path)?; + let mut writer = WriterBuilder::new().has_headers(true).from_writer(file); let mut covariate_names = std::collections::HashSet::new(); for subject in self.data.subjects() { diff --git a/src/lib.rs b/src/lib.rs index 7b8bd9473..4c8df206a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -64,12 +64,13 @@ pub mod prelude { pub use crate::api::fit_with_progress; pub use crate::api::{ AlgorithmTuning, ConvergenceOptions, ErrorModels, EstimationProblem, FitProgress, - ModelDefinition, NonparametricCycleProgress, Npag, Npod, PostProb, RuntimeOptions, + ModelDefinition, NonparametricCycleProgress, NpagConfig, NpmapConfig, NpodConfig, + RuntimeOptions, }; pub use crate::compile::{CompiledProblem, DesignContext, ObservationIndex}; pub use crate::estimation::nonparametric::{ - CycleLog, NPCycle, NPPredictions, NonparametricEngine, NonparametricWorkspace, Posterior, - Psi, Theta, Weights, + CycleLog, NPCycle, NPPredictions, NonParametricResult, NonparametricEngine, Posterior, Psi, + Theta, Weights, }; pub use crate::model::{ CovariateEffectsSpec, CovariateModel, CovariateSpec, EquationMetadataSource, ModelMetadata, diff --git a/src/output/mod.rs b/src/output/mod.rs index 480ab5613..26926d88d 100644 --- a/src/output/mod.rs +++ b/src/output/mod.rs @@ -1,6 +1,3 @@ mod file; pub mod logging; -pub mod shared; pub mod writer; - -pub use file::OutputFile; diff --git a/src/output/shared.rs b/src/output/shared.rs deleted file mode 100644 index 035da4bbc..000000000 --- a/src/output/shared.rs +++ /dev/null @@ -1,81 +0,0 @@ -use anyhow::Result; -use csv::WriterBuilder; -use serde::Serialize; - -use crate::algorithms::Algorithm; -use crate::api::RuntimeOptions; -use crate::output::OutputFile; -use crate::results::FitSummary; - -#[derive(Debug, Clone, Serialize)] -pub(crate) struct RunConfiguration { - pub algorithm: Algorithm, - pub runtime: RuntimeOptions, - pub parameter_names: Vec, -} - -impl RunConfiguration { - pub(crate) fn new( - algorithm: Algorithm, - runtime: &RuntimeOptions, - parameter_names: Vec, - ) -> Self { - Self { - algorithm, - runtime: runtime.clone(), - parameter_names, - } - } -} - -pub(crate) fn write_settings(folder: &str, configuration: &RunConfiguration) -> Result<()> { - let outputfile = OutputFile::new(folder, "settings.json")?; - let mut file = outputfile.file_owned(); - let serialized = serde_json::to_string_pretty(configuration)?; - std::io::Write::write_all(&mut file, serialized.as_bytes())?; - Ok(()) -} - -pub fn write_summary(folder: &str, summary: &FitSummary) -> Result<()> { - let outputfile = OutputFile::new(folder, "summary.json")?; - let mut file = outputfile.file_owned(); - let serialized = serde_json::to_string_pretty(summary)?; - std::io::Write::write_all(&mut file, serialized.as_bytes())?; - - let outputfile = OutputFile::new(folder, "summary.csv")?; - let mut writer = WriterBuilder::new() - .has_headers(true) - .from_writer(outputfile.file_owned()); - writer.write_record(["metric", "value"])?; - writer.write_record([ - "objective_function", - &summary.objective_function.to_string(), - ])?; - writer.write_record(["converged", &summary.converged.to_string()])?; - writer.write_record(["iterations", &summary.iterations.to_string()])?; - writer.write_record(["subject_count", &summary.subject_count.to_string()])?; - writer.write_record(["observation_count", &summary.observation_count.to_string()])?; - writer.write_record(["parameter_count", &summary.parameter_count.to_string()])?; - writer.write_record(["algorithm", &summary.algorithm])?; - writer.flush()?; - - Ok(()) -} - -pub fn write_csv_rows( - folder: &str, - file_name: &str, - rows: impl IntoIterator, -) -> Result<()> { - let outputfile = OutputFile::new(folder, file_name)?; - let mut writer = WriterBuilder::new() - .has_headers(true) - .from_writer(outputfile.file_owned()); - - for row in rows { - writer.serialize(row)?; - } - - writer.flush()?; - Ok(()) -} diff --git a/src/results/fit_result.rs b/src/results/fit_result.rs index 7b69c6c2b..f22e1d4b2 100644 --- a/src/results/fit_result.rs +++ b/src/results/fit_result.rs @@ -1,12 +1,12 @@ use pharmsol::Equation; use crate::estimation::nonparametric; -use crate::estimation::nonparametric::NonparametricWorkspace; +use crate::estimation::nonparametric::NonParametricResult; use crate::results::{FitSummary, IndividualSummary, PopulationSummary}; #[derive(Debug)] pub enum FitResult { - Nonparametric(NonparametricWorkspace), + Nonparametric(NonParametricResult), } impl FitResult { @@ -40,7 +40,7 @@ impl FitResult { } } - pub fn as_nonparametric(&self) -> Option<&NonparametricWorkspace> { + pub fn as_nonparametric(&self) -> Option<&NonParametricResult> { match self { Self::Nonparametric(result) => Some(result), } diff --git a/tests/acceptance_baseline_tests.rs b/tests/acceptance_baseline_tests.rs index 11685d4a1..ab58c3809 100644 --- a/tests/acceptance_baseline_tests.rs +++ b/tests/acceptance_baseline_tests.rs @@ -37,7 +37,7 @@ fn test_acceptance_baseline_npag_bimodal_ke() -> Result<()> { let result = EstimationProblem::builder(bimodal_ode_equation(), bimodal_data()?) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), diff --git a/tests/api_smoke_tests.rs b/tests/api_smoke_tests.rs index 55e75551f..e27614d59 100644 --- a/tests/api_smoke_tests.rs +++ b/tests/api_smoke_tests.rs @@ -104,7 +104,7 @@ fn test_unified_fit_nonparametric_smoke() -> Result<()> { let result = EstimationProblem::builder(simple_equation(), simple_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("0", assay_error)? .progress(false) .fit()?; @@ -138,7 +138,7 @@ fn test_problem_compile_preserves_runtime_configuration() -> Result<()> { let compiled = EstimationProblem::builder(simple_equation(), simple_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("0", assay_error)? .cache(false) .progress(false) diff --git a/tests/compile_layer_tests.rs b/tests/compile_layer_tests.rs index 39774db5d..7f721f731 100644 --- a/tests/compile_layer_tests.rs +++ b/tests/compile_layer_tests.rs @@ -66,7 +66,7 @@ fn simple_problem() -> Result> { EstimationProblem::builder(simple_equation(), multi_subject_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("0", assay_error)? .build() } @@ -109,7 +109,7 @@ fn test_compile_problem_extracts_structured_covariate_values() -> Result<()> { vec![vec![true], vec![false]], )?), })) - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("0", assay_error)? .build()? .compile()?; diff --git a/tests/nonparametric_engine_tests.rs b/tests/nonparametric_engine_tests.rs index c13f3c917..95dbf9209 100644 --- a/tests/nonparametric_engine_tests.rs +++ b/tests/nonparametric_engine_tests.rs @@ -45,7 +45,7 @@ fn test_nonparametric_engine_returns_workspace() -> Result<()> { let compiled = EstimationProblem::builder(simple_equation(), simple_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("0", assay_error)? .progress(false) .build()? diff --git a/tests/onecomp.rs b/tests/onecomp.rs index 0fb4bbbff..a1f9c6caf 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -55,7 +55,7 @@ fn test_one_compartment_npag() -> Result<()> { let result = EstimationProblem::builder(eq, data) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), @@ -119,7 +119,7 @@ fn test_one_compartment_npod() -> Result<()> { let result = EstimationProblem::builder(eq, data) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Npod::new()) + .algorithm(Algorithm::NPOD(NpodConfig::default())) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), @@ -183,7 +183,7 @@ fn test_one_compartment_postprob() -> Result<()> { let result = EstimationProblem::builder(eq, data) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(PostProb::new()) + .algorithm(Algorithm::NPMAP(NpmapConfig::default())) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index 60735d1de..4f08d72e1 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -45,7 +45,7 @@ fn test_nonparametric_fit_result_summary_surface() -> Result<()> { let result = EstimationProblem::builder(simple_equation(), simple_data()) .parameter(Parameter::bounded("ke", 0.1, 1.0))? .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("0", assay_error)? .progress(false) .fit()?; From 5ca4d97612c7e96234bd9c63d85aa56372d1dc5d Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 27 May 2026 17:00:58 +0200 Subject: [PATCH 08/47] Update examples --- examples/bimodal_ke/main.rs | 2 +- examples/drusano/main.rs | 2 +- examples/iov/main.rs | 2 +- examples/meta/main.rs | 2 +- examples/neely/main.rs | 2 +- examples/new_iov/main.rs | 2 +- examples/theophylline/main.rs | 2 +- examples/two_eq_lag/main.rs | 2 +- examples/vanco_sde/main.rs | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 721bfc57d..e381dee24 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -25,7 +25,7 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/bimodal_ke/bimodal_ke.csv")?; let _result = EstimationProblem::builder(eq, data) - .algorithm(Npag::default()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? .error( diff --git a/examples/drusano/main.rs b/examples/drusano/main.rs index 36e250cab..5767623ba 100644 --- a/examples/drusano/main.rs +++ b/examples/drusano/main.rs @@ -89,7 +89,7 @@ fn main() -> Result<()> { .parameter(Parameter::bounded("h2s", 0.1, 4.0))? .parameter(Parameter::bounded("h1r1", 5.0, 25.0))? .parameter(Parameter::bounded("h2r2", 10.0, 22.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), diff --git a/examples/iov/main.rs b/examples/iov/main.rs index 6851f6146..892d197d6 100644 --- a/examples/iov/main.rs +++ b/examples/iov/main.rs @@ -29,7 +29,7 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/iov/test.csv").unwrap(); EstimationProblem::builder(sde, data) .parameter(Parameter::bounded("ke0", 0.001, 2.0))? - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), diff --git a/examples/meta/main.rs b/examples/meta/main.rs index e86b9a640..522f0a4e4 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -47,7 +47,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("vs", 1.0, 10.0)) .unwrap() - .algorithm(Npod::new()) + .algorithm(Algorithm::NPOD(NpodConfig::default())) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), diff --git a/examples/neely/main.rs b/examples/neely/main.rs index a049b55e7..cfc950bee 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -68,7 +68,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("theta2", -2.0, 0.5)) .unwrap() - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index 8a5c9cb42..74ad08dab 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -31,7 +31,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("ske", 0.0001, 0.2)) .unwrap() - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index ee3bfc906..ef00ead6b 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -23,7 +23,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("v", 0.001, 50.0)) .unwrap() - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_0", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index 107c8ac99..898d323e7 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -31,7 +31,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("v", 30.0, 120.0)) .unwrap() - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_0", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index 3842b6c7f..d9e4f26f2 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -61,7 +61,7 @@ fn main() { .unwrap() .parameter(Parameter::bounded("ske", 0.0001, 0.2)) .unwrap() - .algorithm(Npag::new()) + .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), From 31b6691e67f5de1d1a9a1671fd80e0e8d2e9c20c Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 27 May 2026 17:16:15 +0200 Subject: [PATCH 09/47] Refactor --- src/algorithms/mod.rs | 1 + src/algorithms/parametric/mod.rs | 1 + .../parametric}/saem_config.rs | 0 src/api/estimation_problem.rs | 60 +------------------ src/api/mod.rs | 6 +- src/estimation/nonparametric/engine.rs | 2 +- src/estimation/nonparametric/mod.rs | 4 +- .../nonparametric/{workspace.rs => result.rs} | 0 src/lib.rs | 6 +- tests/api_smoke_tests.rs | 51 ---------------- 10 files changed, 10 insertions(+), 121 deletions(-) create mode 100644 src/algorithms/parametric/mod.rs rename src/{api => algorithms/parametric}/saem_config.rs (100%) rename src/estimation/nonparametric/{workspace.rs => result.rs} (100%) diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index 94c36ceda..98f33dd82 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -20,6 +20,7 @@ use serde::{Deserialize, Serialize}; // Module organization for algorithm types pub mod nonparametric; +pub mod parametric; #[derive(Debug, Clone)] pub(crate) struct NonparametricAlgorithmInput { diff --git a/src/algorithms/parametric/mod.rs b/src/algorithms/parametric/mod.rs new file mode 100644 index 000000000..d8dbdf171 --- /dev/null +++ b/src/algorithms/parametric/mod.rs @@ -0,0 +1 @@ +pub mod saem_config; diff --git a/src/api/saem_config.rs b/src/algorithms/parametric/saem_config.rs similarity index 100% rename from src/api/saem_config.rs rename to src/algorithms/parametric/saem_config.rs diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index e3a240456..c9796ca64 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -4,51 +4,13 @@ use serde::{Deserialize, Serialize}; use crate::algorithms::Algorithm; use crate::api::error_models::ErrorModels; -use crate::api::SaemConfig; + use crate::estimation::nonparametric::Prior; use crate::model::{ CovariateSpec, EquationMetadataSource, ModelDefinition, ModelDefinitionBuilder, ModelMetadata, Parameter, VariabilityModel, }; -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(default)] -pub struct ConvergenceOptions { - pub likelihood: f64, - pub pyl: f64, - pub eps: f64, -} - -impl Default for ConvergenceOptions { - fn default() -> Self { - Self { - likelihood: 1e-4, - pyl: 1e-2, - eps: 1e-2, - } - } -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(default)] -pub struct AlgorithmTuning { - pub min_distance: f64, - pub nm_steps: usize, - pub tolerance: f64, - pub saem: SaemConfig, -} - -impl Default for AlgorithmTuning { - fn default() -> Self { - Self { - min_distance: 1e-4, - nm_steps: 100, - tolerance: 1e-6, - saem: SaemConfig::default(), - } - } -} - #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(default)] pub struct RuntimeOptions { @@ -58,8 +20,6 @@ pub struct RuntimeOptions { pub idelta: f64, pub tad: f64, pub prior: Option, - pub convergence: ConvergenceOptions, - pub tuning: AlgorithmTuning, } impl Default for RuntimeOptions { @@ -71,8 +31,6 @@ impl Default for RuntimeOptions { idelta: 0.12, tad: 0.0, prior: None, - convergence: ConvergenceOptions::default(), - tuning: AlgorithmTuning::default(), } } } @@ -149,14 +107,6 @@ impl EstimationProblemBuilder { pub fn prior(self, prior: Prior) -> Self { self.with_runtime_options(|runtime| runtime.prior = Some(prior)) } - - pub fn convergence(self, convergence: ConvergenceOptions) -> Self { - self.with_runtime_options(|runtime| runtime.convergence = convergence) - } - - pub fn tuning(self, tuning: AlgorithmTuning) -> Self { - self.with_runtime_options(|runtime| runtime.tuning = tuning) - } } impl EstimationProblemBuilder { @@ -257,14 +207,6 @@ impl NonparametricEstimationProblemBuilder { self.with_builder(|builder| builder.prior(prior)) } - pub fn convergence(self, convergence: ConvergenceOptions) -> Self { - self.with_builder(|builder| builder.convergence(convergence)) - } - - pub fn tuning(self, tuning: AlgorithmTuning) -> Self { - self.with_builder(|builder| builder.tuning(tuning)) - } - fn with_builder( self, map: impl FnOnce(EstimationProblemBuilder) -> EstimationProblemBuilder, diff --git a/src/api/mod.rs b/src/api/mod.rs index 52de4259f..02306962a 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -3,15 +3,13 @@ pub mod estimation_problem; pub mod fit; pub mod model_definition; pub mod progress; -pub mod saem_config; pub use crate::algorithms::nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; pub use error_models::ErrorModels; pub use estimation_problem::{ - AlgorithmTuning, ConvergenceOptions, EstimationProblem, EstimationProblemBuilder, - NonparametricEstimationProblemBuilder, RuntimeOptions, + EstimationProblem, EstimationProblemBuilder, NonparametricEstimationProblemBuilder, + RuntimeOptions, }; pub use fit::{fit, fit_with_progress}; pub use model_definition::{ModelDefinition, ModelDefinitionBuilder}; pub use progress::{FitProgress, NonparametricCycleProgress}; -pub use saem_config::SaemConfig; diff --git a/src/estimation/nonparametric/engine.rs b/src/estimation/nonparametric/engine.rs index e766cff6f..4b89f195b 100644 --- a/src/estimation/nonparametric/engine.rs +++ b/src/estimation/nonparametric/engine.rs @@ -7,7 +7,7 @@ use crate::algorithms::{ }; use crate::api::NonparametricCycleProgress; use crate::compile::CompiledProblem; -use crate::estimation::nonparametric::workspace::NonParametricResult; +use crate::estimation::nonparametric::result::NonParametricResult; use crate::results::FitResult; #[derive(Debug, Default, Clone, Copy)] diff --git a/src/estimation/nonparametric/mod.rs b/src/estimation/nonparametric/mod.rs index 7c317dd77..87e38427e 100644 --- a/src/estimation/nonparametric/mod.rs +++ b/src/estimation/nonparametric/mod.rs @@ -7,11 +7,11 @@ mod predictions; mod prior; mod psi; pub(crate) mod qr; +mod result; mod statistics; mod summaries; mod theta; mod weights; -mod workspace; pub use cycles::{CycleLog, NPCycle}; pub use engine::{fit, fit_with_progress, NonparametricEngine}; @@ -23,8 +23,8 @@ pub(crate) use prior::sample_space_for_parameters; pub use prior::{read_prior, Prior}; pub(crate) use psi::calculate_psi; pub use psi::Psi; +pub use result::NonParametricResult; pub use statistics::{median, population_mean_median, posterior_mean_median, weighted_median}; pub use summaries::{fit_summary, individual_summaries, population_summary}; pub use theta::Theta; pub use weights::Weights; -pub use workspace::NonParametricResult; diff --git a/src/estimation/nonparametric/workspace.rs b/src/estimation/nonparametric/result.rs similarity index 100% rename from src/estimation/nonparametric/workspace.rs rename to src/estimation/nonparametric/result.rs diff --git a/src/lib.rs b/src/lib.rs index 4c8df206a..5d7d32bf9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -63,9 +63,8 @@ pub mod prelude { pub use crate::api::fit; pub use crate::api::fit_with_progress; pub use crate::api::{ - AlgorithmTuning, ConvergenceOptions, ErrorModels, EstimationProblem, FitProgress, - ModelDefinition, NonparametricCycleProgress, NpagConfig, NpmapConfig, NpodConfig, - RuntimeOptions, + ErrorModels, EstimationProblem, FitProgress, ModelDefinition, NonparametricCycleProgress, + NpagConfig, NpmapConfig, NpodConfig, RuntimeOptions, }; pub use crate::compile::{CompiledProblem, DesignContext, ObservationIndex}; pub use crate::estimation::nonparametric::{ @@ -84,7 +83,6 @@ pub mod prelude { pub use pharmsol; - pub use crate::api::SaemConfig; pub use crate::estimation::nonparametric::{read_prior, Prior}; pub mod simulator { diff --git a/tests/api_smoke_tests.rs b/tests/api_smoke_tests.rs index e27614d59..a1f54d113 100644 --- a/tests/api_smoke_tests.rs +++ b/tests/api_smoke_tests.rs @@ -115,54 +115,3 @@ fn test_unified_fit_nonparametric_smoke() -> Result<()> { assert_eq!(result.individual_summaries().len(), 1); Ok(()) } - -#[test] -fn test_problem_compile_preserves_runtime_configuration() -> Result<()> { - let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); - let convergence = ConvergenceOptions { - likelihood: 1e-5, - pyl: 5e-3, - eps: 2e-3, - }; - let tuning = AlgorithmTuning { - min_distance: 2e-4, - nm_steps: 222, - tolerance: 3e-6, - saem: SaemConfig { - k1_iterations: 111, - k2_iterations: 22, - ..SaemConfig::default() - }, - }; - - let compiled = EstimationProblem::builder(simple_equation(), simple_data()) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Algorithm::NPAG(NpagConfig::default())) - .error("0", assay_error)? - .cache(false) - .progress(false) - .idelta(0.5) - .tad(24.0) - .convergence(convergence) - .tuning(tuning) - .build()? - .compile()?; - - assert_eq!(compiled.algorithm().name(), "NPAG"); - assert_eq!(compiled.runtime_options().cycles, 7); - assert!(!compiled.runtime_options().cache); - assert!(!compiled.runtime_options().progress); - assert_eq!(compiled.runtime_options().idelta, 0.5); - assert_eq!(compiled.runtime_options().tad, 24.0); - - assert_eq!(compiled.runtime_options().convergence.likelihood, 1e-5); - assert_eq!(compiled.runtime_options().convergence.pyl, 5e-3); - assert_eq!(compiled.runtime_options().convergence.eps, 2e-3); - assert_eq!(compiled.runtime_options().tuning.min_distance, 2e-4); - assert_eq!(compiled.runtime_options().tuning.nm_steps, 222); - assert_eq!(compiled.runtime_options().tuning.tolerance, 3e-6); - assert_eq!(compiled.runtime_options().tuning.saem.k1_iterations, 111); - assert_eq!(compiled.runtime_options().tuning.saem.k2_iterations, 22); - Ok(()) -} From 5cdcba51c56bf8d8d768d0ef4992cd7ee5a31642 Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 27 May 2026 17:42:11 +0200 Subject: [PATCH 10/47] Refactor --- examples/bimodal_ke/main.rs | 3 +- src/lib.rs | 5 ++-- src/{output/logging.rs => logs.rs} | 0 src/output/file.rs | 45 ------------------------------ src/output/mod.rs | 3 -- src/output/writer.rs | 17 ----------- src/results/fit_result.rs | 14 ++++++++++ 7 files changed, 18 insertions(+), 69 deletions(-) rename src/{output/logging.rs => logs.rs} (100%) delete mode 100644 src/output/file.rs delete mode 100644 src/output/mod.rs delete mode 100644 src/output/writer.rs diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index e381dee24..45630fcf2 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -1,6 +1,5 @@ use anyhow::Result; - -use pmcore::{output::logging::Logger, prelude::*}; +use pmcore::prelude::*; fn main() -> Result<()> { Logger::new().init()?; diff --git a/src/lib.rs b/src/lib.rs index 5d7d32bf9..4b400a4d0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -43,8 +43,8 @@ pub mod model; /// Shared result and summary types for the new API. pub mod results; -/// Shared output writers for the new API. -pub mod output; +/// Logs +pub mod logs; // Re-export commonly used items pub use anyhow::Result; @@ -56,6 +56,7 @@ pub mod bestdose; /// A collection of commonly used items to simplify imports. #[allow(ambiguous_glob_reexports)] pub mod prelude { + pub use super::logs::Logger; pub use super::HashMap; pub use super::Result; pub use crate::algorithms; diff --git a/src/output/logging.rs b/src/logs.rs similarity index 100% rename from src/output/logging.rs rename to src/logs.rs diff --git a/src/output/file.rs b/src/output/file.rs deleted file mode 100644 index e48210f4a..000000000 --- a/src/output/file.rs +++ /dev/null @@ -1,45 +0,0 @@ -use anyhow::{Context, Result}; -use std::fs::{create_dir_all, File, OpenOptions}; -use std::path::{Path, PathBuf}; - -/// Contains all the necessary information of an output file. -#[derive(Debug)] -pub struct OutputFile { - file: File, - relative_path: PathBuf, -} - -impl OutputFile { - pub fn new(folder: &str, file_name: &str) -> Result { - let relative_path = Path::new(folder).join(file_name); - - if let Some(parent) = relative_path.parent() { - create_dir_all(parent) - .with_context(|| format!("Failed to create directories for {:?}", parent))?; - } - - let file = OpenOptions::new() - .write(true) - .create(true) - .truncate(true) - .open(&relative_path) - .with_context(|| format!("Failed to open file: {:?}", relative_path))?; - - Ok(Self { - file, - relative_path, - }) - } - - pub fn file(&self) -> &File { - &self.file - } - - pub fn file_owned(self) -> File { - self.file - } - - pub fn relative_path(&self) -> &Path { - &self.relative_path - } -} diff --git a/src/output/mod.rs b/src/output/mod.rs deleted file mode 100644 index 26926d88d..000000000 --- a/src/output/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod file; -pub mod logging; -pub mod writer; diff --git a/src/output/writer.rs b/src/output/writer.rs deleted file mode 100644 index d257723f0..000000000 --- a/src/output/writer.rs +++ /dev/null @@ -1,17 +0,0 @@ -use pharmsol::Censor; -use serde::Serialize; - -#[derive(Debug, Clone, Serialize)] -struct SharedPredictionRow { - id: String, - time: f64, - outeq: usize, - block: usize, - obs: Option, - cens: Censor, - pred_population: f64, - pred_individual: f64, - residual_population: Option, - residual_individual: Option, - source_method: String, -} diff --git a/src/results/fit_result.rs b/src/results/fit_result.rs index f22e1d4b2..d7c8bc224 100644 --- a/src/results/fit_result.rs +++ b/src/results/fit_result.rs @@ -2,47 +2,61 @@ use pharmsol::Equation; use crate::estimation::nonparametric; use crate::estimation::nonparametric::NonParametricResult; + use crate::results::{FitSummary, IndividualSummary, PopulationSummary}; +#[derive(Debug)] +pub struct ParametricResult { + // Placeholder for future implementation + _phantom: std::marker::PhantomData, +} + #[derive(Debug)] pub enum FitResult { Nonparametric(NonParametricResult), + Parametric(ParametricResult), } impl FitResult { pub fn objf(&self) -> f64 { match self { Self::Nonparametric(result) => result.objf(), + _ => unimplemented!(), // Placeholder for ParametricResult } } pub fn converged(&self) -> bool { match self { Self::Nonparametric(result) => result.converged(), + _ => unimplemented!(), // Placeholder for ParametricResult } } pub fn summary(&self) -> FitSummary { match self { Self::Nonparametric(result) => nonparametric::fit_summary(result), + _ => unimplemented!(), // Placeholder for ParametricResult } } pub fn population_summary(&self) -> PopulationSummary { match self { Self::Nonparametric(result) => nonparametric::population_summary(result), + _ => unimplemented!(), // Placeholder for ParametricResult } } pub fn individual_summaries(&self) -> Vec { match self { Self::Nonparametric(result) => nonparametric::individual_summaries(result), + _ => unimplemented!(), // Placeholder for ParametricResult } } pub fn as_nonparametric(&self) -> Option<&NonParametricResult> { match self { Self::Nonparametric(result) => Some(result), + _ => unimplemented!(), // Placeholder for ParametricResult } } } From f53b20f9724f0716d924b3880f6467a24d1b1270 Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 27 May 2026 17:42:21 +0200 Subject: [PATCH 11/47] Delete vanco_sde.zip --- examples/vanco_sde/vanco_sde.zip | Bin 1209234 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/vanco_sde/vanco_sde.zip diff --git a/examples/vanco_sde/vanco_sde.zip b/examples/vanco_sde/vanco_sde.zip deleted file mode 100644 index f8a7bdde410e5f1ef5190f0fc82ffb9a3387c984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1209234 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�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

oAR%Rxi<$-+?zf6t1$pgF> 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�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

M6n2A`%F39Yl+%pHN2XYsqc{(7NPpvg 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 l!iV#bw>SEmJtkV66N)H0(;kkKZmaNsLQ>3C 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⩔`J3SHC5Eo;Rf{iK z+z}Tu7L;sb>|AkyEt0w(EkzdnU7|iFJXg%4@YSd|-bNrRt6HMCo&+MNMOucz_lc8= zhsecv-|KNxXsF-#+itA@spz4Mq0Htg6d$gZ?Z&J2l;0BCWc>ye4So7BN)^{3t?LBc1O`qaUq zK)%hmMsnk5=d6f7S!?kS8hAjG^1H_eu|>&H1$pLkA&|-nMSo%BYb)+PU!CuYC|#%Z zHBt;K;qOo&nU`CN76i@s(-+J3t<85D^qJ?GT>S!nSqfz^hq+ zdG0}<*;WQTk3UeeO}$hiqhJZ+CKy zI@>l!JT&$JM1I#F5kWZ}gIE5Z9*F9 zXc3O{75AM>ahs0D{x2i;>^Ny5L=J1Z>;1kx6&SMMwPY3a&?VvIkavjG6}ZjFx=?L;vhx#47yaBb8fPuC zdF&s?jzSb!q0jmH=)-uNEka{CJ9Y64xj??8!8GR2c-o^h##y$xr4f3|=X#dV$5OHd zan(v6FM~+ilfW_B^#P8|=+0sUd8^DY`1D3S5I~wnFe9Gd`|I=lU1>`n<(Di!^^xdc z11wV%KN7kJTSxUhY8@Zy);RRWP}%1_eM~7^Glbj75FYhTHJ)rwi08I?CZ868atM;T(l|fBfNkZBs(Rk&yA(d>Er-1DRhg? z9`v!KY#X7~y^{BEp~vT^qkjbabvO_z3c$LtFdLpDzXI4s-WIaWxdQL=_4#oRCse9s z6s1Pst3?@Fhhe{K%K@G8K9nBhTozgC=<0kI!2DQhwheD(gFlh)nu(tg7vW$3P(?eR z0x};xw#q$bEfqEg5wOxbbNXXy*)~Tz=>!50B!PrAGVejljbD)!rn^i08!YhHpNhNV z@r?A5=2Ba6uleqh?wfUQe1u+sw@Br&^cl(ek-+9OzP#3I$?egkB$57mR@gqD7xzJP z?a6F-EJNsUK&%?_F(8li<`us*$w5vx2ev~q(BSi0aqs!!4q%C#*%kLUTlw`aaLV>MmWP1E+M$Y$y<;U_KM+Ogy4qd`o$e~Y-g z#S!?5wC`*fA5+h^sakc&_Wf@_Z4{^r~7OQ7L2|kUt1g+KM4a|9uf9?xev+cjJOaLE4f)OoOsL{cN3QV$sZlzWxp{}-1;x_%2~FII)L%Vl8sdTlqqT#Z^Vp`q}der zgJUuwR`Mot^dm`To(5hk@=94ue6}Q$L7|Pe=W;Mgh2z`PwLAWc_~DjQ{c3gG#Y8|$ zz*Oq`MP845gw6(C*C0F2>KUIY@+y;se}xYOk<-G++q3P1)pUVOu*b1poC+w+a# zkCefH(IERr+@JnKng}%?imm@bPvapLjXdLZbJJuM`le)a!{LPB02eV1$Ka(5((hhB zV-Hc&op!CyZzwEk~wEv#`3b3;?Bdv%ttiW@b z4LwyiCxfD%wFtwkM_@ifl|yr6FN0k)y(e+OcOYr=hTau-x(^uvCl>|rqS_-eSSZ%G ziBr6j{v+UgNB+=!EPoe4Ke!}=<5}()y= z3E>vzM1=}{OzX*5h0V8jx5&5vf;B53GP6GCn`HFev!vu1s4Dg7m)Bo59trA|FUIqG z=IKA=2p*42Yzq&^nXy9;J$or~o_9U;C_|yZqQ4nZ@{#M3v{gHzufIai$kFU2D^lzd zf&Jw6X58jW2XxYsG-!ymcfJy~1%#Za`}f&gIF{Hg5o0B{+$@9A@%;tbNQ)JQ3x8DP zC<2^OiF)s&{<3TzM2KgVl1uFNV1#o5u*=mz)ka(o->YkIldL#6Ts%GO0G`O%+-9bL zGTo?orO8X|7K{nYe+xD7q`7#q-DG|}s#*w{tTBX+sgm?!>-8HNc{SjLJ{#W061%ng zdD}#>A@Y*{+DoWIV|#nzHJi97hRz^pfPU4Fko1i#=0z6!EyY@iEzM1`1c-i*z}FSC zR0xnXYeuryGk<*@_HCQLLG?S*miDZu(;v|{wZ#bKh$g(KyROS_o8~H_NE~EvByfA3 zcfcg51Az#%-}+8_M9Jn!_l|opRo8~C*9vMwS>a4z`gJ{Q%>COCGF|lDHz@aW1)lzh z|KS=DB|f5t^9mfHqhNTDLC>Osn1kJEzLd+~f2C1)>Pvtgt;o|L@jn}rlWn-kK+_G# z?aBPgZ3O*6X(sGY6j<=#M20diAL6#UkjE6g#r&ZmS?0z2s9f4j{D^`d4r!C2#E>ZR zG93ra@x7Am^)VA&!8hwJ4A@@X+z3fWJH6kc5SAx@3fnq($PwnDl5Y znN_U7(;`vEcQFj#OOab(YTZvH1Q8edrxxu4RQ;a;d+xa`_YX(-=ZU9Dq5) z=-Os;BpvfI!3wA*@$g#Mk7EkoQoRZ1+2Or0GyB&7n9h{>@j1z>1KFbUjvi(L9FCJl z6Yzi9v@7t+SdMVI0sxXaULs>?>mH7$i_^%SMEkHDtToRsGV27rX-NHhMP3;T3cdP< zJi*A|1UBk~3|JHVOMsLBvNgHWyNCV|KKF-_K6?KWIm z3Bf@kXa$~23}EmAu`4jS{I(z{#-6~Xs!ol-1f$G?!-Y;@tzURQEva>R+`n{%EN{H& zwK>MU-MAT(F4?$+@sUqpFBdAfM@GbPH(nXS2xsx%^R8qC-Zh4XBQE^fMt1YyDZ zwq7p}c6R*9TZD=|DUHfB=)!Rxtk5f4k-SFx_z9S`3w?kP`C5aUi=_G+<%Dr+8@xPq zkiJO>d!%9R6?tVV>`)m@$vet})u?k^IO$AstxjaFStz7&cTQkz&^yjBw}Tq|f@wA<=ZUvGdyddwDBY*+_@6S+P@nA3EAZ3XCMT zv({Jhs7%3~K;sK=%JNjwiXTjtu9s64aOVU;>ed z-ROUS-z|1xar9epC-YgA+=6xWcElXiR-OTfr~E{cwNY|o;TQ__lXVK9AX_y z9M{?BV}9abuCNmq7>3&B7J;Ay_E+d2w0Yk}{^HFxr!lhvPwq3#IC&NR!o{;e;4mVn z2tcvKwTqu7MQh}2YS9Vp_L4c!#GYy9l*o1VsWu|32Yu%^$EM-&$=91*EB|nsWQC#w05SWwyfF{S(%thH@BzL8QY?LoDqdsyE4n<$z_Fqu2PxW-dP#}L# zQjzV#zM7CrG??(6?w9t z|BK4AG1rT6f5mS*sXFzuAhGlQdY}}pbk3iZ6&H?MTxuGiwi?ArjDmGY1bX!g=q}8w~nMML%K*YvOzdQzcB z;c*iyWf~A6lNgYv+EOp=S3VO|CGC6C)PZBmIDFac2$!(7xRVGywi995H|D1b&@wjX zer;f@D-s_GNGI36#{OM#Np9@Xty?MtZAs|vP(38!oaPel1O^HU4oI`U&N)(wH0O!I zh0kr7L;kxEg3e#$6q{O!*E^IHzx zZuCjYcUg`t0+U-DtXlux;Lf?Hhr)O7EA-?-6M$ntLLIgx6V8IT?+^vu-|fLPEt0J<;_VU2uCP)Q0|LOnXT@E)%M}sjv7PkZu~rhe znbgPmtL1sOcwB}Wci&%*OVx#M8gzbJfmiavB+zw3{}=S=dty!M@uuqUdJ$+zznX&X z-?!KBx_fZ4eftGo*^3dy5$Qfos%Jjxw5lPbF#+}j9tWa9~RMnX9@ znmfiSk}QxWj-O2hC&INos^fP)JY6Fihh|#$ysX>t%UsmbmmPGb?UTTpTItder+0@n zPQ-w_;jWmhWS{r0-UI@A`#tbVT+VWy6I#msWMiCn+$%-l}FZp zd_Rr6`}#fdN?i0|#wq(|L>DJcanN0XW0_(d|Dx%S86K+rUdP)W^3a~{_=5Dd`+)NhIeY7%k4h^F)m?+90V3RATE0iL4)|8j%TFZ63cxUWtpc6toIOmP)0_W+0A6*wd0q#G%m@l+zs?14+1PtCe}KiU~&!b&oX}4Tl?iKc&+2hKe~{dji?8z(IW9%tkuH@12x-DWeAycKul zD@Tmmq66S?X#&R=DSnmGhAgphi}@Y!_)$6Nb;J=AfNzS;wDwC_NV4h5Co^qF0+aT- z0+co~^4U=-LNhXSZf9kn=Gn9{slNPHcqJ_0t2fnENqhXsgVt*ig>eZo$aL9u8!{Fd zl^ns;QUf?}-r6tn3ao&9^(vKjMCp)TgK3JY`;|4mixBdXbJ_Fmsx`TpTlZfg)PCs- zg$I3IwGk|az-hk61D8C%wTNaOrJ!JXB)0jC(N~K{1wdE#*VFaysEBhwhX(5s1^ z)E*IdI>ldZSoTDm)!i?BMP7Nz9@1Kim?;^Ce;K}n&@?_Tx&s2|4#7Tq)6fe^f@+ns zc#YB9`O8v(qFRmEv`Q~w@61aPqODC#gNB=}K8)QR!qwiD^!#?j%2M2M@u*U0 zTz4Y(=ySHXmXH68PzoChDhXp_Jf@Eu16^e`=Ju{K>C}~a8 zZabsE(jp%c=fg9b0s+d7Ac=F%enq=}naZ9%6XgpdG}rz`39N zjF`VvB-|SR(mUBVPlY#(?6!igC#B0nFui%Lch=UuL{2LrZmBr-v>z!Qn(m7F+<}RV zf9K?bwc@S>g_*EDeA=ugQ%39Nfk>~RQHYC6tp65E0%3KTZT_3{=x=3Lb`n{6@3XT> z;{l61qA}6HM|5q(-O^~#alkkfxXCrQ^t1mg!^%$hm__05HF34aaC!_tt`vtkfYmhP zm1eC{**y750tp$H;0*gyzlDJUNvaGmCYop%Zsa>C&^_0M20eI}Y44RC#;+_qsyj>e z|M*x;kbC~`-~ajk+4r^l?|=C1`2YP6zg_#k|KYd!{`Wte{~@lQUhKP-2e-!B4pN&$ zG9D!Uo|`uzKok3v_T-OpnG&X_OLu>9*Ct}u0eC$wI4F@D^gL3=s`?HP{%?y3$7Lo) zF=D&`f3iu!t}9OCE9{ykf=`dD%3NTJPaxJbFkmCu7JP_*=O*Q8NR;DDwqo?tqv<)K z&#()zjf|)gc2@a4^kgt0w^#`>C{HI0zW=SWaFd^y4oZSy&ZoqPt}LBOmnIb)&JqDbP9dm}dk z19KSlf!>d28~;7<$`)yh9*3ZBYc8nvMFtISLp5-mMeOOJL{M_&jO-=47vYrB!|(&Z z;coS0P@_!1zPNw99Wt^(_IXQ3;wDXPA}ftIA0OAvlfX^0YW!=34^|7QFCtf41CH|~f41kr8C!%F&bU1ecCYjDIUMst;R z!~I2FeE0F|81EjTQI<>0OH}O)NO_l8HLgcDgPfBA*H#}$e8}ERXU6J$VHepQaK~O4 zC*HY#7Do)lsV-gKQ$B{vX#}u9Yw0)x?>~57gK58fkSgq=y7Oj4bPOc!EzP9pM|Wy{ zyJD&sI#<{c>D8S1ddZWAc17%HpUbe=?nKEU4EYQpF$4vqxU_Qo zkPqYQMjrWDg0@9;hql7u!>fukCWWd)vMNIuIkAvCa}ZR3YmbMuDjZk>9bWJ2Y+uwx zb0=M^euaq3`@*%>?%G3E?ZqV8qdSS5#Q`r!V#mP7&+Ys|E`B@M>{_5!np!i)l(_)LerD+i3Gr&kMu?gMoq%fzx_qjB4|6nInPvRqOVb( z=9I?xx*#wOG=GV0=~FouUH+G7N;o zJ%6-zBILfT9^hxBkia_5fc^WKj12jOtj0JfQQ)!)281+o^{i*mnR#f8T{zrax>^Y# z9oZH*d_5}w6^!5!liDjs0p}&b`nD;hv3HGv(=xzFcTzoemy` z;$zbEUu?Gsngxipe^D2iT{A5NyA9H%)M}uXT7c#|1Im6y^Nd%qvhGOYmAtm29|o|eB}PxS?naedj4N)R3tIVCSp zBK_vLBQZ6f_5CHES1=$MWW14X(3uC5KVf|LEP=y?KRh1lnUuq~74Kw_uU04b_2aKY z!vx0D;)`Bl8M|YgUK1>mI}me(5fageD+d>xMeLPHdp}<$bN%S+WIkXav<2Jeu4hcL zkpYi`YSI?8?edmjFcsz$GF?VV`m6JK7kyp(-q4>{tX`gI2znP8hP+H#oKh+hCN$pl(Zh%Iu&d-1$rK%lyiNzO0qBCnVB#wdsG5Wk`i zF%H=)EL?SEu9lHLpe@jw($N)H1z~_5N1fvfyQu32!bcdR<7oQCD^xO3SP951m-hMA zkl>9Vkf_LV^nD zOw_(e>ngP^P*oeeWGgmZ1&Vy5wAsExbq`R4A3*I}m5uq_hd^z4I>9-rNNg#R3syjGuo z&<_;vp=1-)z?&8FUE&g7)HdH2O^}zK(ESF9v*)v;fb13_ZR_(Nd7gWnWWtj?A8QRM zleyHfeRoa&!&IlT1&*L1yq-_?parvVCCwjUNA=Av(!5@-E^Qn6BOkWN-Su;ZUDSHs zFBHGj7g57Pnl}`R8u}i@FQI?pp=a8-Js)!%?igno{>-R9j=DXsS`QVm6is}k&I0OT zO1>7v350~~>&!c3M0og)Ph82l4}J`FDzm{?Xi^nllbWoVWF#rGX+xSlqSkAa9Qq)> zRf}Q{A)_zukD(r!Jce>y3qmG*Vs&Q#udz^JM-gn&m{xkyv7MMBjXLw;@kND8WB->G{92W;vu)PDMmClC)|lr zU|ffwmnhH-Fjrj#qAN(9p5z7+%#9Tk`T-^5#M9RUBvWs zsp#wVSY{OC^Oe7Ckq&#amIg-J70(li&w5~==lRAxh(~$_{t?qht)1y#JOztqOTho! z())_*Iu=Ub=b*W`$>Ck z-{^Q_P&zcVUeoj?}G2{Epe}CawCSy`xDn(lJb0y{Y>IMe<Bl`hy=7=Zj`*pycKXmj=r~JzFPOf5*QVx;%fnwyfK^~9O_srG? ze^)>vsUsyQDwD8h`c(EapI0WCBacBWg2iGpBP)?DLq9x^fU)s1!8VHdmQyve+B{ zdiOgFdW~y$I@>QQ!IK=sf#m)%Xc}kS7k2eM*ivX2k1P6p%E$|togj7DS{;#zVm;(* z6gY*FBtt7MHb2J~bu~S}Lb|~h(a!BCBR5u#&VZOSpP3~YW#~QAFN&n`*pi0y_dIgn z<!=oMlv*m}O3CpvhiOkzvhx!+&RB|Pl*U|BAk)y+U* zZ9&p%vcV2Xtn_MSl+9=6@1fTi`URKl^9y=R<#!~K8~?tAb6}85wdRbj3?YH|EW^>@ zWux8hX&JizjrQD5U(7Z|-=nF>#Fk<0NEHw5PX=sTy}Pm7$0e-~^SbCDj&`X_prEgY zn*r1pb-664BxpL2v9?)YP}Sl$B#vfhw3!bXVVZVuAG!=1X(jnDGRJ&T%f-X|0Uq9G ze-~WY&-5IjeMLwb2POa=4;wRf*;r2>W!vYAx~D6K?EMG`tl6B23WYEZ$nPi-b#u|` z7a7PLiAt+>PnUW8gfHqdO)&t(G#gcx$MIBDgXTRhexpJq`P9lljite6QOB2kKY&w(P_*@NA?<7gfc6`g58nLjC2n0udzNv(|4cG@Y`{a&Ewnig_WJ>uCA zET>!U0Q}+h*IPxE%WIthNG1>RdGsxA-d~NoZ_88RMJ{|O{$D(V5|zDadJ29=qDH_K z=Slx6L6NmvJh8?nJ%cVs1@4;w=i})08w1d`AjHZx!=D62?K_WCv1Y^{f$|nTI|HHb z{M)ymp+evvH^d`^dL9;|o9r9+Dm-Ct3)2&~Rt8lIJN}{<&j zfB&W~Gg2DYlWQ0V^iBO9mIj!m&N4eawsl>0nW%VO=;)XnYXz2X!uUGgOahy#BVn&Q zZW27BDb(E3Ej9|OG!woofR+l#-KAeWqb}Ekcvw9V08c=$zaWHa3jj0=D~TbXn6MfE z8UvIM`W*>;XR${7sL8)J^1lBp6YkqArN=XLtbNd*R6)mc?&R*Cye>`ijY`ybyq2d` z85~-QM2~0GWo!WU3mOlcV7-o8A{0`kDo zMCi`Lg6f=a3}3S`aw{1FkX7Di)MaWwfP%DzRPZP;DMf{-=k7Xnd0HJ02rdJkGhtmZ zk__j;__t=Ycqvv{?an@)03)Q;2$B zJ)iVRQnM~d3Lk`6O&HF52ECUL1qmV#Oac7L>)N3G+>pqexl-xGhK_2qa#hqP2CL5P zW9_YHc~B5Z+v3f|$}-sNEqD0=R(Ejkhu zABC0Ci_Y;KC(e;O_A+%rz|?3Li zqwFy#Y%A;nap-Hdp4NGWfJeNFdNh!`hV_xdk3eLH%dW>~WF0B0n24{aE2ySjP&Gcn zJgcupUdFZQ&P#U;GC=Rqc6z?=;HGw~$23tl?FZptXe;G;Gy4ug+h4DOG^=OFW(mUU zFqRtsey#{wc_Z0yFYFT|bp9|L3X#2lLLEzp5&;Sp_zz50-Bn|k#n=k^`^gzgYx#17 zQH7mR_xZlcg7MkY8oUzK8%_@>G~MgVScvFH@UlPO(Y?P}88E;Z_E_i`Nc1bVL0mx+ zR+A}$t=zpuMJ?GhQ4j)?)6g>vQ!Kg&U(mS#8d>SLm&#^hZUoGpXhfW;*`AnwYmR9H zMPutlbIc2-|)Ecm4xg1+(TTgq>_q7E+N(bhRji#`u z<=kcos(W2ps?>kLEc7=;9lxao1vUPo74_H0;OC{&^JFfQsAdafZqRIamvW$&A;-%2 zNEJeu?IZ@5y5Xx3t_9yfJcK8O#Gg?5Czi4#M4<0-VBi3tbT_b}WE)!{mm|=z&!`K& z5o5{ijN+!wg{V@nC!V`|iYz@WrtBxj*~($em0B9z(x(}9Avj>w(oUc!SuulHjHgr8 zSYet-J_rl6ye%pKx*tBcwiaN)HyGr&6jcd)J+lBK=?PuOp&}|2Vw#3qpgcKt9}J5a z{u#2(xC_655}l^}9rKHNUv4~AVPrQ1#`}-_6(7^~9Xex$$mtlh&#(&{^!?lK6{n$m zU{2~DKOiq7;~d(#V+F=H+rCQza^&S|t1mgDE&#`+s4_=EMmgRPOU4O<)O|cq?N`Dc z@&@wOMAC9oz7qC5!e%q$x_2ON+M7Lz7fU8QDytQftV#qFqm~qpUxH%@I6V zOYqJ$FfW8Eb#h-gVZv%hg6iLKyo(1Ci^DS-3+Gjpq7{u{@5rpaMOf(Lu_Z1e5 zV>g|)1SVSGcse83dfJt87-=YK8+@P+v+@*2MO!kev~p9qJ~jt`=iCb8WQ1xX@hV@N zVbA4TXGBGq9vLtleDec?hR87@|0q&GW2`DE7~k=JHkQd zC%A{Vd|@Pq^*Fv(`lD)9hGC=ji{Zq0FQY^;Wjmk=B>QcKT@4OX|1FjYQY4~JxK3zN zK^ASIlC@RjF~_|M@IKBuVse^TcVCO}>qQcAWU`IRc@jj!ZG_y9q#LNR=Zf+kH~Qj7 zb?j9Gs5f@HU(lb4weAviSU9CP9KbS@S=mT~(go88gy|(^5sQ~F5;QQt8{$;?Ey4ZA z!rIhYwZtl6{7%A`pbU~OvomVX?|*56P;2MLvKJf5rGAFnLcn7No@}TRwIXFq7ZA7X zy#7lCWK@ztZ74LMePURj{8FZ3Mc3)@OOAI2o@^-OMkDARiHq_12pnv|4lma~qRXx$ z8gqs5|9{gfx+8({utL=sn}N?67t0NLgt3$!8p&BB7ynaxzURdp(^%9z=%uiMN-+L* zA_F8OzOa)Ih3*iFNTg469L^{w83WL)CeRS_6M|G{3D~bMFcu)^Yc7Uu1@6CBC*48C zG3q)Jx4g9F?jJ$&2(ZKCP7f@)9Xy%{f^(c&t1#J6<6n5P!w3`uiA5k6gekolot1=r zqD#G-ZGK7zskiPkp#BB^z84uvUvYCgIlB~g0&ih@MF%jVa3gShaK}=$V4(BgMYjD2 zp!N9Rc%Z#Au3pp;KM|Gb72(~(CyF-8t)-mWW6%-lq{zf=@lS-*>=7(pargDfIkXsb z$B{VtxShD*0n$v$q?*M$G$3ltO(M+mjB~<~F1s2#bjCf_duwD@lr=c35elX+PU;f) z_Iq)395&MG`q=pi5MX=6tNrWOjN8_mOU+Hj%JcDqVXon?Y5_}K_otyj&);mk-K7x| z6CVJW69RDsKG&Oz!K^!oi&g0an=0@KO^%x1ggj{IX`>e-RXQ2=jeK@ST~F)aeW}oB zz~tPCA{y7^JLh9Ptri;-mx6|FAr7_-&!7H#)-_+Dfqy=6Gd-ii3^Uon2tsAw>S2#y z5FZ;vr!*`Ncfbx$+veDYzs&NAXE~&qt|&O84@|89$D)egZ^s9XXO2nat&AaGah&Q%yQn}n1x_tOvh1b zYISK*U)*G`LIl^@kZck0@%gqhLq&i8NuGYjovVAYEb|Of=O_BhkUQi*CAX#EV~nH2 zo)xVz&A3LQU!4!?oKf4diho?@AszxPMIxC2^2;!0(~+vUMED5m+_AEBXdZ-d^mxY6 zG{c_DD*iTxdq@LAW|s2u6AUudrh6Wcd#N#7h3`@#8W;6P#p;ZEEvtBnzGd#^o=jYI z(#;y}DO2|?*&pBqkjGw{Njs1`wSN|-vupLvd?cK==ZaRqZt6SYX4oN#(Lb!07V*++ zi-z%DWKld@M0q;7Gw955h|OIwQ_+Jv1npN*b0vUVorQkd}`A z0~_Eox4L@1Po#apBgd-|$qe+$i`FE6q z7JNayFSl*SN6tRbR0dzY^81R(%R(>^zp-n?L~=$=K7kvK8S`4c^LJ<=e4|J$)cd0G zGCrq5LV7nwf*BB9d(m%w!vRwo#;#@U%N^bjqvw9Wtq}D@whp-AriAc`=v?XZQ#UJ_ znl#;Mm|l}F$3bSkt+oe)?=8C~g;gMo57hMisYl}sua|4Yhtx}XuTeLPLe7l&%vV+P za=k>8*L=3jF@66;`NPFFYI~zEebby0^Mq51L+19OiW$883KLNJSG`Zu^dxr26XJ+^ zMHr{vbo@({Mo;GUIQQq4p=tkS0>?fx4^DSR$xv|e`b2$d!0q?JlIC^mj*jn0ijb%Z z-v{W#xa62o7n~!mN=k-wc~U^!Ac{wh?<0F?i?I1~#sr{9!r)4-8o;#m``4%?Xi(Hz zCz|7ht{ECZk3q)y*2^Z`3~L1b7s($NFaakm$F%@!*fK6JE;*<6Yle(x=_czH+;vWW zWNXe;v97cxPOwrw)y3Rr*fq!t_>{0YKwhl?)P$~Gwruvh>=;4=jzi2UJTKC~{cC=V zm}}I63Nk)pGPpFzzI6?Bi66vvehWY)gRszR##i*)pL9?{^yvA)1k2b> z(PTB#d1;pD*P3+9aW-3+H5tpBBGa+Q`aMA(iUv1~`%$ZU_e)=zQ=h09y7~Onlgd%5R$)MLC+(M zJK5kHGWfGcG_O#+kr$CO?NOQC=lef?Ee{b zHZw2_&4Ld|%?9Q-6O&EfM@YJF{eI(!CVe1)nT%9P7`REJxidF({DeZ2V^L8FdDY->X_J>L+>okQ%|2@zZ&- zErsWz1y~~%N5vjjUx2oBJ3>i1G-wqTrB#E31y!t?N?7Cn%M6kj z^tV;pZ^Y8y(990fzGx$i5gs|$gM!RIGB3yQ?&S(})TSUwxaA87qiKd+GnO97QO=U2 zdPQv!*OIuYsOlH*{EeV3T+{w!9GwR+)wTcvj9=F9s&A>7NhKhSoTUwtSCHerMbttU$c-Ik(f6HE*LVfzU)vm1Ze(tWy60;niA}ONCaMvT z*Fx&~Uh&zl%t5qQX3%F1!yt1oZ~QX$O1db9&rf{&T9P3AW~@*mZ?(!BSwb0CF0hJv zE}W=NWE3f#E@xtbYn-1xdP#*)t$H$$t`9(=*rQl0;oN7;ea*sTs}LJz2**`Xw_rE9 zl|2z*0iVw|z-O;#MW`k1TO5mjQI9nWoeWD267xjv<^)aNqa^=L zE=jknNf?#xD~d7WFMoBY-C2%rMlOMYM*B~fDl&2j8ml^dBz)}|bj?+I4rUT?rsHXQ zyZ*7V!plqN{PG`P-#9*cKj8mfzA5vEzoUw?=3r&)*4+IRf?Db9K{1E4mZ*3IXH2|^ z>b&Srk#O9BfF|+&S~HbP3xmjKIdzGdjbfazXFKIxo#~mA`|4j*%&U#+-)ig8Fj`^R zP&9CJnR<*+%5>Lc2_-)0S1AE;P%cRc3fTofuSlFR&)*1aoT%oHds%)7ikacsIC(E= z8kmjVIVX}A9r$rC3<@Uaig~R880e68HId(}sd)scd-L%pyme81bFeWEoqAOVPt<5C zZEI2c`l_~|UO`*;c(z8Qbqm8UB-pz34HQzSCb!ZU0U2TO)@R6hs;X|sImE0Nq%8GX zBPmRB^84}blO6nM=U$sWfRYIB$hS5_zB32p14Jmxzi(b>+Ht>;jB_$y)w#6Y=*L3} z9;GS=0SqU~%xAv*{%cyqxZ{@NfI6hN-HC5rG30#DrzRV+ow#VH-iq+|4FcCXmF{`7 z^gmq-aGS@1pXp%T5s+iwLp7yjn-4%~%4$mNPv(@K!o8O;{yC!_v(IDld zySA4CSvd@8t-_NC`ypGY@~uuhptN2q-XAO7t3_=u2ADV4Via{qz8eD+9HjmTt}u4b z=R95dnxK%S?pIWCwaMGRYaG27yl|5ax?=->Waeg0OEqa1)+x1znt7J(nBf(5YnaQs z+|%%!?{ZtZRx9uRGeIFm53WWhf$pEU(XQ)?n73Tniuu1s@+=#TwH#-g_sWcTrbhRl z5lXb5s52bVViq_w1tvh2xZLQ73UC;$o zI-QaUtX5Ht&;w~}jn@NTArggdrDzftK>Ub4vG!PksJvN4U2$wI_qP&p)eSk<3g5rs z*U39aBaD9cEv^sFdhQH_%jC`=*ZpI&mqnY_l~GZr-q~i{=QsQ^t|V~JA7%VESBnI> zxt9uKFC=d@X|a*-SU79{jc?6ys?PZ>@VgdbkE~bBEE#|cjQwl?j{Cpd*LwavL$a%X zPGr4kXU+buz|WGE)0w8}`tD(Qjt54qLy|rs5PRomvmn}g#9p8^>YR%SnQ1C~^Njl& zRK1ZKeL?fa89c(K{E}_3q0V{WTGk`8ps@@g`LsieI3&iedS}=*OBsm~#W1jXxHoa} z2$|M&!jEOC6m_k;;8fG2ZI?kdSd#ZzkGqB`0AyFJ?C6*a3(2;j6G>1KgQ6gATdM1_ zu>iS7i>rpyjJifC=Jh)`BbSu%?O*Xg#Psf_b>;n|^^loNE7VNbn0 zL?!fhmiqArri)bh3|mlMu%0_z`cyphw@{s@XgTw;E%N4fy~Vr0#kVGIzt-BWiAs!B zV7Kse1vRA|M>%=>_bF4pE!2azeS%Q+w9TlZP(*8K*Fc4p(+$^zfPC!YnkDs&p>Do| zxvwueCV)N!9`}k%T+jxO>&6VcrYcV8E3#VmlcA+9oN|p25`px(uD2&%;|l%vogcM} zfmvdDio;QILAaWFdr|Jnl_2 z0zX32rdF4eEy&|rIK46&dks*=bx-kc#a$zokty8Ryf(WN*7I^d1&x@=yTu=YQnT{DA4xboCQgi^6r)Lb^pG! z@gq=h+tUj-e? zeZ@8YwuJky-_)i&Ddst}E}0i7$A9Ozk9znOZTreePut_=aHolR)HRnrrk)gR*^Igx zB+iQs?uNRTGslHQm$TeiK0FdIR3fy{#N}G2y!S7!$6ccx*hy5^ zwDMbp^>&RAw%oDb<3>jz@sH1aFI^XkAWUgy;5FXy%1?M`mI~>Y;TnU;o$9-o070&* zA|Clnf2wJCUq$lBY4JU9TLYd;(g1jgYhuEK_9u^tCr~fs9G;%t5Bq%;9F|}SpqZrV zOUPRLjd(Kn88=uQ5PEus<7ho1F-n4|PcU7e(FMP(M1n5}(Ph}OkD1ikZ_1-d3EC0w zJIVNos9z%}Nbo|x(nB1dFI9gtrfN}OD2~s@#q`bOTKmm;yiZ8RY$=@(XTzR)JNn%z zc4F)im&_vr%tA<03FHPrqxYJD7mP%E59*RN2E*4YHYvK_x*A(~Ej%&KZai_>GS->H zBQ_Y<{kOs^E#oC|MAvq_Y?bgh2d+p9Dt-FbfyJZM6F!npxrO1WkC+Yhdp+#E$_e&& z8dZq9Z*}&{K!RL*8Cg=6LAHV@DDPLJd+?Pv&Z9Hvf~{&VI_WtqleW7;id1bj$kFN! zv6`o`tkz3Pb_CX?x8cOzeh>TWwosdQ=4z*mb@+FU6Y{zP6k--~R2zp$AuwCZV6eKW zM}+r-yZ(SL?flbiiSSs@_;T!t>tFX}0i&N8gnkWJs~D66A)=@=6*t<+Lf?DFT_F5k zlSZ`E2x)eA2qHP#1b(cc57P`&3?ut&rG(Nc> zrKr|(0kzWexiCW%5m7SS(*pbKFuxMJEj`q5@7XepPb1C>kH8#CV5=yNwmjaEW){jm z&!q~y<8xKP{Cw!uwj@!j`9rnM+->}*1l~|Uj@bDc2olliK_JHAl3H-o@d~wpS@e5z zef6e&^inPq>qfQ3dy<#k`d3eBXc<~Cjq5pMivPNWFvlEZn_GB_qUOy3gl^h{rbb;q z%W2WWIg6&+p?k%b13shL;A5{6z%*JkduVG%ylYFa=Grr_qVbmJEqF=4BCMbNYQR)l z%U2W_BIh?Am^t+w2ayWAlu={2w>=r_0LP6N+ND7UFbE8d|2BL0O?#73+Ljv{!+1Ml z_Zgw0dq)0oYT!XNC9H^kdLOGEqx(Hpd)5Ef2WBt(`3Z&)4MhXdtWw|CBmX!xo8I$)6r(F3u0MdQr_gh)xW9?e9f|A|gkiSyJ%djt*jSDbB-7+>Z!of9;NSV6U$@>B z6_8`b{c&nYSh7Q7UeXiR=458_gzRvAUF4`}1>o1RvF}i{!Hx)Mt_S|nYN9RNwJu`# zR+07M=mQsv;@}qA<6BFQs8szVec)imH~a6^{b)5u2DF(1(3wbJgE}C7(q^SHXBKWm zxdk2g6!)I3JyoP_id^>}t47*AzPOgY7(o-3QE~&6{Odc-H&k_l;hs5LqN3MDYhMB)YCSxfK3qpzTB%$lTdcrA8GK;EMnP7>N>HI1v8R@c zJOg$=TR1#dwaz$-pIN{4pJrJ|kYwkQRz6u^J-nOtujpS75&(TSNPKeQN4JrjJXzCu z`t&7Q2Gr8nU2}(e^0=fIE|4MpiZ6{gN~}AYdv!zIPvnC#9RH+RTL1BC>|X8d$h%+J zWgCQ&_G1H@E<1BeGyW%I&3bF8syl7N&A~R~t^_4{1h^Hn%;B~-ce~IwkL}qi?NJq* zfUwzsDBL5UOdTomkZrxSMXMnb%=e73E&O0N*#pph7`j1oRp*yS zymtRlF-yJ?3M;&sxa>3t?xYUds#7oVI|K99rmMgT42t+3Vg+7AU-uyscv?H-F1wgM zor>m&8^86|_P`5bA*C}~Z_TU?luRpZ#a+E`G&JAVWsY=_>wnn>u%$hUbHz1Yq>?5pil}ia1we9^{0>CUWRq9)7fBB%jr6<5CuQckn*U-JZLSUS5Ohqge6PH*r&0*y0`iY0tIihf!%RMkscwYI{=( zJSlM=3;I#x7zHFioHa`T)?mn_Nxg8bxN918pfzujjlc!Ojc-soN!ZAVs{%;tJ_E0jP^3T|F5{@ZtAx`)B>c;*<*07M9q#`dO2@m` z?xhPu^1kR3Bn9h)Yb1WR~ zo5h396b3Vg4$4K-iOd8IZx-vx-@r(E^w1+b5uGKYPO7ogWS$v!X`2D5a?onQzdhof z(W|amSG7X6X41;!F%ofshi1^WKgswSX^GAN=T_g<2h=~LXi}a z%LjYU&p1Ovhyw)h8F+DS#tmZsQ)VCDpK(f1wM@fh#OrFzp-$(etu+ zf8CM*OVgJ_2;0Raf=|fXmhB%wbR#GH%1Q3``!dcrJC3D)+BL(@ht)Ac$FZ{l0UA#` z3RAXhdMw-h5nQEzl;T4?PuN)c=H{2t&A9h(zJOqNvc`c*$m6;exK!d}A0M6EbO}Lb zuNn*QaHrdIWwfQA(@Jr{Y2WWB)qrS6$6`^qGz_vW^IeYG~D3+u3fgK zLM?J6u%~2rvKg>$^|g)ezmBp(iRG0V?$ey!!V@&&|BCr@`^|*VVSuE<%5|cTb%}oZ zE$;p8g;vtCoL6Mr%390Mu$)-LbdA|o|64;6#$gK1<81_ndCafV$pp;S@3j_Au-C2>u8{biBv|N7MF9!4*}kX&KV_^VLszkB%Hep+WF zSK}(8dDF8ON>#vy(DJUmV7N(D_bLZ_P&wHkZ@i8E?2Nm_&dA#GAp+h~L0De(K&-X) zkK8QDv#8))dVV{zc=O1ZR3Ct)T z3Gz`Wla-BY<;7(gSI%2~NQ(%C4bF5vdo{g`A5)6+lwlH}d#!$o*6y;~f#5x>BdS_BDwv&Kbsz z7!oYZj(DOS#|nG=%4|^WIR3`JhN}rjNMdOa#=q z|2iaZY}{P&w$#X_Z{3)Z|lAJdXNt!2WP!=<$)$6_W)tJOUJh;Ge2*3Z`9KiDwy6C-< z8nbFgEP0+ZGQv6_3ac4BN})dE&JGDw<(uv-b*k|l-P$2Lw&uko_R6JTfHtD&K=zpC zb@X>RL3hziD%rV&Rs(*FE(nFi(-h!V0IMq)tbI8GCcn9EV90VnLTuW}J%EDq1E`!+ zX*JF5aS&|qH<%(#SScfGZ?#Ib3L)`j5l=znu5=}1j>hHpyC%*hv?}bDHfllDo`3h2 zdFH_%b7Zu8wKgA}CRZxKmpG7ZrHlopFtxnTrL^j$9Z`LzNOTkRQn674G{AbF+6>;S zw(OBj7Js)bgfD{42hD}$iWhmFwkQ8o`y&~JR6^-yDNwpr*8&s64o`>>$Bes9GXI6U0RkNks*?}{$qqWP@1^-k z?UsVz51df?yahESQ} zHvF;29R#n=;>d?_eGTq%@e`Pt;#U1) zMOgq+^!v|z8Wdgmau&XKJ@ASfnQ*^X4|~g{>B?s#Y=_p1i-eg$B??zP?}0pXu%Vvr zRcHG%xsh6N9c345(9}Z=q8E+0aUM1D0G7J&vKhqVOd`*}I%pt6BptLQ&qNIZmWY_aLY+EiO5`)5TXj?LKne_6X*a|E z9bWMo&h(HpU1uq4xQfw&d7QAPEP-Z1RDkoiI6cO}UgW*v{_>G%g9juJ1dzayz|+lv zD*q03c^bXi^Sjq5(1P!iZ#mZD{wO@rKZ*oJkP8V5a3En-9@d2!BR55x_g|YKv@s>< z^LyI+&!laO{k)V(i@ejjRFAx2Haz58)P|rW5F@Jrsc<1?-!DFWw=yJ~e z0&CAcg)}Y~Z>9^xb9s!#!d9}GR$mK1W2R--9|}*jzqrGLX&mBmrf}B!_O_a}8e{19 z@rrr#tsUdg_B+l`$sc#g77yIh!C+V%JQ8TzD)5I4w= z&~;va_&dPN8`O=lc-A2D`g`m+o?6_Pp=ukBEa1pJ(W13OVK$}34Etm6P;YpH=ZGCq zo|ZAV7L8UwufSJygw9Os&InkV`I8c0A^j1$&g&0*=LsN0Zvt00Ppp*(@rE2y%W%_E zj`nx7VE4#~0_y0y5G$B*e{3V_hn)HjoXs3KH`s%Q5bR!E2xG=80Z`&z z72EZPywd|ov(0cmTJ7GQcwKBezOd5xR1ky!BDcBcuQjoGwza%J?oJ@V<7cCL_4?GX z?fJpp>1NssBO^QUptbB16+R@UIMTDVwm&Gz_$%-95P)<59ngLa!rvgz>w_>3!gFfz z&W(!a7D0R6&2a#KPuu?>Ng9~)*b6v`#7-QLQ6I;ZdhRdZdjpZ&BFD1V;_^k|3Nl_z zn^pFdWGyu_&Q|!AI@u%aL5jnNcB+fN#9xucd~ZK$ZSO4xk$1#IX3(~x#$<~q7j?jF zFaVq$_ZmWv-)Vk7pQ+^a)WeS37q*nFMPG|>u2&X+Bjgay4NW!thHB2Uq`HS8y zXaBKw-rxeb(7s_Rbq9TiD7%A?EgL~dNfiah-nx6v^wa|TpWbNaPmon7FTPS ze_$8T??8M(BKnwjvQE7nOa0UCme-46l>F~Rxu21$CxlFxK1B-n{ zU0o6X^p4Z56S=|sxMA4#)ic*bhS|)X73gQBVp?@M7@Z~GNa?(PRN^aVEn&eY+tz?O zLt+@l`>dV~p@B#mYC@G`Hh>Dvjx!EdZN^==wehd-dT+q-qv-8%E*uNeb3YVF1gPYo zu{Vy#dwZ)yL2)5rHd5_#M!lAPAqPW!K)PQoV4}y&5f2RRJW*9xJn9I&mOUM(5&U28 zdlW=7Y+v?UGG}kveaBs7REJKK)aY+f382f)7;1B%yU(hwVFVFQM<(>Hw|1{7HmetC zvYvjwxcWrcMghC$sL6!qj=e{ZfFXs88?1@`4z9+G`}~I3ZzTF+R;~a%{=3SrsufZu zaWTZ8h>r+Nl{B}_a_Kd*eyq69;_RqbNw9TwX92Y|7?hDmhN1e-9h+KRLH8$pAFayu%!m+K!`}*`y6E$Znlc5tZV=J4W^QB z)aUs3o*!Q1TtciIGjw0?Gcwp0PXT)Eh)Y$69<`^gB&J*ALQDs={l= z?d!c=kT(xVnJP7L;c*dpO!IT;>b6pQ8DCn<>EIn8Ni(h|>bn+Vg$3P?#W4NSyfwVk zz&9!3RXfZu$Udhab!HjdsA#3KfLT>8Empe>7aI?ipd>S^v4Mb^#=cWJ*KK2zxK~Tz zeb0JYwcEqRNGg!H*V1CmScHFgY&X@l;_gw!A);H&^GkKj(KGt1$6bN1?aXl{iFs$- zeSK~(7sGMrq$M@-k$ZeeI0~Cn8Qd#zu}<9`xII@bZye(;o@&e9eyOoaW#g4jh$r^Y zw_(Z!MAM-OE9{dNw?-Cwmx>zfQn9|bwG8KsDr@c1a=-`v3QXZzw7!^ToVjmCj%hE3 z=NnL+xMT$itrXeh-yMZ{ZFDqC4cz$n`gSj68KRuy-d=I<_1?T2iA_ngJIoxX z_`;sJS6r7p&OcJnR`T4&zAf$KHnG^(l4cE71swr3&;T@nqhEcO?b&nJ3R_=E4m`{L zZQy`hk1a+#6?n?CO6JTapvz;%IgW?RNk#IIg@{~DTr`+=a2YcqsyBC2@`zLE^NI6a zOQBU_uv@FK2v8jQGs_Jul?f}<%y%K z7neXP@mb*WiaxXvr7`jh{H~=q$db5@#$9_e71V^L4Bx|)Y*#rFX|gj1vu$!EpGiAw zf6f8?wRBsJ*`(eEr-$y}D{u!D9?6x&W6!Zhq5lBl9|vwgHMsdblx*uaFo-_}8 z%WEu7!;-(oH`m5b*Wt|rvrg9^xgraY<5E-Zjej1I^Yy^(&!Fvs4Kv9cdn|#^J@^bX z-KUq~QxB_<0X%430^f1EjjqH#!~UizDS-RBJa8`ng}gd#x0fnH3? zs`tnV5rspem*5uagh0lJpn>Z88hqFBf5tT!B5$lJW5tXMdS>L_qq!=ssqOBLI(nGD zc*o<%=_kG0R35+D-)T*{!9+WB2~!G$iOnQgZ=+1b8hbAQvCPOSmulhSM5E}Maew0) zI7|FV9wb(7#N9%{aQU3)c9&V%K@p0I=o`+8l#&ZGVQ1La8TU7@Ij;EoM2~=a-EBVB zq75yRuWFb!=nIrVL*%LqxJ9*y?aeWFS^Eua^d*oU)EM#W@<$KhRodWhojY3r?2LKa zR|z~`+WF*+n@IPo{q?Qsdd#V+&XfYUlJq-SAEz^tDug062LKK&v9>tUt&jzQ%gnfc zY-^YpYW4RRMF-*l=zD{wy-@~GhXe#IGi^`B1^ZU5<6eEG;nn^yY$D@_^z|Y~_Fx_R|GJb9K1GwzRI^Gdl>lw@2Hl*1D#%hTxf&QJl!8!iY` zt5;m&0T*{ErXk-toIiq%(v;f+H!?~*ozlx4u!m%+*Yl3blm5&WQ;lyO_5g;0w?9_g zAHgP~Oz1#_b5qgB1^kJc$X;-#=wF^kLBpmqK>A(!c3+CV@ zDqZ(C`{4%DI1JYKP3Gc!VMJo7=iWPK++V|_2Ve?TN_bybjfHoQ-2YuI2p83xG%u-7 z?O%xKH@vrPrfBD1#WkR-0|A0+_ABrfP-hCDS_TqYpO{{lyCbX)-yLsq`r0$>Pj5}P zox!nY$T(vqtirtej@k5@>_(_*%UjbtX(iWmMb*M(AtSjU!9dn4?)7JClX>Io$7 zuD?ca@VbnGOhmmq6eR$dRZ%RRE$&7 zl>NP~KT{j9VsO&b4R59Zz#JUh%=hc;b^CCullBD#_7G3umYxjxT&u9u)*yq&&pjee z_GD@UVilR@9R(<1jo&wI_E1}r@WmWbhX7J%#a(k7Tdx_h<^~T1I*zhFKA8FRQ;2Zt z4ufvA>uYgQ1MK?b?UU`gt~IyOfz+cx?0DYrpQHYbv>UBkQ85vE9FWg6dq9~En9D1) zhhshLn%m&DZadj|N+%&~OI`Y&%>Fya2zKdIJ+YNdSYP8qIg$bP_s;rnZbRfZ(4HG_ zzGeUfN78@DO&F_NXZD6jc@`0z-?y{TSYlipAHC-4ztPQ!&Zx@Dbo@=T-qvA(7pben z9oMuirm479hbxv@SC|)5T>JW?0h=G|O9OyD6PBgoU0zTvf?!VR*S@ANxd$`-WG=7m z93h5t1^$^X9f%fVALO~is-}Y*m>_6p!p5Od75T8b^BV5I(T$$zai{F| zUxifdFF}(6uDp8r6XWve6{3hIuBI(@Kke7H9(T=dRBWKDfcr-)O0~DR#j?G$WltQr z?8dlDR;MqTdKyP5Ur|#Flz@(|43c%~Zm;#F_75WI>#VL^rWG#>b2&$vr) z&DfThGWF~iVqjczHOMlt@(YtnE<@CO;zG(*I^qUtR- z>%|Mik{@R*;V|Qb1kTKqCdWHnc&_Kiu6dLOS2FvIHpD%%=^`@nQHD9eGsNSr6`HxJ zkkKxIJAME&?qtD0W}0UhNjT9j%4pQ{lX{LasE{-yxx?+;)Ar$|DQ9}5ap-6(?xNSI zob|1|r?I)ei5d*Lk|4i1jeE9A>6E`s2tv>y+>&#+5!ZM}2|9mohP=Wehl z!!8otvNMe83{;UA>P4M#0s?YfQ2k+(v=^{rl6tiG=>Z?|uLbv-}5wIix3CzN;O`mRdp zMS%mZuI1d3&A3Yx4HpF=@D4g4AFt~o9++APUtWsqdX^|ICPxxI z$VOYlJRouVwnWi#gi#negPF>C5ldSqY5~@WB!MPJ=A~^_sOr;3Jn zd2HNv9=ymp-^lQ3RiIELE<8I?F&(4owrFGAA-0px{QtDwT@vLslbqoVDLP1y1jzkw zZ1`jmIJ(f+cN4b9wpyy@;SW%#%6jvhaTgQ~vW~(UG(tX>adL_TO|kjrI=Sj>qU9&q zRng;vB4zts>;j^BTebC-<_O8`9Xqxxkj@o>yQtnIiUH=J)k-kZgPbVq|6S}kpV^_b zE{Wwv{nTD(L3{ULK;b(79Z$F~PJfijIR(e2h(})BcW2z?spPByJ`_Qu_*IMGwNPP zKvhfY6dC{a4O#UCer2r$>8`i>%Qr=1p#w7;~Al32uI_hNzj?Q-t!&z}LlFXeTXHW2JU*K1I0Migs@ylr?8MYQY zOTtsbwnRF$9H0cCorLGha=p+8F-oD z_ylhd~pgLwMy_AWylBj!#^F7JZd$YiIY zn#k{0U2^G%V4#>RL;vRqeI;YDhP1x=Mc;pxIJ(}3k}p(<_oSc-0WAdr1Eu)k&p-?n ziHQ?)BbtQRQH!b7$Bpch{Hnk1_Q$)K3PD(7Bh6?V`;*G@lJ5`+%7%LEmK_ub>6Dw- zb9?4<6A=T!X~{sYf)tq~#5vEPn!k*gySKDZo?dp#DeWpz?o;307x?uuvgVsntJs|N z-?)2-u3jIeVdr;D@up^A=y7LgK*R6Z!#(|u!hNA%HI?Cp%1H2iuvMPKr*cxeCwfoe zj}r4X_$PmS0FTMF3~5ZZ09Zh$zhPgHR;qsq5l&iQyeZRynW_fpN?dgeJR*vF{~C*F z-3fIl(m#jY@A%Uvr1c{FHJH4Iuw*BGzb;iaYysr%qvn8|y0xRv_B}Tv)*RZfE=OC} zd(8)DD#G0RsKhl*h6vPC-#L4o1JQ!-R68ADt_mF1n8S^B@(kSP1$!@>Mi=6g^*8z& znvpO=$Ma2vNlIH(SGEi6b3%SvrF%-Y`r@=+;ZWdlhvl&)tg^TR$d#G+8jgFQ2W5XS zR-%F|9udBP=*_VAd~B)V#6JbB@rlC9 zE|enc7Arz=?Nl-4O_wEs!Ls@dE(Y*71Ai&W`w=`;X=vX1L$T_(6^8L;`W^iK@#kF+ zV+e$ONMJ3lGsgRdDD~doC{SORRukvwNQm{Rh{v&H2Nl@VoklGXT0{om9a+!4-ro(k zp{3*WanSmLv>J`l0JBDeZp5&}X_{I@Q>BUxmyuPYHze?RXpRaTB;V}PA!df17kft& zz5%7E-9<-WYfu-IBIV?cMei6N5BcM+uyE3RCGmjT4EyCIC*9X+-yKo(rqRu%wA@(E z@nJjEv5fQc?Fsuzz11cKnWbvKp4vU1T8K?|`qu0qqb<<{MKx7@s&RsF{T~%v5EMBk-56r_?8-RfhlzFF-bmi3r3V-156N z?i$!RBYQvzNVcE2rhINdEhpYF;~pz8L?bFDl4%;!d58H!w-9k!tJ8Stu6cg7zk3pc9534~P z!gB?lcLAyHy;#nh`{ySS^x+6`uU)k==<>R|HP2SZl~eW8a(&E>N?&YNsyAgB_ww2j zHOnxel)WJrOTOeSU^kN*q$-N4WY+^{lrW?Ad9|CdFzD~+&2_~Mg^6M? z`QF`cchW31AeS*#IW(BZwXXI{M~*r*a}mu=9k~x1)Dc)Dt?QST!Nse|#w;*JlHk*j zIh2;$4E*II7{Ts9tooc~1JJiZG5(ZJw3-sj=ctvW|6bA@CpOt9S;6GS_l0JqDMA*# zLQ6b~%x_r8A=7#LseS^d5Dp24TUOd9??;s8L5j?{^MVa5T|B3-N!H62RIys{herpo)x?x_$Mux%BCyc@Sg9ede8@?#*FF zk9ueA3q-m$% zvVM?a2Raij+6>hv4mA#6!>H&nBhPzG$~-b;#?$i7oxuAy0!)`thfM>3$hA9ZP=qOo zX80Tc>Y7oH8P-r$?0BPKsIbgP^^iuA7Jb8cclwTET}$EKF5= zZODP{S?SfJ_bBo`0oji?BXn$Wuay3jjQF5^4{h;T57OnbQM+nrC)OP~M4C#g^R{@% z3q%$%wS-uNO+yKw>X}jZ`NWKOT(SFt^~|gAriuojy7N?>EQrG-Ht`wW(g|@Cg?`v9 z!Sfuy_^hD2YPo0nN9Ucp>nwQ$b5DU#BgGVCn%})LL6@tE!t!kEE9$%j42iWBG9bqw z_Qbe3!z9&&{+iE}p=9P{+N~z>V$Z8Vtd!Dc+-p8FMbOPKGtEYZ+41>eXuh3w)(&x3 z`e4=BzH3zzI~1;-b6sqoSDO+2OwicJ-f!d#eW^JXv-xd>oTMfPCfx2;jkY(J;aQ!d z|MXJm3(a}}RXurG&MnFoa0ewxKE7d#WLe-u#q-U0lkwo1bL0xsGtU39PW%1KNir;4 zQ@_-`fm}pULZfV2yU|2umgE^DC{#UIxGi+eGMjrMhs^@g@un*4lE1XX z-RtxMfau6JSkM{QHc@qO-Q@((f_Q)Km;3jA`^1)LO5Rcr|*E zs>93C^DbCyaHhNw=Zre@hxN1w;wSbSFBk@<5N2@9dD0p~9EU|ZJh zy{w~|3C73$iUWcR&JW##qFizNd~hA7;NvGh`i$ac`0FIDBB_Y!b9@5Ma8&Dh-yAWv zZCm6rGwupIvduCz=Ve`&%R)Xw6g4&4)SGt$7nrt@7#Z}hv47{(?aQ6ULbNugQ`sUc z+?|t<%XJRdw{gjNCAOF|TOd+sOkg#Z9`CIQCmoB?>hnL+6M~)c{|KK@1@*ncjPzVJ zmIXP#Wytd^wL{s}o-r`|Qj)PCt)}~$p6GieX$I$lwa3$cCnI{!0w7)_{Eo5bQ;V+> zu`<7A-Tn29$KtdazB0B>Tm}7i=88ueu(s;<89zKVk^ck(Qd@H5G#gayGihsMVp_|X zeM?51wtc9QH;Xd6VHs7$SxH%n5eWTu-C!K?oipRW6Pj_a`Q*%y1z_S+t{WV5!5;Q$ zKg#SH;Ze0x@{%QOmqqIGlRb`g8~VInGO^goDH_s_;A`T+A8vX4MiSUIhN7g@SaIdd z9_T)i@nbPstyP&BzN%uCt4)Jg+wRN+Tiu2?r@#U;cu~sBP0jj!wCDh{NH7+p)wRW? z?7Gr3-t)mx02KhZ9qn`dCc}Sk&K6;70*{O%0ar2xuE3Mh3Mov>+v4;@M0aME3y4V@ zZvUK~AM4l%yRv1{V#FfX(4a-`Q@oG%%S#S`Im7cKRuzex@~Yh1wO7$%7M+KWmEJ{s?nTYM-Sh?gcx`0u1WbR9!C2mB@_tUl9|9Ot-$%V z22`tFw3XAQ0ZEsC#oemn8q10~NUAI|?z~(@HBELZQ7J^Y#vlc844}rmJ};j=)(;~W z7}g0BMzBLF@fmhyCXKD=(CC+NXW%ji#_`Ka;&2YZ86f{&Aa$xf&NP}eh2XW^#3lWSwL(|u z)46?@Zl|a|p%TCF38z8@@efpbJNL9_Pl#dHl}rBlon*bp2jNaRoLFpghFqJm+tovQ0iR%6_t zN2$1ZAIY9QS=xq}c=m!uzROVxU&=dQi)9?Yd}OBsJS0zWz(;H`*ilDyCX=i@2WS8W z*idrCwWMKZz&al@>`F(rplHy&jO>l_9eLtjkKeJCp&XEXTu4OkPa!{!7&XuhO%CHY zRz70D{)n9$3yt@MX6tgLaz+zfqt6yQDB<&p*v!Bfj5UQE#|%~TeFk0$iSxQ*AX7r^ zfVk#l^hcesr)mB!B$6BpGsylZ=7+W%aI$Xid>hVRMiR<6QJ0ylcSVaW5l;flaP_hZ z{3h2!z3EJ!B!OEhmv3&MX|e*(v0q(tElsVD7&8dGM<6n26Evf9ynyRfM;O|abuScJ zC2MZv=LbH1pw{;%-MrMG!KLDN{I530qv0-(LcCuHkG5kYbVsqmReGpZHzSvQ20mw8 zqoSIAcQCRs7keLzV*@*)Y{u`Rs-+vt!n7GCgSACo_5h{`MGbo5XVdn?dK` zuR23FpngO`dnN8^61)duc7C3HcOmXam3_1F*s3pMV#&2C@ItlzNz2Qf_eI;dSUhr~ zfAD0;Cab1lUR3i~A>*ngO*@ae+&dFcLO@pm8G;ge2uim0Nt{UH3g^dS|b9O(A zA!!!6$5mb7`JQp-*V?M|%3+4F zDleHM(yGr>#Nso^`kXfFg3l|Kzv_rHjasx;lS@~oHZt`3W=MyrYh6i`@<1i^+*B_{ z6eZ_&e;6)LG2&7Exfys4|ArG|uGrB*OEDI{Jxo6>yHFGrR`PW{+GyG5j|@KV0Kd=I z3mHFLD{~}zuaHF^I87eLpxJ!qqX(+%rCECpinW$`8xQUnN32hH=C1oYhkuzuStA&t z-kCFEx{Prmzrr@zziJ<;zL9WX`MhaYDj%@7?>_UbJU?bDR^47j%_xxL65XJrtjciS zbsrw67E;;07j*f-JW*!GSC~=f-8ESWUEae4dp~`q);-f#r;(Ssxd^-3jl9>lqL7d9 zxr3)ZKgIs|AzS%XoPm|SNgc9gT)4e>k@?*F_tbiXeDPE7JV4Ys|+o+um)1F80Iqh!?ymp$ftK_W4l@|I3^)# z@#YQ7TbUh%AHJv2Rtp*&sfv|_W!;GhB>AI^gE7d<%kT>KbZ=Y~z!*4lVQ=xx?2cj| z1~gh%z;RwB=Zw4po1N8AGrjh%jR~wR%HooJ$7i?G1NZ8R_hvZd*5{p9nzHpD=fqZj@jKm1~ATv+Zgr}ckTHWGz20&ktn{2& z!-?K2F7k~Y0jfk1aTuPd39+v$_){?*cVAGQDl_p}fVP2b7i1ppy^<5{KZ%Ti%z>(NC_!A5 zlM!uipN;zy$8oCYaX<4@=D&$2MwLGUuk3^qvxx(OR_A+>RU>ipbRp{;$5BmbiO47* zTBzW-zF-IeInKZNw{Jrn?k-!cr z(GF0V7t;0&PgikneDxR;)9ejnsJHI$x?Efk?Ll&78RHu^7=sv2Yxfp{_f8wNqtv2) zC9b!^9F9W$Jp-@&q6-*ke=M%J*KCJRhd?3;|FvF0>~W^T-eMboF$JBAcSHZ@z%yd|4BsXhD1@~7QCutVgZKKL3y5f``$mn&59mt7 z3eL!wK>>RRi~@G0O$bg|t>pM6==s8keTNux2Sz`hZ@_f?fUb&OYyd}U>N0h4!QAo- zP`N&zK_ABMOisv+gGB&bQiNcfn?TavUhiiFKh^-=u&~ zAKLAw-3CmgXMbY*+SgNC35uCkuR26Ly9QCa55kyuXz&S(+sHLd zu=D)ln)roU>$4Jk|A4NJyq?e%50TNo$lAkHieb%EqGn_>D)BzOlt_o{sc%xzXWW&c z;MCkdC}xlEBUi zhuX|%dYaanUZ5lYwpAqwILHVeABFqNFz+AN)zF;bY>Vj){*u5Xuo^AblQy48CUdKq z$~g9dA|gwk%v_B+e+|TYaa~zbc6PbCLwmMnl73y+-LKg0vSU1>w^AC?qAg1A76=4_ zC5gujyt0%H)|JRizWc6+iEJ2Um&@MQCy_}FrMzHZ=>lbKq{(R@foaXiD@`%3+l?F> z^nQ;7A{z!%tI(?pJ(sN@bM}Yi`})YjSKLr@rhEFjY&0?t59Y0-&z-uVGwe!I9Aq*S?4D-dFn)Z{z#bW^O)dLIN>!RSW0FFvx)>3k zBHkzcycgItQ%^?RwGA~m|7j1}i^e|-){^z5@(%L(l+j5m5UDO|yrP~Nb!8~B#_e0$ z&jf{vvL8rKN^}#<-WCk5!d@tj$zfT(ISU;#>`G5?SD7`&-jJ&P4QxFlXo}CzRSj^9 zIAzY^WLccd!+;Pv!=c15Bd`2~KjE86-Wh5mKWa8BmfkeJdgEnOdQ+L6?$=WsQlqgf z8LR`_S6sY*RM$8*h6x`<@tcn}+biA_-!k(p@oV+$l}stVk4%h4@1QDdy60Sh*Byq& z@D>qe_FS(yQJp7Rv;Fy;`q-=Q3WKBOTa5@sBy*$pjv4k#P|zT+SPkQNDFh09jJUAM zMtD>Nc{(y-^T+ZusV#iJ=+!OHo+Pr)}DMj;rr8ZF)QyJUvp>$5BR^O!tz2 z<~R!?b(`OAa4Zy(eFpxLlnq8`6x(Z0{vhysJ_o#dL#J+6rg|g#N#*cwI++CvbanX@ zuY3GuDQ3x2BBa`t_~kC!sKJ<>ruU;<^~?yGPSNtn!vpd%a>Ise|GgC}E}6k)5x$a* z{nPLs;gJBpn{!`3I4?c7e!u9Evr)2^iA^ zHqxZDaxpb{0t&gD$1l~jZ4Rg03-7wcrpR`@UqL{3fk)_*?_SCk>}Yk#k_mmwV{FC9 zpy?-KV5&PomiGd@a@=LQeQM$HAk8HY6QX)=)Y3;?G6nEcnC=u*LPNvd&=-Ecn`1_9 z>o#w2Lvg!#SL=5ncq5xtqn#tf=;f6RLBiH(Q^$YuE;qd8j24_zcX3a~t1-9>PyLXk z$MC0NWP;s}G$_fO)D5ZOq<`d2H4P8YDRI41LYr}~`ShHH&y@0!ZQn#g;LWHky@@_< zeIiE~&4@1XmMh#3iKAcHrq98>D6em14m^!r*!!Jbd3uL5nSxX%e&!wr#>Bb&C`i*8 znJ%AN(1P}REyjF!9KaY%XFB4^oiNsd-XisF+fhE5EiL<;^9r2_6&a-D9?tR%e9vch z`{N$@0;QM0n%$plx|}~P7DrfTaiA`CO3lOnGM6B4(zRycwX48nz z)XZ1CZNL~1|1HI=@2>M02{E>&|z=jxHIT`>kjYRw{Tj|Luk$oix(|$5LK(C zV9dbBdU(4tF@rc%{yqfO8FFL`VeiPU$Mi(fKT`9ovG|dS`XO~Ywspzpe0l%`Dn>VX z$h9T1(#^$_+_YX@F|I?@58B@4yBYs?I>P(km)uueOfy}>AaxIM-^Ined<%JSBrr_| z5e{d?`*XS7Vo6|ha!$b9i}&j6`Q9f@Slo_NSgG0(_SK#~fpvnOQ*qSVwwKE-F%Y}G zA6)rfxYsuZRy7qGks-3u$+Ku zG>A*Zb(M$K3cKl(3TmIc&U%oQtk=iTv%>+b7cMHS*C8LMi)5f?A9 zLk_mBsfkhMx8Q^6^SoJTjm~AV_fpR3$GR1(rXo{Ki2`$%ZccU_pkd4n((a)D+ET(A zQ5$5DkHH)sEXGEkai=O}#P(io60+<`fi0M|ys@pgAy%_nIzLVVU%0iAVhT4Ktm(3Je?RNY>~=ZfStM1tYl*Y`D00B}Kf%mb-Fmil8?MR7JL9pS z5JX&dW%Pk;=-rUAHCNzHq~LExQz;R0Mk(|YJe74H`h?`k%W3%1&x$)HC$C^8M>=cwsJRNr$h*c}KM?TyfbJ`w@>OG8p4y}hIW1_rp0ljlklN17ob8{#$UVug<4@)h zjA7i7@FuFR{$^qP&TxS}q}ag)qYU8UY#$EgHZ?@|BEJ&+>OgZqz4W^3-X<5!B+17F zGu%myOx0F(Ms}^57|t`-wXU|!XNE)EZRip0Tou^AdRS+$`RXl`2WbLvWvk|G?gK~; zA>KU$FXq}4a~eps7G2pH<6Yzl6Ie$bEr^hwXzYl$T7`9XP#M)uSr@#RYbgBWAZctp z75B^tuq}LibYW7k_jF52R<3;tjBHaih}sOgn10aMJNi*b4>3pA!dDpPWL(_ zjvsH$vC0854Y7)QMVXV4xV_GU@Mo5VBW^5p6CPCDo{w)kMUc|Lir$(L{50DzB(0D?cWR_EJt|=ht&ok#Gw>{#4RLSmnI9$}% zH>?AkZLaZ1yhr{WQCJ$so+ac;Td2I^D{P++&8Q0gjwxdNl!)h15TIfd&Oe?VM|sl|qkOybRcHblXFosr<~_Nu zG&Ks9bmH>eA*%0oAg%Oy8b0FR{@!16>Low+fxVCQj9t{T-mzyswag_je16!sCa(AE z#^_ebtOZhw0O)~mwi+fk3fcQ|fSPTyfW64CJp(dn8k)7-BN`8vE!&!IOKlT?=onkh z*>|!AmB0*kId#mF(4xP}cJ}DWjx$2nWDSua=&tO0FdlE<9@`g^$TB;40|QbTMKa$r z!~T*Hm{dpK%yFND*p{m%sUc+kFrti!O@h3udR=XFE!KwfXe;VM1Or%azUrx1311#`L$p8b+D!;=hsbGoHavqUNH?NQ<$>S_XlF{ zq{vsx!n{=>lufx;k1$C+dj@R_G^B9YtJG&^w6cv-}LXDRg(fhcpvU(f9^RWk;G1K#y#fqqVK(?U)F zlP#Q97me{Zm|^TULWAvHZ_XL_oKFlTei*Vax9Z%}{}k`55k#Edz12U$YgOQ^9Pdn> zlzv1aH^VNBUmgXY9HVRGCK(awy1mgH>|a>ETb*p9e|J|gh0*SNZ?;dR_$=%zKHvr2 zk@0C&XzKGLIy{BfS>$EA!azB2lDb^=0b>A04%c0{=TqC`&%;Usc6O(Zz6WG#{&(G4 zAsp)20+n^_Wo}Tr{9Qbs?`wD#^!1Ip#epXxpnYo3DJCrJ+PD?hl!<~Hx@A%(TEjcl z6uuJQ)h^~M;Wn%7hhoW+DlQT(T1%X#p2An#U}f5$3#nIkL=3XUK<1cnCz}bbz)GwL zv9(B;Ircnpemkoe>3VghZv}}s`E)RgyhKMdIcoARECbB z5$#6Luj5V#TQ8WpA?;lY>#DR@=K6?4^#f{H=`b zR|vV#b1(&n4c`5Yej8`AAF*)wjyoh5njbyh6s21+FBd!X(;GhnFSJ@Tjl}+7=VvLG z&8(@RtHOR}HB?`!VqgkiT%$w|xS%mJ>_V%>y>WvOOXDs&VB?vV8z-;5Qbq=N0Fm$U zZ~s&)8MCQA;W5LmauD4!4J<;`{i$_FbYC`~t&V5!$E3SESRa%@Gq_&{EBvglqWQER zSPk0a@f%z6p2%vE#P&3J##zU+v*kiNX;+D%d&Ibr8y@!xyU1$s)4X+Y)dHVrRE^`9 z?d0Y6o%;6FqJ94TQ!U@A5k0}5%&3d2*7m5|QJ^LK(UF>+N2v<|vKmxrqP8PrVN*tm z14h;~x5x!~g?H{@6x;~&J?hlq>`8Hmpimu|9`mXYR@yg`GqOl%n)S)heJ0{nH!H}} zJ2korYmgyB&@u2S$hR%;r%r;egiEbZPl&e{cwd zLbcz|xQp>hwWv_!W-;tJh*hnMWv|XD)yd)XF~Aoc zNA$|+1TloZXuz(I-u>Qk%{z#JsxA1Mfh*qC3T!G$s$Di%< zQNeCD?jID#47=(eMuU2c`Z%%end77|(8I_qLaNRFh}b0_f&suGdEa4OT+jwH?()B( z=;046ozcZTAu<93gn&EBVO0h1gWI&vqa77k8G->aX9}AHq81;B z`}qZcxLxYscYr3a=mfPlCWfh<8Fw0av8~*KK>_RxABSaj+%x6(vAC;=>5?Q{fTG1ucXm|O$B6{MtvWJ?!QwnOly@!QOKLU9~>wI1B z&y7!l3%ZV!X>t_~aCmzjS_z|5#dNy%pxl&L-UOh@z+u|n7l<0-oPlRwhAZLw>u5Op z2cFRdyonNV9Jh4q@PzHw8U*#%cp;z39-oy@XTc&>lB@qs)cg_5CXCh{b$A(&JvS!qbXG^Ka+2JJQ;}sLP8_ z-^9%Qb7Zz09jL`R+ta$rx9qtxVQBLjy`sh}+jETx$O=2JHS1P~)l|Gs)Np@*J9g!{ z@=DYKX>=5OW=$Su!|yJ?(X+q%(Tuu`_@Y2&$zkwjdx|=Qpci##3c{QnF;Oyy#_d2@ zFQdJ?hmwBJxXXtRy%Qmj^=PYx0pfS#yJte8e42QrF#sPbP+`qSqK)4zfgkHGJo7f} zacXr44jDdi`3Gxj#(%ux?jg{Yv30ID`3p~+A1(G7zeI$7Kt>U)>ybW0T2N=;U<@0} zB#^}bzW!Z}TJ$^`0j+r+2Wl0R{ru9CU_9bxGKUOjGP`@i)PJBI{XcVLdxAIvaSUxmFcW*^S zb#RFKhG{~(iZG5|Wws`kOf&9s;sdNrsTDo@%7<~J9!(T*w@S(0MT7e{H)eT7VBp<^ z{hr4C1h771dGX2A&IiVR4-e&pP%>C`_Y~i2_c3iU0-A1BDZv8Y1A_t-`Jemr@=%!!9>I9-fV9u468p)ah)Am4g)LfLC$33qRWSS56Zx=c@}qm2K+`J8wbD z9JLNo^7FL23@e*5R}38A#U63>W-cBoGoLJk%TpHcb=UvjqAtP79uGiI%X#h=R(lrs zo&F({8WP>CV!AQyE^>QDPxN#_H|O_o{}d{h+sJtne+vB-@)VjE%d!{MlIcbZxHRWa0=aaWz?;s(D3 zwb$;t+VD64N*we@K~~9*0Lez_`x(+2WhG+)o?Ca}CpgKVsC>1B?(m)kPX=X4!dsCJ z*&+>*nnRwn25i_nM^+tJ52vmAvSk4K`6u z5ctY3@VvjwjLxhtY2^fRwp&|n68pV0E0jJ|Li^|UlD}v_<9bQLu%a%($x-%&`q4+P z`>-8By>UJIyji!UtBnJut9y zr!m5a{1ZAw;|uV0pKw9kB{*@)F*nvy%YDR+EO0YAKJIFJ-`Y}GbHog(LEXR#Xb3#U zf45-?PPChJY87gfO3iwp>*5_1h6Ed^YYwVERDZ4q@29A4djN!ZGOX-?L2D$5gM%n##g-9XZI-yEdyRDRdsvKfMHhL= zU+)+~#TfWJi%zEoJtAl33s@amODLrXWlB+H_E9m-ysTAkI4depP!o zef-8UZYrI;zn5#*xf;RXZ>dw8oCdv;){gPJ;w3^*s_)O%BqxdX0oUK&yqwUwk zjmhWp)OW}0P=lK>$#;uU%=Hvwt-1X!_@_sK0BgpaY`>ACa2Ck<*d|njns;4jDH&L! z({*~J&JU?ipOf+8E=3BZN~H=D0@yQxW8UKk{~9eL5;bh1tv(Jpgd!jC?I(hK*Sde} zQ55e7LV_w$Scp%xw7q;E9@Q(ZZ|daq)a7dOH`2p^Q&-?69EqEoym?$%Ca&=1$;QrD z)l}RRWg*&(?`t;rQ8Tx zq(fXcj>uAiIgOX5gV4ufGjSVFx~tV_E6!R_P~CP_NbQsBIkRmCXcqPz>k{ryF|+L2n0Lgu-`E``cCpuQ(rBos8qX^mUxGi^rfrCo^ zqid5#*LxvmNBnIvEm>B3y6H0c6?X|$AnqMtCm&yc-TMByc2qX}<8Uw_^JTj~fZ8drT3D4t}Z zsAtoYPT1vf45VrL_P{7v_Mq)>h=@a-1!T z5dMB{0Sjq9TDyVrgZ3{z( zx!+dU71f;5kz#>~tOyX5`)x4W)9%lKfiCS0eZ?oNY^hLH4Rz$BTXENPa-d@-bNR(8 zs_h)=w5nix&dS?Ot3`s_uJL@XR3Z1juQs{hd}`z8DVQHy03+kQXC!@i+i1LTkt$KX zwQN(1Y2NCDK5yf9?|&NJ-U_{p1)~7ud9UtwpOHcWq%i%!!H zhjeehz{_RuQaU(Oaq4Dt;N-ZQIjMEDhL4iJT?)xSQRAt*j8l_RnFi|$yj%t^&d`tn znkz-X!%yVZ2pZfz1fnBWCo`cZ_#WSpq8NtuIq&klYz8HEWmj&J_zaZnj2aa*^@MmW zVRB^A)UhRIaFe$Py<2b<_lmsikI#2c90g7}KZqLY{1)ykd)$)0t1E_`$pyLG(6nup zC4d>$Isg9oAM0cU{)kW8d)|y4(J00v&zHTD+a95fm@Mm`?S_WImZSID^zNSlGUU<| z8cm?!iL7u70Axgbe7D2QhmD2_VKEMlxNLB;RxtV9=;eT{rk&ILB}u&kRAYufyR0x% zi-vEHeI3wJ`zUjRI!8Hvtr+(*KvpXVt2+{%0J)@6oD)clztKJ;1h&^R-&Eb?EwDd| zd;-N4cv&EGtk43+&UlyT(A4lC-|zfQ9L71p2%hgDA82PqCIba?I(cOD-%VZ?$a{v2 zsO(SEO2MhUIcgXzY(1-d;#k@;HMbW$4^y5$?Uom|!dFN?FW7 zbYh(M1e-!k_9#SEgFlf()YoS=V`TWX%pN%wgp9DT?}-)JK|-Z&H9mKscpKGdaf?!sqB|`{ zOPJ9VhH$zuzdQWvDq$+L7 zSbBdpYU*ASu`N0#N3%LF4-_D>Pv@l%{}zSRX8B{v@e8{oGx#xTxwds8fiY=HjWch#L~%f3LhL@K=Mvjbn}XBc@Dk!PWr@?c9#4nC}^kRoQ6!FYr?D zwj+G8MhPG9W?zErc+;YewBtcz4vNH1eOEpA) zof%uH3je8`@|i!KD{h}p&R{yR!lC0-H&}OsiLZ+ z3A{ACbcnPz{RjpxhP`(Snn*HUS8QlP^T2@al?(Q7XvX!JWsMbgiFoDZ8K)y(x)V2g zK{j^7KwC-O?&v>toxgrkb09oZ|J*;E(|dSYDqd>LmW0PxPPEKEtT!ls`q5(#AK#VW zxSiVbreRu05*5JbV3oK_$9s}?xCI+Q!5tgi%pRCDz6*OnLf5j!St6dj0IK$)SQ#6O zT7j34msC93FA}&rB59h|mSaf}@CmG!C{1d{*>cG~%PR_JP{m*5rR8Ol+M>U{b%tVu z>r@RX{2Z}qy;DxcgzT|usdf^J3t2ZI%vf=knpZQ#30HCwX{8WIbgzYCs%D)2y8%-!b5jUZHZcPt3@p4*8uIt1;ZZG1#sJH2n)htpQr zv6P|SA`omoKTj=d7s~$`Q`QmTElQS6!2I*5SItz2mtP%XT)!J}Phpw2o$gN;mqIVb zvQe;QQ2&nbFWPYa3u7F=Yt!HOX`2ecGL^}gt??iP{iT^sAXDN(fn9Zm!Q|6*A=Cv-MqdG z=TMfr2rJL0T0O#Sj&AU*K5H=5Y9iY+k!1Vceu~~KIalhRMt$?9!6Rc*#mKEbWepaS zk4m!jrg@E?cnH1;&F@AmMen=Svwu{>zN0jJ15?s8LV~+Y3f|@CeR0n?P`*pmw;$0< zKN;0?L|BoRrT|z#r@z-g?@(8BGOuq=TFwFEa)!z~%tQ}snmOk;)n<_K-H-O1pZbdX zqg%nN1#Ncj^<^CN=ke=v5Xqg$Q3h8}idjoU2eo}7%IoLvdRK-5qLy`r|6rL~Z}Fiy z!;-zS_GrIspKZ9!F#AT!=tjpSzDZY`IoJ&l1*EwHbPr6U*U5}ac$cf79R2XEELoG0qDh@8G*^2xQIV@ z$PIHLg(>PwZQ%^mI1t}QUCW| zO~in(OOl%$-N+9G!xR1R2y~h_bW1hVJaRzF4pH&e5jc)QBpOr>EAEoylD9dT_6B;A z5oMVHXPQuU_Ok*zaZA0K%2X#?sUefVW5E_hUV4}K%rb%$>Py6@SVYIvOK+2C+F{a&$to9Rbi~S ziy=k0VZ8fhLeNV0-Ghd1N-s}6xG=;sTe*EN1Vny}RnMix*cX@fLi7P!0Mbw#jY2z5 z2WTU<9d#peL^Uv>V^K$ZUgIIc+`o@*acRki+u-TH#muajVMqo#UI8N4@O+ zu!i2x?M^M}T%X(BcGrO4pSw0bM>jLX1-kDo=4T!fNX zx(@fz>zs8*T;0*|Ne0_I8%W6=+2)3U*CF%5oJN#b8z z+VnJ4M(*(T)TrLXH=G_b5ML&NQun^do6`0N<`@|Z4~l&|o)viMa;269glEKfMB7O? z32AW!VV5ZzH`89+19lcTmh*5<5~SaqSXw)LGIA+Xx-DW<6(8#LNA0qvf~W`3Wsdkf zCT;{%s9c%qU2&Hzm#jZTQUdrrrqO;~d^~*Txx*X2Z3-9t%Hb~r66FGt zNg6RijOI`sJ{jlCyx?BT@D{Ll<^i^|fd9H2??&zJzKQei(JjTx6O-#CMwF4!qOyYB z&KSegd_`38)v7x0@158JV#)yV`LB0v30_dQloNH6v9oAVohcN-yEOS5-ByT9O>6|w z1Ho(^Ji@YiR+2K7=7m{eYbk#ZGdq!@lAXDMPZEcWT53JLK9u=)a}3+%Tw#~u z1-zF&hd{bV;TnSD716_yfkEeLgnR3=iPzMI8T%njQo8PIy&ONu3v=A}2`Ew<0*%HM zDJXf$K5Cfb#vqTsxKmE<@E#^i)8jhVOEG?mmrVLO8^>MciNsae`V83SswppBWDUFW z-I~q^#4F(owr9m%ikJ8P_UJ>1_U_yX%mACRMW7~;f-lmHVhB>aR+0>C0&?S3U>r-E za^Y(*&L@?2m2yg%Tna_u;F5RUBh{dr*uX; zl=%ITk+@76_kUJ*V;?_lih_%|JEKzY8v>)^MSUuBsBuCmI+~&NugHX$YRvSA(pR5n zzklMCH_>}yfMq6o>=igR-JD``Kvr`CHl-LnKbmHllbo@!-ToDKX~E29lN$z=AD8wK z1kJn4gsWR&11sv$@_dgjdeKWfv)c;)b-j zV|Ue~d-JwE0A;D{?}AsGhiHRYP{v#84%2i(CRlCG`ZQuhw-x)S)^~1_W(T&6KaUl7 zX>xUuV_KYIhqy|_aVyw@G7ddsB$FIb&J=(u^*Xt^e0YUjg4{j!I1mqEHbqVSW;v40 zouuYDzjln5PYq0Wv=#~4oRbgJq+<)b)Jnc(z}}#8^5mqs`BGI$J~WB+4NlcCM3yvq zM`qe|u>E%%mLiujyhx&&I#-FQ(-$`;yY2N#8&VO>_PIh<=fmI)y!bi<>dRM?}vtCQ+&& zK+Q6&00C0I(PG^tm5dKXix2IpTs}W(ibhC|)P&R56?yXU*f}&OQcBG%;T28H7DP>2 zbhh-^K2v3`&dIaHDT=^uDiBLfDd7@Qh1_9l-^JH)BJ{$Mq$Wj<$wur2GpzFLEAmpO zm_&_;`TW3BgiJ^$O21cJzD+-Z9MNKEsFr(2?5q{o?}>ul_va@~v9s#}y{TA>xR7jA zWmh@)Vfa+H!U5T#Q|b`eC`4eaCn7CbfyYl;ltELXdfn;%kpv~AMz)^5e{-yik@%X9 zI3eX3a0w4E7d4+7zdbYu&y}oJV(~4LeI&_S*JSrgU<8YYDE#`*H**_%1K+cbt;x zRx`X8Rfmokx0<6IM^F_m`?QVXcQ2MS<%%D6MCe-YkvE!Q$+c`pF_Nxq&Ub2-cMIOdJO&#p3lP!WkkZSYnV_eulGJyH!@ahEa$@YIBq`c7*JtlVj$AH(7) zsDzjH{etnt&SNiMkF)Are#YGM+V&Hs_+$OH&fM!cuhPg_jd^R(;3lvK`z8qNIY%vU zyjAEGLyMbQsJ8utDL8YxdRk20_xOw|!8|w@`>0vS5pWJF#u@kW3jH3kwDif+_Vr%u zKV`~$8K4!Kms0vjmRNs2v4;VQt+DYZa$`(zb8UOBDUj0uG1|2v&)ZA@uxUyFRm#+( zIg9Ib>v12ct?vx1f21E+f(&v+v+Oxu{{kN~Fc}Y2)cZf2=1I=>&=BJpSrgN|97%c3 z5#2(Oj+KY zyPiIS>1(UOdN8;>XRrM#Po)z9=uKP@-DZ)r?LVn58KW7=7F6g_E}J7xSRjV690~i( zdvzy&EL}J_H7zv!!kCqcwlB3V34dnKGJO0*an?VdFoeOo?uAmELAb8G^93feetKXr z_wObzxh{w_tO`LKz;VP|&7|GsFuq@3WGmHEz}w1OYFNjNIF{giGukgB;z`e@xqqmE z*jC0W%(5K!k%Trnyazb)S(!nZp;wp8wynr3BQnWsY0%nJd5v!+8bETp7?0Ok`aPLM z^v20D5AaBC7C8X{>CZgsZbtm?>gidA9>$HmCmiq=m1_~F2I;_771JXB}K;euMy1l zyk@7mfTopb>o(g1Ncs$i=Qh75>vZsCz3Uv=+Ak?GD2Y{KySc;u%LqT39#fH4aiw^K z`pWeqANKBm=EY@d~ z``zMu8g4yd2_}%H8XH0E3EYxBbc9UD=Vy@;r^Tzqr%Dp;!@H->>zz#9Om^hZN0=V!vMB1ZWr4_0%{;cwZ&1{?6V(PKj2r!D914SPE?`S z{kz^{KDb*&@H{Asg^t-@x-1r_u@yV^3GC)+M->Y)GXSFY-X`F^XErk1qUtsiqqJkx zM11XIBj}}qKTq5FD=hE~P2c@Ulj4n>F$kj`hmo8Wd0p|LfOsjY-A~Htb?N#l#)B`|)H3?iQKU*N^qH6HW+*I1_mAuWNaN4oQFw|m#l zmsHF-Xn#*6b;)u#qj^lhX04@7$}a96a?<+)2QpipVDNbaRy&Ad!Gx5qk$|oc;OdfF zj2-C)&y~3>&Th-u&6FLDF@_8?!S>m3M0N7v!MwCS^AtGt0Ofo!HJEATm=AK{6y z(RY96OI|jGJ*Pf4h3%uuUg3WBBuaI~8ipI}*}hEZ1-|Cf!z%`P-C`$I9+U5ld6%?U z8{QKz`#u1|^b?8e8%XHn#t7#F-)e>K^Z9j?8BNNR5^I)>OuFJ{a{{PC--wXe4fw{Q z&RBsQ0ST??rFJe4#ESwrez}JknZ%V0zsEV#%e^W&zL7oc5`cgj+G#-p_MAw@z5+k< z@nxFr2n<+nJ{GJB?`MP|_dHi4FR1v9etfp{fJ+yX5$g0W?t<+$Zx{cxGiZdTf0tYn zcaEgF;CE{xE;)5!u5yqkLN=bR@4JM{ZQ*uX*~S2-@5+QnmQTN7%aAL|RWX*HSZ3+P zZ?!D9Voy@_GO=2b+q%h0-uPu?soQ>*FDAElCUkl~c`tH$!z78dYE2E~-HAfR*VVP8v!NQsH&pb;ihRxIcjCEhP#E~4`L1c= zo&Dn;R{$ruY|9+XbLD0jsL?+U`gOKL+9K~}LE&{g@;_TG`DVGv?NWUU!ihwV+>*U> zc|$9tP)?s2Z2R4cm9`+0XAIskVPuI@TzhYy3AC+$w5a%qnt)O>E#FWb{kWDx7q7r8 zZ2=Dp@B4^HT-FOqj9DfJ`KzV|Fqu??>;n-Azo8qbMl4)yJ74I&QWplI4p*vF=N{+S zkn6Wl6WOfO78}RChWtjDedJxO zm0vIYj+x~>fXTk%uFM5%j+v_EzQ>WaSHB#}>@J9g3Y}UgtA*`ugLP%sS zz}+a1wnPzTo|=AbvAir-5l6@$Zk%y;yC7kc9|-U!hmp(!$#3MFv&5*Cj(& zu}M0wpM}LyEt?)?`(E;QyRap6_5<4Zr7e5#lE&HY%9J&NL!b;WyM2S7I)6|~T2Q&i zmNxE&_VD%Hjg_huJoW7eUw8~R4B^@Zc7e8%A7jht0J zmfYiadRk=OcTbERJV=H<^`6aC@8x}hvHSUmJ7#KlzGciY8P8FENzRWACL&I32Iam=Z?4S}6n zsbUw_u`QUc1mVgX`9yDhB(vBYaMDxS`3mO)qzueZdKT0K<}Rv14pwpeLXY_X>CE|e zZY)3d$~m`?>l^#arzWH2{BM4;A*PHiJ2ly{8AhkMIe*?3Qa9M=2Vy~M)-Q(*$eZK zIpv<$8Bs8rfsCpBBJcD0eZ-CU1dZhup(4?IdGc_G;VZUIK!?8YjocI!y;n+A%Wma2!-5vAFyF^Tg z5tLjD57=pukYMZ;m`L3RZG>thu%n5_(ZDiTfzSB};~R0w)4`Iyz*}~fJz%hM9(!+U z52@iUVZ-Kq-AHRgN z`hT~1%qM6F!&BZu0?r2bCfkig$(0&HagO#UrU5737}fr!Tr(6SNIcH<5iZp39+;Ps zx4wXR?SGQwS%u?2|CCE-8~|xJE_MDmayc(u`y@^mA6QXo1+%8~;A(Lo!909V!8ku*n?t5lp6FClG5w#ka z5Shf5PYiJXq6ZxlxNFc$z0;UY<4uz<1)U^z(wFg~x*aA0Xa<|bwkNXO3sQ4eaQH<& zR_M)%Hwf?dP@DT~vd7pUfyebd!6QYZ5!>e6j7WIUWEIPgU*KtP^ri1EUl=r5dLjv#PaMMS>Y+ z_^4}ko*0=!K9E9J|0`E>814OR%s*Q3BtV*+QnF>7$wTjW;^16fO zUG`IaQl4mFX2apwe`yR5;rnCs|b42NT+de)|I6^0X2=g>T+bdj5Bc}X?UiTt++1sh-jCqUN z2_ca;Ozryk5NZ0inJhbE#2NdX_kNqjgp+wz)K#FIA>ij*vmB+mKB{fCtLm}pssFX3tgklI@$9LMq6!39WvS#Sgm_J0X znA{>x(0W^;ag zDxnnkjnSb;Eb8A8h2yU@>`e*ooFqhMQdHJ&(>ZfL+R9?mu}%+>EQQ-y=JVe#I-Z)& zMFpBlU8wtgS1tNm>fo8Aes_pxMP6A9tjopn+i8~-v2tq*9tw478?}VS4oE@}7_Kt4@isGw!WCIke6yu+e`V0PFhiR;(n(q^D7EPd<&b^Utoee8q?2 z{4j6t4v=kes9>D+p)l{Gg>qV(mwfzkn9Pqxuc^GS3%o@N6bT};^CC4pyJT}vw87u6{U(7#T znV0HUTv^?U!0-6XoQ|;yZ_@s8^z2U^I&?|vy5UW@0_Si1vh4T{Au>{)Mix_KkC+!iPk8^(4 zA*kQ~TAGhv0+ZRlkcaPx?-RL4$*L4{#uy92I(Q}0Tr`b}9M_+Q_p;A({Bf)Vrm0xb z^#GbYwPK*|Q1+rT-Btf2gEK&S!1bQTx6EzERU@%Fe(&5$U=Ws4NYg&*_5B%^aJ+Bz z85XgK{IO@O;QYRmCkR+Wq0j359p^8FX@P1P;fXWhKbo(DbBZypBmesKCln7=ur006 zY_1AYUQ_j$InQ{UzZ}NPbLNuI%!7!0hdE#nCiR@3D?YEr+aEcq^acUHuT?2RQjI@*Fx9_Pwolz1H3d-NdhoA5@y z+_(3lZB_<=jnQSW3N9W4Ag>)d!J~12JTnXW$N9@)yg8~m&1lNIT?wsbJ7OSm?>StX zb8D8$uH+hZk;LoNS(o#^EB5cAR~i$a-tb6a4}0!MU}Sr2?0W$m0!dQowhC6_tiew` z-|X|hYhG!Lnf%znpt@W=F9)Rx1&INVB+hTn^cZW@ssBs>VAf)kL$9D{vO=#!rT}Ic z2=VCuY46hgSlpFDxUv>O#^jc%E8ZRBs?_=YwEc}hk7It|*UDo^Ac)n^EKbhyxEW5C zEver96bV2XI`s)#W99lmvk^0H3#fZszcfaDIxJdq6z``=A*7$>UvFS=MW5H9+yX!Q z)={n%j6Fu|s_qqdB{5r>L>nh&<#;A?({c*L=shR2f&mP5Abt%;vyK(jmZ5&VwsuJ=vz`M%9s;;haq8q zWxdTek5TJ*v(B~m_I@8<{_o%a`Tp$te*XIpzi;5b|L}W@|N9TWH}Sv!@NfU&_}lf| zf4iRNe}`Q{>;L}4|NU1kVe)_f;rYL>XUT*A`w#oyuIF!m_WbYbSz6iu{=@x$U(XV( z{`VjLE$a2R>*;^{FUQ}m=l|Mos#e|w*=zrD}b-`?lzFYoj9 zd!LgI4zB8wh}#SK2b+Ye^Bx_>yJMS7Sa*%PfAq7 zDahnRD5(AscM2-N3ryW%AyL<4*zJgQhO%h5Gr6geIK67M#@NIENt4sT3F!6l4??`) zHdkZS;rb?Gi{u8Si?+~*S z$3Elk@+fwY_~y^N&~x%OuS)P@HNB;U<8|Aj;C=7I`-z9Gi8!1pm*9{XIy`6mF}JdG zPuPhE?P)0+t>N#qM+JAu`Jl+61&J5iRh42ri1$4~G%3-Mg2H*spx>JK{7HvXbMT_# zcuK&+?jk_#C!3EQ6;(=nA(X0Y!-cj>YP-7_SKhFJ^LV~W}tMt=B(oOg7ia5UHzv)uGx zxwqwne6ZcJ4n<7d!!j_l5G+h)7&fDc_w&U(77aL z77Nu&A%eSfrfC-vV8#L7O#MvQtr0|bveoO3!=0{`u8Qw=2JH)kI^v*F{EICQ-*o&Q z+mG{I{bLt+XHfk+1QF0@DONnWKfTtV+2 za@b@klUo)?XSLrIYS9zA3dZf*?|87-1oQ#<^;$J1JB*eeU(9_zr}yop6+kq-zDCKN z#kk5D@0%J7lKC??kQDgHgSucgm^Ht5dtPaqHxnq^V1n)}|~MK(WoQyl-M z0(buem^qeLNb>!QdQYk)rZIaob(Ct8`F8fyaQAxC?Ks%pniN+;o~)(~$TQrjRch*d zMz{x8EK}^uDWlulHg2oWMbzRbDxY%Je~3qx><-Lpa&bY|g+`pJBlQ2}~3q~SI75ZJUIMs~+Npev}B8+mpdmw~_ zh%wCpKGy#HLLT!OT~}zTJistL^ujDw3JhkauYBd@yRy*`m>I0UCxdpt#rrdF=sBMe ziFE8)E@t)#n>s^jDW7blXH2Z63^&KLcyIQ&EWU3UKG7F+Ug;UzAi~Fc*n70Vf-mb@ zXVBR~fGS@qGU-G3CyYswG%HJ8U(kgQK7w!KVG$#*v^wCb-v8R)rCgR2=OVF$M7grH zngVD~*yGULU)048Zs6jw8#~37hi}}7rU}iqc_)oJ9#&L4NcK{)N<-`EsgC^%y12nW zpihc&zV8H8$lIb;ec!Qsq*}&t2BXlwo+6ep+H9GV-0O2n+jxdW0?vT658$kZ48BLt zvEuz+9E#$G=B2ow?=Mmxt-93vF^?H`-q*5)ifN4N$$e#V!77G(Ev1U4Jk$G-YThLv zk83Ndu9g+;KFUy*UxtlDL7*dgt_0XU48~q;!QPHldq-Wzm?;z+a4}cljU~cvWm6Mj^gppqwHq*OAxxM-mqE5- zB@2iRD0r{lNTV6wJUwG6!tOo=W7nppM7`o30S!xqTTz!fhh7gfTxuj;%S%A{`hb)& znriiMdaAebntp`<*Mjc|=ysel>b{7j{0$iI>epv#;K(>pxu%|JiZHK@iDh)-?_VFk zRRTJbC2V${8Fw*)->*hq2JY1|Uv&I2t8RwS3HQ!|f`10vffF5uc?aj4y%tfh#1nm>594Nz!pgo>ul-Oxp~*HD+;zflrd2?{45 zJMKOyTgAw==Lx*qq)rR)8tS;myP_^9Y}0SI9>)<~YkCy%M2ov>j1|24Fgq!U1ek~- zn_;$WeUN`M?lQu*s7s5^$hvd6aRJR3yrW*;d;{>39OG7dY7W-rrZjP7zPh3=6Kqq4 zEsgxr!=f}06fnU=+Y$7F0pPT!C~yTU=wpwM>idBn>sprucBk4!k8f$JRahwKmb}!k zOdk8SM^0c&6F2zJ9ZB1k!`xaDe+JkB_N<76q&=OKs6hzgoKl2fWQtsn&A?kbGP46* z67I+hy4v6Bb;7$-%o!Kj*p$%lx|NymUg& z4oAi1U(lTsjh>6^m3Utk)sH7{?La%XQj$5%_26IL*UZ@)77M-Ey9EhLyJ;&`z&TTD z%6skoATisnI2k)9o14E10@FfdSS;Y!z$kR8<2}b0*D(ZL+i@%xN9HRnIRc(Wg1kIz zb4CC~Gwi&%)XzbZIZn|@X?wh@$wkgZL?8qsS*21+=rciC(Ey`4M9lT;_wR3X+l~@ zS#C4xqW@+K>8TvR6(sGtK;N&uuwqtP)e04?c$Xz(h`afodK{tp47*ZK^_@#%W}0xX znV#UYo~(CSyGGoS3=zNEZBiRGJS*F~VQf**SJYL?h~KB2`gXm+0QG>4b@WN(ZT4y{ zgr;Wzxl)xtEtHhKv){EYJDAn7C4TchfiGH6=&e+Q>*SsXwx<&2vN$Ou|*g z>=kv2Y2K_(HfcqnH{6b*$37!=^qW<+J4|k2LK-oNB0uECrls%@wR|O_{U@cN^*=y8 zsw#BGoeEjROxTkXXB?q2r^Wrp|4W(SiJM8er9Ct1*L^_8P_<>bj_o#Lfx*li%=djg z%vHX}>Mb7KMsO5A9AMx7Cg3oz-MMuABs52?LFRd90oKb(G38T=4l1x7i<|mK&=&7s>ja}7 zI|EPMj0UFW7FImJs8itgn=)_L>e(gmJ~FGuZN8TlnyPk`qE&V|15ecqOIW*9SG>p$ zqez7as?)HSI1&cOs^CZGep`>>y9Vy@y4We0!Th6bHfR0NJ`4JOoJ7F*Dy^Q`hVv$} z#j=jH=nRhLitckEUve4eBqw=zfKB~b*f2H;fXUuRzJN1B7m=yv6@$@J=9OFA+q&AZ zKD8G0x|5Jm??>3{Tm2vXtH-yN#7;%_iaB%wGhC45qi$R)@V%bdR^x_d_`MSXpJ|OX z>EQEz0pfPEs+RI6w(pS*oi@{qMV{+6Or;FePtSQKd3^3JNjh$xxoCsBiOULo#1OaC zNP1@sanpPG-h`h@rUme6-H;P{bw|wm;uevi&qOthM)#?YTUUEVqxRlJxk8&^+l)%E zewfdekKVc3-N`|9DRuKaG>bUR9 zt9#{?g8$#{FYue6s}<A3Q>wGIib9}!mx2pSq4jkWi z7AZ6EwVv9JYI0}h>B&n58?FZm>;Fx{ZO$$Z7z)?lT+W$V-Zp5J`?|kF-LwTjKzc*_y5e6pa%#gQf8=pDL>}e%Tj<}bmY6}f z7TDgW*=Ojgyct)XugsE}FNirp)&PZ>6#4b~T$Y8w@)S7EO z0zKAqNiD1bn@EI==7GB&-pooeqN&P3I|1D$@Cd6N!RffyE(!N~M6Uh4ZHK8gkMt}m zYKtkvHsfBBrZeBuiJrxWbAZ_30`*aEz!?`gJ$|>Wa<-88jno)}9y9LDOI(XNbiFRs z(A)_kl{f#?qTlL!E-;Cg%S3g(6*R^@9<5Z6 zTR1wWVds;$p257I;U>(mFQx-6BceU9Jmc65^*W_5!(&|2a*pY7vg~{C2IF z?S5a|3+u>?s|3@Jn3JV=rB0VB`-!XB6+6wilhnQEt?n)8m*stHFS0`q94*J;fAHf$o;_Ml5bmMv7LY@uZ=QgGa zX1DTTAEYF615j@>?p)n*E_c;b6zon>wN4q@%fI$Ls}NVJytuI$)=41Kso&tb=OVmD z(`4s~J}f*a$T6lQ)Cg}|L=%tmi5p@a^FOng3hYtF+FFeM27X~4cba~FV8?|n|4o1x zvo-C(#Em@ORz#tv-l&8c;fnU;jQip|u4GXsZu1>W*6m-Byu6dHimS4m%h%#oTPl?@ z{)_?1PA+JhaX+XBqalQEETttznUGruT=)U~*=AS~lG#kYY9T^tx}hy_A!gti*RLh+ zIR5xt;;gqt%i%jr(H^bW_p|cnfda?^H&d839vnj5c z?R>tqs~TLI@{^t?!)2%r9Z;(a(Ds>3UtH7T8p3jvom}*Wqz^}(W74QA`i*T}+fyIi z;p-XvJq6*me3%bbV+#n~6=r43%VgM*UFk4mn?9$4 zF*iA*aVDJ+XIr9K5@quxT=^OGm=jg)hVgWZ!Zz2tn`Tk2XzFj3OM;umIdoxzQ%}1D zgL%eg_o<1u*IYWjE<8`Ewp`^RmpywX_1d2!HZ1@~vFx-S)*RKu)b`_icv}72@}WOM zhBT8{G(``AxkYOM(R5y)6dIN^Dn^D~?*o@p0rbWj_yvHFaP|`;2;5_F<~oRCOb-qq zg~XA$7jupNlrda;!r1B8zP<}_KVhkM#70hI(SSx=LkF$n4JWjcYG6Q|mvQ4g?`??~ z;`oxd>Q&hF1(zUTZCf+~b$dlUxXcpv1X-!F(!AuLka!qcKgC=?7h!xqL*Q-w@FflQ zHDe->t;B6W9@moe@1a!jm0i>LZclfkr{Lplan8-Keh8BcYF9u-H&~46Kp==@BLr5i zk88EXTdLJpwvbC`Fbmh#-k|#jT)5*NM=A>tm315kM_t^G-tuJR(NQ%VLOE4_mwwzD zckVar3o==*h(F`PpR~7jt;aaXqP3sxdUCo{Q;yXZLx>~Y|oDU@uw!+wg;zv znX2Wq>OdeB&@1`%gi4H&%I>wd$&xJ5sW22da>a>l)^?u>h5UmAj# zi~Wx6*^%uAmM>;ltosc5W;M9$JF7~v7hC!*E=s;UXOxahLlO|_E=X1>Y(imbNPCRFnRR-?SSYx?TEIz3|T%FGJ z)9c<|XKEc(h5kYio1f5lUJx7igUYhyc7R}8BQvrPytyB1>Ko*mg@#e;3_P1I!KB|? zIlnq01&##*P>HP)zUE@ zitiqCtHbB5otVH77in`DOTSC;u7vv2Vl8*T`=_;&2l(IdMXdF_W}iJag-cNmNmZeK zYjiEwjCy?Ujram>>)>!NanA_s0-%G%6xW%0CK1A(*dZ_&!$ zp3J;`L!d^u2s+THV=TM4Zkap&dnx>ppCDYR)GVb%6a#5Gulp9Q*BSO30+j|uY+{U9 zv%EfFNO_o^_^5})zC<7gxTSvO9)XFAQsezT@Akg8HC5#jr$qw6CqKa`Kw6%&SlJr@ zGJL~To-Z+q4z@^DihMr<@9%r#ptvg}G(~zojQGQEg!YNAC9qbTcAEBiS#(q)nhmJ?27X6DW< z&NNV@8?sE|TU$a!Mnz3mvy78Tr``HIr;)=O_ZtS0jWwUcUski8T%EK)C_uCx8!V8w zAS&*7gSPTfG~s}oxoH~p8Tp$Aol&kThvRWth)l@QL1VnU7o{E)1H}lQ;e5LZz6OnRIb=Q z0O9|gBjGfe%B%xgxjjp)rEb=G&)mXvcbsxEwzj@&{F9+I zAT7G+DY|BR?a@v=tJ$aXz?{a^CWOlo8;#7!N2)f$_E=tXFNmayu#nQ!5trx)XN%rJ z={M?Q?SA*#{S66qp*7)Hh@Rq(^MQI_FR!sIM0(;z8Ql?bm-}3gDy6Q)K5x3$n>v8F zMQto~2J1N^Q5(z>d{L_v9(%&R+oXk$<686srO$;NoPpQ(-Kk0}pj=GH=2VW~G99uy zeW@j0*4Ue%(A}|wkC)p+U>jTGoPoD@jWf*yX^S$!DX^ygs0iSHwtdExlo^;S>&x`l2WNYBDE3Dbdo#Ej5_&rHvuALU(`7;*E zapz@g#Y?mG*!9DrAiLHHzi<_1Z!GfC%k9a0hbIfyxA)bZ?;z{yfdk`fHFM2F4FaZT zE%umGaPbTh)^G6u8RrKt?4!nYdY7VqbwNinBLX(k1@xFZ4BS|V_Xxk2Qpg4-NGJYG zsx=}5gabRTQ6`#^uXm<*2Gi7$L{3&BBQn!<7%&G>W!f4KDd>Xp%UVS3QU{TI`|QI^ zb81t_BbLl8mlIZNb>zX)l$C8FzbM9V`H$7HyCY_J#mQ%f@|K?mHehk~E`y zW>ZjcS%d+?YBBY99rpLt$sBP^Gw?>{>2+b7rN*eHc5&mm6F_RNza7{_n}=ZnT=opy z-ZuxLyCzF;vYi5l8vsO2>FBBhXp0+_L-lcGs!j^88JehV27VtnL?iR^Ba+SHa@XCA zNDRYDq2~y8f_rj_)bYK#LWezLp!}{xe+POpPX&}dk_P=KLQR!yJ@&*I4OM2yxfC@b#AC<9NW&1fxh_^B@6>^r5o>Uzrr1I609_dE8y7TaB(&Es72C zKJony^g3Vz4eAB%ax4Y?(1`1AImoI?x;5trbfZVy34E3WlH_1-&u)ADsReea&^KaP zzltj1sm`>&)yUBmAGT!@+g@;dP27Z_LOw(wM^W`C|@*0U|ckEZxD-bt* zvv~S3waO4J^SL>m-(GiWt$qehX6##JB>xU`O*XlartND%sc7P=R zpzSm6*G6$uol+Rn*L4>+^6>1csEcK%!IG>Y5;04Q7Yr2~fKN%_!vor0Z)(jZlP_+@ znx_H9FHY&yk*cD_e*GO(R~E*UF&wY&twk;ZVtafo`I5&yb4u@+9APrROpOukTD6i*!LS0U7-} zh#u+X6J;N#Os^EMdng_Sj#FLgN2-sQG`>M`rhz&SnkLyt1pP&AH-?H!=F*lR~Ny#yMfbP zP6JU#!qMZ`6r=Xa+!tFM22FCbP$boAt+VRtf* z9A!y;6Z`VyB{w`TWH&1!#KRGm`UxzTK4PnrVXI<7C(IL+u~i%$B^CE`XYR`nSS2T8 z?#)P7`Xs^)QNn=#B<`I|5P(6zvU!t}gcBC|(M&)x)0H%Ft2O%x(v+G5Ok+>A+P7!*lTNQztB{ZyLPl zgt~xfBIzbda=3c|dN}{ro*`+>{rYo*E}{CLT&UmGohiu?qau@r@{rp8P6l{)dMP@6 zp6-UFBz}nKwzZNuU!nzK6t3m)KJZLQ;?6_Bk7DV#qK>~VnZT_how-G9?~YHT0p9r3 z*GHmvjb(HsAI~rD%t*%KQCWzELTo($Iz3PsgHFvApMj<1U9>AQ=ZvG;_&n}R{0~`2 z9qIckiv}JA_1^efa*!GitTx{tmv)6;#=_w-aZ^ie97r5!7-yp^=lu-4&A9Bb4A~H+ zaUPB|e_~!`@|3VJs@fC%tafmZu@{gd9>dz-s52#DHj419bmVY*io1glT+yEdAr&{I zF?9fFK$pM%I3UWyw?k`pQ(uJOH}K3!47>q0fzhe@Uji@Dz}Bm^12fK#kWNHsTkvB3 zJ)nP=raNWEJ>C}=leIPOej_XW>pIgUImg2}0TWegCc3}Uz;eUwkpb4sg*2F9XGX$` zPBT5!2hbpKdD>o~`(mmlFr8(1Gf3m3Rp7Iy2NFuhjQfVgQ(0@$qT$e60MHgTd!c2Q zZN)`u@tG^@Wxymuux-C*%$bdhZz9IbdvMj`II(q|K&BsI$qEXPyu`%tOuiZuMkyf4 zRr|5RzEXDpz$*qtpDvyD9#`2gy7?=+ z9L=Hc0L|m^xIR09Nl1??`nwA6B0y}ie1yR9^^WVO1>3^b{ah228E)_&N5H3LRS!r= z@)NRUn_-XlovASm%=F5}?-V%r9XK*Pmo?}qxG_V1z^eEm`m5U>fn zRBw%mQ`|M;{&6zj%rWj@fq>ep(OO=l!KbaEUf;|6!2KP>sg5%I0n!=QXlK*YLra%Y zU4gxE^x4AI-0ogqXCrEHhO)c9%X__JIIVM_Lh1od+0JioTx+b@Td0CAig5$8?a5&H zO5nIh-myiw-kW$T7@8Z(3ZY8Yz%j+87S8XzL%HMvB4|X{^9rOq-!E9Sg6lZe7Z0?* z>W7)JX-cGy-W+3VN}zaF0w4xQ=06%z%AStL)052=m23vR58`Zpg%dNNpy{eTxJSvk zN2pHy=0d)dFz46x*NL$!#Pi!S9CG@xi_!^x)32Efz^lO4V9m0K%41# z%6a2ombk0>B4Tc{U$nn+jnTMWV@kfm$68?NDH0M?6t#iGRg61}KvK)lvn|m9;0d`b z@8f>#F^v$H$XHN-(DT*@m-wD8Cj0k_{tPNv8ad_LNG|@w|JlOMm~s0%h=V^`HMhZF zuU%l2JPUSc0Y86)##xh$kbnTi>wvyAC;*G2)30FA2L4mp4L20jao@wRp=!oG*FK0iieY z7&1ZgIBP$XoI6gl##LC1V|}lv1M)QM$vzVo=#3U*B=X9?B)om{&P14J+;3D?4x)fy z6g`AB3DSQIEUF zg4i_L1D9)@WAx4-`CQ+?-yjDhJ2e^6ck}eFQ#t-MGv3~xb#RERZaaq6WnRg}nM_SA za^8hF-Vxjuh(wDh+&IVnPTF&hFFfOZJui;5%@ypOmw+R6L*FFVji4LSL@)+i*#Z7v5**C-SBpbM{5yH46Pg`-G$8kM-5)DPs%C7xXn^CTEb)eu^&mVrP|z#z*P_M70SWz=coR}oJF zGD*?5muNx(@sZc*iI^gm)#e8Gr;5Rg+Gp5rexs+JN4c*sca>Mm8oNOjC&c-$*mvtU zqa@cNFc&^(_yc}zGwiztya)&lF5wyrO4NT1n>U8Xg05^J_0abH*$F-K-MA}HC4>Ey zWlez}H8R@gP<3X~5OHCavXai)#+q%sQn^~WX>Df=Fx|uqU}oI&ecUj|?qISR%Vdgv z@Y6h0C9$fbwYH$Uu%mqJXLCg*Z`0s--&ud(8S`5Hqktf6&q0}-!CSnLpQGWhaTRQt znI|q7leA>tXOn(Ee&#lJWYI}J&`UMor5`drV1h4I4+o|JU`_k7Hi83}k|qnB=QBIM znazc=kK4M136?o`SX?cpw)&95YQs8g_IrDFg3odbM*V!ypvko|; z7OT%j$s&DTT;}Xpu;H<`d0Yb|!wpJteI_I4Pjkc=C`O{}&NA9fxwjYx_IhLC9dQzq zEiHQ$?>tv>&W%f}&#>Rf=EyzT$*A9i^vrgp^c}kovN&6TL=1aY?w9d?p+kcF8AF%; zKJGWMfr=W%>IL_*ra8j)JPZipL6xb6ZntC$a*#?5#( znoR=x^|3nCJ(_W^_pJdc65^$hH}3NccIiom>#=71>b8&R0wON`&cx-ef=CZ?*x&c| zjcZ8s<{DI*j0ZN?9e;Ai@4gaIfprxSIQ9(g)eL*^%6iB8Ulq9jjBBtFj1>0EBzhIt zSYsS9x($2XKR8*6W5Kr?>!G+vrwA7w5658d-?*k9S&0q#1{`(7ZE=6PlYZ8LJ`M{b zk~j^AB!mcV1{HVGtG!{rfz9cYb^Mv4>=|%tS2?(jNZ~$bj^frVMf#j72lMLI<tr@;j zdP=Ef&Ykrgf48CjT8gS=$C9pGWV2O;Gw?UCfqC(Bu3!(k!1!$#q4YVo3cRRfZq4xR ze1Mwcn(hqH*Gcr-`!}!Ao$sW?T6|_i)o3hY1mJl^H4`@Z?-TCVwMHe>KUrk|AsS;K z1R286a2%};w6WL`{j<+ning0@9%${QFq$=Q2);6}2VcHlzmSrcn&MiRLLY_pq?@Gz z*s`f~BN24@enRUPb^Q#qt3k*gGjsU-oVA(dMUt?Qlqc)GBNn?+7rCqXM75N%YUk!v zwMtyTnWY`Gg#WCZN0O>Lp;3hMUzH#&$wddOP^DYO>PIwk{Dw2ND^GZ*k|S*b<@W1? zyvnHzh)ly%!-FsDaz(wgmx>d?fixWgQ%VPOOBYDzd7Fgm{rc&V5RXiI8$k8`>#)`O z&Io2Po`xOA=dcVq(RY1+aQiC59YcJEJ>O2`DFcXxC(7ktzjeBn_!OU-$N?ZXsygm? ztcIhC`YXH#747v5@Al8a**Nn|CwM>7mHoTOT8%x{2v?1NEs}W%Cve><2D0x06Tx4& zj(5nme-6%f*(Ha`=T-H;YeX^Mp(d13ZS;na{J~Q-42sOA@F9?8XFlKB>)w1tIn9=e zeq4gWrQjC0WlK7e^;o?4uDu!?aRS%&jhuF$LD#n{9e2Zq&yEIgScChL+HsNMo)|3e zitroo!4*DiWYB}}rb_pKiTBU7IRp!syqk}_w##Lh>abDupRtJE{{f9@Ow*EY)tVz~ zw}nBWl6(X2?@I&J+*?5PBlSH6mIXs*1EFpaBm{1Un*cAl@4Pj|<>qh$M0n%2x9yKs zq^0koC0=(SkQ~t!IWv(CXgql805EKaB6!kzrtSztc+J2+a|%)n%Mo9oRahl7D8u-; z&svA_n3LF^q9#kU@C#0afg8e~*wb!K?EUeKUbt0j7U4c>rk2z9=R)V6&{uE>|G}JTI z_gpBSTI_8G-QTE$T+_Nr4^-3*d}HHKoo~Ql_x0SLCr>BFt7ID9H8|e3zj+naZZ^m)f(7>JDu=b{ z%XV(ui7ig!zyeuYuCqqZPPZr5Yo9eU&%)bbPnQ5qIqT53bgtrNJ0)Nb6XI^Vv{u|z z>BZE-@aBEsw>1qS;j=1qOP;qyk(5)zQXBV-6qET2_1lL457~72SC(g#+dfm~gPu0( zl&>)oGBz%l9;ASIOYt+hl8$Wp)hg|YEE!N~EFkK{Y3mOKhax7{KcR`9r-fl3Weyy*PYa0r+UseL*qp*7aJ#Gy*BwHW$?HhJPPmv{Ygkp%dy~6Y0^bPN_FmzLJ9|obi`JzK91{Sp^OL+UuN8ofD;|(HB2Q=ks|L z;0&m2$!BxtD|R@nAq(O|CN5>D^mo!Y3Z=Ev7pw++h21{-4XpmbI|KpdTqR}fE*RkX z{98S3Cx(uLi)CL)nNHY77g%ZW#$DeA^5tG1#U)nd_!I(qt)?hH|B3`+SbTYx~@vg)NA>pYYUy^B#PgCI3 zTYFSCx5{)>wVKzrq~)lK7+~PanN2ii27Vtn1*jKtr_BHBB-03WMtuPCCl_(Ui#%%- zl(>}f(g$^a_je`w*F*-cj&hLZQ04#nk3jY#W3QBCD<#~WLDRE?cTG*lhe4?vdv*Qx@TbKVz|rlHj`A0X!v(hs zn6HQQa3+tEhmA#1;v!pb-U$rta}Vu5Vr)C}&yAAup0cMOsnVPP1|!NrC}E&FNr-#6 zQk}S*O1n+mjv4q};I*)cSM*Me@EYMmZOt9)v=t*2%x>i^z7!3Kx(P&+TDD?q}y&54sx>D-G#o8;dCx`i!rtK%_Q*3t!OGjMwwT+x5H?O>edTVO|J zDEWj7TakWsByN4+5?KT^Ix_rrSsxFuwe3IjU}D2`qz@dNJJ11gH!Y}2T?Un=!C6jE zvG$rD2hSv>Kc4<<`#hK39{xhoI!M=-xDEnNTx}0!7gbx&c*|)|qo-0Sy;q~Y@q(83 z#eMzG&_1s{nu3{a$2zu(B+Pika?`wcr>1&ISjS+Gv!!wA4Eyy-wljViyX*k&(r`P1 zo9tIDPYQYc@XL^YIqJhOasqM=X=2`;?MIPq&A@s51InE>jfW#KKzFaD#C>s458YJx z;1f80q|qKd9;$6?KZzl7$mzHJE}Vk)9IZvfvU7&r z-Zs?DUp3Syx{F6fx(@mUl|%1%MCDn}NkY@3X8zifyUGaJcLx2S^m{Pe+Y&#Cz2>&Yk%q0Ps9rm7@q2O=+9wUWm;k7=_t4c0LG+C^mnj6$rld5Hf+k0F zagpwb>IDO8E^)p~@X4^D;UIOeoPNf{dn{xrF83ZmYJeTo4>jXjrA5;~yXn^7Gv=qj zW<;XNyr+Mysg=Jy3Y4sZ(tVOl=@mdpRfS0dPk+BfmwAT$^w(NCZA`otrUq%2VJxW) zUB@lLAVCi|R!dtZ+PN_GAx%e?sgK)^Pk)W`iZkv$b8U$mIz=>*<${SzGoBD=$X0c) zE%9$~qVy@G(vDw9>lSM_a8wBtv84J0N+4f57^2IX@06j$UZ5?3GJr~!SsZZ(vk zh$4j6{KkEu?sV7V#}Y)Ku$&r6MN^(`K?KS|+z?p9t@bWu60C|NlD9MJ56MRIbw{W% zitG*r8tYf?T|7Fc0suIm3bBU5$89o{z1&FNuwO0$F-b@{HRh-W;lK_$J;8dUh!1yl z;k&_7ewn`jey&ArVG2F8xPRkwBpA85D znEsmSBgf+I`r#3L=19Ff<|s{vdA!M}m6v$P9!*#2)waEHKUfuRs!<#J z@9V0%Z3}U0fr$wDeXQ$vYoSy=4kQLvxJP%y$KSADkA%2}#$xi`5$4jnICL*bpsz>y zSwRLIrAqiDtVHj_TSj%8r^ES!XO-9CrSAAM-)gR+mJkr$^$UN!y9!QVow^sEWP42frW*UhM*?jjCoo_wG^M^RA=(^X~SOs zfvVrq~3#?v5-W z>_(2V2sgxDWP?#jV5qx{6&n&?;z|eCc=0ULVW53-uxDtB8~sm+`8v|Kppq}3?xma* zGYpGlc%Z@v}1sP~I$wyQET;%^h*4(j)-b z^np-XNZ381xtG1WJz%Z&YQci=98|~C`6o}J+e;ki3P^il+Tm`bV$T>TVgY$xMUC#i zUhd@HwO0*RlOF!dcpYHC{Z0b!jB?tUk~-ox8DtsnqaM`h7%{*Tk8{dNw);y*B#OLS zXng?NUO)uVf$fA(mdZz3z?N4ej?2N+F||iGe|;zw?Nx&f4rIrP0Bv#l2}}IMV_b^7 zG6JL$$1(!2qh1?7BwZO0hvONQw^t1|vTlX?r)A-XK+zdzcY-h3}0`l6n9j zBX-{_L&))hX5i!P|L>Cc4QrSdNwvL4CgCFM(Ui$RmuC{rst$fO1Qd&;mmT&!qn__u zTf;daqpSoEqh zd}O^wHtcz04Jg!}9 zT~kWeTRUDg*Z?vP@+mi<+L5(InZ$>|f8&Ct1aKBQ^2^>;b64F3Z#mV5k5>*>+n@I^ z^&AuLt;RJ?=iQBbUFC-dP-fiDRAHoG34FvZGWsv`8r*y{Rqih z0du7Vsd=|Xr+SNR^%mnZ8nNN>obU5qZ`WUSda<@mhy1FctB!w5PHv9h(_tpgY_dk7cWH4RonkDcABR~;>PNiGiD1DB@p7_)=|=b+Nj7BMk$?L86Dtp$ zGi1$$1fc|r;4FD&R>%4?s@c+3MRa8pato|-7>fXxtq~(|pd|*-R1NA*YN0gUQl$Qj zRF3UuRzoVARap!9@)DS!)QaX3yKSxcW)N|Oqtgqyq>~mKgl)2cj_n)NEI~w%cgpoG zBf%(m8K*K)FL_#gaKpbPv(ZfDVW4x%Uekr<*na0UC*-%(hs^o zHF|&v)-rLEBCn7slL~Zfzf+n~-%1YeZ~^nUfaj)@i$f}56>apKwjf>-77_{~Ixea2 zBK&B$=C3`%CZt)R^CU(@Z-@tFiokSFlhYAdfyb-j+a?Xr*O-C7G0kb92bdRSzixsl zYoG{4w!UlvkHw z0FNGVe{3UxUIhl59iK;cGWNhjImP%~so4U&2%M=$s3TO$X5ep36OU_x40@8=YTg<) zGxZj{z?vo?fI=HDtq_eZ{eXRs@$nn=XG#+@K8@9w^@#7Fw%II~ACvknnI$V&4nwI^I`!lLx_=wXOf&Ypd-R+oj zJT{->HD20pWR%Ybv||%uF46s3XWXB0jqZw@6;2j%0>zrN5ldy)M!t$`38tIc(^-du zmea9T?Yz&hKjWInjR5?ip5?VAwJT5Zv4W)wjzJb@0vjzyq*Ob4J5lni!0l&TbM>g5 zVV;y9iB8186444b1x?;*;!(kHkSCHaM}axZnW znWz90F#f(OaX?)*h6@>K=8^3uBhfh`u#$4}N@pNOnU;clVHsgxv2$1d`bm<1%@Z3G z+30>(;e(F^@kw?Nt6YVtE$uiY($yZQAs|i!(De5n`9*NYmc_Uq(Dc!M=)PD!#Ap^0 zF-`M$VRFXh`i=#>q|rW!zbk-eI(caKiGLa>zd_^2{e_z_nM$Ean z%eN4~qI9p~VD%MA$)2CQ1h=@c1ygk2Ij(&*@B_23`ZQZ%ky$~Ya8u|SL31-Z&dKSd zk%=lYGHsknO6`$g(llOF7^ceG47<&!G0}2PYhc`oN+)E|;9DbfC@PtILzM-9>JWE7 zGFXbG!R%lhpJMCHDV5~A3+Rql*pj{Ml-5LTrKQ)1OWgt!=d=n27#MTZax#2QhWqL0O~4k%%`$#SGk|5^AbTldg}Z6uERH{(QN^=W%P%pwk**OxC)fM z)$Qp!+K@8Io3_qWxWnZ%*S4q#fGAVoKx)&bnciq`@NJkw}GEYI_A{suD3m z@b^9ge}jY`$01X#e$+xxz03$VZkN&iV_~>cfUDypB4T?q>Qm~!3-QfqSOPQWa>U$s z#nni@s1CHFl>Z12WU!^lm5m1MJdQ_`({Y77AMq#G+T-m&1(B}8zB~_1_EJZeMB-l3 zf1!{m%Rvqk8BsonD{!6}czt{RUA;kvfvm<}adk$RvTk7vkGRy4!Oy#~nbTMvPh^gt zM4RjIiM7T7Ayu)xS{|&bVyMPFD!}!;Fjs_goVM9$=4L%g`--!79o}Ww(;ua$K^S42 zko;VZ3>4L~zFPLLOJpU$%(pd%4oVv-_3;zHWME>MSgoXV{Oqt z^sma3@@e=J)c931&8IjI^iQhwG)tutjb-5d{@vqI_zL0x;8m2aB8A$ZZ``3hha`eK z(4&^gG2`~H=|A2(n1wlcUxg)=9(y{vPHVz)(_5kNc=P5x(kF%$-Vngv)xF-Xzo|x& zba25<*fkEZByS`!^|Yi&=$oQNm4>5EZ;J_Cn;s#@tJ11JpYtKqQi!M988en)WPiI7 zdaJi~L|2Bf;QcI2dTJMS&29Q29G^@p@~^9Akr_*-1!m2)fIzl5Ci*B4IRiH`malzx zu`$BkMj<uC|!7xqhIvG9EspG{HgbfbCiE)Q1AKk!vhHY;LSr)hjW=%Tz5SFbm z<#qVWCHK$>VeAukwjeasPj9^fB_RRXKJvyj6qJ--k^&# zMe|3?qhd^(XNLU*(EzeYec<>~F1XEF5%|7*! zFjwPPVRV&cK!DkTL+F7a_XvCtevE@t{mCBNK#q?0{XXrdKEj=h(nQXPQ~oqI!NLI; zudlTd%!NjVsma)^vI%e&Vhel%o}>5r0gq6wCjFY)e@Wnu)`*Ws6*-v>?H_KUDW4N| z%}}4`wF_j1{grmnz}*3SoPIY^&va9v4T;TBBsOG?rz#1Pgq2i7uE?_wmpDFg)|MPWmO##4m*}S7z(tCZ%#nS&(cBr=B<`c# zlCZ=rFYL@V1M|Y%nC@e29(@tU4WKv#fbMGZ1jq9-nK|@%xGD{SgeT|jdF$2GG z%~QrJHd+se_1#k-{+=GK~+1`g4imDT;f*-OUM5@ zVaJynv&wPoZV!I-xPMr_3X*%x_F~#2>=qXC_%@_P*`^rZ4E|i>l)@r{9o@P+mH+xa z@AfXPp)epn0w_k&9XEl@CZ)97S}%=~FKqw%91HNxl)WYo8c(g+3acR4df86M^Z^UmAbXWZ-U94p#m>gMH*gXHE= zCpXJMkQRn0u2ZnkjI#1a2wWKrlV7U`KBq8inV7dYkuc*Khxv5};*wdICB8}#zZ5?9 zh-T!ET&t&kxIFK9bLS_`s?`kzz!e6vMckCU%GmKGz{kS=tZUh#VdRynzbT?#Pterc zjQfd?#C__F5tBm&@XJ9N9SrLKWje5AsLNm-s3w2Z3F8sm+2)Homml>JV$M6TRfIKm zaqX+|VmNAC6Zv(<;5f%qfvY0!18g^TPJg(w=kg;z(jAe?S|f*XI>3J2ON2Yf>1+?? zNsgy)K%B3B!;!WK^uRK6-gEi%M|?=coV@TQVI3Gy^A6cP3%tfqj+?Biy~1+HLpQb2 z->9Gbh}x5J21k-LNUAIL%<;-SY8k?p%J);EF~TCfAfcS3Zq6C^lOKV-=`t?=1hC7g z|7tj8h84aJfGVOgO$En%#l?*w4<44pjC;S!Aek}kpmsrnQA^8#vjn&bJ|ONw+(Y9? zcP<}BnCzMrW5u63@cfin$1%hD-LVpVhbHd9j;!%rp(6v>LgWH08?E-pCwQol7t-yw zKGBT(E-$DHJu{qDjHK%*jZYQ(O>3ioUgsK@t{#iOa=VDIvh4MG64P`2(H@DZlZSxV zA4$R$+k{Y(fbwdHPdN&)7g8a>r?c#P({<+CvCqJt_DJSgM+WrV_XO^H+|$x0Is)i8 zG-2+5fV8o5W`wK5N#T8M>yP$G4t9MYufB^K?;EDPun1+WgPE};xn^fo#~G{w(Kj{R z8~2kQAzXMuLr`NaxLTvx#isbT^-!+u)v-WgwHtRcp`m$|30HZIY=6tHE3Xj##b zL1tpe)^)#Q(?Ppp;j4Y~sXnGEH z=nG6`J{jo4Y77@iA&%1UQ!w0kym$eDfw;gdrwRD z+szM zPXKu7fH1L7)Elm4k8A;hag7{|bD2Ei_c~*K!mN=afZ(idxJJXcFyLSVhG=V5X5{E~ z#Nr{FMsEtLXfdvj(bc*CG)6AEHF2it*Zy?L{QKis;yra&pMj95HjW!8jb542rB}1` zmvwmVKQPuX-^ig5!_)7UTY}w(qaR=;WADp!t+*>^X}6D3hSXt~rXMrzCq063&kq!U zj1JdwMAJesi8;BZQ5KoK7}7w#M_L^JPDjq!+Gg1O?fGv(1q9|7gKkq?Q;P+`WQ9he zRe_Or;Y}!}N~t?QE^HEj${Dx4ZU1ovgC@J6mj+o-wxM=9fLFAr03vyQ<6}PW?mTmjufl=xD}94i7Qz{DfIa z6$ZQO7+vB%3srl_rg3zFN4kLa%=T#E9ulfO?zrSH)_Bt&?@D~rns`7^3%bhU`uGJ@J$D+eG!`|;g7&+rL&{bouGXDL4z5=(0bUASeB;ae1 zTCzoKh=_&XQL>#a!?XP=#hZxxp)tWa5*R8+!pF7gxT}$866&9#0)-El;dB91OC$=S}cQs#ye^={zfXJ&)@LC0p~ zGd!@xjgl@eT^>CyKx_@LxH;H*gl?KCjw7f7#G6whP zS336D3G865fP0Szw053fTCya$y|>7^XZAs+f+BP1lf_}{*nt5Z)fJCsj^9tG`*=u8 z=lP=*&u3@>kGTNEGW$3HnU7e3_F4o@6PGmwtfP)Go=ODLaF+TE`;BVGFF3*~JcDpa z(|_+V^jW<9gx$g_fV@hwlCZ29?Q`9!X9jehKeL*n+_GfhbPqJr&rO32D`xN2wTRHd z86Qm>yj*q0w&R6%1sX5|f72RTlMoYuD~=KqAcGI8!&`sudU#g;1Bim@ReXRVF@I8z z*r&Vwd4AIxtzGPkh+2-9axzY2Tz<30H&U=SEBL)92o@OK)?G_ z6+le`NF5Wyc=jK$_=`o7-r>Cm3OoYyvhF^TjH(hiM`qW@YE(p|*@Sb5lBNUuKJYiS zi4Tvo4UT8a0Dw^tyrHDv;mEaUHuZ=qZK-16C5K)A|9 zE0nu*9q5yon#w^E)pttfUv2P!Y0myLw!zX~w&Zc+Q%y^~6>iB-UWt}AmQxarA0);+v5iVv^ZfHOUtJ)5-UYEzR(^;~x=Ngn<2c9zl zy4GUB_Xu!e-2klDIsg%GffN$+oPoc|O-%g&ee_qVqYh7Y7rXb&`kujz!qXUfR#l66 zL|hNZZMMv=pH4{>qYXdFes3Xv@21WG`ha2;xW#qI|5iW46r4%8Y4r856wd2+bQ2qd z+l+o(X;(V+OU4tLiNL5~H?EQBl2u;ywcX+Qx{~+hUEZI`ji$)>;`GS+5$dA$I#Ndu{&80Hh4Vc#(Y_6Az*!nokdxF$YL>_t3X zvDOH06HSk9X2KGpGbA&-Ywt3AB8s3RGo(M&W}F%gb35;dwK@1>TK=1>%>uM8F% zt`GRI&A8vVh8u1^7|4<%6m>xGBbn$}^j>kbV*^N3t|Tr+Z_V^IK!X|ho7bQa>+gkh zykxGjl%v_UM`5w<2$=fR2t=pq6eC#1*>B|Y&-}SBKLeYNd%#jx)iF-Zbm-|m1I5Ok zD>O!qL`WHQulm#K)D1RKZ_gmJFW9&&nae*)eA|(HNy@N$GiPOJvyElm7SRhhGx~ zJ$m|x=|?1s0XE@yp)d<5J`yV~Wn0Wx>z1$?q)njr+wlhe2sVu!!4}nb#RYaU8^wh% zyzFBu`sog=?UU_=x}zBwwZGV%ym8O>d&ByozI3x4XqkXOX&Gdz-L)g>@HZV&6BFF#b@ zCOLOk!T^jTA0hIWBzd@SO%c42!g@C#qIiv zTY|91Bf8if&+QHSWFlLH>j0FTqs9f|t`V29IgA|Bh;FsmW`pB=i~U*yN(5fHA<<^w zCl?_LMV@dY7DS5a$V#|w&S0GugEo;jd_2~7)T4U*;`qAzGJ<@lz*C=T76;yJg@{wN5RPxZ~9> zTmT}oTyf(`DM>u1)l7foS+{h8yEZU2fvei44e7Jv`p~dTOCEJB-T}a2EpcHn@UBT> zoipx}l~9z+1S4QMuXH8MnPJE{YIzH`tl( zL3vl+xw2d8cST(_Rdro%0?9V;?R3Uq0%T}2?)$j%d9##p?vLw17cMwp!cX9w>E5u6 z9Z4??Ji4*(?H(B>jfWB=oKa^^;4G(O8(S99u)G|di{%>I&75L+;V(BpmHk6?4gwld}K zo))LMz3**_z;AsNdry&6mSl13T=BO+BiHGy*!TZ2Y__X>TY3Oy48d*=c)nQ4b)FVq zhsqF0RKo5hHifc0Sw?;T7&bdpJL!vfxVALmj9<2rm^tf9%k>nSGzWS7Rj+va#?NGC zPx~*y1`rGyR9AFQ+?<2sovk)!?i;_v{r^N}DQj})ed;C()+f8T!?Hg~#^rW~%4 z^vYsEcO|tM*GS^Ru|*ygv>GHegvC~@)|cIFq=R*{W!1$iq^fhu5WxL z(@Q=sVLN~E@u30JZtqL`=r!Zm+}Kmlp4|%0N_&pU1};H`rDh$a3pyg%9cSExyb*Bg z8TO4z3Q2v92zab+_i*fhCC9aJ*XJ8)6S&MRS_ZL4zT%rst7A@y`~E|&$@z9|0g|QX zKh6w~9_NGB=lqX$t?N-8k)bPHexs+6VQ-JDdv8A~Xd9QE=-(%c8)4m-npbM~b1gS- zvhUFQGOGQ_8!lT<2W`4x_V%NKwwA9!*J&VQ0VHZIp;g>S^}v|`oE+I=i()^Uy^X|n z{MbIhIlcWPBzFuf$cOTAgXQeX*kg&^b%nh$*r!3V)yXD-)DtDrFh$#X`?xiv*J!o_ ziIT(%hiETSq_3^*V$G~Fjd$>*a^g>@{(@srdN7UKq#q@tDdF`fdv6UKK{Pr9*My3Y&| z_c!b(fQI#?8G45%lCZIv-XoH;?^gj(;2t0+-!sfeQ?0-fu|31Je*7q)=}$F^B+_rH zOwrUsS0tGZ8ftjbl<`LZ6XP!|TY8QnM1Fv4-@u;;nwIwEm!DCQGR#^d=9rQ^eH*1g z6uQ7gt|})S^?Eyp^X`~o-^UFS`cOx812%D$VDadXr=`Qh8T1VPq~`~$=nCT>(%6am z^bGr{phd{vKM=j+bTBSr|J%u1x5SY2DfZU{Z$I&b9iZ%cRf_)Q=l0h#T1nIUJ_ESOQ1b~J%PUmweK%nb)>}AxHSl7h= zrk&AeqbQvBM#N~#cp;>@8TeB{Th@4Ew|I0eVbw#NhOo8C7OEU(0fS}Idwmzau`3?h zh;;9JJKyn|+OxDA8?}@`kj)(I5g%Ul9T%>T{IWFz64wh*yii?eGwjE*B7zhLZAsZJ zD*aV}HMvN2ZSEM|L8sj;iS`JKG&Z!5aSv^&pFgb;)!3*Ov1fv7CO#F3eOMG`W_oz0 z*?M@=-76WenF1{!8j}x`ulFAjv^_bH`+d6#)|`R{{vsxdX$7G%Nu#Mx9#_J~PLHf2 z^lzVWKOM9+`GC9K=r4F)nLx8MfFT|{AciZuYeYtIkMa#@E z@UfDyRz^ETwjA$o4Mf?Xz3KoHHAqjB^kYVS=TrnG$_hcol@1wCuRW43=T;a)crt08 zs7DpXI>2@ZZSI*v_a7CsGcJuMF_CSGA8%wDw8f56Cjcb^iW+<4GB@3Pa;k;AE06 zOJlTL1oaRd-R`FBTNOSyOs>#v(ldJhkw6>Au@j2^>^LCOh$WH5%BqD*R;@Sc)o_xb z;_iA0LHSVZ>9bh9zWEIHSPwWs=AWk>Zy^FVm^3XUIKl|#72^b=L6ESWc{1XLL{yP}1%tZz~NPJ2NKj0Bq2!2JyJ`=`a)B2N=#-&pL`FlGEl z(nGxKuOd2As|!+kH62acB9^Zbjs4Nj?bi=tgxn(3_i|NEdc)C^_zIamGbz*59vfEK z`kKBQh0G&LI|SHg*dHxcQ}9$}sEK>HjAsH9tFP-}4;!4oP5h4I!tUl>OEm9X-gow< zy5a91`Fa2)(gxsAzX#!-**dryVH}Q_-hO<-wY9TZToE(shhRP97kjTEJ5=*VOC>Z{ z{MaPscpDtlv}(tR882(tKaySP-_E#SJLFVoQMSvB;Av|vk=P4+r_NV+^J@=jf#Odb zm&xq%DN$^`f$z5~B-aSmE|*t(Ft=*E%`}me*3NAu_Qbrn#u~@Cmp7ZSE8p2?Azm@o zm||eB__vO@?JcIS;YqSFNJqrD)V#oa?jp7#u3lysAkwaV#@%LEjC5yhoJ@2}Z&;GcOU?@DUj`l9_8`dWEVz>AxwS-;Rg+xwUqb%JpG=tk6v=U7b z){sQs;hdhv{S#va-qO81qAe4z$i;`vqGn}1zE#&Mb_Bi}xacf{6l}v+N;55SuTPBC zdc?$bkMzn}apOo71G@CxNCL9ga#3TwXYWQegVJq(;JeqS#u`6QdX{|J^;QawZ}yeZ zvtCkeM*bOl=$}ehmo4QSf(FmQaD7^=q+YfV!?EbkJn9)o#xgfxlK>G~?)Rcq8?&u~Ag$X*eB~bgaRW_|x%*6PJYmWq!r}ySB%BLOQ%% zV8@vi&4JV7&xC@Hl$q3PWHVd=y>a*Np4UMOq;6Yl%(&sb-3T$dEYA>>m|R>U0~jf%_cXp4m$U~qe|@s7Jwmfe zMTcH3vGlWpTw0@}x~~*k_GsRa?8}~@b{U$H1pl6af6(nMqTEui9BJ-S&PxOWdNBn| zJ(dzxAVnzZxcb#ZmlO4PqkcMQD?^*Oq4h2F3`0ffGMPDMwAJhm>HOY<&Pdo%owJ}} zf%^bmuJuPG9;}T3U0;(JmZsLeYbH28ij_jIyqT8KYCE%km$Zo1C_+5Ik!$@CiBF2> zerZ-eVaJD$^JluVU zYs*G8_Sxy~h553Ddp|Z#7dDBp(HZIBbB6t#WnkNZRdR@h=^&@k1}SH(Afvb7^m3hf zjX=gZ++cNxkj=24V-2YaWdy|J_(l!aLfAAVRm-Kfw*;SsemMRxPaE}28q=C>Z`jY) zH!MnIhl5T*0QsxqkxlK=3l&W*p`&}~;wO;|t(Jxlwuu0eUqYqDyR{#7s1NbYIqd0K*T+6prbjr|JO%Z1uO$C#^vQP9&8H5$_8+_mVrkGIdkn9P>o5=a zIgD@YtVQs~QO)@qj>AFR5O>vhq7!o*nWxwo9ythadYcggRJ}2K%R?CrSsPjdLK8gku9^!Ts`e@P5l<*=b z*tMW#d|rKfq{L^~kKD`j6AC2`hFeN(s36Ad66umc+>RRogtm#=U;n9Z~=-p9L6>)W<_n(|lsX^e1?jL7v$2iKU2CirUJr_t0( zolc$-pW*R;FJU8!m)nD0^9=j>_(le$9kD|=%5N*;8T2Rs6#`(F+L=Dmv)`q>t?Y># zQUL1EjJy9dv&KcxgDoQb_P~O%2o>rNFmaV8Qr>{?PS{NM?)cD1$7bBm##eVK8mpPT z-34CV^L2*WU(h*a8`DH~>^=&-n1#QlB)RSH^8UE^vMgF@Ba*$;k=JPq@}Ps!CoH7y z0R>IIFwbkMH)CW|HZMq+RVS!cU6%-) z$D1g$A6fVw?@C;J6TL{7NEyQJRlM(oqtrz6q^u%@CAjHb+%59TGw!Df&$@e+&q*z} zXWTK~ckb%FxC}&#?~+he5ht$GME5!atqObmXu`(|9>?9U+=H|YnB91od|)-AH&*jD zH|Y^k<4}x#(B2dG_%z{twv9Wn>VJ>Sh?&5RXKAvZHE2eUM4NyLTd#+e=`U-9|Bo4V zf8&miP#1@);+2hnWkvrlRGjT7$mdN|OcU+oI=Yv4k6BN~>zW^)Mg{4SR5;p1PgqAL?9LG`M)us8935SVVm@Z$U3(R_g0iz$St z(wVJ@GxzZZ{UHap?Cv1w);oD9wQjud6Eblx-o1$(K&(z+3e${3<0a9jiQ9GlpiX>6 zBci=Th&N@<_>66xm;)BBAd(6T?UrVks0@fIq$K3r-?ja^EB8h#l0GT<)|93<;U5## zOY1K~GcpB0Sthfqo-WzDoz?(E_Bz9U_*a*VGLnqv(W|uruhhb=ZRz2qlc9wcd!ZfB zTpjJ>9oOb_hfOV4U|sc+bbf)2+S3^9#E?uh1&AeVI z*Da+u7X6KewXdZCLf6o^I+Up`2+su(?$8-n6zn(bUwA1oMtI|X&{sC*+Kq;O=U&en z_1isk$^dVu`Dt!}f`n0%bx4|oOM~Y;1Mfd$gEPhx+nFz;L`y<3mS}HF8m~+=c_g<4{~y8g&qiEQ<(FB*G}MSZfXTBJAS%Z`wK<~^F3ftoGMytZdH zb@drQ%}@C|2y>XFK1&*BEQHe@K6iH=RLd$pg=Vea zS8@HIUvXd7=ychRd-|jCdo+lF{(HtJXuyo9>Aa>3bY)_QEdC5nuIod;!h)GYBZIW` ztd!Wee(WSNZuYcm$h*#gI~^bt2@DCH*?Ht%KT0M2%p3^gKGVq8z|*BkV07Lxa`LP^Y3uGsJO zqnH6ys@HU-_6J$df|3DEr-mUcOeY^)dJwZ|b^icg>3wI4c4DZ67_jm7-6Ah^*X$E& z9#|S2^cEGxd3W5cb5MKTAMSMt9133@uP>~CR_&`5O1usPN!k^?(Y-2%n{a8GSm*x6 z{1OlaUDs03m+YnZ!7IXP7q)aAGfk!^`;?ef1=)0Ne795A>$-pBNlsO*rq5Ed-a9gw zJr*+B>DdP5V7bucyOZEk_KX?YhUPG%{>YO=j2=SHR3OS6t4s({pA&gTsnC*Zsy$%B z9nvT2HtD_0`Puy|Pog!#S5oVU?7K=&c0q)gaImPFjgk0;b!){JVkQRs3sIV|_wpl7 zGVWY}Px4nRMeYzPS0Y6{Ia9{78L^$Z*SqXi8E^t5>@;Mb>C3(RsFPeerw4#XRl7QY zpg9cRVP_uC9Kv{y$Nd=5^-uUv^*`Y0J@2; zUjbOqfb^X$!~H((k2c8~AF`O&(PeMZ&O2Z<<+FRul3_UxIXPnl`wgUgmH&BjGwP2p ziIcArLzGySb{svAm? z3W}-MjCcDN>ur-(rYDt|2AwN++ovVdz5IyCFGm079ISIqGRTMQEmH@i=$d?M6Jy`A zH!R4J6dHX7!mH1)KdK}cyG)KG0goyP^SppL#+%HuMRyomLxx_&5Nk9}ypi}nrTM-5 zNRq^>azkg5Ktzw6?TUmZ3U(DEE3n49xUi#|4gpJ10e`-Q^;bfEfn^{ArVkTj5X$Ek z)Z$S*G!c8qM@Q`246S8fOz5e;Ki$xK{RByjXZTm*n;5CzI3pS`jSE71ChCVFsa`H( zdcg&I?pzi8OGLZZUlDmN9NAC$iG^fZ!`TXYyQnab_6LhJHhG0^-19jsKF4RAbFV)d z@`w<3q|G&Q!eb%qf`PJn##)DQP8kEhQY`rel%?RK^;6E}UEUuRdAV&=X5eU|sAEHc zQ>D#X>!2wJzW}Lxwql&PfFoBhf#vu5BS-=y@tCy}J;|vM5QVOaRH@cit$l=Fum2oK zH4Nhc+pt}4+&8SrI~UUE4uW(^^_QyxpOQ$ll;W{O zwsV|q9Dw$R5q@vKf+RE*j&vC{l)~-8e2vHQeic&TDrHely80GH#R>Zn3u$?}OZWDp zM}mD6msH5kyBrXh%gLeG8{~`4)()#Z998fq4{zK`9pnxBqa}|mkTVwO;H+bJ{J+gT zd1fv1#e&+dYSc%K@Y2gnA$vZJyL;d$UGD>biX;H3 zL10SR>*VEm7#ewNk31z|FoSwhG^Jv_P zd~}38*5aA892FGkbPwz8(O$UsUlDmAB^7Fhoe6uWu-ymPu*KYt(*EWOZhLjIsImIw z_u3>g@Q;c-(22X>XzY4MhqPB>oO&10&q9Md$yJ^Q-U$xan!pP8jQgp`_jr=`j{Q?Ms6j6fJ|Nr0jpM}e$v@%+UeC` z9@E!-a3L++^E}pUJKy`)$u^|eGuDgOOis_9Q7^!1FX{q0*^~7d8KgB~oxs|8?z;6` z;7^wXpj~T%cRA6?NKBoyFoJ)$p20W4%pSABsVdt1Q-k(JFKi$@l%ZRO$eozM~-Rh*^9%(JJ*~5W%KRw<618;tm{b_68?MFzSLehoBaR+gE zg&MrZQw(yq^mf61kw{E>*R$g4M3FM22zSo7pN_nP&kcy_b(a{_U5eNFaF^1efCTQ< zvC6bB?ir-EOh8B4^FHvWB%i;OMU?C7%!pR4)3g(*kQC=))8AiVxz>_=#EjF;ap8T> z`w7XDiI!YBX7DMrp^kWtP{u`fGLLcjoRMlj??;kjyo1%he7;F~`()(RweDg*ifhe% zB?{vVqKXqt3`E@;!4yh&`&P@Vo@F%(o3PEWpNu>KXUWK}rq~lV^^k@`dRj3BgzPld zF-fbht)sTw>isF!b00r4@=Nq4lt-hqT5EI?tl$-N@AlY5!3F#4uF^L+(i}3sKuJ4h z*e4&klfpReI@AjWl8M41)gV)%qZOH5@_FPn6=`)yq8V(YgG|z9*e4%xOc|l&CsC8h zv?jd}psRAA$#B*w;dCepAu1NaKnC%Ivb!G*l!c-baN|YmfxL!UvXN=Lfa9wNd ztz=oKD1e@C%qJ0HqPfMbY7MX;bTPsWm}`qGAodA&T842>KkFoyxVG}IJ*P1J{VKJR zR`(f^$2Zo$Y9@Y%LPuAt>@?DVT1gq~@nsbkdb!8$a-D;&`_*d2h}-Xs$yQEed*LG} zI9}IAu%UbdI8W#|CK1Theum*+O_uF_+-trqlbgJ+J;R>D;IJ#{!ETjaZCbccxcXa_ zF+@3b!K&;JmiV4Zt)Z>?aYUO(LU0vH$Z5SR@{cly@ogRC)VYlGtih^kR>rT%QD)dD z5s6RePA`>QtyUeR--)%$>R|2VX3Oy{O2Herad3DvY1XJD$uwrzCk-Jz1y5m;cgc|9 z9hqCmJ*jJ)CDqFNy5w6qhvc3|IWVs_8K7=F_a_@ zH~t2OSwUZgR+g7&b}UJ+GHbdtGoy;OVq8al(FhJCVl9JfkG~>H=2D9oC)9|R z!|XfXuQsb!W9VAS2!QBB2r@F`Pe(E_62STg8XsFg7br*K;N~UQ8g!4`OX>~MWi$643euJd!d#3 zFRYE>VtFsZGHJPQcpda_uNn18Izp=Y1kC~q4RZe@5nk^4o>=xzevD6wI^hoX~ zl1+O3{i?E#sEg?h4?ZNLD{3;FCN(GTKq83VqRyS{Qd@yig$2mU+#DXRG;ftFCK;VebFIRW-ltB-H81m5mDN6@#SFw5dS8T)R{ojL zSuK9BN4faMhrtM_;AgbiZ!~C!?+iN^f!Gj~(#jw8NK~w9Or2N@Me6lFV&;PiiedB+ zmMJl${D1Iv_p8WiGBS?pE7Pm7zY{gXB|E>wgB!Q6BjPm1T~$S>t>vHFkuPV4J?GPI z00D?<+a5M@)C0P*^i~|c5MVmE&VV9#c zy0$aRK*JpIpZ&vGPVM=wbEUGqefQWkUz%2=;o%wy?NYBA$9iC4^v@&l86$TH$MNR{ zl!6AR*%D=y=d_)otY>7Ry>v8R)t2Q|U0_*v*d$Ti6BJ#M_|~I9U8*fi4U?}&LiT=D zSH&gMxAtLO};pnd)PptYF}u#lJ{x#L6GIymDF@``;6M>3j-7~2Lsw3zdb@* z#hr*Bimw*}7^!$Ky8ThGNyvB7R4gXncXrKp21}Hx$h`1aqlX2rGhPl3^_{2Pq%E-f z5b%$y5!{T4{oz)=X54$OLOPxF69K0My;)vD*J|Pjx)>E0#S_NbN;HzcoB6tYxt1Vi zO;1c#3Sa>dnCUsib5R;y`*|SUHA$VcXmZ z@OGnKg;HfkDeTTF1bJu)z@VDtWQums@lmHRtR)BPh@R!`VB~ci~ zfh&C{tPJpbZBJek;T^_c6x3tqW*tIiV;igkFL36{Eb6)5 zlu@}k4|4te>Z}Xq$BZ{x z?S{!Y8)4ELIF_h702|&>2DNY4C$qs7I*`rwcv+rVh4E#@y+;?6y90!ENO_G4(_V_` z)?O703v##f4ZO|u1%FaQ8F~^uBx#3p7-zz+EwSmOBjtt_Hoc;_FHmo``sV%I}sSr|T@(Z|1!`we`~CvI5)+!+wCoV=P}n`VPaz!4pSe#T4g z;MTl9m+<(|H5%5bFDGoDFAmC%cQ56K5k0r1vp=5VfWrw3O`y1Qkyom_R{H}|dfECL z_nPlbHoKCMkYVn1Tl!3-V63buNv)7vEw*)s{aX9?!Z9Yqay-3DaIIyArCA$YD?R(9 zc@kaN8;F84tLsC%&_$w*Q19(nac-Ik!+pMC*ZJB2Nc8G)%tkh!$K6b#p%UCo3EbFa zFqqEXuGgkg(j3GLy1vNUd~b5>kpYFvwO2ag^fxC!6TR}@LLp7gVq6qqmhlHIEYirM zzj62Z;s6_)aRW$fWl!8@>$}~fE581-EXOm(I1;v}kqEk;^ZSk4=8KCwZx9>H6*Lo( zU7~1MG#n2ru!}TPn}9mD2;X;7!do1r+8cO2FN>ixGJOrLo;U6Boz?<19bu2Kn@t-v zD9WlnO>l7aeRAc(mY%O}SyMOeEcU3Q3q0<8BYKLg6}LsG2&eqKtHIqOZA_1qVdNM0 zNp+BJXtAUVu3*TE(;c?y&j^68X{gYl^Go82+Czb)PUw_RW!H&5F-*T`@ornXU)M5ceqCjI6b8DM(vK$J?4FHg8N zBHTEDYoI3?b@7+(&O6)8_^0eg$*+e)K;HO`d(78{qVA`dzTgxPBk%StXTK%R%WE)u zI>n|laZ~~P9g8bzZ?BxYxaWLrYyg1TxQ&?TMeH467l*SmAguL8*3&i%GvG0kllEmW zx^CZln}H8%O?O(IdvZ`jtQwZ`^ynIc3PLHYWnS z=YeItIZ^I7(pd<@pq{gFD}y$)b>ipHxN{v|!B<5o(H=Sn;gQFvpob!uMpNCJF;>uq zr~Lj{pO0N5iC4qCtMCfG#(CKkOU`*Rx)FF~X-E3gu~z#xLneTx*e6amH8&vc>2bY* zx4FJK0s|F_he(Vdj_OCDj32Gm*Yx%(!o*qr?Mnc{t4d&d!_H;c5gav%Y_;)$o+UOf z>u~+o(}FtR8OktTN^2Ts>W=umUeX)(m@f^M%UMRtf+{ZqkFpu?gSAi-mkzD=I(gIT zPE$h;YJfZ77xt^nXN*^lJJ+wvp)#}ZtQ|`B8F0#p8Oi?A%c5% z>^pkdmJ`^QTN`M6Vb}TQmd#L>avxOU72BjGBbu?LuefuMz!dJ`IRbx9(-VHq^>rzB z->^?!vd4TSvX4dtu!eeC3H{~dWMp4XYFwOTE^!{;-@s2^QurVvYu#Sz6p5_su%@rGJolT! zUvD+S@Q+8E#vpMnmY`qc`NWq@*BA-_B^!cn)ERRmG}|j1!d<6BaDc9+TdhmPe_O#b zof)DUv^|0O()f)#{Qo*0MqnMkGQv*f9e?deuCB4O$l$`K!eT=o{=C1)*L-(~`Quch z6QxCwrD%~eKTO(d3!@{34*>7DY!$eNxI%cS{Vc^j*Mg*$5gCckQOF2PlU|Rc$73(- zt=#jdbQkL@n@=;DHC#mM@Bxm*czTY{`%m zE?7D+4nihfTHkwQ9+&}nA(Ti|29I8Zd8Lp+gDwdAmI>8Vf&gXTZ?er8}*(qPQ?T(+M~+(JgwGuR2f=5 zEZF;z?v@5rjUQDm@jxZs`ow)DV0n+IiDHywCueolXIkGOAB5Ry96(kD#xh}%FAq#A z8gdgjW9A0r2vNRC$d2lwe4fw9w*WozH>6Z`Wtwz0~D4deGlcSmpLGZJJpQ(cYWfX z|Iv15xtj7?)~GuaS^{hg^uJ@r&oDOcFMYZ1j?4v~zHb%js8 z!hOX(=Zn*swhCEZnZC1<4f%=p(1My64?INlf?b@GV^ZN<433qpE-ly|c^^+_ih$q3 z-4Yj%2c7S(jlc@;XqmOw{dkL$u6=^A(pKPWzPvrimO%us=mYHv8!|jm7^3%)Thy~< z_rNa45EkE3S4O{mMZV|T+ap>_aLiC}kMS!iCAjx>zMJBS{S3}vImZJ>8Ti;iA3 zm*t)dy4Wb3xrVnm%~7fXXWQC9X_&nc+$&SrJGzeZ%@J8NdFR2=kA>ljttw|9ki!Vq zm1vXnA9`X`8V7pQO)Lv2W5r!53P(xObxf%oxvi!!iXeeA{zzOoSG4Z7wvQb9NcA%O z0?u}?z$--wKJsJaVMhHPW-Lp0%cnC@%r;A2?n z-g29IeQ$2c!v1OJ8JD|jPM49MGK!L3cT6e-hEhV6w{F*1;VWG*9zv#dZ{SZC7Nr_% z%ie+u?2pV(rz+}nn3IJudLr4aaK(7RrlqN)A44+%SFs2~Xl zOu|BG^JE1c&U-8HWt6S-jn_JS!mwIBK^TCtZauYYC|E6CBT)EP$lBq}Bfqo49pJDU z*V9^3e}2m_bz%QvStNDdW9TR@LBogVqD9XJ?pJBBI!vGkI;=#l*dQSQmKAr(!v2M@ zC*RszruY9&-+|!`^=b+;VS%$P+dvS(!`g^!F6DB@Dp`T2FzoP6qyej=(;xUG4Auxb zh8MDDC2CHm1C?i=hURf`A*g?^p3KsP{fk@O6`@<|$p6mR8Ea(eJX1d(CP*cP2u5m_ zml0r`Qf%hVSG>IBE36QHK;dlo0iaZFe$#zXS zTXCm-AB=K(q>s9*UrPdO*{Q-wxstwyO?=Qz9E)4-`fzJw=0>M}f4&u-{(Ze7*wb}r zG^risA~TzVzjVq!gT>EIf*d5dSaDgv(YMuunq7l^iNi+G2`^0JB{CJ_D!|Qx!|ZBN zknJy?5jGW}l#N^} z03E4V%doLR+celA{@sQR`<)p=2wU}g8SD3^U~|*%O*qDvgcj z`|#M+X=WLNYJYu!r;v&D0|^WE9m@nSz5a~*uLpu3f#0Aaf8d0)Dw55C^UNfXDY88YQ(o2}d@ zs#%eU<5(qZjWd>;9qg+{wfSN|NZ;bT$Msp1H2up4P+dLuy?m+9mW+VAz!P^vk$H^o z${`ShC&C}VJ5h(vbUF8iPsTw6&v<>2Ct~3&xoi^)}OHKGf?F zUQ)E7=qq1$lmKw1Gin)}yrJT87aVKe6L3P9?3y%P! z`XokR!zu(R9mMdB09Xub+;h3;3~~{(YCMjzAlKdc*4>rGr8r@FCQWAfMDkfhT(z$=E(F!Kn8HLtL{`gP!DQQS`pz%Xd&f zInQyfX_5D>4%}Y8xRbpMy~_l|UqnhDfq@T{5~`+rc02weRa(uXftr^osr!TYTyZCP zSxtxQYKR07`XnxCggY{neWwh&J|h>#W^hg;aKGd@XYH|&`<{3`FvSFY`WrQBPheL9 zL(UcwLcY80X|a}9m(43lX$`U;)W8Zn`O7H98MJM=Y+IIs$(T=-SK2+E_ym^LEV#$e zBn(+Crm7FJ!cO*b$h9rvFo3lEY&j2IG&LOTWV!OZp{F5YoH|ba>4DGblp2@BO`@Z4WhmbFR3P&icd?GtFnMNlB$h_5$TF0k9>xlr zS|lTQfE!a9$*q6(Tjmv5vKCXmXuu}!9x3sIdfdKcl}#M_2f}O9O`X6_KZ1kWR`uH$ zlgUi(SyKS|!3gw2_wg-0=H>UA zU++s_7Dg76m(5uJnc2w|_rSrSWgxz6V~JiXI~bXMaL1 z_PG#6E8@;*B70uuoiC(@ct+=^#D>s%4ioaY4gzGx4- zILAsvnfw{@X0y?_epL5v%6}<^?OC;M;MB7h~&#pDCVa*lXn}c>^#wO3qaJq+ER1 z1yLhC?mb|R8ROiFIFB^f)j6c=p$ol>s8r+jjFE{1f(^33jODoGTtz8=E$r7AT{ZME_f08b)^ ztvFokWyK0axP3!HNn=Pt4{`vF6{f3S;Q7Spz!bv)-U*E-Zd$9rWqhZGL#=5MD&2!_ zCoo3E0YE3OC@bztRLZ5|=24&pc#Wk9o)8rmgeI$utn{F-r>4rbIH(EZIe)HPBClM< zT=$Vb>fNI@p0Uw`)T5S%)|*U$ItHf(Fu&|$v+{=m;iYs~fmg0lf}g3;Q)4GF-rgQe zWut|eCx(cH=zwH$kK+s7^dd=_J5pxkPj%KN1=H0}QN8Ao(T)mQnl^yLLSF_2myS%> zRH60^6HB(w=dlu@r9AtW0XsJE6)a@}gR#=2D)+Ei>wy7@rDz+dNVq*_d5(D|N-Kl? zv}gaKOVH0TJ(DQK`}z!Hj)+PVauAprYKdQnk2UljWv<$TTln@xUI~kV&!ax(S~?OT zwp_7~4i8{FvfbFfq>w#p*i(`839Q!fSytqguoQUuYdC-Q&pVNCz)RdexQql&_Suu= z8valSK2T(PxGswiv40Y@$X%DKl<>a!=~(3lE31S%bVQFZ7>$R(uOE-0{I7otWN^pyp%)MvOz+}L3fE=P9trx0h&w07Hs){1 zyB)SQ-D!lQ@yJwlPnd9uW(W3zZVOzok9D4&pAs!w0#g77W~Kb00*P9i=E^&8jp}N; z6#~IDQ^R?wv4;8DX4(`kmzXlZVR#)VevmAlZZ*ic5IL^xhDbcA?B-ZzV8OKVZE zBCo9FaCDxk3l(F|&X6o`brXG#5m@()Cl67Y0jez~E~XpETHk(KNs9?3H4vj1r10!y zLfR$-`8UU6P(3DyXM}SM+-LvlU`gzsZJrm$QmBPc3)89c@8SNGuP+v)Fq7o864`td zd05)HhoW>SG8$2W^0oYrPo)-4*furV{De?Bu$p02 z&lPy(E-`GmGo^%OImYR^(cp~o#hDXBGGr+I7{dk~u2WG7W(9gzSKyVpP`-ac%-o$c zIXua5(itvT<>y%C(T4Hu9Y=7xJI@D-DEc|q_sA=Cp*axYt5iUD)`D4~7C>Md~GWWh{oIl&#WZBD4apC*Iv~cRGb&cq5(N1CKSy8tLpFy@2>^mO8+-r~`=5u`K!? zc%?2>^=`?d8s>TH-q@V0f^WEffnofp?jf5FriF3tPo$lmbY?=T>}JST85SpY8{*yxgRmf}ed za7CVryw$MVl>^7PMq+L0T%u2WZh3n&q}8bB6XApeJ`F&9vHJ(PKR)eR*eG~#U@-M` ze|;P8G{S?p{%tfD_)gU_%w6|!*hiW?Zb$S|t`&J@E*iJ!5L!}3A|h+L?JBXj$Gkha z#KVnc`gV`VB=zDlG9@(yUWp5EjaMFL`qm5E3S(8u5T%Iy!&nUftP5J2E8$oT0s=>1 zUsIq!=#{&q#6VC2qc;rcp+V80f|+KVkR#N7tQ@&Pc3 z)_fKB$lS#Txxoo$$MvInwi@u2aswr}HkNA(K)rY=1)>f{D@$>6--@bxy}4b~ND z^&Wefs)?kx-=Z07Cd)RQq#n8u+{e;dobbNu=Qovx^{KgbLX%&~- zj-v?y=N|nm&8#biw8l*DhC3qwXy{rdhwuN_$miM^gpg@wJP_~wljx!C+MT#YPhiin z%$O^D|8}+BSmwS*aA>1TGc(U)Y2}J+gc1c_Qpe?AC9DN1e$<_d$fRGcA>TWk!EYmP)F##FG(Amk$Na^lF^dw#hmzi>U(Vt zMlEIuu{o@V(6ZwFiMY$TkM($BN-jm*pErHcPJus-_UjvXisnYPS;5mk&=`IEtGdU9 zERwChBU8Z~SP3tLvE|zT32V z7Pzz(c*v0Nn!o+N68Hc<914QR$cjo_Pt@TWA|vo&9`GDdLtmSD3FmHq@x|i0c81Z| z&rkUvq8NHceY?I9P9$>_8MOCczB5?{OW9^$@|e=O8~%Z?jpUxC+&Tar7BP* zxkX2jrfplExUA5>f_i^4;0ZlaI2h$4w1JQ z3_-#f?Tr@Y7U?O>p*zD=+_5|P0Ok7q3*6QlOhLKD6VqVgUnRZ9Swu(RdNY^}yc?{H z{Lr1aC{6v(!4y5+l00XX3YTkQz<8lASEkdE=g6Vnm9S>LRaI)EIGb zbq-!mOs~eU2-Y-wXm9Wilf`@n=J%{QZdT}(8kr}UEpI^xW1ZFca2I~&gDBCGYePqylD zt^~$ma)R>R)Tsd z{u3zpu7Kbn6nu#&-qY;C}z|U~qOc)^#AaFL8+$7M^!X)kM{V25x?$vy?5I5h&0fb@T8Hpt!Y; zwrkxV?aNvsCD!|gYZ~=AKyBxtOa0>)irzH z+<6iiUg%WkXnBq;{Nzxx9geXf3@>_46IHA!WOTHZvzTkj8JiS5#&jZ}j7P-j%Xkgu)F6iFohL01k)zLss-Xfhc`pZ5ZbtAzkperFV}sG{5KTOIeVEAW|tEl<3VrQK{6t z1F;&Nkz)wbMKSFe(ETf9n#&JYCkExXR>DGOLMPqzR^p_JKV%OZhed)Xf#Z~E$iDd^ z!j2gAyZaj_-NX+@v#eYRl}Y>uEP&fb zPECh%l#<4i5Q6Bj`&9>#!TUTT;<}6$+~TOY?w`67P7#`Dy-b z2%NQWkv;*W0fel;D{i6o?dw1$*s>JnmEevlKFskn77Eymk8hm$d0W2Gp7;S&31e4@LCdw2wDj|D){ zGpZr`iaXZ=P4zGbfe3ong5NM0<{6c*HoU^p8I5WEi!rBM6s$S1Y*cf(F`Jn_v>M@Ue zIEFp9+-=~@^=vitkBBs`z$<5=@OMTK)$vgC$Pott0;>^N5xB&v2qLRj7a<;yKPqVC zJ1?vic;zf7?N)~dJF#-auW~rf>js4v9)~j~89girK^d>F?+?(eEv$@{T|6smQB{@9 z4hV3?wKMqWz6j3tBO{%i*=L+ej@Z^}eMR=kak#3R=Sx}6w2}@~UuerBY>iSi@u_CY zoVa@pKLpNU3!|ZzFHEf@oYQ=8Kb|jV(fp2nowrlAJa5ozEqnC5f()Rpf-(fWOmzX2 zzor%gRlV0?|9oi+(Mfl^NkS^~5*Vnq1ejtlb|p;WjFR0+XRylQGP{~!VviMgWi1p~ zX$KRqQ|NQrgg%hJF$Qy2$HdA_t|(A)CNM2H(i?KeeFa_*oY5Dh5xkQvzMv=+57cAH z_sr_>iRMv*HVZ1=ScC~>NwfId4=ZcY_M%D-gQ0UEu2BxDqwR@p8vr`7NX7^k0DBpx zqv$n~4Lj~$kyqAovMVrCGjcpzRsuAw5R9x*`x3do09A=YP{i8wp)Dn~kM4FNmsp~n+OgXpOaSxk!$Qf_Zbe>ci}51p z1)&56sC;96c6VU;abyQ43voS?v+=ox48@|~Blufq6bScmLu>BgQvFCtA3}@w_5nNN1 zKQ9M?Kve4H_L{~Cyz&+g$D-7gyS3pT>r24A0z}9YGg7~Gy*OiTd41-%C4ebix;O6r zWi1XYk`7Xr>vb%?Lr(^YQ`P2y(_|eJs5Z8;vWtob4F6Q57kOnZB(C~LvPVz$YHgTT z9~73t83)NoX!Bt{gAZQ%2ur5_Dn45ISf|QPj<`p=RUIOpqLrk zfv+8d0kp?SZ9{&lKap4BQnk?wy@RH0eh7>QBtm@I^ztJJG_4>7UdfB2 zO@~1y0-zJKN^QLx!`=}6&O_6vG`@|J*EUEWEs88Gs>%`wE610=kj><0ZV+txn)R@m z**cs_Vzco`hV^frLmR1u#AaRqW%E;&l;g`_;F*m$!EM=U#A1_no%sf2l(QH_tj5SE z`dR~~!dA<;QM>Lrz7<(HOi6wfQuFEU=c$39t-xuG&pb8x79ikw?(OAeXqX;29M<%# z9Dmm$U-A2N(LkgFeBw!Tfq2)k#L}}}E))srEGQI?U&pWHH77wn5z}R2E&Pe|F z-{>J-+@5QCXGWQZ)8tGqv-uTxWinv@c)v0ztk_|5XVgNY<4F6Z1Xlq;tBxK0G*`u= z+i=I_;0;{9Jch_i`mud`ViyftJ|dvnFF36=HnVE_^a`T8n9v4;nKz-nCmMz;^vYy#4j}2#Tl=#PD>($_C#UBo$%Q7akuW6CS;pnfW;nOZ zZREQGuS6#JY=tkvRvX^4sf)p?QT?*YsPnQY@+5X@t?w1g4boB{DuNlnfeb zdL!`^47s0xVdhBdv?;Ql+5Z&#ZGrUb&3J ztbpvD0Z+%J3pVq4GQd{d>zf=ZrQ4U7nb`OGzmEw^c zfcPjGN|B31znS+OZDh{~aHyK@wkaT6>dIy4XCU;u28nPDXEi5YsH814+kGgdC=js# z;Jot8QuBL=Mg1(t%4QH=;&^QS^E_E+gp9*VtBm$MbdB9zJqIp*yg^sI&2!&BtFdw! z-c{-e0`~nRJ>u#RoB=1KBdoGS*8AKs-<_EwPXb{+CH(!`eZGfY=?tTL1vPQ$=77}v z2>}8M4l(vf=p))svCK^u&BvluXp*IC`91c^XNXlBq-9?RNOi-E$jnV+o>00D*ZfA- zw2A&4BQ=1zxD7y#`}p4Cvm&2+EFK}Q+A|zlAznd)|{JyTM^GlTq`;w$# zPsT%9#x1jp7PMJjVTo5JR4SK`aa|!sV-#+-?25b6BooOJ&LOSf7z|w`u?Kl7Qn+^< zwr?FCG7ZBdA^b|(3)UW->x=#6Nt+5QnwU!0Ga~usA{b<;k+U4YRsA;2F*OK)%$w>k z`uHg5<@`yLs13v#V53YCMJt?N2KSf+W7}!T$UmtkfOKO*-hn!scx$At$n%kp6oe8& z_r5&VG-!`{Tzn#oZ)uT4Hp<7DHVxIorwv;iT(hzQuOx|P0kTIRYkt=NYhYja!`M+G zZzETBwoy+M*`@oyBg4w;^|0x7lrj$Zj$`DErXsQF%_%UKqkUPDtNP>+ zAP+)mGJll)JXy>n~pa>v`_~^*qo29d`eg_P>7f|NbZUFAe;!->m=l^Xy+T_Fuo* z{@3&Tuisl)O)Axr|Bc7iH=D-)mND)Yep0`tAc;>Fe&jdRF5{PA`6O$}^-3ZiAG@i_ z9&&m$1hq!Jd>ay4cd+d}At#s;8n#Ue1Ljv~sho5yNhGv4?5CN>vcRDILDjFk3Hxc3 zmae|^$Q;QW-OQ9i&&~-L8TOt{#X$Xhqb@~XB4Uw|-Gk3;u``eBBb2j8%3Lag&T1HN z7urwAmT^pE#d?f0!c+}i5+q@&w8F*HS z$wkZ1s{eMXdmgNhks_YLm41+F7g}R`!e>g@YgzxcI79g9kHIQ7fNx>?;|f({C1j3% z9WrcTW>m=kA)(@AW`vZO%UGI{yj`osb&iYa93p>vIs<3G3EBW#^y&1!DhN1gX|S62 zJ|1*Jbs>1@;;7)FT%NSzhBm%%uX|Q0f`QZ(iituB7z94dOQ6e?MrDHT(+J$*DkasQ zy>sttOS76aS0d0=QoZnkX@k=>kqEj(HH=&{5+CqXsrij~f^l zZ9_Op#j%vd<~G!&mO=j?`fomInI7OhON@mJ-EInK%#6-Jp6;l3l`%|%xW{yrnD^JD z_nU6Bj_&owtn)pcX>e?bcnyd87T3kTsde!TSh4u;BRB>)S3RUKg3^KKh8kDx#GQ|d z&5Wm|;E%}f^%oDQ7;u2}rkB{4B3K`lSITWPdG8^-^ye&Z)N8)0UYQ^1!^xP3ofCxR z6QKv{Z0RKOo@(4OM3R%Lliw<`FU;+ zeFfmkby;G8s$bv=+(W&Vl6ZBLZJBC_1PIL4f z;u7~pJ?BZ-6I{7{P%^K(j>+K`t-12b7l23j5QbXj5Nh$MU}hP@<9 zU(55T?{mm{;K;&qmSx64oZViu0o0G6zen(Wa|xCYJlrm=e98Wn%n=-lwvn#Eb%&r1 z0}Dvu=8Ete1|@SYFd0MoxeuQC!hq2FKbXag$V6s~5i*F~-Bn-qADpN`^Ro}DloRz8 zYzhZ}#1|djnQYt)8vI$w+~+N$?nFK3D?3Nc$dkNA@Pz&Fu`b9nhU#fd#hr6V?m=U`QCGULMM}}+{tWS430R`h%#cPx7UWytY&X2rN@Y6i0S}!-y7ij zQ(mgtkuTb%A4EluJ5jc9P6RN>4%>f2IgyM3eyr?u#E4*;g^V0+;5?dlq=v$dKJPc| zK3%}Ccxy5lJD1QJ5LiL@x}Lxjt9z8nE2?sNo)-wA%Z#&k#wI9XkC`G~H26S)G~V|z z6h#4j^e=P6h(U`ul|gyo6(;;#KjKpFv1wbV}%a=age4 zR^PDmS=lCIPt>%4hgd89&M`dc=kRlkPRUIwKHZVMy|v1^_;?7dv(w=;%6pyNZ2?HbRfB zsxenHS+EGO#;4lnj)z+tSf*#bvS%&>k$yMilWtxVeHLQyknClrr=Q2kN~ z>V>l_CF&7%fod-lB&xQ!?WkU(SWp_B(zu?_wbW(IyN5pu`sSV7y*4;R0QfhtpOD%f zK68c$t`e~se&78Dz(WD5F%Z~v9WNu407#0Um=I_1EF=Qw!!F!*DL7s9 zOu>OOu!933fY37@l?^JIWT>j^v%Nu=>of9(G>&F-$+FUSEG+~V^v8s#j%naZs0--| zfHjOGHtX}oT!zmP|2_KNuavYCG{8yO7BR2q6av#q>c>n&%qXoNdlb%Un-AKiNw?Pm zyQjV+_jEVZRK>@tUz#sIleqNqdv0|=-owzQ6p;TPP4@LMC2@Whc9 z?<5`;L?Ygx%NaVCPQ3I8XAJ-DGw@+tl%54}$&KW)Y@Jvu-l@AFNKn>DAx0(Y@`YAi zhs9{u4@Nb!$vXP~)$M3vYQ_?3g-C%PaJp!bkokXn3a4m(FiX=T_|qkSBqI+c*;ld-G_41~5z8QgPb&5#nqA#`V>{`uoS^XJD{ z)RpaP;HytmzSI#h+7q7pJv89pPxSz` z7Gc42eZVDRwrjSeyPEYZ1eLGrnL%fg($8aNc6JQG)6oqfmT|$0+}A*MCdsowswsNV z2Kc|uO?ck7Rk&|ogM=H2Bg5(3_jr&YRQAcbG|G&@fPorDV%}KI7Ke z)xx+z+hGN+-wNV-7{y26wvJU{LBtUNUP2e%g`Nv>i(1%h!|w|^%ef_jX#Iut{Bi^A zu@Lo3^`6;0-xq2Ysmb@^E+%sIL~7=g zp-c5J&!QKQ6df@IY-10bvVXj&icbVQR@|vK*N@Vj;tBbO#{^y62x4C0ipZ)fy_%SQ zV1;OHhUcfrqYl-s+UpFw)`3+IJ<<{h!zS*Y{)aY3#gjzo3lJeJz#O<`P{4*6i|T)d zJ=c4KcnEGLf@L)_GdEfhp0?R**k(|AcZfSra8)g}H7uWOuD&y$eZgf>gW^C+3F3*j zY1K@Z-x<=VDbtVF6#)@N7du8P9lRC4!l5_AUhBQZUDpYKV`B?lkWM?eEI{HjNGbj$ zd@ZtmX{G0ci#;pc!3=w^*A~cf@F~q!6n3LbUIYF<&#)S}OZ0;&{rP~FF&z6_q03?V zIKobptdD})QM?;5sUp*&<+tTPEQ8>YGm&Emi!7RL;OGRb`u!2kYnx%G#+*xl^b?76 z@SrQoG9+rA=&c>s0L@CIWc-S+z>->g&XF4RD^}boF_&HlB{q{D=YhC;8l%TEjBkR7 z^iyqU0Oy^AQsYtcc@Ra<8FmWHl_*$)&?(LPrXrgi$WvghzgB{=7(+e5?B9OWU$k;4A(9>nLg>*`G9SSBIEIO3#Q*aU_X@k7 z*PkDPC&2d+tJ#4`k61yJ%muUUv~$4vk7qa^L-+1m^sCxh-fO)!lL^{Y<3+a|T;po& z@9d6*x;_(GSY)ap_(9VIkPhODd{$Z8>|XD!rwOF?3C7dz61Znh1Qm`jq+gE{Eglob zkXh7#vC2`P_3ENrGw!n%LccIO@_XKy@IK+N{)11|0ZoY` zQY4J~Qujk09c?J!YD(Y8A@qkMw4hSO+Mze}%&=v}MaX-6`f-KK1w$FzST(@xebiMO z2iF59P72<>J(++qCkKT#h2i$l-C)FzbZ)fnWX=Uj87UK2h^=o zZC)1(3M;N_my*Xp7&oFUfNe=3TKX#C^Pz1Sit3Jq$r^Q4cruAln{nHhKcu4(XzG!` zlvAJd_QE=4kCDWXp7SEBU1+YaU}yob#I#E&i(92 z9NFXD6AK0FxFFT^pokshxT9}k(0vAf5%LvP>@yzgcnMRl25JD%(fS=T?#xW$0T^{V zLuPE+ax_Xd^c z!J%p`r;#(@cqgU%!oKEK0_)_`l@ctu7m-1oAn1u#vM<6vIC`-xwn2gS5l}B0Bx`-! zdR|>`9#SO;k~}da3aZB-_KyeAOtqlzdowl%>)mNR_fNUaz}I?l$R}tFWExA9O#sFZ zT7oywKv=iifW|*ic{w9uv!&>{V(`3H;$Ecyq_z@n3+e0}&=7-hUH`iddQjTF5KpEk z>AnMxqayoBpLg=KPh6_xr$joEgDz&Du!x^KSjDjSw3?AT5AqxeA~`fZzuW`5>K#4p z3zjNbBk`)2=!U!kWjP~1^WYb?*2ZS^WNL}Zmg!&IDhVZQ=pWD~Gw@7LB$v;SAVWwU zS|Nond5I#Isl3&S9dQ4FaYUZc#@7@+jRouMy6g*+YNZfO`m^voq{Us~%up2iE+UXz z^K;Vx&a_gEOErZ(wr*eBG|5+axG<^y4&uN~XW7*DiB!m*ti5TgYKbfkXwFcZ`@hI}!`4fvz~ zG(D@8X5Nw3AEVltpR`;(MzH>2;uVa@WHQlVV&D*tvvh~~ZG;NaQ-DMXrb#PhCTeY_ zCzq+MxhgoTK_s7BIN6GW;JkVwM$%#|&FFwqdCD)~uri3)Z`&-!Vk0iR3Q_3Y@NsAW zKYy~pOmFm*o{?9y<8AL7zeF{Qcz^O*!-yI8O-|@#Um4-v=y*B~P3|pg#J%g=sYZ#j zM%az~jVXV$D5XHiXf^5-Gw`%Qq!nr=87*m|4>2*PMnl_;o^`ee*qGFlUHau0xCcku zXotj}QKtzat)`f+`G<|9Ma8V~cl7J&Zm8>Y|8`yUnvwzAkw(g{nO9$!f=w{Pa#X-x zh*^p?F#P2oPSvzT84{x&uw7R}QCcm54i&xKIpraQaLk}a+fUd;*oIlz8gcf3QF00? zoOJ#}(LY8~B$H&p=p1~{g=_gAI<~Zzt8AQ51xIvM+J!jfU(8E)zZYzgn+|-9Bu>Nx zjBDrlcr6I4Z2+NE!;R@*eeBRtRay8F=FN#|3ZzKu*}zsK*Tam&Ar+OqGQ-Y%#D_^R zg|sB^ycWXb9cdL!-XIJ6S!DT$r&A%*nhFsLQH4Tqn^Efwdh3#0C^gVD7t?a`B#}IJ zm8ZYOPNfnf(8>vdj}B}~>%Yq92|=IwsBBR{JMb zEfEz6=-s1$rp~x+JuX2ugc4?if*SL{iN*yyy$rp)|rMd zI7bNIVo!g@1f5j63d50IT0|wxDD*pni+!{U1T0LynCQ)@_j+0Q_P*7EdRIj?Y9&*9 zkomaMd_*}`Xxb!tnmJ)Q!(; z%;0U}fdCJ@Q=5e~RKF~?`2PmN2X$c-Ay=3u?Y%M({HR0fZ8mBk<;r<9U@0(SXdQ#x zLognQ<_Oq^lN-8Rjo)%lgw{f=2R1Hn#uGxpCOKIa`B=4j0yaOQ>!Vgnr}cUQItU0R zV^(aZ8TR_FNb_`z{o6O6=OwSs`cyw*8~&M*z=Jgzjt^QHgl!B7(1d2#dq%yk2&%zr z7RvhU&l_&5(Kf5Rpm_M~v}BjyOPOiA$tFJTgOl_i^os*Pw&OQv=kKtqwLDaWx5FB_rDz8l8lAfU; z$LWZJ>-*ZCmD)IdHG7-cztQ(F{f_nI-Ov7eIQftcNsrp4xCMD=I?5lBtk!wg8F;<7 zARSRRZ@9Z*@r<-derX?$ssKT--2FmBHy=8Q>H2IDGU)%^X55+E^lSJ53~Q1QcV*0i zRSmfH*(Z5CV^a-NHqB3z>rP^K{^!B@yJq0odC|dUF&37Y6!eT0yZ7|OkS?pK+H)YM z%s9u9sGOJiI@Zp$!n5_xs7y`c~6)c~JH8!=ZXyNd53iLn#Wq{xOdwskxT7 zt(4TrxWBj!KI@K~Z`z#b^;#+!jH!>#7!#d?e(Z!EnshN5no(C!Sv$t^k>jbxd)WAf zO9X|D;nZG04BKG)4xt5=?iMOwTZiPcnl5frbULUNBd^4*dFPRhYlE9|xlE&SvE765 z2z0&S8TQ|5ZzXK&)s^qVfb?^~O7uT0E;q_c%YHABJ@@_b%+f7;?P8ETw#%tJ8)mTloQ2&FvgkU$w z&P?!5FNYKr<}}PwX*29M4k9MuI550?4f05sij22(WI2x{*_4xgg8R#T@Bd0#W_m$0 z@HY;+V;9M&enIZfjQh=lOz5C6pjvz3 zD6*QYFCN-I6iuWt4(A8d#2xbL&gw2a_&v0UwI{xbP*Gae>r_@>Tf9UNs*|5WMTWTL zSZd_6S}?jnCu+FXAhfCHjKKRh6GCa>$rmywPz

=I?t5#I+6n>qW>PP|lomA42yb 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

r2XFaMN?14Vb682jxn5&n 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�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

bAq-3G*jVnhrl{x(uWw5$UzfgaFzR0o+}8Z z%meVD=AhTJ-ok~ItRNLLg%WGgF)>JUbIw}hn*%Jvo@=kkdq%6Bj@o&`Pa-T*gfxx5 zR65PtZ*DvUeV=B$S3v)dhZV2*nhP|=@9nEc(|68M$8V*{@L=L{wyfP;b5;+lminz{ zsim4X;+}G5*HwzB7T5|8=&W-*(rM{TpeO=O(5WU*`{z(sV6zCdf;!)OP zrb7U_1*qHSz-@jrbAfg#;ML;W~B4Jt7VIXQcX>4)G7Yiss$sxbr<|U4U~BeWA62NeUZ; zmC8Y;u5K_8auCQEW|JIcg9lLSvq$Y-C|H9;pOGK@hBrs~7rB?JsFSE2|FD6Gu1C)B zEa$2IZ*;HWpWfuEbL8vzEed*w_Xq;Is=H~A1*~2QKFoA!lv)5@<L*F=dh+zl>bf+sDCOVV zJy#_0lg2+SFh>ztX=mR}7!LGnOTQNkHtgDmm{8M98Gvgnh;Hqm;d5L_=0-2uW0_Zx z?;acLC>!RszDTguc1=+6E=gDFqj-`}P!}mMwmh%%?TP1cxo7Q>x}vIXPmm>Z;Qd<9 zD|OK|0KKty$#gb43qmU{RVYu+2Mrrthm|qIqoq(-2TLj*~?hM#)DXT)iH5;faB3gO74Ml_+MaL<9~^LE&>7TJi3SM`8(;i$?UC1bpqju<9` zBE+6W+Fe_YXTc0z-)%)Dcq8oz-ukK`=6kDJrd$SI7bZboFAN_FF~P@~Z>zDBKJFIo z9o23Wa;^5jBl6uq9TXhFcPi*3)>D&CU-kETuU}lE)-uW!L+4U8@5x!-!NR_Al7Yzp zh)W$uqoPSL@#I3S$*~4r>q35XOUdQht7I;Dr@*=89;{doD#@wx{gCAkPFdHq_t--| zNyUBrq7ueDWR2#l4xegRdqXOX1YyG&*uF_-;rj+R0TM)U?HqgG;~IBGC14-6h!ESJ z%*#z@jO;PW#`TVRA+xkB0ce`@>(nIx&_BbRVvf6ll9nFAHUo7aM}V_LP3%U1+YX%$ zI*w~=O5sA>z0Z8c{fkQ+w3sN(4W(+(I^=>yY}$R1-tx|2vIU31*^ z7M>Dv4FBh>x2xk6%rabttl=)|rGyHvbh^|d9*p>&wmIzi`)V2iw8Tp~)?Nk?l%^*g zb(eJ^byJ;|Bkw1BQ%)&ICToiIz$-4{8sl1X#mR8bx^VB8g9g~ep42=O0@D?n!d@>J z@C0^58uzO(-1jdqab6PRHZV3s`r$@`_G#TqG7#Ng$u{$V67PVXM$LqucCUQV{fkO^ zwBGIz=HW@2LGkn?0r`+Zc-lC1%1GPF>pg&1#RQ8C@T)rA&x%S~dD40lsAwJ~vVFBu zGP%TkY6T=oQZD;m%i>W{WL2SY_?*M8phTRpfobd9u5X<@H^Vw!1NH`cd7#$9gc6O3 zc{;83qxe5ZT`|d?cHQ?bG4e~*QK81Kx?Tk2OH1TChN211TB%L&HW_^0)2Z`*egO%V zRR~!czFUdng0?-R^ceoVqY_Y#B58B1&lG!H<5KB3CQJW*egO$PCSdv&>(r`+#mPZX zMZ{rI#7ew_;Ervt3Sas$0oxU}W@PrPcx0=7##oS7?Zys?-xJ{Z`~PRH`9poWS zhAx79&=;ImbJ!J+=z4nSFztPH{{ChqJBX0e<@H}&}U>?RsE zJEP>K{(iriZ4P^}M-po$xQjekpsUPu|A4Rm(s^z1a=@soSt}73toW1u4SvRM!R?60 z)bYu9wuBi1f$b|A-;4U1k}dyr9is0#@~H2&q){%Q<99aE@NCj&`<`}$V^uEM?Dz)4#?SBji@ zUUf-lxp($m4iLIc8GYsJaVM+{XJ5Mmq@hZHsE{b6`|Gc<&3o+LIH7A<2JM>ig@OzlT-2@Rl1)P?&aZzVU;Faktua+ zZ-f><+~cLj?i?de@uph{H`n@V6H~&dLaV(p$`um|j~fJeiy89pa!14ncHs7fO)-PK zXyi!7`W$vbN(e3qRY4xzT75KPnybR*_gJU`59333%A znqJGEiUg-GAR%qEBUAScg_FF(lkXoMV^0$t#N4MJeir6ci-jC3K{xvn=}crxArw`k z$Uy(tnVf=d(`S6Qm{@5Y2}r-)=J{b>@emSBY3o;u34KuUlhSMe zD$L88g1gO8`}$&ZEA0)sgiM^^*!9Vr-LV&zoe$-E3)bwE@39uCzlr;a|E9b7^W(ez zo29N}c#kukvW%P!A0(3WH_Ro_xPrW(7)yJT4hHa1XEF!geGWU(B>Fbr5J>v-wl8?M zlA1c>5CC?smIPKQQ-k+a2Q){urg1E$r0Z$d!_pVFLlw#1;2n&3RdUWi+P2{yK9xLx zD|V}+^iZU>C!6wf)O&rfn;9630q#GW9oN$0QKuB0V}}~x(6lKRdw&tGb_F|byqo5* zlS=Y$AVIP$gOtizhzZCYivv22v|pSFZ0-P{>;57|IGz+O_ODL!{NS#1=ZIJ-Yn*4I ziz9%HuIivhm&b)2lb<-<{_5R6{7qm(OwStk$9DbKW~#hIN8xF z)Xz~@48mJ>OQ$$%ix$UzMn=rr-u zmA&SS4n2kSJBK>XX)vGsHhUdsc+Gj;vLxpmcZDEF?yxaid{mgJd+6Zd*$#P;GtaA2 zIr^Sz;bwX5&Md$9uEM_F!wN#=UIbp!6gnY&wJqHM4>_E|_L+*7VuW5k$gB}-E!Eh3 z&952pSxnc&mG26~4e4|yBX^Eds<*{(!W28>)r~W3xA-SUB0E*oo({$J4ps=VGtlm|1cTg&kyHXy$|t9C2CSpQh4lL3YRAyiMH6h zS-cxHY+l>%Z=A3ih+T$A*}BhBSKQ(E*ux1y+0S$=r%>t|TUFXl68us%yq~B?9SRzC z?5RH9bI=ubNFQ=Ce^iTF%b;c}3Jr#e{*Cx#ysx8Mc6+8@1S6=i$L#lhe#}`1VaQPn2zK1v?~B~K#RZT=u%}l^Nv!m(f&%@ zj~?Da&s(T7;?OE}B~y5*qV2inwrSn<{79`~fVdadE@DAmNk6|ad<+QhOoNS`dXn&4 z&NngHOeCx^=X-V6R`AvT8{3P)%{e|AcW5?`=AcB!d-$p-W2c9gK3Jma3ADjayV*scLtEsbQjQ{OCmpqUC~CXT0_VNt)#ga6D?v~ z7n?m@c!2F1lP@qWkq%rkO@fU7M}K&Jd{)qLwNc$qaLoCzQ*XO9K@S*~b&4&?3=Sd#Ni<(Vb%bu8^K9FZBo;w&~S+_@@+0H=s%Yr`V zzdzk8UB&J~x&>ryHeNY$?2!-{SJd@>$h&RH^;aU;n+1x7*qNiQ2AX(OjS5khAGN?$L%cN&tyqB%b#W|O|uCvdi+S1S%4t|Ebq1x6HSqyV3ZC#F%?vv92OCW$&i zx9eFDGEH#_jXF(epa`H3d<=#MFc{!Mh{~UTSA?N!KvdtJhSeTKB4|k;23pcAuY3ww%Ic zXgWLl2mL$Zq=bf2x%XJ=slZt#1saeg!J+0hwXboH$rp@KKx&F-fJSn;9uGl&(IH zs=~OX53&7LAFWmL>85O&7=`Eg!OpPuf&lcCB^q?(Y-yT!w2J)`mx41Aah)n>0R(un zs?-m~xqFVgSaOo#>cr`<%9_yT5+Vp6@nUtD;at}s{qGMXs}Vulzy^rC&vEyO@_BcX zcl+4FmJHvjHk|`&{t;%@HNox{zsWnWVS#rG5>lRNeBCn7BC%dtVI2(V%NTVEG#4!z zu_xKvB(JyxM9#oIr9OfnYKzU=(bu@=JlEs{^nh|Ji@dJ-6P%$#>r^hcK0LNM~Qv2X5GI)$flZN6V!$mUgyho}}fEEJo?+6oD>SkGqD2 zQV$<`FaGnM^!y&W&Y*p8wL$n2(%IX#B6^$@ZA0#spWqyJEC3TDtP~uA!k*GpNkCEG zk?cDgIPM9mO;3$`#GUC3R%hlt7K1e!47WDz@8hmcd$&FMl^%81lRkq>%7G@+dMZyIqO)R0*!gX5ML*P&`G@i^3HhDNzg2oZ~V^;WN25 zez3EHWXr#bfGixrr@SH}Qpi^Wla-UE9&}|%?8aF4in-J{)>m7!Gkw+X+&p}K`lu3G zDl(eS@*^$L+u@1^i-{DHenP|sb-C?5ojz>V`0-c4-mpu<#Hu66Z>Mci3RIQEEF+ua z^dz5`)A~JLCD8RwYZIBnF8=Bkv^WEmxEB;Ic#Hj7zf>wynIpggWObO<(viE??oK#) zd`HFDez-GAs*#`je(&NYi(leSsx2!w%{!qFaqY9$@h98mh(c36KNZ*5ez3ELfC_lz zBvJYr1ueb^El+Y?6!_uixT`-`&0fuU3i)2gcL0sWUKOS`&;n6~^l9NFw%l|eh_94} z+||JZ%-w3n-&&d;H~aG}J&cK7MOeF}Oo1lEjRpRp(WaSxkFC_C9x0l4M%gew5{kwj zhD`#j^=4Nv5-U#vqelh*E+|0OI`3!%)P#d~*pBvxUNgb3mwxI!J_>W(6^!7qpSjiW zJE~qYP3HZIsDOaQ(Q1k44AIW`IS9gZ^Bj97iFf=#UR7dgaLY>2)jxMg3Lur9I@+Iq zvnK+#DAi@E2wxuEEL%F8YS2HZt3C4ixW%1EMbQcXI(&DH{JE+%Gnz+_&cUnt@Ab*U z!5OyCVSj7k)+*|-JX>}7O1~3v(kYx-x_oKy!7zGLd)YCc-cO%wyR`n$6 zxgx8mhJ6*5BnTpLb@Dt{0)tJRpc+JRX)xuUpdjbCD-6*wa^oeyEG_4?0%RKrH}|Iy6KQP!fLA~8lOe_ zFG$@v?k^5O>Y)%oLBDD*#}p+(VKp<7+GQ=^umLm~_1(_6k@Jy~i{0nIi!iC?(%`1j zdzx`wpU4sL-ZScZd6Peta{74d6rr*R@1^LP0mEp&IOM(SHYp_>gHb0Xwl1kMrsZ*D zSV?V{SP}X&yPM;TEb;s4tVaLEA%ufeoo4~H%3x0lB^A9((~Lw>gSMwOC{HHNc*JR{ zKXF2s<1WUTeuXo>1ulr^*CMIqLgixn9+!0pTdKWn^%e-BWD$=5Le{V=3<-$i2oWyI z4y}Hj5a5WbbVii`(<04Cu}+S&Z6jzSQd&L=Q>-&RV>UsJ|_bCNS&#JV7k?jZ-L@Jaolis z0yRB8Vwkquw83d){nRRB5?3{bsA$p}hu->m$=$Kc!a*rS0P&7Blhe3TS+KGqHmaB} zMK~64)wlv7HVfk%U$YW9!Q)i#G2R7y2L$oZ9wUd-``6FpJnSBG)IL8NhQkqKr;q;G z;%jVcaX}bSI*$@=uqkw3sY`(r3zGqLuTL>M7H{=*j)t4Mr*!bm-Xrq8D?0ZYIjD%x zuAg|x?Quwt>`B?T0J*Eg`f_ZRk%}w2Dk~)D?s1m!>C8gV3lrjBOi*`W8ZWDLyoB@!TNq z4t$rYl}O=9F7B8EkC_?5l6h=ngr|3|i@ZDD0P!$?L+K=-l6QWi%XhtxUISZtdvZ?u zWFL+NT;(Z6m1HYJ=H9;~6)1*_S`-F1KkB7*87-72VMDJug#deRli~oZ%@RE z*Jpv@%bzL|f~73Kh=U>rA{V?qr^!S&%+B^N@irE4wY=RPHfSxE{a!CG-t=@vM22

+g<}y{Tl`hSMn%5; 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

_lQ$;;(_f$6A+$_d-eA{&a=-g0 zI(9;~88fSo)QZZVPFypuyf|FL14q^ky%@h*4WAc81jAsVzlYO{`b4|Fs$M7b9=1gU z$WnKLx^Iub_(Ga$ZzZ`(&@$es86F=`%s$@_cKdbBQ5a8xj!g$E1lm3YERiAr=rh4ojfxYEUk?N8tPyU$qcJ;q;!M zGbRW>-iHZZ&n%Yz;JT+&;lmIE4vLKozLs7dHaVqe8IYse=C6M)O@hHEqAe`C_G+L_ z_X=;(Duc_&i$ssqn&M>@n<1_d$!gCUTlarnfajTFwlkmCr;bQq@sOC0`DszU+KG)j zlnMDhN}Zd$mu>pBwkPO1&pMeT4nN7_wO~h3PM9;K1(2}QMp)PSe3v~o?0DU6 z2Hob8M(h9vi4|q&A2gamOkZJfwumo7_%5(2L0g|uqkvA_DPNE62|9oMz0XGG`FC=> zhQZ{fi>|MgjT$cTkQiPf4y+NU;YJu&x~0T(a;MC>vx9;YTWJIt^>^}}4vbH1WvIkE7}*-5~s!3>Zk z$*+v!F~y-kn@g0G%mJmA_5Mifke`rEdvVFs?n;Rh*bmq=N8=^jEHO3F$PJ#+S@usl zoqkP`PATMx`Q!}um#BLaf+zxf1|@iDTN=98mY3c#K*f(ze%41o&h;R$%YpX^y3IFa zz{)(>XP0B%z~77})oM9v-RX}zbR}6AkJ%R2B+N4ci2aHAqzp%#k}@C0SSf-8EPT|D zH4Z~~aTQZ4SYoqX_B$uKC@$XI@h?C#Jkgb{@EO;$NYb&jjO8j~N@)oa*`VPARuqw1 z7&2o-7F6qeP2=63VXj@Fo>TF>`|TMwmCwlLCk`VJu)_&zy6%L9UJBYZj-K1aO#j7%panS zdadD8`ENoab~slO&?7Bz#tr%jdX4X7!hMqwJv_rZCk8V++FB;iInQ<9h6+9l)b*ca z8kA5H@x@^pZ|hCPU`RdSpLCM#kwev+$`+N->GYu!jhrEluHC#B0{00z*OT<;!f1I- zlgx82x_4S(^bev%sA-SP;Mj=7*L~<_-)aUw2mOn_EWWsLXw1ykf<6$6U8CB4#ZOOf zkjNvRQ`FO3VrZ)})tZ=vMmt|oY~wfbh$Q>7o=4zO%@dS%ab# z>3|0QI=>|K8dN$~-VrsaxMM9@U~O$%e2s@8>P1vb$q7;wBgQOG?@!Qiz7MK0OC_}x zR|@ugz{WPc!APk`=QpBm_kWxO-8jj>5M}OsV$P6cuz))`8g2dItR6vGx%2nB-~*e} z?_EkP4e1H&H$xM3-?N<17*0k_K3sT_5^*>hWmrM;t@FHBost4 zR6}f{X})V1N3wQ_`ZQ_hBS{eWH{X*r-l6Lg^~oEEN&%g3T>kE3vcu) zb7Wl9_x%alzRyY7IpDdX-9cuLVoax=p!@rx4xm#S zO7wMufLK`<ieYRd=V>-Ko2uMXgwNi3WyL~ zd7ibRCc5Hsec^aH7<^ar=O6QfVyfgDGy;4;i=<6(;2X)N1XY2(CSX#{Mq@UxB-T>WUT8aP!JLiQPjnJkAS^TLHGe;p2^gC1 zsfVFRwwegV9yG;6m@%;C6ODJBTUc9iO`ScSvNq=7PgJ~Y+XWSI%UJh}7^;L@Z!bFn z5q@OAGm7}!%pvfS%sOVwx7~IG$dqw2J7t?}4^aN(OB$$cgfBCdpsAN0mZ3V1m`2_E zoNWdTPmiRgVN}0zWH+p2wOnT8LAmv$g9odZ><3sDoVLyg_L@=m`KIK~cshG5r82O? z1HBK6m~1aaE*Y>`Ek3QO1S0ZFfe9x0sl(P62RS19?NCc`pJ6LJwvDYYC}N>H1kKrB ziq&FmRh_a-fA@D;$9z>38hu3!-i}P>I&A-4!s=y=Z13q@x$YJfQbFcpm2$T?*5EfKm_0-=M= zpxazm-Z7!VK!u$(_Ql&oz+m1T;C=R)+%U%5PNM@)Yvex~Pjh3Ph{yhiV+H^*@~j!P zLwB{%J6S#?*}gK%=6APL{RMK&)ogf_Z3gYz`>3=$||J#(Y??Rwfq`?knh!Jv5Rv0v+CRGiNgH$q$=wR zbEM_#P~s_e9|&#D7?Sy#(gAxgW7>PSn#6-w-2c!rC0pzzoVvWvdd|1SdF47X!&W60 zNSV8-(g_nTN9*2$3Z#-35+PM^ChMF=_a~)Zw|A1!LSg{7yq_gloF2Rk%?QFFh0~3@ zuR0iMEGH7J%Rt~{_cQ1^-xdh_isZb+{IWh+S}Zz3F=+>Lkq!ZYP%6lTJk)<9Dn->B zb(=4X;JikL7hkskA|*7pt@*GIz|Of!ntFItlkr`ua1rWmGiaOdic%W_o3R6weonCH z$i`r%1&n0Gy9YHa(LR8Z9!k+FCJmL9TVDK$6i?LY_ z>ioXt_9ZDDFWq+q#tbTvh$@fn-G4S+y*S{x{4#zrFy+8`a;y97^q zafiLq#p0x^7%m1Ftc4m6uQ%bTe2eZ-Tw3>*B8XN>v40LZ(&%H+7fn)SgdutZ=QTh_eMFl z994;WpK=?j+KR|__2*$<1S6&QMigxX*^-w5D@yarf_6rtMHySo{HO9Hv$G5u+UuATFFttS}+>^2SCS0s0mB(sM>_Z`c!5p2WwI zX~P}0$1!J(HA!t+c)B%yIhtWv+53OAMxf!o@U|KC$usu9fNYj%Yr;wSzI;yPqzw%N zF3ds)|IU#xQC(P(chz28XVgC57jm|Gl?gcjAXtZT`o4UzC32R-QIjAKzLBx27nXeI zivG>@F2R`Z3n9uZFsh|3sBzZp4y4eC^RSXiT!a|n_-~F#Nsxv%jhjJd%t7)8OgJ?B z{5Z*5no#!}JhH45Cy*n%@lH$A7`hliXUmvmM!n|SG8|<+q%7D+y@_GW9ZD!R?!cr1 zzSPAb_pfEqP{T2otjO2J#o0VmN-_X`W} zjDhwUbsb;S7ULI9i5AGb{+WThqwJ_WQRafRBhNW=v>BvD&dNH?sM}mvN*?Mu*6L?6 zSiU@+SGQeL>6hyO!SBvigszpvE*>BNzRK%J(NYs{4s~Wt z#1d#k7)C_SaS%`0+IYkE`NoBa4qQkHg@6qaO2($(;-boIWJ z&QwJJC$8s&nQ+8=0bJC^E%wP#@0{w!6)(+eR9Zl%+6yC>F$#KBqgC3D$1#Jh^JPgZ z?#$7^Ld}^Qe6@kj2o%&&(8DJNXQOHnDi5#Ai*J1>`7`V`-`2Vn70B3k$+~Kj82*`? zWGCsy(^qv<#n?Q;pIcxsW9$$og*fvIajFrtv_kFTrv7mPbN=*3}_*f!Z+%C(f~sCAR&P$ z>~ItfbYvMo(ktz3+>eWiRHfXNrxVd<<1~Xl*~Wb=2C1=US}6x`dR#gK1byhEX1@|y z(2nk?CE0x`k0>a#a)wXTC)c>|1*%99P`IKOkj;2h0qnefaPVOiY0UWq(^w!ZewXX# zvFz`=dUB1%5RS1Ei3#l4?3yzGiGXR7#3{Lyrb!zwe+KED)+Jx8t3A*9Vh&kR2kjB; zxTVaotOau}Ijd5;0ZZ+~ZXy&{Nq1K?2Vz}LG6_4^RX^H1O#fx81?Way947Bw@$C6% zl&WWF?}gAtWu6IUy!B?#Hlt#x??)IC3T*!i2$opnQAViyoK&kbfU?_}%Q^>+pOcsGF^@AG1a;qp41 zt?aqZc%S5Os1Es^!SUo8Dc49l`Hx&d+YCGA`?^1=;21EPXr9{4XKVrJTCp(pxvelJ z`bje7R90Yk{A-b(-j$s}HSK$<6=USZ!(y9qT3|roJCI)9N1L@aj!r`2f2N>MKk!}H zYrZa;T-ZbDPZF{0oDe8EU_aV+c{^ujiUqj}h@j;mskV@ts<6k*HCj4DLGp}<%Vo`Y zQ^bNu!!URCV&JjWAIq~!z=J|YPVO`6`fh?E2n_0qVOOU2ZX^JVmXiU|Mk#`JxCIkO z9oH0&CwVO=_TL`#`vV;?i@T-2T25g|*4?jvtkVL&{O zP}Y6oJE->3cLmTF!CHhPB<)aaP)B3 zd|El{Hx$opd83Z+d=0UJ?*YnIa5sjF%pdqYWM7$iQ4U$2)>n_{E5!xUX~ld<*yHLHhu{VGwoiFmfI?d&DT>#VuW~yq^`zzx9f}gB)4ylZx?L!*+5*zVbJC0 z&u}Zbk`5`9t-U{YL>DjL5le{$AGqEJPcl5FpuOr@+Ysgr@odFKX5$VPQVdX4b z1B}(`J;nqWt>;W%TKoiUg)Ml#?D{1-PSFU@>smuPf!8Bt=3!m(deZu=$J|=yOkU!- zPLQ8hUnT-cit>Xq?;uXx|AN-^?zWL3f}HADqtZL|=n}Qfx0TtsW^CB6Th&Kohw&Jf z%!iyM@bNX3g%eP+N4IcrO1MA5cV+kazO3LGh|!6-nCn1}NC%N=RQ5e+m!v@*ecwl_ z;3c{Ps%TZ>4EsKg1q&;^JZ zHr7`~y}ta#Ttx~aNdwo+QRk-R_IhUj_?}QN(B#P*jx+CTkIMpvf4lmOJ6D$3&OK!4QUvPa0DDxU!CIPfo}aJ%>SA zeja;j(j!|I6`$d(uF^A*WKFSuQMp_qNTIGiZ%5;bnEjg0h=HxNz~8!yH)kdXRe8dh za&1O^6Bz4$r$&vHSv&GSAyv^_VAM|PeYt1gO|BS{LsgE5ZOgVMYJxAtd|w(bgd7ob zaQM0@9q&>CKu?tkY)NVke&|~3(BX1LOPavTIit>?^m`yyz-Dl!oG=8f)hWR~HpNm~)gdb({Ch^(8R%D|#Tta=oOe($$ljr`s^6ESl1m_B#y(f9WpnM#f{D z+G`iEqj(R*<;_WyaRUi=-7fjd3QBn&jTR^*AU^xToX>V1NxBgdm3P899h8*LJOQxw>hLH$l$s@VUS~5N<@*fk6BbpS$ zqZ*P#Dm($@nKc^!QL3L|KduQo_C4AtX91&)wR_wpnASu|2n~QV+!0`OFfJzHe2|%3 zybt@5O-wYU#8JCt8^vff~as{ zXdULQFm6CUH8&$z81TA7ea3xK4!v|uc=ymkW;z4B1Ne*_c^CxwkF>VnkBCB@`9}yS zIY=bmZ`>#8U>&??vWvmucoMkBI?2frUE;Jw{gJ4DYX7ATe=oz1-xSxa=Of!@-of3L zvk947?I-l>Em$+RLxd(sM9BxXmgzb;lmE)6M;<|6Uw66B$lDAo0mrkrGq^q4f6Y?eR&;@+;XE$Hy$wP3=Hq-9BkXnJ@SWRyu6rcE1US3ryh?8m_c)X*F_Do zENHor`ddayw1vqeJUt{v6Z?z|hHz!v!9+C!2Y%V)rPAc=d1U@Pt*pE1hwXnk(nyR@ z30i01Cj~KN@{3%*gh3E(8-^I!d~DsQ;F?56qu>f24XeEAAwbT$tZ9a0+V*H+f>Bu2$%Uz5i66 zmu_g-?eStrSPT{A0La8ccDmy}nTUlT4iB_^2CR{RhJ|r?(9EgF_3`fdEiJON*^<8c zJ*GXA^2BQ5{qCqXX>sF~*UsVr;9jDebLN5fh!`3(628u21$`{|$<6whao6|Fabk+q zHDTjgU~35_W$wGw{*$B=Q(#>KI%Bp9fkgTJVgb-+VtA}@~*OWgGVy-WySu&1o27XrpeY?AN43cVWxN3H6LFSwl7yjRdfzdm!9CnvN z5V6v~dsm{ruPzdlkzI=&WfpX&>yLqu$$S=vej3#nQa$^q$h@+RDnwK?pe%@JTW6*Ow^GsF~@BP8M2c?7_pcy?P+dC)&{%9D4t)#&;~By$FSQj`QfQ1LibQDvwd3XfwD z=0vU~Rx>l64rcGjb!&OqI7^Xcb+OMZ#Z4by#(+-FDCs%w;>B?(2KT+Th0(J1ti)*K znN8Ev*kXAxvxGdG2_0ktP?M%e zYyoX73Ebjp(&3d&@&(4miiZOA-+6)TZ@!{Bit#9ICiXrFoSv=$7J0q;TOoW9M@IAr zh%S#4SxEQ)419fSf$8Mh0?-}xe3G~{C7lt;VE|@j8Sp}5$s(IGW-Lq8{y}c?oOs_} zG9hwYr!njBzhO75drxsC>a6@(I68~~@uRi}OGd;jyzdb3&6N%yCHhQmvYWK zTegL1l}V{GaH7{ZPP`oFdw1(aDOav`)E;2w=Z5S3IVBY!gz@kkdo6oEz{%B!%LE3p zoOoZ}V%m*Fir9E2ijQLyY*k5?AK^+`6G5{*I_Erj&*L1bH-gK0a{JRkVZvx zw5=AR+FrD(uZl`>MZZFB^q>K^0P3jYp8NZ_+gsYDLX*cYRLj;V(6q3!*{~gX^;G}W ze`9}6OO;i;@J>Q$Z`79n9v=!j3a;<0y};~A7Ejo8t&@khlzSYsy1<)krQ;7Df0-G# zzXW)VOGLzduhe?|i@p;d07_6>1$KP2@B!Odb!0d$E&QqRy|ghOc#EHk&oq*aRe3fh zF-t4oykyRBlXCAKo7WtbBgTW#Q+$L97);EUwx;l2(xa|R7teN2)xqaD?>%HBnFcz0 zqCzNYc!622?^bxpwhkL0sWDhdoH;lf#S+e`VN%zTj5UYka@B@e6iz)hYOu8PI6Gd> zEvSu4&GGDzT>hvkV*0}t&|S~TKvw)*f@VCjV>BDmccI1lMqMW@dSmw^!>74Kp-NmK zNfhbuozE8m>x(TXImmS(1%ry9pfqOOmv~#E_T4??a1a;P2)k)Ov_40Uo*<Fn9Bdc{3u3$28`Ley2()b7xa6MJ0geoqYoI6{;uxiWT|J}=VshXeGvq0l}eyU z`*Rp-_v$DxN6mlK2`_enn0Qg|;=UZ*a>#X>IG3^+G;>&I*!0`kp0osGf|ggh3Gyh} zA|JT%F6_&}g?MuZYDO_-##sO+FxizU?4u5WB^o(PB+5oTZBN2+gf4!}z}L%{mfR-s zBRN>BfXS|?1EPqN&vppd+MGuBcWcfI{lAFkRyASdLs1d8CKC# zQY@w7p9qaaVElp-$4Ty57QQt>B2cO+X^}wJ4#UtZ@yM$9Rys4 zi2L`vZTp^g57aaO>}*TO7zJ)XZgnXjA74RLX>Zqlpi;>LP&Kg4xce(Zu*50BaVm|i zZ+K1Bf-br2bvLr;>p2kVh30|DvdGC+lE7^S?k|BH>;>o;3BBbkJ7e}rSo2JS*=vel zT%-))F0jb9G-7Gg-B64qsK5^Uv{B9bv@~UWbW~(`Qo!v2rT*r*O z%@w{A?Ym-tgC7h768K&AW^iBWDa7Rc~$ws-^{gh8mg$ zPKg*g8^GU;`x1N^u~Q?tBX8uS+;T+qO*`bpz4Db2Ei=${=81|)dY4NY{P%zR#(g=y zI_ZSiz%7^OQ6j9h$5pHT$-U$%5J#A)O)1&v<{5Pz9%hV7H&CKEL(598>pXS+}6EuYqAZgEFd(>Qb1cn(F= zhrUnT%$GTjYp-Nx=%bOaRb;k$vH|=>Wy8+QvMd0bN;h1k?qPd|3>x$1R5R)fO7BLG zd!-0_=8Z3r=-aHK9S0*q3i}Ft;so5kJxZ~hh}KFPI%O8xHYa7bds(2@33&Hs z8|)FfB)Y}eY0Rjve2A(YYn|f-jmks?5{RP8n6D5eAUGv5h^1z@NQ(k_+8(*6wta+O zuux&}d6ReAOcA=pTJY^fY|HS1Y=*{7do}`IVS2OUecYGw91>&7g8OuB5o%21lt;vw z&1EDQ%F`Bf7|pcqm#ut`mh)ZLkMEmO7|&6!X++5>atQ}&%@OIbs1@sQ%JN%jpBP7& zthHIVx9wy5Qmc%;`oXz$ix`xnKXyS2JjI0((BrqWM$pqA#;v=y0>d5eqP}cjh3$xz zmx1^h-HI0SyGal28)yQko#q%Ij+K6GqSz!;pbUD-BQvWS4J;OO)E8gkr}jKsQW#~)=ps^mHJvsG9&AsX;VtNOtJ)U##PDAdUtzcWT z-5E$9rs`U|c5e&aqo+UlB)09t-bQ4LF6ID zUQxcN!^tD`$a=?X&6#Int0x?*#prax)|iOmBfhWdW%^QWA*788bw$PM2m{K!-!sJX zWa@+a6xLykv<}+wy&N1m_TJtFxZV{2Xp%rgizTQXY=}Mmgd-c%Yz@v!+b1H4_ogS> zO}u!S<#~HGOl>N6y_wvI-m6hc@CrNU&NXVSj-(}eJ5*{SfD}EcGr80}0j7#6_$XUW zvL4K8f+m8t-P8JBqvuMWD%_(Zs^NK1s>B(&<3-MxZ-%iOU_q>$EHBRpa8bV1bU%Zq zIc-0!RIbvOj2om*jhX2?Svrm8Bffoi^Kx6l3 z0CpCHbH0^EPUVW&U<*ineRV(D{;7%V!Gtsfn(OKNphx+L%!if;X*pvxjdeEb1W#86 zX-kgv?5zH&iSR0pP$4 z3-Ef1(9i%m0FrWY=J)e5h_A=KWL0S&Y!6@M>7KOyF?_GEO-#P%ZLHa@cw8~QgHy}S z8tA@j%+PzXs|y`fTZk6w8}%im!_dG>r+$pi&>jk>R>qm#s^oPE0G_PRA)(UexZ_x# zAzy0mh;;U)RTPaQ6C?SqlNKL4B8m68-NCrs6FCy8h3{xUST+0mpf9x-96O>B>|N6S z)UglBQr6I~h*JW?Aj~*T1f{)of3Qc3=EDs7F?(D1U|Y~;$woO0LJsRej987|m;D+# z?FqQJRX>s^7D+8Z}`YQ3)bz$JqKypTLy;b&Svbc;?j2C5Os;P~v~)FP!m z2kUsLy-Q@&bf&{a&f(0QIMO5bYUFgvc)S5z-RWQC5BCfKd&;6~Mt!-xOQ<&Nxfa6c ziONrcV5IIv64t$veLraB3Mq$RnLOd)fwfpf$pZGty?u_ z)R!Bh1I-+bM+;YLKTl#j-1NqD5qjf)=NcrSp1r2Cg28fswd+F+Y2&5FNG&iyGZa6w zk@ivjOH9!jHG+Dq zOQi5%NDW4^2y0j@v#t`waWi zVsNIY7h~Jsj}po9O*>d8(7l}%*g)&u>{3;FSXcBN^f}Cpj~Vvm#l&o3kMVXZNlM_l z1)D{ya6~0EHu2Ivb!fIU;h$(Uo4ma1`to9q7z;4T3Sy=gl)T4uJI>}&KtqtA3${^W z?@xMoQh#D?(cYzf$)YE=qbxMEoDyL-0*$C=xXlNGzw4233gxS;{$liN0(VSll6L$s zdr5b*8h}6>SH1KeC&rW6&xpt<;Y;*_19k4YN~IMD60Qes^a*@^%orI4Y-d~qqa23} zKSC>UJ)PBIH+v#ct3PECHp3MNnR_|Ds4p>w|Jp%)Y>gCHl;eU8jF`t!&d?$A*7bcx zqgN(N1JO|SK7MA@mllJY$u*9l@>a*R{!*#4Xi!IPaw8=MPD>L#Qqw5!Ym$ildY|

xgx8ckZs$jfA*_JGLvy0kIC0p-jHP8( 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 ZL$kD>O!c4{zL`g88nAc*6!O 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 From 3b8ed675b380ebf8c7c26ec637def94b020160c8 Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 27 May 2026 17:44:36 +0200 Subject: [PATCH 12/47] Refactor --- src/compile/caches.rs | 6 ------ src/compile/compiled_problem.rs | 5 +---- src/compile/mod.rs | 6 ------ 3 files changed, 1 insertion(+), 16 deletions(-) delete mode 100644 src/compile/caches.rs diff --git a/src/compile/caches.rs b/src/compile/caches.rs deleted file mode 100644 index 1ceeb2961..000000000 --- a/src/compile/caches.rs +++ /dev/null @@ -1,6 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] -pub struct ExecutionCaches { - pub prediction_cache_enabled: bool, -} diff --git a/src/compile/compiled_problem.rs b/src/compile/compiled_problem.rs index 288b32f45..3c570efb8 100644 --- a/src/compile/compiled_problem.rs +++ b/src/compile/compiled_problem.rs @@ -2,7 +2,7 @@ use pharmsol::equation::Equation; use crate::algorithms::Algorithm; use crate::api::{ErrorModels, RuntimeOptions}; -use crate::compile::{DesignContext, ExecutionCaches, ObservationIndex}; +use crate::compile::{DesignContext, ObservationIndex}; use crate::model::ModelDefinition; use pharmsol::Data; @@ -15,7 +15,6 @@ pub struct CompiledProblem { runtime: RuntimeOptions, pub design: DesignContext, pub observation_index: ObservationIndex, - pub caches: ExecutionCaches, } impl CompiledProblem { @@ -28,7 +27,6 @@ impl CompiledProblem { runtime: RuntimeOptions, design: DesignContext, observation_index: ObservationIndex, - caches: ExecutionCaches, ) -> Self { Self { model, @@ -38,7 +36,6 @@ impl CompiledProblem { runtime, design, observation_index, - caches, } } diff --git a/src/compile/mod.rs b/src/compile/mod.rs index d0d3009e1..37bf8bbed 100644 --- a/src/compile/mod.rs +++ b/src/compile/mod.rs @@ -4,13 +4,11 @@ use pharmsol::{Data, Equation, Event}; use crate::api::EstimationProblem; use crate::model::{CovariateSpec, EquationMetadataSource, ParameterSpace}; -mod caches; mod compiled_problem; mod design_context; mod observation_index; mod validation; -pub use caches::ExecutionCaches; pub use compiled_problem::CompiledProblem; pub use design_context::{ DesignContext, OccasionCovariateRow, OccasionDesign, StructuredCovariateDesign, @@ -36,9 +34,6 @@ pub fn compile_problem( &problem.data, ); let observation_index = build_observation_index(&problem.data)?; - let caches = ExecutionCaches { - prediction_cache_enabled: problem.runtime.cache, - }; Ok(CompiledProblem::new( problem.model, @@ -48,7 +43,6 @@ pub fn compile_problem( problem.runtime, design, observation_index, - caches, )) } From 4d391f4dc00a51f23ddf5e9013f8d4c06081a330 Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 27 May 2026 21:48:06 +0200 Subject: [PATCH 13/47] WIP Refactor --- src/algorithms/mod.rs | 90 +-------- src/algorithms/nonparametric/npag.rs | 94 ++-------- src/algorithms/nonparametric/npmap.rs | 32 +--- src/algorithms/nonparametric/npod.rs | 56 ++---- src/api/estimation_problem.rs | 106 +---------- src/api/fit.rs | 110 ----------- src/api/mod.rs | 5 +- src/bestdose/posterior.rs | 2 +- src/compile/compiled_problem.rs | 57 ------ src/compile/design_context.rs | 59 ------ src/compile/mod.rs | 244 ------------------------- src/compile/observation_index.rs | 25 --- src/compile/validation.rs | 30 --- src/estimation/nonparametric/engine.rs | 78 -------- src/estimation/nonparametric/mod.rs | 3 +- src/estimation/nonparametric/result.rs | 4 +- src/lib.rs | 13 +- src/model/parameter_space.rs | 2 +- 18 files changed, 66 insertions(+), 944 deletions(-) delete mode 100644 src/api/fit.rs delete mode 100644 src/compile/compiled_problem.rs delete mode 100644 src/compile/design_context.rs delete mode 100644 src/compile/mod.rs delete mode 100644 src/compile/observation_index.rs delete mode 100644 src/compile/validation.rs delete mode 100644 src/estimation/nonparametric/engine.rs diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index 98f33dd82..e1ce99b85 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -2,9 +2,9 @@ use std::fs; use std::path::Path; use std::time::Instant; -use crate::api::RuntimeOptions; -use crate::estimation::nonparametric::{NonParametricResult, Prior, Psi, Theta}; -use crate::model::{ModelDefinition, ParameterSpace}; +use crate::api::EstimationProblem; +use crate::estimation::nonparametric::{NonParametricResult, Psi, Theta}; + use anyhow::Context; use anyhow::Result; use ndarray::parallel::prelude::{IntoParallelIterator, ParallelIterator}; @@ -14,7 +14,7 @@ use nonparametric::npmap::NPMAP; use nonparametric::npod::NPOD; use nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; use pharmsol::prelude::{data::Data, simulator::Equation}; -use pharmsol::AssayErrorModels; + use pharmsol::{Predictions, Subject}; use serde::{Deserialize, Serialize}; @@ -22,87 +22,13 @@ use serde::{Deserialize, Serialize}; pub mod nonparametric; pub mod parametric; -#[derive(Debug, Clone)] -pub(crate) struct NonparametricAlgorithmInput { - pub algorithm: Algorithm, - pub equation: E, - pub data: Data, - pub parameter_space: ParameterSpace, - pub error_models: AssayErrorModels, - pub runtime: RuntimeOptions, -} - -#[derive(Debug, Clone)] -pub(crate) struct NativeNonparametricConfig { - pub parameter_space: ParameterSpace, - pub ranges: Vec<(f64, f64)>, - pub prior: Prior, - pub max_cycles: usize, - pub progress: bool, -} - -impl NonparametricAlgorithmInput { - pub(crate) fn new( - algorithm: Algorithm, - model: ModelDefinition, - data: Data, - error_models: AssayErrorModels, - runtime: RuntimeOptions, - ) -> Self { - let ModelDefinition { - equation, - parameters, - .. - } = model; - - Self { - algorithm, - equation, - data, - parameter_space: parameters, - error_models, - runtime, - } - } - - pub(crate) fn algorithm(&self) -> Algorithm { - self.algorithm - } - - pub(crate) fn error_models(&self) -> &pharmsol::prelude::data::AssayErrorModels { - &self.error_models - } - - pub(crate) fn max_cycles(&self) -> usize { - self.runtime.cycles - } - - pub(crate) fn progress_enabled(&self) -> bool { - self.runtime.progress - } - - pub(crate) fn prior(&self) -> Prior { - self.runtime.prior.clone().unwrap_or_default() - } - - pub(crate) fn native_config(&self) -> Result { - Ok(NativeNonparametricConfig { - ranges: self.parameter_space.finite_ranges()?, - parameter_space: self.parameter_space.clone(), - prior: self.prior(), - max_cycles: self.max_cycles(), - progress: self.progress_enabled(), - }) - } -} - /// Algorithm type enumeration /// /// Lists every estimation algorithm implemented in `PMcore` together with its /// configuration payload. Convert from a configuration struct via [`From`] /// (e.g. `Algorithm::from(Npag::new())`) or pass the configuration directly to /// [`EstimationProblemBuilder::method`](crate::api::EstimationProblemBuilder::method). -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub enum Algorithm { /// Non-Parametric Adaptive Grid NPAG(NpagConfig), @@ -435,7 +361,7 @@ pub trait NonParametricAlgorithm: Sync + Send + 's } pub(crate) fn dispatch_nonparametric_algorithm( - input: NonparametricAlgorithmInput, + input: EstimationProblem, ) -> Result>> { match input.algorithm { Algorithm::NPAG(_) => { @@ -454,7 +380,7 @@ pub(crate) fn dispatch_nonparametric_algorithm( } pub(crate) fn run_nonparametric_algorithm_with_progress( - input: NonparametricAlgorithmInput, + input: EstimationProblem, mut on_progress: F, ) -> Result> where @@ -490,7 +416,7 @@ where } pub(crate) fn run_nonparametric_algorithm( - input: NonparametricAlgorithmInput, + input: EstimationProblem, ) -> Result> { let mut algorithm = dispatch_nonparametric_algorithm(input)?; algorithm.fit() diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index cf3d1fae2..aed26fd9b 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,7 +1,4 @@ -use crate::algorithms::{ - Algorithm, NativeNonparametricConfig, NonParametricAlgorithm, NonparametricAlgorithmInput, - Status, StopReason, -}; +use crate::algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}; use crate::estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }; @@ -38,6 +35,8 @@ pub struct NpagConfig { pub min_error_step: f64, pub error_step_growth: f64, pub error_step_shrink: f64, + pub max_cycles: usize, + pub progress: bool, } impl Default for NpagConfig { @@ -54,6 +53,8 @@ impl Default for NpagConfig { min_error_step: 0.01, error_step_growth: 4.0, error_step_shrink: 0.5, + max_cycles: 1000, + progress: true, } } } @@ -138,62 +139,7 @@ pub struct NPAG { status: Status, cycle_log: CycleLog, data: Data, - config: NativeNonparametricConfig, - settings: NpagConfig, -} - -impl NPAG { - pub(crate) fn from_config( - equation: E, - data: Data, - error_models: AssayErrorModels, - config: NativeNonparametricConfig, - settings: NpagConfig, - ) -> Box { - let ranges = config.ranges.clone(); - let gamma_delta = vec![settings.error_step; error_models.len()]; - - Box::new(Self { - equation, - ranges, - psi: Psi::new(), - theta: Theta::new(), - lambda: Weights::default(), - w: Weights::default(), - eps: settings.eps, - last_objf: -1e30, - objf: f64::NEG_INFINITY, - f0: -1e30, - f1: f64::default(), - cycle: 0, - gamma_delta, - error_models, - status: Status::Continue, - cycle_log: CycleLog::new(), - data, - config, - settings, - }) - } - - pub(crate) fn from_input(input: NonparametricAlgorithmInput) -> Result> { - let method = match input.algorithm { - crate::algorithms::Algorithm::NPAG(method) => method, - _ => unreachable!("NPAG::from_input requires an NPAG algorithm"), - }; - let config = input.native_config()?; - let error_models = input.error_models().clone(); - let equation = input.equation; - let data = input.data; - - Ok(Self::from_config( - equation, - data, - error_models, - config, - method, - )) - } + config: NpagConfig, } impl NonParametricAlgorithm for NPAG { @@ -224,7 +170,7 @@ impl NonParametricAlgorithm for NPAG { } fn get_prior(&self) -> Theta { - sample_space_for_parameters(&self.config.parameter_space, &self.config.prior).unwrap() + !unimplemented!("get_prior method is not implemented yet") } fn likelihood(&self) -> f64 { @@ -280,21 +226,21 @@ impl NonParametricAlgorithm for NPAG { let psi = self.psi.matrix(); let w = &self.w; - if (self.last_objf - self.objf).abs() <= self.settings.objective_tolerance - && self.eps > self.settings.min_eps + if (self.last_objf - self.objf).abs() <= self.config.objective_tolerance + && self.eps > self.config.min_eps { self.eps /= 2.; - if self.eps <= self.settings.min_eps { + if self.eps <= self.config.min_eps { let pyl = psi * w.weights(); self.f1 = pyl.iter().map(|x| x.ln()).sum(); - if (self.f1 - self.f0).abs() <= self.settings.pyl_tolerance { + if (self.f1 - self.f0).abs() <= self.config.pyl_tolerance { tracing::info!("The model converged after {} cycles", self.cycle,); self.set_status(Status::Stop(StopReason::Converged)); self.log_cycle_state(); return Ok(self.status().clone()); } else { self.f0 = self.f1; - self.eps = self.settings.eps; + self.eps = self.config.eps; } } } @@ -353,7 +299,7 @@ impl NonParametricAlgorithm for NPAG { let mut keep = Vec::::new(); for (index, lam) in self.lambda.iter().enumerate() { - if lam > max_lambda * self.settings.prune_threshold { + if lam > max_lambda * self.config.prune_threshold { keep.push(index); } } @@ -378,7 +324,7 @@ impl NonParametricAlgorithm for NPAG { let test = r.col(i).norm_l2(); let r_diag_val = r.get(i, i); let ratio = r_diag_val / test; - if ratio.abs() >= self.settings.qr_tolerance { + if ratio.abs() >= self.config.qr_tolerance { keep.push(*perm.get(i).unwrap()); } } @@ -463,20 +409,20 @@ impl NonParametricAlgorithm for NPAG { if objf_up > self.objf { self.error_models.set_factor(outeq, gamma_up)?; self.objf = objf_up; - self.gamma_delta[outeq] *= self.settings.error_step_growth; + self.gamma_delta[outeq] *= self.config.error_step_growth; self.lambda = lambda_up; self.psi = psi_up; } if objf_down > self.objf { self.error_models.set_factor(outeq, gamma_down)?; self.objf = objf_down; - self.gamma_delta[outeq] *= self.settings.error_step_growth; + self.gamma_delta[outeq] *= self.config.error_step_growth; self.lambda = lambda_down; self.psi = psi_down; } - self.gamma_delta[outeq] *= self.settings.error_step_shrink; - if self.gamma_delta[outeq] <= self.settings.min_error_step { - self.gamma_delta[outeq] = self.settings.error_step; + self.gamma_delta[outeq] *= self.config.error_step_shrink; + if self.gamma_delta[outeq] <= self.config.min_error_step { + self.gamma_delta[outeq] = self.config.error_step; } Ok(()) })?; @@ -489,7 +435,7 @@ impl NonParametricAlgorithm for NPAG { &mut self.theta, self.eps, &self.ranges, - self.settings.grid_tolerance, + self.config.grid_tolerance, )?; Ok(()) } diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index d46fe2421..42ca66622 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -1,8 +1,5 @@ use crate::{ - algorithms::{ - NativeNonparametricConfig, NonParametricAlgorithm, NonparametricAlgorithmInput, Status, - StopReason, - }, + algorithms::{NonParametricAlgorithm, Status, StopReason}, estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }, @@ -41,7 +38,7 @@ pub struct NPMAP { cycle: usize, status: Status, data: Data, - config: NativeNonparametricConfig, + config: NpmapConfig, cyclelog: CycleLog, error_models: AssayErrorModels, } @@ -74,7 +71,7 @@ impl NonParametricAlgorithm for NPMAP { } fn get_prior(&self) -> Theta { - sample_space_for_parameters(&self.config.parameter_space, &self.config.prior).unwrap() + unimplemented!("get_prior method is not implemented yet") } fn likelihood(&self) -> f64 { @@ -151,26 +148,3 @@ impl NonParametricAlgorithm for NPMAP { self.cyclelog.push(state); } } - -impl NPMAP { - pub(crate) fn from_input(input: NonparametricAlgorithmInput) -> Result> { - let config = input.native_config()?; - let error_models = input.error_models().clone(); - let equation = input.equation; - let data = input.data; - - Ok(Box::new(Self { - equation, - psi: Psi::new(), - theta: Theta::new(), - w: Weights::default(), - objf: f64::INFINITY, - cycle: 0, - status: Status::Continue, - data, - config, - cyclelog: CycleLog::new(), - error_models, - })) - } -} diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 347a4b221..82be52b5d 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -1,7 +1,4 @@ -use crate::algorithms::nonparametric::npod; -use crate::algorithms::{ - NativeNonparametricConfig, NonParametricAlgorithm, NonparametricAlgorithmInput, StopReason, -}; +use crate::algorithms::{NonParametricAlgorithm, StopReason}; use crate::estimation::nonparametric::ipm::burke; use crate::estimation::nonparametric::qr; use crate::estimation::nonparametric::{ @@ -26,12 +23,23 @@ const THETA_F: f64 = 1e-2; const THETA_D: f64 = 1e-4; /// Configuration options for the Non-Parametric Optimal Design (NPOD) algorithm. -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] -pub struct NpodConfig; +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +pub struct NpodConfig { + /// Maximum number of cycles to run the algorithm for. + max_cycles: usize, + /// Prior distribution for sampling new support points. + prior: Theta, + /// Whether to print progress information during the first cycle. + progress: bool, +} impl NpodConfig { pub fn new() -> Self { - Self + Self { + max_cycles: 100, + prior: Theta::new(), + progress: false, + } } } @@ -50,7 +58,7 @@ pub struct NPOD { status: Status, cycle_log: CycleLog, data: Data, - config: NativeNonparametricConfig, + config: NpodConfig, } impl NonParametricAlgorithm for NPOD { @@ -82,11 +90,7 @@ impl NonParametricAlgorithm for NPOD { } fn get_prior(&self) -> Theta { - crate::estimation::nonparametric::sample_space_for_parameters( - &self.config.parameter_space, - &self.config.prior, - ) - .unwrap() + self.config.prior.clone() } fn increment_cycle(&mut self) -> usize { @@ -363,32 +367,6 @@ impl NonParametricAlgorithm for NPOD { } impl NPOD { - pub(crate) fn from_input(input: NonparametricAlgorithmInput) -> Result> { - let config = input.native_config()?; - let error_models = input.error_models().clone(); - let gamma_delta = vec![0.1; error_models.len()]; - let equation = input.equation; - let data = input.data; - - Ok(Box::new(Self { - equation, - psi: Psi::new(), - theta: Theta::new(), - lambda: Weights::default(), - w: Weights::default(), - last_objf: -1e30, - objf: f64::NEG_INFINITY, - cycle: 0, - gamma_delta, - error_models, - converged: false, - status: Status::Continue, - cycle_log: CycleLog::new(), - data, - config, - })) - } - fn validate_psi(&mut self) -> Result<()> { let mut psi = self.psi().matrix().to_owned(); // First coerce all NaN and infinite in psi to 0.0 diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index c9796ca64..ad159f623 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -5,35 +5,12 @@ use serde::{Deserialize, Serialize}; use crate::algorithms::Algorithm; use crate::api::error_models::ErrorModels; -use crate::estimation::nonparametric::Prior; +use crate::estimation::nonparametric::{Prior, Theta}; use crate::model::{ CovariateSpec, EquationMetadataSource, ModelDefinition, ModelDefinitionBuilder, ModelMetadata, Parameter, VariabilityModel, }; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(default)] -pub struct RuntimeOptions { - pub cycles: usize, - pub cache: bool, - pub progress: bool, - pub idelta: f64, - pub tad: f64, - pub prior: Option, -} - -impl Default for RuntimeOptions { - fn default() -> Self { - Self { - cycles: 100, - cache: true, - progress: true, - idelta: 0.12, - tad: 0.0, - prior: None, - } - } -} +use crate::results::FitResult; #[derive(Debug, Clone)] pub struct EstimationProblem { @@ -41,7 +18,6 @@ pub struct EstimationProblem { pub(crate) data: Data, pub(crate) error_models: ErrorModels, pub(crate) algorithm: Algorithm, - pub(crate) runtime: RuntimeOptions, } impl EstimationProblem { @@ -49,28 +25,26 @@ impl EstimationProblem { EstimationProblemBuilder { model: ModelDefinition::builder(equation), data, - runtime: Some(RuntimeOptions::default()), } } } impl EstimationProblem { - pub fn fit(self) -> Result> { - crate::api::fit(self) + pub fn fit(self) -> Result> { + !unimplemented!("fit method is not implemented yet") } pub fn fit_with_progress(self, on_progress: F) -> Result> where F: FnMut(crate::api::FitProgress), { - crate::api::fit_with_progress(self, on_progress) + !unimplemented!("fit method is not implemented yet") } } pub struct EstimationProblemBuilder { model: ModelDefinitionBuilder, data: Data, - runtime: Option, } impl EstimationProblemBuilder { @@ -83,30 +57,6 @@ impl EstimationProblemBuilder { ) -> NonparametricEstimationProblemBuilder { NonparametricEstimationProblemBuilder::new(self, algorithm.into()) } - - pub fn cycles(self, cycles: usize) -> Self { - self.with_runtime_options(|runtime| runtime.cycles = cycles) - } - - pub fn cache(self, enabled: bool) -> Self { - self.with_runtime_options(|runtime| runtime.cache = enabled) - } - - pub fn progress(self, enabled: bool) -> Self { - self.with_runtime_options(|runtime| runtime.progress = enabled) - } - - pub fn idelta(self, value: f64) -> Self { - self.with_runtime_options(|runtime| runtime.idelta = value) - } - - pub fn tad(self, value: f64) -> Self { - self.with_runtime_options(|runtime| runtime.tad = value) - } - - pub fn prior(self, prior: Prior) -> Self { - self.with_runtime_options(|runtime| runtime.prior = Some(prior)) - } } impl EstimationProblemBuilder { @@ -130,18 +80,11 @@ impl EstimationProblemBuilder { self, map: impl FnOnce(ModelDefinitionBuilder) -> Result>, ) -> Result { - let EstimationProblemBuilder { - model, - data, - - runtime, - } = self; + let EstimationProblemBuilder { model, data } = self; Ok(Self { model: map(model)?, data, - - runtime, }) } @@ -149,29 +92,15 @@ impl EstimationProblemBuilder { self, map: impl FnOnce(ModelDefinitionBuilder) -> ModelDefinitionBuilder, ) -> Self { - let EstimationProblemBuilder { - model, - data, - - runtime, - } = self; + let EstimationProblemBuilder { model, data } = self; Self { model: map(model), data, - - runtime, } } } -impl EstimationProblemBuilder { - fn with_runtime_options(mut self, map: impl FnOnce(&mut RuntimeOptions)) -> Self { - map(self.runtime.get_or_insert_with(RuntimeOptions::default)); - self - } -} - pub struct NonparametricEstimationProblemBuilder { builder: EstimationProblemBuilder, algorithm: Algorithm, @@ -187,26 +116,6 @@ impl NonparametricEstimationProblemBuilder { } } - pub fn cache(self, enabled: bool) -> Self { - self.with_builder(|builder| builder.cache(enabled)) - } - - pub fn progress(self, enabled: bool) -> Self { - self.with_builder(|builder| builder.progress(enabled)) - } - - pub fn idelta(self, value: f64) -> Self { - self.with_builder(|builder| builder.idelta(value)) - } - - pub fn tad(self, value: f64) -> Self { - self.with_builder(|builder| builder.tad(value)) - } - - pub fn prior(self, prior: Prior) -> Self { - self.with_builder(|builder| builder.prior(prior)) - } - fn with_builder( self, map: impl FnOnce(EstimationProblemBuilder) -> EstimationProblemBuilder, @@ -268,7 +177,6 @@ impl NonparametricEstimationProblemBuilder data: self.builder.data, error_models: ErrorModels::Nonparametric(error_models), algorithm: self.algorithm, - runtime: self.builder.runtime.unwrap_or_default(), }) } diff --git a/src/api/fit.rs b/src/api/fit.rs deleted file mode 100644 index b783e9e8a..000000000 --- a/src/api/fit.rs +++ /dev/null @@ -1,110 +0,0 @@ -use anyhow::Result; -use pharmsol::equation::Equation; - -use crate::algorithms::Algorithm; -use crate::api::estimation_problem::EstimationProblem; -use crate::api::progress::FitProgress; -use crate::estimation::nonparametric; -use crate::model::EquationMetadataSource; -use crate::results::FitResult; - -pub fn fit( - problem: EstimationProblem, -) -> Result> { - let compiled = problem.compile()?; - let result = nonparametric::fit(compiled)?; - - Ok(result) -} - -pub fn fit_with_progress( - problem: EstimationProblem, - mut on_progress: F, -) -> Result> -where - E: Equation + Clone + Send + 'static + EquationMetadataSource, - F: FnMut(FitProgress), -{ - let compiled = problem.compile()?; - let result = nonparametric::fit_with_progress(compiled, |event| { - on_progress(FitProgress::NonparametricCycle(event)); - })?; - - Ok(result) -} - -#[cfg(test)] -mod tests { - use anyhow::Result; - use pharmsol::{AssayErrorModel, ErrorPoly, Subject}; - - use super::{fit_with_progress, FitProgress}; - use crate::algorithms::Status; - use crate::api::EstimationProblem; - use crate::prelude::*; - - fn equation() -> equation::ODE { - equation::ODE::new( - |x, p, _t, dx, b, _rateiv, _cov| { - fetch_params!(p, ke); - dx[0] = -ke * x[0] + b[0]; - }, - |_p, _t, _cov| lag! {}, - |_p, _t, _cov| fa! {}, - |_p, _t, _cov, _x| {}, - |x, p, _t, _cov, y| { - fetch_params!(p, v); - y[0] = x[0] / v; - }, - ) - .with_nstates(1) - .with_ndrugs(1) - .with_nout(1) - .with_metadata( - equation::metadata::new("fit_progress") - .parameters(["ke", "v"]) - .states(["central"]) - .outputs(["0"]) - .route(equation::Route::bolus("0").to_state("central")), - ) - .expect("metadata attachment should validate") - } - - #[test] - fn fit_with_progress_reports_nonparametric_cycles() -> Result<()> { - let data = pharmsol::Data::new(vec![Subject::builder("1") - .bolus(0.0, 100.0, 0) - .observation(1.0, 10.0, 0) - .observation(2.0, 7.0, 0) - .build()]); - - let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); - - let problem = EstimationProblem::builder(equation(), data) - .parameter(Parameter::bounded("ke", 0.05, 1.0))? - .parameter(Parameter::bounded("v", 5.0, 50.0))? - .algorithm(Algorithm::NPAG(NpagConfig::default())) - .error("0", assay_error)? - .progress(false) - .prior(Prior::sobol(8, 7)) - .build()?; - - let mut progress_events = Vec::new(); - let result = fit_with_progress(problem, |event| progress_events.push(event))?; - - let workspace = result - .as_nonparametric() - .expect("expected nonparametric fit result"); - - assert!(!progress_events.is_empty()); - assert_eq!(progress_events.len(), workspace.cycle_log().cycles().len()); - assert_eq!(progress_events.len(), workspace.cycles()); - - let last_event = progress_events.last().cloned().expect("missing last event"); - let FitProgress::NonparametricCycle(last_cycle) = last_event; - assert!(matches!(last_cycle.status, Status::Stop(_))); - assert_eq!(last_cycle.cycle, workspace.cycles()); - - Ok(()) - } -} diff --git a/src/api/mod.rs b/src/api/mod.rs index 02306962a..72a3a73ad 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -1,6 +1,6 @@ pub mod error_models; pub mod estimation_problem; -pub mod fit; + pub mod model_definition; pub mod progress; @@ -8,8 +8,7 @@ pub use crate::algorithms::nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; pub use error_models::ErrorModels; pub use estimation_problem::{ EstimationProblem, EstimationProblemBuilder, NonparametricEstimationProblemBuilder, - RuntimeOptions, }; -pub use fit::{fit, fit_with_progress}; + pub use model_definition::{ModelDefinition, ModelDefinitionBuilder}; pub use progress::{FitProgress, NonparametricCycleProgress}; diff --git a/src/bestdose/posterior.rs b/src/bestdose/posterior.rs index aa207b9a7..9d87d96a0 100644 --- a/src/bestdose/posterior.rs +++ b/src/bestdose/posterior.rs @@ -57,7 +57,6 @@ use crate::algorithms::nonparametric::npag::burke; use crate::algorithms::nonparametric::npag::NPAG; use crate::algorithms::NonParametricAlgorithm; -use crate::algorithms::NativeNonparametricConfig; use crate::algorithms::Status; use crate::bestdose::types::BestDoseConfig; use crate::estimation::nonparametric::{calculate_psi, Prior, Theta, Weights}; @@ -175,6 +174,7 @@ pub fn npagfull_refinement( eq: &ODE, config: &BestDoseConfig, ) -> Result<(Theta, Weights)> { + !unimplemented!("NPAG refinement logic is not implemented yet"); if config.refinement_cycles() == 0 { tracing::info!("Stage 1.2: NPAGFULL refinement skipped (max_cycles=0)"); return Ok((filtered_theta.clone(), filtered_weights.clone())); diff --git a/src/compile/compiled_problem.rs b/src/compile/compiled_problem.rs deleted file mode 100644 index 3c570efb8..000000000 --- a/src/compile/compiled_problem.rs +++ /dev/null @@ -1,57 +0,0 @@ -use pharmsol::equation::Equation; - -use crate::algorithms::Algorithm; -use crate::api::{ErrorModels, RuntimeOptions}; -use crate::compile::{DesignContext, ObservationIndex}; -use crate::model::ModelDefinition; -use pharmsol::Data; - -#[derive(Debug, Clone)] -pub struct CompiledProblem { - pub model: ModelDefinition, - pub data: Data, - error_models: ErrorModels, - algorithm: Algorithm, - runtime: RuntimeOptions, - pub design: DesignContext, - pub observation_index: ObservationIndex, -} - -impl CompiledProblem { - #[allow(clippy::too_many_arguments)] - pub(crate) fn new( - model: ModelDefinition, - data: Data, - error_models: ErrorModels, - algorithm: Algorithm, - runtime: RuntimeOptions, - design: DesignContext, - observation_index: ObservationIndex, - ) -> Self { - Self { - model, - data, - error_models, - algorithm, - runtime, - design, - observation_index, - } - } - - pub fn algorithm(&self) -> Algorithm { - self.algorithm - } - - pub fn error_models(&self) -> &ErrorModels { - &self.error_models - } - - pub fn runtime_options(&self) -> &RuntimeOptions { - &self.runtime - } - - pub fn into_parts(self) -> (ModelDefinition, Data) { - (self.model, self.data) - } -} diff --git a/src/compile/design_context.rs b/src/compile/design_context.rs deleted file mode 100644 index 9927e1b7f..000000000 --- a/src/compile/design_context.rs +++ /dev/null @@ -1,59 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct DesignContext { - pub parameter_names: Vec, - pub subjects: Vec, - pub occasions: Vec, - pub structured_covariates: StructuredCovariateDesign, -} - -impl DesignContext { - pub fn subject_count(&self) -> usize { - self.subjects.len() - } - - pub fn occasion_count(&self) -> usize { - self.occasions.len() - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct SubjectDesign { - pub subject_index: usize, - pub id: String, - pub occasion_count: usize, - pub observation_count: usize, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct OccasionDesign { - pub subject_index: usize, - pub occasion_index: usize, - pub event_count: usize, - pub observation_count: usize, -} - -#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)] -pub struct StructuredCovariateDesign { - pub subject_columns: Vec, - pub subject_rows: Vec, - pub occasion_columns: Vec, - pub occasion_rows: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct SubjectCovariateRow { - pub subject_index: usize, - pub id: String, - pub anchor_time: f64, - pub values: Vec>, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct OccasionCovariateRow { - pub subject_index: usize, - pub occasion_index: usize, - pub anchor_time: f64, - pub values: Vec>, -} diff --git a/src/compile/mod.rs b/src/compile/mod.rs deleted file mode 100644 index 37bf8bbed..000000000 --- a/src/compile/mod.rs +++ /dev/null @@ -1,244 +0,0 @@ -use anyhow::Result; -use pharmsol::{Data, Equation, Event}; - -use crate::api::EstimationProblem; -use crate::model::{CovariateSpec, EquationMetadataSource, ParameterSpace}; - -mod compiled_problem; -mod design_context; -mod observation_index; -mod validation; - -pub use compiled_problem::CompiledProblem; -pub use design_context::{ - DesignContext, OccasionCovariateRow, OccasionDesign, StructuredCovariateDesign, - SubjectCovariateRow, SubjectDesign, -}; -pub use observation_index::{ObservationIndex, ObservationRecord}; -pub use validation::validate_problem; - -impl EstimationProblem { - pub fn compile(self) -> Result> { - compile_problem(self) - } -} - -pub fn compile_problem( - problem: EstimationProblem, -) -> Result> { - validate_problem(&problem)?; - - let design = build_design_context( - &problem.model.parameters, - &problem.model.covariates, - &problem.data, - ); - let observation_index = build_observation_index(&problem.data)?; - - Ok(CompiledProblem::new( - problem.model, - problem.data, - problem.error_models, - problem.algorithm, - problem.runtime, - design, - observation_index, - )) -} - -fn build_design_context( - parameter_space: &ParameterSpace, - covariates: &CovariateSpec, - data: &Data, -) -> DesignContext { - let subjects = data.subjects(); - - let subject_design = subjects - .iter() - .enumerate() - .map(|(subject_index, subject)| { - let occasions = subject.occasions(); - let observation_count = occasions - .iter() - .map(|occasion| { - occasion - .events() - .iter() - .filter(|event| matches!(event, Event::Observation(_))) - .count() - }) - .sum(); - - SubjectDesign { - subject_index, - id: subject.id().clone(), - occasion_count: occasions.len(), - observation_count, - } - }) - .collect::>(); - - let occasion_design = subjects - .iter() - .enumerate() - .flat_map(|(subject_index, subject)| { - subject.occasions().iter().map(move |occasion| { - let events = occasion.events(); - let observation_count = events - .iter() - .filter(|event| matches!(event, Event::Observation(_))) - .count(); - - OccasionDesign { - subject_index, - occasion_index: occasion.index(), - event_count: events.len(), - observation_count, - } - }) - }) - .collect::>(); - - let structured_covariates = match covariates { - CovariateSpec::InEquation => StructuredCovariateDesign::default(), - CovariateSpec::Structured(spec) => build_structured_covariate_design( - &spec.subject_columns(), - &spec.occasion_columns(), - data, - ), - }; - - DesignContext { - parameter_names: parameter_space - .iter() - .map(|item| item.name.clone()) - .collect(), - subjects: subject_design, - occasions: occasion_design, - structured_covariates, - } -} - -fn build_structured_covariate_design( - subject_columns: &[String], - occasion_columns: &[String], - data: &Data, -) -> StructuredCovariateDesign { - let subject_rows = data - .subjects() - .iter() - .enumerate() - .map(|(subject_index, subject)| { - let anchor_time = subject_anchor_time(subject); - let values = subject_columns - .iter() - .map(|name| subject_covariate_value(subject, name)) - .collect(); - - SubjectCovariateRow { - subject_index, - id: subject.id().clone(), - anchor_time, - values, - } - }) - .collect(); - - let occasion_rows = data - .subjects() - .iter() - .enumerate() - .flat_map(|(subject_index, subject)| { - subject.occasions().iter().map(move |occasion| { - let anchor_time = occasion_anchor_time(occasion); - let values = occasion_columns - .iter() - .map(|name| { - occasion - .covariates() - .get_covariate(name) - .and_then(|covariate| covariate.interpolate(anchor_time).ok()) - }) - .collect(); - - OccasionCovariateRow { - subject_index, - occasion_index: occasion.index(), - anchor_time, - values, - } - }) - }) - .collect(); - - StructuredCovariateDesign { - subject_columns: subject_columns.to_vec(), - subject_rows, - occasion_columns: occasion_columns.to_vec(), - occasion_rows, - } -} - -fn subject_anchor_time(subject: &pharmsol::Subject) -> f64 { - subject - .occasions() - .iter() - .find_map(|occasion| occasion.events().first().map(|event| event.time())) - .unwrap_or(0.0) -} - -fn subject_covariate_value(subject: &pharmsol::Subject, name: &str) -> Option { - subject.occasions().iter().find_map(|occasion| { - let anchor_time = occasion_anchor_time(occasion); - occasion - .covariates() - .get_covariate(name) - .and_then(|covariate| covariate.interpolate(anchor_time).ok()) - }) -} - -fn occasion_anchor_time(occasion: &pharmsol::Occasion) -> f64 { - occasion - .events() - .first() - .map(|event| event.time()) - .unwrap_or(0.0) -} - -fn build_observation_index(data: &Data) -> Result { - let records = - data.subjects() - .iter() - .enumerate() - .flat_map(|(subject_index, subject)| { - subject.occasions().iter().flat_map(move |occasion| { - occasion - .events() - .iter() - .enumerate() - .filter_map(move |(event_index, event)| match event { - Event::Observation(observation) => Some( - observation - .outeq_index() - .map(|outeq| ObservationRecord { - subject_index, - occasion_index: occasion.index(), - event_index, - outeq, - time: observation.time(), - }) - .ok_or_else(|| { - anyhow::anyhow!( - "Compilation requires numeric observation output labels; got `{}`", - observation.outeq() - ) - }), - ), - _ => None, - }) - }) - }) - .collect::>>()?; - - Ok(ObservationIndex { records }) -} diff --git a/src/compile/observation_index.rs b/src/compile/observation_index.rs deleted file mode 100644 index 7cd989de9..000000000 --- a/src/compile/observation_index.rs +++ /dev/null @@ -1,25 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)] -pub struct ObservationIndex { - pub records: Vec, -} - -impl ObservationIndex { - pub fn len(&self) -> usize { - self.records.len() - } - - pub fn is_empty(&self) -> bool { - self.records.is_empty() - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct ObservationRecord { - pub subject_index: usize, - pub occasion_index: usize, - pub event_index: usize, - pub outeq: usize, - pub time: f64, -} diff --git a/src/compile/validation.rs b/src/compile/validation.rs deleted file mode 100644 index 8d145d238..000000000 --- a/src/compile/validation.rs +++ /dev/null @@ -1,30 +0,0 @@ -use anyhow::{bail, Result}; -use pharmsol::equation::Equation; - -use crate::api::EstimationProblem; -use crate::model::EquationMetadataSource; - -pub fn validate_problem( - problem: &EstimationProblem, -) -> Result<()> { - if problem.model.parameters.is_empty() { - bail!("estimation problem requires at least one parameter"); - } - - if problem.runtime.cycles == 0 { - bail!("runtime cycles must be greater than zero"); - } - - if problem.model.output_count() == 0 { - bail!("at least one equation output is required"); - } - - let error_models = problem.error_models.models(); - if error_models.iter().next().is_none() { - bail!("at least one nonparametric error model is required"); - } - - problem.model.parameters.finite_ranges()?; - - Ok(()) -} diff --git a/src/estimation/nonparametric/engine.rs b/src/estimation/nonparametric/engine.rs deleted file mode 100644 index 4b89f195b..000000000 --- a/src/estimation/nonparametric/engine.rs +++ /dev/null @@ -1,78 +0,0 @@ -use anyhow::Result; -use pharmsol::Equation; - -use crate::algorithms::{ - run_nonparametric_algorithm, run_nonparametric_algorithm_with_progress, - NonparametricAlgorithmInput, -}; -use crate::api::NonparametricCycleProgress; -use crate::compile::CompiledProblem; -use crate::estimation::nonparametric::result::NonParametricResult; -use crate::results::FitResult; - -#[derive(Debug, Default, Clone, Copy)] -pub struct NonparametricEngine; - -impl NonparametricEngine { - pub fn fit( - problem: CompiledProblem, - ) -> Result> { - let input = input_from_compiled_problem(problem)?; - run_nonparametric_algorithm(input) - } - - pub fn fit_with_progress( - problem: CompiledProblem, - mut on_progress: F, - ) -> Result> - where - E: Equation + Clone + Send + 'static, - F: FnMut(NonparametricCycleProgress), - { - let input = input_from_compiled_problem(problem)?; - run_nonparametric_algorithm_with_progress( - input, - |cycle, objective, objective_delta, elapsed_ms, status| { - on_progress(NonparametricCycleProgress { - cycle, - objective, - objective_delta, - elapsed_ms, - status, - }); - }, - ) - } -} - -fn input_from_compiled_problem( - problem: CompiledProblem, -) -> Result> { - let algorithm = problem.algorithm(); - let error_models = problem.error_models().models().clone(); - let runtime = problem.runtime_options().clone(); - let (model, data) = problem.into_parts(); - Ok(NonparametricAlgorithmInput::new( - algorithm, - model, - data, - error_models, - runtime, - )) -} - -pub fn fit( - problem: CompiledProblem, -) -> Result> { - let workspace = NonparametricEngine::fit(problem)?; - Ok(workspace.into_fit_result()) -} - -pub fn fit_with_progress(problem: CompiledProblem, on_progress: F) -> Result> -where - E: Equation + Clone + Send + 'static, - F: FnMut(NonparametricCycleProgress), -{ - let workspace = NonparametricEngine::fit_with_progress(problem, on_progress)?; - Ok(workspace.into_fit_result()) -} diff --git a/src/estimation/nonparametric/mod.rs b/src/estimation/nonparametric/mod.rs index 87e38427e..3746437dd 100644 --- a/src/estimation/nonparametric/mod.rs +++ b/src/estimation/nonparametric/mod.rs @@ -1,5 +1,5 @@ mod cycles; -mod engine; + mod expansion; pub(crate) mod ipm; mod posterior; @@ -14,7 +14,6 @@ mod theta; mod weights; pub use cycles::{CycleLog, NPCycle}; -pub use engine::{fit, fit_with_progress, NonparametricEngine}; pub(crate) use expansion::adaptative_grid; pub use ipm::burke; pub use posterior::{posterior, Posterior}; diff --git a/src/estimation/nonparametric/result.rs b/src/estimation/nonparametric/result.rs index d5adc280f..bf7954632 100644 --- a/src/estimation/nonparametric/result.rs +++ b/src/estimation/nonparametric/result.rs @@ -85,8 +85,8 @@ impl NonParametricResult { &self.cyclelog } - pub(crate) fn algorithm(&self) -> crate::algorithms::Algorithm { - self.algorithm + pub(crate) fn algorithm(&self) -> &Algorithm { + &self.algorithm } pub fn predictions(&self) -> Option<&NPPredictions> { diff --git a/src/lib.rs b/src/lib.rs index 4b400a4d0..b91ca9faf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,9 +31,6 @@ pub mod algorithms; /// New public modeling and execution API. pub mod api; -/// Shared preprocessing and compilation layer. -pub mod compile; - /// Estimation family boundaries for the new architecture. pub mod estimation; @@ -61,16 +58,14 @@ pub mod prelude { pub use super::Result; pub use crate::algorithms; pub use crate::algorithms::Algorithm; - pub use crate::api::fit; - pub use crate::api::fit_with_progress; + pub use crate::api::{ ErrorModels, EstimationProblem, FitProgress, ModelDefinition, NonparametricCycleProgress, - NpagConfig, NpmapConfig, NpodConfig, RuntimeOptions, + NpagConfig, NpmapConfig, NpodConfig, }; - pub use crate::compile::{CompiledProblem, DesignContext, ObservationIndex}; + pub use crate::estimation::nonparametric::{ - CycleLog, NPCycle, NPPredictions, NonParametricResult, NonparametricEngine, Posterior, Psi, - Theta, Weights, + CycleLog, NPCycle, NPPredictions, NonParametricResult, Posterior, Psi, Theta, Weights, }; pub use crate::model::{ CovariateEffectsSpec, CovariateModel, CovariateSpec, EquationMetadataSource, ModelMetadata, diff --git a/src/model/parameter_space.rs b/src/model/parameter_space.rs index 1efeb676b..4bf846433 100644 --- a/src/model/parameter_space.rs +++ b/src/model/parameter_space.rs @@ -116,7 +116,7 @@ impl Parameter { } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] pub enum ParameterDomain { Positive { lower: Option, From e62e426fdc66b25f487a00e25082e6ababf48516 Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 27 May 2026 22:06:35 +0200 Subject: [PATCH 14/47] WIP --- src/algorithms/nonparametric/npag.rs | 3 +-- src/bestdose/posterior.rs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index aed26fd9b..20c36367f 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -15,8 +15,6 @@ use pharmsol::prelude::{ use pharmsol::prelude::AssayErrorModel; -use crate::estimation::nonparametric::sample_space_for_parameters; - use crate::estimation::nonparametric::adaptative_grid; use serde::{Deserialize, Serialize}; @@ -146,6 +144,7 @@ impl NonParametricAlgorithm for NPAG { fn equation(&self) -> &E { &self.equation } + fn into_workspace(&self) -> Result> { NonParametricResult::new( self.equation.clone(), diff --git a/src/bestdose/posterior.rs b/src/bestdose/posterior.rs index 9d87d96a0..d665f6a79 100644 --- a/src/bestdose/posterior.rs +++ b/src/bestdose/posterior.rs @@ -174,7 +174,6 @@ pub fn npagfull_refinement( eq: &ODE, config: &BestDoseConfig, ) -> Result<(Theta, Weights)> { - !unimplemented!("NPAG refinement logic is not implemented yet"); if config.refinement_cycles() == 0 { tracing::info!("Stage 1.2: NPAGFULL refinement skipped (max_cycles=0)"); return Ok((filtered_theta.clone(), filtered_weights.clone())); @@ -202,6 +201,7 @@ pub fn npagfull_refinement( let single_point_theta = Theta::from_parts(single_point_matrix, parameter_space.clone())?; // Create and run NPAG + let mut npag = NPAG::from_config( eq.clone(), past_data.clone(), From 37d9ccbaac3716db123285627aecc8b0ff98a831 Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 27 May 2026 22:21:30 +0200 Subject: [PATCH 15/47] Refactor --- benches/bimodal_ke.rs | 6 -- examples/bimodal_ke_backend_compare.rs | 2 - examples/drusano/main.rs | 1 - examples/iov/main.rs | 1 - examples/neely/main.rs | 1 - examples/new_iov/main.rs | 1 - examples/vanco_sde/main.rs | 1 - src/algorithms/nonparametric/npag.rs | 63 ++++++++++- src/algorithms/nonparametric/npmap.rs | 29 ++++- src/algorithms/nonparametric/npod.rs | 31 ++++++ src/api/estimation_problem.rs | 8 +- src/bestdose/posterior.rs | 19 ++-- tests/acceptance_baseline_tests.rs | 1 - tests/api_smoke_tests.rs | 1 - tests/compile_layer_tests.rs | 140 ------------------------- tests/nonparametric_engine_tests.rs | 62 ----------- tests/onecomp.rs | 3 - tests/results_summary_tests.rs | 1 - 18 files changed, 132 insertions(+), 239 deletions(-) delete mode 100644 tests/compile_layer_tests.rs delete mode 100644 tests/nonparametric_engine_tests.rs diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index 9004aeb1f..58acc14bc 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -37,8 +37,6 @@ fn setup_npag() -> Result> { .parameter(Parameter::bounded("v", 25.0, 250.0))? .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("outeq_1", create_error_model())? - .progress(false) - .prior(Prior::sobol(2048, 22)) .build() } @@ -49,8 +47,6 @@ fn setup_npod() -> Result> { .parameter(Parameter::bounded("v", 25.0, 250.0))? .algorithm(Algorithm::NPOD(NpodConfig::default())) .error("outeq_1", create_error_model())? - .progress(false) - .prior(Prior::sobol(2048, 22)) .build() } @@ -61,8 +57,6 @@ fn setup_postprob() -> Result> { .parameter(Parameter::bounded("v", 25.0, 250.0))? .algorithm(Algorithm::NPMAP(NpmapConfig::default())) .error("outeq_1", create_error_model())? - .progress(false) - .prior(Prior::sobol(2048, 22)) .build() } diff --git a/examples/bimodal_ke_backend_compare.rs b/examples/bimodal_ke_backend_compare.rs index 7fa5dc33e..169dab644 100644 --- a/examples/bimodal_ke_backend_compare.rs +++ b/examples/bimodal_ke_backend_compare.rs @@ -210,8 +210,6 @@ fn run_case Result<()> { "outeq_4", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), )? - .prior(Prior::sobol(212900, 347)) .fit()?; Ok(()) } diff --git a/examples/iov/main.rs b/examples/iov/main.rs index 892d197d6..e78abe237 100644 --- a/examples/iov/main.rs +++ b/examples/iov/main.rs @@ -34,7 +34,6 @@ fn main() -> Result<()> { "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), )? - .prior(Prior::sobol(100, 347)) .fit() .unwrap(); diff --git a/examples/neely/main.rs b/examples/neely/main.rs index cfc950bee..5b322a5e2 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -84,7 +84,6 @@ fn main() { AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) .unwrap() - .prior(Prior::sobol(2028, 22)) .fit() .unwrap(); } diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index 74ad08dab..6cb82ce4a 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -37,7 +37,6 @@ fn main() { AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), ) .unwrap() - .prior(Prior::sobol(100, 347)) .fit() .unwrap(); } diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index d9e4f26f2..161720e85 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -67,7 +67,6 @@ fn main() { AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), ) .unwrap() - .prior(Prior::sobol(100, 347)) .fit() .unwrap(); } diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 20c36367f..6b0f095de 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,7 +1,9 @@ use crate::algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}; +use crate::api::EstimationProblem; use crate::estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }; +use crate::model::ParameterSpace; pub(crate) use crate::estimation::nonparametric::ipm::burke; pub(crate) use crate::estimation::nonparametric::qr; @@ -140,6 +142,65 @@ pub struct NPAG { config: NpagConfig, } +impl NPAG { + /// Construct an `NPAG` instance from explicit parts. + /// + /// The `parameter_space` is used solely to derive the finite bounds for the + /// adaptive grid. Initial support points can be supplied separately via + /// [`NonParametricAlgorithm::set_theta`]. + pub(crate) fn from_parts( + equation: E, + data: Data, + error_models: AssayErrorModels, + parameter_space: &ParameterSpace, + config: NpagConfig, + ) -> Result> { + let ranges = parameter_space.finite_ranges()?; + let gamma_delta = vec![config.error_step; error_models.len()]; + let eps = config.eps; + + Ok(Box::new(Self { + equation, + ranges, + psi: Psi::new(), + theta: Theta::new(), + lambda: Weights::default(), + w: Weights::default(), + eps, + last_objf: -1e30, + objf: f64::NEG_INFINITY, + f0: -1e30, + f1: f64::default(), + cycle: 0, + gamma_delta, + error_models, + status: Status::Continue, + cycle_log: CycleLog::new(), + data, + config, + })) + } + + pub(crate) fn from_input(input: EstimationProblem) -> Result> { + let config = match input.algorithm.clone() { + Algorithm::NPAG(config) => config, + other => unreachable!( + "NPAG::from_input requires an NPAG algorithm, got {}", + other.name() + ), + }; + let error_models = input.error_models.models().clone(); + let parameter_space = input.model.parameters.clone(); + Self::from_parts( + input.model.equation, + input.data, + error_models, + ¶meter_space, + config, + ) + } +} + impl NonParametricAlgorithm for NPAG { fn equation(&self) -> &E { &self.equation @@ -169,7 +230,7 @@ impl NonParametricAlgorithm for NPAG { } fn get_prior(&self) -> Theta { - !unimplemented!("get_prior method is not implemented yet") + unimplemented!("get_prior method is not implemented yet") } fn likelihood(&self) -> f64 { diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index 42ca66622..21289ea72 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -1,5 +1,6 @@ use crate::{ algorithms::{NonParametricAlgorithm, Status, StopReason}, + api::EstimationProblem, estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }, @@ -13,7 +14,6 @@ use pharmsol::prelude::{ }; use crate::estimation::nonparametric::ipm::burke; -use crate::estimation::nonparametric::sample_space_for_parameters; use serde::{Deserialize, Serialize}; @@ -148,3 +148,30 @@ impl NonParametricAlgorithm for NPMAP { self.cyclelog.push(state); } } + +impl NPMAP { + pub(crate) fn from_input(input: EstimationProblem) -> Result> { + let config = match input.algorithm.clone() { + Algorithm::NPMAP(config) => config, + other => unreachable!( + "NPMAP::from_input requires an NPMAP algorithm, got {}", + other.name() + ), + }; + let error_models = input.error_models.models().clone(); + + Ok(Box::new(Self { + equation: input.model.equation, + psi: Psi::new(), + theta: Theta::new(), + w: Weights::default(), + objf: f64::INFINITY, + cycle: 0, + status: Status::Continue, + data: input.data, + config, + cyclelog: CycleLog::new(), + error_models, + })) + } +} diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 82be52b5d..53e085e2f 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -1,4 +1,5 @@ use crate::algorithms::{NonParametricAlgorithm, StopReason}; +use crate::api::EstimationProblem; use crate::estimation::nonparametric::ipm::burke; use crate::estimation::nonparametric::qr; use crate::estimation::nonparametric::{ @@ -367,6 +368,36 @@ impl NonParametricAlgorithm for NPOD { } impl NPOD { + pub(crate) fn from_input(input: EstimationProblem) -> Result> { + let config = match input.algorithm.clone() { + Algorithm::NPOD(config) => config, + other => unreachable!( + "NPOD::from_input requires an NPOD algorithm, got {}", + other.name() + ), + }; + let error_models = input.error_models.models().clone(); + let gamma_delta = vec![0.1; error_models.len()]; + + Ok(Box::new(Self { + equation: input.model.equation, + psi: Psi::new(), + theta: Theta::new(), + lambda: Weights::default(), + w: Weights::default(), + last_objf: -1e30, + objf: f64::NEG_INFINITY, + cycle: 0, + gamma_delta, + error_models, + converged: false, + status: Status::Continue, + cycle_log: CycleLog::new(), + data: input.data, + config, + })) + } + fn validate_psi(&mut self) -> Result<()> { let mut psi = self.psi().matrix().to_owned(); // First coerce all NaN and infinite in psi to 0.0 diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index ad159f623..c4f805c56 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -1,11 +1,9 @@ use anyhow::Result; use pharmsol::{AssayErrorModel, AssayErrorModels, Data, Equation}; -use serde::{Deserialize, Serialize}; use crate::algorithms::Algorithm; use crate::api::error_models::ErrorModels; -use crate::estimation::nonparametric::{Prior, Theta}; use crate::model::{ CovariateSpec, EquationMetadataSource, ModelDefinition, ModelDefinitionBuilder, ModelMetadata, Parameter, VariabilityModel, @@ -31,14 +29,14 @@ impl EstimationProblem { impl EstimationProblem { pub fn fit(self) -> Result> { - !unimplemented!("fit method is not implemented yet") + unimplemented!("fit method is not implemented yet") } - pub fn fit_with_progress(self, on_progress: F) -> Result> + pub fn fit_with_progress(self, _on_progress: F) -> Result> where F: FnMut(crate::api::FitProgress), { - !unimplemented!("fit method is not implemented yet") + unimplemented!("fit method is not implemented yet") } } diff --git a/src/bestdose/posterior.rs b/src/bestdose/posterior.rs index d665f6a79..dde087e08 100644 --- a/src/bestdose/posterior.rs +++ b/src/bestdose/posterior.rs @@ -59,7 +59,7 @@ use crate::algorithms::NonParametricAlgorithm; use crate::algorithms::Status; use crate::bestdose::types::BestDoseConfig; -use crate::estimation::nonparametric::{calculate_psi, Prior, Theta, Weights}; +use crate::estimation::nonparametric::{calculate_psi, Theta, Weights}; use crate::prelude::*; use pharmsol::prelude::*; @@ -201,20 +201,17 @@ pub fn npagfull_refinement( let single_point_theta = Theta::from_parts(single_point_matrix, parameter_space.clone())?; // Create and run NPAG + let mut npag_config = crate::algorithms::nonparametric::NpagConfig::default(); + npag_config.max_cycles = config.refinement_cycles(); + npag_config.progress = config.progress(); - let mut npag = NPAG::from_config( + let mut npag = NPAG::from_parts( eq.clone(), past_data.clone(), config.error_models().clone(), - NativeNonparametricConfig { - ranges: parameter_space.finite_ranges()?, - parameter_space: parameter_space.clone(), - prior: Prior::Theta(single_point_theta.clone()), - max_cycles: config.refinement_cycles(), - progress: config.progress(), - }, - NpagConfig::default(), - ); + ¶meter_space, + npag_config, + )?; npag.set_theta(single_point_theta); // Run NPAG optimization diff --git a/tests/acceptance_baseline_tests.rs b/tests/acceptance_baseline_tests.rs index ab58c3809..86d3a513b 100644 --- a/tests/acceptance_baseline_tests.rs +++ b/tests/acceptance_baseline_tests.rs @@ -42,7 +42,6 @@ fn test_acceptance_baseline_npag_bimodal_ke() -> Result<()> { "1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), )? - .progress(false) .fit()?; let summary = result.summary(); let population = result.population_summary(); diff --git a/tests/api_smoke_tests.rs b/tests/api_smoke_tests.rs index a1f54d113..17908f898 100644 --- a/tests/api_smoke_tests.rs +++ b/tests/api_smoke_tests.rs @@ -106,7 +106,6 @@ fn test_unified_fit_nonparametric_smoke() -> Result<()> { .parameter(Parameter::bounded("v", 1.0, 20.0))? .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("0", assay_error)? - .progress(false) .fit()?; assert!(result.objf().is_finite()); diff --git a/tests/compile_layer_tests.rs b/tests/compile_layer_tests.rs deleted file mode 100644 index 7f721f731..000000000 --- a/tests/compile_layer_tests.rs +++ /dev/null @@ -1,140 +0,0 @@ -use anyhow::Result; -use pharmsol::{AssayErrorModel, ErrorPoly}; -use pmcore::prelude::*; - -fn simple_equation() -> equation::ODE { - equation::ODE::new( - |x, p, _t, dx, b, _rateiv, _cov| { - fetch_params!(p, ke); - dx[0] = -ke * x[0] + b[0]; - }, - |_p, _t, _cov| lag! {}, - |_p, _t, _cov| fa! {}, - |_p, _t, _cov, _x| {}, - |x, p, _t, _cov, y| { - fetch_params!(p, v); - y[0] = x[0] / v; - }, - ) - .with_nstates(1) - .with_ndrugs(1) - .with_nout(1) - .with_metadata( - equation::metadata::new("compile_layer") - .parameters(["ke", "v"]) - .states(["central"]) - .outputs(["0"]) - .route(equation::Route::bolus("0").to_state("central")), - ) - .expect("metadata attachment should validate") -} - -fn multi_subject_data() -> Data { - let first = Subject::builder("1") - .bolus(0.0, 100.0, 0) - .observation(1.0, 10.0, 0) - .observation(2.0, 8.0, 0) - .build(); - - let second = Subject::builder("2") - .bolus(0.0, 100.0, 0) - .observation(1.0, 9.0, 0) - .observation(3.0, 7.0, 0) - .build(); - - Data::new(vec![first, second]) -} - -fn structured_covariate_data() -> Data { - let subject = Subject::builder("1") - .covariate("wt", 0.0, 70.0) - .covariate("study_day", 0.0, 1.0) - .bolus(0.0, 100.0, 0) - .observation(1.0, 10.0, 0) - .reset() - .covariate("wt", 0.0, 72.0) - .covariate("study_day", 0.0, 2.0) - .bolus(0.0, 100.0, 0) - .observation(1.5, 8.0, 0) - .build(); - - Data::new(vec![subject]) -} - -fn simple_problem() -> Result> { - let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); - EstimationProblem::builder(simple_equation(), multi_subject_data()) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Algorithm::NPAG(NpagConfig::default())) - .error("0", assay_error)? - .build() -} - -#[test] -fn test_compile_problem_builds_indexes() -> Result<()> { - let compiled = simple_problem()?.compile()?; - - assert_eq!(compiled.design.subject_count(), 2); - assert_eq!(compiled.design.occasion_count(), 2); - assert_eq!(compiled.observation_index.len(), 4); - assert_eq!(compiled.design.parameter_names, vec!["ke", "v"]); - Ok(()) -} - -#[test] -fn test_compile_problem_builds_algorithm_settings() -> Result<()> { - let compiled = simple_problem()?.compile()?; - - assert_eq!(compiled.algorithm().name(), "NPAG"); - assert_eq!(compiled.design.parameter_names.len(), 2); - Ok(()) -} - -#[test] -fn test_compile_problem_extracts_structured_covariate_values() -> Result<()> { - let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); - let compiled = EstimationProblem::builder(simple_equation(), structured_covariate_data()) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? - .covariates(CovariateSpec::Structured(CovariateEffectsSpec { - subject_effects: Some(CovariateModel::new( - vec!["ke", "v"], - vec!["wt"], - vec![vec![true], vec![false]], - )?), - occasion_effects: Some(CovariateModel::new( - vec!["ke", "v"], - vec!["study_day"], - vec![vec![true], vec![false]], - )?), - })) - .algorithm(Algorithm::NPAG(NpagConfig::default())) - .error("0", assay_error)? - .build()? - .compile()?; - - assert_eq!( - compiled.design.structured_covariates.subject_columns, - vec!["wt"] - ); - assert_eq!( - compiled.design.structured_covariates.occasion_columns, - vec!["study_day"] - ); - assert_eq!(compiled.design.structured_covariates.subject_rows.len(), 1); - assert_eq!(compiled.design.structured_covariates.occasion_rows.len(), 2); - assert_eq!( - compiled.design.structured_covariates.subject_rows[0].values, - vec![Some(70.0)] - ); - assert_eq!( - compiled.design.structured_covariates.occasion_rows[0].values, - vec![Some(1.0)] - ); - assert_eq!( - compiled.design.structured_covariates.occasion_rows[1].values, - vec![Some(2.0)] - ); - Ok(()) -} diff --git a/tests/nonparametric_engine_tests.rs b/tests/nonparametric_engine_tests.rs deleted file mode 100644 index 95dbf9209..000000000 --- a/tests/nonparametric_engine_tests.rs +++ /dev/null @@ -1,62 +0,0 @@ -use anyhow::Result; -use pharmsol::{AssayErrorModel, ErrorPoly}; -use pmcore::prelude::*; - -fn simple_equation() -> equation::ODE { - equation::ODE::new( - |x, p, _t, dx, b, _rateiv, _cov| { - fetch_params!(p, ke); - dx[0] = -ke * x[0] + b[0]; - }, - |_p, _t, _cov| lag! {}, - |_p, _t, _cov| fa! {}, - |_p, _t, _cov, _x| {}, - |x, p, _t, _cov, y| { - fetch_params!(p, v); - y[0] = x[0] / v; - }, - ) - .with_nstates(1) - .with_ndrugs(1) - .with_nout(1) - .with_metadata( - equation::metadata::new("nonparametric_engine") - .parameters(["ke", "v"]) - .states(["central"]) - .outputs(["0"]) - .route(equation::Route::bolus("0").to_state("central")), - ) - .expect("metadata attachment should validate") -} - -fn simple_data() -> Data { - let subject = Subject::builder("1") - .bolus(0.0, 100.0, 0) - .observation(1.0, 10.0, 0) - .observation(2.0, 8.0, 0) - .build(); - - Data::new(vec![subject]) -} - -#[test] -fn test_nonparametric_engine_returns_workspace() -> Result<()> { - let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); - let compiled = EstimationProblem::builder(simple_equation(), simple_data()) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Algorithm::NPAG(NpagConfig::default())) - .error("0", assay_error)? - .progress(false) - .build()? - .compile()?; - - let workspace = NonparametricEngine::fit(compiled)?; - assert!(workspace.objf().is_finite()); - assert_eq!(workspace.get_theta().parameters().len(), 2); - - let fit_result = workspace.into_fit_result(); - assert_eq!(fit_result.population_summary().parameters.len(), 2); - assert_eq!(fit_result.individual_summaries().len(), 1); - Ok(()) -} diff --git a/tests/onecomp.rs b/tests/onecomp.rs index a1f9c6caf..5df097952 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -60,7 +60,6 @@ fn test_one_compartment_npag() -> Result<()> { "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), )? - .prior(Prior::sobol(64, 22)) .fit()?; let result = result .as_nonparametric() @@ -124,7 +123,6 @@ fn test_one_compartment_npod() -> Result<()> { "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), )? - .prior(Prior::sobol(64, 22)) .fit()?; let result = result .as_nonparametric() @@ -188,7 +186,6 @@ fn test_one_compartment_postprob() -> Result<()> { "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), )? - .prior(Prior::sobol(64, 22)) .fit()?; let result = result .as_nonparametric() diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index 4f08d72e1..cfeb5650b 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -47,7 +47,6 @@ fn test_nonparametric_fit_result_summary_surface() -> Result<()> { .parameter(Parameter::bounded("v", 1.0, 20.0))? .algorithm(Algorithm::NPAG(NpagConfig::default())) .error("0", assay_error)? - .progress(false) .fit()?; let summary = result.summary(); From 45ddb5c253bc443bdb923a578092801a4e5e0489 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Thu, 28 May 2026 14:07:38 +0200 Subject: [PATCH 16/47] Refactor --- examples/bimodal_ke/main.rs | 2 +- src/algorithms/nonparametric/npag.rs | 6 +- src/estimation/nonparametric/mod.rs | 2 +- .../nonparametric/{prior.rs => prior/mod.rs} | 156 ++++++------------ 4 files changed, 57 insertions(+), 109 deletions(-) rename src/estimation/nonparametric/{prior.rs => prior/mod.rs} (68%) diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 45630fcf2..d87a43d2e 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -24,7 +24,7 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/bimodal_ke/bimodal_ke.csv")?; let _result = EstimationProblem::builder(eq, data) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .algorithm(NpagConfig::default()) .parameter(Parameter::bounded("ke", 0.001, 3.0))? .parameter(Parameter::bounded("v", 25.0, 250.0))? .error( diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 6b0f095de..54642e2e6 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,7 +1,7 @@ use crate::algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}; use crate::api::EstimationProblem; use crate::estimation::nonparametric::{ - calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, + calculate_psi, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, }; use crate::model::ParameterSpace; @@ -22,7 +22,7 @@ use crate::estimation::nonparametric::adaptative_grid; use serde::{Deserialize, Serialize}; /// Configuration options for the Non-Parametric Adaptive Grid (NPAG) algorithm. -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct NpagConfig { pub eps: f64, pub min_eps: f64, @@ -37,6 +37,7 @@ pub struct NpagConfig { pub error_step_shrink: f64, pub max_cycles: usize, pub progress: bool, + pub prior: Prior, } impl Default for NpagConfig { @@ -55,6 +56,7 @@ impl Default for NpagConfig { error_step_shrink: 0.5, max_cycles: 1000, progress: true, + prior: Prior::Sobol(100, 22), } } } diff --git a/src/estimation/nonparametric/mod.rs b/src/estimation/nonparametric/mod.rs index 3746437dd..1296e60f6 100644 --- a/src/estimation/nonparametric/mod.rs +++ b/src/estimation/nonparametric/mod.rs @@ -4,6 +4,7 @@ mod expansion; pub(crate) mod ipm; mod posterior; mod predictions; + mod prior; mod psi; pub(crate) mod qr; @@ -18,7 +19,6 @@ pub(crate) use expansion::adaptative_grid; pub use ipm::burke; pub use posterior::{posterior, Posterior}; pub use predictions::{NPPredictionRow, NPPredictions}; -pub(crate) use prior::sample_space_for_parameters; pub use prior::{read_prior, Prior}; pub(crate) use psi::calculate_psi; pub use psi::Psi; diff --git a/src/estimation/nonparametric/prior.rs b/src/estimation/nonparametric/prior/mod.rs similarity index 68% rename from src/estimation/nonparametric/prior.rs rename to src/estimation/nonparametric/prior/mod.rs index 8e0488f2e..89216be35 100644 --- a/src/estimation/nonparametric/prior.rs +++ b/src/estimation/nonparametric/prior/mod.rs @@ -9,11 +9,10 @@ use serde::{Deserialize, Serialize}; pub mod latin; pub mod sobol; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, PartialEq)] pub enum Prior { Sobol(usize, usize), Latin(usize, usize), - File(String), Theta(Theta), } @@ -24,10 +23,9 @@ impl Serialize for Prior { { #[derive(Serialize)] #[serde(tag = "kind", rename_all = "snake_case")] - enum Ref<'a> { + enum Ref { Sobol { points: usize, seed: usize }, Latin { points: usize, seed: usize }, - File { path: &'a str }, } let wire = match self { Prior::Sobol(points, seed) => Ref::Sobol { @@ -38,7 +36,7 @@ impl Serialize for Prior { points: *points, seed: *seed, }, - Prior::File(path) => Ref::File { path }, + Prior::Theta(_) => { return Err(serde::ser::Error::custom( "Prior::Theta cannot be serialized", @@ -49,26 +47,6 @@ impl Serialize for Prior { } } -impl<'de> Deserialize<'de> for Prior { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - #[derive(Deserialize)] - #[serde(tag = "kind", rename_all = "snake_case")] - enum Wire { - Sobol { points: usize, seed: usize }, - Latin { points: usize, seed: usize }, - File { path: String }, - } - match Wire::deserialize(deserializer)? { - Wire::Sobol { points, seed } => Ok(Prior::Sobol(points, seed)), - Wire::Latin { points, seed } => Ok(Prior::Latin(points, seed)), - Wire::File { path } => Ok(Prior::File(path)), - } - } -} - impl Prior { pub fn sobol(points: usize, seed: usize) -> Prior { Prior::Sobol(points, seed) @@ -78,7 +56,6 @@ impl Prior { match self { Prior::Sobol(points, _) => Some(*points), Prior::Latin(points, _) => Some(*points), - Prior::File(_) => None, Prior::Theta(theta) => Some(theta.nspp()), } } @@ -87,10 +64,56 @@ impl Prior { match self { Prior::Sobol(_, seed) => Some(*seed), Prior::Latin(_, seed) => Some(*seed), - Prior::File(_) => None, Prior::Theta(_) => None, } } + + pub fn theta(&self, parameters: ParameterSpace) -> Result { + let parameter_space: ParameterSpace = parameters.into(); + + for parameter in parameter_space.iter() { + let (lower, upper) = match parameter.domain { + ParameterDomain::Bounded { lower, upper } => (lower, upper), + ParameterDomain::Positive { + lower: Some(lower), + upper: Some(upper), + } + | ParameterDomain::Unbounded { + lower: Some(lower), + upper: Some(upper), + } => (lower, upper), + _ => bail!( + "Parameter '{}' is missing finite bounds required for nonparametric initialization", + parameter.name + ), + }; + + if lower.is_infinite() || upper.is_infinite() { + bail!( + "Parameter '{}' has infinite bounds: [{}, {}]", + parameter.name, + lower, + upper + ); + } + + if lower >= upper { + bail!( + "Parameter '{}' has invalid bounds: [{}, {}]. Lower bound must be less than upper bound.", + parameter.name, + lower, + upper + ); + } + } + + let prior = match self { + Prior::Sobol(points, seed) => sobol::generate(¶meter_space, *points, *seed)?, + Prior::Latin(points, seed) => latin::generate(¶meter_space, *points, *seed)?, + Prior::Theta(theta) => return Ok(theta.clone()), + }; + Ok(prior) + } } impl Default for Prior { @@ -107,57 +130,6 @@ pub fn read_prior( parse_prior_for_parameters(&path, parameters) } -pub(crate) fn sample_space_for_parameters( - parameters: impl Into, - prior: &Prior, -) -> Result { - let parameter_space = parameters.into(); - - for parameter in parameter_space.iter() { - let (lower, upper) = match parameter.domain { - ParameterDomain::Bounded { lower, upper } => (lower, upper), - ParameterDomain::Positive { - lower: Some(lower), - upper: Some(upper), - } - | ParameterDomain::Unbounded { - lower: Some(lower), - upper: Some(upper), - } => (lower, upper), - _ => bail!( - "Parameter '{}' is missing finite bounds required for nonparametric initialization", - parameter.name - ), - }; - - if lower.is_infinite() || upper.is_infinite() { - bail!( - "Parameter '{}' has infinite bounds: [{}, {}]", - parameter.name, - lower, - upper - ); - } - - if lower >= upper { - bail!( - "Parameter '{}' has invalid bounds: [{}, {}]. Lower bound must be less than upper bound.", - parameter.name, - lower, - upper - ); - } - } - - let prior = match prior { - Prior::Sobol(points, seed) => sobol::generate(¶meter_space, *points, *seed)?, - Prior::Latin(points, seed) => latin::generate(¶meter_space, *points, *seed)?, - Prior::File(path) => parse_prior_for_parameters(path, ¶meter_space)?.0, - Prior::Theta(theta) => return Ok(theta.clone()), - }; - Ok(prior) -} - pub(crate) fn parse_prior_for_parameters( path: &String, parameters: impl Into, @@ -259,39 +231,13 @@ mod tests { format!("test_temp_prior_{}.csv", rand::random::()) } - #[test] - fn prior_metadata_accessors() { - let sobol = Prior::sobol(100, 42); - assert_eq!(sobol.points(), Some(100)); - assert_eq!(sobol.seed(), Some(42)); - - let latin = Prior::Latin(50, 7); - assert_eq!(latin.points(), Some(50)); - assert_eq!(latin.seed(), Some(7)); - - let file = Prior::File("prior.csv".to_string()); - assert_eq!(file.points(), None); - assert_eq!(file.seed(), None); - } - #[test] fn sample_space_generates_expected_shape() { - let theta = sample_space_for_parameters(parameter_space(), &Prior::sobol(10, 42)).unwrap(); + let theta = Prior::sobol(10, 42).theta(parameter_space()).unwrap(); assert_eq!(theta.nspp(), 10); assert_eq!(theta.matrix().ncols(), 2); } - #[test] - fn sample_space_returns_custom_theta_verbatim() { - let parameters = parameter_space(); - let matrix = Mat::from_fn(3, 2, |i, j| (i + j) as f64); - let custom = Theta::from_parts(matrix, parameters).unwrap(); - - let theta = - sample_space_for_parameters(parameter_space(), &Prior::Theta(custom.clone())).unwrap(); - assert_eq!(theta.matrix(), custom.matrix()); - } - #[test] fn read_prior_parses_weights_and_reorders_columns() { let path = temp_csv_path(); From 36187260ed3c5e5a0924eb7ac327ce936f76460b Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Thu, 28 May 2026 14:10:50 +0200 Subject: [PATCH 17/47] Doc --- src/estimation/nonparametric/prior/mod.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/estimation/nonparametric/prior/mod.rs b/src/estimation/nonparametric/prior/mod.rs index 89216be35..bb8448a67 100644 --- a/src/estimation/nonparametric/prior/mod.rs +++ b/src/estimation/nonparametric/prior/mod.rs @@ -11,8 +11,13 @@ pub mod sobol; #[derive(Debug, Clone, Deserialize, PartialEq)] pub enum Prior { + /// Generate support points using a Sobol sequence Sobol(usize, usize), + /// Generate support points using Latin Hypercube Sampling Latin(usize, usize), + /// Use a predefined set of support points provided as a [Theta] + /// + /// Note that the parameters of the [Theta] must match the parameters of the estimation problem Theta(Theta), } From e7aa971268c2d4932ad994ec9d877841cdfb96cd Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Thu, 28 May 2026 14:15:21 +0200 Subject: [PATCH 18/47] Remove dead code --- src/api/mod.rs | 2 - src/api/model_definition.rs | 1 - src/lib.rs | 4 +- tests/api_smoke_tests.rs | 116 ------------------------------------ 4 files changed, 2 insertions(+), 121 deletions(-) delete mode 100644 src/api/model_definition.rs delete mode 100644 tests/api_smoke_tests.rs diff --git a/src/api/mod.rs b/src/api/mod.rs index 72a3a73ad..78574cd34 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -1,7 +1,6 @@ pub mod error_models; pub mod estimation_problem; -pub mod model_definition; pub mod progress; pub use crate::algorithms::nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; @@ -10,5 +9,4 @@ pub use estimation_problem::{ EstimationProblem, EstimationProblemBuilder, NonparametricEstimationProblemBuilder, }; -pub use model_definition::{ModelDefinition, ModelDefinitionBuilder}; pub use progress::{FitProgress, NonparametricCycleProgress}; diff --git a/src/api/model_definition.rs b/src/api/model_definition.rs deleted file mode 100644 index f596d46c3..000000000 --- a/src/api/model_definition.rs +++ /dev/null @@ -1 +0,0 @@ -pub use crate::model::{ModelDefinition, ModelDefinitionBuilder}; diff --git a/src/lib.rs b/src/lib.rs index b91ca9faf..66a941450 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -60,8 +60,8 @@ pub mod prelude { pub use crate::algorithms::Algorithm; pub use crate::api::{ - ErrorModels, EstimationProblem, FitProgress, ModelDefinition, NonparametricCycleProgress, - NpagConfig, NpmapConfig, NpodConfig, + ErrorModels, EstimationProblem, FitProgress, NonparametricCycleProgress, NpagConfig, + NpmapConfig, NpodConfig, }; pub use crate::estimation::nonparametric::{ diff --git a/tests/api_smoke_tests.rs b/tests/api_smoke_tests.rs deleted file mode 100644 index 17908f898..000000000 --- a/tests/api_smoke_tests.rs +++ /dev/null @@ -1,116 +0,0 @@ -use anyhow::Result; -use pharmsol::{AssayErrorModel, ErrorPoly}; -use pmcore::prelude::*; - -fn simple_equation() -> equation::ODE { - equation::ODE::new( - |x, p, _t, dx, b, _rateiv, _cov| { - fetch_params!(p, ke); - dx[0] = -ke * x[0] + b[0]; - }, - |_p, _t, _cov| lag! {}, - |_p, _t, _cov| fa! {}, - |_p, _t, _cov, _x| {}, - |x, p, _t, _cov, y| { - fetch_params!(p, v); - y[0] = x[0] / v; - }, - ) - .with_nstates(1) - .with_ndrugs(1) - .with_nout(1) - .with_metadata( - equation::metadata::new("simple_equation") - .parameters(["ke", "v"]) - .states(["central"]) - .outputs(["0"]) - .route(equation::Route::bolus("0").to_state("central")), - ) - .expect("metadata attachment should validate") -} - -fn simple_data() -> Data { - let subject = Subject::builder("1") - .bolus(0.0, 100.0, 0) - .observation(1.0, 10.0, 0) - .observation(2.0, 8.0, 0) - .build(); - - Data::new(vec![subject]) -} - -fn metadata_equation() -> equation::ODE { - ode! { - name: "metadata_derived_outputs", - params: [ke, v], - states: [central], - outputs: [1], - routes: [ - infusion(1) -> central, - ], - diffeq: |x, _t, dx| { - dx[central] = -ke * x[central]; - }, - out: |x, _t, y| { - y[1] = x[central] / v; - }, - } -} - -#[test] -fn test_model_definition_builder() -> Result<()> { - let model = ModelDefinition::builder(simple_equation()) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? - .build()?; - - assert_eq!(model.parameters.len(), 2); - assert_eq!(model.parameter_count(), 2); - assert_eq!(model.parameter_name(0), Some("ke")); - assert_eq!(model.output_count(), 1); - assert_eq!(model.output_index("0"), Some(0)); - Ok(()) -} - -#[test] -fn test_model_definition_rejects_unknown_parameter_name() { - let err = ModelDefinition::builder(simple_equation()) - .parameter(Parameter::bounded("clearance", 0.1, 1.0)) - .err() - .expect("parameter name should be validated against equation metadata"); - - assert!(err - .to_string() - .contains("unknown equation parameter: clearance")); -} - -#[test] -fn test_model_definition_derives_observations_from_equation_metadata() -> Result<()> { - let model = ModelDefinition::builder(metadata_equation()) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? - .build()?; - - assert_eq!(model.output_count(), 1); - assert_eq!(model.output_name(0), Some("1")); - assert_eq!(model.output_index("1"), Some(0)); - - Ok(()) -} - -#[test] -fn test_unified_fit_nonparametric_smoke() -> Result<()> { - let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); - let result = EstimationProblem::builder(simple_equation(), simple_data()) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? - .algorithm(Algorithm::NPAG(NpagConfig::default())) - .error("0", assay_error)? - .fit()?; - - assert!(result.objf().is_finite()); - assert_eq!(result.summary().parameter_count, 2); - assert_eq!(result.population_summary().parameters.len(), 2); - assert_eq!(result.individual_summaries().len(), 1); - Ok(()) -} From fa43d9124b0f0acd69582a9facb8e32c09137af2 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Thu, 28 May 2026 14:37:05 +0200 Subject: [PATCH 19/47] Clean up the builder --- examples/bimodal_ke/main.rs | 6 +- examples/bimodal_ke_backend_compare.rs | 6 +- examples/drusano/main.rs | 56 ++-- examples/iov/main.rs | 4 +- examples/meta/main.rs | 9 - examples/neely/main.rs | 13 - examples/new_iov/main.rs | 3 - examples/theophylline/main.rs | 4 - examples/two_eq_lag/main.rs | 5 - examples/vanco_sde/main.rs | 7 - src/algorithms/mod.rs | 68 +--- src/algorithms/nonparametric/npag.rs | 19 -- src/api/estimation_problem.rs | 209 ++++-------- src/api/mod.rs | 4 +- src/bestdose/types.rs | 2 +- src/lib.rs | 6 +- src/model/covariate_model.rs | 444 ------------------------- src/model/covariates.rs | 33 -- src/model/mod.rs | 56 +--- tests/acceptance_baseline_tests.rs | 6 +- tests/onecomp.rs | 18 +- tests/results_summary_tests.rs | 6 +- 22 files changed, 128 insertions(+), 856 deletions(-) delete mode 100644 src/model/covariate_model.rs delete mode 100644 src/model/covariates.rs diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index d87a43d2e..49634f73f 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -25,12 +25,12 @@ fn main() -> Result<()> { let _result = EstimationProblem::builder(eq, data) .algorithm(NpagConfig::default()) - .parameter(Parameter::bounded("ke", 0.001, 3.0))? - .parameter(Parameter::bounded("v", 25.0, 250.0))? + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), - )? + ) .fit()?; Ok(()) diff --git a/examples/bimodal_ke_backend_compare.rs b/examples/bimodal_ke_backend_compare.rs index 169dab644..f514151fc 100644 --- a/examples/bimodal_ke_backend_compare.rs +++ b/examples/bimodal_ke_backend_compare.rs @@ -203,13 +203,13 @@ fn run_case Result<()> { let data = data::read_pmetrics("examples/drusano/data.csv")?; EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("v1", 5.0, 160.0))? - .parameter(Parameter::bounded("cl1", 4.0, 9.0))? - .parameter(Parameter::bounded("v2", 100.0, 200.0))? - .parameter(Parameter::bounded("cl2", 25.0, 35.0))? - .parameter(Parameter::bounded("popmax", 100000000.0, 100000000000.0))? - .parameter(Parameter::bounded("kgs", 0.01, 0.25))? - .parameter(Parameter::bounded("kks", 0.01, 0.5))? - .parameter(Parameter::bounded("e50_1s", 0.1, 2.5))? - .parameter(Parameter::bounded("e50_2s", 0.1, 10.0))? - .parameter(Parameter::bounded("alpha_s", -8.0, 5.0))? - .parameter(Parameter::bounded("kgr1", 0.004, 0.1))? - .parameter(Parameter::bounded("kkr1", 0.08, 0.4))? - .parameter(Parameter::bounded("e50_1r1", 8.0, 17.0))? - .parameter(Parameter::bounded("alpha_r1", -8.0, 5.0))? - .parameter(Parameter::bounded("kgr2", 0.004, 0.3))? - .parameter(Parameter::bounded("kkr2", 0.1, 0.5))? - .parameter(Parameter::bounded("e50_2r2", 5.0, 8.0))? - .parameter(Parameter::bounded("alpha_r2", -5.0, 5.0))? - .parameter(Parameter::bounded("init_4", -1.0, 4.0))? - .parameter(Parameter::bounded("init_5", -1.0, 3.0))? - .parameter(Parameter::bounded("h1s", 0.5, 8.0))? - .parameter(Parameter::bounded("h2s", 0.1, 4.0))? - .parameter(Parameter::bounded("h1r1", 5.0, 25.0))? - .parameter(Parameter::bounded("h2r2", 10.0, 22.0))? + .parameter(Parameter::bounded("v1", 5.0, 160.0)) + .parameter(Parameter::bounded("cl1", 4.0, 9.0)) + .parameter(Parameter::bounded("v2", 100.0, 200.0)) + .parameter(Parameter::bounded("cl2", 25.0, 35.0)) + .parameter(Parameter::bounded("popmax", 100000000.0, 100000000000.0)) + .parameter(Parameter::bounded("kgs", 0.01, 0.25)) + .parameter(Parameter::bounded("kks", 0.01, 0.5)) + .parameter(Parameter::bounded("e50_1s", 0.1, 2.5)) + .parameter(Parameter::bounded("e50_2s", 0.1, 10.0)) + .parameter(Parameter::bounded("alpha_s", -8.0, 5.0)) + .parameter(Parameter::bounded("kgr1", 0.004, 0.1)) + .parameter(Parameter::bounded("kkr1", 0.08, 0.4)) + .parameter(Parameter::bounded("e50_1r1", 8.0, 17.0)) + .parameter(Parameter::bounded("alpha_r1", -8.0, 5.0)) + .parameter(Parameter::bounded("kgr2", 0.004, 0.3)) + .parameter(Parameter::bounded("kkr2", 0.1, 0.5)) + .parameter(Parameter::bounded("e50_2r2", 5.0, 8.0)) + .parameter(Parameter::bounded("alpha_r2", -5.0, 5.0)) + .parameter(Parameter::bounded("init_4", -1.0, 4.0)) + .parameter(Parameter::bounded("init_5", -1.0, 3.0)) + .parameter(Parameter::bounded("h1s", 0.5, 8.0)) + .parameter(Parameter::bounded("h2s", 0.1, 4.0)) + .parameter(Parameter::bounded("h1r1", 5.0, 25.0)) + .parameter(Parameter::bounded("h2r2", 10.0, 22.0)) .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), - )? + ) .error( "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), - )? + ) .error( "outeq_3", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), - )? + ) .error( "outeq_4", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), - )? + ) .fit()?; Ok(()) } diff --git a/examples/iov/main.rs b/examples/iov/main.rs index e78abe237..192e5633e 100644 --- a/examples/iov/main.rs +++ b/examples/iov/main.rs @@ -28,12 +28,12 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/iov/test.csv").unwrap(); EstimationProblem::builder(sde, data) - .parameter(Parameter::bounded("ke0", 0.001, 2.0))? + .parameter(Parameter::bounded("ke0", 0.001, 2.0)) .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), - )? + ) .fit() .unwrap(); diff --git a/examples/meta/main.rs b/examples/meta/main.rs index 522f0a4e4..f39576d4a 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -34,30 +34,21 @@ fn main() { let data = data::read_pmetrics("examples/meta/meta.csv").unwrap(); EstimationProblem::builder(eq, data) .parameter(Parameter::bounded("cls", 0.1, 10.0)) - .unwrap() .parameter(Parameter::bounded("fm", 0.0, 1.0)) - .unwrap() .parameter(Parameter::bounded("k20", 0.01, 1.0)) - .unwrap() .parameter(Parameter::bounded("relv", 0.1, 1.0)) - .unwrap() .parameter(Parameter::bounded("theta1", 0.1, 10.0)) - .unwrap() .parameter(Parameter::bounded("theta2", 0.1, 10.0)) - .unwrap() .parameter(Parameter::bounded("vs", 1.0, 10.0)) - .unwrap() .algorithm(Algorithm::NPOD(NpodConfig::default())) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .unwrap() .error( "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .unwrap() .fit() .unwrap(); } diff --git a/examples/neely/main.rs b/examples/neely/main.rs index 5b322a5e2..d47ad0ac3 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -49,41 +49,28 @@ fn main() { let data = data::read_pmetrics("examples/neely/data.csv").unwrap(); EstimationProblem::builder(eq, data) .parameter(Parameter::bounded("cls", 0.0, 0.4)) - .unwrap() .parameter(Parameter::bounded("k30", 0.0, 0.5)) - .unwrap() .parameter(Parameter::bounded("k40", 0.3, 1.5)) - .unwrap() .parameter(Parameter::bounded("qs", 0.0, 0.5)) - .unwrap() .parameter(Parameter::bounded("vps", 0.0, 5.0)) - .unwrap() .parameter(Parameter::bounded("vs", 0.0, 2.0)) - .unwrap() .parameter(Parameter::bounded("fm1", 0.0, 0.2)) - .unwrap() .parameter(Parameter::bounded("fm2", 0.0, 0.1)) - .unwrap() .parameter(Parameter::bounded("theta1", -4.0, 2.0)) - .unwrap() .parameter(Parameter::bounded("theta2", -2.0, 0.5)) - .unwrap() .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .unwrap() .error( "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .unwrap() .error( "outeq_3", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .unwrap() .fit() .unwrap(); } diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index 6cb82ce4a..64af9091e 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -28,15 +28,12 @@ fn main() { let data = data::read_pmetrics("examples/new_iov/data.csv").unwrap(); EstimationProblem::builder(sde, data) .parameter(Parameter::bounded("ke0", 0.0001, 2.4)) - .unwrap() .parameter(Parameter::bounded("ske", 0.0001, 0.2)) - .unwrap() .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), ) - .unwrap() .fit() .unwrap(); } diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index ef00ead6b..b7df9d813 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -18,17 +18,13 @@ fn main() { let data = data::read_pmetrics("examples/theophylline/theophylline.csv").unwrap(); EstimationProblem::builder(analytical, data) .parameter(Parameter::bounded("ka", 0.001, 3.0)) - .unwrap() .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .unwrap() .parameter(Parameter::bounded("v", 0.001, 50.0)) - .unwrap() .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_0", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), ) - .unwrap() .fit() .unwrap(); } diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index 898d323e7..4fecaf616 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -24,19 +24,14 @@ fn main() { let data = data::read_pmetrics("examples/two_eq_lag/two_eq_lag.csv").unwrap(); EstimationProblem::builder(eq, data) .parameter(Parameter::bounded("ka", 0.1, 0.9)) - .unwrap() .parameter(Parameter::bounded("ke", 0.001, 0.1)) - .unwrap() .parameter(Parameter::bounded("tlag", 0.0, 4.0)) - .unwrap() .parameter(Parameter::bounded("v", 30.0, 120.0)) - .unwrap() .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_0", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), ) - .unwrap() .fit() .unwrap(); } diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index 161720e85..f643524f4 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -50,23 +50,16 @@ fn main() { let data = data::read_pmetrics("examples/vanco_sde/vanco_clean.csv").unwrap(); EstimationProblem::builder(sde, data) .parameter(Parameter::bounded("ka", 0.0001, 2.4)) - .unwrap() .parameter(Parameter::bounded("ke0", 0.0001, 2.7)) - .unwrap() .parameter(Parameter::bounded("kcp", 0.0001, 2.4)) - .unwrap() .parameter(Parameter::bounded("kpc", 0.0001, 2.4)) - .unwrap() .parameter(Parameter::bounded("vol", 0.2, 12.0)) - .unwrap() .parameter(Parameter::bounded("ske", 0.0001, 0.2)) - .unwrap() .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), ) - .unwrap() .fit() .unwrap(); } diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index e1ce99b85..d755f4436 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -1,17 +1,13 @@ use std::fs; use std::path::Path; -use std::time::Instant; -use crate::api::EstimationProblem; use crate::estimation::nonparametric::{NonParametricResult, Psi, Theta}; use anyhow::Context; use anyhow::Result; use ndarray::parallel::prelude::{IntoParallelIterator, ParallelIterator}; use ndarray::{Array, ArrayBase, Dim, OwnedRepr}; -use nonparametric::npag::*; -use nonparametric::npmap::NPMAP; -use nonparametric::npod::NPOD; + use nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; use pharmsol::prelude::{data::Data, simulator::Equation}; @@ -360,68 +356,6 @@ pub trait NonParametricAlgorithm: Sync + Send + 's fn into_workspace(&self) -> Result>; } -pub(crate) fn dispatch_nonparametric_algorithm( - input: EstimationProblem, -) -> Result>> { - match input.algorithm { - Algorithm::NPAG(_) => { - let algorithm: Box> = NPAG::from_input(input)?; - Ok(algorithm) - } - Algorithm::NPOD(_) => { - let algorithm: Box> = NPOD::from_input(input)?; - Ok(algorithm) - } - Algorithm::NPMAP(_) => { - let algorithm: Box> = NPMAP::from_input(input)?; - Ok(algorithm) - } - } -} - -pub(crate) fn run_nonparametric_algorithm_with_progress( - input: EstimationProblem, - mut on_progress: F, -) -> Result> -where - E: Equation + Send + 'static, - F: FnMut(usize, f64, Option, u64, Status), -{ - let mut algorithm = dispatch_nonparametric_algorithm(input)?; - algorithm.initialize()?; - - let mut previous_objective: Option = None; - - loop { - let cycle_started = Instant::now(); - let status = algorithm.next_cycle()?; - let objective = algorithm.n2ll(); - let objective_delta = previous_objective.map(|prev| objective - prev); - previous_objective = Some(objective); - - on_progress( - algorithm.cycle(), - objective, - objective_delta, - cycle_started.elapsed().as_millis() as u64, - status.clone(), - ); - - if matches!(status, Status::Stop(_)) { - break; - } - } - - algorithm.into_workspace() -} - -pub(crate) fn run_nonparametric_algorithm( - input: EstimationProblem, -) -> Result> { - let mut algorithm = dispatch_nonparametric_algorithm(input)?; - algorithm.fit() -} - /// Represents the status/result of the algorithm #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub enum Status { diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 54642e2e6..4c720e14f 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -182,25 +182,6 @@ impl NPAG { config, })) } - - pub(crate) fn from_input(input: EstimationProblem) -> Result> { - let config = match input.algorithm.clone() { - Algorithm::NPAG(config) => config, - other => unreachable!( - "NPAG::from_input requires an NPAG algorithm, got {}", - other.name() - ), - }; - let error_models = input.error_models.models().clone(); - let parameter_space = input.model.parameters.clone(); - Self::from_parts( - input.model.equation, - input.data, - error_models, - ¶meter_space, - config, - ) - } } impl NonParametricAlgorithm for NPAG { diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index c4f805c56..ec58faed3 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -1,28 +1,29 @@ -use anyhow::Result; +use anyhow::{anyhow, Result}; use pharmsol::{AssayErrorModel, AssayErrorModels, Data, Equation}; use crate::algorithms::Algorithm; use crate::api::error_models::ErrorModels; -use crate::model::{ - CovariateSpec, EquationMetadataSource, ModelDefinition, ModelDefinitionBuilder, ModelMetadata, - Parameter, VariabilityModel, -}; +use crate::model::{EquationMetadataSource, Model, ModelBuilder, Parameter, ParameterSpace}; use crate::results::FitResult; #[derive(Debug, Clone)] pub struct EstimationProblem { - pub(crate) model: ModelDefinition, + pub(crate) model: Model, pub(crate) data: Data, pub(crate) error_models: ErrorModels, pub(crate) algorithm: Algorithm, + pub(crate) parameters: ParameterSpace, } impl EstimationProblem { pub fn builder(equation: E, data: Data) -> EstimationProblemBuilder { EstimationProblemBuilder { - model: ModelDefinition::builder(equation), + model: Model::builder(equation), data, + parameters: ParameterSpace::new(), + algorithm: None, + error_models: Vec::new(), } } } @@ -31,182 +32,92 @@ impl EstimationPr pub fn fit(self) -> Result> { unimplemented!("fit method is not implemented yet") } - - pub fn fit_with_progress(self, _on_progress: F) -> Result> - where - F: FnMut(crate::api::FitProgress), - { - unimplemented!("fit method is not implemented yet") - } } +// --- The Unified Builder --- + pub struct EstimationProblemBuilder { - model: ModelDefinitionBuilder, + model: ModelBuilder, data: Data, + parameters: ParameterSpace, + algorithm: Option, + error_models: Vec<(String, AssayErrorModel)>, } impl EstimationProblemBuilder { - /// Select the estimation algorithm. Accepts any algorithm configuration - /// (e.g. [`Npag`](crate::algorithms::nonparametric::Npag)) that converts - /// into [`Algorithm`]. - pub fn algorithm( - self, - algorithm: impl Into, - ) -> NonparametricEstimationProblemBuilder { - NonparametricEstimationProblemBuilder::new(self, algorithm.into()) - } -} - -impl EstimationProblemBuilder { - pub fn parameter(self, parameter: Parameter) -> Result { - self.map_model_builder(|model| model.parameter(parameter)) + pub fn algorithm(mut self, algorithm: impl Into) -> Self { + self.algorithm = Some(algorithm.into()); + self } - pub fn variability(self, variability: VariabilityModel) -> Self { - self.with_model_builder(|model| model.variability(variability)) + /// Add a single parameter + pub fn parameter(mut self, parameter: Parameter) -> Self { + self.parameters.push(parameter); + self } - pub fn covariates(self, covariates: CovariateSpec) -> Self { - self.with_model_builder(|model| model.covariates(covariates)) + /// Batch add multiple parameters + pub fn parameters(mut self, parameters: impl IntoIterator) -> Self { + for param in parameters { + self.parameters.push(param); + } + self } - pub fn metadata(self, metadata: ModelMetadata) -> Self { - self.with_model_builder(|model| model.metadata(metadata)) + /// Add an error model + // TODO: result + pub fn error(mut self, name: impl Into, model: AssayErrorModel) -> Self { + self.error_models.push((name.into(), model)); + self } - fn map_model_builder( - self, - map: impl FnOnce(ModelDefinitionBuilder) -> Result>, - ) -> Result { - let EstimationProblemBuilder { model, data } = self; - - Ok(Self { - model: map(model)?, - data, - }) - } - - fn with_model_builder( - self, - map: impl FnOnce(ModelDefinitionBuilder) -> ModelDefinitionBuilder, - ) -> Self { - let EstimationProblemBuilder { model, data } = self; - - Self { - model: map(model), - data, - } + // Helper for mapping the internal model builder if needed + fn with_model_builder(mut self, map: impl FnOnce(ModelBuilder) -> ModelBuilder) -> Self { + self.model = map(self.model); + self } } -pub struct NonparametricEstimationProblemBuilder { - builder: EstimationProblemBuilder, - algorithm: Algorithm, - error_models: Option, -} +impl EstimationProblemBuilder { + /// Validates all parameters and constructs the problem. + pub fn build(self) -> Result> { + let algorithm = self + .algorithm + .ok_or_else(|| anyhow!("an algorithm must be selected before building"))?; -impl NonparametricEstimationProblemBuilder { - fn new(builder: EstimationProblemBuilder, algorithm: Algorithm) -> Self { - Self { - builder, - algorithm, - error_models: None, + if self.parameters.is_empty() { + anyhow::bail!("at least one parameter is required"); } - } - - fn with_builder( - self, - map: impl FnOnce(EstimationProblemBuilder) -> EstimationProblemBuilder, - ) -> Self { - let NonparametricEstimationProblemBuilder { - builder, - algorithm, - error_models, - } = self; - Self { - builder: map(builder), - algorithm, - error_models, + if self.error_models.is_empty() { + anyhow::bail!("at least one error model is required"); } - } -} - -impl NonparametricEstimationProblemBuilder { - pub fn parameter(self, parameter: Parameter) -> Result { - self.map_builder(|builder| builder.parameter(parameter)) - } - - pub fn variability(self, variability: VariabilityModel) -> Self { - self.with_builder(|builder| builder.variability(variability)) - } - - pub fn covariates(self, covariates: CovariateSpec) -> Self { - self.with_builder(|builder| builder.covariates(covariates)) - } - - pub fn metadata(self, metadata: ModelMetadata) -> Self { - self.with_builder(|builder| builder.metadata(metadata)) - } - pub fn error(mut self, name: &str, model: AssayErrorModel) -> Result { - let outeq = self - .builder - .model - .output_index(name) - .ok_or_else(|| anyhow::anyhow!("unknown equation output label: {name}"))?; + let mut all_errors = AssayErrorModels::new(); + for (name, error_model) in self.error_models { + let outeq = self + .model + .output_index(&name) + .ok_or_else(|| anyhow!("unknown equation output label: {name}"))?; - self.error_models = Some(match self.error_models.take() { - None => AssayErrorModels::new().add(outeq, model)?, - Some(models) => models.add(outeq, model)?, - }); - - Ok(self) - } + all_errors = all_errors.add(outeq, error_model)?; + } - pub fn build(self) -> Result> { - let model = self.builder.model.build()?; - let error_models = self - .error_models - .ok_or_else(|| anyhow::anyhow!("error models are required"))?; + let model = self.model.build()?; Ok(EstimationProblem { model, - data: self.builder.data, - error_models: ErrorModels::Nonparametric(error_models), - algorithm: self.algorithm, - }) - } - - fn map_builder( - self, - map: impl FnOnce(EstimationProblemBuilder) -> Result>, - ) -> Result { - let NonparametricEstimationProblemBuilder { - builder, - algorithm, - error_models, - } = self; - - Ok(Self { - builder: map(builder)?, + data: self.data, + error_models: ErrorModels::Nonparametric(all_errors), algorithm, - error_models, + parameters: self.parameters, }) } } -impl - NonparametricEstimationProblemBuilder -{ +impl EstimationProblemBuilder { pub fn fit(self) -> Result> { + // Automatically builds and executes self.build()?.fit() } - - pub fn fit_with_progress(self, on_progress: F) -> Result> - where - F: FnMut(crate::api::FitProgress), - { - self.build()?.fit_with_progress(on_progress) - } } diff --git a/src/api/mod.rs b/src/api/mod.rs index 78574cd34..a7fc820bb 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -5,8 +5,6 @@ pub mod progress; pub use crate::algorithms::nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; pub use error_models::ErrorModels; -pub use estimation_problem::{ - EstimationProblem, EstimationProblemBuilder, NonparametricEstimationProblemBuilder, -}; +pub use estimation_problem::{EstimationProblem, EstimationProblemBuilder}; pub use progress::{FitProgress, NonparametricCycleProgress}; diff --git a/src/bestdose/types.rs b/src/bestdose/types.rs index d759d9d7d..84daf85e4 100644 --- a/src/bestdose/types.rs +++ b/src/bestdose/types.rs @@ -249,7 +249,7 @@ impl BestDoseConfig { self.prediction_interval } - pub(crate) fn parameter_names(&self) -> Vec { + pub fn parameter_names(&self) -> Vec { self.parameter_space .iter() .map(|parameter| parameter.name.clone()) diff --git a/src/lib.rs b/src/lib.rs index 66a941450..1cec061b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,9 +68,9 @@ pub mod prelude { CycleLog, NPCycle, NPPredictions, NonParametricResult, Posterior, Psi, Theta, Weights, }; pub use crate::model::{ - CovariateEffectsSpec, CovariateModel, CovariateSpec, EquationMetadataSource, ModelMetadata, - Parameter, ParameterDomain, ParameterSpace, ParameterTransform as ModelParameterTransform, - ParameterVariability, RandomEffectsSpec, VariabilityModel, + EquationMetadataSource, ModelMetadata, Parameter, ParameterDomain, ParameterSpace, + ParameterTransform as ModelParameterTransform, ParameterVariability, RandomEffectsSpec, + VariabilityModel, }; pub use crate::results::{ FitResult, FitSummary, IndividualSummary, ParameterSummary, PopulationSummary, diff --git a/src/model/covariate_model.rs b/src/model/covariate_model.rs deleted file mode 100644 index 0de14c163..000000000 --- a/src/model/covariate_model.rs +++ /dev/null @@ -1,444 +0,0 @@ -//! Structured covariate model for population parameter regression. - -use anyhow::{bail, Result}; -use faer::{Col, Mat}; -use serde::Serialize; -use std::collections::HashMap; - -/// Covariate model specification. -#[derive(Debug, Clone)] -pub struct CovariateModel { - param_names: Vec, - covariate_names: Vec, - covariate_mask: Vec>, - beta: Col, - estimate_beta: Vec, - reference_values: HashMap, -} - -impl CovariateModel { - pub fn new( - param_names: Vec>, - covariate_names: Vec>, - covariate_mask: Vec>, - ) -> Result { - let param_names: Vec = param_names.into_iter().map(|s| s.into()).collect(); - let covariate_names: Vec = covariate_names.into_iter().map(|s| s.into()).collect(); - - let n_params = param_names.len(); - let n_covs = covariate_names.len(); - - if covariate_mask.len() != n_params { - bail!( - "Covariate mask rows ({}) must match number of parameters ({})", - covariate_mask.len(), - n_params - ); - } - - for (i, row) in covariate_mask.iter().enumerate() { - if row.len() != n_covs { - bail!( - "Covariate mask row {} has {} columns, expected {}", - i, - row.len(), - n_covs - ); - } - } - - let n_beta = Self::count_beta_coefficients(&covariate_mask, n_params); - - Ok(Self { - param_names, - covariate_names, - covariate_mask, - beta: Col::zeros(n_beta), - estimate_beta: vec![true; n_beta], - reference_values: HashMap::new(), - }) - } - - pub fn intercept_only(param_names: Vec>) -> Result { - let param_names: Vec = param_names.into_iter().map(|s| s.into()).collect(); - let n_params = param_names.len(); - - Ok(Self { - param_names, - covariate_names: Vec::new(), - covariate_mask: vec![Vec::new(); n_params], - beta: Col::zeros(n_params), - estimate_beta: vec![true; n_params], - reference_values: HashMap::new(), - }) - } - - pub fn from_saemix_matrix( - param_names: Vec>, - covariate_names: Vec>, - matrix: &[f64], - ) -> Result { - let param_names: Vec = param_names.into_iter().map(|s| s.into()).collect(); - let covariate_names: Vec = covariate_names.into_iter().map(|s| s.into()).collect(); - - let n_params = param_names.len(); - let n_covs = covariate_names.len(); - - if matrix.len() != n_params * n_covs { - bail!( - "Matrix length ({}) doesn't match n_params × n_covs ({} × {} = {})", - matrix.len(), - n_params, - n_covs, - n_params * n_covs - ); - } - - let covariate_mask: Vec> = (0..n_params) - .map(|i| (0..n_covs).map(|j| matrix[i * n_covs + j] != 0.0).collect()) - .collect(); - - Self::new(param_names, covariate_names, covariate_mask) - } - - pub fn set_beta(&mut self, beta: Col) -> Result<()> { - let expected = self.n_beta(); - if beta.nrows() != expected { - bail!( - "Beta length ({}) doesn't match expected ({})", - beta.nrows(), - expected - ); - } - self.beta = beta; - Ok(()) - } - - pub fn set_intercepts(&mut self, intercepts: &[f64]) -> Result<()> { - if intercepts.len() != self.n_params() { - bail!( - "Intercepts length ({}) doesn't match n_params ({})", - intercepts.len(), - self.n_params() - ); - } - - let mut idx = 0; - for (i, &intercept) in intercepts.iter().enumerate() { - self.beta[idx] = intercept; - idx += 1; - idx += self.covariate_mask[i].iter().filter(|&&x| x).count(); - } - - Ok(()) - } - - pub fn set_estimate_beta(&mut self, estimate: Vec) -> Result<()> { - if estimate.len() != self.beta.nrows() { - bail!( - "estimate_beta length ({}) doesn't match n_beta ({})", - estimate.len(), - self.beta.nrows() - ); - } - self.estimate_beta = estimate; - Ok(()) - } - - pub fn fix_intercept(&mut self, param_idx: usize) -> Result<()> { - let beta_idx = self.intercept_beta_index(param_idx)?; - self.estimate_beta[beta_idx] = false; - Ok(()) - } - - pub fn set_reference(&mut self, covariate: &str, value: f64) -> Result<()> { - if !self.covariate_names.contains(&covariate.to_string()) { - bail!("Unknown covariate: {}", covariate); - } - self.reference_values.insert(covariate.to_string(), value); - Ok(()) - } - - pub fn compute_mu(&self, covariates: &HashMap) -> Col { - let n_params = self.param_names.len(); - let mut mu = Col::zeros(n_params); - let mut beta_idx = 0; - - for i in 0..n_params { - mu[i] = self.beta[beta_idx]; - beta_idx += 1; - - for (j, cov_name) in self.covariate_names.iter().enumerate() { - if self.covariate_mask[i][j] { - let cov_value = covariates.get(cov_name).copied().unwrap_or(0.0); - let reference = self.reference_values.get(cov_name).copied().unwrap_or(0.0); - mu[i] += self.beta[beta_idx] * (cov_value - reference); - beta_idx += 1; - } - } - } - - mu - } - - pub fn build_design_row(&self, covariates: &HashMap) -> Col { - let n_beta = self.n_beta(); - let mut x = Col::zeros(n_beta); - let mut beta_idx = 0; - - for i in 0..self.n_params() { - x[beta_idx] = 1.0; - beta_idx += 1; - - for (j, cov_name) in self.covariate_names.iter().enumerate() { - if self.covariate_mask[i][j] { - let cov_value = covariates.get(cov_name).copied().unwrap_or(0.0); - let reference = self.reference_values.get(cov_name).copied().unwrap_or(0.0); - x[beta_idx] = cov_value - reference; - beta_idx += 1; - } - } - } - - x - } - - pub fn build_design_matrix(&self, all_covariates: &[HashMap]) -> Mat { - let n_subjects = all_covariates.len(); - let n_params = self.n_params(); - let n_beta = self.n_beta(); - let n_rows = n_subjects * n_params; - let mut x = Mat::zeros(n_rows, n_beta); - - for (subject_idx, covs) in all_covariates.iter().enumerate() { - let mut beta_idx = 0; - for param_idx in 0..n_params { - let row_idx = subject_idx * n_params + param_idx; - x[(row_idx, beta_idx)] = 1.0; - beta_idx += 1; - - for (j, cov_name) in self.covariate_names.iter().enumerate() { - if self.covariate_mask[param_idx][j] { - let cov_value = covs.get(cov_name).copied().unwrap_or(0.0); - let reference = self.reference_values.get(cov_name).copied().unwrap_or(0.0); - x[(row_idx, beta_idx)] = cov_value - reference; - beta_idx += 1; - } - } - } - } - - x - } - - pub fn n_params(&self) -> usize { - self.param_names.len() - } - - pub fn n_covariates(&self) -> usize { - self.covariate_names.len() - } - - pub fn n_beta(&self) -> usize { - Self::count_beta_coefficients(&self.covariate_mask, self.param_names.len()) - } - - pub fn n_beta_estimated(&self) -> usize { - self.estimate_beta.iter().filter(|&&x| x).count() - } - - pub fn param_names(&self) -> &[String] { - &self.param_names - } - - pub fn covariate_names(&self) -> &[String] { - &self.covariate_names - } - - pub fn covariate_mask(&self) -> &[Vec] { - &self.covariate_mask - } - - pub fn beta(&self) -> &Col { - &self.beta - } - - pub fn beta_mut(&mut self) -> &mut Col { - &mut self.beta - } - - pub fn estimate_beta(&self) -> &[bool] { - &self.estimate_beta - } - - pub fn intercept(&self, param_idx: usize) -> Option { - let beta_idx = self.intercept_beta_index(param_idx).ok()?; - Some(self.beta[beta_idx]) - } - - pub fn has_covariates(&self, param_idx: usize) -> bool { - param_idx < self.covariate_mask.len() && self.covariate_mask[param_idx].iter().any(|&x| x) - } - - fn count_beta_coefficients(mask: &[Vec], n_params: usize) -> usize { - let mut count = n_params; - for row in mask { - count += row.iter().filter(|&&x| x).count(); - } - count - } - - fn intercept_beta_index(&self, param_idx: usize) -> Result { - if param_idx >= self.n_params() { - bail!("Parameter index {} out of range", param_idx); - } - - let mut idx = 0; - for i in 0..param_idx { - idx += 1; - idx += self.covariate_mask[i].iter().filter(|&&x| x).count(); - } - Ok(idx) - } - - pub fn estimated_beta_indices(&self) -> Vec { - self.estimate_beta - .iter() - .enumerate() - .filter_map(|(i, &est)| if est { Some(i) } else { None }) - .collect() - } -} - -impl Default for CovariateModel { - fn default() -> Self { - Self { - param_names: Vec::new(), - covariate_names: Vec::new(), - covariate_mask: Vec::new(), - beta: Col::zeros(0), - estimate_beta: Vec::new(), - reference_values: HashMap::new(), - } - } -} - -impl Serialize for CovariateModel { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - - let mut state = serializer.serialize_struct("CovariateModel", 6)?; - state.serialize_field("param_names", &self.param_names)?; - state.serialize_field("covariate_names", &self.covariate_names)?; - state.serialize_field("covariate_mask", &self.covariate_mask)?; - let beta_vec: Vec = (0..self.beta.nrows()).map(|i| self.beta[i]).collect(); - state.serialize_field("beta", &beta_vec)?; - state.serialize_field("estimate_beta", &self.estimate_beta)?; - state.serialize_field("reference_values", &self.reference_values)?; - state.end() - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_intercept_only() { - let model = CovariateModel::intercept_only(vec!["CL", "V"]).unwrap(); - - assert_eq!(model.n_params(), 2); - assert_eq!(model.n_covariates(), 0); - assert_eq!(model.n_beta(), 2); - - let mut model = model; - model.set_intercepts(&[5.0, 50.0]).unwrap(); - - let mu = model.compute_mu(&HashMap::new()); - assert_eq!(mu[0], 5.0); - assert_eq!(mu[1], 50.0); - } - - #[test] - fn test_with_covariates() { - let model = CovariateModel::new( - vec!["CL", "V"], - vec!["WT", "SEX"], - vec![vec![true, false], vec![true, true]], - ) - .unwrap(); - - assert_eq!(model.n_params(), 2); - assert_eq!(model.n_covariates(), 2); - assert_eq!(model.n_beta(), 5); - } - - #[test] - fn test_compute_mu() { - let mut model = - CovariateModel::new(vec!["CL", "V"], vec!["WT"], vec![vec![true], vec![true]]).unwrap(); - - model - .set_beta(Col::from_fn(4, |i| match i { - 0 => 5.0, - 1 => 0.1, - 2 => 50.0, - 3 => 1.0, - _ => 0.0, - })) - .unwrap(); - - let mut covs = HashMap::new(); - covs.insert("WT".to_string(), 70.0); - let mu = model.compute_mu(&covs); - - assert!((mu[0] - 12.0).abs() < 1e-10); - assert!((mu[1] - 120.0).abs() < 1e-10); - } - - #[test] - fn test_centering() { - let mut model = CovariateModel::new(vec!["CL"], vec!["WT"], vec![vec![true]]).unwrap(); - model.set_reference("WT", 70.0).unwrap(); - model - .set_beta(Col::from_fn(2, |i| if i == 0 { 5.0 } else { 0.1 })) - .unwrap(); - - let mut covs = HashMap::new(); - covs.insert("WT".to_string(), 70.0); - let mu = model.compute_mu(&covs); - assert!((mu[0] - 5.0).abs() < 1e-10); - - covs.insert("WT".to_string(), 80.0); - let mu = model.compute_mu(&covs); - assert!((mu[0] - 6.0).abs() < 1e-10); - } - - #[test] - fn test_from_saemix_matrix() { - let model = CovariateModel::from_saemix_matrix( - vec!["CL", "V"], - vec!["WT", "SEX"], - &[1.0, 0.0, 1.0, 1.0], - ) - .unwrap(); - - assert!(model.covariate_mask[0][0]); - assert!(!model.covariate_mask[0][1]); - assert!(model.covariate_mask[1][0]); - assert!(model.covariate_mask[1][1]); - } - - #[test] - fn test_fix_intercept() { - let mut model = CovariateModel::intercept_only(vec!["CL", "V"]).unwrap(); - - assert!(model.estimate_beta[0]); - model.fix_intercept(0).unwrap(); - assert!(!model.estimate_beta[0]); - assert!(model.estimate_beta[1]); - } -} diff --git a/src/model/covariates.rs b/src/model/covariates.rs deleted file mode 100644 index fb514add8..000000000 --- a/src/model/covariates.rs +++ /dev/null @@ -1,33 +0,0 @@ -use serde::Serialize; - -use crate::model::CovariateModel; - -#[allow(clippy::large_enum_variant)] -#[derive(Debug, Clone, Default, Serialize)] -pub enum CovariateSpec { - #[default] - InEquation, - Structured(CovariateEffectsSpec), -} - -#[derive(Debug, Clone, Default, Serialize)] -pub struct CovariateEffectsSpec { - pub subject_effects: Option, - pub occasion_effects: Option, -} - -impl CovariateEffectsSpec { - pub fn subject_columns(&self) -> Vec { - self.subject_effects - .as_ref() - .map(|model| model.covariate_names().to_vec()) - .unwrap_or_default() - } - - pub fn occasion_columns(&self) -> Vec { - self.occasion_effects - .as_ref() - .map(|model| model.covariate_names().to_vec()) - .unwrap_or_default() - } -} diff --git a/src/model/mod.rs b/src/model/mod.rs index 23271eaf3..28bad4b4d 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -2,14 +2,10 @@ use anyhow::{anyhow, bail, Result}; use pharmsol::equation::Equation; use pharmsol::{Analytical, ValidatedModelMetadata, ODE, SDE}; -pub mod covariate_model; -pub mod covariates; pub mod metadata; pub mod parameter_space; pub mod variability; -pub use covariate_model::CovariateModel; -pub use covariates::{CovariateEffectsSpec, CovariateSpec}; pub use metadata::ModelMetadata; pub use parameter_space::{ Parameter, ParameterDomain, ParameterSpace, ParameterTransform, ParameterVariability, @@ -17,27 +13,21 @@ pub use parameter_space::{ pub use variability::{CovarianceStructure, RandomEffectsSpec, VariabilityModel}; #[derive(Debug, Clone)] -pub struct ModelDefinition { +pub struct Model { pub equation: E, pub parameters: ParameterSpace, - pub variability: VariabilityModel, - pub covariates: CovariateSpec, - pub metadata: ModelMetadata, } -impl ModelDefinition { - pub fn builder(equation: E) -> ModelDefinitionBuilder { - ModelDefinitionBuilder { +impl Model { + pub fn builder(equation: E) -> ModelBuilder { + ModelBuilder { equation, parameters: ParameterSpace::new(), - variability: Some(VariabilityModel::default()), - covariates: Some(CovariateSpec::InEquation), - metadata: Some(ModelMetadata::default()), } } } -impl ModelDefinition { +impl Model { pub fn parameter_count(&self) -> usize { self.equation .equation_metadata() @@ -80,15 +70,12 @@ impl ModelDefinition { } } -pub struct ModelDefinitionBuilder { +pub struct ModelBuilder { equation: E, parameters: ParameterSpace, - variability: Option, - covariates: Option, - metadata: Option, } -impl ModelDefinitionBuilder { +impl ModelBuilder { pub fn parameter(mut self, parameter: Parameter) -> Result where E: EquationMetadataSource, @@ -98,48 +85,27 @@ impl ModelDefinitionBuilder { Ok(self) } - pub fn variability(mut self, variability: VariabilityModel) -> Self { - self.variability = Some(variability); - self - } - - pub fn covariates(mut self, covariates: CovariateSpec) -> Self { - self.covariates = Some(covariates); - self - } - - pub fn metadata(mut self, metadata: ModelMetadata) -> Self { - self.metadata = Some(metadata); - self - } - - pub fn build(self) -> Result> + pub fn build(self) -> Result> where E: EquationMetadataSource, { - let ModelDefinitionBuilder { + let ModelBuilder { equation, parameters, - variability, - covariates, - metadata, } = self; if parameters.is_empty() { bail!("model parameters cannot be empty"); } - Ok(ModelDefinition { + Ok(Model { equation, parameters, - variability: variability.unwrap_or_default(), - covariates: covariates.unwrap_or_default(), - metadata: metadata.unwrap_or_default(), }) } } -impl ModelDefinitionBuilder { +impl ModelBuilder { pub(crate) fn output_index(&self, name: &str) -> Option { self.equation.equation_metadata().and_then(|metadata| { metadata diff --git a/tests/acceptance_baseline_tests.rs b/tests/acceptance_baseline_tests.rs index 86d3a513b..00d69c756 100644 --- a/tests/acceptance_baseline_tests.rs +++ b/tests/acceptance_baseline_tests.rs @@ -35,13 +35,13 @@ fn bimodal_data() -> Result { #[test] fn test_acceptance_baseline_npag_bimodal_ke() -> Result<()> { let result = EstimationProblem::builder(bimodal_ode_equation(), bimodal_data()?) - .parameter(Parameter::bounded("ke", 0.001, 3.0))? - .parameter(Parameter::bounded("v", 25.0, 250.0))? + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), - )? + ) .fit()?; let summary = result.summary(); let population = result.population_summary(); diff --git a/tests/onecomp.rs b/tests/onecomp.rs index 5df097952..0308e7983 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -53,13 +53,13 @@ fn test_one_compartment_npag() -> Result<()> { let data = data::Data::new(subjects); let result = EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? + .parameter(Parameter::bounded("ke", 0.1, 1.0)) + .parameter(Parameter::bounded("v", 1.0, 20.0)) .algorithm(Algorithm::NPAG(NpagConfig::default())) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), - )? + ) .fit()?; let result = result .as_nonparametric() @@ -116,13 +116,13 @@ fn test_one_compartment_npod() -> Result<()> { let data = data::Data::new(subjects); let result = EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? + .parameter(Parameter::bounded("ke", 0.1, 1.0)) + .parameter(Parameter::bounded("v", 1.0, 20.0)) .algorithm(Algorithm::NPOD(NpodConfig::default())) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), - )? + ) .fit()?; let result = result .as_nonparametric() @@ -179,13 +179,13 @@ fn test_one_compartment_postprob() -> Result<()> { let data = data::Data::new(subjects); let result = EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? + .parameter(Parameter::bounded("ke", 0.1, 1.0)) + .parameter(Parameter::bounded("v", 1.0, 20.0)) .algorithm(Algorithm::NPMAP(NpmapConfig::default())) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), - )? + ) .fit()?; let result = result .as_nonparametric() diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index cfeb5650b..f363aea33 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -43,10 +43,10 @@ fn simple_data() -> Data { fn test_nonparametric_fit_result_summary_surface() -> Result<()> { let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); let result = EstimationProblem::builder(simple_equation(), simple_data()) - .parameter(Parameter::bounded("ke", 0.1, 1.0))? - .parameter(Parameter::bounded("v", 1.0, 20.0))? + .parameter(Parameter::bounded("ke", 0.1, 1.0)) + .parameter(Parameter::bounded("v", 1.0, 20.0)) .algorithm(Algorithm::NPAG(NpagConfig::default())) - .error("0", assay_error)? + .error("0", assay_error) .fit()?; let summary = result.summary(); From a3a9fa624282cbea42fa90bc6c780e79ec721ee9 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Thu, 28 May 2026 14:37:36 +0200 Subject: [PATCH 20/47] Clean up benchmarks --- benches/bimodal_ke.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index 58acc14bc..df251dbe6 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -33,30 +33,30 @@ fn load_data() -> Result { fn setup_npag() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) - .parameter(Parameter::bounded("ke", 0.001, 3.0))? - .parameter(Parameter::bounded("v", 25.0, 250.0))? + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .algorithm(Algorithm::NPAG(NpagConfig::default())) - .error("outeq_1", create_error_model())? + .error("outeq_1", create_error_model()) .build() } fn setup_npod() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) - .parameter(Parameter::bounded("ke", 0.001, 3.0))? - .parameter(Parameter::bounded("v", 25.0, 250.0))? + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .algorithm(Algorithm::NPOD(NpodConfig::default())) - .error("outeq_1", create_error_model())? + .error("outeq_1", create_error_model()) .build() } fn setup_postprob() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) - .parameter(Parameter::bounded("ke", 0.001, 3.0))? - .parameter(Parameter::bounded("v", 25.0, 250.0))? + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .algorithm(Algorithm::NPMAP(NpmapConfig::default())) - .error("outeq_1", create_error_model())? + .error("outeq_1", create_error_model()) .build() } From 7243b9c30916e6a2e370d2144118ae2eff5b23e7 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Thu, 28 May 2026 14:42:55 +0200 Subject: [PATCH 21/47] Docs --- src/api/estimation_problem.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index ec58faed3..b061eff22 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -34,8 +34,6 @@ impl EstimationPr } } -// --- The Unified Builder --- - pub struct EstimationProblemBuilder { model: ModelBuilder, data: Data, @@ -79,7 +77,7 @@ impl EstimationProblemBuilder { } impl EstimationProblemBuilder { - /// Validates all parameters and constructs the problem. + /// Validates all parameters and constructs the problem pub fn build(self) -> Result> { let algorithm = self .algorithm @@ -116,8 +114,8 @@ impl EstimationProblemBuilder { } impl EstimationProblemBuilder { + /// Attempts to build the problem and immediately fit it pub fn fit(self) -> Result> { - // Automatically builds and executes self.build()?.fit() } } From dd74646839b6b8a7a003f703906c257fa66fd769 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Thu, 28 May 2026 16:52:07 +0200 Subject: [PATCH 22/47] Major refactor --- src/algorithms/mod.rs | 87 ++++----- src/algorithms/nonparametric/npag.rs | 45 ++++- src/algorithms/nonparametric/npmap.rs | 115 ++++++++---- src/algorithms/nonparametric/npod.rs | 194 +++++++++++++------- src/api/error_models.rs | 6 + src/api/estimation_problem.rs | 172 ++++++++++++----- src/api/mod.rs | 4 + src/estimation/nonparametric/expansion.rs | 8 +- src/estimation/nonparametric/prior/latin.rs | 23 +-- src/estimation/nonparametric/prior/mod.rs | 73 +++----- src/estimation/nonparametric/prior/sobol.rs | 21 +-- src/estimation/nonparametric/result.rs | 13 +- src/estimation/nonparametric/summaries.rs | 1 - src/estimation/nonparametric/theta.rs | 22 +-- src/lib.rs | 5 +- src/model/mod.rs | 161 ++++++---------- src/model/parameter_space.rs | 159 +++++++++++----- src/model/variability.rs | 28 --- src/results/fit_result.rs | 77 ++++---- src/results/summary.rs | 1 - 20 files changed, 674 insertions(+), 541 deletions(-) delete mode 100644 src/model/variability.rs diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index d755f4436..1c6743aad 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -1,7 +1,9 @@ use std::fs; use std::path::Path; +use crate::api::{EstimationProblem, Framework}; use crate::estimation::nonparametric::{NonParametricResult, Psi, Theta}; +use crate::results::FitResult; use anyhow::Context; use anyhow::Result; @@ -14,66 +16,47 @@ use pharmsol::prelude::{data::Data, simulator::Equation}; use pharmsol::{Predictions, Subject}; use serde::{Deserialize, Serialize}; -// Module organization for algorithm types -pub mod nonparametric; -pub mod parametric; +/// Defines an algorithm capable of building an execution engine +pub trait Algorithm { + /// The strictly-typed runner struct (e.g., `NPAG`) + type Runner; -/// Algorithm type enumeration -/// -/// Lists every estimation algorithm implemented in `PMcore` together with its -/// configuration payload. Convert from a configuration struct via [`From`] -/// (e.g. `Algorithm::from(Npag::new())`) or pass the configuration directly to -/// [`EstimationProblemBuilder::method`](crate::api::EstimationProblemBuilder::method). -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum Algorithm { - /// Non-Parametric Adaptive Grid - NPAG(NpagConfig), - /// Non-Parametric Optimal Design - NPOD(NpodConfig), - /// Non-parametric Maximum a Posteriori probability reweighting - NPMAP(NpmapConfig), + /// Consumes the configuration and the problem to fully hydrate the runner state. + fn build_runner(self, problem: EstimationProblem) -> Result; } -impl Algorithm { - /// Check if this is a non-parametric algorithm - pub fn is_nonparametric(&self) -> bool { - matches!( - self, - Algorithm::NPAG(_) | Algorithm::NPOD(_) | Algorithm::NPMAP(_) - ) - } - - /// Short identifier (e.g. `"NPAG"`) suitable for logs and reports. - pub fn name(&self) -> &'static str { - match self { - Algorithm::NPAG(_) => "NPAG", - Algorithm::NPOD(_) => "NPOD", - Algorithm::NPMAP(_) => "NPMAP", - } - } -} +/// A trait for runners that can be executed to produce a fit result +pub trait Fitter { + /// The specific result struct (e.g., NonParametricResult) + type Output: FitResult; -impl std::fmt::Display for Algorithm { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str(self.name()) - } + /// Executes the optimization and returns the strictly-typed metrics. + fn fit(self) -> anyhow::Result; } -impl From for Algorithm { - fn from(value: NpagConfig) -> Self { - Algorithm::NPAG(value) - } -} +// Module organization for algorithm types +pub mod nonparametric; +pub mod parametric; -impl From for Algorithm { - fn from(value: NpodConfig) -> Self { - Algorithm::NPOD(value) +impl EstimationProblem { + /// The "Swap and Fit" API: + /// Consumes the problem and the algorithm configuration, builds the engine, + /// and runs it to completion automatically. + pub fn fit_with(self, algorithm: A) -> anyhow::Result<>::Output> + where + A: Algorithm, + A::Runner: Fitter, + { + algorithm.build_runner(self)?.fit() } -} - -impl From for Algorithm { - fn from(value: NpmapConfig) -> Self { - Algorithm::NPMAP(value) + /// The "Extract Structure" API: + /// Consumes the problem and configuration, returning the strictly-typed + /// execution runner (e.g., `NPAG`) for advanced inspection. + pub fn runner(self, algorithm: A) -> Result + where + A: Algorithm, + { + algorithm.build_runner(self) } } diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 4c720e14f..ef873f0ba 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,5 +1,5 @@ -use crate::algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}; -use crate::api::EstimationProblem; +use crate::algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}; +use crate::api::{EstimationProblem, NonParametric}; use crate::estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, }; @@ -7,6 +7,9 @@ use crate::model::ParameterSpace; pub(crate) use crate::estimation::nonparametric::ipm::burke; pub(crate) use crate::estimation::nonparametric::qr; +use crate::results::FitResult; + +use crate::model::parameter_space::NonParametricParameters; use anyhow::bail; use anyhow::Result; @@ -154,14 +157,14 @@ impl NPAG { equation: E, data: Data, error_models: AssayErrorModels, - parameter_space: &ParameterSpace, + parameters: &NonParametricParameters, config: NpagConfig, - ) -> Result> { - let ranges = parameter_space.finite_ranges()?; + ) -> Result { + let ranges = parameters.finite_ranges(); let gamma_delta = vec![config.error_step; error_models.len()]; let eps = config.eps; - Ok(Box::new(Self { + Ok(Self { equation, ranges, psi: Psi::new(), @@ -180,7 +183,7 @@ impl NPAG { cycle_log: CycleLog::new(), data, config, - })) + }) } } @@ -200,7 +203,6 @@ impl NonParametricAlgorithm for NPAG { self.cycle, self.status.clone(), self.cycle_log.clone(), - Algorithm::NPAG(NpagConfig::default()), ) } @@ -506,6 +508,33 @@ impl NonParametricAlgorithm for NPAG { } } +// 1. Tell the compiler that NpagConfig is a Non-Parametric Algorithm +impl Algorithm for NpagConfig { + type Runner = NPAG; + + fn build_runner(self, problem: EstimationProblem) -> Result { + // Here, problem.parameters is strictly NonParametricParameters + // and problem.error_models is strictly AssayErrorModels! + + NPAG::from_parts( + problem.model.equation.clone(), + problem.data.clone(), + problem.error_models.clone(), + &problem.parameters, + self, + ) + } +} + +impl Fitter for NPAG { + type Output = NonParametricResult; + + fn fit(mut self) -> anyhow::Result { + // Run NPAG... + self.into_workspace() // Returns NonParametricResult + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index 21289ea72..b4866ecc5 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -1,29 +1,43 @@ use crate::{ - algorithms::{NonParametricAlgorithm, Status, StopReason}, - api::EstimationProblem, + algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}, + api::{EstimationProblem, NonParametric}, estimation::nonparametric::{ - calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, + calculate_psi, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, }, - prelude::algorithms::Algorithm, + model::parameter_space::NonParametricParameters, }; -use anyhow::{Context, Result}; +use anyhow::{Context, Result}; use pharmsol::prelude::{ data::{AssayErrorModels, Data}, simulator::Equation, }; use crate::estimation::nonparametric::ipm::burke; - use serde::{Deserialize, Serialize}; /// Configuration options for the posterior probability reweighting algorithm. -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] -pub struct NpmapConfig; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct NpmapConfig { + pub prior: Prior, +} + +impl Default for NpmapConfig { + fn default() -> Self { + Self { + prior: Prior::default(), + } + } +} impl NpmapConfig { pub fn new() -> Self { - Self + Self::default() + } + + pub fn prior(mut self, prior: Prior) -> Self { + self.prior = prior; + self } } @@ -43,6 +57,33 @@ pub struct NPMAP { error_models: AssayErrorModels, } +impl NPMAP { + pub(crate) fn from_parts( + equation: E, + data: Data, + error_models: AssayErrorModels, + parameters: &NonParametricParameters, + config: NpmapConfig, + ) -> Result { + // Generate or load the initial support points from the prior + let theta = config.prior.theta(parameters)?; + + Ok(Self { + equation, + psi: Psi::new(), + theta, + w: Weights::default(), + objf: f64::INFINITY, + cycle: 0, + status: Status::Continue, + data, + config, + cyclelog: CycleLog::new(), + error_models, + }) + } +} + impl NonParametricAlgorithm for NPMAP { fn into_workspace(&self) -> Result> { NonParametricResult::new( @@ -55,9 +96,9 @@ impl NonParametricAlgorithm for NPMAP { self.cycle, self.status.clone(), self.cyclelog.clone(), - Algorithm::NPMAP(NpmapConfig::default()), ) } + fn error_models(&self) -> &AssayErrorModels { &self.error_models } @@ -126,6 +167,7 @@ impl NonParametricAlgorithm for NPMAP { fn condensation(&mut self) -> Result<()> { Ok(()) } + fn optimizations(&mut self) -> Result<()> { Ok(()) } @@ -149,29 +191,34 @@ impl NonParametricAlgorithm for NPMAP { } } -impl NPMAP { - pub(crate) fn from_input(input: EstimationProblem) -> Result> { - let config = match input.algorithm.clone() { - Algorithm::NPMAP(config) => config, - other => unreachable!( - "NPMAP::from_input requires an NPMAP algorithm, got {}", - other.name() - ), - }; - let error_models = input.error_models.models().clone(); - - Ok(Box::new(Self { - equation: input.model.equation, - psi: Psi::new(), - theta: Theta::new(), - w: Weights::default(), - objf: f64::INFINITY, - cycle: 0, - status: Status::Continue, - data: input.data, - config, - cyclelog: CycleLog::new(), - error_models, - })) +// ============================================================================== +// STRATEGY / ENGINE PIPELINE +// ============================================================================== + +impl Algorithm for NpmapConfig { + type Runner = NPMAP; + + fn build_runner(self, problem: EstimationProblem) -> Result { + NPMAP::from_parts( + problem.model.equation, + problem.data, + problem.error_models, + &problem.parameters, + self, + ) + } +} + +impl Fitter for NPMAP { + type Output = NonParametricResult; + + fn fit(mut self) -> Result { + // Since NPMAP is a single-pass algorithm, the execution loop is very simple: + self.estimation()?; + self.evaluation()?; + self.log_cycle_state(); + + // Return the strictly-typed NonParametricResult + self.into_workspace() } } diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 53e085e2f..3c3ecb9ae 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -1,11 +1,11 @@ -use crate::algorithms::{NonParametricAlgorithm, StopReason}; -use crate::api::EstimationProblem; -use crate::estimation::nonparametric::ipm::burke; -use crate::estimation::nonparametric::qr; -use crate::estimation::nonparametric::{ - calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, +use crate::{ + algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}, + api::{EstimationProblem, NonParametric}, + estimation::nonparametric::{ + calculate_psi, ipm::burke, qr, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, + }, + model::parameter_space::NonParametricParameters, }; -use crate::{algorithms::Status, prelude::algorithms::Algorithm}; use pharmsol::ParameterOptimizer; use anyhow::bail; @@ -42,6 +42,16 @@ impl NpodConfig { progress: false, } } + + pub fn max_cycles(mut self, cycles: usize) -> Self { + self.max_cycles = cycles; + self + } + + pub fn prior(mut self, prior: Theta) -> Self { + self.prior = prior; + self + } } pub struct NPOD { @@ -62,6 +72,78 @@ pub struct NPOD { config: NpodConfig, } +impl NPOD { + pub(crate) fn from_parts( + equation: E, + data: Data, + error_models: AssayErrorModels, + _parameters: &NonParametricParameters, // Kept for trait symmetry, even if NPOD uses config.prior directly + config: NpodConfig, + ) -> Result { + let gamma_delta = vec![0.1; error_models.len()]; + + Ok(Self { + equation, + psi: Psi::new(), + theta: config.prior.clone(), // Initialize grid from config + lambda: Weights::default(), + w: Weights::default(), + last_objf: -1e30, + objf: f64::NEG_INFINITY, + cycle: 0, + gamma_delta, + error_models, + converged: false, + status: Status::Continue, + cycle_log: CycleLog::new(), + data, + config, + }) + } + + fn validate_psi(&mut self) -> Result<()> { + let mut psi = self.psi().matrix().to_owned(); + // First coerce all NaN and infinite in psi to 0.0 + let mut has_bad_values = false; + for i in 0..psi.nrows() { + for j in 0..psi.ncols() { + let val = psi[(i, j)]; + if val.is_nan() || val.is_infinite() { + has_bad_values = true; + psi[(i, j)] = 0.0; + } + } + } + if has_bad_values { + tracing::warn!("Psi contains NaN or Inf values, coercing to 0.0"); + } + + // Calculate row sums and check for zero-probability subjects + let nrows = psi.nrows(); + let ncols = psi.ncols(); + let indices: Vec = (0..nrows) + .filter(|&i| { + let row_sum: f64 = (0..ncols).map(|j| psi[(i, j)]).sum(); + let w: f64 = 1.0 / row_sum; + w.is_nan() || w.is_infinite() + }) + .collect(); + + // If any elements in `w` are NaN or infinite, return the subject IDs for each index + if !indices.is_empty() { + let subject: Vec<&Subject> = self.data.subjects(); + let zero_probability_subjects: Vec<&String> = + indices.iter().map(|&i| subject[i].id()).collect(); + + return Err(anyhow::anyhow!( + "The probability of one or more subjects, given the model, is zero. The following subjects have zero probability: {:?}", zero_probability_subjects + )); + } + + Ok(()) + } +} + impl NonParametricAlgorithm for NPOD { fn into_workspace(&self) -> Result> { NonParametricResult::new( @@ -74,7 +156,6 @@ impl NonParametricAlgorithm for NPOD { self.cycle, self.status.clone(), self.cycle_log.clone(), - Algorithm::NPOD(NpodConfig::default()), ) } @@ -367,76 +448,47 @@ impl NonParametricAlgorithm for NPOD { } } -impl NPOD { - pub(crate) fn from_input(input: EstimationProblem) -> Result> { - let config = match input.algorithm.clone() { - Algorithm::NPOD(config) => config, - other => unreachable!( - "NPOD::from_input requires an NPOD algorithm, got {}", - other.name() - ), - }; - let error_models = input.error_models.models().clone(); - let gamma_delta = vec![0.1; error_models.len()]; +// ============================================================================== +// STRATEGY / ENGINE PIPELINE +// ============================================================================== - Ok(Box::new(Self { - equation: input.model.equation, - psi: Psi::new(), - theta: Theta::new(), - lambda: Weights::default(), - w: Weights::default(), - last_objf: -1e30, - objf: f64::NEG_INFINITY, - cycle: 0, - gamma_delta, - error_models, - converged: false, - status: Status::Continue, - cycle_log: CycleLog::new(), - data: input.data, - config, - })) +impl Algorithm for NpodConfig { + type Runner = NPOD; + + fn build_runner(self, problem: EstimationProblem) -> Result { + NPOD::from_parts( + problem.model.equation, + problem.data, + problem.error_models, + &problem.parameters, + self, + ) } +} - fn validate_psi(&mut self) -> Result<()> { - let mut psi = self.psi().matrix().to_owned(); - // First coerce all NaN and infinite in psi to 0.0 - let mut has_bad_values = false; - for i in 0..psi.nrows() { - for j in 0..psi.ncols() { - let val = psi[(i, j)]; - if val.is_nan() || val.is_infinite() { - has_bad_values = true; - psi[(i, j)] = 0.0; - } - } - } - if has_bad_values { - tracing::warn!("Psi contains NaN or Inf values, coercing to 0.0"); - } +impl Fitter for NPOD { + type Output = NonParametricResult; - // Calculate row sums and check for zero-probability subjects - let nrows = psi.nrows(); - let ncols = psi.ncols(); - let indices: Vec = (0..nrows) - .filter(|&i| { - let row_sum: f64 = (0..ncols).map(|j| psi[(i, j)]).sum(); - let w: f64 = 1.0 / row_sum; - w.is_nan() || w.is_infinite() - }) - .collect(); + fn fit(mut self) -> Result { + // Standard iterative execution loop for non-parametric evaluation + self.increment_cycle(); + self.estimation()?; - // If any elements in `w` are NaN or infinite, return the subject IDs for each index - if !indices.is_empty() { - let subject: Vec<&Subject> = self.data.subjects(); - let zero_probability_subjects: Vec<&String> = - indices.iter().map(|&i| subject[i].id()).collect(); + loop { + let status = self.evaluation()?; + if let Status::Stop(_) = status { + break; + } - return Err(anyhow::anyhow!( - "The probability of one or more subjects, given the model, is zero. The following subjects have zero probability: {:?}", zero_probability_subjects - )); + self.condensation()?; + self.expansion()?; + self.optimizations()?; + + self.increment_cycle(); + self.estimation()?; } - Ok(()) + // Return the strictly-typed NonParametricResult + self.into_workspace() } } diff --git a/src/api/error_models.rs b/src/api/error_models.rs index 20e9767c8..4dcc27b5b 100644 --- a/src/api/error_models.rs +++ b/src/api/error_models.rs @@ -18,3 +18,9 @@ impl ErrorModels { self.models().iter().next().is_none() } } + +impl Into for ErrorModels { + fn into(self) -> AssayErrorModels { + self.models().clone() + } +} diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index b061eff22..919ec5242 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -1,94 +1,121 @@ use anyhow::{anyhow, Result}; -use pharmsol::{AssayErrorModel, AssayErrorModels, Data, Equation}; +use pharmsol::{ + AssayErrorModel, AssayErrorModels, Data, Equation, ResidualErrorModel, ResidualErrorModels, +}; use crate::algorithms::Algorithm; use crate::api::error_models::ErrorModels; -use crate::model::{EquationMetadataSource, Model, ModelBuilder, Parameter, ParameterSpace}; +use crate::model::parameter_space::{ + BoundedParameter, NonParametricParameters, ParametricParameters, UnboundedParameter, +}; +use crate::model::{EquationMetadataSource, Model, ModelBuilder, ParameterSpace}; use crate::results::FitResult; +// 1. The Markers +pub trait Framework { + type ErrorModels; + type Parameters; +} +pub struct Parametric; +impl Framework for Parametric { + // When we are Parametric, it strictly uses the parametric version + type ErrorModels = ResidualErrorModels; + type Parameters = ParametricParameters; +} +pub struct NonParametric; + +impl Framework for NonParametric { + // When we are Non-Parametric, the error model type is strictly AssayErrorModels + type ErrorModels = AssayErrorModels; + type Parameters = NonParametricParameters; +} + #[derive(Debug, Clone)] -pub struct EstimationProblem { +pub struct EstimationProblem { pub(crate) model: Model, pub(crate) data: Data, - pub(crate) error_models: ErrorModels, - pub(crate) algorithm: Algorithm, - pub(crate) parameters: ParameterSpace, + pub(crate) error_models: F::ErrorModels, + pub(crate) parameters: F::Parameters, } -impl EstimationProblem { - pub fn builder(equation: E, data: Data) -> EstimationProblemBuilder { - EstimationProblemBuilder { - model: Model::builder(equation), - data, - parameters: ParameterSpace::new(), - algorithm: None, +pub struct EstimationProblemBuilder { + model: ModelBuilder, + data: Data, +} + +impl EstimationProblemBuilder { + /// Fork into a strictly Non-Parametric problem definition + pub fn nonparametric(self) -> NonParametricBuilder { + NonParametricBuilder { + model: self.model, + data: self.data, + parameters: NonParametricParameters::new(), + error_models: Vec::new(), + } + } + + /// Fork into a strictly Parametric problem definition + pub fn parametric(self) -> ParametricBuilder { + ParametricBuilder { + model: self.model, + data: self.data, + parameters: ParametricParameters::new(), error_models: Vec::new(), } } } -impl EstimationProblem { - pub fn fit(self) -> Result> { - unimplemented!("fit method is not implemented yet") +impl EstimationProblem { + /// Starts building an estimation problem. + /// Note: You must call `.nonparametric()` or `.parametric()` to proceed. + pub fn builder(equation: E, data: Data) -> EstimationProblemBuilder { + EstimationProblemBuilder { + model: Model::builder(equation), + data, + } } } -pub struct EstimationProblemBuilder { +pub struct NonParametricBuilder { model: ModelBuilder, data: Data, - parameters: ParameterSpace, - algorithm: Option, + parameters: NonParametricParameters, error_models: Vec<(String, AssayErrorModel)>, } -impl EstimationProblemBuilder { - pub fn algorithm(mut self, algorithm: impl Into) -> Self { - self.algorithm = Some(algorithm.into()); - self - } - - /// Add a single parameter - pub fn parameter(mut self, parameter: Parameter) -> Self { +impl NonParametricBuilder { + pub fn parameter(mut self, parameter: BoundedParameter) -> Self { self.parameters.push(parameter); self } - /// Batch add multiple parameters - pub fn parameters(mut self, parameters: impl IntoIterator) -> Self { + pub fn parameters(mut self, parameters: impl IntoIterator) -> Self { for param in parameters { self.parameters.push(param); } self } - /// Add an error model - // TODO: result pub fn error(mut self, name: impl Into, model: AssayErrorModel) -> Self { self.error_models.push((name.into(), model)); self } - // Helper for mapping the internal model builder if needed fn with_model_builder(mut self, map: impl FnOnce(ModelBuilder) -> ModelBuilder) -> Self { self.model = map(self.model); self } } -impl EstimationProblemBuilder { - /// Validates all parameters and constructs the problem - pub fn build(self) -> Result> { - let algorithm = self - .algorithm - .ok_or_else(|| anyhow!("an algorithm must be selected before building"))?; - +impl NonParametricBuilder { + pub fn build(self) -> Result> { if self.parameters.is_empty() { - anyhow::bail!("at least one parameter is required"); + anyhow::bail!("at least one parameter is required for non-parametric models"); } if self.error_models.is_empty() { - anyhow::bail!("at least one error model is required"); + anyhow::bail!("at least one assay error model is required"); } let mut all_errors = AssayErrorModels::new(); @@ -101,21 +128,66 @@ impl EstimationProblemBuilder { all_errors = all_errors.add(outeq, error_model)?; } - let model = self.model.build()?; - Ok(EstimationProblem { - model, + model: self.model.build()?, data: self.data, - error_models: ErrorModels::Nonparametric(all_errors), - algorithm, + error_models: all_errors, // Strongly typed as AssayErrorModels! parameters: self.parameters, }) } } -impl EstimationProblemBuilder { - /// Attempts to build the problem and immediately fit it - pub fn fit(self) -> Result> { - self.build()?.fit() +pub struct ParametricBuilder { + model: ModelBuilder, + data: Data, + parameters: ParametricParameters, + error_models: Vec<(String, ResidualErrorModel)>, +} + +impl ParametricBuilder { + pub fn parameter(mut self, parameter: UnboundedParameter) -> Self { + self.parameters.push(parameter); + self + } + + pub fn parameters(mut self, parameters: impl IntoIterator) -> Self { + for param in parameters { + self.parameters.push(param); + } + self + } + + pub fn error(mut self, name: impl Into, model: ResidualErrorModel) -> Self { + self.error_models.push((name.into(), model)); + self + } +} + +impl ParametricBuilder { + pub fn build(self) -> Result> { + if self.parameters.is_empty() { + anyhow::bail!("at least one parameter is required for parametric models"); + } + + if self.error_models.is_empty() { + anyhow::bail!("at least one residual error model is required"); + } + + let mut all_errors = ResidualErrorModels::new(); + for (name, error_model) in self.error_models { + let outeq = self + .model + .output_index(&name) + .ok_or_else(|| anyhow!("unknown equation output label: {name}"))?; + + all_errors = all_errors.add(outeq, error_model); + } + + Ok(EstimationProblem { + model: self.model.build()?, + data: self.data, + error_models: all_errors, // Strongly typed as ResidualErrorModels! + parameters: self.parameters, + }) } } diff --git a/src/api/mod.rs b/src/api/mod.rs index a7fc820bb..62d4044fb 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -8,3 +8,7 @@ pub use error_models::ErrorModels; pub use estimation_problem::{EstimationProblem, EstimationProblemBuilder}; pub use progress::{FitProgress, NonparametricCycleProgress}; + +pub use estimation_problem::Framework; +pub use estimation_problem::NonParametric; +pub use estimation_problem::Parametric; diff --git a/src/estimation/nonparametric/expansion.rs b/src/estimation/nonparametric/expansion.rs index 63d058a1f..d23816b20 100644 --- a/src/estimation/nonparametric/expansion.rs +++ b/src/estimation/nonparametric/expansion.rs @@ -45,14 +45,14 @@ pub fn adaptative_grid( #[cfg(test)] mod tests { use super::*; - use crate::model::{Parameter, ParameterSpace}; + use crate::model::{BoundedParameter, NonParametricParameters}; use faer::mat; #[test] fn adaptive_grid_expands_points_within_bounds() { - let parameters = ParameterSpace::new() - .add(Parameter::bounded("x", 0.0, 1.0)) - .add(Parameter::bounded("y", 0.0, 1.0)); + let parameters = NonParametricParameters::new() + .add(BoundedParameter::new("x", 0.0, 1.0)) + .add(BoundedParameter::new("y", 0.0, 1.0)); let mut theta = Theta::from_parts(mat![[0.5, 0.5]], parameters).unwrap(); let ranges = [(0.0, 1.0), (0.0, 1.0)]; diff --git a/src/estimation/nonparametric/prior/latin.rs b/src/estimation/nonparametric/prior/latin.rs index a58c0e94c..9d503d189 100644 --- a/src/estimation/nonparametric/prior/latin.rs +++ b/src/estimation/nonparametric/prior/latin.rs @@ -4,15 +4,10 @@ use rand::prelude::*; use rand::rngs::StdRng; use crate::estimation::nonparametric::Theta; -use crate::model::ParameterSpace; - -pub fn generate( - parameters: impl Into, - points: usize, - seed: usize, -) -> Result { - let parameters = parameters.into(); - let ranges = parameters.finite_ranges()?; +use crate::model::NonParametricParameters; + +pub fn generate(parameters: &NonParametricParameters, points: usize, seed: usize) -> Result { + let ranges = parameters.finite_ranges(); let mut rng = StdRng::seed_from_u64(seed as u64); let mut intervals = Vec::new(); @@ -36,14 +31,14 @@ pub fn generate( #[cfg(test)] mod tests { use super::*; - use crate::model::{Parameter, ParameterSpace}; + use crate::model::{BoundedParameter, NonParametricParameters}; #[test] fn latin_generate_produces_requested_shape() { - let params = ParameterSpace::new() - .add(Parameter::bounded("a", 0.0, 1.0)) - .add(Parameter::bounded("b", 0.0, 1.0)) - .add(Parameter::bounded("c", 0.0, 1.0)); + let params = NonParametricParameters::new() + .add(BoundedParameter::new("a", 0.0, 1.0)) + .add(BoundedParameter::new("b", 0.0, 1.0)) + .add(BoundedParameter::new("c", 0.0, 1.0)); let theta = generate(¶ms, 10, 22).unwrap(); assert_eq!(theta.nspp(), 10); diff --git a/src/estimation/nonparametric/prior/mod.rs b/src/estimation/nonparametric/prior/mod.rs index bb8448a67..61f727dd0 100644 --- a/src/estimation/nonparametric/prior/mod.rs +++ b/src/estimation/nonparametric/prior/mod.rs @@ -1,7 +1,7 @@ use std::fs::File; use crate::estimation::nonparametric::{Theta, Weights}; -use crate::model::{ParameterDomain, ParameterSpace}; +use crate::model::{NonParametricParameters, ParameterDomain, ParameterSpace}; use anyhow::{bail, Context, Result}; use faer::Mat; use serde::{Deserialize, Serialize}; @@ -73,50 +73,28 @@ impl Prior { } } - pub fn theta(&self, parameters: ParameterSpace) -> Result { - let parameter_space: ParameterSpace = parameters.into(); - - for parameter in parameter_space.iter() { - let (lower, upper) = match parameter.domain { - ParameterDomain::Bounded { lower, upper } => (lower, upper), - ParameterDomain::Positive { - lower: Some(lower), - upper: Some(upper), - } - | ParameterDomain::Unbounded { - lower: Some(lower), - upper: Some(upper), - } => (lower, upper), - _ => bail!( - "Parameter '{}' is missing finite bounds required for nonparametric initialization", - parameter.name - ), - }; - - if lower.is_infinite() || upper.is_infinite() { + pub fn theta(&self, parameters: &NonParametricParameters) -> Result { + // 1. Validation is mostly gone! We just check logic, not type structure. + for parameter in parameters.iter() { + if parameter.lower >= parameter.upper { bail!( - "Parameter '{}' has infinite bounds: [{}, {}]", + "Parameter '{}' has invalid bounds: [{}, {}]. Lower bound must be less than upper bound.", parameter.name, - lower, - upper + parameter.lower, + parameter.upper ); } - - if lower >= upper { - bail!( - "Parameter '{}' has invalid bounds: [{}, {}]. Lower bound must be less than upper bound.", - parameter.name, - lower, - upper - ); - } } + // 2. Generation + // Note: You will need to update `sobol::generate` and `latin::generate` + // in their respective modules to accept `&NonParametricParameters`. let prior = match self { - Prior::Sobol(points, seed) => sobol::generate(¶meter_space, *points, *seed)?, - Prior::Latin(points, seed) => latin::generate(¶meter_space, *points, *seed)?, - Prior::Theta(theta) => return Ok(theta.clone()), + Prior::Sobol(points, seed) => sobol::generate(parameters, *points, *seed)?, + Prior::Latin(points, seed) => latin::generate(parameters, *points, *seed)?, + Prior::Theta(theta) => theta.clone(), }; + Ok(prior) } } @@ -129,7 +107,7 @@ impl Default for Prior { pub fn read_prior( path: impl AsRef, - parameters: impl Into, + parameters: NonParametricParameters, ) -> Result<(Theta, Option)> { let path = path.as_ref().to_string(); parse_prior_for_parameters(&path, parameters) @@ -137,9 +115,8 @@ pub fn read_prior( pub(crate) fn parse_prior_for_parameters( path: &String, - parameters: impl Into, + parameters: NonParametricParameters, ) -> Result<(Theta, Option)> { - let parameters = parameters.into(); tracing::info!("Reading prior from {}", path); let file = File::open(path).context(format!("Unable to open the prior file '{}'", path))?; let mut reader = csv::ReaderBuilder::new() @@ -223,13 +200,13 @@ pub(crate) fn parse_prior_for_parameters( #[cfg(test)] mod tests { use super::*; - use crate::model::{Parameter, ParameterSpace}; + use crate::model::BoundedParameter; use std::fs; - fn parameter_space() -> ParameterSpace { - ParameterSpace::new() - .add(Parameter::bounded("ke", 0.1, 1.0)) - .add(Parameter::bounded("v", 5.0, 50.0)) + fn parameters() -> NonParametricParameters { + NonParametricParameters::new() + .add(BoundedParameter::new("ke", 0.1, 1.0)) + .add(BoundedParameter::new("v", 5.0, 50.0)) } fn temp_csv_path() -> String { @@ -238,7 +215,7 @@ mod tests { #[test] fn sample_space_generates_expected_shape() { - let theta = Prior::sobol(10, 42).theta(parameter_space()).unwrap(); + let theta = Prior::sobol(10, 42).theta(¶meters()).unwrap(); assert_eq!(theta.nspp(), 10); assert_eq!(theta.matrix().ncols(), 2); } @@ -248,7 +225,7 @@ mod tests { let path = temp_csv_path(); fs::write(&path, "v,ke,prob\n10.0,0.5,0.3\n15.0,0.7,0.7\n").unwrap(); - let (theta, weights) = read_prior(&path, parameter_space()).unwrap(); + let (theta, weights) = read_prior(&path, parameters()).unwrap(); let _ = fs::remove_file(&path); assert_eq!(theta.nspp(), 2); @@ -266,7 +243,7 @@ mod tests { let path = temp_csv_path(); fs::write(&path, "ke,v,extra\n0.5,10.0,1.0\n").unwrap(); - let err = read_prior(&path, parameter_space()).unwrap_err(); + let err = read_prior(&path, parameters()).unwrap_err(); let _ = fs::remove_file(&path); assert!(err diff --git a/src/estimation/nonparametric/prior/sobol.rs b/src/estimation/nonparametric/prior/sobol.rs index 61a162fb3..c2fb47e9c 100644 --- a/src/estimation/nonparametric/prior/sobol.rs +++ b/src/estimation/nonparametric/prior/sobol.rs @@ -3,16 +3,11 @@ use faer::Mat; use sobol_burley::sample; use crate::estimation::nonparametric::Theta; -use crate::model::ParameterSpace; +use crate::model::NonParametricParameters; -pub fn generate( - parameters: impl Into, - points: usize, - seed: usize, -) -> Result { - let parameters = parameters.into(); +pub fn generate(parameters: &NonParametricParameters, points: usize, seed: usize) -> Result { let seed = seed as u32; - let ranges = parameters.finite_ranges()?; + let ranges = parameters.finite_ranges(); let rand_matrix = Mat::from_fn(points, ranges.len(), |i, j| { let unscaled = sample((i).try_into().unwrap(), j.try_into().unwrap(), seed) as f64; @@ -26,14 +21,14 @@ pub fn generate( #[cfg(test)] mod tests { use super::*; - use crate::model::{Parameter, ParameterSpace}; + use crate::model::BoundedParameter; #[test] fn sobol_generate_produces_requested_shape() { - let params = ParameterSpace::new() - .add(Parameter::bounded("a", 0.0, 1.0)) - .add(Parameter::bounded("b", 0.0, 1.0)) - .add(Parameter::bounded("c", 0.0, 1.0)); + let params = NonParametricParameters::new() + .add(BoundedParameter::new("a", 0.0, 1.0)) + .add(BoundedParameter::new("b", 0.0, 1.0)) + .add(BoundedParameter::new("c", 0.0, 1.0)); let theta = generate(¶ms, 10, 22).unwrap(); assert_eq!(theta.nspp(), 10); diff --git a/src/estimation/nonparametric/result.rs b/src/estimation/nonparametric/result.rs index bf7954632..cf261a1e8 100644 --- a/src/estimation/nonparametric/result.rs +++ b/src/estimation/nonparametric/result.rs @@ -6,7 +6,7 @@ use crate::algorithms::{Algorithm, Status, StopReason}; use crate::estimation::nonparametric::{ posterior, CycleLog, NPPredictions, Posterior, Psi, Theta, Weights, }; -use crate::results::FitResult; + use pharmsol::Data; #[derive(Debug)] @@ -22,7 +22,6 @@ pub struct NonParametricResult { cyclelog: CycleLog, predictions: Option, posterior: Posterior, - algorithm: Algorithm, } impl NonParametricResult { @@ -37,7 +36,6 @@ impl NonParametricResult { cycles: usize, status: Status, cyclelog: CycleLog, - algorithm: Algorithm, ) -> anyhow::Result { let posterior = posterior::posterior(&psi, &weights)?; @@ -53,7 +51,6 @@ impl NonParametricResult { cyclelog, predictions: None, posterior, - algorithm, }) } @@ -85,10 +82,6 @@ impl NonParametricResult { &self.cyclelog } - pub(crate) fn algorithm(&self) -> &Algorithm { - &self.algorithm - } - pub fn predictions(&self) -> Option<&NPPredictions> { self.predictions.as_ref() } @@ -255,8 +248,4 @@ impl NonParametricResult { writer.flush()?; Ok(()) } - - pub fn into_fit_result(self) -> FitResult { - FitResult::Nonparametric(self) - } } diff --git a/src/estimation/nonparametric/summaries.rs b/src/estimation/nonparametric/summaries.rs index 452b1bdbc..6d979aaef 100644 --- a/src/estimation/nonparametric/summaries.rs +++ b/src/estimation/nonparametric/summaries.rs @@ -13,7 +13,6 @@ pub fn fit_summary(result: &NonParametricResult) -> FitSummary { subject_count: result.data().subjects().len(), observation_count: count_observations(result.data()), parameter_count: result.get_theta().parameters().len(), - algorithm: result.algorithm().to_string(), } } diff --git a/src/estimation/nonparametric/theta.rs b/src/estimation/nonparametric/theta.rs index 2d5052bd3..b2482848c 100644 --- a/src/estimation/nonparametric/theta.rs +++ b/src/estimation/nonparametric/theta.rs @@ -5,7 +5,7 @@ use faer::Mat; use serde::{Deserialize, Serialize}; use super::weights::Weights; -use crate::model::ParameterSpace; +use crate::model::{NonParametricParameters, ParameterSpace}; /// [Theta] is a structure that holds the support points /// These represent the joint population parameter distribution @@ -14,14 +14,14 @@ use crate::model::ParameterSpace; #[derive(Clone, PartialEq)] pub struct Theta { matrix: Mat, - parameters: ParameterSpace, + parameters: NonParametricParameters, } impl Default for Theta { fn default() -> Self { Theta { matrix: Mat::new(), - parameters: ParameterSpace::new(), + parameters: NonParametricParameters::new(), } } } @@ -37,8 +37,7 @@ impl Theta { /// in the [ParameterSpace] /// /// The order of parameters in the [ParameterSpace] should match the order of columns in the matrix - pub fn from_parts(matrix: Mat, parameters: impl Into) -> Result { - let parameters = parameters.into(); + pub fn from_parts(matrix: Mat, parameters: NonParametricParameters) -> Result { if matrix.ncols() != parameters.len() { bail!( "Number of columns in matrix ({}) does not match number of parameters ({})", @@ -63,12 +62,12 @@ impl Theta { } /// Get the [ParameterSpace] associated with this [Theta] - pub fn parameters(&self) -> &ParameterSpace { + pub fn parameters(&self) -> &NonParametricParameters { &self.parameters } /// Get a mutable reference to the [ParameterSpace] - pub fn parameters_mut(&mut self) -> &mut ParameterSpace { + pub fn parameters_mut(&mut self) -> &mut NonParametricParameters { &mut self.parameters } @@ -124,10 +123,7 @@ impl Theta { return true; } - let limits = self - .parameters - .finite_ranges() - .expect("theta requires finite parameter bounds"); + let limits = self.parameters.finite_ranges(); for row_idx in 0..self.matrix.nrows() { let mut squared_dist = 0.0; @@ -226,7 +222,7 @@ impl Theta { } let mat = Mat::from_fn(nrows, ncols, |i, j| rows[i][j]); - let parameters = ParameterSpace::new(); + let parameters = NonParametricParameters::new(); Theta::from_parts(mat, parameters) } @@ -281,7 +277,7 @@ impl<'de> Deserialize<'de> for Theta { #[derive(Deserialize)] struct ThetaSerde { matrix: Vec>, - parameters: ParameterSpace, + parameters: NonParametricParameters, } let decoded = ThetaSerde::deserialize(deserializer)?; diff --git a/src/lib.rs b/src/lib.rs index 1cec061b3..b0274389b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,9 +68,8 @@ pub mod prelude { CycleLog, NPCycle, NPPredictions, NonParametricResult, Posterior, Psi, Theta, Weights, }; pub use crate::model::{ - EquationMetadataSource, ModelMetadata, Parameter, ParameterDomain, ParameterSpace, - ParameterTransform as ModelParameterTransform, ParameterVariability, RandomEffectsSpec, - VariabilityModel, + EquationMetadataSource, ModelMetadata, ParameterDomain, ParameterSpace, + ParameterTransform as ModelParameterTransform, }; pub use crate::results::{ FitResult, FitSummary, IndividualSummary, ParameterSummary, PopulationSummary, diff --git a/src/model/mod.rs b/src/model/mod.rs index 28bad4b4d..0a9176fa4 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -1,29 +1,28 @@ use anyhow::{anyhow, bail, Result}; use pharmsol::equation::Equation; use pharmsol::{Analytical, ValidatedModelMetadata, ODE, SDE}; +use std::collections::HashSet; pub mod metadata; pub mod parameter_space; -pub mod variability; pub use metadata::ModelMetadata; +// Re-exporting the new typestate parameter elements for easy access downstream pub use parameter_space::{ - Parameter, ParameterDomain, ParameterSpace, ParameterTransform, ParameterVariability, + BoundedParameter, NonParametricParameters, ParameterDomain, ParameterSpace, ParameterTransform, + ParametricParameters, UnboundedParameter, }; -pub use variability::{CovarianceStructure, RandomEffectsSpec, VariabilityModel}; #[derive(Debug, Clone)] pub struct Model { pub equation: E, - pub parameters: ParameterSpace, + // Note: No 'parameters' field here! It is now managed by EstimationProblem. + // This struct is ready to hold Covariates or Variability specs if you add them later. } impl Model { pub fn builder(equation: E) -> ModelBuilder { - ModelBuilder { - equation, - parameters: ParameterSpace::new(), - } + ModelBuilder { equation } } } @@ -72,35 +71,12 @@ impl Model { pub struct ModelBuilder { equation: E, - parameters: ParameterSpace, } impl ModelBuilder { - pub fn parameter(mut self, parameter: Parameter) -> Result - where - E: EquationMetadataSource, - { - validate_parameter(&self.equation, &self.parameters, ¶meter)?; - self.parameters.push(parameter); - Ok(self) - } - - pub fn build(self) -> Result> - where - E: EquationMetadataSource, - { - let ModelBuilder { - equation, - parameters, - } = self; - - if parameters.is_empty() { - bail!("model parameters cannot be empty"); - } - + pub fn build(self) -> Result> { Ok(Model { - equation, - parameters, + equation: self.equation, }) } } @@ -116,28 +92,30 @@ impl ModelBuilder { } } -fn validate_parameter( +/// A generic validation function that can be called by either the +/// NonParametricBuilder or the ParametricBuilder during `.build()`. +pub(crate) fn validate_parameter_names<'a, E: EquationMetadataSource>( equation: &E, - existing: &ParameterSpace, - parameter: &Parameter, + names: impl Iterator, ) -> Result<()> { let metadata = equation .equation_metadata() .ok_or_else(|| anyhow!("equation metadata is required to define model parameters"))?; - if parameter.name.trim().is_empty() { - bail!("model parameter name cannot be empty"); - } + let mut seen = HashSet::new(); - if metadata.parameter_index(¶meter.name).is_none() { - bail!("unknown equation parameter: {}", parameter.name); - } + for name in names { + if name.trim().is_empty() { + bail!("model parameter name cannot be empty"); + } + + if metadata.parameter_index(name).is_none() { + bail!("unknown equation parameter: {}", name); + } - if existing - .iter() - .any(|existing_parameter| existing_parameter.name == parameter.name) - { - bail!("duplicate model parameter: {}", parameter.name); + if !seen.insert(name) { + bail!("duplicate model parameter: {}", name); + } } Ok(()) @@ -147,62 +125,37 @@ pub trait EquationMetadataSource: Equation { fn equation_metadata(&self) -> Option<&ValidatedModelMetadata>; } -impl EquationMetadataSource for ODE { - fn equation_metadata(&self) -> Option<&ValidatedModelMetadata> { - self.metadata() - } -} - -impl EquationMetadataSource for Analytical { - fn equation_metadata(&self) -> Option<&ValidatedModelMetadata> { - self.metadata() - } +// Macro for standard pharmsol equations +macro_rules! impl_metadata_opt { + ($($t:ty),+) => { + $(impl EquationMetadataSource for $t { + fn equation_metadata(&self) -> Option<&ValidatedModelMetadata> { + self.metadata() + } + })+ + }; } - -impl EquationMetadataSource for SDE { - fn equation_metadata(&self) -> Option<&ValidatedModelMetadata> { - self.metadata() - } -} - -#[cfg(any( - feature = "dsl-jit", - all(feature = "dsl-aot", feature = "dsl-aot-load"), - all( - feature = "dsl-wasm", - not(all(target_arch = "wasm32", target_os = "unknown")) - ) -))] -impl EquationMetadataSource for pharmsol::dsl::RuntimeOdeModel { - fn equation_metadata(&self) -> Option<&ValidatedModelMetadata> { - Some(self.metadata()) - } -} - -#[cfg(any( - feature = "dsl-jit", - all(feature = "dsl-aot", feature = "dsl-aot-load"), - all( - feature = "dsl-wasm", - not(all(target_arch = "wasm32", target_os = "unknown")) - ) -))] -impl EquationMetadataSource for pharmsol::dsl::RuntimeAnalyticalModel { - fn equation_metadata(&self) -> Option<&ValidatedModelMetadata> { - Some(self.metadata()) - } -} - -#[cfg(any( - feature = "dsl-jit", - all(feature = "dsl-aot", feature = "dsl-aot-load"), - all( - feature = "dsl-wasm", - not(all(target_arch = "wasm32", target_os = "unknown")) - ) -))] -impl EquationMetadataSource for pharmsol::dsl::RuntimeSdeModel { - fn equation_metadata(&self) -> Option<&ValidatedModelMetadata> { - Some(self.metadata()) - } +impl_metadata_opt!(ODE, Analytical, SDE); + +// Macro for runtime/JIT models +macro_rules! impl_metadata_some { + ($($t:ty),+) => { + $( + #[cfg(any( + feature = "dsl-jit", + all(feature = "dsl-aot", feature = "dsl-aot-load"), + all(feature = "dsl-wasm", not(all(target_arch = "wasm32", target_os = "unknown"))) + ))] + impl EquationMetadataSource for $t { + fn equation_metadata(&self) -> Option<&ValidatedModelMetadata> { + Some(self.metadata()) + } + } + )+ + }; } +impl_metadata_some!( + pharmsol::dsl::RuntimeOdeModel, + pharmsol::dsl::RuntimeAnalyticalModel, + pharmsol::dsl::RuntimeSdeModel +); diff --git a/src/model/parameter_space.rs b/src/model/parameter_space.rs index 4bf846433..bb4aa6855 100644 --- a/src/model/parameter_space.rs +++ b/src/model/parameter_space.rs @@ -1,22 +1,69 @@ -use anyhow::{bail, Result}; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct ParameterSpace { - pub items: Vec, +pub enum ParameterSpace { + NonParametric(NonParametricParameters), + Parametric(ParametricParameters), } impl ParameterSpace { + /// Returns the total number of parameters across either variant + pub fn len(&self) -> usize { + match self { + Self::NonParametric(p) => p.len(), + Self::Parametric(p) => p.len(), + } + } + + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + /// Retrieves the names of the parameters, regardless of the framework + pub fn names(&self) -> Vec { + match self { + Self::NonParametric(p) => p.names(), + Self::Parametric(p) => p.names(), + } + } + + /// Convenience accessor for the non-parametric inner struct + pub fn as_nonparametric(&self) -> Option<&NonParametricParameters> { + match self { + Self::NonParametric(p) => Some(p), + Self::Parametric(_) => None, + } + } + + /// Convenience accessor for the parametric inner struct + pub fn as_parametric(&self) -> Option<&ParametricParameters> { + match self { + Self::Parametric(p) => Some(p), + Self::NonParametric(_) => None, + } + } +} + +// ========================================================================= +// NON-PARAMETRIC IMPLEMENTATIONS +// ========================================================================= + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct NonParametricParameters { + pub items: Vec, +} + +impl NonParametricParameters { pub fn new() -> Self { Self { items: Vec::new() } } - pub fn push(&mut self, item: Parameter) { + pub fn push(&mut self, item: BoundedParameter) { self.items.push(item); } #[allow(clippy::should_implement_trait)] - pub fn add(mut self, item: Parameter) -> Self { + pub fn add(mut self, item: BoundedParameter) -> Self { self.push(item); self } @@ -29,7 +76,7 @@ impl ParameterSpace { self.items.is_empty() } - pub fn iter(&self) -> std::slice::Iter<'_, Parameter> { + pub fn iter(&self) -> std::slice::Iter<'_, BoundedParameter> { self.items.iter() } @@ -37,59 +84,90 @@ impl ParameterSpace { self.items.iter().map(|item| item.name.clone()).collect() } - pub fn finite_ranges(&self) -> Result> { + /// Infallible! The type system guarantees lower and upper bounds exist. + pub fn finite_ranges(&self) -> Vec<(f64, f64)> { self.items .iter() - .map(|parameter| match parameter.domain { - ParameterDomain::Bounded { lower, upper } => Ok((lower, upper)), - ParameterDomain::Positive { - lower: Some(lower), - upper: Some(upper), - } - | ParameterDomain::Unbounded { - lower: Some(lower), - upper: Some(upper), - } => Ok((lower, upper)), - _ => bail!( - "nonparametric initialization requires finite lower/upper bounds for parameter '{}'", - parameter.name - ), - }) + .map(|parameter| (parameter.lower, parameter.upper)) .collect() } } -impl Default for ParameterSpace { +impl Default for NonParametricParameters { fn default() -> Self { Self::new() } } -impl From<&ParameterSpace> for ParameterSpace { - fn from(parameter_space: &ParameterSpace) -> Self { - parameter_space.clone() +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct BoundedParameter { + pub name: String, + pub lower: f64, + pub upper: f64, +} + +impl BoundedParameter { + pub fn new(name: impl Into, lower: f64, upper: f64) -> Self { + Self { + name: name.into(), + lower, + upper, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct ParametricParameters { + pub items: Vec, +} + +impl ParametricParameters { + pub fn new() -> Self { + Self { items: Vec::new() } + } + + pub fn push(&mut self, item: UnboundedParameter) { + self.items.push(item); + } + + pub fn add(mut self, item: UnboundedParameter) -> Self { + self.push(item); + self + } + + pub fn len(&self) -> usize { + self.items.len() + } + + pub fn is_empty(&self) -> bool { + self.items.is_empty() + } + + pub fn iter(&self) -> std::slice::Iter<'_, UnboundedParameter> { + self.items.iter() + } + + pub fn names(&self) -> Vec { + self.items.iter().map(|item| item.name.clone()).collect() } } -fn default_estimate() -> bool { - true +impl Default for ParametricParameters { + fn default() -> Self { + Self::new() + } } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct Parameter { +pub struct UnboundedParameter { pub name: String, pub domain: ParameterDomain, - #[serde(default)] pub transform: ParameterTransform, - #[serde(default)] pub initial: Option, - #[serde(default = "default_estimate")] pub estimate: bool, - #[serde(default)] - pub variability: ParameterVariability, } -impl Parameter { +impl UnboundedParameter { pub fn bounded(name: impl Into, lower: f64, upper: f64) -> Self { Self { name: name.into(), @@ -97,7 +175,6 @@ impl Parameter { transform: ParameterTransform::Identity, initial: None, estimate: true, - variability: ParameterVariability::Subject, } } @@ -111,7 +188,6 @@ impl Parameter { transform: ParameterTransform::LogNormal, initial: None, estimate: true, - variability: ParameterVariability::Subject, } } } @@ -140,12 +216,3 @@ pub enum ParameterTransform { Probit, Logit, } - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)] -pub enum ParameterVariability { - FixedOnly, - #[default] - Subject, - Occasion, - SubjectAndOccasion, -} diff --git a/src/model/variability.rs b/src/model/variability.rs deleted file mode 100644 index 20cab7638..000000000 --- a/src/model/variability.rs +++ /dev/null @@ -1,28 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)] -pub struct VariabilityModel { - pub subject: RandomEffectsSpec, - pub occasion: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct RandomEffectsSpec { - pub enabled_for: Vec, - pub covariance: CovarianceStructure, -} - -impl Default for RandomEffectsSpec { - fn default() -> Self { - Self { - enabled_for: Vec::new(), - covariance: CovarianceStructure::Diagonal, - } - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub enum CovarianceStructure { - Diagonal, - Full, -} diff --git a/src/results/fit_result.rs b/src/results/fit_result.rs index d7c8bc224..f9aef9f46 100644 --- a/src/results/fit_result.rs +++ b/src/results/fit_result.rs @@ -1,62 +1,61 @@ use pharmsol::Equation; -use crate::estimation::nonparametric; use crate::estimation::nonparametric::NonParametricResult; - use crate::results::{FitSummary, IndividualSummary, PopulationSummary}; +/// A shared trait for the output of any estimation algorithm. +pub trait FitResult { + fn objf(&self) -> f64; + fn converged(&self) -> bool; + fn summary(&self) -> FitSummary; + fn population_summary(&self) -> PopulationSummary; + fn individual_summaries(&self) -> Vec; +} + +// Placeholder for your future Parametric implementation #[derive(Debug)] pub struct ParametricResult { - // Placeholder for future implementation _phantom: std::marker::PhantomData, } -#[derive(Debug)] -pub enum FitResult { - Nonparametric(NonParametricResult), - Parametric(ParametricResult), +impl FitResult for ParametricResult { + fn objf(&self) -> f64 { + unimplemented!("Parametric result not yet implemented") + } + fn converged(&self) -> bool { + unimplemented!() + } + fn summary(&self) -> FitSummary { + unimplemented!() + } + fn population_summary(&self) -> PopulationSummary { + unimplemented!() + } + fn individual_summaries(&self) -> Vec { + unimplemented!() + } } -impl FitResult { - pub fn objf(&self) -> f64 { - match self { - Self::Nonparametric(result) => result.objf(), - _ => unimplemented!(), // Placeholder for ParametricResult - } - } +use crate::estimation::nonparametric; - pub fn converged(&self) -> bool { - match self { - Self::Nonparametric(result) => result.converged(), - _ => unimplemented!(), // Placeholder for ParametricResult - } +impl FitResult for NonParametricResult { + fn objf(&self) -> f64 { + self.objf() // Assuming the struct has this native method } - pub fn summary(&self) -> FitSummary { - match self { - Self::Nonparametric(result) => nonparametric::fit_summary(result), - _ => unimplemented!(), // Placeholder for ParametricResult - } + fn converged(&self) -> bool { + self.converged() // Assuming the struct has this native method } - pub fn population_summary(&self) -> PopulationSummary { - match self { - Self::Nonparametric(result) => nonparametric::population_summary(result), - _ => unimplemented!(), // Placeholder for ParametricResult - } + fn summary(&self) -> FitSummary { + nonparametric::fit_summary(self) } - pub fn individual_summaries(&self) -> Vec { - match self { - Self::Nonparametric(result) => nonparametric::individual_summaries(result), - _ => unimplemented!(), // Placeholder for ParametricResult - } + fn population_summary(&self) -> PopulationSummary { + nonparametric::population_summary(self) } - pub fn as_nonparametric(&self) -> Option<&NonParametricResult> { - match self { - Self::Nonparametric(result) => Some(result), - _ => unimplemented!(), // Placeholder for ParametricResult - } + fn individual_summaries(&self) -> Vec { + nonparametric::individual_summaries(self) } } diff --git a/src/results/summary.rs b/src/results/summary.rs index 1ad5de295..c6769f38e 100644 --- a/src/results/summary.rs +++ b/src/results/summary.rs @@ -8,7 +8,6 @@ pub struct FitSummary { pub subject_count: usize, pub observation_count: usize, pub parameter_count: usize, - pub algorithm: String, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] From fd5656812dfafad881a895b30eb8e5d957876b2c Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 18:13:07 +0200 Subject: [PATCH 23/47] Docs --- src/api/estimation_problem.rs | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index 919ec5242..63bdf695f 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -3,30 +3,23 @@ use pharmsol::{ AssayErrorModel, AssayErrorModels, Data, Equation, ResidualErrorModel, ResidualErrorModels, }; -use crate::algorithms::Algorithm; -use crate::api::error_models::ErrorModels; - use crate::model::parameter_space::{ BoundedParameter, NonParametricParameters, ParametricParameters, UnboundedParameter, }; -use crate::model::{EquationMetadataSource, Model, ModelBuilder, ParameterSpace}; -use crate::results::FitResult; +use crate::model::{EquationMetadataSource, Model, ModelBuilder}; -// 1. The Markers pub trait Framework { type ErrorModels; type Parameters; } pub struct Parametric; impl Framework for Parametric { - // When we are Parametric, it strictly uses the parametric version type ErrorModels = ResidualErrorModels; type Parameters = ParametricParameters; } pub struct NonParametric; impl Framework for NonParametric { - // When we are Non-Parametric, the error model type is strictly AssayErrorModels type ErrorModels = AssayErrorModels; type Parameters = NonParametricParameters; } @@ -45,7 +38,6 @@ pub struct EstimationProblemBuilder { } impl EstimationProblemBuilder { - /// Fork into a strictly Non-Parametric problem definition pub fn nonparametric(self) -> NonParametricBuilder { NonParametricBuilder { model: self.model, @@ -55,7 +47,6 @@ impl EstimationProblemBuilder { } } - /// Fork into a strictly Parametric problem definition pub fn parametric(self) -> ParametricBuilder { ParametricBuilder { model: self.model, @@ -67,8 +58,6 @@ impl EstimationProblemBuilder { } impl EstimationProblem { - /// Starts building an estimation problem. - /// Note: You must call `.nonparametric()` or `.parametric()` to proceed. pub fn builder(equation: E, data: Data) -> EstimationProblemBuilder { EstimationProblemBuilder { model: Model::builder(equation), @@ -131,7 +120,7 @@ impl NonParametricBuilder { Ok(EstimationProblem { model: self.model.build()?, data: self.data, - error_models: all_errors, // Strongly typed as AssayErrorModels! + error_models: all_errors, parameters: self.parameters, }) } From 5950a3af6d3ac12060df5f4c4077dda0ccfc6198 Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 18:15:04 +0200 Subject: [PATCH 24/47] BestDose --- src/bestdose/types.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/bestdose/types.rs b/src/bestdose/types.rs index 84daf85e4..6781da9e0 100644 --- a/src/bestdose/types.rs +++ b/src/bestdose/types.rs @@ -10,6 +10,7 @@ use std::fmt::Display; use crate::estimation::nonparametric::{NPPredictions, Prior, Theta, Weights}; +use crate::model::NonParametricParameters; use crate::prelude::*; use pharmsol::prelude::*; use serde::{Deserialize, Serialize}; @@ -185,7 +186,7 @@ impl Default for DoseRange { #[derive(Debug, Clone)] pub struct BestDoseConfig { - pub(crate) parameter_space: ParameterSpace, + pub(crate) parameter_space: NonParametricParameters, pub(crate) error_models: AssayErrorModels, pub(crate) prior: Prior, pub(crate) refinement_cycles: usize, @@ -194,7 +195,7 @@ pub struct BestDoseConfig { } impl BestDoseConfig { - pub fn new(parameter_space: ParameterSpace, error_models: AssayErrorModels) -> Self { + pub fn new(parameter_space: NonParametricParameters, error_models: AssayErrorModels) -> Self { Self { parameter_space, error_models, @@ -225,7 +226,7 @@ impl BestDoseConfig { self } - pub fn parameter_space(&self) -> &ParameterSpace { + pub fn parameter_space(&self) -> &NonParametricParameters { &self.parameter_space } From 601b9ed378ed926b843016d45ecad497db0936bd Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 18:55:40 +0200 Subject: [PATCH 25/47] Tests and examples --- benches/bimodal_ke.rs | 4 ++-- examples/bimodal_ke/main.rs | 17 +++++++------ tests/acceptance_baseline_tests.rs | 30 ++++++++--------------- tests/bestdose_tests.rs | 16 +++++++++---- tests/onecomp.rs | 38 +++++++++++++----------------- tests/results_summary_tests.rs | 11 +++++---- 6 files changed, 55 insertions(+), 61 deletions(-) diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index df251dbe6..f903fb9da 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -1,6 +1,6 @@ use anyhow::Result; use criterion::{criterion_group, criterion_main, Criterion}; -use pmcore::prelude::*; +use pmcore::{api::Framework, prelude::*}; use std::hint::black_box; @@ -30,7 +30,7 @@ fn load_data() -> Result { Ok(data::read_pmetrics("examples/bimodal_ke/bimodal_ke.csv")?) } -fn setup_npag() -> Result> { +fn setup_npag() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) .parameter(Parameter::bounded("ke", 0.001, 3.0)) diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 49634f73f..955e8e746 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -1,8 +1,9 @@ use anyhow::Result; -use pmcore::prelude::*; +use pmcore::{model::BoundedParameter, prelude::*}; +// (Assuming BoundedParameter, NpagConfig, etc., are exported in your prelude) fn main() -> Result<()> { - Logger::new().init()?; + Logger::new().stdout(true).init()?; let eq = ode! { name: "bimodal_ke", @@ -23,15 +24,17 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/bimodal_ke/bimodal_ke.csv")?; - let _result = EstimationProblem::builder(eq, data) - .algorithm(NpagConfig::default()) - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) + let problem = EstimationProblem::builder(eq, data) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.001, 3.0)) + .parameter(BoundedParameter::new("v", 25.0, 250.0)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), ) - .fit()?; + .build()?; + + let _result = problem.fit_with(NpagConfig::default())?; Ok(()) } diff --git a/tests/acceptance_baseline_tests.rs b/tests/acceptance_baseline_tests.rs index 00d69c756..55372a297 100644 --- a/tests/acceptance_baseline_tests.rs +++ b/tests/acceptance_baseline_tests.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use pmcore::prelude::*; +use pmcore::{model::BoundedParameter, prelude::*}; fn assert_close(actual: f64, expected: f64, tolerance: f64, label: &str) { let difference = (actual - expected).abs(); @@ -34,29 +34,19 @@ fn bimodal_data() -> Result { #[test] fn test_acceptance_baseline_npag_bimodal_ke() -> Result<()> { - let result = EstimationProblem::builder(bimodal_ode_equation(), bimodal_data()?) - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + let result = EstimationProblem::builder(bimodal_ode_equation(), bimodal_data().unwrap()) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.1, 1.0)) + .parameter(BoundedParameter::new("v", 1.0, 20.0)) .error( - "1", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + "0", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 2.0), ) - .fit()?; - let summary = result.summary(); - let population = result.population_summary(); - let result = result - .as_nonparametric() - .expect("NPAG acceptance baseline should yield a nonparametric result"); + .build()? + .fit_with(NpagConfig::default())?; // This is the canonical rewrite-blocking nonparametric baseline for the bimodal_ke example. - assert_close( - summary.objective_function, - -425.60904902364695, - 1e-6, - "npag.objf", - ); - assert!(summary.converged); + assert_close(result.objf(), -425.60904902364695, 1e-6, "npag.objf"); assert_eq!(summary.iterations, 288); assert_eq!(result.get_theta().nspp(), 46); assert_close( diff --git a/tests/bestdose_tests.rs b/tests/bestdose_tests.rs index 270d09fbe..9ea2b8a28 100644 --- a/tests/bestdose_tests.rs +++ b/tests/bestdose_tests.rs @@ -1,16 +1,22 @@ use anyhow::Result; use pmcore::bestdose::{BestDoseConfig, BestDosePosterior, BestDoseProblem, DoseRange, Target}; use pmcore::estimation::nonparametric::{Theta, Weights}; +use pmcore::model::{BoundedParameter, NonParametricParameters}; use pmcore::prelude::*; -fn pk_parameter_space(ke_lower: f64, ke_upper: f64, v_lower: f64, v_upper: f64) -> ParameterSpace { - ParameterSpace::new() - .add(Parameter::bounded("ke", ke_lower, ke_upper)) - .add(Parameter::bounded("v", v_lower, v_upper)) +fn pk_parameter_space( + ke_lower: f64, + ke_upper: f64, + v_lower: f64, + v_upper: f64, +) -> NonParametricParameters { + NonParametricParameters::new() + .add(BoundedParameter::new("ke", ke_lower, ke_upper)) + .add(BoundedParameter::new("v", v_lower, v_upper)) } fn bestdose_config( - params: &ParameterSpace, + params: &NonParametricParameters, error_models: AssayErrorModels, refinement_cycles: usize, prediction_interval: f64, diff --git a/tests/onecomp.rs b/tests/onecomp.rs index 0308e7983..1016c3846 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use pmcore::prelude::*; +use pmcore::{model::BoundedParameter, prelude::*}; fn one_compartment_metadata() -> pharmsol::equation::ModelMetadata { equation::metadata::new("one_compartment") @@ -53,17 +53,15 @@ fn test_one_compartment_npag() -> Result<()> { let data = data::Data::new(subjects); let result = EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("ke", 0.1, 1.0)) - .parameter(Parameter::bounded("v", 1.0, 20.0)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.1, 1.0)) + .parameter(BoundedParameter::new("v", 1.0, 20.0)) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), ) - .fit()?; - let result = result - .as_nonparametric() - .expect("NPAG should yield a nonparametric result"); + .build()? + .fit_with(NpagConfig::default())?; // Check the results assert_eq!(result.cycles(), 32); @@ -116,17 +114,15 @@ fn test_one_compartment_npod() -> Result<()> { let data = data::Data::new(subjects); let result = EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("ke", 0.1, 1.0)) - .parameter(Parameter::bounded("v", 1.0, 20.0)) - .algorithm(Algorithm::NPOD(NpodConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.1, 1.0)) + .parameter(BoundedParameter::new("v", 1.0, 20.0)) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), ) - .fit()?; - let result = result - .as_nonparametric() - .expect("NPOD should yield a nonparametric result"); + .build()? + .fit_with(NpodConfig::default())?; // Check the results assert_eq!(result.cycles(), 11); @@ -179,17 +175,15 @@ fn test_one_compartment_postprob() -> Result<()> { let data = data::Data::new(subjects); let result = EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("ke", 0.1, 1.0)) - .parameter(Parameter::bounded("v", 1.0, 20.0)) - .algorithm(Algorithm::NPMAP(NpmapConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.1, 1.0)) + .parameter(BoundedParameter::new("v", 1.0, 20.0)) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), ) - .fit()?; - let result = result - .as_nonparametric() - .expect("POSTPROB should yield a nonparametric result"); + .build()? + .fit_with(NpmapConfig::default())?; // Check the results assert_eq!(result.cycles(), 0); diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index f363aea33..8163ab879 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -1,6 +1,6 @@ use anyhow::Result; use pharmsol::{AssayErrorModel, ErrorPoly}; -use pmcore::prelude::*; +use pmcore::{model::BoundedParameter, prelude::*}; fn simple_equation() -> equation::ODE { equation::ODE::new( @@ -43,11 +43,12 @@ fn simple_data() -> Data { fn test_nonparametric_fit_result_summary_surface() -> Result<()> { let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); let result = EstimationProblem::builder(simple_equation(), simple_data()) - .parameter(Parameter::bounded("ke", 0.1, 1.0)) - .parameter(Parameter::bounded("v", 1.0, 20.0)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.1, 1.0)) + .parameter(BoundedParameter::new("v", 1.0, 20.0)) .error("0", assay_error) - .fit()?; + .build()? + .fit_with(NpagConfig::default())?; let summary = result.summary(); From 769a4303aa8527e8f95ebdb6b0cb8f52cfc53bb1 Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 19:03:00 +0200 Subject: [PATCH 26/47] Update benchmark --- benches/bimodal_ke.rs | 73 ++++++++++++++++++++++++++----------------- src/lib.rs | 4 +++ 2 files changed, 48 insertions(+), 29 deletions(-) diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index f903fb9da..ff933bfee 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -1,6 +1,11 @@ use anyhow::Result; use criterion::{criterion_group, criterion_main, Criterion}; -use pmcore::{api::Framework, prelude::*}; +use pmcore::{ + algorithms::{Algorithm, Fitter}, + api::NonParametric, + model::BoundedParameter, + prelude::*, +}; use std::hint::black_box; @@ -22,68 +27,78 @@ fn create_equation() -> equation::ODE { } } -fn create_error_model() -> AssayErrorModel { - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0) -} - fn load_data() -> Result { Ok(data::read_pmetrics("examples/bimodal_ke/bimodal_ke.csv")?) } -fn setup_npag() -> Result> { +fn setup_npag() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) - .error("outeq_1", create_error_model()) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.001, 3.0)) + .parameter(BoundedParameter::new("v", 25.0, 250.0)) + .error( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + ) .build() } -fn setup_npod() -> Result> { +fn setup_npod() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .algorithm(Algorithm::NPOD(NpodConfig::default())) - .error("outeq_1", create_error_model()) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.001, 3.0)) + .parameter(BoundedParameter::new("v", 25.0, 250.0)) + .error( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + ) .build() } -fn setup_postprob() -> Result> { +fn setup_postprob() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .algorithm(Algorithm::NPMAP(NpmapConfig::default())) - .error("outeq_1", create_error_model()) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.001, 3.0)) + .parameter(BoundedParameter::new("v", 25.0, 250.0)) + .error( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + ) .build() } -fn benchmark_algorithm(c: &mut Criterion, bench_name: &str, setup_fn: F) +fn benchmark_algorithm(c: &mut Criterion, bench_name: &str, setup_fn: F, config: A) where - F: Fn() -> Result>, + F: Fn() -> Result>, + A: Algorithm + Clone, + A::Runner: Fitter, { - let problem = setup_fn().unwrap(); - c.bench_function(bench_name, |b| { b.iter_with_setup( - || problem.clone(), - |problem| black_box(problem.fit().unwrap()), + || setup_fn().unwrap(), + |problem| black_box(problem.fit_with(config.clone()).unwrap()), ) }); } fn benchmark_bimodal_ke_npag(c: &mut Criterion) { - benchmark_algorithm(c, "bimodal_ke_npag", setup_npag); + benchmark_algorithm(c, "bimodal_ke_npag", setup_npag, NpagConfig::default()); } fn benchmark_bimodal_ke_npod(c: &mut Criterion) { - benchmark_algorithm(c, "bimodal_ke_npod", setup_npod); + benchmark_algorithm(c, "bimodal_ke_npod", setup_npod, NpodConfig::default()); } fn benchmark_bimodal_ke_postprob(c: &mut Criterion) { - benchmark_algorithm(c, "bimodal_ke_postprob", setup_postprob); + benchmark_algorithm( + c, + "bimodal_ke_postprob", + setup_postprob, + NpmapConfig::default(), + ); } criterion_group! { diff --git a/src/lib.rs b/src/lib.rs index b0274389b..d61c98386 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -59,6 +59,10 @@ pub mod prelude { pub use crate::algorithms; pub use crate::algorithms::Algorithm; + pub use crate::model::parameter_space::{ + BoundedParameter, NonParametricParameters, ParametricParameters, UnboundedParameter, + }; + pub use crate::api::{ ErrorModels, EstimationProblem, FitProgress, NonparametricCycleProgress, NpagConfig, NpmapConfig, NpodConfig, From 191376e7a4e7c7fb68c114482e7df7438a4a6a3f Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 19:19:41 +0200 Subject: [PATCH 27/47] Refactoring examples --- benches/bimodal_ke.rs | 2 - examples/bestdose.rs | 6 +-- examples/bestdose_auc.rs | 6 +-- examples/bestdose_bounds.rs | 6 +-- examples/bestdose_cov.rs | 33 +++++------- examples/bimodal_ke_backend_compare.rs | 15 +++--- examples/drusano/main.rs | 55 +++++++++---------- examples/iov/main.rs | 7 +-- examples/meta/main.rs | 20 +++---- examples/neely/main.rs | 26 ++++----- examples/new_iov/main.rs | 10 ++-- examples/theophylline/main.rs | 12 +++-- examples/two_eq_lag/main.rs | 14 ++--- examples/vanco_sde/main.rs | 18 ++++--- src/estimation/nonparametric/prior/mod.rs | 10 ++-- src/lib.rs | 10 ++-- tests/acceptance_baseline_tests.rs | 65 ----------------------- 17 files changed, 127 insertions(+), 188 deletions(-) delete mode 100644 tests/acceptance_baseline_tests.rs diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index ff933bfee..b428b59aa 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -2,8 +2,6 @@ use anyhow::Result; use criterion::{criterion_group, criterion_main, Criterion}; use pmcore::{ algorithms::{Algorithm, Fitter}, - api::NonParametric, - model::BoundedParameter, prelude::*, }; diff --git a/examples/bestdose.rs b/examples/bestdose.rs index ebbd341ff..812b36b2a 100644 --- a/examples/bestdose.rs +++ b/examples/bestdose.rs @@ -20,9 +20,9 @@ fn main() -> Result<()> { }, }; - let parameter_space = ParameterSpace::new() - .add(Parameter::bounded("ke", 0.001, 3.0)) - .add(Parameter::bounded("v", 25.0, 250.0)); + let parameter_space = NonParametricParameters::new() + .add(BoundedParameter::new("ke", 0.001, 3.0)) + .add(BoundedParameter::new("v", 25.0, 250.0)); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bestdose_auc.rs b/examples/bestdose_auc.rs index df179004f..201d70fd6 100644 --- a/examples/bestdose_auc.rs +++ b/examples/bestdose_auc.rs @@ -28,9 +28,9 @@ fn main() -> Result<()> { }; // Minimal parameter ranges - let parameter_space = ParameterSpace::new() - .add(Parameter::bounded("ke", 0.001, 3.0)) - .add(Parameter::bounded("v", 25.0, 250.0)); + let parameter_space = NonParametricParameters::new() + .add(BoundedParameter::new("ke", 0.001, 3.0)) + .add(BoundedParameter::new("v", 25.0, 250.0)); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bestdose_bounds.rs b/examples/bestdose_bounds.rs index 91b668b86..7d2bbae43 100644 --- a/examples/bestdose_bounds.rs +++ b/examples/bestdose_bounds.rs @@ -27,9 +27,9 @@ fn main() -> Result<()> { }, }; - let parameter_space = ParameterSpace::new() - .add(Parameter::bounded("ke", 0.001, 3.0)) - .add(Parameter::bounded("v", 25.0, 250.0)); + let parameter_space = NonParametricParameters::new() + .add(BoundedParameter::new("ke", 0.001, 3.0)) + .add(BoundedParameter::new("v", 25.0, 250.0)); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bestdose_cov.rs b/examples/bestdose_cov.rs index 07065d818..e439ad60b 100644 --- a/examples/bestdose_cov.rs +++ b/examples/bestdose_cov.rs @@ -1,7 +1,5 @@ use anyhow::Result; -use pmcore::bestdose; // bestdose new - // use pmcore::bestdose::bestdose_old as bestdose; // bestdose old - +use pmcore::bestdose::{BestDoseConfig, BestDosePosterior, DoseRange, Target}; use pmcore::prelude::*; fn main() -> Result<()> { @@ -23,17 +21,16 @@ fn main() -> Result<()> { }, }; - let parameter_space = ParameterSpace::new() - .add(Parameter::bounded("ke", 0.001, 3.0)) - .add(Parameter::bounded("v", 25.0 / 70.0, 250.0 / 70.0)); + let parameter_space = NonParametricParameters::new() + .add(BoundedParameter::new("ke", 0.001, 3.0)) + .add(BoundedParameter::new("v", 25.0 / 70.0, 250.0 / 70.0)); let ems = AssayErrorModels::new().add( 0, AssayErrorModel::additive(ErrorPoly::new(0.0, 0.20, 0.0, 0.0), 0.0), )?; - let config = - bestdose::BestDoseConfig::new(parameter_space.clone(), ems.clone()).with_progress(false); + let config = BestDoseConfig::new(parameter_space.clone(), ems.clone()).with_progress(false); // Generate a patient with known parameters // Ke = 0.5, V = 50 @@ -100,22 +97,12 @@ fn main() -> Result<()> { m_t[(i, 1)] /= 70.0; } - // Example usage - using new() constructor which calculates NPAGFULL11 posterior - // max_cycles controls NPAGFULL refinement: - // 0 = NPAGFULL11 only (fast but less accurate) - // 100 = moderate refinement - // 500 = full refinement (Fortran default, slow but most accurate) - let problem = bestdose::BestDoseProblem::new( + let posterior = BestDosePosterior::compute( &theta, &prior.unwrap(), Some(past_data.clone()), // Optional: past data for Bayesian updating - target_data.clone(), - None, eq.clone(), - bestdose::DoseRange::new(0.0, 300.0), - 0.0, config.clone(), - bestdose::Target::Concentration, // Target concentrations (not AUCs) )?; println!("Optimizing dose..."); @@ -125,7 +112,13 @@ fn main() -> Result<()> { for bias_weight in &bias_weights { println!("Running optimization with bias weight: {}", bias_weight); - let optimal = problem.clone().with_bias_weight(*bias_weight).optimize()?; + let optimal = posterior.optimize( + target_data.clone(), + None, + DoseRange::new(0.0, 300.0), + *bias_weight, + Target::Concentration, + )?; results.push((bias_weight, optimal)); } diff --git a/examples/bimodal_ke_backend_compare.rs b/examples/bimodal_ke_backend_compare.rs index f514151fc..727c72bb5 100644 --- a/examples/bimodal_ke_backend_compare.rs +++ b/examples/bimodal_ke_backend_compare.rs @@ -203,14 +203,15 @@ fn run_case( label: &'static str, compile_time: Duration, fit_time: Duration, - result: &FitResult, + result: &NonParametricResult, ) -> Result { - result - .as_nonparametric() - .ok_or_else(|| anyhow!("expected nonparametric result for {label}"))?; - Ok(ComparisonResult { label, compile_time, diff --git a/examples/drusano/main.rs b/examples/drusano/main.rs index 2c1892aa2..8b7c8a714 100644 --- a/examples/drusano/main.rs +++ b/examples/drusano/main.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use pmcore::prelude::*; +use pmcore::{model::BoundedParameter, prelude::*}; #[allow(unused_variables)] fn main() -> Result<()> { let eq = ode! { @@ -65,31 +65,31 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/drusano/data.csv")?; EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("v1", 5.0, 160.0)) - .parameter(Parameter::bounded("cl1", 4.0, 9.0)) - .parameter(Parameter::bounded("v2", 100.0, 200.0)) - .parameter(Parameter::bounded("cl2", 25.0, 35.0)) - .parameter(Parameter::bounded("popmax", 100000000.0, 100000000000.0)) - .parameter(Parameter::bounded("kgs", 0.01, 0.25)) - .parameter(Parameter::bounded("kks", 0.01, 0.5)) - .parameter(Parameter::bounded("e50_1s", 0.1, 2.5)) - .parameter(Parameter::bounded("e50_2s", 0.1, 10.0)) - .parameter(Parameter::bounded("alpha_s", -8.0, 5.0)) - .parameter(Parameter::bounded("kgr1", 0.004, 0.1)) - .parameter(Parameter::bounded("kkr1", 0.08, 0.4)) - .parameter(Parameter::bounded("e50_1r1", 8.0, 17.0)) - .parameter(Parameter::bounded("alpha_r1", -8.0, 5.0)) - .parameter(Parameter::bounded("kgr2", 0.004, 0.3)) - .parameter(Parameter::bounded("kkr2", 0.1, 0.5)) - .parameter(Parameter::bounded("e50_2r2", 5.0, 8.0)) - .parameter(Parameter::bounded("alpha_r2", -5.0, 5.0)) - .parameter(Parameter::bounded("init_4", -1.0, 4.0)) - .parameter(Parameter::bounded("init_5", -1.0, 3.0)) - .parameter(Parameter::bounded("h1s", 0.5, 8.0)) - .parameter(Parameter::bounded("h2s", 0.1, 4.0)) - .parameter(Parameter::bounded("h1r1", 5.0, 25.0)) - .parameter(Parameter::bounded("h2r2", 10.0, 22.0)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("v1", 5.0, 160.0)) + .parameter(BoundedParameter::new("cl1", 4.0, 9.0)) + .parameter(BoundedParameter::new("v2", 100.0, 200.0)) + .parameter(BoundedParameter::new("cl2", 25.0, 35.0)) + .parameter(BoundedParameter::new("popmax", 100000000.0, 100000000000.0)) + .parameter(BoundedParameter::new("kgs", 0.01, 0.25)) + .parameter(BoundedParameter::new("kks", 0.01, 0.5)) + .parameter(BoundedParameter::new("e50_1s", 0.1, 2.5)) + .parameter(BoundedParameter::new("e50_2s", 0.1, 10.0)) + .parameter(BoundedParameter::new("alpha_s", -8.0, 5.0)) + .parameter(BoundedParameter::new("kgr1", 0.004, 0.1)) + .parameter(BoundedParameter::new("kkr1", 0.08, 0.4)) + .parameter(BoundedParameter::new("e50_1r1", 8.0, 17.0)) + .parameter(BoundedParameter::new("alpha_r1", -8.0, 5.0)) + .parameter(BoundedParameter::new("kgr2", 0.004, 0.3)) + .parameter(BoundedParameter::new("kkr2", 0.1, 0.5)) + .parameter(BoundedParameter::new("e50_2r2", 5.0, 8.0)) + .parameter(BoundedParameter::new("alpha_r2", -5.0, 5.0)) + .parameter(BoundedParameter::new("init_4", -1.0, 4.0)) + .parameter(BoundedParameter::new("init_5", -1.0, 3.0)) + .parameter(BoundedParameter::new("h1s", 0.5, 8.0)) + .parameter(BoundedParameter::new("h2s", 0.1, 4.0)) + .parameter(BoundedParameter::new("h1r1", 5.0, 25.0)) + .parameter(BoundedParameter::new("h2r2", 10.0, 22.0)) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), @@ -106,6 +106,7 @@ fn main() -> Result<()> { "outeq_4", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), ) - .fit()?; + .build()? + .fit_with(NpagConfig::default())?; Ok(()) } diff --git a/examples/iov/main.rs b/examples/iov/main.rs index 192e5633e..3c8aa46b4 100644 --- a/examples/iov/main.rs +++ b/examples/iov/main.rs @@ -28,13 +28,14 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/iov/test.csv").unwrap(); EstimationProblem::builder(sde, data) - .parameter(Parameter::bounded("ke0", 0.001, 2.0)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("ke0", 0.001, 2.0)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), ) - .fit() + .build()? + .fit_with(NpagConfig::default()) .unwrap(); Ok(()) diff --git a/examples/meta/main.rs b/examples/meta/main.rs index f39576d4a..08fea77d4 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -33,14 +33,14 @@ fn main() { let data = data::read_pmetrics("examples/meta/meta.csv").unwrap(); EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("cls", 0.1, 10.0)) - .parameter(Parameter::bounded("fm", 0.0, 1.0)) - .parameter(Parameter::bounded("k20", 0.01, 1.0)) - .parameter(Parameter::bounded("relv", 0.1, 1.0)) - .parameter(Parameter::bounded("theta1", 0.1, 10.0)) - .parameter(Parameter::bounded("theta2", 0.1, 10.0)) - .parameter(Parameter::bounded("vs", 1.0, 10.0)) - .algorithm(Algorithm::NPOD(NpodConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("cls", 0.1, 10.0)) + .parameter(BoundedParameter::new("fm", 0.0, 1.0)) + .parameter(BoundedParameter::new("k20", 0.01, 1.0)) + .parameter(BoundedParameter::new("relv", 0.1, 1.0)) + .parameter(BoundedParameter::new("theta1", 0.1, 10.0)) + .parameter(BoundedParameter::new("theta2", 0.1, 10.0)) + .parameter(BoundedParameter::new("vs", 1.0, 10.0)) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), @@ -49,6 +49,8 @@ fn main() { "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .fit() + .build() + .unwrap() + .fit_with(NpodConfig::default()) .unwrap(); } diff --git a/examples/neely/main.rs b/examples/neely/main.rs index d47ad0ac3..5a7c6c960 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -48,17 +48,17 @@ fn main() { let data = data::read_pmetrics("examples/neely/data.csv").unwrap(); EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("cls", 0.0, 0.4)) - .parameter(Parameter::bounded("k30", 0.0, 0.5)) - .parameter(Parameter::bounded("k40", 0.3, 1.5)) - .parameter(Parameter::bounded("qs", 0.0, 0.5)) - .parameter(Parameter::bounded("vps", 0.0, 5.0)) - .parameter(Parameter::bounded("vs", 0.0, 2.0)) - .parameter(Parameter::bounded("fm1", 0.0, 0.2)) - .parameter(Parameter::bounded("fm2", 0.0, 0.1)) - .parameter(Parameter::bounded("theta1", -4.0, 2.0)) - .parameter(Parameter::bounded("theta2", -2.0, 0.5)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("cls", 0.0, 0.4)) + .parameter(BoundedParameter::new("k30", 0.0, 0.5)) + .parameter(BoundedParameter::new("k40", 0.3, 1.5)) + .parameter(BoundedParameter::new("qs", 0.0, 0.5)) + .parameter(BoundedParameter::new("vps", 0.0, 5.0)) + .parameter(BoundedParameter::new("vs", 0.0, 2.0)) + .parameter(BoundedParameter::new("fm1", 0.0, 0.2)) + .parameter(BoundedParameter::new("fm2", 0.0, 0.1)) + .parameter(BoundedParameter::new("theta1", -4.0, 2.0)) + .parameter(BoundedParameter::new("theta2", -2.0, 0.5)) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), @@ -71,6 +71,8 @@ fn main() { "outeq_3", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .fit() + .build() + .unwrap() + .fit_with(NpagConfig::default()) .unwrap(); } diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index 64af9091e..36b0f401c 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -27,13 +27,15 @@ fn main() { let data = data::read_pmetrics("examples/new_iov/data.csv").unwrap(); EstimationProblem::builder(sde, data) - .parameter(Parameter::bounded("ke0", 0.0001, 2.4)) - .parameter(Parameter::bounded("ske", 0.0001, 0.2)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("ke0", 0.0001, 2.4)) + .parameter(BoundedParameter::new("ske", 0.0001, 0.2)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), ) - .fit() + .build() + .unwrap() + .fit_with(NpagConfig::default()) .unwrap(); } diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index b7df9d813..6cfda5b07 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -17,14 +17,16 @@ fn main() { let data = data::read_pmetrics("examples/theophylline/theophylline.csv").unwrap(); EstimationProblem::builder(analytical, data) - .parameter(Parameter::bounded("ka", 0.001, 3.0)) - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 0.001, 50.0)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("ka", 0.001, 3.0)) + .parameter(BoundedParameter::new("ke", 0.001, 3.0)) + .parameter(BoundedParameter::new("v", 0.001, 50.0)) .error( "outeq_0", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), ) - .fit() + .build() + .unwrap() + .fit_with(NpagConfig::default()) .unwrap(); } diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index 4fecaf616..11d9d121e 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -23,15 +23,17 @@ fn main() { let data = data::read_pmetrics("examples/two_eq_lag/two_eq_lag.csv").unwrap(); EstimationProblem::builder(eq, data) - .parameter(Parameter::bounded("ka", 0.1, 0.9)) - .parameter(Parameter::bounded("ke", 0.001, 0.1)) - .parameter(Parameter::bounded("tlag", 0.0, 4.0)) - .parameter(Parameter::bounded("v", 30.0, 120.0)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("ka", 0.1, 0.9)) + .parameter(BoundedParameter::new("ke", 0.001, 0.1)) + .parameter(BoundedParameter::new("tlag", 0.0, 4.0)) + .parameter(BoundedParameter::new("v", 30.0, 120.0)) .error( "outeq_0", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), ) - .fit() + .build() + .unwrap() + .fit_with(NpagConfig::default()) .unwrap(); } diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index f643524f4..2b96e2b84 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -49,17 +49,19 @@ fn main() { let data = data::read_pmetrics("examples/vanco_sde/vanco_clean.csv").unwrap(); EstimationProblem::builder(sde, data) - .parameter(Parameter::bounded("ka", 0.0001, 2.4)) - .parameter(Parameter::bounded("ke0", 0.0001, 2.7)) - .parameter(Parameter::bounded("kcp", 0.0001, 2.4)) - .parameter(Parameter::bounded("kpc", 0.0001, 2.4)) - .parameter(Parameter::bounded("vol", 0.2, 12.0)) - .parameter(Parameter::bounded("ske", 0.0001, 0.2)) - .algorithm(Algorithm::NPAG(NpagConfig::default())) + .nonparametric() + .parameter(BoundedParameter::new("ka", 0.0001, 2.4)) + .parameter(BoundedParameter::new("ke0", 0.0001, 2.7)) + .parameter(BoundedParameter::new("kcp", 0.0001, 2.4)) + .parameter(BoundedParameter::new("kpc", 0.0001, 2.4)) + .parameter(BoundedParameter::new("vol", 0.2, 12.0)) + .parameter(BoundedParameter::new("ske", 0.0001, 0.2)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), ) - .fit() + .build() + .unwrap() + .fit_with(NpagConfig::default()) .unwrap(); } diff --git a/src/estimation/nonparametric/prior/mod.rs b/src/estimation/nonparametric/prior/mod.rs index 61f727dd0..8510d21d1 100644 --- a/src/estimation/nonparametric/prior/mod.rs +++ b/src/estimation/nonparametric/prior/mod.rs @@ -107,15 +107,15 @@ impl Default for Prior { pub fn read_prior( path: impl AsRef, - parameters: NonParametricParameters, + parameters: &NonParametricParameters, ) -> Result<(Theta, Option)> { let path = path.as_ref().to_string(); - parse_prior_for_parameters(&path, parameters) + parse_prior_for_parameters(&path, ¶meters) } pub(crate) fn parse_prior_for_parameters( path: &String, - parameters: NonParametricParameters, + parameters: &NonParametricParameters, ) -> Result<(Theta, Option)> { tracing::info!("Reading prior from {}", path); let file = File::open(path).context(format!("Unable to open the prior file '{}'", path))?; @@ -225,7 +225,7 @@ mod tests { let path = temp_csv_path(); fs::write(&path, "v,ke,prob\n10.0,0.5,0.3\n15.0,0.7,0.7\n").unwrap(); - let (theta, weights) = read_prior(&path, parameters()).unwrap(); + let (theta, weights) = read_prior(&path, ¶meters()).unwrap(); let _ = fs::remove_file(&path); assert_eq!(theta.nspp(), 2); @@ -243,7 +243,7 @@ mod tests { let path = temp_csv_path(); fs::write(&path, "ke,v,extra\n0.5,10.0,1.0\n").unwrap(); - let err = read_prior(&path, parameters()).unwrap_err(); + let err = read_prior(&path, ¶meters()).unwrap_err(); let _ = fs::remove_file(&path); assert!(err diff --git a/src/lib.rs b/src/lib.rs index d61c98386..e39edbe06 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -58,16 +58,18 @@ pub mod prelude { pub use super::Result; pub use crate::algorithms; pub use crate::algorithms::Algorithm; + pub use crate::algorithms::Fitter; - pub use crate::model::parameter_space::{ - BoundedParameter, NonParametricParameters, ParametricParameters, UnboundedParameter, - }; - + pub use crate::api::NonParametric; pub use crate::api::{ ErrorModels, EstimationProblem, FitProgress, NonparametricCycleProgress, NpagConfig, NpmapConfig, NpodConfig, }; + pub use crate::model::parameter_space::{ + BoundedParameter, NonParametricParameters, ParametricParameters, UnboundedParameter, + }; + pub use crate::estimation::nonparametric::{ CycleLog, NPCycle, NPPredictions, NonParametricResult, Posterior, Psi, Theta, Weights, }; diff --git a/tests/acceptance_baseline_tests.rs b/tests/acceptance_baseline_tests.rs deleted file mode 100644 index 55372a297..000000000 --- a/tests/acceptance_baseline_tests.rs +++ /dev/null @@ -1,65 +0,0 @@ -use anyhow::Result; -use pmcore::{model::BoundedParameter, prelude::*}; - -fn assert_close(actual: f64, expected: f64, tolerance: f64, label: &str) { - let difference = (actual - expected).abs(); - assert!( - difference <= tolerance, - "{label}: expected {expected}, got {actual}, abs diff {difference} > {tolerance}" - ); -} - -fn bimodal_ode_equation() -> equation::ODE { - ode! { - name: "acceptance_baseline_bimodal_ke", - params: [ke, v], - states: [central], - outputs: [1], - routes: [ - infusion(1) -> central, - ], - diffeq: |x, _t, dx| { - dx[central] = -ke * x[central]; - }, - out: |x, _t, y| { - y[1] = x[central] / v; - }, - } - .with_solver(OdeSolver::ExplicitRk(ExplicitRkTableau::Tsit45)) -} - -fn bimodal_data() -> Result { - Ok(data::read_pmetrics("examples/bimodal_ke/bimodal_ke.csv")?) -} - -#[test] -fn test_acceptance_baseline_npag_bimodal_ke() -> Result<()> { - let result = EstimationProblem::builder(bimodal_ode_equation(), bimodal_data().unwrap()) - .nonparametric() - .parameter(BoundedParameter::new("ke", 0.1, 1.0)) - .parameter(BoundedParameter::new("v", 1.0, 20.0)) - .error( - "0", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 2.0), - ) - .build()? - .fit_with(NpagConfig::default())?; - - // This is the canonical rewrite-blocking nonparametric baseline for the bimodal_ke example. - assert_close(result.objf(), -425.60904902364695, 1e-6, "npag.objf"); - assert_eq!(summary.iterations, 288); - assert_eq!(result.get_theta().nspp(), 46); - assert_close( - population.parameters[0].mean, - 0.187047284678325, - 1e-6, - "npag.ke.mean", - ); - assert_close( - population.parameters[1].mean, - 107.94241284196241, - 1e-6, - "npag.v.mean", - ); - Ok(()) -} From 935e6eb836fe9066c3cfcd64ece738608eb03226 Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 20:20:06 +0200 Subject: [PATCH 28/47] Refactor --- examples/bestdose_auc.rs | 3 +-- examples/bimodal_ke/main.rs | 2 +- src/algorithms/mod.rs | 5 ++-- src/algorithms/nonparametric/npag.rs | 25 ++++++++++++++---- src/algorithms/nonparametric/npmap.rs | 10 ++----- src/algorithms/nonparametric/npod.rs | 8 ++---- src/api/estimation_problem.rs | 5 ---- src/estimation/nonparametric/prior/mod.rs | 2 +- src/estimation/nonparametric/result.rs | 2 +- src/estimation/nonparametric/theta.rs | 2 +- src/model/mod.rs | 32 +---------------------- src/model/parameter_space.rs | 4 --- src/results/fit_result.rs | 2 ++ 13 files changed, 34 insertions(+), 68 deletions(-) diff --git a/examples/bestdose_auc.rs b/examples/bestdose_auc.rs index 201d70fd6..95c926a28 100644 --- a/examples/bestdose_auc.rs +++ b/examples/bestdose_auc.rs @@ -118,9 +118,8 @@ fn main() -> Result<()> { } } - // ========================================================================= // EXAMPLE 2: Interval AUC (AUCFromLastDose) - // ========================================================================= + println!("\n\n"); println!("════════════════════════════════════════════════════════"); println!(" EXAMPLE 2: Interval AUC (AUCFromLastDose)"); diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 955e8e746..874a0752c 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -30,7 +30,7 @@ fn main() -> Result<()> { .parameter(BoundedParameter::new("v", 25.0, 250.0)) .error( "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 5.0), ) .build()?; diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index 1c6743aad..2116fc33b 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -10,7 +10,6 @@ use anyhow::Result; use ndarray::parallel::prelude::{IntoParallelIterator, ParallelIterator}; use ndarray::{Array, ArrayBase, Dim, OwnedRepr}; -use nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; use pharmsol::prelude::{data::Data, simulator::Equation}; use pharmsol::{Predictions, Subject}; @@ -332,11 +331,11 @@ pub trait NonParametricAlgorithm: Sync + Send + 's fn fit(&mut self) -> Result> { self.initialize().unwrap(); while let Status::Continue = self.next_cycle()? {} - self.into_workspace() + self.into_result() } #[allow(clippy::wrong_self_convention)] - fn into_workspace(&self) -> Result>; + fn into_result(&self) -> Result>; } /// Represents the status/result of the algorithm diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index ef873f0ba..b965c0e50 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -3,11 +3,9 @@ use crate::api::{EstimationProblem, NonParametric}; use crate::estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, }; -use crate::model::ParameterSpace; pub(crate) use crate::estimation::nonparametric::ipm::burke; pub(crate) use crate::estimation::nonparametric::qr; -use crate::results::FitResult; use crate::model::parameter_space::NonParametricParameters; @@ -192,7 +190,7 @@ impl NonParametricAlgorithm for NPAG { &self.equation } - fn into_workspace(&self) -> Result> { + fn into_result(&self) -> Result> { NonParametricResult::new( self.equation.clone(), self.data.clone(), @@ -530,8 +528,25 @@ impl Fitter for NPAG { type Output = NonParametricResult; fn fit(mut self) -> anyhow::Result { - // Run NPAG... - self.into_workspace() // Returns NonParametricResult + // Standard iterative execution loop for non-parametric evaluation + self.increment_cycle(); + self.estimation()?; + + loop { + let status = self.evaluation()?; + if let Status::Stop(_) = status { + break; + } + + self.condensation()?; + self.expansion()?; + self.optimizations()?; + + self.increment_cycle(); + self.estimation()?; + } + + self.into_result() } } diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index b4866ecc5..6afe9da29 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -85,7 +85,7 @@ impl NPMAP { } impl NonParametricAlgorithm for NPMAP { - fn into_workspace(&self) -> Result> { + fn into_result(&self) -> Result> { NonParametricResult::new( self.equation.clone(), self.data.clone(), @@ -191,10 +191,6 @@ impl NonParametricAlgorithm for NPMAP { } } -// ============================================================================== -// STRATEGY / ENGINE PIPELINE -// ============================================================================== - impl Algorithm for NpmapConfig { type Runner = NPMAP; @@ -213,12 +209,10 @@ impl Fitter for NPMAP { type Output = NonParametricResult; fn fit(mut self) -> Result { - // Since NPMAP is a single-pass algorithm, the execution loop is very simple: self.estimation()?; self.evaluation()?; self.log_cycle_state(); - // Return the strictly-typed NonParametricResult - self.into_workspace() + self.into_result() } } diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 3c3ecb9ae..6df87f3e6 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -145,7 +145,7 @@ impl NPOD { } impl NonParametricAlgorithm for NPOD { - fn into_workspace(&self) -> Result> { + fn into_result(&self) -> Result> { NonParametricResult::new( self.equation.clone(), self.data.clone(), @@ -448,10 +448,6 @@ impl NonParametricAlgorithm for NPOD { } } -// ============================================================================== -// STRATEGY / ENGINE PIPELINE -// ============================================================================== - impl Algorithm for NpodConfig { type Runner = NPOD; @@ -489,6 +485,6 @@ impl Fitter for NPOD { } // Return the strictly-typed NonParametricResult - self.into_workspace() + self.into_result() } } diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index 63bdf695f..c8785ee35 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -90,11 +90,6 @@ impl NonParametricBuilder { self.error_models.push((name.into(), model)); self } - - fn with_model_builder(mut self, map: impl FnOnce(ModelBuilder) -> ModelBuilder) -> Self { - self.model = map(self.model); - self - } } impl NonParametricBuilder { diff --git a/src/estimation/nonparametric/prior/mod.rs b/src/estimation/nonparametric/prior/mod.rs index 8510d21d1..6ca319efa 100644 --- a/src/estimation/nonparametric/prior/mod.rs +++ b/src/estimation/nonparametric/prior/mod.rs @@ -1,7 +1,7 @@ use std::fs::File; use crate::estimation::nonparametric::{Theta, Weights}; -use crate::model::{NonParametricParameters, ParameterDomain, ParameterSpace}; +use crate::model::NonParametricParameters; use anyhow::{bail, Context, Result}; use faer::Mat; use serde::{Deserialize, Serialize}; diff --git a/src/estimation/nonparametric/result.rs b/src/estimation/nonparametric/result.rs index cf261a1e8..41e377f68 100644 --- a/src/estimation/nonparametric/result.rs +++ b/src/estimation/nonparametric/result.rs @@ -2,7 +2,7 @@ use std::path::Path; use pharmsol::Equation; -use crate::algorithms::{Algorithm, Status, StopReason}; +use crate::algorithms::{Status, StopReason}; use crate::estimation::nonparametric::{ posterior, CycleLog, NPPredictions, Posterior, Psi, Theta, Weights, }; diff --git a/src/estimation/nonparametric/theta.rs b/src/estimation/nonparametric/theta.rs index b2482848c..2e205a0ce 100644 --- a/src/estimation/nonparametric/theta.rs +++ b/src/estimation/nonparametric/theta.rs @@ -5,7 +5,7 @@ use faer::Mat; use serde::{Deserialize, Serialize}; use super::weights::Weights; -use crate::model::{NonParametricParameters, ParameterSpace}; +use crate::model::NonParametricParameters; /// [Theta] is a structure that holds the support points /// These represent the joint population parameter distribution diff --git a/src/model/mod.rs b/src/model/mod.rs index 0a9176fa4..86aca059a 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -1,7 +1,6 @@ -use anyhow::{anyhow, bail, Result}; +use anyhow::Result; use pharmsol::equation::Equation; use pharmsol::{Analytical, ValidatedModelMetadata, ODE, SDE}; -use std::collections::HashSet; pub mod metadata; pub mod parameter_space; @@ -92,35 +91,6 @@ impl ModelBuilder { } } -/// A generic validation function that can be called by either the -/// NonParametricBuilder or the ParametricBuilder during `.build()`. -pub(crate) fn validate_parameter_names<'a, E: EquationMetadataSource>( - equation: &E, - names: impl Iterator, -) -> Result<()> { - let metadata = equation - .equation_metadata() - .ok_or_else(|| anyhow!("equation metadata is required to define model parameters"))?; - - let mut seen = HashSet::new(); - - for name in names { - if name.trim().is_empty() { - bail!("model parameter name cannot be empty"); - } - - if metadata.parameter_index(name).is_none() { - bail!("unknown equation parameter: {}", name); - } - - if !seen.insert(name) { - bail!("duplicate model parameter: {}", name); - } - } - - Ok(()) -} - pub trait EquationMetadataSource: Equation { fn equation_metadata(&self) -> Option<&ValidatedModelMetadata>; } diff --git a/src/model/parameter_space.rs b/src/model/parameter_space.rs index bb4aa6855..d9c3ddc21 100644 --- a/src/model/parameter_space.rs +++ b/src/model/parameter_space.rs @@ -44,10 +44,6 @@ impl ParameterSpace { } } -// ========================================================================= -// NON-PARAMETRIC IMPLEMENTATIONS -// ========================================================================= - #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct NonParametricParameters { pub items: Vec, diff --git a/src/results/fit_result.rs b/src/results/fit_result.rs index f9aef9f46..3e8470b52 100644 --- a/src/results/fit_result.rs +++ b/src/results/fit_result.rs @@ -14,6 +14,8 @@ pub trait FitResult { // Placeholder for your future Parametric implementation #[derive(Debug)] +#[allow(unused)] +//TODO: Implement ParametricResult pub struct ParametricResult { _phantom: std::marker::PhantomData, } From 096422cf7140d320817012b93e44f7ece142e602 Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 20:28:10 +0200 Subject: [PATCH 29/47] NPAG is working --- src/algorithms/mod.rs | 4 ++-- src/algorithms/nonparametric/npag.rs | 27 ++++++++------------------- src/algorithms/nonparametric/npmap.rs | 4 ---- src/algorithms/nonparametric/npod.rs | 4 ---- 4 files changed, 10 insertions(+), 29 deletions(-) diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index 2116fc33b..16b9dbf72 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -245,7 +245,7 @@ pub trait NonParametricAlgorithm: Sync + Send + 's fn equation(&self) -> &E; /// Get the data used in the algorithm fn data(&self) -> &Data; - fn get_prior(&self) -> Theta; + /// Increment the cycle counter and return the new value fn increment_cycle(&mut self) -> usize; /// Get the current cycle number @@ -280,7 +280,7 @@ pub trait NonParametricAlgorithm: Sync + Send + 's fs::remove_file("stop").context("Unable to remove previous stop file")?; } self.set_status(Status::Continue); - self.set_theta(self.get_prior()); + Ok(()) } fn estimation(&mut self) -> Result<()>; diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index b965c0e50..f8e77c96b 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -162,11 +162,13 @@ impl NPAG { let gamma_delta = vec![config.error_step; error_models.len()]; let eps = config.eps; + let prior = config.prior.theta(parameters)?; + Ok(Self { equation, ranges, psi: Psi::new(), - theta: Theta::new(), + theta: prior, lambda: Weights::default(), w: Weights::default(), eps, @@ -212,10 +214,6 @@ impl NonParametricAlgorithm for NPAG { &self.data } - fn get_prior(&self) -> Theta { - unimplemented!("get_prior method is not implemented yet") - } - fn likelihood(&self) -> f64 { self.objf } @@ -528,22 +526,13 @@ impl Fitter for NPAG { type Output = NonParametricResult; fn fit(mut self) -> anyhow::Result { - // Standard iterative execution loop for non-parametric evaluation - self.increment_cycle(); - self.estimation()?; - + self.initialize()?; + #[allow(clippy::while_let_loop)] loop { - let status = self.evaluation()?; - if let Status::Stop(_) = status { - break; + match self.next_cycle()? { + Status::Continue => continue, + Status::Stop(_) => break, } - - self.condensation()?; - self.expansion()?; - self.optimizations()?; - - self.increment_cycle(); - self.estimation()?; } self.into_result() diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index 6afe9da29..8d0860be5 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -111,10 +111,6 @@ impl NonParametricAlgorithm for NPMAP { &self.data } - fn get_prior(&self) -> Theta { - unimplemented!("get_prior method is not implemented yet") - } - fn likelihood(&self) -> f64 { self.objf } diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 6df87f3e6..e52a4f9f5 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -171,10 +171,6 @@ impl NonParametricAlgorithm for NPOD { &self.data } - fn get_prior(&self) -> Theta { - self.config.prior.clone() - } - fn increment_cycle(&mut self) -> usize { self.cycle += 1; self.cycle From eda30287ef00229346eff63900452670a522f522 Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 20:29:07 +0200 Subject: [PATCH 30/47] Docs --- src/estimation/nonparametric/prior/mod.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/estimation/nonparametric/prior/mod.rs b/src/estimation/nonparametric/prior/mod.rs index 6ca319efa..c4d3a61cd 100644 --- a/src/estimation/nonparametric/prior/mod.rs +++ b/src/estimation/nonparametric/prior/mod.rs @@ -73,8 +73,10 @@ impl Prior { } } + /// Generates the initial support points (theta) based on the specified prior configuration + /// + /// If a Prior::Theta is provided, it will be returned directly. For Sobol and Latin, the support points will be generated based on the number of points and seed. pub fn theta(&self, parameters: &NonParametricParameters) -> Result { - // 1. Validation is mostly gone! We just check logic, not type structure. for parameter in parameters.iter() { if parameter.lower >= parameter.upper { bail!( @@ -86,9 +88,6 @@ impl Prior { } } - // 2. Generation - // Note: You will need to update `sobol::generate` and `latin::generate` - // in their respective modules to accept `&NonParametricParameters`. let prior = match self { Prior::Sobol(points, seed) => sobol::generate(parameters, *points, *seed)?, Prior::Latin(points, seed) => latin::generate(parameters, *points, *seed)?, From dc5f4756f3be8036539b596fd45a60042dc45746 Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 20:35:56 +0200 Subject: [PATCH 31/47] NPOD is working --- examples/bimodal_ke/main.rs | 2 +- src/algorithms/nonparametric/npod.rs | 54 ++++++++++++++-------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 874a0752c..955e8e746 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -30,7 +30,7 @@ fn main() -> Result<()> { .parameter(BoundedParameter::new("v", 25.0, 250.0)) .error( "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 5.0), + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), ) .build()?; diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index e52a4f9f5..94db0a0ac 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -2,7 +2,8 @@ use crate::{ algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}, api::{EstimationProblem, NonParametric}, estimation::nonparametric::{ - calculate_psi, ipm::burke, qr, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, + calculate_psi, ipm::burke, qr, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, + Weights, }, model::parameter_space::NonParametricParameters, }; @@ -24,23 +25,19 @@ const THETA_F: f64 = 1e-2; const THETA_D: f64 = 1e-4; /// Configuration options for the Non-Parametric Optimal Design (NPOD) algorithm. -#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct NpodConfig { /// Maximum number of cycles to run the algorithm for. - max_cycles: usize, + pub max_cycles: usize, /// Prior distribution for sampling new support points. - prior: Theta, + pub prior: Prior, /// Whether to print progress information during the first cycle. - progress: bool, + pub progress: bool, } impl NpodConfig { pub fn new() -> Self { - Self { - max_cycles: 100, - prior: Theta::new(), - progress: false, - } + Self::default() } pub fn max_cycles(mut self, cycles: usize) -> Self { @@ -48,12 +45,22 @@ impl NpodConfig { self } - pub fn prior(mut self, prior: Theta) -> Self { + pub fn prior(mut self, prior: Prior) -> Self { self.prior = prior; self } } +impl Default for NpodConfig { + fn default() -> Self { + Self { + max_cycles: 100, + prior: Prior::default(), + progress: true, + } + } +} + pub struct NPOD { equation: E, psi: Psi, @@ -77,15 +84,17 @@ impl NPOD { equation: E, data: Data, error_models: AssayErrorModels, - _parameters: &NonParametricParameters, // Kept for trait symmetry, even if NPOD uses config.prior directly + parameters: &NonParametricParameters, config: NpodConfig, ) -> Result { let gamma_delta = vec![0.1; error_models.len()]; + let theta = config.prior.theta(parameters)?; + Ok(Self { equation, psi: Psi::new(), - theta: config.prior.clone(), // Initialize grid from config + theta: theta, lambda: Weights::default(), w: Weights::default(), last_objf: -1e30, @@ -462,22 +471,13 @@ impl Fitter for NPOD { type Output = NonParametricResult; fn fit(mut self) -> Result { - // Standard iterative execution loop for non-parametric evaluation - self.increment_cycle(); - self.estimation()?; - + self.initialize()?; + #[allow(clippy::while_let_loop)] loop { - let status = self.evaluation()?; - if let Status::Stop(_) = status { - break; + match self.next_cycle()? { + Status::Continue => continue, + Status::Stop(_) => break, } - - self.condensation()?; - self.expansion()?; - self.optimizations()?; - - self.increment_cycle(); - self.estimation()?; } // Return the strictly-typed NonParametricResult From 0be4f0dd0457101cba7c5ab9741766c721039546 Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 20:54:03 +0200 Subject: [PATCH 32/47] Docs --- src/algorithms/nonparametric/npmap.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index 8d0860be5..156f42b37 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -16,9 +16,10 @@ use pharmsol::prelude::{ use crate::estimation::nonparametric::ipm::burke; use serde::{Deserialize, Serialize}; -/// Configuration options for the posterior probability reweighting algorithm. +/// Configuration options for the non-parametric maximum a posteriori (NPMAP) algorithm #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct NpmapConfig { + /// The prior distribution for which to calcualte the posterior probabilities pub prior: Prior, } @@ -41,8 +42,10 @@ impl NpmapConfig { } } -/// Posterior probability algorithm -/// Reweights the prior probabilities to the observed data and error model +/// Non-parametric maximum a posteriori (NPMAP) algorithm +/// +/// This algorithm is a wrapper around the IPM algorithm that calculates the posterior probabilities of the support points +/// given a prior distribution and the likelihood of the data. pub struct NPMAP { equation: E, psi: Psi, @@ -52,7 +55,6 @@ pub struct NPMAP { cycle: usize, status: Status, data: Data, - config: NpmapConfig, cyclelog: CycleLog, error_models: AssayErrorModels, } @@ -77,7 +79,6 @@ impl NPMAP { cycle: 0, status: Status::Continue, data, - config, cyclelog: CycleLog::new(), error_models, }) From ca7dde222ebba9aa6c61e817a41368f0261a337a Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 28 May 2026 21:48:08 +0200 Subject: [PATCH 33/47] Refactor theta reading from file --- examples/bestdose.rs | 5 +- examples/bestdose_auc.rs | 5 +- examples/bestdose_bounds.rs | 5 +- examples/bestdose_cov.rs | 5 +- src/algorithms/nonparametric/npag.rs | 26 +++++- src/bestdose/posterior.rs | 8 +- src/estimation/nonparametric/mod.rs | 2 +- src/estimation/nonparametric/prior/mod.rs | 104 ++-------------------- src/estimation/nonparametric/theta.rs | 88 +++++++++++++++++- src/lib.rs | 2 +- src/model/parameter_space.rs | 1 + 11 files changed, 140 insertions(+), 111 deletions(-) diff --git a/examples/bestdose.rs b/examples/bestdose.rs index 812b36b2a..64c2a3554 100644 --- a/examples/bestdose.rs +++ b/examples/bestdose.rs @@ -65,7 +65,10 @@ fn main() -> Result<()> { .observation(18.0, conc(6.0, 75.0) + conc(18.0, 150.0), 0) .build(); - let (theta, prior) = read_prior("examples/bimodal_ke/output/theta.csv", ¶meter_space)?; + let (theta, prior) = Theta::from_file( + &"examples/bimodal_ke/output/theta.csv".to_string(), + ¶meter_space, + )?; let posterior = BestDosePosterior::compute( &theta, diff --git a/examples/bestdose_auc.rs b/examples/bestdose_auc.rs index 95c926a28..ec9b03cc9 100644 --- a/examples/bestdose_auc.rs +++ b/examples/bestdose_auc.rs @@ -43,7 +43,10 @@ fn main() -> Result<()> { // Load realistic prior from previous NPAG run (47 support points) println!("Loading prior from bimodal_ke example..."); - let (theta, prior) = read_prior("examples/bimodal_ke/output/theta.csv", ¶meter_space)?; + let (theta, prior) = Theta::from_file( + &"examples/bimodal_ke/output/theta.csv".to_string(), + ¶meter_space, + )?; let weights = prior.as_ref().unwrap(); println!("Prior: {} support points\n", theta.matrix().nrows()); diff --git a/examples/bestdose_bounds.rs b/examples/bestdose_bounds.rs index 7d2bbae43..833fa7f38 100644 --- a/examples/bestdose_bounds.rs +++ b/examples/bestdose_bounds.rs @@ -40,7 +40,10 @@ fn main() -> Result<()> { // Load realistic prior from previous NPAG run println!("Loading prior from bimodal_ke example..."); - let (theta, prior) = read_prior("examples/bimodal_ke/output/theta.csv", ¶meter_space)?; + let (theta, prior) = Theta::from_file( + &"examples/bimodal_ke/output/theta.csv".to_string(), + ¶meter_space, + )?; let weights = prior.as_ref().unwrap(); println!("Prior: {} support points\n", theta.matrix().nrows()); diff --git a/examples/bestdose_cov.rs b/examples/bestdose_cov.rs index e439ad60b..9ff7737c0 100644 --- a/examples/bestdose_cov.rs +++ b/examples/bestdose_cov.rs @@ -90,7 +90,10 @@ fn main() -> Result<()> { .observation(18.0, conc(6.0, 75.0) + conc(18.0, 150.0), 0) .build(); - let (mut theta, prior) = read_prior("examples/bimodal_ke/output/theta.csv", ¶meter_space)?; + let (mut theta, prior) = Theta::from_file( + &"examples/bimodal_ke/output/theta.csv".to_string(), + ¶meter_space, + )?; let m_t = theta.matrix_mut(); for i in 0..m_t.nrows() { diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index f8e77c96b..d6ce9cf75 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -541,7 +541,9 @@ impl Fitter for NPAG { #[cfg(test)] mod tests { - use super::*; + use crate::model::BoundedParameter; + + use crate::prelude::*; use pharmsol::{fa, fetch_params, lag, Subject, SubjectBuilderExt}; @@ -581,4 +583,26 @@ mod tests { Data::new(vec![subject]) } + + #[test] + fn npag_runs_without_error() { + let problem = EstimationProblem::builder(simple_equation(), simple_data()) + .nonparametric() + .parameter(BoundedParameter::new("ke", 0.001, 3.0)) + .parameter(BoundedParameter::new("v", 25.0, 250.0)) + .error( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + ) + .build() + .expect("Failed to build problem"); + + let result = problem.fit_with(NpagConfig::default()); + + assert!( + result.is_ok(), + "NPAG algorithm should run without error, but got: {:?}", + result.err() + ); + } } diff --git a/src/bestdose/posterior.rs b/src/bestdose/posterior.rs index dde087e08..08963b1af 100644 --- a/src/bestdose/posterior.rs +++ b/src/bestdose/posterior.rs @@ -201,9 +201,11 @@ pub fn npagfull_refinement( let single_point_theta = Theta::from_parts(single_point_matrix, parameter_space.clone())?; // Create and run NPAG - let mut npag_config = crate::algorithms::nonparametric::NpagConfig::default(); - npag_config.max_cycles = config.refinement_cycles(); - npag_config.progress = config.progress(); + let npag_config = NpagConfig { + max_cycles: config.refinement_cycles(), + progress: config.progress(), + ..Default::default() + }; let mut npag = NPAG::from_parts( eq.clone(), diff --git a/src/estimation/nonparametric/mod.rs b/src/estimation/nonparametric/mod.rs index 1296e60f6..a8bccafc5 100644 --- a/src/estimation/nonparametric/mod.rs +++ b/src/estimation/nonparametric/mod.rs @@ -19,7 +19,7 @@ pub(crate) use expansion::adaptative_grid; pub use ipm::burke; pub use posterior::{posterior, Posterior}; pub use predictions::{NPPredictionRow, NPPredictions}; -pub use prior::{read_prior, Prior}; +pub use prior::Prior; pub(crate) use psi::calculate_psi; pub use psi::Psi; pub use result::NonParametricResult; diff --git a/src/estimation/nonparametric/prior/mod.rs b/src/estimation/nonparametric/prior/mod.rs index c4d3a61cd..2cf7d879b 100644 --- a/src/estimation/nonparametric/prior/mod.rs +++ b/src/estimation/nonparametric/prior/mod.rs @@ -1,9 +1,7 @@ -use std::fs::File; - -use crate::estimation::nonparametric::{Theta, Weights}; +use crate::estimation::nonparametric::Theta; use crate::model::NonParametricParameters; -use anyhow::{bail, Context, Result}; -use faer::Mat; +use anyhow::{bail, Result}; + use serde::{Deserialize, Serialize}; pub mod latin; @@ -104,98 +102,6 @@ impl Default for Prior { } } -pub fn read_prior( - path: impl AsRef, - parameters: &NonParametricParameters, -) -> Result<(Theta, Option)> { - let path = path.as_ref().to_string(); - parse_prior_for_parameters(&path, ¶meters) -} - -pub(crate) fn parse_prior_for_parameters( - path: &String, - parameters: &NonParametricParameters, -) -> Result<(Theta, Option)> { - tracing::info!("Reading prior from {}", path); - let file = File::open(path).context(format!("Unable to open the prior file '{}'", path))?; - let mut reader = csv::ReaderBuilder::new() - .has_headers(true) - .from_reader(file); - - let mut parameter_names: Vec = reader - .headers()? - .clone() - .into_iter() - .map(|s| s.trim().to_owned()) - .collect(); - - let prob_index = parameter_names.iter().position(|name| name == "prob"); - if let Some(index) = prob_index { - parameter_names.remove(index); - } - - let random_names: Vec = parameters.names(); - - let mut reordered_indices: Vec = Vec::new(); - for random_name in &random_names { - match parameter_names.iter().position(|name| name == random_name) { - Some(index) => { - let adjusted_index = if let Some(prob_idx) = prob_index { - if index >= prob_idx { - index + 1 - } else { - index - } - } else { - index - }; - reordered_indices.push(adjusted_index); - } - None => bail!("Parameter {} is not present in the CSV file.", random_name), - } - } - - if parameter_names.len() > random_names.len() { - let extra_parameters: Vec<&String> = parameter_names.iter().collect(); - bail!( - "Found parameters in the prior not present in configuration: {:?}", - extra_parameters - ); - } - - let mut theta_values = Vec::new(); - let mut prob_values = Vec::new(); - - for result in reader.records() { - let record = result.unwrap(); - let values: Vec = reordered_indices - .iter() - .map(|&i| record[i].parse::().unwrap()) - .collect(); - theta_values.push(values); - - if let Some(prob_idx) = prob_index { - let prob_value: f64 = record[prob_idx].parse::().unwrap(); - prob_values.push(prob_value); - } - } - - let n_points = theta_values.len(); - let n_params = random_names.len(); - let theta_values: Vec = theta_values.into_iter().flatten().collect(); - let theta_matrix: Mat = - Mat::from_fn(n_points, n_params, |i, j| theta_values[i * n_params + j]); - - let theta = Theta::from_parts(theta_matrix, parameters.clone())?; - let weights = if !prob_values.is_empty() { - Some(Weights::from_vec(prob_values)) - } else { - None - }; - - Ok((theta, weights)) -} - #[cfg(test)] mod tests { use super::*; @@ -224,7 +130,7 @@ mod tests { let path = temp_csv_path(); fs::write(&path, "v,ke,prob\n10.0,0.5,0.3\n15.0,0.7,0.7\n").unwrap(); - let (theta, weights) = read_prior(&path, ¶meters()).unwrap(); + let (theta, weights) = Theta::from_file(&path, ¶meters()).unwrap(); let _ = fs::remove_file(&path); assert_eq!(theta.nspp(), 2); @@ -242,7 +148,7 @@ mod tests { let path = temp_csv_path(); fs::write(&path, "ke,v,extra\n0.5,10.0,1.0\n").unwrap(); - let err = read_prior(&path, ¶meters()).unwrap_err(); + let err = Theta::from_file(&path, ¶meters()).unwrap_err(); let _ = fs::remove_file(&path); assert!(err diff --git a/src/estimation/nonparametric/theta.rs b/src/estimation/nonparametric/theta.rs index 2e205a0ce..6411cf96d 100644 --- a/src/estimation/nonparametric/theta.rs +++ b/src/estimation/nonparametric/theta.rs @@ -1,6 +1,6 @@ -use std::fmt::Debug; +use std::{fmt::Debug, fs::File}; -use anyhow::{bail, Result}; +use anyhow::{bail, Context, Result}; use faer::Mat; use serde::{Deserialize, Serialize}; @@ -226,6 +226,90 @@ impl Theta { Theta::from_parts(mat, parameters) } + + pub fn from_file( + path: &String, + parameters: &NonParametricParameters, + ) -> Result<(Theta, Option)> { + tracing::info!("Reading prior from {}", path); + let file = File::open(path).context(format!("Unable to open the prior file '{}'", path))?; + let mut reader = csv::ReaderBuilder::new() + .has_headers(true) + .from_reader(file); + + let mut parameter_names: Vec = reader + .headers()? + .clone() + .into_iter() + .map(|s| s.trim().to_owned()) + .collect(); + + let prob_index = parameter_names.iter().position(|name| name == "prob"); + if let Some(index) = prob_index { + parameter_names.remove(index); + } + + let random_names: Vec = parameters.names(); + + let mut reordered_indices: Vec = Vec::new(); + for random_name in &random_names { + match parameter_names.iter().position(|name| name == random_name) { + Some(index) => { + let adjusted_index = if let Some(prob_idx) = prob_index { + if index >= prob_idx { + index + 1 + } else { + index + } + } else { + index + }; + reordered_indices.push(adjusted_index); + } + None => bail!("Parameter {} is not present in the CSV file.", random_name), + } + } + + if parameter_names.len() > random_names.len() { + let extra_parameters: Vec<&String> = parameter_names.iter().collect(); + bail!( + "Found parameters in the prior not present in configuration: {:?}", + extra_parameters + ); + } + + let mut theta_values = Vec::new(); + let mut prob_values = Vec::new(); + + for result in reader.records() { + let record = result.unwrap(); + let values: Vec = reordered_indices + .iter() + .map(|&i| record[i].parse::().unwrap()) + .collect(); + theta_values.push(values); + + if let Some(prob_idx) = prob_index { + let prob_value: f64 = record[prob_idx].parse::().unwrap(); + prob_values.push(prob_value); + } + } + + let n_points = theta_values.len(); + let n_params = random_names.len(); + let theta_values: Vec = theta_values.into_iter().flatten().collect(); + let theta_matrix: Mat = + Mat::from_fn(n_points, n_params, |i, j| theta_values[i * n_params + j]); + + let theta = Theta::from_parts(theta_matrix, parameters.clone())?; + let weights = if !prob_values.is_empty() { + Some(Weights::from_vec(prob_values)) + } else { + None + }; + + Ok((theta, weights)) + } } impl Debug for Theta { diff --git a/src/lib.rs b/src/lib.rs index e39edbe06..d3efcb0f7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -84,7 +84,7 @@ pub mod prelude { pub use pharmsol; - pub use crate::estimation::nonparametric::{read_prior, Prior}; + pub use crate::estimation::nonparametric::Prior; pub mod simulator { pub use pharmsol::prelude::simulator::*; diff --git a/src/model/parameter_space.rs b/src/model/parameter_space.rs index d9c3ddc21..1630394e4 100644 --- a/src/model/parameter_space.rs +++ b/src/model/parameter_space.rs @@ -126,6 +126,7 @@ impl ParametricParameters { self.items.push(item); } + #[allow(clippy::should_implement_trait)] pub fn add(mut self, item: UnboundedParameter) -> Self { self.push(item); self From add8213ac4f1606a6ac312a3f1009f6b1e3c8c9c Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Mon, 8 Jun 2026 11:01:45 +0200 Subject: [PATCH 34/47] Refactor parameters --- benches/bimodal_ke.rs | 12 +- examples/bestdose.rs | 6 +- examples/bestdose_auc.rs | 6 +- examples/bestdose_bounds.rs | 6 +- examples/bestdose_cov.rs | 6 +- examples/bimodal_ke/main.rs | 7 +- examples/bimodal_ke_backend_compare.rs | 4 +- examples/drusano/main.rs | 50 ++-- examples/iov/main.rs | 2 +- examples/meta/main.rs | 14 +- examples/neely/main.rs | 20 +- examples/new_iov/main.rs | 4 +- examples/theophylline/main.rs | 6 +- examples/two_eq_lag/main.rs | 8 +- examples/vanco_sde/main.rs | 12 +- src/algorithms/nonparametric/npag.rs | 12 +- src/algorithms/nonparametric/npmap.rs | 4 +- src/algorithms/nonparametric/npod.rs | 4 +- src/api/estimation_problem.rs | 40 +-- src/bestdose/types.rs | 8 +- src/estimation/nonparametric/expansion.rs | 8 +- src/estimation/nonparametric/prior/latin.rs | 14 +- src/estimation/nonparametric/prior/mod.rs | 14 +- src/estimation/nonparametric/prior/sobol.rs | 18 +- src/estimation/nonparametric/theta.rs | 18 +- src/lib.rs | 7 +- src/model/mod.rs | 3 +- src/model/parameter_space.rs | 262 ++++++++++---------- tests/bestdose_tests.rs | 12 +- tests/onecomp.rs | 14 +- tests/results_summary_tests.rs | 6 +- 31 files changed, 301 insertions(+), 306 deletions(-) diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index b428b59aa..639e7a320 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -33,8 +33,8 @@ fn setup_npag() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) .nonparametric() - .parameter(BoundedParameter::new("ke", 0.001, 3.0)) - .parameter(BoundedParameter::new("v", 25.0, 250.0)) + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), @@ -46,8 +46,8 @@ fn setup_npod() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) .nonparametric() - .parameter(BoundedParameter::new("ke", 0.001, 3.0)) - .parameter(BoundedParameter::new("v", 25.0, 250.0)) + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), @@ -59,8 +59,8 @@ fn setup_postprob() -> Result> { let data = load_data()?; EstimationProblem::builder(create_equation(), data) .nonparametric() - .parameter(BoundedParameter::new("ke", 0.001, 3.0)) - .parameter(BoundedParameter::new("v", 25.0, 250.0)) + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), diff --git a/examples/bestdose.rs b/examples/bestdose.rs index 64c2a3554..98a4a9f04 100644 --- a/examples/bestdose.rs +++ b/examples/bestdose.rs @@ -20,9 +20,9 @@ fn main() -> Result<()> { }, }; - let parameter_space = NonParametricParameters::new() - .add(BoundedParameter::new("ke", 0.001, 3.0)) - .add(BoundedParameter::new("v", 25.0, 250.0)); + let parameter_space = ParameterSpace::::new() + .add(Parameter::bounded("ke", 0.001, 3.0)) + .add(Parameter::bounded("v", 25.0, 250.0)); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bestdose_auc.rs b/examples/bestdose_auc.rs index ec9b03cc9..457d9f250 100644 --- a/examples/bestdose_auc.rs +++ b/examples/bestdose_auc.rs @@ -28,9 +28,9 @@ fn main() -> Result<()> { }; // Minimal parameter ranges - let parameter_space = NonParametricParameters::new() - .add(BoundedParameter::new("ke", 0.001, 3.0)) - .add(BoundedParameter::new("v", 25.0, 250.0)); + let parameter_space = ParameterSpace::::new() + .add(Parameter::bounded("ke", 0.001, 3.0)) + .add(Parameter::bounded("v", 25.0, 250.0)); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bestdose_bounds.rs b/examples/bestdose_bounds.rs index 833fa7f38..4e4e6a887 100644 --- a/examples/bestdose_bounds.rs +++ b/examples/bestdose_bounds.rs @@ -27,9 +27,9 @@ fn main() -> Result<()> { }, }; - let parameter_space = NonParametricParameters::new() - .add(BoundedParameter::new("ke", 0.001, 3.0)) - .add(BoundedParameter::new("v", 25.0, 250.0)); + let parameter_space = ParameterSpace::::new() + .add(Parameter::bounded("ke", 0.001, 3.0)) + .add(Parameter::bounded("v", 25.0, 250.0)); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bestdose_cov.rs b/examples/bestdose_cov.rs index 9ff7737c0..c0ed27c9a 100644 --- a/examples/bestdose_cov.rs +++ b/examples/bestdose_cov.rs @@ -21,9 +21,9 @@ fn main() -> Result<()> { }, }; - let parameter_space = NonParametricParameters::new() - .add(BoundedParameter::new("ke", 0.001, 3.0)) - .add(BoundedParameter::new("v", 25.0 / 70.0, 250.0 / 70.0)); + let parameter_space = ParameterSpace::::new() + .add(Parameter::bounded("ke", 0.001, 3.0)) + .add(Parameter::bounded("v", 25.0 / 70.0, 250.0 / 70.0)); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 955e8e746..bf6cd93fc 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -1,6 +1,5 @@ use anyhow::Result; -use pmcore::{model::BoundedParameter, prelude::*}; -// (Assuming BoundedParameter, NpagConfig, etc., are exported in your prelude) +use pmcore::prelude::*; fn main() -> Result<()> { Logger::new().stdout(true).init()?; @@ -26,8 +25,8 @@ fn main() -> Result<()> { let problem = EstimationProblem::builder(eq, data) .nonparametric() - .parameter(BoundedParameter::new("ke", 0.001, 3.0)) - .parameter(BoundedParameter::new("v", 25.0, 250.0)) + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), diff --git a/examples/bimodal_ke_backend_compare.rs b/examples/bimodal_ke_backend_compare.rs index 727c72bb5..08d155cc5 100644 --- a/examples/bimodal_ke_backend_compare.rs +++ b/examples/bimodal_ke_backend_compare.rs @@ -204,8 +204,8 @@ fn run_case Result<()> { let eq = ode! { @@ -66,30 +66,30 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/drusano/data.csv")?; EstimationProblem::builder(eq, data) .nonparametric() - .parameter(BoundedParameter::new("v1", 5.0, 160.0)) - .parameter(BoundedParameter::new("cl1", 4.0, 9.0)) - .parameter(BoundedParameter::new("v2", 100.0, 200.0)) - .parameter(BoundedParameter::new("cl2", 25.0, 35.0)) - .parameter(BoundedParameter::new("popmax", 100000000.0, 100000000000.0)) - .parameter(BoundedParameter::new("kgs", 0.01, 0.25)) - .parameter(BoundedParameter::new("kks", 0.01, 0.5)) - .parameter(BoundedParameter::new("e50_1s", 0.1, 2.5)) - .parameter(BoundedParameter::new("e50_2s", 0.1, 10.0)) - .parameter(BoundedParameter::new("alpha_s", -8.0, 5.0)) - .parameter(BoundedParameter::new("kgr1", 0.004, 0.1)) - .parameter(BoundedParameter::new("kkr1", 0.08, 0.4)) - .parameter(BoundedParameter::new("e50_1r1", 8.0, 17.0)) - .parameter(BoundedParameter::new("alpha_r1", -8.0, 5.0)) - .parameter(BoundedParameter::new("kgr2", 0.004, 0.3)) - .parameter(BoundedParameter::new("kkr2", 0.1, 0.5)) - .parameter(BoundedParameter::new("e50_2r2", 5.0, 8.0)) - .parameter(BoundedParameter::new("alpha_r2", -5.0, 5.0)) - .parameter(BoundedParameter::new("init_4", -1.0, 4.0)) - .parameter(BoundedParameter::new("init_5", -1.0, 3.0)) - .parameter(BoundedParameter::new("h1s", 0.5, 8.0)) - .parameter(BoundedParameter::new("h2s", 0.1, 4.0)) - .parameter(BoundedParameter::new("h1r1", 5.0, 25.0)) - .parameter(BoundedParameter::new("h2r2", 10.0, 22.0)) + .parameter(Parameter::bounded("v1", 5.0, 160.0)) + .parameter(Parameter::bounded("cl1", 4.0, 9.0)) + .parameter(Parameter::bounded("v2", 100.0, 200.0)) + .parameter(Parameter::bounded("cl2", 25.0, 35.0)) + .parameter(Parameter::bounded("popmax", 100000000.0, 100000000000.0)) + .parameter(Parameter::bounded("kgs", 0.01, 0.25)) + .parameter(Parameter::bounded("kks", 0.01, 0.5)) + .parameter(Parameter::bounded("e50_1s", 0.1, 2.5)) + .parameter(Parameter::bounded("e50_2s", 0.1, 10.0)) + .parameter(Parameter::bounded("alpha_s", -8.0, 5.0)) + .parameter(Parameter::bounded("kgr1", 0.004, 0.1)) + .parameter(Parameter::bounded("kkr1", 0.08, 0.4)) + .parameter(Parameter::bounded("e50_1r1", 8.0, 17.0)) + .parameter(Parameter::bounded("alpha_r1", -8.0, 5.0)) + .parameter(Parameter::bounded("kgr2", 0.004, 0.3)) + .parameter(Parameter::bounded("kkr2", 0.1, 0.5)) + .parameter(Parameter::bounded("e50_2r2", 5.0, 8.0)) + .parameter(Parameter::bounded("alpha_r2", -5.0, 5.0)) + .parameter(Parameter::bounded("init_4", -1.0, 4.0)) + .parameter(Parameter::bounded("init_5", -1.0, 3.0)) + .parameter(Parameter::bounded("h1s", 0.5, 8.0)) + .parameter(Parameter::bounded("h2s", 0.1, 4.0)) + .parameter(Parameter::bounded("h1r1", 5.0, 25.0)) + .parameter(Parameter::bounded("h2r2", 10.0, 22.0)) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), diff --git a/examples/iov/main.rs b/examples/iov/main.rs index 3c8aa46b4..2f30ac196 100644 --- a/examples/iov/main.rs +++ b/examples/iov/main.rs @@ -29,7 +29,7 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/iov/test.csv").unwrap(); EstimationProblem::builder(sde, data) .nonparametric() - .parameter(BoundedParameter::new("ke0", 0.001, 2.0)) + .parameter(Parameter::bounded("ke0", 0.001, 2.0)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), diff --git a/examples/meta/main.rs b/examples/meta/main.rs index 08fea77d4..b280349b9 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -34,13 +34,13 @@ fn main() { let data = data::read_pmetrics("examples/meta/meta.csv").unwrap(); EstimationProblem::builder(eq, data) .nonparametric() - .parameter(BoundedParameter::new("cls", 0.1, 10.0)) - .parameter(BoundedParameter::new("fm", 0.0, 1.0)) - .parameter(BoundedParameter::new("k20", 0.01, 1.0)) - .parameter(BoundedParameter::new("relv", 0.1, 1.0)) - .parameter(BoundedParameter::new("theta1", 0.1, 10.0)) - .parameter(BoundedParameter::new("theta2", 0.1, 10.0)) - .parameter(BoundedParameter::new("vs", 1.0, 10.0)) + .parameter(Parameter::bounded("cls", 0.1, 10.0)) + .parameter(Parameter::bounded("fm", 0.0, 1.0)) + .parameter(Parameter::bounded("k20", 0.01, 1.0)) + .parameter(Parameter::bounded("relv", 0.1, 1.0)) + .parameter(Parameter::bounded("theta1", 0.1, 10.0)) + .parameter(Parameter::bounded("theta2", 0.1, 10.0)) + .parameter(Parameter::bounded("vs", 1.0, 10.0)) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), diff --git a/examples/neely/main.rs b/examples/neely/main.rs index 5a7c6c960..2b9d14931 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -49,16 +49,16 @@ fn main() { let data = data::read_pmetrics("examples/neely/data.csv").unwrap(); EstimationProblem::builder(eq, data) .nonparametric() - .parameter(BoundedParameter::new("cls", 0.0, 0.4)) - .parameter(BoundedParameter::new("k30", 0.0, 0.5)) - .parameter(BoundedParameter::new("k40", 0.3, 1.5)) - .parameter(BoundedParameter::new("qs", 0.0, 0.5)) - .parameter(BoundedParameter::new("vps", 0.0, 5.0)) - .parameter(BoundedParameter::new("vs", 0.0, 2.0)) - .parameter(BoundedParameter::new("fm1", 0.0, 0.2)) - .parameter(BoundedParameter::new("fm2", 0.0, 0.1)) - .parameter(BoundedParameter::new("theta1", -4.0, 2.0)) - .parameter(BoundedParameter::new("theta2", -2.0, 0.5)) + .parameter(Parameter::bounded("cls", 0.0, 0.4)) + .parameter(Parameter::bounded("k30", 0.0, 0.5)) + .parameter(Parameter::bounded("k40", 0.3, 1.5)) + .parameter(Parameter::bounded("qs", 0.0, 0.5)) + .parameter(Parameter::bounded("vps", 0.0, 5.0)) + .parameter(Parameter::bounded("vs", 0.0, 2.0)) + .parameter(Parameter::bounded("fm1", 0.0, 0.2)) + .parameter(Parameter::bounded("fm2", 0.0, 0.1)) + .parameter(Parameter::bounded("theta1", -4.0, 2.0)) + .parameter(Parameter::bounded("theta2", -2.0, 0.5)) .error( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index 36b0f401c..beb2ef3c3 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -28,8 +28,8 @@ fn main() { let data = data::read_pmetrics("examples/new_iov/data.csv").unwrap(); EstimationProblem::builder(sde, data) .nonparametric() - .parameter(BoundedParameter::new("ke0", 0.0001, 2.4)) - .parameter(BoundedParameter::new("ske", 0.0001, 0.2)) + .parameter(Parameter::bounded("ke0", 0.0001, 2.4)) + .parameter(Parameter::bounded("ske", 0.0001, 0.2)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index 6cfda5b07..62dcc05e0 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -18,9 +18,9 @@ fn main() { let data = data::read_pmetrics("examples/theophylline/theophylline.csv").unwrap(); EstimationProblem::builder(analytical, data) .nonparametric() - .parameter(BoundedParameter::new("ka", 0.001, 3.0)) - .parameter(BoundedParameter::new("ke", 0.001, 3.0)) - .parameter(BoundedParameter::new("v", 0.001, 50.0)) + .parameter(Parameter::bounded("ka", 0.001, 3.0)) + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 0.001, 50.0)) .error( "outeq_0", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index 11d9d121e..53901012d 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -24,10 +24,10 @@ fn main() { let data = data::read_pmetrics("examples/two_eq_lag/two_eq_lag.csv").unwrap(); EstimationProblem::builder(eq, data) .nonparametric() - .parameter(BoundedParameter::new("ka", 0.1, 0.9)) - .parameter(BoundedParameter::new("ke", 0.001, 0.1)) - .parameter(BoundedParameter::new("tlag", 0.0, 4.0)) - .parameter(BoundedParameter::new("v", 30.0, 120.0)) + .parameter(Parameter::bounded("ka", 0.1, 0.9)) + .parameter(Parameter::bounded("ke", 0.001, 0.1)) + .parameter(Parameter::bounded("tlag", 0.0, 4.0)) + .parameter(Parameter::bounded("v", 30.0, 120.0)) .error( "outeq_0", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index 2b96e2b84..cf1f2ee2c 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -50,12 +50,12 @@ fn main() { let data = data::read_pmetrics("examples/vanco_sde/vanco_clean.csv").unwrap(); EstimationProblem::builder(sde, data) .nonparametric() - .parameter(BoundedParameter::new("ka", 0.0001, 2.4)) - .parameter(BoundedParameter::new("ke0", 0.0001, 2.7)) - .parameter(BoundedParameter::new("kcp", 0.0001, 2.4)) - .parameter(BoundedParameter::new("kpc", 0.0001, 2.4)) - .parameter(BoundedParameter::new("vol", 0.2, 12.0)) - .parameter(BoundedParameter::new("ske", 0.0001, 0.2)) + .parameter(Parameter::bounded("ka", 0.0001, 2.4)) + .parameter(Parameter::bounded("ke0", 0.0001, 2.7)) + .parameter(Parameter::bounded("kcp", 0.0001, 2.4)) + .parameter(Parameter::bounded("kpc", 0.0001, 2.4)) + .parameter(Parameter::bounded("vol", 0.2, 12.0)) + .parameter(Parameter::bounded("ske", 0.0001, 0.2)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index d6ce9cf75..1081f7442 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -7,7 +7,7 @@ use crate::estimation::nonparametric::{ pub(crate) use crate::estimation::nonparametric::ipm::burke; pub(crate) use crate::estimation::nonparametric::qr; -use crate::model::parameter_space::NonParametricParameters; +use crate::model::parameter_space::{BoundedParameter, ParameterSpace}; use anyhow::bail; use anyhow::Result; @@ -155,7 +155,7 @@ impl NPAG { equation: E, data: Data, error_models: AssayErrorModels, - parameters: &NonParametricParameters, + parameters: &ParameterSpace, config: NpagConfig, ) -> Result { let ranges = parameters.finite_ranges(); @@ -509,7 +509,7 @@ impl Algorithm for NpagConfig { type Runner = NPAG; fn build_runner(self, problem: EstimationProblem) -> Result { - // Here, problem.parameters is strictly NonParametricParameters + // Here, problem.parameters is strictly ParameterSpace // and problem.error_models is strictly AssayErrorModels! NPAG::from_parts( @@ -541,8 +541,6 @@ impl Fitter for NPAG { #[cfg(test)] mod tests { - use crate::model::BoundedParameter; - use crate::prelude::*; use pharmsol::{fa, fetch_params, lag, Subject, SubjectBuilderExt}; @@ -588,8 +586,8 @@ mod tests { fn npag_runs_without_error() { let problem = EstimationProblem::builder(simple_equation(), simple_data()) .nonparametric() - .parameter(BoundedParameter::new("ke", 0.001, 3.0)) - .parameter(BoundedParameter::new("v", 25.0, 250.0)) + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) .error( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index 156f42b37..88827d045 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -4,7 +4,7 @@ use crate::{ estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, }, - model::parameter_space::NonParametricParameters, + model::parameter_space::{BoundedParameter, ParameterSpace}, }; use anyhow::{Context, Result}; @@ -64,7 +64,7 @@ impl NPMAP { equation: E, data: Data, error_models: AssayErrorModels, - parameters: &NonParametricParameters, + parameters: &ParameterSpace, config: NpmapConfig, ) -> Result { // Generate or load the initial support points from the prior diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 94db0a0ac..814ae9982 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -5,7 +5,7 @@ use crate::{ calculate_psi, ipm::burke, qr, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, }, - model::parameter_space::NonParametricParameters, + model::parameter_space::{BoundedParameter, ParameterSpace}, }; use pharmsol::ParameterOptimizer; @@ -84,7 +84,7 @@ impl NPOD { equation: E, data: Data, error_models: AssayErrorModels, - parameters: &NonParametricParameters, + parameters: &ParameterSpace, config: NpodConfig, ) -> Result { let gamma_delta = vec![0.1; error_models.len()]; diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index c8785ee35..2aa9da75d 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -3,9 +3,7 @@ use pharmsol::{ AssayErrorModel, AssayErrorModels, Data, Equation, ResidualErrorModel, ResidualErrorModels, }; -use crate::model::parameter_space::{ - BoundedParameter, NonParametricParameters, ParametricParameters, UnboundedParameter, -}; +use crate::model::parameter_space::{BoundedParameter, ParameterSpace, UnboundedParameter}; use crate::model::{EquationMetadataSource, Model, ModelBuilder}; pub trait Framework { @@ -15,13 +13,13 @@ pub trait Framework { pub struct Parametric; impl Framework for Parametric { type ErrorModels = ResidualErrorModels; - type Parameters = ParametricParameters; + type Parameters = ParameterSpace; } pub struct NonParametric; impl Framework for NonParametric { type ErrorModels = AssayErrorModels; - type Parameters = NonParametricParameters; + type Parameters = ParameterSpace; } #[derive(Debug, Clone)] @@ -42,7 +40,7 @@ impl EstimationProblemBuilder { NonParametricBuilder { model: self.model, data: self.data, - parameters: NonParametricParameters::new(), + parameters: ParameterSpace::::new(), error_models: Vec::new(), } } @@ -51,7 +49,7 @@ impl EstimationProblemBuilder { ParametricBuilder { model: self.model, data: self.data, - parameters: ParametricParameters::new(), + parameters: ParameterSpace::::new(), error_models: Vec::new(), } } @@ -69,19 +67,23 @@ impl EstimationProblem { pub struct NonParametricBuilder { model: ModelBuilder, data: Data, - parameters: NonParametricParameters, + parameters: ParameterSpace, error_models: Vec<(String, AssayErrorModel)>, } impl NonParametricBuilder { - pub fn parameter(mut self, parameter: BoundedParameter) -> Self { - self.parameters.push(parameter); + pub fn parameter(mut self, parameter: impl Into) -> Self { + self.parameters.push(parameter.into()); self } - pub fn parameters(mut self, parameters: impl IntoIterator) -> Self { + pub fn parameters(mut self, parameters: I) -> Self + where + P: Into, + I: IntoIterator, + { for param in parameters { - self.parameters.push(param); + self.parameters.push(param.into()); } self } @@ -124,19 +126,23 @@ impl NonParametricBuilder { pub struct ParametricBuilder { model: ModelBuilder, data: Data, - parameters: ParametricParameters, + parameters: ParameterSpace, error_models: Vec<(String, ResidualErrorModel)>, } impl ParametricBuilder { - pub fn parameter(mut self, parameter: UnboundedParameter) -> Self { - self.parameters.push(parameter); + pub fn parameter(mut self, parameter: impl Into) -> Self { + self.parameters.push(parameter.into()); self } - pub fn parameters(mut self, parameters: impl IntoIterator) -> Self { + pub fn parameters(mut self, parameters: I) -> Self + where + P: Into, + I: IntoIterator, + { for param in parameters { - self.parameters.push(param); + self.parameters.push(param.into()); } self } diff --git a/src/bestdose/types.rs b/src/bestdose/types.rs index 6781da9e0..eb4199540 100644 --- a/src/bestdose/types.rs +++ b/src/bestdose/types.rs @@ -10,7 +10,7 @@ use std::fmt::Display; use crate::estimation::nonparametric::{NPPredictions, Prior, Theta, Weights}; -use crate::model::NonParametricParameters; +use crate::model::{BoundedParameter, ParameterSpace}; use crate::prelude::*; use pharmsol::prelude::*; use serde::{Deserialize, Serialize}; @@ -186,7 +186,7 @@ impl Default for DoseRange { #[derive(Debug, Clone)] pub struct BestDoseConfig { - pub(crate) parameter_space: NonParametricParameters, + pub(crate) parameter_space: ParameterSpace, pub(crate) error_models: AssayErrorModels, pub(crate) prior: Prior, pub(crate) refinement_cycles: usize, @@ -195,7 +195,7 @@ pub struct BestDoseConfig { } impl BestDoseConfig { - pub fn new(parameter_space: NonParametricParameters, error_models: AssayErrorModels) -> Self { + pub fn new(parameter_space: ParameterSpace, error_models: AssayErrorModels) -> Self { Self { parameter_space, error_models, @@ -226,7 +226,7 @@ impl BestDoseConfig { self } - pub fn parameter_space(&self) -> &NonParametricParameters { + pub fn parameter_space(&self) -> &ParameterSpace { &self.parameter_space } diff --git a/src/estimation/nonparametric/expansion.rs b/src/estimation/nonparametric/expansion.rs index d23816b20..fd3a4686b 100644 --- a/src/estimation/nonparametric/expansion.rs +++ b/src/estimation/nonparametric/expansion.rs @@ -45,14 +45,14 @@ pub fn adaptative_grid( #[cfg(test)] mod tests { use super::*; - use crate::model::{BoundedParameter, NonParametricParameters}; + use crate::model::{BoundedParameter, Parameter, ParameterSpace}; use faer::mat; #[test] fn adaptive_grid_expands_points_within_bounds() { - let parameters = NonParametricParameters::new() - .add(BoundedParameter::new("x", 0.0, 1.0)) - .add(BoundedParameter::new("y", 0.0, 1.0)); + let parameters = ParameterSpace::::new() + .add(Parameter::bounded("x", 0.0, 1.0)) + .add(Parameter::bounded("y", 0.0, 1.0)); let mut theta = Theta::from_parts(mat![[0.5, 0.5]], parameters).unwrap(); let ranges = [(0.0, 1.0), (0.0, 1.0)]; diff --git a/src/estimation/nonparametric/prior/latin.rs b/src/estimation/nonparametric/prior/latin.rs index 9d503d189..aff72c920 100644 --- a/src/estimation/nonparametric/prior/latin.rs +++ b/src/estimation/nonparametric/prior/latin.rs @@ -4,9 +4,9 @@ use rand::prelude::*; use rand::rngs::StdRng; use crate::estimation::nonparametric::Theta; -use crate::model::NonParametricParameters; +use crate::model::{BoundedParameter, ParameterSpace}; -pub fn generate(parameters: &NonParametricParameters, points: usize, seed: usize) -> Result { +pub fn generate(parameters: &ParameterSpace, points: usize, seed: usize) -> Result { let ranges = parameters.finite_ranges(); let mut rng = StdRng::seed_from_u64(seed as u64); @@ -31,14 +31,14 @@ pub fn generate(parameters: &NonParametricParameters, points: usize, seed: usize #[cfg(test)] mod tests { use super::*; - use crate::model::{BoundedParameter, NonParametricParameters}; + use crate::model::{BoundedParameter, Parameter, ParameterSpace}; #[test] fn latin_generate_produces_requested_shape() { - let params = NonParametricParameters::new() - .add(BoundedParameter::new("a", 0.0, 1.0)) - .add(BoundedParameter::new("b", 0.0, 1.0)) - .add(BoundedParameter::new("c", 0.0, 1.0)); + let params = ParameterSpace::::new() + .add(Parameter::bounded("a", 0.0, 1.0)) + .add(Parameter::bounded("b", 0.0, 1.0)) + .add(Parameter::bounded("c", 0.0, 1.0)); let theta = generate(¶ms, 10, 22).unwrap(); assert_eq!(theta.nspp(), 10); diff --git a/src/estimation/nonparametric/prior/mod.rs b/src/estimation/nonparametric/prior/mod.rs index 2cf7d879b..86232b9f6 100644 --- a/src/estimation/nonparametric/prior/mod.rs +++ b/src/estimation/nonparametric/prior/mod.rs @@ -1,5 +1,5 @@ use crate::estimation::nonparametric::Theta; -use crate::model::NonParametricParameters; +use crate::model::{BoundedParameter, ParameterSpace}; use anyhow::{bail, Result}; use serde::{Deserialize, Serialize}; @@ -74,7 +74,7 @@ impl Prior { /// Generates the initial support points (theta) based on the specified prior configuration /// /// If a Prior::Theta is provided, it will be returned directly. For Sobol and Latin, the support points will be generated based on the number of points and seed. - pub fn theta(&self, parameters: &NonParametricParameters) -> Result { + pub fn theta(&self, parameters: &ParameterSpace) -> Result { for parameter in parameters.iter() { if parameter.lower >= parameter.upper { bail!( @@ -105,13 +105,13 @@ impl Default for Prior { #[cfg(test)] mod tests { use super::*; - use crate::model::BoundedParameter; + use crate::model::Parameter; use std::fs; - fn parameters() -> NonParametricParameters { - NonParametricParameters::new() - .add(BoundedParameter::new("ke", 0.1, 1.0)) - .add(BoundedParameter::new("v", 5.0, 50.0)) + fn parameters() -> ParameterSpace { + ParameterSpace::::new() + .add(Parameter::bounded("ke", 0.1, 1.0)) + .add(Parameter::bounded("v", 5.0, 50.0)) } fn temp_csv_path() -> String { diff --git a/src/estimation/nonparametric/prior/sobol.rs b/src/estimation/nonparametric/prior/sobol.rs index c2fb47e9c..f33341401 100644 --- a/src/estimation/nonparametric/prior/sobol.rs +++ b/src/estimation/nonparametric/prior/sobol.rs @@ -3,9 +3,13 @@ use faer::Mat; use sobol_burley::sample; use crate::estimation::nonparametric::Theta; -use crate::model::NonParametricParameters; +use crate::model::{BoundedParameter, ParameterSpace}; -pub fn generate(parameters: &NonParametricParameters, points: usize, seed: usize) -> Result { +pub fn generate( + parameters: &ParameterSpace, + points: usize, + seed: usize, +) -> Result { let seed = seed as u32; let ranges = parameters.finite_ranges(); @@ -21,14 +25,14 @@ pub fn generate(parameters: &NonParametricParameters, points: usize, seed: usize #[cfg(test)] mod tests { use super::*; - use crate::model::BoundedParameter; + use crate::model::Parameter; #[test] fn sobol_generate_produces_requested_shape() { - let params = NonParametricParameters::new() - .add(BoundedParameter::new("a", 0.0, 1.0)) - .add(BoundedParameter::new("b", 0.0, 1.0)) - .add(BoundedParameter::new("c", 0.0, 1.0)); + let params = ParameterSpace::::new() + .add(Parameter::bounded("a", 0.0, 1.0)) + .add(Parameter::bounded("b", 0.0, 1.0)) + .add(Parameter::bounded("c", 0.0, 1.0)); let theta = generate(¶ms, 10, 22).unwrap(); assert_eq!(theta.nspp(), 10); diff --git a/src/estimation/nonparametric/theta.rs b/src/estimation/nonparametric/theta.rs index 6411cf96d..744d414ed 100644 --- a/src/estimation/nonparametric/theta.rs +++ b/src/estimation/nonparametric/theta.rs @@ -5,7 +5,7 @@ use faer::Mat; use serde::{Deserialize, Serialize}; use super::weights::Weights; -use crate::model::NonParametricParameters; +use crate::model::{BoundedParameter, ParameterSpace}; /// [Theta] is a structure that holds the support points /// These represent the joint population parameter distribution @@ -14,14 +14,14 @@ use crate::model::NonParametricParameters; #[derive(Clone, PartialEq)] pub struct Theta { matrix: Mat, - parameters: NonParametricParameters, + parameters: ParameterSpace, } impl Default for Theta { fn default() -> Self { Theta { matrix: Mat::new(), - parameters: NonParametricParameters::new(), + parameters: ParameterSpace::::new(), } } } @@ -37,7 +37,7 @@ impl Theta { /// in the [ParameterSpace] /// /// The order of parameters in the [ParameterSpace] should match the order of columns in the matrix - pub fn from_parts(matrix: Mat, parameters: NonParametricParameters) -> Result { + pub fn from_parts(matrix: Mat, parameters: ParameterSpace) -> Result { if matrix.ncols() != parameters.len() { bail!( "Number of columns in matrix ({}) does not match number of parameters ({})", @@ -62,12 +62,12 @@ impl Theta { } /// Get the [ParameterSpace] associated with this [Theta] - pub fn parameters(&self) -> &NonParametricParameters { + pub fn parameters(&self) -> &ParameterSpace { &self.parameters } /// Get a mutable reference to the [ParameterSpace] - pub fn parameters_mut(&mut self) -> &mut NonParametricParameters { + pub fn parameters_mut(&mut self) -> &mut ParameterSpace { &mut self.parameters } @@ -222,14 +222,14 @@ impl Theta { } let mat = Mat::from_fn(nrows, ncols, |i, j| rows[i][j]); - let parameters = NonParametricParameters::new(); + let parameters = ParameterSpace::::new(); Theta::from_parts(mat, parameters) } pub fn from_file( path: &String, - parameters: &NonParametricParameters, + parameters: &ParameterSpace, ) -> Result<(Theta, Option)> { tracing::info!("Reading prior from {}", path); let file = File::open(path).context(format!("Unable to open the prior file '{}'", path))?; @@ -361,7 +361,7 @@ impl<'de> Deserialize<'de> for Theta { #[derive(Deserialize)] struct ThetaSerde { matrix: Vec>, - parameters: NonParametricParameters, + parameters: ParameterSpace, } let decoded = ThetaSerde::deserialize(deserializer)?; diff --git a/src/lib.rs b/src/lib.rs index d3efcb0f7..318dc927a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -67,16 +67,13 @@ pub mod prelude { }; pub use crate::model::parameter_space::{ - BoundedParameter, NonParametricParameters, ParametricParameters, UnboundedParameter, + BoundedParameter, Parameter, ParameterScale, ParameterSpace, UnboundedParameter, }; pub use crate::estimation::nonparametric::{ CycleLog, NPCycle, NPPredictions, NonParametricResult, Posterior, Psi, Theta, Weights, }; - pub use crate::model::{ - EquationMetadataSource, ModelMetadata, ParameterDomain, ParameterSpace, - ParameterTransform as ModelParameterTransform, - }; + pub use crate::model::{EquationMetadataSource, ModelMetadata}; pub use crate::results::{ FitResult, FitSummary, IndividualSummary, ParameterSummary, PopulationSummary, }; diff --git a/src/model/mod.rs b/src/model/mod.rs index 86aca059a..79d8927f0 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -8,8 +8,7 @@ pub mod parameter_space; pub use metadata::ModelMetadata; // Re-exporting the new typestate parameter elements for easy access downstream pub use parameter_space::{ - BoundedParameter, NonParametricParameters, ParameterDomain, ParameterSpace, ParameterTransform, - ParametricParameters, UnboundedParameter, + BoundedParameter, Parameter, ParameterMeta, ParameterScale, ParameterSpace, UnboundedParameter, }; #[derive(Debug, Clone)] diff --git a/src/model/parameter_space.rs b/src/model/parameter_space.rs index 1630394e4..8fa76d425 100644 --- a/src/model/parameter_space.rs +++ b/src/model/parameter_space.rs @@ -1,65 +1,25 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub enum ParameterSpace { - NonParametric(NonParametricParameters), - Parametric(ParametricParameters), +/// Ordered collection of parameters. +/// +/// Use `ParameterSpace` for non-parametric problems and +/// `ParameterSpace` for parametric problems. +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)] +pub struct ParameterSpace { + pub items: Vec, } -impl ParameterSpace { - /// Returns the total number of parameters across either variant - pub fn len(&self) -> usize { - match self { - Self::NonParametric(p) => p.len(), - Self::Parametric(p) => p.len(), - } - } - - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - - /// Retrieves the names of the parameters, regardless of the framework - pub fn names(&self) -> Vec { - match self { - Self::NonParametric(p) => p.names(), - Self::Parametric(p) => p.names(), - } - } - - /// Convenience accessor for the non-parametric inner struct - pub fn as_nonparametric(&self) -> Option<&NonParametricParameters> { - match self { - Self::NonParametric(p) => Some(p), - Self::Parametric(_) => None, - } - } - - /// Convenience accessor for the parametric inner struct - pub fn as_parametric(&self) -> Option<&ParametricParameters> { - match self { - Self::Parametric(p) => Some(p), - Self::NonParametric(_) => None, - } - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct NonParametricParameters { - pub items: Vec, -} - -impl NonParametricParameters { +impl ParameterSpace { pub fn new() -> Self { Self { items: Vec::new() } } - pub fn push(&mut self, item: BoundedParameter) { - self.items.push(item); + pub fn push(&mut self, item: impl Into) { + self.items.push(item.into()); } #[allow(clippy::should_implement_trait)] - pub fn add(mut self, item: BoundedParameter) -> Self { + pub fn add(mut self, item: impl Into) -> Self { self.push(item); self } @@ -72,29 +32,38 @@ impl NonParametricParameters { self.items.is_empty() } - pub fn iter(&self) -> std::slice::Iter<'_, BoundedParameter> { + pub fn iter(&self) -> std::slice::Iter<'_, T> { self.items.iter() } +} +impl ParameterSpace { pub fn names(&self) -> Vec { - self.items.iter().map(|item| item.name.clone()).collect() + self.items.iter().map(|p| p.name().to_string()).collect() } +} - /// Infallible! The type system guarantees lower and upper bounds exist. +/// Helpers for bounded parameter spaces. +impl ParameterSpace { + /// Returns `(lower, upper)` for each parameter. pub fn finite_ranges(&self) -> Vec<(f64, f64)> { - self.items - .iter() - .map(|parameter| (parameter.lower, parameter.upper)) - .collect() + self.items.iter().map(|p| (p.lower, p.upper)).collect() } } -impl Default for NonParametricParameters { - fn default() -> Self { - Self::new() +impl FromIterator for ParameterSpace { + fn from_iter>(iter: I) -> Self { + Self { + items: iter.into_iter().collect(), + } } } +/// Common metadata exposed by parameter types. +pub trait ParameterMeta { + fn name(&self) -> &str; +} + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct BoundedParameter { pub name: String, @@ -112,104 +81,127 @@ impl BoundedParameter { } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct ParametricParameters { - pub items: Vec, -} - -impl ParametricParameters { - pub fn new() -> Self { - Self { items: Vec::new() } - } - - pub fn push(&mut self, item: UnboundedParameter) { - self.items.push(item); - } - - #[allow(clippy::should_implement_trait)] - pub fn add(mut self, item: UnboundedParameter) -> Self { - self.push(item); - self - } - - pub fn len(&self) -> usize { - self.items.len() - } - - pub fn is_empty(&self) -> bool { - self.items.is_empty() - } - - pub fn iter(&self) -> std::slice::Iter<'_, UnboundedParameter> { - self.items.iter() - } - - pub fn names(&self) -> Vec { - self.items.iter().map(|item| item.name.clone()).collect() +impl ParameterMeta for BoundedParameter { + fn name(&self) -> &str { + &self.name } } -impl Default for ParametricParameters { - fn default() -> Self { - Self::new() +/// Converts a bounded parameter into a parametric parameter with logit scaling. +impl From for UnboundedParameter { + fn from(p: BoundedParameter) -> Self { + UnboundedParameter { + name: p.name, + scale: ParameterScale::Logit { + lower: p.lower, + upper: p.upper, + }, + initial: None, + estimate: true, + } } } +/// Parametric parameter with an optional scale transform. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct UnboundedParameter { pub name: String, - pub domain: ParameterDomain, - pub transform: ParameterTransform, + pub scale: ParameterScale, pub initial: Option, pub estimate: bool, } impl UnboundedParameter { - pub fn bounded(name: impl Into, lower: f64, upper: f64) -> Self { + /// Creates a parameter with an explicit scale. + pub fn new(name: impl Into, scale: ParameterScale) -> Self { Self { name: name.into(), - domain: ParameterDomain::Bounded { lower, upper }, - transform: ParameterTransform::Identity, + scale, initial: None, estimate: true, } } - pub fn positive(name: impl Into) -> Self { - Self { - name: name.into(), - domain: ParameterDomain::Positive { - lower: Some(0.0), - upper: None, - }, - transform: ParameterTransform::LogNormal, - initial: None, - estimate: true, - } + /// Creates a parameter on identity scale. + pub fn real(name: impl Into) -> Self { + Self::new(name, ParameterScale::Identity) + } + + /// Sets an initial value. + pub fn with_initial(mut self, value: f64) -> Self { + self.initial = Some(value); + self + } +} + +impl ParameterMeta for UnboundedParameter { + fn name(&self) -> &str { + &self.name } } +/// Scale transform for parametric parameters. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] -pub enum ParameterDomain { - Positive { - lower: Option, - upper: Option, - }, - Unbounded { - lower: Option, - upper: Option, - }, - Bounded { - lower: f64, - upper: f64, - }, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)] -pub enum ParameterTransform { - #[default] +pub enum ParameterScale { + /// Identity transform. Identity, - LogNormal, - Probit, - Logit, + /// Log transform. + Log, + /// Logistic transform on `(lower, upper)`. + Logit { lower: f64, upper: f64 }, + /// Probit transform on `(lower, upper)`. + Probit { lower: f64, upper: f64 }, +} + +impl Default for ParameterScale { + fn default() -> Self { + ParameterScale::Identity + } +} + +/// Entry point for building parameter declarations. +/// +/// ```ignore +/// use pmcore::prelude::*; +/// +/// // Non-parametric: only bounded parameters are accepted. +/// builder.parameter(Parameter::bounded("ke", 0.001, 3.0)); +/// +/// // Parametric: pick the scale explicitly. +/// builder.parameter(Parameter::log("ke")); +/// builder.parameter(Parameter::logit("frac", 0.0, 1.0)); +/// builder.parameter(Parameter::bounded("v", 25.0, 250.0)); // mapped to Logit +/// ``` +pub struct Parameter; + +impl Parameter { + /// Creates a bounded parameter. + pub fn bounded(name: impl Into, lower: f64, upper: f64) -> BoundedParameter { + BoundedParameter::new(name, lower, upper) + } + + /// Creates a parametric parameter on identity scale. + pub fn real(name: impl Into) -> UnboundedParameter { + UnboundedParameter::real(name) + } + + /// Creates a parametric parameter with an explicit scale. + pub fn scaled(name: impl Into, scale: ParameterScale) -> UnboundedParameter { + UnboundedParameter::new(name, scale) + } + + /// Creates a parametric parameter on log scale. + pub fn log(name: impl Into) -> UnboundedParameter { + UnboundedParameter::new(name, ParameterScale::Log) + } + + /// Creates a parametric parameter on logit scale. + pub fn logit(name: impl Into, lower: f64, upper: f64) -> UnboundedParameter { + UnboundedParameter::new(name, ParameterScale::Logit { lower, upper }) + } + + /// Creates a parametric parameter on probit scale. + pub fn probit(name: impl Into, lower: f64, upper: f64) -> UnboundedParameter { + UnboundedParameter::new(name, ParameterScale::Probit { lower, upper }) + } } diff --git a/tests/bestdose_tests.rs b/tests/bestdose_tests.rs index 9ea2b8a28..655590469 100644 --- a/tests/bestdose_tests.rs +++ b/tests/bestdose_tests.rs @@ -1,7 +1,7 @@ use anyhow::Result; use pmcore::bestdose::{BestDoseConfig, BestDosePosterior, BestDoseProblem, DoseRange, Target}; use pmcore::estimation::nonparametric::{Theta, Weights}; -use pmcore::model::{BoundedParameter, NonParametricParameters}; +use pmcore::model::{BoundedParameter, ParameterSpace}; use pmcore::prelude::*; fn pk_parameter_space( @@ -9,14 +9,14 @@ fn pk_parameter_space( ke_upper: f64, v_lower: f64, v_upper: f64, -) -> NonParametricParameters { - NonParametricParameters::new() - .add(BoundedParameter::new("ke", ke_lower, ke_upper)) - .add(BoundedParameter::new("v", v_lower, v_upper)) +) -> ParameterSpace { + ParameterSpace::::new() + .add(Parameter::bounded("ke", ke_lower, ke_upper)) + .add(Parameter::bounded("v", v_lower, v_upper)) } fn bestdose_config( - params: &NonParametricParameters, + params: &ParameterSpace, error_models: AssayErrorModels, refinement_cycles: usize, prediction_interval: f64, diff --git a/tests/onecomp.rs b/tests/onecomp.rs index 1016c3846..71091d38c 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use pmcore::{model::BoundedParameter, prelude::*}; +use pmcore::prelude::*; fn one_compartment_metadata() -> pharmsol::equation::ModelMetadata { equation::metadata::new("one_compartment") @@ -54,8 +54,8 @@ fn test_one_compartment_npag() -> Result<()> { let result = EstimationProblem::builder(eq, data) .nonparametric() - .parameter(BoundedParameter::new("ke", 0.1, 1.0)) - .parameter(BoundedParameter::new("v", 1.0, 20.0)) + .parameter(Parameter::bounded("ke", 0.1, 1.0)) + .parameter(Parameter::bounded("v", 1.0, 20.0)) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), @@ -115,8 +115,8 @@ fn test_one_compartment_npod() -> Result<()> { let result = EstimationProblem::builder(eq, data) .nonparametric() - .parameter(BoundedParameter::new("ke", 0.1, 1.0)) - .parameter(BoundedParameter::new("v", 1.0, 20.0)) + .parameter(Parameter::bounded("ke", 0.1, 1.0)) + .parameter(Parameter::bounded("v", 1.0, 20.0)) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), @@ -176,8 +176,8 @@ fn test_one_compartment_postprob() -> Result<()> { let result = EstimationProblem::builder(eq, data) .nonparametric() - .parameter(BoundedParameter::new("ke", 0.1, 1.0)) - .parameter(BoundedParameter::new("v", 1.0, 20.0)) + .parameter(Parameter::bounded("ke", 0.1, 1.0)) + .parameter(Parameter::bounded("v", 1.0, 20.0)) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index 8163ab879..906728b68 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -1,6 +1,6 @@ use anyhow::Result; use pharmsol::{AssayErrorModel, ErrorPoly}; -use pmcore::{model::BoundedParameter, prelude::*}; +use pmcore::prelude::*; fn simple_equation() -> equation::ODE { equation::ODE::new( @@ -44,8 +44,8 @@ fn test_nonparametric_fit_result_summary_surface() -> Result<()> { let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); let result = EstimationProblem::builder(simple_equation(), simple_data()) .nonparametric() - .parameter(BoundedParameter::new("ke", 0.1, 1.0)) - .parameter(BoundedParameter::new("v", 1.0, 20.0)) + .parameter(Parameter::bounded("ke", 0.1, 1.0)) + .parameter(Parameter::bounded("v", 1.0, 20.0)) .error("0", assay_error) .build()? .fit_with(NpagConfig::default())?; From 61e9ea997dfb6cc50e78ce425727bd719e9bcf54 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Mon, 8 Jun 2026 11:32:24 +0200 Subject: [PATCH 35/47] Add validation to builder --- src/algorithms/nonparametric/npag.rs | 2 +- src/api/estimation_problem.rs | 286 +++++++++++++++++++++++++-- src/logs.rs | 2 +- src/model/mod.rs | 32 +++ tests/onecomp.rs | 16 +- 5 files changed, 318 insertions(+), 20 deletions(-) diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 1081f7442..99c565914 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -589,7 +589,7 @@ mod tests { .parameter(Parameter::bounded("ke", 0.001, 3.0)) .parameter(Parameter::bounded("v", 25.0, 250.0)) .error( - "outeq_1", + "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), ) .build() diff --git a/src/api/estimation_problem.rs b/src/api/estimation_problem.rs index 2aa9da75d..944abaa5a 100644 --- a/src/api/estimation_problem.rs +++ b/src/api/estimation_problem.rs @@ -2,6 +2,7 @@ use anyhow::{anyhow, Result}; use pharmsol::{ AssayErrorModel, AssayErrorModels, Data, Equation, ResidualErrorModel, ResidualErrorModels, }; +use std::collections::HashSet; use crate::model::parameter_space::{BoundedParameter, ParameterSpace, UnboundedParameter}; use crate::model::{EquationMetadataSource, Model, ModelBuilder}; @@ -96,13 +97,8 @@ impl NonParametricBuilder { impl NonParametricBuilder { pub fn build(self) -> Result> { - if self.parameters.is_empty() { - anyhow::bail!("at least one parameter is required for non-parametric models"); - } - - if self.error_models.is_empty() { - anyhow::bail!("at least one assay error model is required"); - } + validate_nonparametric_parameters(&self.model, &self.parameters)?; + validate_nonparametric_error_models(&self.model, &self.error_models)?; let mut all_errors = AssayErrorModels::new(); for (name, error_model) in self.error_models { @@ -155,13 +151,8 @@ impl ParametricBuilder { impl ParametricBuilder { pub fn build(self) -> Result> { - if self.parameters.is_empty() { - anyhow::bail!("at least one parameter is required for parametric models"); - } - - if self.error_models.is_empty() { - anyhow::bail!("at least one residual error model is required"); - } + validate_parametric_parameters(&self.model, &self.parameters)?; + validate_parametric_error_models(&self.model, &self.error_models)?; let mut all_errors = ResidualErrorModels::new(); for (name, error_model) in self.error_models { @@ -181,3 +172,270 @@ impl ParametricBuilder { }) } } + +fn validate_nonparametric_parameters( + model: &ModelBuilder, + parameters: &ParameterSpace, +) -> Result<()> { + if parameters.is_empty() { + anyhow::bail!("at least one parameter is required for non-parametric models"); + } + + for parameter in parameters.iter() { + if !parameter.lower.is_finite() || !parameter.upper.is_finite() { + anyhow::bail!( + "invalid bounds for parameter '{}': bounds must be finite numbers", + parameter.name + ); + } + + if parameter.lower >= parameter.upper { + anyhow::bail!( + "invalid bounds for parameter '{}': lower bound ({}) must be strictly less than upper bound ({})", + parameter.name, + parameter.lower, + parameter.upper + ); + } + } + + let names: Vec = parameters + .iter() + .map(|parameter| parameter.name.clone()) + .collect(); + validate_parameter_declarations(model, &names) +} + +fn validate_parametric_parameters( + model: &ModelBuilder, + parameters: &ParameterSpace, +) -> Result<()> { + if parameters.is_empty() { + anyhow::bail!("at least one parameter is required for parametric models"); + } + + let names: Vec = parameters + .iter() + .map(|parameter| parameter.name.clone()) + .collect(); + validate_parameter_declarations(model, &names) +} + +fn validate_parameter_declarations( + model: &ModelBuilder, + provided_names: &[String], +) -> Result<()> { + let mut seen: HashSet<&str> = HashSet::new(); + let mut duplicates: Vec = Vec::new(); + for name in provided_names { + if !seen.insert(name.as_str()) { + duplicates.push(name.clone()); + } + } + + if !duplicates.is_empty() { + duplicates.sort(); + duplicates.dedup(); + anyhow::bail!( + "duplicate parameter declarations found: {}", + duplicates.join(", ") + ); + } + + let declared = model.parameter_names(); + + let unknown: Vec = provided_names + .iter() + .filter(|name| model.parameter_index(name).is_none()) + .cloned() + .collect(); + if !unknown.is_empty() { + anyhow::bail!( + "unknown parameter name(s): {}. Valid parameters are: {}", + unknown.join(", "), + declared.join(", ") + ); + } + + let provided: HashSet<&str> = provided_names.iter().map(|name| name.as_str()).collect(); + let missing: Vec = declared + .iter() + .filter(|name| !provided.contains(name.as_str())) + .cloned() + .collect(); + + if !missing.is_empty() { + anyhow::bail!("missing parameter declaration(s): {}", missing.join(", ")); + } + + Ok(()) +} + +fn validate_nonparametric_error_models( + model: &ModelBuilder, + error_models: &[(String, AssayErrorModel)], +) -> Result<()> { + if error_models.is_empty() { + anyhow::bail!("at least one assay error model is required"); + } + + validate_error_model_labels(model, error_models.iter().map(|(name, _)| name.as_str())) +} + +fn validate_parametric_error_models( + model: &ModelBuilder, + error_models: &[(String, ResidualErrorModel)], +) -> Result<()> { + if error_models.is_empty() { + anyhow::bail!("at least one residual error model is required"); + } + + validate_error_model_labels(model, error_models.iter().map(|(name, _)| name.as_str())) +} + +fn validate_error_model_labels<'a, E, I>(model: &ModelBuilder, labels: I) -> Result<()> +where + E: Equation + EquationMetadataSource, + I: IntoIterator, +{ + let valid_outputs = model.output_names(); + let mut seen_output_indexes: HashSet = HashSet::new(); + + for name in labels { + let outeq = model.output_index(name).ok_or_else(|| { + anyhow!( + "unknown equation output label: {}. Valid outputs are: {}", + name, + valid_outputs.join(", ") + ) + })?; + + if !seen_output_indexes.insert(outeq) { + anyhow::bail!( + "duplicate error model declaration for output '{}' (index {})", + name, + outeq + ); + } + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::prelude::*; + + use pharmsol::{fa, fetch_params, lag, Subject, SubjectBuilderExt}; + + fn simple_equation() -> pharmsol::equation::ODE { + pharmsol::equation::ODE::new( + |x, p, _t, dx, b, _rateiv, _cov| { + fetch_params!(p, ke); + dx[0] = -ke * x[0] + b[0]; + }, + |_p, _t, _cov| lag! {}, + |_p, _t, _cov| fa! {}, + |_p, _t, _cov, _x| {}, + |x, p, _t, _cov, y| { + fetch_params!(p, v); + y[0] = x[0] / v; + }, + ) + .with_nstates(1) + .with_ndrugs(1) + .with_nout(1) + .with_metadata( + pharmsol::equation::metadata::new("estimation_problem_builder_validation") + .parameters(["ke", "v"]) + .states(["central"]) + .outputs(["outeq_1"]) + .route(pharmsol::equation::Route::bolus("input_1").to_state("central")), + ) + .expect("metadata attachment should validate") + } + + fn simple_data() -> Data { + let subject = Subject::builder("1") + .bolus(0.0, 100.0, 0) + .observation(1.0, 10.0, 0) + .build(); + + Data::new(vec![subject]) + } + + fn default_error_model() -> AssayErrorModel { + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0) + } + + #[test] + fn nonparametric_build_rejects_unknown_parameter_name() { + let result = EstimationProblem::builder(simple_equation(), simple_data()) + .nonparametric() + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("unknown_param", 25.0, 250.0)) + .error("outeq_1", default_error_model()) + .build(); + + assert!(result.is_err()); + let message = format!("{}", result.err().expect("error expected")); + assert!(message.contains("unknown parameter name(s): unknown_param")); + } + + #[test] + fn nonparametric_build_rejects_missing_parameter_declaration() { + let result = EstimationProblem::builder(simple_equation(), simple_data()) + .nonparametric() + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .error("outeq_1", default_error_model()) + .build(); + + assert!(result.is_err()); + let message = format!("{}", result.err().expect("error expected")); + assert!(message.contains("missing parameter declaration(s): v")); + } + + #[test] + fn nonparametric_build_rejects_duplicate_parameter_declaration() { + let result = EstimationProblem::builder(simple_equation(), simple_data()) + .nonparametric() + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("ke", 25.0, 250.0)) + .error("outeq_1", default_error_model()) + .build(); + + assert!(result.is_err()); + let message = format!("{}", result.err().expect("error expected")); + assert!(message.contains("duplicate parameter declarations found: ke")); + } + + #[test] + fn nonparametric_build_rejects_invalid_parameter_bounds() { + let result = EstimationProblem::builder(simple_equation(), simple_data()) + .nonparametric() + .parameter(Parameter::bounded("ke", 2.0, 1.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) + .error("outeq_1", default_error_model()) + .build(); + + assert!(result.is_err()); + let message = format!("{}", result.err().expect("error expected")); + assert!(message.contains("invalid bounds for parameter 'ke'")); + } + + #[test] + fn nonparametric_build_rejects_duplicate_error_model_output() { + let result = EstimationProblem::builder(simple_equation(), simple_data()) + .nonparametric() + .parameter(Parameter::bounded("ke", 0.001, 3.0)) + .parameter(Parameter::bounded("v", 25.0, 250.0)) + .error("outeq_1", default_error_model()) + .error("outeq_1", default_error_model()) + .build(); + + assert!(result.is_err()); + let message = format!("{}", result.err().expect("error expected")); + assert!(message.contains("duplicate error model declaration for output 'outeq_1'")); + } +} diff --git a/src/logs.rs b/src/logs.rs index 9f9698ea0..69abca8f4 100644 --- a/src/logs.rs +++ b/src/logs.rs @@ -172,7 +172,7 @@ where /// /// ```no_run /// use std::time::Instant; -/// use pmcore::output::Logger::format_elapsed; +/// use pmcore::logs::format_elapsed; /// /// let start = Instant::now(); /// // ... do work ... diff --git a/src/model/mod.rs b/src/model/mod.rs index 79d8927f0..26b22787e 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -80,6 +80,38 @@ impl ModelBuilder { } impl ModelBuilder { + pub(crate) fn parameter_index(&self, name: &str) -> Option { + self.equation + .equation_metadata() + .and_then(|metadata| metadata.parameter_index(name)) + } + + pub(crate) fn parameter_names(&self) -> Vec { + self.equation + .equation_metadata() + .map(|metadata| { + metadata + .parameters() + .iter() + .map(|parameter| parameter.name().to_string()) + .collect() + }) + .unwrap_or_default() + } + + pub(crate) fn output_names(&self) -> Vec { + self.equation + .equation_metadata() + .map(|metadata| { + metadata + .outputs() + .iter() + .map(|output| output.name().to_string()) + .collect() + }) + .unwrap_or_default() + } + pub(crate) fn output_index(&self, name: &str) -> Option { self.equation.equation_metadata().and_then(|metadata| { metadata diff --git a/tests/onecomp.rs b/tests/onecomp.rs index 71091d38c..6f402d284 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -64,7 +64,7 @@ fn test_one_compartment_npag() -> Result<()> { .fit_with(NpagConfig::default())?; // Check the results - assert_eq!(result.cycles(), 32); + assert_eq!(result.cycles(), 31); assert!(result.objf() - 565.7749 < 0.01); Ok(()) @@ -174,6 +174,14 @@ fn test_one_compartment_postprob() -> Result<()> { let data = data::Data::new(subjects); + // Generate a prior distribution to test against + let parameters = ParameterSpace::::new() + .add(Parameter::bounded("ke", 0.1, 1.0)) + .add(Parameter::bounded("v", 1.0, 20.0)); + + let prior = Prior::sobol(100, 22); + let theta = &prior.theta(¶meters)?; + let result = EstimationProblem::builder(eq, data) .nonparametric() .parameter(Parameter::bounded("ke", 0.1, 1.0)) @@ -183,13 +191,13 @@ fn test_one_compartment_postprob() -> Result<()> { AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), ) .build()? - .fit_with(NpmapConfig::default())?; + .fit_with(NpmapConfig::default().prior(prior))?; // Check the results assert_eq!(result.cycles(), 0); - // Should be 64 points in theta (no change in points) - assert_eq!(result.get_theta().nspp(), 64); + // Should be 2028 points in theta (no change in points) + assert_eq!(result.get_theta().nspp(), theta.nspp()); Ok(()) } From e9d49577bf6492cdb76edae8e4b64f6b1e04e670 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Mon, 8 Jun 2026 11:42:33 +0200 Subject: [PATCH 36/47] Refactor modules Removes "API" module, which is extraneous --- src/algorithms/mod.rs | 4 +- src/algorithms/nonparametric/npag.rs | 2 +- src/algorithms/nonparametric/npmap.rs | 2 +- src/algorithms/nonparametric/npod.rs | 2 +- src/api/mod.rs | 14 -- src/{api => estimation}/error_models.rs | 0 src/estimation/mod.rs | 10 ++ .../problem.rs} | 123 +----------------- src/{api => estimation}/progress.rs | 0 src/lib.rs | 15 +-- 10 files changed, 25 insertions(+), 147 deletions(-) delete mode 100644 src/api/mod.rs rename src/{api => estimation}/error_models.rs (100%) rename src/{api/estimation_problem.rs => estimation/problem.rs} (68%) rename src/{api => estimation}/progress.rs (100%) diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index 16b9dbf72..0a26db1a0 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -1,7 +1,7 @@ use std::fs; use std::path::Path; -use crate::api::{EstimationProblem, Framework}; +use crate::estimation::{EstimationProblem, Framework}; use crate::estimation::nonparametric::{NonParametricResult, Psi, Theta}; use crate::results::FitResult; @@ -16,7 +16,7 @@ use pharmsol::{Predictions, Subject}; use serde::{Deserialize, Serialize}; /// Defines an algorithm capable of building an execution engine -pub trait Algorithm { +pub trait Algorithm { /// The strictly-typed runner struct (e.g., `NPAG`) type Runner; diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 99c565914..47b212c4f 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,5 +1,5 @@ use crate::algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}; -use crate::api::{EstimationProblem, NonParametric}; +use crate::estimation::{EstimationProblem, NonParametric}; use crate::estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, }; diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index 88827d045..0ae719dd8 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -1,6 +1,6 @@ use crate::{ algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}, - api::{EstimationProblem, NonParametric}, + estimation::{EstimationProblem, NonParametric}, estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, }, diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 814ae9982..a701d8709 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -1,6 +1,6 @@ use crate::{ algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}, - api::{EstimationProblem, NonParametric}, + estimation::{EstimationProblem, NonParametric}, estimation::nonparametric::{ calculate_psi, ipm::burke, qr, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, diff --git a/src/api/mod.rs b/src/api/mod.rs deleted file mode 100644 index 62d4044fb..000000000 --- a/src/api/mod.rs +++ /dev/null @@ -1,14 +0,0 @@ -pub mod error_models; -pub mod estimation_problem; - -pub mod progress; - -pub use crate::algorithms::nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; -pub use error_models::ErrorModels; -pub use estimation_problem::{EstimationProblem, EstimationProblemBuilder}; - -pub use progress::{FitProgress, NonparametricCycleProgress}; - -pub use estimation_problem::Framework; -pub use estimation_problem::NonParametric; -pub use estimation_problem::Parametric; diff --git a/src/api/error_models.rs b/src/estimation/error_models.rs similarity index 100% rename from src/api/error_models.rs rename to src/estimation/error_models.rs diff --git a/src/estimation/mod.rs b/src/estimation/mod.rs index d97ede1fc..98ffdd84c 100644 --- a/src/estimation/mod.rs +++ b/src/estimation/mod.rs @@ -1 +1,11 @@ +pub mod error_models; pub mod nonparametric; +pub mod problem; +pub mod progress; + +pub use crate::algorithms::nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; +pub use error_models::ErrorModels; +pub use problem::{ + EstimationProblem, EstimationProblemBuilder, Framework, NonParametric, Parametric, +}; +pub use progress::{FitProgress, NonparametricCycleProgress}; diff --git a/src/api/estimation_problem.rs b/src/estimation/problem.rs similarity index 68% rename from src/api/estimation_problem.rs rename to src/estimation/problem.rs index 944abaa5a..e7e9959fe 100644 --- a/src/api/estimation_problem.rs +++ b/src/estimation/problem.rs @@ -11,11 +11,14 @@ pub trait Framework { type ErrorModels; type Parameters; } + pub struct Parametric; + impl Framework for Parametric { type ErrorModels = ResidualErrorModels; type Parameters = ParameterSpace; } + pub struct NonParametric; impl Framework for NonParametric { @@ -167,7 +170,7 @@ impl ParametricBuilder { Ok(EstimationProblem { model: self.model.build()?, data: self.data, - error_models: all_errors, // Strongly typed as ResidualErrorModels! + error_models: all_errors, parameters: self.parameters, }) } @@ -321,121 +324,3 @@ where Ok(()) } - -#[cfg(test)] -mod tests { - use super::*; - use crate::prelude::*; - - use pharmsol::{fa, fetch_params, lag, Subject, SubjectBuilderExt}; - - fn simple_equation() -> pharmsol::equation::ODE { - pharmsol::equation::ODE::new( - |x, p, _t, dx, b, _rateiv, _cov| { - fetch_params!(p, ke); - dx[0] = -ke * x[0] + b[0]; - }, - |_p, _t, _cov| lag! {}, - |_p, _t, _cov| fa! {}, - |_p, _t, _cov, _x| {}, - |x, p, _t, _cov, y| { - fetch_params!(p, v); - y[0] = x[0] / v; - }, - ) - .with_nstates(1) - .with_ndrugs(1) - .with_nout(1) - .with_metadata( - pharmsol::equation::metadata::new("estimation_problem_builder_validation") - .parameters(["ke", "v"]) - .states(["central"]) - .outputs(["outeq_1"]) - .route(pharmsol::equation::Route::bolus("input_1").to_state("central")), - ) - .expect("metadata attachment should validate") - } - - fn simple_data() -> Data { - let subject = Subject::builder("1") - .bolus(0.0, 100.0, 0) - .observation(1.0, 10.0, 0) - .build(); - - Data::new(vec![subject]) - } - - fn default_error_model() -> AssayErrorModel { - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0) - } - - #[test] - fn nonparametric_build_rejects_unknown_parameter_name() { - let result = EstimationProblem::builder(simple_equation(), simple_data()) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("unknown_param", 25.0, 250.0)) - .error("outeq_1", default_error_model()) - .build(); - - assert!(result.is_err()); - let message = format!("{}", result.err().expect("error expected")); - assert!(message.contains("unknown parameter name(s): unknown_param")); - } - - #[test] - fn nonparametric_build_rejects_missing_parameter_declaration() { - let result = EstimationProblem::builder(simple_equation(), simple_data()) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .error("outeq_1", default_error_model()) - .build(); - - assert!(result.is_err()); - let message = format!("{}", result.err().expect("error expected")); - assert!(message.contains("missing parameter declaration(s): v")); - } - - #[test] - fn nonparametric_build_rejects_duplicate_parameter_declaration() { - let result = EstimationProblem::builder(simple_equation(), simple_data()) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("ke", 25.0, 250.0)) - .error("outeq_1", default_error_model()) - .build(); - - assert!(result.is_err()); - let message = format!("{}", result.err().expect("error expected")); - assert!(message.contains("duplicate parameter declarations found: ke")); - } - - #[test] - fn nonparametric_build_rejects_invalid_parameter_bounds() { - let result = EstimationProblem::builder(simple_equation(), simple_data()) - .nonparametric() - .parameter(Parameter::bounded("ke", 2.0, 1.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error("outeq_1", default_error_model()) - .build(); - - assert!(result.is_err()); - let message = format!("{}", result.err().expect("error expected")); - assert!(message.contains("invalid bounds for parameter 'ke'")); - } - - #[test] - fn nonparametric_build_rejects_duplicate_error_model_output() { - let result = EstimationProblem::builder(simple_equation(), simple_data()) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error("outeq_1", default_error_model()) - .error("outeq_1", default_error_model()) - .build(); - - assert!(result.is_err()); - let message = format!("{}", result.err().expect("error expected")); - assert!(message.contains("duplicate error model declaration for output 'outeq_1'")); - } -} diff --git a/src/api/progress.rs b/src/estimation/progress.rs similarity index 100% rename from src/api/progress.rs rename to src/estimation/progress.rs diff --git a/src/lib.rs b/src/lib.rs index 318dc927a..db2c45c70 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,11 +11,11 @@ //! - NPOD (Non-Parametric Optimal Design) //! - POSTPROB (Posterior probability reweighting) //! -//! # Public API +//! # Public Interface //! -//! PMcore centers on the model/problem API in [api]. Models are defined with -//! [api::ModelDefinition], configured with [api::EstimationProblem], and executed through -//! [api::fit]. +//! PMcore centers on the estimation interface in [estimation]. Models are defined in +//! [model], configured with [estimation::EstimationProblem], and then executed with the +//! selected algorithm. //! //! # Data format //! @@ -28,9 +28,6 @@ /// Provides the various algorithms used within the framework pub mod algorithms; -/// New public modeling and execution API. -pub mod api; - /// Estimation family boundaries for the new architecture. pub mod estimation; @@ -60,8 +57,8 @@ pub mod prelude { pub use crate::algorithms::Algorithm; pub use crate::algorithms::Fitter; - pub use crate::api::NonParametric; - pub use crate::api::{ + pub use crate::estimation::NonParametric; + pub use crate::estimation::{ ErrorModels, EstimationProblem, FitProgress, NonparametricCycleProgress, NpagConfig, NpmapConfig, NpodConfig, }; From 9a0b237ffd1387fc387bedd09d571eddc780384f Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Mon, 8 Jun 2026 15:57:51 +0200 Subject: [PATCH 37/47] Update examples --- examples/bestdose.rs | 6 ++---- examples/bestdose_auc.rs | 2 +- examples/bestdose_bounds.rs | 2 +- examples/bestdose_cov.rs | 2 +- examples/meta/main.rs | 12 ++++++------ examples/neely/main.rs | 12 ++++++------ examples/new_iov/main.rs | 12 ++++++------ examples/theophylline/main.rs | 12 ++++++------ examples/two_eq_lag/main.rs | 12 ++++++------ examples/vanco.rs | 7 ++++--- examples/vanco_sde/main.rs | 12 ++++++------ src/estimation/nonparametric/theta.rs | 17 ++++++++++++----- 12 files changed, 57 insertions(+), 51 deletions(-) diff --git a/examples/bestdose.rs b/examples/bestdose.rs index 98a4a9f04..3c31a8724 100644 --- a/examples/bestdose.rs +++ b/examples/bestdose.rs @@ -65,10 +65,8 @@ fn main() -> Result<()> { .observation(18.0, conc(6.0, 75.0) + conc(18.0, 150.0), 0) .build(); - let (theta, prior) = Theta::from_file( - &"examples/bimodal_ke/output/theta.csv".to_string(), - ¶meter_space, - )?; + let (theta, prior) = + Theta::from_file("examples/bimodal_ke/output/theta.csv", ¶meter_space)?; let posterior = BestDosePosterior::compute( &theta, diff --git a/examples/bestdose_auc.rs b/examples/bestdose_auc.rs index 457d9f250..2c84e6762 100644 --- a/examples/bestdose_auc.rs +++ b/examples/bestdose_auc.rs @@ -44,7 +44,7 @@ fn main() -> Result<()> { // Load realistic prior from previous NPAG run (47 support points) println!("Loading prior from bimodal_ke example..."); let (theta, prior) = Theta::from_file( - &"examples/bimodal_ke/output/theta.csv".to_string(), + "examples/bimodal_ke/output/theta.csv", ¶meter_space, )?; let weights = prior.as_ref().unwrap(); diff --git a/examples/bestdose_bounds.rs b/examples/bestdose_bounds.rs index 4e4e6a887..36aa11129 100644 --- a/examples/bestdose_bounds.rs +++ b/examples/bestdose_bounds.rs @@ -41,7 +41,7 @@ fn main() -> Result<()> { // Load realistic prior from previous NPAG run println!("Loading prior from bimodal_ke example..."); let (theta, prior) = Theta::from_file( - &"examples/bimodal_ke/output/theta.csv".to_string(), + "examples/bimodal_ke/output/theta.csv", ¶meter_space, )?; let weights = prior.as_ref().unwrap(); diff --git a/examples/bestdose_cov.rs b/examples/bestdose_cov.rs index c0ed27c9a..4587f967c 100644 --- a/examples/bestdose_cov.rs +++ b/examples/bestdose_cov.rs @@ -91,7 +91,7 @@ fn main() -> Result<()> { .build(); let (mut theta, prior) = Theta::from_file( - &"examples/bimodal_ke/output/theta.csv".to_string(), + "examples/bimodal_ke/output/theta.csv", ¶meter_space, )?; diff --git a/examples/meta/main.rs b/examples/meta/main.rs index b280349b9..f5cda1698 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -4,7 +4,7 @@ use pmcore::prelude::*; -fn main() { +fn main() -> Result<()> { let eq = ode! { name: "meta", params: [cls, fm, k20, relv, theta1, theta2, vs], @@ -31,7 +31,7 @@ fn main() { }, }; - let data = data::read_pmetrics("examples/meta/meta.csv").unwrap(); + let data = data::read_pmetrics("examples/meta/meta.csv")?; EstimationProblem::builder(eq, data) .nonparametric() .parameter(Parameter::bounded("cls", 0.1, 10.0)) @@ -49,8 +49,8 @@ fn main() { "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .build() - .unwrap() - .fit_with(NpodConfig::default()) - .unwrap(); + .build()? + .fit_with(NpodConfig::default())?; + + Ok(()) } diff --git a/examples/neely/main.rs b/examples/neely/main.rs index 2b9d14931..9ed9bfd69 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -1,6 +1,6 @@ use pmcore::prelude::*; -fn main() { +fn main() -> Result<()> { let eq = ode! { name: "neely", params: [cls, k30, k40, qs, vps, vs, fm1, fm2, theta1, theta2], @@ -46,7 +46,7 @@ fn main() { }, }; - let data = data::read_pmetrics("examples/neely/data.csv").unwrap(); + let data = data::read_pmetrics("examples/neely/data.csv")?; EstimationProblem::builder(eq, data) .nonparametric() .parameter(Parameter::bounded("cls", 0.0, 0.4)) @@ -71,8 +71,8 @@ fn main() { "outeq_3", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .build() - .unwrap() - .fit_with(NpagConfig::default()) - .unwrap(); + .build()? + .fit_with(NpagConfig::default())?; + + Ok(()) } diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index beb2ef3c3..e469120c2 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -1,6 +1,6 @@ use pmcore::prelude::*; -fn main() { +fn main() -> Result<()> { let sde = sde! { name: "new_iov", params: [ke0, ske], @@ -25,7 +25,7 @@ fn main() { }, }; - let data = data::read_pmetrics("examples/new_iov/data.csv").unwrap(); + let data = data::read_pmetrics("examples/new_iov/data.csv")?; EstimationProblem::builder(sde, data) .nonparametric() .parameter(Parameter::bounded("ke0", 0.0001, 2.4)) @@ -34,8 +34,8 @@ fn main() { "outeq_1", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), ) - .build() - .unwrap() - .fit_with(NpagConfig::default()) - .unwrap(); + .build()? + .fit_with(NpagConfig::default())?; + + Ok(()) } diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index 62dcc05e0..fa2fbcdd8 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -1,6 +1,6 @@ use pmcore::prelude::*; -fn main() { +fn main() -> Result<()> { let analytical = analytical! { name: "theophylline", params: [ka, ke, v], @@ -15,7 +15,7 @@ fn main() { }, }; - let data = data::read_pmetrics("examples/theophylline/theophylline.csv").unwrap(); + let data = data::read_pmetrics("examples/theophylline/theophylline.csv")?; EstimationProblem::builder(analytical, data) .nonparametric() .parameter(Parameter::bounded("ka", 0.001, 3.0)) @@ -25,8 +25,8 @@ fn main() { "outeq_0", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), ) - .build() - .unwrap() - .fit_with(NpagConfig::default()) - .unwrap(); + .build()? + .fit_with(NpagConfig::default())?; + + Ok(()) } diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index 53901012d..0d62cacf4 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -1,6 +1,6 @@ use pmcore::prelude::*; -fn main() { +fn main() -> Result<()> { let eq = ode! { name: "two_eq_lag", params: [ka, ke, tlag, v], @@ -21,7 +21,7 @@ fn main() { }, }; - let data = data::read_pmetrics("examples/two_eq_lag/two_eq_lag.csv").unwrap(); + let data = data::read_pmetrics("examples/two_eq_lag/two_eq_lag.csv")?; EstimationProblem::builder(eq, data) .nonparametric() .parameter(Parameter::bounded("ka", 0.1, 0.9)) @@ -32,8 +32,8 @@ fn main() { "outeq_0", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), ) - .build() - .unwrap() - .fit_with(NpagConfig::default()) - .unwrap(); + .build()? + .fit_with(NpagConfig::default())?; + + Ok(()) } diff --git a/examples/vanco.rs b/examples/vanco.rs index be35b5eaa..469d20bca 100644 --- a/examples/vanco.rs +++ b/examples/vanco.rs @@ -1,5 +1,5 @@ use pmcore::prelude::*; -fn main() { +fn main() -> Result<()> { let eq = ode! { name: "vanco_two_compartment", params: [ke, kcp, kpc], @@ -41,8 +41,7 @@ fn main() { .build(); let op = eq - .simulate_subject_dense(&subject, &[0.3, 0.2, 0.5], None) - .unwrap() + .simulate_subject_dense(&subject, &[0.3, 0.2, 0.5], None)? .0; let times = op.flat_times(); @@ -51,4 +50,6 @@ fn main() { for (t, p) in times.iter().zip(pred.iter()) { println!("{}, {}", t, p); } + + Ok(()) } diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index cf1f2ee2c..a7bbb53e3 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -1,6 +1,6 @@ use pmcore::prelude::*; -fn main() { +fn main() -> Result<()> { let sde = sde! { name: "vanco_sde", params: [ka, ke0, kcp, kpc, vol, ske], @@ -47,7 +47,7 @@ fn main() { // (3, 1), // ); - let data = data::read_pmetrics("examples/vanco_sde/vanco_clean.csv").unwrap(); + let data = data::read_pmetrics("examples/vanco_sde/vanco_clean.csv")?; EstimationProblem::builder(sde, data) .nonparametric() .parameter(Parameter::bounded("ka", 0.0001, 2.4)) @@ -60,8 +60,8 @@ fn main() { "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), ) - .build() - .unwrap() - .fit_with(NpagConfig::default()) - .unwrap(); + .build()? + .fit_with(NpagConfig::default())?; + + Ok(()) } diff --git a/src/estimation/nonparametric/theta.rs b/src/estimation/nonparametric/theta.rs index 744d414ed..9399e6788 100644 --- a/src/estimation/nonparametric/theta.rs +++ b/src/estimation/nonparametric/theta.rs @@ -1,4 +1,4 @@ -use std::{fmt::Debug, fs::File}; +use std::{fmt::Debug, fs::File, path::Path}; use anyhow::{bail, Context, Result}; use faer::Mat; @@ -37,7 +37,10 @@ impl Theta { /// in the [ParameterSpace] /// /// The order of parameters in the [ParameterSpace] should match the order of columns in the matrix - pub fn from_parts(matrix: Mat, parameters: ParameterSpace) -> Result { + pub fn from_parts( + matrix: Mat, + parameters: ParameterSpace, + ) -> Result { if matrix.ncols() != parameters.len() { bail!( "Number of columns in matrix ({}) does not match number of parameters ({})", @@ -228,11 +231,15 @@ impl Theta { } pub fn from_file( - path: &String, + path: impl AsRef, parameters: &ParameterSpace, ) -> Result<(Theta, Option)> { - tracing::info!("Reading prior from {}", path); - let file = File::open(path).context(format!("Unable to open the prior file '{}'", path))?; + let path = path.as_ref(); + tracing::info!("Reading prior from {}", path.display()); + let file = File::open(path).context(format!( + "Unable to open the prior file '{}'", + path.display() + ))?; let mut reader = csv::ReaderBuilder::new() .has_headers(true) .from_reader(file); From 25d035087b8e7514f6b3419609d9d21615e33392 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Mon, 8 Jun 2026 16:02:40 +0200 Subject: [PATCH 38/47] Clean up lib.rs --- src/lib.rs | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index db2c45c70..a1cdf7791 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -48,7 +48,6 @@ pub use std::collections::HashMap; pub mod bestdose; /// A collection of commonly used items to simplify imports. -#[allow(ambiguous_glob_reexports)] pub mod prelude { pub use super::logs::Logger; pub use super::HashMap; @@ -68,18 +67,24 @@ pub mod prelude { }; pub use crate::estimation::nonparametric::{ - CycleLog, NPCycle, NPPredictions, NonParametricResult, Posterior, Psi, Theta, Weights, + CycleLog, NPCycle, NPPredictions, NonParametricResult, Posterior, Prior, Psi, Theta, + Weights, }; pub use crate::model::{EquationMetadataSource, ModelMetadata}; pub use crate::results::{ FitResult, FitSummary, IndividualSummary, ParameterSummary, PopulationSummary, }; - pub use pharmsol::optimize::effect::get_e2; + // pharmsol: re-export the crate itself and its curated prelude. pub use pharmsol; + pub use pharmsol::prelude::*; - pub use crate::estimation::nonparametric::Prior; + // Items required by downstream code that are not part of `pharmsol::prelude`. + pub use pharmsol::equation::{EquationTypes, Predictions}; + pub use pharmsol::optimize::effect::get_e2; + pub use pharmsol::{ODE, SDE}; + // Organized submodules mirroring pharmsol's grouping. pub mod simulator { pub use pharmsol::prelude::simulator::*; } @@ -90,20 +95,6 @@ pub mod prelude { pub use pharmsol::prelude::models::*; } - //traits - pub use pharmsol::data::*; - pub use pharmsol::equation::Equation; - pub use pharmsol::equation::EquationTypes; - pub use pharmsol::equation::Predictions; - pub use pharmsol::equation::*; - pub use pharmsol::prelude::*; - pub use pharmsol::simulator::*; - pub use pharmsol::ODE; - pub use pharmsol::SDE; - - //macros - pub use pharmsol::fa; - pub use pharmsol::fetch_cov; - pub use pharmsol::fetch_params; - pub use pharmsol::lag; + // macros + pub use pharmsol::{fa, fetch_cov, fetch_params, lag}; } From b18c03ae6d49550d7c23e6ccaf07817dfe6e556a Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:26:23 +0200 Subject: [PATCH 39/47] WIP: Change how prior is defined --- src/algorithms/mod.rs | 7 +- src/algorithms/nonparametric/npag.rs | 18 +- src/algorithms/nonparametric/npmap.rs | 34 +--- src/algorithms/nonparametric/npod.rs | 20 +-- src/bestdose/posterior.rs | 3 +- src/bestdose/types.rs | 13 +- src/estimation/nonparametric/mod.rs | 3 +- src/estimation/nonparametric/prior/mod.rs | 158 ------------------ .../{prior => sampling}/latin.rs | 0 src/estimation/nonparametric/sampling/mod.rs | 10 ++ .../{prior => sampling}/sobol.rs | 0 src/estimation/nonparametric/theta.rs | 123 ++++++++++++++ src/estimation/problem.rs | 38 +++++ src/lib.rs | 3 +- src/model/parameter_space.rs | 18 ++ tests/onecomp.rs | 19 ++- 16 files changed, 227 insertions(+), 240 deletions(-) delete mode 100644 src/estimation/nonparametric/prior/mod.rs rename src/estimation/nonparametric/{prior => sampling}/latin.rs (100%) create mode 100644 src/estimation/nonparametric/sampling/mod.rs rename src/estimation/nonparametric/{prior => sampling}/sobol.rs (100%) diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index 0a26db1a0..50b81013c 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -1,8 +1,8 @@ use std::fs; use std::path::Path; -use crate::estimation::{EstimationProblem, Framework}; use crate::estimation::nonparametric::{NonParametricResult, Psi, Theta}; +use crate::estimation::{EstimationProblem, Framework}; use crate::results::FitResult; use anyhow::Context; @@ -38,6 +38,11 @@ pub mod nonparametric; pub mod parametric; impl EstimationProblem { + /// Returns the parameter space defined for this problem. + pub fn parameters(&self) -> &F::Parameters { + &self.parameters + } + /// The "Swap and Fit" API: /// Consumes the problem and the algorithm configuration, builds the engine, /// and runs it to completion automatically. diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 47b212c4f..7b58830bc 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,14 +1,12 @@ use crate::algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}; -use crate::estimation::{EstimationProblem, NonParametric}; use crate::estimation::nonparametric::{ - calculate_psi, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, + calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }; +use crate::estimation::{EstimationProblem, NonParametric}; pub(crate) use crate::estimation::nonparametric::ipm::burke; pub(crate) use crate::estimation::nonparametric::qr; -use crate::model::parameter_space::{BoundedParameter, ParameterSpace}; - use anyhow::bail; use anyhow::Result; use pharmsol::prelude::{ @@ -38,7 +36,6 @@ pub struct NpagConfig { pub error_step_shrink: f64, pub max_cycles: usize, pub progress: bool, - pub prior: Prior, } impl Default for NpagConfig { @@ -57,7 +54,6 @@ impl Default for NpagConfig { error_step_shrink: 0.5, max_cycles: 1000, progress: true, - prior: Prior::Sobol(100, 22), } } } @@ -155,20 +151,18 @@ impl NPAG { equation: E, data: Data, error_models: AssayErrorModels, - parameters: &ParameterSpace, + theta: Theta, config: NpagConfig, ) -> Result { - let ranges = parameters.finite_ranges(); + let ranges = theta.parameters().finite_ranges(); let gamma_delta = vec![config.error_step; error_models.len()]; let eps = config.eps; - let prior = config.prior.theta(parameters)?; - Ok(Self { equation, ranges, psi: Psi::new(), - theta: prior, + theta, lambda: Weights::default(), w: Weights::default(), eps, @@ -516,7 +510,7 @@ impl Algorithm for NpagConfig { problem.model.equation.clone(), problem.data.clone(), problem.error_models.clone(), - &problem.parameters, + problem.prior.clone(), self, ) } diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index 0ae719dd8..c4b4aca3c 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -1,10 +1,9 @@ use crate::{ algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}, - estimation::{EstimationProblem, NonParametric}, estimation::nonparametric::{ - calculate_psi, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, Weights, + calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }, - model::parameter_space::{BoundedParameter, ParameterSpace}, + estimation::{EstimationProblem, NonParametric}, }; use anyhow::{Context, Result}; @@ -17,29 +16,13 @@ use crate::estimation::nonparametric::ipm::burke; use serde::{Deserialize, Serialize}; /// Configuration options for the non-parametric maximum a posteriori (NPMAP) algorithm -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct NpmapConfig { - /// The prior distribution for which to calcualte the posterior probabilities - pub prior: Prior, -} - -impl Default for NpmapConfig { - fn default() -> Self { - Self { - prior: Prior::default(), - } - } -} +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +pub struct NpmapConfig {} impl NpmapConfig { pub fn new() -> Self { Self::default() } - - pub fn prior(mut self, prior: Prior) -> Self { - self.prior = prior; - self - } } /// Non-parametric maximum a posteriori (NPMAP) algorithm @@ -64,12 +47,9 @@ impl NPMAP { equation: E, data: Data, error_models: AssayErrorModels, - parameters: &ParameterSpace, - config: NpmapConfig, + theta: Theta, + _config: NpmapConfig, ) -> Result { - // Generate or load the initial support points from the prior - let theta = config.prior.theta(parameters)?; - Ok(Self { equation, psi: Psi::new(), @@ -196,7 +176,7 @@ impl Algorithm for NpmapConfig { problem.model.equation, problem.data, problem.error_models, - &problem.parameters, + problem.prior, self, ) } diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index a701d8709..7978bbc61 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -1,11 +1,9 @@ use crate::{ algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}, - estimation::{EstimationProblem, NonParametric}, estimation::nonparametric::{ - calculate_psi, ipm::burke, qr, CycleLog, NPCycle, NonParametricResult, Prior, Psi, Theta, - Weights, + calculate_psi, ipm::burke, qr, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }, - model::parameter_space::{BoundedParameter, ParameterSpace}, + estimation::{EstimationProblem, NonParametric}, }; use pharmsol::ParameterOptimizer; @@ -29,8 +27,6 @@ const THETA_D: f64 = 1e-4; pub struct NpodConfig { /// Maximum number of cycles to run the algorithm for. pub max_cycles: usize, - /// Prior distribution for sampling new support points. - pub prior: Prior, /// Whether to print progress information during the first cycle. pub progress: bool, } @@ -44,18 +40,12 @@ impl NpodConfig { self.max_cycles = cycles; self } - - pub fn prior(mut self, prior: Prior) -> Self { - self.prior = prior; - self - } } impl Default for NpodConfig { fn default() -> Self { Self { max_cycles: 100, - prior: Prior::default(), progress: true, } } @@ -84,13 +74,11 @@ impl NPOD { equation: E, data: Data, error_models: AssayErrorModels, - parameters: &ParameterSpace, + theta: Theta, config: NpodConfig, ) -> Result { let gamma_delta = vec![0.1; error_models.len()]; - let theta = config.prior.theta(parameters)?; - Ok(Self { equation, psi: Psi::new(), @@ -461,7 +449,7 @@ impl Algorithm for NpodConfig { problem.model.equation, problem.data, problem.error_models, - &problem.parameters, + problem.prior, self, ) } diff --git a/src/bestdose/posterior.rs b/src/bestdose/posterior.rs index 08963b1af..57e692c3e 100644 --- a/src/bestdose/posterior.rs +++ b/src/bestdose/posterior.rs @@ -211,10 +211,9 @@ pub fn npagfull_refinement( eq.clone(), past_data.clone(), config.error_models().clone(), - ¶meter_space, + single_point_theta, npag_config, )?; - npag.set_theta(single_point_theta); // Run NPAG optimization let refinement_result = npag.initialize().and_then(|_| { diff --git a/src/bestdose/types.rs b/src/bestdose/types.rs index eb4199540..5c08de9c5 100644 --- a/src/bestdose/types.rs +++ b/src/bestdose/types.rs @@ -9,7 +9,7 @@ use std::fmt::Display; -use crate::estimation::nonparametric::{NPPredictions, Prior, Theta, Weights}; +use crate::estimation::nonparametric::{NPPredictions, Theta, Weights}; use crate::model::{BoundedParameter, ParameterSpace}; use crate::prelude::*; use pharmsol::prelude::*; @@ -188,7 +188,6 @@ impl Default for DoseRange { pub struct BestDoseConfig { pub(crate) parameter_space: ParameterSpace, pub(crate) error_models: AssayErrorModels, - pub(crate) prior: Prior, pub(crate) refinement_cycles: usize, pub(crate) progress: bool, pub(crate) prediction_interval: f64, @@ -199,18 +198,12 @@ impl BestDoseConfig { Self { parameter_space, error_models, - prior: Prior::default(), refinement_cycles: 500, progress: true, prediction_interval: 0.12, } } - pub fn with_prior(mut self, prior: Prior) -> Self { - self.prior = prior; - self - } - pub fn with_refinement_cycles(mut self, refinement_cycles: usize) -> Self { self.refinement_cycles = refinement_cycles; self @@ -234,10 +227,6 @@ impl BestDoseConfig { &self.error_models } - pub fn prior(&self) -> &Prior { - &self.prior - } - pub fn refinement_cycles(&self) -> usize { self.refinement_cycles } diff --git a/src/estimation/nonparametric/mod.rs b/src/estimation/nonparametric/mod.rs index a8bccafc5..c3cdb91cb 100644 --- a/src/estimation/nonparametric/mod.rs +++ b/src/estimation/nonparametric/mod.rs @@ -5,7 +5,7 @@ pub(crate) mod ipm; mod posterior; mod predictions; -mod prior; +pub mod sampling; mod psi; pub(crate) mod qr; mod result; @@ -19,7 +19,6 @@ pub(crate) use expansion::adaptative_grid; pub use ipm::burke; pub use posterior::{posterior, Posterior}; pub use predictions::{NPPredictionRow, NPPredictions}; -pub use prior::Prior; pub(crate) use psi::calculate_psi; pub use psi::Psi; pub use result::NonParametricResult; diff --git a/src/estimation/nonparametric/prior/mod.rs b/src/estimation/nonparametric/prior/mod.rs deleted file mode 100644 index 86232b9f6..000000000 --- a/src/estimation/nonparametric/prior/mod.rs +++ /dev/null @@ -1,158 +0,0 @@ -use crate::estimation::nonparametric::Theta; -use crate::model::{BoundedParameter, ParameterSpace}; -use anyhow::{bail, Result}; - -use serde::{Deserialize, Serialize}; - -pub mod latin; -pub mod sobol; - -#[derive(Debug, Clone, Deserialize, PartialEq)] -pub enum Prior { - /// Generate support points using a Sobol sequence - Sobol(usize, usize), - /// Generate support points using Latin Hypercube Sampling - Latin(usize, usize), - /// Use a predefined set of support points provided as a [Theta] - /// - /// Note that the parameters of the [Theta] must match the parameters of the estimation problem - Theta(Theta), -} - -impl Serialize for Prior { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - #[derive(Serialize)] - #[serde(tag = "kind", rename_all = "snake_case")] - enum Ref { - Sobol { points: usize, seed: usize }, - Latin { points: usize, seed: usize }, - } - let wire = match self { - Prior::Sobol(points, seed) => Ref::Sobol { - points: *points, - seed: *seed, - }, - Prior::Latin(points, seed) => Ref::Latin { - points: *points, - seed: *seed, - }, - - Prior::Theta(_) => { - return Err(serde::ser::Error::custom( - "Prior::Theta cannot be serialized", - )) - } - }; - wire.serialize(serializer) - } -} - -impl Prior { - pub fn sobol(points: usize, seed: usize) -> Prior { - Prior::Sobol(points, seed) - } - - pub fn points(&self) -> Option { - match self { - Prior::Sobol(points, _) => Some(*points), - Prior::Latin(points, _) => Some(*points), - Prior::Theta(theta) => Some(theta.nspp()), - } - } - - pub fn seed(&self) -> Option { - match self { - Prior::Sobol(_, seed) => Some(*seed), - Prior::Latin(_, seed) => Some(*seed), - Prior::Theta(_) => None, - } - } - - /// Generates the initial support points (theta) based on the specified prior configuration - /// - /// If a Prior::Theta is provided, it will be returned directly. For Sobol and Latin, the support points will be generated based on the number of points and seed. - pub fn theta(&self, parameters: &ParameterSpace) -> Result { - for parameter in parameters.iter() { - if parameter.lower >= parameter.upper { - bail!( - "Parameter '{}' has invalid bounds: [{}, {}]. Lower bound must be less than upper bound.", - parameter.name, - parameter.lower, - parameter.upper - ); - } - } - - let prior = match self { - Prior::Sobol(points, seed) => sobol::generate(parameters, *points, *seed)?, - Prior::Latin(points, seed) => latin::generate(parameters, *points, *seed)?, - Prior::Theta(theta) => theta.clone(), - }; - - Ok(prior) - } -} - -impl Default for Prior { - fn default() -> Self { - Prior::Sobol(2028, 22) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::model::Parameter; - use std::fs; - - fn parameters() -> ParameterSpace { - ParameterSpace::::new() - .add(Parameter::bounded("ke", 0.1, 1.0)) - .add(Parameter::bounded("v", 5.0, 50.0)) - } - - fn temp_csv_path() -> String { - format!("test_temp_prior_{}.csv", rand::random::()) - } - - #[test] - fn sample_space_generates_expected_shape() { - let theta = Prior::sobol(10, 42).theta(¶meters()).unwrap(); - assert_eq!(theta.nspp(), 10); - assert_eq!(theta.matrix().ncols(), 2); - } - - #[test] - fn read_prior_parses_weights_and_reorders_columns() { - let path = temp_csv_path(); - fs::write(&path, "v,ke,prob\n10.0,0.5,0.3\n15.0,0.7,0.7\n").unwrap(); - - let (theta, weights) = Theta::from_file(&path, ¶meters()).unwrap(); - let _ = fs::remove_file(&path); - - assert_eq!(theta.nspp(), 2); - assert_eq!(theta.matrix()[(0, 0)], 0.5); - assert_eq!(theta.matrix()[(0, 1)], 10.0); - - let weights = weights.expect("weights should be parsed from prob column"); - assert_eq!(weights.len(), 2); - assert_eq!(weights[0], 0.3); - assert_eq!(weights[1], 0.7); - } - - #[test] - fn read_prior_rejects_extra_parameters() { - let path = temp_csv_path(); - fs::write(&path, "ke,v,extra\n0.5,10.0,1.0\n").unwrap(); - - let err = Theta::from_file(&path, ¶meters()).unwrap_err(); - let _ = fs::remove_file(&path); - - assert!(err - .to_string() - .contains("Found parameters in the prior not present in configuration")); - } -} diff --git a/src/estimation/nonparametric/prior/latin.rs b/src/estimation/nonparametric/sampling/latin.rs similarity index 100% rename from src/estimation/nonparametric/prior/latin.rs rename to src/estimation/nonparametric/sampling/latin.rs diff --git a/src/estimation/nonparametric/sampling/mod.rs b/src/estimation/nonparametric/sampling/mod.rs new file mode 100644 index 000000000..899edc1cf --- /dev/null +++ b/src/estimation/nonparametric/sampling/mod.rs @@ -0,0 +1,10 @@ +//! Methods for generating the initial set of support points ([`Theta`]). + +pub mod latin; +pub mod sobol; + +/// Default seed used for quasi-random sampling when none is given. +pub const DEFAULT_SEED: usize = 22; + +/// Default number of support points sampled for a quasi-random starting grid. +pub const DEFAULT_POINTS: usize = 2028; diff --git a/src/estimation/nonparametric/prior/sobol.rs b/src/estimation/nonparametric/sampling/sobol.rs similarity index 100% rename from src/estimation/nonparametric/prior/sobol.rs rename to src/estimation/nonparametric/sampling/sobol.rs diff --git a/src/estimation/nonparametric/theta.rs b/src/estimation/nonparametric/theta.rs index 9399e6788..cb02a3252 100644 --- a/src/estimation/nonparametric/theta.rs +++ b/src/estimation/nonparametric/theta.rs @@ -4,6 +4,7 @@ use anyhow::{bail, Context, Result}; use faer::Mat; use serde::{Deserialize, Serialize}; +use super::sampling::{self, latin, sobol}; use super::weights::Weights; use crate::model::{BoundedParameter, ParameterSpace}; @@ -230,6 +231,44 @@ impl Theta { Theta::from_parts(mat, parameters) } + /// Generate a starting grid of `points` support points over `parameters` + /// using a Sobol sequence and the default seed ([`sampling::DEFAULT_SEED`]). + /// + /// The returned [Theta] carries `parameters`, so the chosen grid is explicit + /// and self-describing. + pub fn sobol(parameters: &ParameterSpace, points: usize) -> Result { + Self::sobol_with_seed(parameters, points, sampling::DEFAULT_SEED) + } + + /// Like [`Theta::sobol`], with an explicit seed for the quasi-random sequence. + pub fn sobol_with_seed( + parameters: &ParameterSpace, + points: usize, + seed: usize, + ) -> Result { + validate_bounds(parameters)?; + sobol::generate(parameters, points, seed) + } + + /// Generate a starting grid of `points` support points over `parameters` + /// using Latin Hypercube Sampling and the default seed ([`sampling::DEFAULT_SEED`]). + /// + /// The returned [Theta] carries `parameters`, so the chosen grid is explicit + /// and self-describing. + pub fn latin(parameters: &ParameterSpace, points: usize) -> Result { + Self::latin_with_seed(parameters, points, sampling::DEFAULT_SEED) + } + + /// Like [`Theta::latin`], with an explicit seed for the quasi-random sequence. + pub fn latin_with_seed( + parameters: &ParameterSpace, + points: usize, + seed: usize, + ) -> Result { + validate_bounds(parameters)?; + latin::generate(parameters, points, seed) + } + pub fn from_file( path: impl AsRef, parameters: &ParameterSpace, @@ -397,3 +436,87 @@ impl<'de> Deserialize<'de> for Theta { Self::from_parts(matrix, decoded.parameters).map_err(serde::de::Error::custom) } } + +/// Validates that every parameter has a strictly-ordered, finite bound interval. +fn validate_bounds(parameters: &ParameterSpace) -> Result<()> { + for parameter in parameters.iter() { + if parameter.lower >= parameter.upper { + bail!( + "Parameter '{}' has invalid bounds: [{}, {}]. Lower bound must be less than upper bound.", + parameter.name, + parameter.lower, + parameter.upper + ); + } + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::model::Parameter; + use std::fs; + + fn parameters() -> ParameterSpace { + ParameterSpace::::new() + .add(Parameter::bounded("ke", 0.1, 1.0)) + .add(Parameter::bounded("v", 5.0, 50.0)) + } + + fn temp_csv_path() -> String { + format!("test_temp_theta_{}.csv", rand::random::()) + } + + #[test] + fn sobol_generates_expected_shape() { + let theta = Theta::sobol_with_seed(¶meters(), 10, 42).unwrap(); + assert_eq!(theta.nspp(), 10); + assert_eq!(theta.matrix().ncols(), 2); + } + + #[test] + fn latin_generates_expected_shape() { + let theta = Theta::latin(¶meters(), 10).unwrap(); + assert_eq!(theta.nspp(), 10); + assert_eq!(theta.matrix().ncols(), 2); + } + + #[test] + fn sampling_rejects_invalid_bounds() { + let bad = ParameterSpace::::new().add(Parameter::bounded("ke", 1.0, 1.0)); + let err = Theta::sobol(&bad, 10).unwrap_err(); + assert!(err.to_string().contains("invalid bounds")); + } + + #[test] + fn from_file_parses_weights_and_reorders_columns() { + let path = temp_csv_path(); + fs::write(&path, "v,ke,prob\n10.0,0.5,0.3\n15.0,0.7,0.7\n").unwrap(); + + let (theta, weights) = Theta::from_file(&path, ¶meters()).unwrap(); + let _ = fs::remove_file(&path); + + assert_eq!(theta.nspp(), 2); + assert_eq!(theta.matrix()[(0, 0)], 0.5); + assert_eq!(theta.matrix()[(0, 1)], 10.0); + + let weights = weights.expect("weights should be parsed from prob column"); + assert_eq!(weights.len(), 2); + assert_eq!(weights[0], 0.3); + assert_eq!(weights[1], 0.7); + } + + #[test] + fn from_file_rejects_extra_parameters() { + let path = temp_csv_path(); + fs::write(&path, "ke,v,extra\n0.5,10.0,1.0\n").unwrap(); + + let err = Theta::from_file(&path, ¶meters()).unwrap_err(); + let _ = fs::remove_file(&path); + + assert!(err + .to_string() + .contains("Found parameters in the prior not present in configuration")); + } +} diff --git a/src/estimation/problem.rs b/src/estimation/problem.rs index e7e9959fe..df090aa81 100644 --- a/src/estimation/problem.rs +++ b/src/estimation/problem.rs @@ -4,6 +4,7 @@ use pharmsol::{ }; use std::collections::HashSet; +use crate::estimation::nonparametric::Theta; use crate::model::parameter_space::{BoundedParameter, ParameterSpace, UnboundedParameter}; use crate::model::{EquationMetadataSource, Model, ModelBuilder}; @@ -32,6 +33,11 @@ pub struct EstimationProblem { pub(crate) data: Data, pub(crate) error_models: F::ErrorModels, pub(crate) parameters: F::Parameters, + /// The initial set of support points used to seed the algorithm. + /// + /// Only meaningful for the non-parametric framework; the parametric + /// framework leaves this empty. + pub(crate) prior: Theta, } pub struct EstimationProblemBuilder { @@ -46,6 +52,7 @@ impl EstimationProblemBuilder { data: self.data, parameters: ParameterSpace::::new(), error_models: Vec::new(), + initial_points: None, } } @@ -73,6 +80,7 @@ pub struct NonParametricBuilder { data: Data, parameters: ParameterSpace, error_models: Vec<(String, AssayErrorModel)>, + initial_points: Option, } impl NonParametricBuilder { @@ -96,6 +104,17 @@ impl NonParametricBuilder { self.error_models.push((name.into(), model)); self } + + /// Sets the initial set of support points (the starting grid) explicitly. + /// + /// Build the [`Theta`] from the same parameter space used for the problem, + /// e.g. with [`Theta::sobol`], [`Theta::latin`], or [`Theta::from_file`]. + /// When omitted, a Sobol grid is generated automatically from the declared + /// parameter bounds. + pub fn prior(mut self, theta: Theta) -> Self { + self.initial_points = Some(theta); + self + } } impl NonParametricBuilder { @@ -113,11 +132,29 @@ impl NonParametricBuilder { all_errors = all_errors.add(outeq, error_model)?; } + let prior = match self.initial_points { + Some(theta) => { + if theta.parameters() != &self.parameters { + anyhow::bail!( + "initial points parameter space {:?} does not match the problem parameters {:?}", + theta.parameters().names(), + self.parameters.names() + ); + } + theta + } + None => Theta::sobol( + &self.parameters, + crate::estimation::nonparametric::sampling::DEFAULT_POINTS, + )?, + }; + Ok(EstimationProblem { model: self.model.build()?, data: self.data, error_models: all_errors, parameters: self.parameters, + prior, }) } } @@ -172,6 +209,7 @@ impl ParametricBuilder { data: self.data, error_models: all_errors, parameters: self.parameters, + prior: Theta::default(), }) } } diff --git a/src/lib.rs b/src/lib.rs index a1cdf7791..838a09743 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -67,8 +67,7 @@ pub mod prelude { }; pub use crate::estimation::nonparametric::{ - CycleLog, NPCycle, NPPredictions, NonParametricResult, Posterior, Prior, Psi, Theta, - Weights, + CycleLog, NPCycle, NPPredictions, NonParametricResult, Posterior, Psi, Theta, Weights, }; pub use crate::model::{EquationMetadataSource, ModelMetadata}; pub use crate::results::{ diff --git a/src/model/parameter_space.rs b/src/model/parameter_space.rs index 8fa76d425..cb7e8b8a5 100644 --- a/src/model/parameter_space.rs +++ b/src/model/parameter_space.rs @@ -59,6 +59,24 @@ impl FromIterator for ParameterSpace { } } +impl IntoIterator for ParameterSpace { + type Item = T; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.items.into_iter() + } +} + +impl<'a, T> IntoIterator for &'a ParameterSpace { + type Item = &'a T; + type IntoIter = std::slice::Iter<'a, T>; + + fn into_iter(self) -> Self::IntoIter { + self.items.iter() + } +} + /// Common metadata exposed by parameter types. pub trait ParameterMeta { fn name(&self) -> &str; diff --git a/tests/onecomp.rs b/tests/onecomp.rs index 6f402d284..5cfcc75d3 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -52,10 +52,14 @@ fn test_one_compartment_npag() -> Result<()> { let data = data::Data::new(subjects); + let parameters = ParameterSpace::::new() + .add(Parameter::bounded("ke", 0.1, 1.0)) + .add(Parameter::bounded("v", 1.0, 20.0)); + let result = EstimationProblem::builder(eq, data) .nonparametric() - .parameter(Parameter::bounded("ke", 0.1, 1.0)) - .parameter(Parameter::bounded("v", 1.0, 20.0)) + .parameters(parameters.clone()) + .prior(Theta::sobol(¶meters, 100)?) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), @@ -179,24 +183,23 @@ fn test_one_compartment_postprob() -> Result<()> { .add(Parameter::bounded("ke", 0.1, 1.0)) .add(Parameter::bounded("v", 1.0, 20.0)); - let prior = Prior::sobol(100, 22); - let theta = &prior.theta(¶meters)?; + let theta = Theta::sobol(¶meters, 100)?; let result = EstimationProblem::builder(eq, data) .nonparametric() - .parameter(Parameter::bounded("ke", 0.1, 1.0)) - .parameter(Parameter::bounded("v", 1.0, 20.0)) + .parameters(parameters.clone()) + .prior(theta.clone()) .error( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), ) .build()? - .fit_with(NpmapConfig::default().prior(prior))?; + .fit_with(NpmapConfig::default())?; // Check the results assert_eq!(result.cycles(), 0); - // Should be 2028 points in theta (no change in points) + // Should be 100 points in theta (no change in points) assert_eq!(result.get_theta().nspp(), theta.nspp()); Ok(()) From 6eafc670e6e0c7e96bbecd524f426bd41b9b85e8 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:29:36 +0200 Subject: [PATCH 40/47] Update parameter_space.rs --- src/model/parameter_space.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/model/parameter_space.rs b/src/model/parameter_space.rs index cb7e8b8a5..b76edbb5a 100644 --- a/src/model/parameter_space.rs +++ b/src/model/parameter_space.rs @@ -45,12 +45,37 @@ impl ParameterSpace { /// Helpers for bounded parameter spaces. impl ParameterSpace { + /// Creates an empty bounded parameter space (for non-parametric problems). + /// + /// Prefer this over `ParameterSpace::::new()` to avoid the + /// turbofish: + /// + /// ```ignore + /// let space = ParameterSpace::bounded() + /// .add(Parameter::bounded("ke", 0.1, 1.0)) + /// .add(Parameter::bounded("v", 1.0, 20.0)); + /// ``` + pub fn bounded() -> Self { + Self::new() + } + /// Returns `(lower, upper)` for each parameter. pub fn finite_ranges(&self) -> Vec<(f64, f64)> { self.items.iter().map(|p| (p.lower, p.upper)).collect() } } +/// Helpers for unbounded parameter spaces. +impl ParameterSpace { + /// Creates an empty unbounded parameter space (for parametric problems). + /// + /// Prefer this over `ParameterSpace::::new()` to avoid + /// the turbofish. + pub fn unbounded() -> Self { + Self::new() + } +} + impl FromIterator for ParameterSpace { fn from_iter>(iter: I) -> Self { Self { From 797ff7d9d8e53a456d9bdad9b7c5dfda059d3717 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Thu, 11 Jun 2026 12:02:19 +0200 Subject: [PATCH 41/47] Result --- src/algorithms/nonparametric/npag.rs | 1 + src/algorithms/nonparametric/npmap.rs | 1 + src/algorithms/nonparametric/npod.rs | 1 + src/estimation/nonparametric/result.rs | 48 ++++++++++++++------------ 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 7b58830bc..cdf8c40f1 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -190,6 +190,7 @@ impl NonParametricAlgorithm for NPAG { NonParametricResult::new( self.equation.clone(), self.data.clone(), + self.error_models.clone(), self.theta.clone(), self.psi.clone(), self.w.clone(), diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index c4b4aca3c..04bc30bf4 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -70,6 +70,7 @@ impl NonParametricAlgorithm for NPMAP { NonParametricResult::new( self.equation.clone(), self.data.clone(), + self.error_models.clone(), self.theta.clone(), self.psi.clone(), self.w.clone(), diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 7978bbc61..e9db76ab8 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -146,6 +146,7 @@ impl NonParametricAlgorithm for NPOD { NonParametricResult::new( self.equation.clone(), self.data.clone(), + self.error_models.clone(), self.theta.clone(), self.psi.clone(), self.w.clone(), diff --git a/src/estimation/nonparametric/result.rs b/src/estimation/nonparametric/result.rs index 41e377f68..a372a0c52 100644 --- a/src/estimation/nonparametric/result.rs +++ b/src/estimation/nonparametric/result.rs @@ -3,16 +3,16 @@ use std::path::Path; use pharmsol::Equation; use crate::algorithms::{Status, StopReason}; -use crate::estimation::nonparametric::{ - posterior, CycleLog, NPPredictions, Posterior, Psi, Theta, Weights, -}; +use crate::estimation::nonparametric::{CycleLog, NPPredictions, Posterior, Psi, Theta, Weights}; -use pharmsol::Data; +use pharmsol::{AssayErrorModels, Data}; +/// Contains the results of a nonparametric estimation, including the final parameter #[derive(Debug)] pub struct NonParametricResult { equation: E, data: Data, + error_models: AssayErrorModels, theta: Theta, psi: Psi, weights: Weights, @@ -20,8 +20,6 @@ pub struct NonParametricResult { cycles: usize, status: Status, cyclelog: CycleLog, - predictions: Option, - posterior: Posterior, } impl NonParametricResult { @@ -29,6 +27,7 @@ impl NonParametricResult { pub(crate) fn new( equation: E, data: Data, + error_models: AssayErrorModels, theta: Theta, psi: Psi, weights: Weights, @@ -37,11 +36,10 @@ impl NonParametricResult { status: Status, cyclelog: CycleLog, ) -> anyhow::Result { - let posterior = posterior::posterior(&psi, &weights)?; - Ok(Self { equation, data, + error_models, theta, psi, weights, @@ -49,8 +47,6 @@ impl NonParametricResult { cycles, status, cyclelog, - predictions: None, - posterior, }) } @@ -82,10 +78,6 @@ impl NonParametricResult { &self.cyclelog } - pub fn predictions(&self) -> Option<&NPPredictions> { - self.predictions.as_ref() - } - pub fn psi(&self) -> &Psi { &self.psi } @@ -94,22 +86,31 @@ impl NonParametricResult { &self.weights } - pub fn posterior(&self) -> &Posterior { - &self.posterior + pub fn error_models(&self) -> &AssayErrorModels { + &self.error_models } - pub fn calculate_predictions(&mut self, idelta: f64, tad: f64) -> anyhow::Result<()> { - let predictions = NPPredictions::calculate( + /// Compute the posterior probabilities on demand from [`Psi`] and the + /// [`Weights`]. This is a cheap matrix operation and is intentionally not + /// cached on the result. + pub fn posterior(&self) -> anyhow::Result { + Posterior::calculate(&self.psi, &self.weights) + } + + /// Compute predictions on demand. Nothing is cached on the result; callers + /// that need the predictions repeatedly should hold on to the returned + /// value themselves. + pub fn predictions(&self, idelta: f64, tad: f64) -> anyhow::Result { + let posterior = self.posterior()?; + NPPredictions::calculate( &self.equation, &self.data, &self.theta, &self.weights, - &self.posterior, + &posterior, idelta, tad, - )?; - self.predictions = Some(predictions); - Ok(()) + ) } pub fn write_theta(&self, path: &Path) -> anyhow::Result<()> { @@ -161,8 +162,9 @@ impl NonParametricResult { writer.write_field("prob")?; writer.write_record(None::<&[u8]>)?; + let posterior = self.posterior()?; let subjects = self.data.subjects(); - self.posterior + posterior .matrix() .row_iter() .enumerate() From 7e2198b09d952a81c5a3ee775e925f201330a72e Mon Sep 17 00:00:00 2001 From: Markus Date: Fri, 12 Jun 2026 09:51:45 +0200 Subject: [PATCH 42/47] Rename error to error_model --- benches/bimodal_ke.rs | 7 ++++--- examples/bimodal_ke/main.rs | 2 +- examples/bimodal_ke_backend_compare.rs | 3 ++- examples/drusano/main.rs | 9 +++++---- examples/iov/main.rs | 3 ++- examples/meta/main.rs | 5 +++-- examples/neely/main.rs | 7 ++++--- examples/new_iov/main.rs | 3 ++- examples/theophylline/main.rs | 3 ++- examples/two_eq_lag/main.rs | 3 ++- examples/vanco_sde/main.rs | 3 ++- src/algorithms/nonparametric/npag.rs | 3 ++- src/estimation/problem.rs | 5 +++-- tests/onecomp.rs | 7 ++++--- tests/results_summary_tests.rs | 3 ++- 15 files changed, 40 insertions(+), 26 deletions(-) diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index 639e7a320..b22c0c26b 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -35,7 +35,7 @@ fn setup_npag() -> Result> { .nonparametric() .parameter(Parameter::bounded("ke", 0.001, 3.0)) .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error( + .error_model( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), ) @@ -48,7 +48,7 @@ fn setup_npod() -> Result> { .nonparametric() .parameter(Parameter::bounded("ke", 0.001, 3.0)) .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error( + .error_model( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), ) @@ -61,7 +61,7 @@ fn setup_postprob() -> Result> { .nonparametric() .parameter(Parameter::bounded("ke", 0.001, 3.0)) .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error( + .error_model( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), ) @@ -105,3 +105,4 @@ criterion_group! { targets = benchmark_bimodal_ke_npag, benchmark_bimodal_ke_npod, benchmark_bimodal_ke_postprob } criterion_main!(benches); + diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index bf6cd93fc..cf8cae117 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -27,7 +27,7 @@ fn main() -> Result<()> { .nonparametric() .parameter(Parameter::bounded("ke", 0.001, 3.0)) .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error( + .error_model( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), ) diff --git a/examples/bimodal_ke_backend_compare.rs b/examples/bimodal_ke_backend_compare.rs index 08d155cc5..2d71e5c07 100644 --- a/examples/bimodal_ke_backend_compare.rs +++ b/examples/bimodal_ke_backend_compare.rs @@ -206,7 +206,7 @@ fn run_case Result<()> { Ok(()) } + diff --git a/examples/drusano/main.rs b/examples/drusano/main.rs index 4e91c455b..429bb809f 100644 --- a/examples/drusano/main.rs +++ b/examples/drusano/main.rs @@ -90,19 +90,19 @@ fn main() -> Result<()> { .parameter(Parameter::bounded("h2s", 0.1, 4.0)) .parameter(Parameter::bounded("h1r1", 5.0, 25.0)) .parameter(Parameter::bounded("h2r2", 10.0, 22.0)) - .error( + .error_model( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), ) - .error( + .error_model( "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), ) - .error( + .error_model( "outeq_3", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), ) - .error( + .error_model( "outeq_4", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), ) @@ -110,3 +110,4 @@ fn main() -> Result<()> { .fit_with(NpagConfig::default())?; Ok(()) } + diff --git a/examples/iov/main.rs b/examples/iov/main.rs index 2f30ac196..090100a0d 100644 --- a/examples/iov/main.rs +++ b/examples/iov/main.rs @@ -30,7 +30,7 @@ fn main() -> Result<()> { EstimationProblem::builder(sde, data) .nonparametric() .parameter(Parameter::bounded("ke0", 0.001, 2.0)) - .error( + .error_model( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), ) @@ -40,3 +40,4 @@ fn main() -> Result<()> { Ok(()) } + diff --git a/examples/meta/main.rs b/examples/meta/main.rs index f5cda1698..016130a1a 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -41,11 +41,11 @@ fn main() -> Result<()> { .parameter(Parameter::bounded("theta1", 0.1, 10.0)) .parameter(Parameter::bounded("theta2", 0.1, 10.0)) .parameter(Parameter::bounded("vs", 1.0, 10.0)) - .error( + .error_model( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .error( + .error_model( "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) @@ -54,3 +54,4 @@ fn main() -> Result<()> { Ok(()) } + diff --git a/examples/neely/main.rs b/examples/neely/main.rs index 9ed9bfd69..f912b789f 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -59,15 +59,15 @@ fn main() -> Result<()> { .parameter(Parameter::bounded("fm2", 0.0, 0.1)) .parameter(Parameter::bounded("theta1", -4.0, 2.0)) .parameter(Parameter::bounded("theta2", -2.0, 0.5)) - .error( + .error_model( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .error( + .error_model( "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) - .error( + .error_model( "outeq_3", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), ) @@ -76,3 +76,4 @@ fn main() -> Result<()> { Ok(()) } + diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index e469120c2..7ba97f169 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -30,7 +30,7 @@ fn main() -> Result<()> { .nonparametric() .parameter(Parameter::bounded("ke0", 0.0001, 2.4)) .parameter(Parameter::bounded("ske", 0.0001, 0.2)) - .error( + .error_model( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), ) @@ -39,3 +39,4 @@ fn main() -> Result<()> { Ok(()) } + diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index fa2fbcdd8..69a0df75a 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -21,7 +21,7 @@ fn main() -> Result<()> { .parameter(Parameter::bounded("ka", 0.001, 3.0)) .parameter(Parameter::bounded("ke", 0.001, 3.0)) .parameter(Parameter::bounded("v", 0.001, 50.0)) - .error( + .error_model( "outeq_0", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), ) @@ -30,3 +30,4 @@ fn main() -> Result<()> { Ok(()) } + diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index 0d62cacf4..0b9939477 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -28,7 +28,7 @@ fn main() -> Result<()> { .parameter(Parameter::bounded("ke", 0.001, 0.1)) .parameter(Parameter::bounded("tlag", 0.0, 4.0)) .parameter(Parameter::bounded("v", 30.0, 120.0)) - .error( + .error_model( "outeq_0", AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), ) @@ -37,3 +37,4 @@ fn main() -> Result<()> { Ok(()) } + diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index a7bbb53e3..be820c34b 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -56,7 +56,7 @@ fn main() -> Result<()> { .parameter(Parameter::bounded("kpc", 0.0001, 2.4)) .parameter(Parameter::bounded("vol", 0.2, 12.0)) .parameter(Parameter::bounded("ske", 0.0001, 0.2)) - .error( + .error_model( "outeq_1", AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), ) @@ -65,3 +65,4 @@ fn main() -> Result<()> { Ok(()) } + diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index cdf8c40f1..3f68df99a 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -583,7 +583,7 @@ mod tests { .nonparametric() .parameter(Parameter::bounded("ke", 0.001, 3.0)) .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error( + .error_model( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), ) @@ -599,3 +599,4 @@ mod tests { ); } } + diff --git a/src/estimation/problem.rs b/src/estimation/problem.rs index df090aa81..3618ecefa 100644 --- a/src/estimation/problem.rs +++ b/src/estimation/problem.rs @@ -100,7 +100,7 @@ impl NonParametricBuilder { self } - pub fn error(mut self, name: impl Into, model: AssayErrorModel) -> Self { + pub fn error_model(mut self, name: impl Into, model: AssayErrorModel) -> Self { self.error_models.push((name.into(), model)); self } @@ -183,7 +183,7 @@ impl ParametricBuilder { self } - pub fn error(mut self, name: impl Into, model: ResidualErrorModel) -> Self { + pub fn error_model(mut self, name: impl Into, model: ResidualErrorModel) -> Self { self.error_models.push((name.into(), model)); self } @@ -362,3 +362,4 @@ where Ok(()) } + diff --git a/tests/onecomp.rs b/tests/onecomp.rs index 5cfcc75d3..1a12e39f9 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -60,7 +60,7 @@ fn test_one_compartment_npag() -> Result<()> { .nonparametric() .parameters(parameters.clone()) .prior(Theta::sobol(¶meters, 100)?) - .error( + .error_model( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), ) @@ -121,7 +121,7 @@ fn test_one_compartment_npod() -> Result<()> { .nonparametric() .parameter(Parameter::bounded("ke", 0.1, 1.0)) .parameter(Parameter::bounded("v", 1.0, 20.0)) - .error( + .error_model( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), ) @@ -189,7 +189,7 @@ fn test_one_compartment_postprob() -> Result<()> { .nonparametric() .parameters(parameters.clone()) .prior(theta.clone()) - .error( + .error_model( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), ) @@ -204,3 +204,4 @@ fn test_one_compartment_postprob() -> Result<()> { Ok(()) } + diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index 906728b68..428ff7cbf 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -46,7 +46,7 @@ fn test_nonparametric_fit_result_summary_surface() -> Result<()> { .nonparametric() .parameter(Parameter::bounded("ke", 0.1, 1.0)) .parameter(Parameter::bounded("v", 1.0, 20.0)) - .error("0", assay_error) + .error_model("0", assay_error) .build()? .fit_with(NpagConfig::default())?; @@ -60,3 +60,4 @@ fn test_nonparametric_fit_result_summary_surface() -> Result<()> { Ok(()) } + From 5a88470671c8d313b324498ad9610409f8ce63f9 Mon Sep 17 00:00:00 2001 From: Markus Date: Fri, 12 Jun 2026 17:24:27 +0200 Subject: [PATCH 43/47] Refactor the EstimationProblem around Theta over Parameters --- benches/bimodal_ke.rs | 54 ++-- examples/bestdose.rs | 4 +- examples/bestdose_auc.rs | 4 +- examples/bestdose_bounds.rs | 4 +- examples/bestdose_cov.rs | 4 +- examples/bimodal_ke/main.rs | 21 +- examples/bimodal_ke_backend_compare.rs | 18 +- examples/drusano/main.rs | 71 ++--- examples/iov/main.rs | 15 +- examples/meta/main.rs | 29 +- examples/neely/main.rs | 39 +-- examples/new_iov/main.rs | 18 +- examples/theophylline/main.rs | 20 +- examples/two_eq_lag/main.rs | 22 +- examples/vanco_sde/main.rs | 26 +- src/algorithms/mod.rs | 5 - src/algorithms/nonparametric/npag.rs | 24 +- src/algorithms/nonparametric/npmap.rs | 5 +- src/algorithms/nonparametric/npod.rs | 3 + src/estimation/mod.rs | 2 +- src/estimation/nonparametric/expansion.rs | 6 +- src/estimation/nonparametric/result.rs | 11 + .../nonparametric/sampling/latin.rs | 8 +- .../nonparametric/sampling/sobol.rs | 7 +- src/estimation/nonparametric/theta.rs | 14 +- src/estimation/problem.rs | 255 +++++++++--------- src/model/parameter_space.rs | 24 +- tests/bestdose_tests.rs | 4 +- tests/onecomp.rs | 62 +++-- tests/results_summary_tests.rs | 10 +- 30 files changed, 417 insertions(+), 372 deletions(-) diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index b22c0c26b..6867339c6 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -31,41 +31,41 @@ fn load_data() -> Result { fn setup_npag() -> Result> { let data = load_data()?; - EstimationProblem::builder(create_equation(), data) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error_model( - "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), - ) - .build() + let parameters = ParameterSpace::bounded() + .add("ke", 0.001, 3.0) + .add("v", 25.0, 250.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + )?; + EstimationProblem::nonparametric(create_equation(), data, prior, error_models) } fn setup_npod() -> Result> { let data = load_data()?; - EstimationProblem::builder(create_equation(), data) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error_model( - "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), - ) - .build() + let parameters = ParameterSpace::bounded() + .add("ke", 0.001, 3.0) + .add("v", 25.0, 250.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + )?; + EstimationProblem::nonparametric(create_equation(), data, prior, error_models) } fn setup_postprob() -> Result> { let data = load_data()?; - EstimationProblem::builder(create_equation(), data) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error_model( - "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), - ) - .build() + let parameters = ParameterSpace::bounded() + .add("ke", 0.001, 3.0) + .add("v", 25.0, 250.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + )?; + EstimationProblem::nonparametric(create_equation(), data, prior, error_models) } fn benchmark_algorithm(c: &mut Criterion, bench_name: &str, setup_fn: F, config: A) diff --git a/examples/bestdose.rs b/examples/bestdose.rs index 3c31a8724..9fd9aed2e 100644 --- a/examples/bestdose.rs +++ b/examples/bestdose.rs @@ -21,8 +21,8 @@ fn main() -> Result<()> { }; let parameter_space = ParameterSpace::::new() - .add(Parameter::bounded("ke", 0.001, 3.0)) - .add(Parameter::bounded("v", 25.0, 250.0)); + .add("ke", 0.001, 3.0) + .add("v", 25.0, 250.0); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bestdose_auc.rs b/examples/bestdose_auc.rs index 2c84e6762..0bcacc0e4 100644 --- a/examples/bestdose_auc.rs +++ b/examples/bestdose_auc.rs @@ -29,8 +29,8 @@ fn main() -> Result<()> { // Minimal parameter ranges let parameter_space = ParameterSpace::::new() - .add(Parameter::bounded("ke", 0.001, 3.0)) - .add(Parameter::bounded("v", 25.0, 250.0)); + .add("ke", 0.001, 3.0) + .add("v", 25.0, 250.0); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bestdose_bounds.rs b/examples/bestdose_bounds.rs index 36aa11129..286251618 100644 --- a/examples/bestdose_bounds.rs +++ b/examples/bestdose_bounds.rs @@ -28,8 +28,8 @@ fn main() -> Result<()> { }; let parameter_space = ParameterSpace::::new() - .add(Parameter::bounded("ke", 0.001, 3.0)) - .add(Parameter::bounded("v", 25.0, 250.0)); + .add("ke", 0.001, 3.0) + .add("v", 25.0, 250.0); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bestdose_cov.rs b/examples/bestdose_cov.rs index 4587f967c..1cb6ac3e2 100644 --- a/examples/bestdose_cov.rs +++ b/examples/bestdose_cov.rs @@ -22,8 +22,8 @@ fn main() -> Result<()> { }; let parameter_space = ParameterSpace::::new() - .add(Parameter::bounded("ke", 0.001, 3.0)) - .add(Parameter::bounded("v", 25.0 / 70.0, 250.0 / 70.0)); + .add("ke", 0.001, 3.0) + .add("v", 25.0 / 70.0, 250.0 / 70.0); let ems = AssayErrorModels::new().add( 0, diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index cf8cae117..7525563f3 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -23,15 +23,18 @@ fn main() -> Result<()> { let data = data::read_pmetrics("examples/bimodal_ke/bimodal_ke.csv")?; - let problem = EstimationProblem::builder(eq, data) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error_model( - "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), - ) - .build()?; + let parameters = ParameterSpace::bounded() + .add("ke", 0.001, 3.0) + .add("v", 25.0, 250.0); + + let prior = Theta::sobol_default(¶meters)?; + + let error_models = AssayErrorModels::new().add( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + )?; + + let problem = EstimationProblem::nonparametric(eq, data, prior, error_models)?; let _result = problem.fit_with(NpagConfig::default())?; diff --git a/examples/bimodal_ke_backend_compare.rs b/examples/bimodal_ke_backend_compare.rs index 2d71e5c07..d124897d8 100644 --- a/examples/bimodal_ke_backend_compare.rs +++ b/examples/bimodal_ke_backend_compare.rs @@ -202,15 +202,15 @@ fn run_case Result { let data = data::read_pmetrics(DATA_PATH)?; let fit_started = Instant::now(); - let result = EstimationProblem::builder(equation, data) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error_model( - "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), - ) - .build()? + let parameters = ParameterSpace::bounded() + .add("ke", 0.001, 3.0) + .add("v", 25.0, 250.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), + )?; + let result = EstimationProblem::nonparametric(equation, data, prior, error_models)? .fit_with(NpagConfig::default())?; let fit_time = fit_started.elapsed(); diff --git a/examples/drusano/main.rs b/examples/drusano/main.rs index 429bb809f..8df246d7a 100644 --- a/examples/drusano/main.rs +++ b/examples/drusano/main.rs @@ -64,49 +64,50 @@ fn main() -> Result<()> { }; let data = data::read_pmetrics("examples/drusano/data.csv")?; - EstimationProblem::builder(eq, data) - .nonparametric() - .parameter(Parameter::bounded("v1", 5.0, 160.0)) - .parameter(Parameter::bounded("cl1", 4.0, 9.0)) - .parameter(Parameter::bounded("v2", 100.0, 200.0)) - .parameter(Parameter::bounded("cl2", 25.0, 35.0)) - .parameter(Parameter::bounded("popmax", 100000000.0, 100000000000.0)) - .parameter(Parameter::bounded("kgs", 0.01, 0.25)) - .parameter(Parameter::bounded("kks", 0.01, 0.5)) - .parameter(Parameter::bounded("e50_1s", 0.1, 2.5)) - .parameter(Parameter::bounded("e50_2s", 0.1, 10.0)) - .parameter(Parameter::bounded("alpha_s", -8.0, 5.0)) - .parameter(Parameter::bounded("kgr1", 0.004, 0.1)) - .parameter(Parameter::bounded("kkr1", 0.08, 0.4)) - .parameter(Parameter::bounded("e50_1r1", 8.0, 17.0)) - .parameter(Parameter::bounded("alpha_r1", -8.0, 5.0)) - .parameter(Parameter::bounded("kgr2", 0.004, 0.3)) - .parameter(Parameter::bounded("kkr2", 0.1, 0.5)) - .parameter(Parameter::bounded("e50_2r2", 5.0, 8.0)) - .parameter(Parameter::bounded("alpha_r2", -5.0, 5.0)) - .parameter(Parameter::bounded("init_4", -1.0, 4.0)) - .parameter(Parameter::bounded("init_5", -1.0, 3.0)) - .parameter(Parameter::bounded("h1s", 0.5, 8.0)) - .parameter(Parameter::bounded("h2s", 0.1, 4.0)) - .parameter(Parameter::bounded("h1r1", 5.0, 25.0)) - .parameter(Parameter::bounded("h2r2", 10.0, 22.0)) - .error_model( + let parameters = ParameterSpace::bounded() + .add("v1", 5.0, 160.0) + .add("cl1", 4.0, 9.0) + .add("v2", 100.0, 200.0) + .add("cl2", 25.0, 35.0) + .add("popmax", 100000000.0, 100000000000.0) + .add("kgs", 0.01, 0.25) + .add("kks", 0.01, 0.5) + .add("e50_1s", 0.1, 2.5) + .add("e50_2s", 0.1, 10.0) + .add("alpha_s", -8.0, 5.0) + .add("kgr1", 0.004, 0.1) + .add("kkr1", 0.08, 0.4) + .add("e50_1r1", 8.0, 17.0) + .add("alpha_r1", -8.0, 5.0) + .add("kgr2", 0.004, 0.3) + .add("kkr2", 0.1, 0.5) + .add("e50_2r2", 5.0, 8.0) + .add("alpha_r2", -5.0, 5.0) + .add("init_4", -1.0, 4.0) + .add("init_5", -1.0, 3.0) + .add("h1s", 0.5, 8.0) + .add("h2s", 0.1, 4.0) + .add("h1r1", 5.0, 25.0) + .add("h2r2", 10.0, 22.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new() + .add( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), - ) - .error_model( + )? + .add( "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), - ) - .error_model( + )? + .add( "outeq_3", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), - ) - .error_model( + )? + .add( "outeq_4", AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), - ) - .build()? + )?; + EstimationProblem::nonparametric(eq, data, prior, error_models)? .fit_with(NpagConfig::default())?; Ok(()) } diff --git a/examples/iov/main.rs b/examples/iov/main.rs index 090100a0d..78cc56e79 100644 --- a/examples/iov/main.rs +++ b/examples/iov/main.rs @@ -27,14 +27,13 @@ fn main() -> Result<()> { }; let data = data::read_pmetrics("examples/iov/test.csv").unwrap(); - EstimationProblem::builder(sde, data) - .nonparametric() - .parameter(Parameter::bounded("ke0", 0.001, 2.0)) - .error_model( - "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), - ) - .build()? + let parameters = ParameterSpace::bounded().add("ke0", 0.001, 2.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), + )?; + EstimationProblem::nonparametric(sde, data, prior, error_models)? .fit_with(NpagConfig::default()) .unwrap(); diff --git a/examples/meta/main.rs b/examples/meta/main.rs index 016130a1a..4bce251fa 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -32,24 +32,25 @@ fn main() -> Result<()> { }; let data = data::read_pmetrics("examples/meta/meta.csv")?; - EstimationProblem::builder(eq, data) - .nonparametric() - .parameter(Parameter::bounded("cls", 0.1, 10.0)) - .parameter(Parameter::bounded("fm", 0.0, 1.0)) - .parameter(Parameter::bounded("k20", 0.01, 1.0)) - .parameter(Parameter::bounded("relv", 0.1, 1.0)) - .parameter(Parameter::bounded("theta1", 0.1, 10.0)) - .parameter(Parameter::bounded("theta2", 0.1, 10.0)) - .parameter(Parameter::bounded("vs", 1.0, 10.0)) - .error_model( + let parameters = ParameterSpace::bounded() + .add("cls", 0.1, 10.0) + .add("fm", 0.0, 1.0) + .add("k20", 0.01, 1.0) + .add("relv", 0.1, 1.0) + .add("theta1", 0.1, 10.0) + .add("theta2", 0.1, 10.0) + .add("vs", 1.0, 10.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new() + .add( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), - ) - .error_model( + )? + .add( "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), - ) - .build()? + )?; + EstimationProblem::nonparametric(eq, data, prior, error_models)? .fit_with(NpodConfig::default())?; Ok(()) diff --git a/examples/neely/main.rs b/examples/neely/main.rs index f912b789f..09b667d1b 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -47,31 +47,32 @@ fn main() -> Result<()> { }; let data = data::read_pmetrics("examples/neely/data.csv")?; - EstimationProblem::builder(eq, data) - .nonparametric() - .parameter(Parameter::bounded("cls", 0.0, 0.4)) - .parameter(Parameter::bounded("k30", 0.0, 0.5)) - .parameter(Parameter::bounded("k40", 0.3, 1.5)) - .parameter(Parameter::bounded("qs", 0.0, 0.5)) - .parameter(Parameter::bounded("vps", 0.0, 5.0)) - .parameter(Parameter::bounded("vs", 0.0, 2.0)) - .parameter(Parameter::bounded("fm1", 0.0, 0.2)) - .parameter(Parameter::bounded("fm2", 0.0, 0.1)) - .parameter(Parameter::bounded("theta1", -4.0, 2.0)) - .parameter(Parameter::bounded("theta2", -2.0, 0.5)) - .error_model( + let parameters = ParameterSpace::bounded() + .add("cls", 0.0, 0.4) + .add("k30", 0.0, 0.5) + .add("k40", 0.3, 1.5) + .add("qs", 0.0, 0.5) + .add("vps", 0.0, 5.0) + .add("vs", 0.0, 2.0) + .add("fm1", 0.0, 0.2) + .add("fm2", 0.0, 0.1) + .add("theta1", -4.0, 2.0) + .add("theta2", -2.0, 0.5); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new() + .add( "outeq_1", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), - ) - .error_model( + )? + .add( "outeq_2", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), - ) - .error_model( + )? + .add( "outeq_3", AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), - ) - .build()? + )?; + EstimationProblem::nonparametric(eq, data, prior, error_models)? .fit_with(NpagConfig::default())?; Ok(()) diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index 7ba97f169..958b1b88c 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -26,15 +26,15 @@ fn main() -> Result<()> { }; let data = data::read_pmetrics("examples/new_iov/data.csv")?; - EstimationProblem::builder(sde, data) - .nonparametric() - .parameter(Parameter::bounded("ke0", 0.0001, 2.4)) - .parameter(Parameter::bounded("ske", 0.0001, 0.2)) - .error_model( - "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), - ) - .build()? + let parameters = ParameterSpace::bounded() + .add("ke0", 0.0001, 2.4) + .add("ske", 0.0001, 0.2); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), + )?; + EstimationProblem::nonparametric(sde, data, prior, error_models)? .fit_with(NpagConfig::default())?; Ok(()) diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index 69a0df75a..2819d61a5 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -16,16 +16,16 @@ fn main() -> Result<()> { }; let data = data::read_pmetrics("examples/theophylline/theophylline.csv")?; - EstimationProblem::builder(analytical, data) - .nonparametric() - .parameter(Parameter::bounded("ka", 0.001, 3.0)) - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 0.001, 50.0)) - .error_model( - "outeq_0", - AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), - ) - .build()? + let parameters = ParameterSpace::bounded() + .add("ka", 0.001, 3.0) + .add("ke", 0.001, 3.0) + .add("v", 0.001, 50.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "outeq_0", + AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), + )?; + EstimationProblem::nonparametric(analytical, data, prior, error_models)? .fit_with(NpagConfig::default())?; Ok(()) diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index 0b9939477..f7fc6e27e 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -22,17 +22,17 @@ fn main() -> Result<()> { }; let data = data::read_pmetrics("examples/two_eq_lag/two_eq_lag.csv")?; - EstimationProblem::builder(eq, data) - .nonparametric() - .parameter(Parameter::bounded("ka", 0.1, 0.9)) - .parameter(Parameter::bounded("ke", 0.001, 0.1)) - .parameter(Parameter::bounded("tlag", 0.0, 4.0)) - .parameter(Parameter::bounded("v", 30.0, 120.0)) - .error_model( - "outeq_0", - AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), - ) - .build()? + let parameters = ParameterSpace::bounded() + .add("ka", 0.1, 0.9) + .add("ke", 0.001, 0.1) + .add("tlag", 0.0, 4.0) + .add("v", 30.0, 120.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "outeq_0", + AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), + )?; + EstimationProblem::nonparametric(eq, data, prior, error_models)? .fit_with(NpagConfig::default())?; Ok(()) diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index be820c34b..bce50d578 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -48,19 +48,19 @@ fn main() -> Result<()> { // ); let data = data::read_pmetrics("examples/vanco_sde/vanco_clean.csv")?; - EstimationProblem::builder(sde, data) - .nonparametric() - .parameter(Parameter::bounded("ka", 0.0001, 2.4)) - .parameter(Parameter::bounded("ke0", 0.0001, 2.7)) - .parameter(Parameter::bounded("kcp", 0.0001, 2.4)) - .parameter(Parameter::bounded("kpc", 0.0001, 2.4)) - .parameter(Parameter::bounded("vol", 0.2, 12.0)) - .parameter(Parameter::bounded("ske", 0.0001, 0.2)) - .error_model( - "outeq_1", - AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), - ) - .build()? + let parameters = ParameterSpace::bounded() + .add("ka", 0.0001, 2.4) + .add("ke0", 0.0001, 2.7) + .add("kcp", 0.0001, 2.4) + .add("kpc", 0.0001, 2.4) + .add("vol", 0.2, 12.0) + .add("ske", 0.0001, 0.2); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "outeq_1", + AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), + )?; + EstimationProblem::nonparametric(sde, data, prior, error_models)? .fit_with(NpagConfig::default())?; Ok(()) diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index 50b81013c..3d232ef36 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -38,11 +38,6 @@ pub mod nonparametric; pub mod parametric; impl EstimationProblem { - /// Returns the parameter space defined for this problem. - pub fn parameters(&self) -> &F::Parameters { - &self.parameters - } - /// The "Swap and Fit" API: /// Consumes the problem and the algorithm configuration, builds the engine, /// and runs it to completion automatically. diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 3f68df99a..454a48532 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -124,6 +124,7 @@ pub struct NPAG { equation: E, ranges: Vec<(f64, f64)>, psi: Psi, + prior: Theta, theta: Theta, lambda: Weights, w: Weights, @@ -162,6 +163,7 @@ impl NPAG { equation, ranges, psi: Psi::new(), + prior: theta.clone(), theta, lambda: Weights::default(), w: Weights::default(), @@ -191,6 +193,7 @@ impl NonParametricAlgorithm for NPAG { self.equation.clone(), self.data.clone(), self.error_models.clone(), + self.prior.clone(), self.theta.clone(), self.psi.clone(), self.w.clone(), @@ -504,8 +507,8 @@ impl Algorithm for NpagConfig { type Runner = NPAG; fn build_runner(self, problem: EstimationProblem) -> Result { - // Here, problem.parameters is strictly ParameterSpace - // and problem.error_models is strictly AssayErrorModels! + // `problem.prior` is the prior `Theta` (which also carries the parameter + // space) and `problem.error_models` is strictly `AssayErrorModels`. NPAG::from_parts( problem.model.equation.clone(), @@ -579,16 +582,19 @@ mod tests { #[test] fn npag_runs_without_error() { - let problem = EstimationProblem::builder(simple_equation(), simple_data()) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.001, 3.0)) - .parameter(Parameter::bounded("v", 25.0, 250.0)) - .error_model( + let parameters = ParameterSpace::bounded() + .add("ke", 0.001, 3.0) + .add("v", 25.0, 250.0); + let prior = Theta::sobol_default(¶meters).expect("Failed to build prior"); + let error_models = AssayErrorModels::new() + .add( "0", AssayErrorModel::additive(ErrorPoly::new(0.0, 0.5, 0.0, 0.0), 0.0), ) - .build() - .expect("Failed to build problem"); + .expect("Failed to build error models"); + let problem = + EstimationProblem::nonparametric(simple_equation(), simple_data(), prior, error_models) + .expect("Failed to build problem"); let result = problem.fit_with(NpagConfig::default()); diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index 04bc30bf4..b5d8d32a9 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -40,6 +40,7 @@ pub struct NPMAP { data: Data, cyclelog: CycleLog, error_models: AssayErrorModels, + prior: Theta, } impl NPMAP { @@ -53,7 +54,7 @@ impl NPMAP { Ok(Self { equation, psi: Psi::new(), - theta, + theta: theta.clone(), w: Weights::default(), objf: f64::INFINITY, cycle: 0, @@ -61,6 +62,7 @@ impl NPMAP { data, cyclelog: CycleLog::new(), error_models, + prior: theta, }) } } @@ -71,6 +73,7 @@ impl NonParametricAlgorithm for NPMAP { self.equation.clone(), self.data.clone(), self.error_models.clone(), + self.prior.clone(), self.theta.clone(), self.psi.clone(), self.w.clone(), diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index e9db76ab8..4ea3df805 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -54,6 +54,7 @@ impl Default for NpodConfig { pub struct NPOD { equation: E, psi: Psi, + prior: Theta, theta: Theta, lambda: Weights, w: Weights, @@ -82,6 +83,7 @@ impl NPOD { Ok(Self { equation, psi: Psi::new(), + prior: theta.clone(), theta: theta, lambda: Weights::default(), w: Weights::default(), @@ -147,6 +149,7 @@ impl NonParametricAlgorithm for NPOD { self.equation.clone(), self.data.clone(), self.error_models.clone(), + self.prior.clone(), self.theta.clone(), self.psi.clone(), self.w.clone(), diff --git a/src/estimation/mod.rs b/src/estimation/mod.rs index 98ffdd84c..3f9c57002 100644 --- a/src/estimation/mod.rs +++ b/src/estimation/mod.rs @@ -6,6 +6,6 @@ pub mod progress; pub use crate::algorithms::nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; pub use error_models::ErrorModels; pub use problem::{ - EstimationProblem, EstimationProblemBuilder, Framework, NonParametric, Parametric, + EstimationProblem, Framework, NonParametric, Parametric, ParametricBuilder, }; pub use progress::{FitProgress, NonparametricCycleProgress}; diff --git a/src/estimation/nonparametric/expansion.rs b/src/estimation/nonparametric/expansion.rs index fd3a4686b..7ca892ae0 100644 --- a/src/estimation/nonparametric/expansion.rs +++ b/src/estimation/nonparametric/expansion.rs @@ -45,14 +45,14 @@ pub fn adaptative_grid( #[cfg(test)] mod tests { use super::*; - use crate::model::{BoundedParameter, Parameter, ParameterSpace}; + use crate::model::{BoundedParameter, ParameterSpace}; use faer::mat; #[test] fn adaptive_grid_expands_points_within_bounds() { let parameters = ParameterSpace::::new() - .add(Parameter::bounded("x", 0.0, 1.0)) - .add(Parameter::bounded("y", 0.0, 1.0)); + .add("x", 0.0, 1.0) + .add("y", 0.0, 1.0); let mut theta = Theta::from_parts(mat![[0.5, 0.5]], parameters).unwrap(); let ranges = [(0.0, 1.0), (0.0, 1.0)]; diff --git a/src/estimation/nonparametric/result.rs b/src/estimation/nonparametric/result.rs index a372a0c52..96cc75bd3 100644 --- a/src/estimation/nonparametric/result.rs +++ b/src/estimation/nonparametric/result.rs @@ -13,6 +13,7 @@ pub struct NonParametricResult { equation: E, data: Data, error_models: AssayErrorModels, + prior: Theta, theta: Theta, psi: Psi, weights: Weights, @@ -28,6 +29,7 @@ impl NonParametricResult { equation: E, data: Data, error_models: AssayErrorModels, + prior: Theta, theta: Theta, psi: Psi, weights: Weights, @@ -40,6 +42,7 @@ impl NonParametricResult { equation, data, error_models, + prior, theta, psi, weights, @@ -66,6 +69,14 @@ impl NonParametricResult { &self.theta } + /// The prior distribution ([`Theta`]) that seeded the algorithm. + /// + /// This is the initial set of support points, as opposed to the optimized + /// solution returned by [`get_theta`](Self::get_theta). + pub fn prior(&self) -> &Theta { + &self.prior + } + pub fn data(&self) -> &Data { &self.data } diff --git a/src/estimation/nonparametric/sampling/latin.rs b/src/estimation/nonparametric/sampling/latin.rs index aff72c920..b6f7f4f32 100644 --- a/src/estimation/nonparametric/sampling/latin.rs +++ b/src/estimation/nonparametric/sampling/latin.rs @@ -31,14 +31,14 @@ pub fn generate(parameters: &ParameterSpace, points: usize, se #[cfg(test)] mod tests { use super::*; - use crate::model::{BoundedParameter, Parameter, ParameterSpace}; + use crate::model::{BoundedParameter, ParameterSpace}; #[test] fn latin_generate_produces_requested_shape() { let params = ParameterSpace::::new() - .add(Parameter::bounded("a", 0.0, 1.0)) - .add(Parameter::bounded("b", 0.0, 1.0)) - .add(Parameter::bounded("c", 0.0, 1.0)); + .add("a", 0.0, 1.0) + .add("b", 0.0, 1.0) + .add("c", 0.0, 1.0); let theta = generate(¶ms, 10, 22).unwrap(); assert_eq!(theta.nspp(), 10); diff --git a/src/estimation/nonparametric/sampling/sobol.rs b/src/estimation/nonparametric/sampling/sobol.rs index f33341401..1dc8f2af0 100644 --- a/src/estimation/nonparametric/sampling/sobol.rs +++ b/src/estimation/nonparametric/sampling/sobol.rs @@ -25,14 +25,13 @@ pub fn generate( #[cfg(test)] mod tests { use super::*; - use crate::model::Parameter; #[test] fn sobol_generate_produces_requested_shape() { let params = ParameterSpace::::new() - .add(Parameter::bounded("a", 0.0, 1.0)) - .add(Parameter::bounded("b", 0.0, 1.0)) - .add(Parameter::bounded("c", 0.0, 1.0)); + .add("a", 0.0, 1.0) + .add("b", 0.0, 1.0) + .add("c", 0.0, 1.0); let theta = generate(¶ms, 10, 22).unwrap(); assert_eq!(theta.nspp(), 10); diff --git a/src/estimation/nonparametric/theta.rs b/src/estimation/nonparametric/theta.rs index cb02a3252..abe0c0a70 100644 --- a/src/estimation/nonparametric/theta.rs +++ b/src/estimation/nonparametric/theta.rs @@ -240,6 +240,13 @@ impl Theta { Self::sobol_with_seed(parameters, points, sampling::DEFAULT_SEED) } + /// Generate a starting grid over `parameters` using a Sobol sequence with the + /// default number of support points ([`sampling::DEFAULT_POINTS`]) and the + /// default seed ([`sampling::DEFAULT_SEED`]). + pub fn sobol_default(parameters: &ParameterSpace) -> Result { + Self::sobol(parameters, sampling::DEFAULT_POINTS) + } + /// Like [`Theta::sobol`], with an explicit seed for the quasi-random sequence. pub fn sobol_with_seed( parameters: &ParameterSpace, @@ -455,13 +462,12 @@ fn validate_bounds(parameters: &ParameterSpace) -> Result<()> #[cfg(test)] mod tests { use super::*; - use crate::model::Parameter; use std::fs; fn parameters() -> ParameterSpace { ParameterSpace::::new() - .add(Parameter::bounded("ke", 0.1, 1.0)) - .add(Parameter::bounded("v", 5.0, 50.0)) + .add("ke", 0.1, 1.0) + .add("v", 5.0, 50.0) } fn temp_csv_path() -> String { @@ -484,7 +490,7 @@ mod tests { #[test] fn sampling_rejects_invalid_bounds() { - let bad = ParameterSpace::::new().add(Parameter::bounded("ke", 1.0, 1.0)); + let bad = ParameterSpace::::new().add("ke", 1.0, 1.0); let err = Theta::sobol(&bad, 10).unwrap_err(); assert!(err.to_string().contains("invalid bounds")); } diff --git a/src/estimation/problem.rs b/src/estimation/problem.rs index 3618ecefa..ef66805c2 100644 --- a/src/estimation/problem.rs +++ b/src/estimation/problem.rs @@ -1,8 +1,9 @@ use anyhow::{anyhow, Result}; use pharmsol::{ - AssayErrorModel, AssayErrorModels, Data, Equation, ResidualErrorModel, ResidualErrorModels, + AssayErrorModel, AssayErrorModels, Data, Equation, Event, ResidualErrorModel, + ResidualErrorModels, }; -use std::collections::HashSet; +use std::collections::{BTreeSet, HashSet}; use crate::estimation::nonparametric::Theta; use crate::model::parameter_space::{BoundedParameter, ParameterSpace, UnboundedParameter}; @@ -10,21 +11,26 @@ use crate::model::{EquationMetadataSource, Model, ModelBuilder}; pub trait Framework { type ErrorModels; - type Parameters; + /// The prior that seeds the algorithm. + /// + /// For the non-parametric framework this is a [`Theta`] (a discrete prior + /// distribution that also carries the parameter space). For the parametric + /// framework it is the [`ParameterSpace`] of unbounded parameters. + type Prior; } pub struct Parametric; impl Framework for Parametric { type ErrorModels = ResidualErrorModels; - type Parameters = ParameterSpace; + type Prior = ParameterSpace; } pub struct NonParametric; impl Framework for NonParametric { type ErrorModels = AssayErrorModels; - type Parameters = ParameterSpace; + type Prior = Theta; } #[derive(Debug, Clone)] @@ -32,130 +38,65 @@ pub struct EstimationProblem { pub(crate) model: Model, pub(crate) data: Data, pub(crate) error_models: F::ErrorModels, - pub(crate) parameters: F::Parameters, - /// The initial set of support points used to seed the algorithm. + /// The prior that seeds the algorithm. /// - /// Only meaningful for the non-parametric framework; the parametric - /// framework leaves this empty. - pub(crate) prior: Theta, + /// For the non-parametric framework this is the prior [`Theta`], which also + /// carries the parameter space. The parameter space is therefore not stored + /// separately. + pub(crate) prior: F::Prior, } -pub struct EstimationProblemBuilder { - model: ModelBuilder, - data: Data, -} +impl EstimationProblem { + /// Creates a non-parametric estimation problem. + /// + /// The `prior` is a [`Theta`] holding the prior distribution (the initial + /// set of support points) together with the [`ParameterSpace`] it was built + /// from. The parameter space is taken directly from the prior, so there is + /// no separate parameter-declaration step. + pub fn nonparametric( + equation: E, + data: Data, + prior: Theta, + error_models: AssayErrorModels, + ) -> Result { + let model_builder = Model::builder(equation); -impl EstimationProblemBuilder { - pub fn nonparametric(self) -> NonParametricBuilder { - NonParametricBuilder { - model: self.model, - data: self.data, - parameters: ParameterSpace::::new(), - error_models: Vec::new(), - initial_points: None, - } - } + validate_nonparametric_parameters(&model_builder, prior.parameters())?; - pub fn parametric(self) -> ParametricBuilder { - ParametricBuilder { - model: self.model, - data: self.data, - parameters: ParameterSpace::::new(), - error_models: Vec::new(), - } - } -} + let model = model_builder.build()?; -impl EstimationProblem { - pub fn builder(equation: E, data: Data) -> EstimationProblemBuilder { - EstimationProblemBuilder { - model: Model::builder(equation), + validate_nonparametric_error_models(&model, &data, &error_models)?; + + Ok(EstimationProblem { + model, data, - } + error_models, + prior, + }) } } -pub struct NonParametricBuilder { - model: ModelBuilder, - data: Data, - parameters: ParameterSpace, - error_models: Vec<(String, AssayErrorModel)>, - initial_points: Option, -} - -impl NonParametricBuilder { - pub fn parameter(mut self, parameter: impl Into) -> Self { - self.parameters.push(parameter.into()); - self - } - - pub fn parameters(mut self, parameters: I) -> Self - where - P: Into, - I: IntoIterator, - { - for param in parameters { - self.parameters.push(param.into()); +impl EstimationProblem { + /// Begins building a parametric estimation problem. + pub fn parametric(equation: E, data: Data) -> ParametricBuilder { + ParametricBuilder { + model: Model::builder(equation), + data, + parameters: ParameterSpace::::new(), + error_models: Vec::new(), } - self } - pub fn error_model(mut self, name: impl Into, model: AssayErrorModel) -> Self { - self.error_models.push((name.into(), model)); - self - } - - /// Sets the initial set of support points (the starting grid) explicitly. - /// - /// Build the [`Theta`] from the same parameter space used for the problem, - /// e.g. with [`Theta::sobol`], [`Theta::latin`], or [`Theta::from_file`]. - /// When omitted, a Sobol grid is generated automatically from the declared - /// parameter bounds. - pub fn prior(mut self, theta: Theta) -> Self { - self.initial_points = Some(theta); - self + /// Returns the parameter space defined for this problem. + pub fn parameters(&self) -> &ParameterSpace { + &self.prior } } -impl NonParametricBuilder { - pub fn build(self) -> Result> { - validate_nonparametric_parameters(&self.model, &self.parameters)?; - validate_nonparametric_error_models(&self.model, &self.error_models)?; - - let mut all_errors = AssayErrorModels::new(); - for (name, error_model) in self.error_models { - let outeq = self - .model - .output_index(&name) - .ok_or_else(|| anyhow!("unknown equation output label: {name}"))?; - - all_errors = all_errors.add(outeq, error_model)?; - } - - let prior = match self.initial_points { - Some(theta) => { - if theta.parameters() != &self.parameters { - anyhow::bail!( - "initial points parameter space {:?} does not match the problem parameters {:?}", - theta.parameters().names(), - self.parameters.names() - ); - } - theta - } - None => Theta::sobol( - &self.parameters, - crate::estimation::nonparametric::sampling::DEFAULT_POINTS, - )?, - }; - - Ok(EstimationProblem { - model: self.model.build()?, - data: self.data, - error_models: all_errors, - parameters: self.parameters, - prior, - }) +impl EstimationProblem { + /// Returns the parameter space carried by the prior [`Theta`]. + pub fn parameters(&self) -> &ParameterSpace { + self.prior.parameters() } } @@ -208,8 +149,7 @@ impl ParametricBuilder { model: self.model.build()?, data: self.data, error_models: all_errors, - parameters: self.parameters, - prior: Theta::default(), + prior: self.parameters, }) } } @@ -313,14 +253,88 @@ fn validate_parameter_declarations( } fn validate_nonparametric_error_models( - model: &ModelBuilder, - error_models: &[(String, AssayErrorModel)], + model: &Model, + data: &Data, + error_models: &AssayErrorModels, ) -> Result<()> { - if error_models.is_empty() { - anyhow::bail!("at least one assay error model is required"); + // Bind the (label-first) error models to the equation. This resolves and + // validates that every declared output label maps to a valid model output. + let bound = model + .equation + .bind_error_models(error_models) + .map_err(|e| anyhow!("invalid assay error model output(s): {e}"))?; + + // Collect the set of model output indices that are actually observed in the + // data, resolving each observation's output label the same way the simulator + // does (exact name, then the `outeq_` numeric alias). + let mut observed_outputs: BTreeSet = BTreeSet::new(); + let mut unresolved_labels: BTreeSet = BTreeSet::new(); + for subject in data.subjects() { + for occasion in subject.occasions() { + for event in occasion.events() { + if let Event::Observation(obs) = event { + let label = obs.outeq().to_string(); + match resolve_output_index(model, &label) { + Some(outeq) => { + observed_outputs.insert(outeq); + } + None => { + unresolved_labels.insert(label); + } + } + } + } + } } - validate_error_model_labels(model, error_models.iter().map(|(name, _)| name.as_str())) + if !unresolved_labels.is_empty() { + let labels: Vec = unresolved_labels.into_iter().collect(); + anyhow::bail!( + "the data references output label(s) that are not defined by the model: {}", + labels.join(", ") + ); + } + + if observed_outputs.is_empty() { + anyhow::bail!("the data contains no observations to fit"); + } + + // Every observed output must have a (non-`None`) assay error model. + for &outeq in &observed_outputs { + let has_model = matches!( + bound.error_model(outeq), + Ok(error_model) if *error_model != AssayErrorModel::None + ); + + if !has_model { + let label = model + .output_name(outeq) + .map(|name| name.to_string()) + .unwrap_or_else(|| outeq.to_string()); + anyhow::bail!( + "no assay error model defined for output '{}' (index {}), which is observed in the data", + label, + outeq + ); + } + } + + Ok(()) +} + +/// Resolves an observation output `label` to a model output index, mirroring the +/// simulator: first by exact output name, then via the `outeq_` numeric alias. +fn resolve_output_index( + model: &Model, + label: &str, +) -> Option { + model.output_index(label).or_else(|| { + if !label.is_empty() && label.bytes().all(|b| b.is_ascii_digit()) { + model.output_index(&format!("outeq_{label}")) + } else { + None + } + }) } fn validate_parametric_error_models( @@ -362,4 +376,3 @@ where Ok(()) } - diff --git a/src/model/parameter_space.rs b/src/model/parameter_space.rs index b76edbb5a..b92785bea 100644 --- a/src/model/parameter_space.rs +++ b/src/model/parameter_space.rs @@ -18,12 +18,6 @@ impl ParameterSpace { self.items.push(item.into()); } - #[allow(clippy::should_implement_trait)] - pub fn add(mut self, item: impl Into) -> Self { - self.push(item); - self - } - pub fn len(&self) -> usize { self.items.len() } @@ -52,13 +46,20 @@ impl ParameterSpace { /// /// ```ignore /// let space = ParameterSpace::bounded() - /// .add(Parameter::bounded("ke", 0.1, 1.0)) - /// .add(Parameter::bounded("v", 1.0, 20.0)); + /// .add("ke", 0.1, 1.0) + /// .add("v", 1.0, 20.0); /// ``` pub fn bounded() -> Self { Self::new() } + /// Adds a bounded parameter with the given `name`, `lower`, and `upper` bounds. + #[allow(clippy::should_implement_trait)] + pub fn add(mut self, name: impl Into, lower: f64, upper: f64) -> Self { + self.items.push(BoundedParameter::new(name, lower, upper)); + self + } + /// Returns `(lower, upper)` for each parameter. pub fn finite_ranges(&self) -> Vec<(f64, f64)> { self.items.iter().map(|p| (p.lower, p.upper)).collect() @@ -74,6 +75,13 @@ impl ParameterSpace { pub fn unbounded() -> Self { Self::new() } + + /// Adds an unbounded parameter to the space. + #[allow(clippy::should_implement_trait)] + pub fn add(mut self, parameter: impl Into) -> Self { + self.items.push(parameter.into()); + self + } } impl FromIterator for ParameterSpace { diff --git a/tests/bestdose_tests.rs b/tests/bestdose_tests.rs index 655590469..ee4a268b2 100644 --- a/tests/bestdose_tests.rs +++ b/tests/bestdose_tests.rs @@ -11,8 +11,8 @@ fn pk_parameter_space( v_upper: f64, ) -> ParameterSpace { ParameterSpace::::new() - .add(Parameter::bounded("ke", ke_lower, ke_upper)) - .add(Parameter::bounded("v", v_lower, v_upper)) + .add("ke", ke_lower, ke_upper) + .add("v", v_lower, v_upper) } fn bestdose_config( diff --git a/tests/onecomp.rs b/tests/onecomp.rs index 1a12e39f9..c5e3463cc 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -53,24 +53,26 @@ fn test_one_compartment_npag() -> Result<()> { let data = data::Data::new(subjects); let parameters = ParameterSpace::::new() - .add(Parameter::bounded("ke", 0.1, 1.0)) - .add(Parameter::bounded("v", 1.0, 20.0)); - - let result = EstimationProblem::builder(eq, data) - .nonparametric() - .parameters(parameters.clone()) - .prior(Theta::sobol(¶meters, 100)?) - .error_model( - "0", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), - ) - .build()? + .add("ke", 0.1, 1.0) + .add("v", 1.0, 20.0); + + let prior = Theta::sobol(¶meters, 100)?; + let error_models = AssayErrorModels::new().add( + "0", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), + )?; + let result = EstimationProblem::nonparametric(eq, data, prior, error_models)? .fit_with(NpagConfig::default())?; // Check the results assert_eq!(result.cycles(), 31); assert!(result.objf() - 565.7749 < 0.01); + // The prior is preserved on the result and is distinct from the optimized + // solution (which is condensed to far fewer support points). + assert_eq!(result.prior().nspp(), 100); + assert!(result.get_theta().nspp() < result.prior().nspp()); + Ok(()) } @@ -117,15 +119,15 @@ fn test_one_compartment_npod() -> Result<()> { let data = data::Data::new(subjects); - let result = EstimationProblem::builder(eq, data) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.1, 1.0)) - .parameter(Parameter::bounded("v", 1.0, 20.0)) - .error_model( - "0", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), - ) - .build()? + let parameters = ParameterSpace::::new() + .add("ke", 0.1, 1.0) + .add("v", 1.0, 20.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add( + "0", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), + )?; + let result = EstimationProblem::nonparametric(eq, data, prior, error_models)? .fit_with(NpodConfig::default())?; // Check the results @@ -180,20 +182,16 @@ fn test_one_compartment_postprob() -> Result<()> { // Generate a prior distribution to test against let parameters = ParameterSpace::::new() - .add(Parameter::bounded("ke", 0.1, 1.0)) - .add(Parameter::bounded("v", 1.0, 20.0)); + .add("ke", 0.1, 1.0) + .add("v", 1.0, 20.0); let theta = Theta::sobol(¶meters, 100)?; - let result = EstimationProblem::builder(eq, data) - .nonparametric() - .parameters(parameters.clone()) - .prior(theta.clone()) - .error_model( - "0", - AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), - ) - .build()? + let error_models = AssayErrorModels::new().add( + "0", + AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), + )?; + let result = EstimationProblem::nonparametric(eq, data, theta.clone(), error_models)? .fit_with(NpmapConfig::default())?; // Check the results diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index 428ff7cbf..516cbd758 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -42,12 +42,10 @@ fn simple_data() -> Data { #[test] fn test_nonparametric_fit_result_summary_surface() -> Result<()> { let assay_error = AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0); - let result = EstimationProblem::builder(simple_equation(), simple_data()) - .nonparametric() - .parameter(Parameter::bounded("ke", 0.1, 1.0)) - .parameter(Parameter::bounded("v", 1.0, 20.0)) - .error_model("0", assay_error) - .build()? + let parameters = ParameterSpace::bounded().add("ke", 0.1, 1.0).add("v", 1.0, 20.0); + let prior = Theta::sobol_default(¶meters)?; + let error_models = AssayErrorModels::new().add("0", assay_error)?; + let result = EstimationProblem::nonparametric(simple_equation(), simple_data(), prior, error_models)? .fit_with(NpagConfig::default())?; let summary = result.summary(); From 1dc964c820f11229dd19e73ef5a578baa3703b24 Mon Sep 17 00:00:00 2001 From: Markus Date: Fri, 12 Jun 2026 17:52:12 +0200 Subject: [PATCH 44/47] Clean up dead code --- benches/bimodal_ke.rs | 6 +--- src/algorithms/mod.rs | 43 +++++++++------------------ src/algorithms/nonparametric/npag.rs | 39 +++++++----------------- src/algorithms/nonparametric/npmap.rs | 32 ++++++++++---------- src/algorithms/nonparametric/npod.rs | 28 ++++------------- src/lib.rs | 1 - 6 files changed, 48 insertions(+), 101 deletions(-) diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index 6867339c6..0c6f9da04 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -1,9 +1,6 @@ use anyhow::Result; use criterion::{criterion_group, criterion_main, Criterion}; -use pmcore::{ - algorithms::{Algorithm, Fitter}, - prelude::*, -}; +use pmcore::{algorithms::Algorithm, prelude::*}; use std::hint::black_box; @@ -72,7 +69,6 @@ fn benchmark_algorithm(c: &mut Criterion, bench_name: &str, setup_fn: F, c where F: Fn() -> Result>, A: Algorithm + Clone, - A::Runner: Fitter, { c.bench_function(bench_name, |b| { b.iter_with_setup( diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index 3d232ef36..c91e18c3c 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -15,22 +15,18 @@ use pharmsol::prelude::{data::Data, simulator::Equation}; use pharmsol::{Predictions, Subject}; use serde::{Deserialize, Serialize}; -/// Defines an algorithm capable of building an execution engine +/// Defines an algorithm that can fit an [`EstimationProblem`] to produce a result. +/// +/// Implementors are the lightweight, user-facing configuration structs (e.g. +/// `NpagConfig`). The heavy, mutable execution state used while fitting is an +/// internal implementation detail. pub trait Algorithm { - /// The strictly-typed runner struct (e.g., `NPAG`) - type Runner; - - /// Consumes the configuration and the problem to fully hydrate the runner state. - fn build_runner(self, problem: EstimationProblem) -> Result; -} - -/// A trait for runners that can be executed to produce a fit result -pub trait Fitter { - /// The specific result struct (e.g., NonParametricResult) + /// The specific result struct (e.g. `NonParametricResult`). type Output: FitResult; - /// Executes the optimization and returns the strictly-typed metrics. - fn fit(self) -> anyhow::Result; + /// Consumes the configuration and the problem, runs the optimization to + /// completion, and returns the strictly-typed result. + fn fit(self, problem: EstimationProblem) -> Result; } // Module organization for algorithm types @@ -38,24 +34,13 @@ pub mod nonparametric; pub mod parametric; impl EstimationProblem { - /// The "Swap and Fit" API: - /// Consumes the problem and the algorithm configuration, builds the engine, - /// and runs it to completion automatically. - pub fn fit_with(self, algorithm: A) -> anyhow::Result<>::Output> - where - A: Algorithm, - A::Runner: Fitter, - { - algorithm.build_runner(self)?.fit() - } - /// The "Extract Structure" API: - /// Consumes the problem and configuration, returning the strictly-typed - /// execution runner (e.g., `NPAG`) for advanced inspection. - pub fn runner(self, algorithm: A) -> Result + /// Consumes the problem and an algorithm configuration, runs the fit to + /// completion, and returns the result. + pub fn fit_with(self, algorithm: A) -> Result where A: Algorithm, { - algorithm.build_runner(self) + algorithm.fit(self) } } @@ -329,7 +314,7 @@ pub trait NonParametricAlgorithm: Sync + Send + 's /// followed by iterative cycles of estimation, condensation, optimization, and evaluation /// until the algorithm converges or meets a stopping criteria. fn fit(&mut self) -> Result> { - self.initialize().unwrap(); + self.initialize()?; while let Status::Continue = self.next_cycle()? {} self.into_result() } diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 454a48532..b72648ef3 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,4 +1,4 @@ -use crate::algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}; +use crate::algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}; use crate::estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }; @@ -502,38 +502,22 @@ impl NonParametricAlgorithm for NPAG { } } -// 1. Tell the compiler that NpagConfig is a Non-Parametric Algorithm +// Tell the compiler that NpagConfig is a Non-Parametric Algorithm. impl Algorithm for NpagConfig { - type Runner = NPAG; + type Output = NonParametricResult; - fn build_runner(self, problem: EstimationProblem) -> Result { + fn fit(self, problem: EstimationProblem) -> Result { // `problem.prior` is the prior `Theta` (which also carries the parameter // space) and `problem.error_models` is strictly `AssayErrorModels`. - - NPAG::from_parts( - problem.model.equation.clone(), - problem.data.clone(), - problem.error_models.clone(), - problem.prior.clone(), + let mut runner = NPAG::from_parts( + problem.model.equation, + problem.data, + problem.error_models, + problem.prior, self, - ) - } -} - -impl Fitter for NPAG { - type Output = NonParametricResult; - - fn fit(mut self) -> anyhow::Result { - self.initialize()?; - #[allow(clippy::while_let_loop)] - loop { - match self.next_cycle()? { - Status::Continue => continue, - Status::Stop(_) => break, - } - } + )?; - self.into_result() + NonParametricAlgorithm::fit(&mut runner) } } @@ -605,4 +589,3 @@ mod tests { ); } } - diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index b5d8d32a9..c15edce58 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -1,5 +1,5 @@ use crate::{ - algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}, + algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}, estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }, @@ -170,30 +170,30 @@ impl NonParametricAlgorithm for NPMAP { ); self.cyclelog.push(state); } + + /// POSTPROB is a single-pass reweighting: it evaluates the likelihood of the + /// fixed prior support points once, rather than iterating cycles. + fn fit(&mut self) -> Result> { + self.estimation()?; + self.evaluation()?; + self.log_cycle_state(); + + self.into_result() + } } impl Algorithm for NpmapConfig { - type Runner = NPMAP; + type Output = NonParametricResult; - fn build_runner(self, problem: EstimationProblem) -> Result { - NPMAP::from_parts( + fn fit(self, problem: EstimationProblem) -> Result { + let mut runner = NPMAP::from_parts( problem.model.equation, problem.data, problem.error_models, problem.prior, self, - ) - } -} - -impl Fitter for NPMAP { - type Output = NonParametricResult; - - fn fit(mut self) -> Result { - self.estimation()?; - self.evaluation()?; - self.log_cycle_state(); + )?; - self.into_result() + NonParametricAlgorithm::fit(&mut runner) } } diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 4ea3df805..2272299df 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -1,5 +1,5 @@ use crate::{ - algorithms::{Algorithm, Fitter, NonParametricAlgorithm, Status, StopReason}, + algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}, estimation::nonparametric::{ calculate_psi, ipm::burke, qr, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }, @@ -446,33 +446,17 @@ impl NonParametricAlgorithm for NPOD { } impl Algorithm for NpodConfig { - type Runner = NPOD; + type Output = NonParametricResult; - fn build_runner(self, problem: EstimationProblem) -> Result { - NPOD::from_parts( + fn fit(self, problem: EstimationProblem) -> Result { + let mut runner = NPOD::from_parts( problem.model.equation, problem.data, problem.error_models, problem.prior, self, - ) - } -} - -impl Fitter for NPOD { - type Output = NonParametricResult; - - fn fit(mut self) -> Result { - self.initialize()?; - #[allow(clippy::while_let_loop)] - loop { - match self.next_cycle()? { - Status::Continue => continue, - Status::Stop(_) => break, - } - } + )?; - // Return the strictly-typed NonParametricResult - self.into_result() + NonParametricAlgorithm::fit(&mut runner) } } diff --git a/src/lib.rs b/src/lib.rs index 838a09743..efc4d0d7d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,7 +54,6 @@ pub mod prelude { pub use super::Result; pub use crate::algorithms; pub use crate::algorithms::Algorithm; - pub use crate::algorithms::Fitter; pub use crate::estimation::NonParametric; pub use crate::estimation::{ From 99d2dc0c43122cbf8098d6548f03666ae948dbb6 Mon Sep 17 00:00:00 2001 From: Markus Date: Sat, 13 Jun 2026 09:28:56 +0200 Subject: [PATCH 45/47] Refactor validate_psi --- src/algorithms/mod.rs | 313 ++++++++++++--------------- src/algorithms/nonparametric/npag.rs | 4 +- src/algorithms/nonparametric/npod.rs | 49 +---- 3 files changed, 147 insertions(+), 219 deletions(-) diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index c91e18c3c..b4141116c 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -8,7 +8,6 @@ use crate::results::FitResult; use anyhow::Context; use anyhow::Result; use ndarray::parallel::prelude::{IntoParallelIterator, ParallelIterator}; -use ndarray::{Array, ArrayBase, Dim, OwnedRepr}; use pharmsol::prelude::{data::Data, simulator::Equation}; @@ -45,184 +44,158 @@ impl EstimationProblem { } pub trait NonParametricAlgorithm: Sync + Send + 'static { - fn validate_psi(&mut self) -> Result<()> { - // Count problematic values in psi - let mut nan_count = 0; - let mut inf_count = 0; - - let psi = self.psi().to_ndarray(); - // First coerce all NaN and infinite in psi to 0.0 - for i in 0..psi.nrows() { - for j in 0..self.psi().matrix().ncols() { - let val = psi.get((i, j)).unwrap(); - if val.is_nan() { - nan_count += 1; - // *val = 0.0; - } else if val.is_infinite() { - inf_count += 1; - // *val = 0.0; - } - } - } - - if nan_count + inf_count > 0 { + /// Identify subjects whose total probability given the model is zero or + /// non-finite. + /// + /// Each row of [`Psi`] holds the likelihood of a subject across every + /// support point, so a subject's probability is the sum across its row. A + /// subject is flagged when that sum is zero or not finite, meaning the model + /// cannot explain the subject's data. When any subject is flagged, detailed + /// per-subject diagnostics are logged and an error is returned. + fn check_zero_probability_subjects(&self) -> Result<()> { + let psi = self.psi().matrix(); + + // Report non-finite entries; these propagate into the row sums below. + let nonfinite = psi + .row_iter() + .flat_map(|row| row.iter().copied()) + .filter(|v| !v.is_finite()) + .count(); + if nonfinite > 0 { tracing::warn!( - "Psi matrix contains {} NaN, {} Infinite values of {} total values", - nan_count, - inf_count, - psi.ncols() * psi.nrows() + "Psi matrix contains {} non-finite value(s) of {} total", + nonfinite, + psi.nrows() * psi.ncols() ); } - let (_, col) = psi.dim(); - let ecol: ArrayBase, Dim<[usize; 1]>> = Array::ones(col); - let plam = psi.dot(&ecol); - let w = 1. / &plam; + // A subject's probability is the sum across its row. + let subjects = self.data().subjects(); + let flagged: Vec = (0..psi.nrows()) + .filter(|&i| { + let probability: f64 = (0..psi.ncols()).map(|j| psi[(i, j)]).sum(); + !probability.is_finite() || probability == 0.0 + }) + .collect(); + + if flagged.is_empty() { + return Ok(()); + } - // Get the index of each element in `w` that is NaN or infinite - let indices: Vec = w - .iter() - .enumerate() - .filter(|(_, x)| x.is_nan() || x.is_infinite()) - .map(|(i, _)| i) - .collect::>(); - - if !indices.is_empty() { - let subject: Vec<&Subject> = self.data().subjects(); - let zero_probability_subjects: Vec<&String> = - indices.iter().map(|&i| subject[i].id()).collect(); - - tracing::error!( - "{}/{} subjects have zero probability given the model", - indices.len(), - psi.nrows() - ); + tracing::error!( + "{}/{} subjects have zero probability given the model", + flagged.len(), + psi.nrows() + ); - // For each problematic subject - for index in &indices { - tracing::debug!("Subject with zero probability: {}", subject[*index].id()); - - let error_model = self.error_models().clone(); - - // Simulate all support points in parallel - let spp_results: Vec<_> = self - .theta() - .matrix() - .row_iter() - .enumerate() - .collect::>() - .into_par_iter() - .map(|(i, spp)| { - let support_point: Vec = spp.iter().copied().collect(); - let (pred, ll) = self - .equation() - .simulate_subject_dense( - subject[*index], - &support_point, - Some(&error_model), - ) - .unwrap(); //TODO: Handle error - (i, support_point, pred.get_predictions(), ll) - }) - .collect(); - - // Count problematic likelihoods for this subject - let mut nan_ll = 0; - let mut inf_pos_ll = 0; - let mut inf_neg_ll = 0; - let mut zero_ll = 0; - let mut valid_ll = 0; - - for (_, _, _, ll) in &spp_results { - match ll { - Some(ll_val) if ll_val.is_nan() => nan_ll += 1, - Some(ll_val) if ll_val.is_infinite() && ll_val.is_sign_positive() => { - inf_pos_ll += 1 - } - Some(ll_val) if ll_val.is_infinite() && ll_val.is_sign_negative() => { - inf_neg_ll += 1 - } - Some(ll_val) if *ll_val == 0.0 => zero_ll += 1, - Some(_) => valid_ll += 1, - None => nan_ll += 1, - } - } - - tracing::debug!( - "\tLikelihood analysis for subject {} ({} support points):", - subject[*index].id(), - spp_results.len() - ); - tracing::debug!( - "\tNaN likelihoods: {} ({:.1}%)", - nan_ll, - 100.0 * nan_ll as f64 / spp_results.len() as f64 - ); - tracing::debug!( - "\t+Inf likelihoods: {} ({:.1}%)", - inf_pos_ll, - 100.0 * inf_pos_ll as f64 / spp_results.len() as f64 - ); - tracing::debug!( - "\t-Inf likelihoods: {} ({:.1}%)", - inf_neg_ll, - 100.0 * inf_neg_ll as f64 / spp_results.len() as f64 - ); - tracing::debug!( - "\tZero likelihoods: {} ({:.1}%)", - zero_ll, - 100.0 * zero_ll as f64 / spp_results.len() as f64 - ); - tracing::debug!( - "\tValid likelihoods: {} ({:.1}%)", - valid_ll, - 100.0 * valid_ll as f64 / spp_results.len() as f64 - ); - - // Sort and show top 10 most likely support points - let mut sorted_results = spp_results; - sorted_results.sort_by(|a, b| { - b.3.unwrap_or(f64::NEG_INFINITY) - .partial_cmp(&a.3.unwrap_or(f64::NEG_INFINITY)) - .unwrap_or(std::cmp::Ordering::Equal) - }); - let take = 3; - - tracing::debug!("Top {} most likely support points:", take); - for (i, support_point, preds, ll) in sorted_results.iter().take(take) { - tracing::debug!("\tSupport point #{}: {:?}", i, support_point); - tracing::debug!("\t\tLog-likelihood: {:?}", ll); - - let times = preds.iter().map(|x| x.time()).collect::>(); - let observations = preds - .iter() - .map(|x| x.observation()) - .collect::>>(); - let predictions = preds.iter().map(|x| x.prediction()).collect::>(); - let outeqs = preds.iter().map(|x| x.outeq()).collect::>(); - let states = preds - .iter() - .map(|x| x.state().to_vec()) - .collect::>>(); - - tracing::debug!("\t\tTimes: {:?}", times); - tracing::debug!("\t\tObservations: {:?}", observations); - tracing::debug!("\t\tPredictions: {:?}", predictions); - tracing::debug!("\t\tOuteqs: {:?}", outeqs); - tracing::debug!("\t\tStates: {:?}", states); - } - tracing::debug!("====================="); - } + for &i in &flagged { + self.log_zero_probability_subject(subjects[i]); + } + + let ids: Vec<&String> = flagged.iter().map(|&i| subjects[i].id()).collect(); + Err(anyhow::anyhow!( + "The probability of {}/{} subjects is zero given the model. Affected subjects: {:?}", + flagged.len(), + psi.nrows(), + ids + )) + } - return Err(anyhow::anyhow!( - "The probability of {}/{} subjects is zero given the model. Affected subjects: {:?}", - indices.len(), - self.psi().matrix().nrows(), - zero_probability_subjects - )); + /// Log detailed likelihood diagnostics for a single subject whose + /// probability given the model is zero or non-finite. + fn log_zero_probability_subject(&self, subject: &Subject) { + tracing::debug!("Subject with zero probability: {}", subject.id()); + + let error_model = self.error_models().clone(); + + // Simulate every support point for this subject in parallel. + let mut results: Vec<_> = self + .theta() + .matrix() + .row_iter() + .enumerate() + .collect::>() + .into_par_iter() + .map(|(i, spp)| { + let support_point: Vec = spp.iter().copied().collect(); + let (pred, ll) = self + .equation() + .simulate_subject_dense(subject, &support_point, Some(&error_model)) + .unwrap(); //TODO: Handle error + (i, support_point, pred.get_predictions(), ll) + }) + .collect(); + + // Summarise the distribution of likelihood values. + let mut nan = 0; + let mut pos_inf = 0; + let mut neg_inf = 0; + let mut zero = 0; + let mut valid = 0; + for (_, _, _, ll) in &results { + match ll { + Some(v) if v.is_nan() => nan += 1, + Some(v) if v.is_infinite() && v.is_sign_positive() => pos_inf += 1, + Some(v) if v.is_infinite() => neg_inf += 1, + Some(v) if *v == 0.0 => zero += 1, + Some(_) => valid += 1, + None => nan += 1, + } } - Ok(()) + let total = results.len(); + let pct = |n: usize| 100.0 * n as f64 / total as f64; + tracing::debug!( + "\tLikelihood analysis for subject {} ({} support points):", + subject.id(), + total + ); + tracing::debug!("\tNaN likelihoods: {} ({:.1}%)", nan, pct(nan)); + tracing::debug!("\t+Inf likelihoods: {} ({:.1}%)", pos_inf, pct(pos_inf)); + tracing::debug!("\t-Inf likelihoods: {} ({:.1}%)", neg_inf, pct(neg_inf)); + tracing::debug!("\tZero likelihoods: {} ({:.1}%)", zero, pct(zero)); + tracing::debug!("\tValid likelihoods: {} ({:.1}%)", valid, pct(valid)); + + // Show the most likely support points to aid debugging. + results.sort_by(|a, b| { + b.3.unwrap_or(f64::NEG_INFINITY) + .partial_cmp(&a.3.unwrap_or(f64::NEG_INFINITY)) + .unwrap_or(std::cmp::Ordering::Equal) + }); + + const TAKE: usize = 3; + tracing::debug!("Top {} most likely support points:", TAKE); + for (i, support_point, preds, ll) in results.iter().take(TAKE) { + tracing::debug!("\tSupport point #{}: {:?}", i, support_point); + tracing::debug!("\t\tLog-likelihood: {:?}", ll); + tracing::debug!( + "\t\tTimes: {:?}", + preds.iter().map(|x| x.time()).collect::>() + ); + tracing::debug!( + "\t\tObservations: {:?}", + preds + .iter() + .map(|x| x.observation()) + .collect::>>() + ); + tracing::debug!( + "\t\tPredictions: {:?}", + preds.iter().map(|x| x.prediction()).collect::>() + ); + tracing::debug!( + "\t\tOuteqs: {:?}", + preds.iter().map(|x| x.outeq()).collect::>() + ); + tracing::debug!( + "\t\tStates: {:?}", + preds + .iter() + .map(|x| x.state().to_vec()) + .collect::>>() + ); + } + tracing::debug!("====================="); } fn error_models(&self) -> &pharmsol::prelude::data::AssayErrorModels; diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index b72648ef3..0117803de 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -315,7 +315,7 @@ impl NonParametricAlgorithm for NPAG { self.cycle == 1 && self.config.progress, )?; - if let Err(err) = self.validate_psi() { + if let Err(err) = self.check_zero_probability_subjects() { bail!(err); } @@ -381,7 +381,7 @@ impl NonParametricAlgorithm for NPAG { // Filter to keep only the support points (columns) that are in the `keep` vector self.psi.filter_column_indices(keep.as_slice()); - self.validate_psi()?; + self.check_zero_probability_subjects()?; (self.lambda, self.objf) = match burke(&self.psi) { Ok((lambda, objf)) => (lambda, objf), Err(err) => { diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 2272299df..3b4ccfc7d 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -9,11 +9,8 @@ use pharmsol::ParameterOptimizer; use anyhow::bail; use anyhow::Result; +use pharmsol::prelude::{data::Data, simulator::Equation}; use pharmsol::{prelude::AssayErrorModel, AssayErrorModels}; -use pharmsol::{ - prelude::{data::Data, simulator::Equation}, - Subject, -}; use ndarray::Array1; use rayon::prelude::{IntoParallelRefMutIterator, ParallelIterator}; @@ -99,48 +96,6 @@ impl NPOD { config, }) } - - fn validate_psi(&mut self) -> Result<()> { - let mut psi = self.psi().matrix().to_owned(); - // First coerce all NaN and infinite in psi to 0.0 - let mut has_bad_values = false; - for i in 0..psi.nrows() { - for j in 0..psi.ncols() { - let val = psi[(i, j)]; - if val.is_nan() || val.is_infinite() { - has_bad_values = true; - psi[(i, j)] = 0.0; - } - } - } - if has_bad_values { - tracing::warn!("Psi contains NaN or Inf values, coercing to 0.0"); - } - - // Calculate row sums and check for zero-probability subjects - let nrows = psi.nrows(); - let ncols = psi.ncols(); - let indices: Vec = (0..nrows) - .filter(|&i| { - let row_sum: f64 = (0..ncols).map(|j| psi[(i, j)]).sum(); - let w: f64 = 1.0 / row_sum; - w.is_nan() || w.is_infinite() - }) - .collect(); - - // If any elements in `w` are NaN or infinite, return the subject IDs for each index - if !indices.is_empty() { - let subject: Vec<&Subject> = self.data.subjects(); - let zero_probability_subjects: Vec<&String> = - indices.iter().map(|&i| subject[i].id()).collect(); - - return Err(anyhow::anyhow!( - "The probability of one or more subjects, given the model, is zero. The following subjects have zero probability: {:?}", zero_probability_subjects - )); - } - - Ok(()) - } } impl NonParametricAlgorithm for NPOD { @@ -281,7 +236,7 @@ impl NonParametricAlgorithm for NPOD { self.cycle == 1 && self.config.progress, )?; - if let Err(err) = self.validate_psi() { + if let Err(err) = self.check_zero_probability_subjects() { bail!(err); } From 1e5fe0d187f7c4432e837fc340447950cce0594d Mon Sep 17 00:00:00 2001 From: Markus Date: Sat, 13 Jun 2026 10:08:39 +0200 Subject: [PATCH 46/47] Refactor fit_with So that it takes a NonParametricAlgorithm, e.g. problem.fit_with(NonParametricAlgorithm::npag()) --- benches/bimodal_ke.rs | 16 +- examples/bimodal_ke/main.rs | 2 +- examples/bimodal_ke_backend_compare.rs | 2 +- examples/drusano/main.rs | 2 +- examples/iov/main.rs | 2 +- examples/meta/main.rs | 2 +- examples/neely/main.rs | 2 +- examples/new_iov/main.rs | 2 +- examples/theophylline/main.rs | 2 +- examples/two_eq_lag/main.rs | 2 +- examples/vanco_sde/main.rs | 2 +- src/algorithms/mod.rs | 2 +- src/algorithms/nonparametric/mod.rs | 240 ++++++++++++++++++++++- src/algorithms/nonparametric/npag.rs | 28 +-- src/algorithms/nonparametric/npmap.rs | 21 +- src/algorithms/nonparametric/npod.rs | 21 +- src/algorithms/parametric/mod.rs | 123 ++++++++++++ src/algorithms/parametric/saem_config.rs | 41 ++++ src/bestdose/posterior.rs | 2 +- src/estimation/mod.rs | 5 +- src/lib.rs | 6 +- src/results/mod.rs | 2 +- tests/onecomp.rs | 6 +- tests/results_summary_tests.rs | 2 +- 24 files changed, 446 insertions(+), 89 deletions(-) diff --git a/benches/bimodal_ke.rs b/benches/bimodal_ke.rs index 0c6f9da04..b6f12d869 100644 --- a/benches/bimodal_ke.rs +++ b/benches/bimodal_ke.rs @@ -79,11 +79,21 @@ where } fn benchmark_bimodal_ke_npag(c: &mut Criterion) { - benchmark_algorithm(c, "bimodal_ke_npag", setup_npag, NpagConfig::default()); + benchmark_algorithm( + c, + "bimodal_ke_npag", + setup_npag, + NonParametricAlgorithm::npag(), + ); } fn benchmark_bimodal_ke_npod(c: &mut Criterion) { - benchmark_algorithm(c, "bimodal_ke_npod", setup_npod, NpodConfig::default()); + benchmark_algorithm( + c, + "bimodal_ke_npod", + setup_npod, + NonParametricAlgorithm::npod(), + ); } fn benchmark_bimodal_ke_postprob(c: &mut Criterion) { @@ -91,7 +101,7 @@ fn benchmark_bimodal_ke_postprob(c: &mut Criterion) { c, "bimodal_ke_postprob", setup_postprob, - NpmapConfig::default(), + NonParametricAlgorithm::npmap(), ); } diff --git a/examples/bimodal_ke/main.rs b/examples/bimodal_ke/main.rs index 7525563f3..bc6fe7604 100644 --- a/examples/bimodal_ke/main.rs +++ b/examples/bimodal_ke/main.rs @@ -36,7 +36,7 @@ fn main() -> Result<()> { let problem = EstimationProblem::nonparametric(eq, data, prior, error_models)?; - let _result = problem.fit_with(NpagConfig::default())?; + let _result = problem.fit_with(NonParametricAlgorithm::npag())?; Ok(()) } diff --git a/examples/bimodal_ke_backend_compare.rs b/examples/bimodal_ke_backend_compare.rs index d124897d8..5aa08b8bc 100644 --- a/examples/bimodal_ke_backend_compare.rs +++ b/examples/bimodal_ke_backend_compare.rs @@ -211,7 +211,7 @@ fn run_case Result<()> { AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 1.0), )?; EstimationProblem::nonparametric(eq, data, prior, error_models)? - .fit_with(NpagConfig::default())?; + .fit_with(NonParametricAlgorithm::npag())?; Ok(()) } diff --git a/examples/iov/main.rs b/examples/iov/main.rs index 78cc56e79..7e0f5ba4c 100644 --- a/examples/iov/main.rs +++ b/examples/iov/main.rs @@ -34,7 +34,7 @@ fn main() -> Result<()> { AssayErrorModel::additive(ErrorPoly::new(0.0, 0.0, 0.0, 0.0), 0.0000757575757576), )?; EstimationProblem::nonparametric(sde, data, prior, error_models)? - .fit_with(NpagConfig::default()) + .fit_with(NonParametricAlgorithm::npag()) .unwrap(); Ok(()) diff --git a/examples/meta/main.rs b/examples/meta/main.rs index 4bce251fa..ea89bdfd4 100644 --- a/examples/meta/main.rs +++ b/examples/meta/main.rs @@ -51,7 +51,7 @@ fn main() -> Result<()> { AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), )?; EstimationProblem::nonparametric(eq, data, prior, error_models)? - .fit_with(NpodConfig::default())?; + .fit_with(NonParametricAlgorithm::npod())?; Ok(()) } diff --git a/examples/neely/main.rs b/examples/neely/main.rs index 09b667d1b..922547721 100644 --- a/examples/neely/main.rs +++ b/examples/neely/main.rs @@ -73,7 +73,7 @@ fn main() -> Result<()> { AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.1, 0.0, 0.0), 5.0), )?; EstimationProblem::nonparametric(eq, data, prior, error_models)? - .fit_with(NpagConfig::default())?; + .fit_with(NonParametricAlgorithm::npag())?; Ok(()) } diff --git a/examples/new_iov/main.rs b/examples/new_iov/main.rs index 958b1b88c..9d1ea6eb6 100644 --- a/examples/new_iov/main.rs +++ b/examples/new_iov/main.rs @@ -35,7 +35,7 @@ fn main() -> Result<()> { AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), )?; EstimationProblem::nonparametric(sde, data, prior, error_models)? - .fit_with(NpagConfig::default())?; + .fit_with(NonParametricAlgorithm::npag())?; Ok(()) } diff --git a/examples/theophylline/main.rs b/examples/theophylline/main.rs index 2819d61a5..1d48aaa97 100644 --- a/examples/theophylline/main.rs +++ b/examples/theophylline/main.rs @@ -26,7 +26,7 @@ fn main() -> Result<()> { AssayErrorModel::proportional(ErrorPoly::new(0.1, 0.1, 0.0, 0.0), 2.0), )?; EstimationProblem::nonparametric(analytical, data, prior, error_models)? - .fit_with(NpagConfig::default())?; + .fit_with(NonParametricAlgorithm::npag())?; Ok(()) } diff --git a/examples/two_eq_lag/main.rs b/examples/two_eq_lag/main.rs index f7fc6e27e..c6185517d 100644 --- a/examples/two_eq_lag/main.rs +++ b/examples/two_eq_lag/main.rs @@ -33,7 +33,7 @@ fn main() -> Result<()> { AssayErrorModel::additive(ErrorPoly::new(-0.00119, 0.44379, -0.45864, 0.16537), 0.0), )?; EstimationProblem::nonparametric(eq, data, prior, error_models)? - .fit_with(NpagConfig::default())?; + .fit_with(NonParametricAlgorithm::npag())?; Ok(()) } diff --git a/examples/vanco_sde/main.rs b/examples/vanco_sde/main.rs index bce50d578..36e77449a 100644 --- a/examples/vanco_sde/main.rs +++ b/examples/vanco_sde/main.rs @@ -61,7 +61,7 @@ fn main() -> Result<()> { AssayErrorModel::additive(ErrorPoly::new(0.00119, 0.20, 0.0, 0.0), 0.0), )?; EstimationProblem::nonparametric(sde, data, prior, error_models)? - .fit_with(NpagConfig::default())?; + .fit_with(NonParametricAlgorithm::npag())?; Ok(()) } diff --git a/src/algorithms/mod.rs b/src/algorithms/mod.rs index b4141116c..2c7c6c9e0 100644 --- a/src/algorithms/mod.rs +++ b/src/algorithms/mod.rs @@ -43,7 +43,7 @@ impl EstimationProblem { } } -pub trait NonParametricAlgorithm: Sync + Send + 'static { +pub trait NonParametricRunner: Sync + Send + 'static { /// Identify subjects whose total probability given the model is zero or /// non-finite. /// diff --git a/src/algorithms/nonparametric/mod.rs b/src/algorithms/nonparametric/mod.rs index 51afb67f6..4c6c45b27 100644 --- a/src/algorithms/nonparametric/mod.rs +++ b/src/algorithms/nonparametric/mod.rs @@ -10,11 +10,13 @@ //! - [`NPOD`](npod): Non-Parametric Optimal Design //! - [`POSTPROB`](postprob): Posterior probability reweighting //! -//! # Algorithm Trait +//! # Algorithm Selection //! -//! All non-parametric algorithms implement the [`NPAlgorithm`] trait (aliased from `Algorithms`) -//! which defines the common interface for initialization, estimation, condensation, expansion, -//! and convergence evaluation. +//! Use the [`NonParametricAlgorithm`] enum to select and configure an algorithm. Each +//! variant wraps its algorithm-specific configuration struct (e.g. [`NpagConfig`]). The +//! internal execution state used while fitting implements the [`NonParametricRunner`] +//! trait, which defines the common interface for initialization, estimation, condensation, +//! expansion, and convergence evaluation. // Algorithm implementations pub mod npag; @@ -30,3 +32,233 @@ pub use npod::NPOD; pub use npag::NpagConfig; pub use npmap::NpmapConfig; pub use npod::NpodConfig; + +use crate::algorithms::{Algorithm, NonParametricRunner}; +use crate::estimation::nonparametric::NonParametricResult; +use crate::estimation::{EstimationProblem, NonParametric}; +use anyhow::Result; +use pharmsol::prelude::simulator::Equation; + +/// The non-parametric algorithms supported by PMcore. +/// +/// Each variant wraps the configuration for one algorithm. Construct a variant with its +/// default configuration using [`npag`](Self::npag), [`npod`](Self::npod), or +/// [`npmap`](Self::npmap), then refine it with the chainable setters: +/// +/// ```no_run +/// use pmcore::prelude::*; +/// +/// // Default NPAG configuration. +/// let algorithm = NonParametricAlgorithm::npag(); +/// +/// // NPAG with a tighter convergence criterion and a cycle cap. +/// let algorithm = NonParametricAlgorithm::npag().eps(0.1).max_cycles(500); +/// ``` +/// +/// The setters are passthroughs to the wrapped configuration. A setter that does not apply +/// to the active variant (for example calling [`eps`](Self::eps) on an [`Npod`](Self::Npod) +/// value) is a no-op. +#[derive(Debug, Clone)] +pub enum NonParametricAlgorithm { + /// Non-Parametric Adaptive Grid. + Npag(NpagConfig), + /// Non-Parametric Optimal Design. + Npod(NpodConfig), + /// Non-parametric maximum a posteriori (posterior probability reweighting). + Npmap(NpmapConfig), +} + +impl Default for NonParametricAlgorithm { + fn default() -> Self { + Self::npag() + } +} + +impl From for NonParametricAlgorithm { + fn from(config: NpagConfig) -> Self { + Self::Npag(config) + } +} + +impl From for NonParametricAlgorithm { + fn from(config: NpodConfig) -> Self { + Self::Npod(config) + } +} + +impl From for NonParametricAlgorithm { + fn from(config: NpmapConfig) -> Self { + Self::Npmap(config) + } +} + +impl NonParametricAlgorithm { + /// The Non-Parametric Adaptive Grid (NPAG) algorithm with its default configuration. + pub fn npag() -> Self { + Self::Npag(NpagConfig::default()) + } + + /// The Non-Parametric Optimal Design (NPOD) algorithm with its default configuration. + pub fn npod() -> Self { + Self::Npod(NpodConfig::default()) + } + + /// The non-parametric maximum a posteriori (NPMAP) algorithm with its default + /// configuration. + pub fn npmap() -> Self { + Self::Npmap(NpmapConfig::default()) + } + + /// Maximum number of cycles to run. + /// + /// Applies to the [`Npag`](Self::Npag) and [`Npod`](Self::Npod) variants. + pub fn max_cycles(mut self, cycles: usize) -> Self { + match &mut self { + Self::Npag(config) => config.max_cycles = cycles, + Self::Npod(config) => config.max_cycles = cycles, + Self::Npmap(_) => {} + } + self + } + + /// Whether to print progress information during fitting. + /// + /// Applies to the [`Npag`](Self::Npag) and [`Npod`](Self::Npod) variants. + pub fn progress(mut self, progress: bool) -> Self { + match &mut self { + Self::Npag(config) => config.progress = progress, + Self::Npod(config) => config.progress = progress, + Self::Npmap(_) => {} + } + self + } + + /// Initial convergence criterion (NPAG only). + pub fn eps(mut self, eps: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.eps = eps; + } + self + } + + /// Minimum convergence criterion (NPAG only). + pub fn min_eps(mut self, min_eps: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.min_eps = min_eps; + } + self + } + + /// Objective-function convergence tolerance (NPAG only). + pub fn objective_tolerance(mut self, tolerance: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.objective_tolerance = tolerance; + } + self + } + + /// P(Y|L) convergence tolerance (NPAG only). + pub fn pyl_tolerance(mut self, tolerance: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.pyl_tolerance = tolerance; + } + self + } + + /// Support-point pruning threshold (NPAG only). + pub fn prune_threshold(mut self, threshold: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.prune_threshold = threshold; + } + self + } + + /// QR decomposition tolerance (NPAG only). + pub fn qr_tolerance(mut self, tolerance: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.qr_tolerance = tolerance; + } + self + } + + /// Adaptive-grid tolerance (NPAG only). + pub fn grid_tolerance(mut self, tolerance: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.grid_tolerance = tolerance; + } + self + } + + /// Initial error-model step size (NPAG only). + pub fn error_step(mut self, step: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.error_step = step; + } + self + } + + /// Minimum error-model step size (NPAG only). + pub fn min_error_step(mut self, step: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.min_error_step = step; + } + self + } + + /// Error-model step growth factor (NPAG only). + pub fn error_step_growth(mut self, factor: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.error_step_growth = factor; + } + self + } + + /// Error-model step shrink factor (NPAG only). + pub fn error_step_shrink(mut self, factor: f64) -> Self { + if let Self::Npag(config) = &mut self { + config.error_step_shrink = factor; + } + self + } +} + +impl Algorithm for NonParametricAlgorithm { + type Output = NonParametricResult; + + fn fit(self, problem: EstimationProblem) -> Result { + match self { + Self::Npag(config) => { + // `problem.prior` is the prior `Theta` (which also carries the parameter + // space) and `problem.error_models` is strictly `AssayErrorModels`. + let mut runner = NPAG::from_parts( + problem.model.equation, + problem.data, + problem.error_models, + problem.prior, + config, + )?; + NonParametricRunner::fit(&mut runner) + } + Self::Npod(config) => { + let mut runner = NPOD::from_parts( + problem.model.equation, + problem.data, + problem.error_models, + problem.prior, + config, + )?; + NonParametricRunner::fit(&mut runner) + } + Self::Npmap(config) => { + let mut runner = NPMAP::from_parts( + problem.model.equation, + problem.data, + problem.error_models, + problem.prior, + config, + )?; + NonParametricRunner::fit(&mut runner) + } + } + } +} diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 0117803de..5459e12bc 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -1,8 +1,7 @@ -use crate::algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}; +use crate::algorithms::{NonParametricRunner, Status, StopReason}; use crate::estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }; -use crate::estimation::{EstimationProblem, NonParametric}; pub(crate) use crate::estimation::nonparametric::ipm::burke; pub(crate) use crate::estimation::nonparametric::qr; @@ -147,7 +146,7 @@ impl NPAG { /// /// The `parameter_space` is used solely to derive the finite bounds for the /// adaptive grid. Initial support points can be supplied separately via - /// [`NonParametricAlgorithm::set_theta`]. + /// [`NonParametricRunner::set_theta`]. pub(crate) fn from_parts( equation: E, data: Data, @@ -183,7 +182,7 @@ impl NPAG { } } -impl NonParametricAlgorithm for NPAG { +impl NonParametricRunner for NPAG { fn equation(&self) -> &E { &self.equation } @@ -502,25 +501,6 @@ impl NonParametricAlgorithm for NPAG { } } -// Tell the compiler that NpagConfig is a Non-Parametric Algorithm. -impl Algorithm for NpagConfig { - type Output = NonParametricResult; - - fn fit(self, problem: EstimationProblem) -> Result { - // `problem.prior` is the prior `Theta` (which also carries the parameter - // space) and `problem.error_models` is strictly `AssayErrorModels`. - let mut runner = NPAG::from_parts( - problem.model.equation, - problem.data, - problem.error_models, - problem.prior, - self, - )?; - - NonParametricAlgorithm::fit(&mut runner) - } -} - #[cfg(test)] mod tests { use crate::prelude::*; @@ -580,7 +560,7 @@ mod tests { EstimationProblem::nonparametric(simple_equation(), simple_data(), prior, error_models) .expect("Failed to build problem"); - let result = problem.fit_with(NpagConfig::default()); + let result = problem.fit_with(NonParametricAlgorithm::npag()); assert!( result.is_ok(), diff --git a/src/algorithms/nonparametric/npmap.rs b/src/algorithms/nonparametric/npmap.rs index c15edce58..92b122f64 100644 --- a/src/algorithms/nonparametric/npmap.rs +++ b/src/algorithms/nonparametric/npmap.rs @@ -1,9 +1,8 @@ use crate::{ - algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}, + algorithms::{NonParametricRunner, Status, StopReason}, estimation::nonparametric::{ calculate_psi, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }, - estimation::{EstimationProblem, NonParametric}, }; use anyhow::{Context, Result}; @@ -67,7 +66,7 @@ impl NPMAP { } } -impl NonParametricAlgorithm for NPMAP { +impl NonParametricRunner for NPMAP { fn into_result(&self) -> Result> { NonParametricResult::new( self.equation.clone(), @@ -181,19 +180,3 @@ impl NonParametricAlgorithm for NPMAP { self.into_result() } } - -impl Algorithm for NpmapConfig { - type Output = NonParametricResult; - - fn fit(self, problem: EstimationProblem) -> Result { - let mut runner = NPMAP::from_parts( - problem.model.equation, - problem.data, - problem.error_models, - problem.prior, - self, - )?; - - NonParametricAlgorithm::fit(&mut runner) - } -} diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index 3b4ccfc7d..ca628ce7b 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -1,9 +1,8 @@ use crate::{ - algorithms::{Algorithm, NonParametricAlgorithm, Status, StopReason}, + algorithms::{NonParametricRunner, Status, StopReason}, estimation::nonparametric::{ calculate_psi, ipm::burke, qr, CycleLog, NPCycle, NonParametricResult, Psi, Theta, Weights, }, - estimation::{EstimationProblem, NonParametric}, }; use pharmsol::ParameterOptimizer; @@ -98,7 +97,7 @@ impl NPOD { } } -impl NonParametricAlgorithm for NPOD { +impl NonParametricRunner for NPOD { fn into_result(&self) -> Result> { NonParametricResult::new( self.equation.clone(), @@ -399,19 +398,3 @@ impl NonParametricAlgorithm for NPOD { Ok(()) } } - -impl Algorithm for NpodConfig { - type Output = NonParametricResult; - - fn fit(self, problem: EstimationProblem) -> Result { - let mut runner = NPOD::from_parts( - problem.model.equation, - problem.data, - problem.error_models, - problem.prior, - self, - )?; - - NonParametricAlgorithm::fit(&mut runner) - } -} diff --git a/src/algorithms/parametric/mod.rs b/src/algorithms/parametric/mod.rs index d8dbdf171..55a6dc590 100644 --- a/src/algorithms/parametric/mod.rs +++ b/src/algorithms/parametric/mod.rs @@ -1 +1,124 @@ +//! Parametric algorithm implementations. +//! +//! Parametric algorithms estimate the population distribution as a parametric model (for +//! example a multivariate normal) whose parameters are fitted to the data. +//! +//! # Algorithm Selection +//! +//! Use the [`ParametricAlgorithm`] enum to select and configure an algorithm. Each variant +//! wraps its algorithm-specific configuration struct (e.g. [`SaemConfig`]). +//! +//! Note: the parametric fitting machinery is not yet implemented. Constructing a problem and +//! calling [`fit_with`](crate::estimation::EstimationProblem::fit_with) with a +//! [`ParametricAlgorithm`] type-checks today, but running it will panic until the SAEM solver +//! is implemented. + pub mod saem_config; + +pub use saem_config::SaemConfig; + +use crate::algorithms::Algorithm; +use crate::estimation::{EstimationProblem, Parametric}; +use crate::results::ParametricResult; +use anyhow::Result; +use pharmsol::prelude::simulator::Equation; + +/// The parametric algorithms supported by PMcore. +/// +/// Each variant wraps the configuration for one algorithm. Construct a variant with its +/// default configuration using [`saem`](Self::saem), then refine it with the chainable +/// setters: +/// +/// ```no_run +/// use pmcore::prelude::*; +/// +/// // Default SAEM configuration. +/// let algorithm = ParametricAlgorithm::saem(); +/// +/// // SAEM with a custom iteration schedule and seed. +/// let algorithm = ParametricAlgorithm::saem() +/// .k1_iterations(500) +/// .k2_iterations(200) +/// .seed(42); +/// ``` +/// +/// The setters are passthroughs to the wrapped configuration. +#[derive(Debug, Clone)] +pub enum ParametricAlgorithm { + /// Stochastic Approximation Expectation-Maximization. + Saem(SaemConfig), +} + +impl Default for ParametricAlgorithm { + fn default() -> Self { + Self::saem() + } +} + +impl From for ParametricAlgorithm { + fn from(config: SaemConfig) -> Self { + Self::Saem(config) + } +} + +impl ParametricAlgorithm { + /// The Stochastic Approximation Expectation-Maximization (SAEM) algorithm with its + /// default configuration. + pub fn saem() -> Self { + Self::Saem(SaemConfig::default()) + } + + /// Number of exploration-phase (K1) iterations (SAEM only). + pub fn k1_iterations(mut self, iterations: usize) -> Self { + let Self::Saem(config) = &mut self; + config.k1_iterations = iterations; + self + } + + /// Number of smoothing-phase (K2) iterations (SAEM only). + pub fn k2_iterations(mut self, iterations: usize) -> Self { + let Self::Saem(config) = &mut self; + config.k2_iterations = iterations; + self + } + + /// Number of burn-in iterations (SAEM only). + pub fn burn_in(mut self, burn_in: usize) -> Self { + let Self::Saem(config) = &mut self; + config.burn_in = burn_in; + self + } + + /// Number of MCMC chains (SAEM only). + pub fn n_chains(mut self, n_chains: usize) -> Self { + let Self::Saem(config) = &mut self; + config.n_chains = n_chains; + self + } + + /// MCMC step size (SAEM only). + pub fn mcmc_step_size(mut self, step_size: f64) -> Self { + let Self::Saem(config) = &mut self; + config.mcmc_step_size = step_size; + self + } + + /// Random-number-generator seed (SAEM only). + pub fn seed(mut self, seed: u64) -> Self { + let Self::Saem(config) = &mut self; + config.seed = seed; + self + } +} + +impl Algorithm for ParametricAlgorithm { + type Output = ParametricResult; + + fn fit(self, _problem: EstimationProblem) -> Result { + match self { + Self::Saem(_config) => { + unimplemented!("SAEM fitting is not yet implemented") + } + } + } +} diff --git a/src/algorithms/parametric/saem_config.rs b/src/algorithms/parametric/saem_config.rs index 7f73f373c..289c41750 100644 --- a/src/algorithms/parametric/saem_config.rs +++ b/src/algorithms/parametric/saem_config.rs @@ -61,6 +61,47 @@ impl Default for SaemConfig { } impl SaemConfig { + /// Creates a new `SaemConfig` with default values. + pub fn new() -> Self { + Self::default() + } + + /// Number of exploration-phase (K1) iterations. + pub fn k1_iterations(mut self, iterations: usize) -> Self { + self.k1_iterations = iterations; + self + } + + /// Number of smoothing-phase (K2) iterations. + pub fn k2_iterations(mut self, iterations: usize) -> Self { + self.k2_iterations = iterations; + self + } + + /// Number of burn-in iterations. + pub fn burn_in(mut self, burn_in: usize) -> Self { + self.burn_in = burn_in; + self + } + + /// Number of MCMC chains. + pub fn n_chains(mut self, n_chains: usize) -> Self { + self.n_chains = n_chains; + self + } + + /// MCMC step size. + pub fn mcmc_step_size(mut self, step_size: f64) -> Self { + self.mcmc_step_size = step_size; + self + } + + /// Random-number-generator seed. + pub fn seed(mut self, seed: u64) -> Self { + self.seed = seed; + self + } + pub fn total_iterations(&self) -> usize { self.k1_iterations + self.k2_iterations } diff --git a/src/bestdose/posterior.rs b/src/bestdose/posterior.rs index 57e692c3e..3c7d30a7f 100644 --- a/src/bestdose/posterior.rs +++ b/src/bestdose/posterior.rs @@ -55,7 +55,7 @@ use faer::Mat; use crate::algorithms::nonparametric::npag::burke; use crate::algorithms::nonparametric::npag::NPAG; -use crate::algorithms::NonParametricAlgorithm; +use crate::algorithms::NonParametricRunner; use crate::algorithms::Status; use crate::bestdose::types::BestDoseConfig; diff --git a/src/estimation/mod.rs b/src/estimation/mod.rs index 3f9c57002..2bf9f0104 100644 --- a/src/estimation/mod.rs +++ b/src/estimation/mod.rs @@ -3,7 +3,10 @@ pub mod nonparametric; pub mod problem; pub mod progress; -pub use crate::algorithms::nonparametric::{NpagConfig, NpmapConfig, NpodConfig}; +pub use crate::algorithms::nonparametric::{ + NonParametricAlgorithm, NpagConfig, NpmapConfig, NpodConfig, +}; +pub use crate::algorithms::parametric::{ParametricAlgorithm, SaemConfig}; pub use error_models::ErrorModels; pub use problem::{ EstimationProblem, Framework, NonParametric, Parametric, ParametricBuilder, diff --git a/src/lib.rs b/src/lib.rs index efc4d0d7d..1ef54e274 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -56,9 +56,11 @@ pub mod prelude { pub use crate::algorithms::Algorithm; pub use crate::estimation::NonParametric; + pub use crate::estimation::Parametric; pub use crate::estimation::{ - ErrorModels, EstimationProblem, FitProgress, NonparametricCycleProgress, NpagConfig, - NpmapConfig, NpodConfig, + ErrorModels, EstimationProblem, FitProgress, NonParametricAlgorithm, + NonparametricCycleProgress, NpagConfig, NpmapConfig, NpodConfig, ParametricAlgorithm, + SaemConfig, }; pub use crate::model::parameter_space::{ diff --git a/src/results/mod.rs b/src/results/mod.rs index 2020d341f..5a0bed71e 100644 --- a/src/results/mod.rs +++ b/src/results/mod.rs @@ -2,6 +2,6 @@ mod fit_result; mod summary; -pub use fit_result::FitResult; +pub use fit_result::{FitResult, ParametricResult}; pub use summary::{FitSummary, IndividualSummary, ParameterSummary, PopulationSummary}; diff --git a/tests/onecomp.rs b/tests/onecomp.rs index c5e3463cc..85c6a27be 100644 --- a/tests/onecomp.rs +++ b/tests/onecomp.rs @@ -62,7 +62,7 @@ fn test_one_compartment_npag() -> Result<()> { AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), )?; let result = EstimationProblem::nonparametric(eq, data, prior, error_models)? - .fit_with(NpagConfig::default())?; + .fit_with(NonParametricAlgorithm::npag())?; // Check the results assert_eq!(result.cycles(), 31); @@ -128,7 +128,7 @@ fn test_one_compartment_npod() -> Result<()> { AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), )?; let result = EstimationProblem::nonparametric(eq, data, prior, error_models)? - .fit_with(NpodConfig::default())?; + .fit_with(NonParametricAlgorithm::npod())?; // Check the results assert_eq!(result.cycles(), 11); @@ -192,7 +192,7 @@ fn test_one_compartment_postprob() -> Result<()> { AssayErrorModel::additive(ErrorPoly::new(0.0, 0.10, 0.0, 0.0), 2.0), )?; let result = EstimationProblem::nonparametric(eq, data, theta.clone(), error_models)? - .fit_with(NpmapConfig::default())?; + .fit_with(NonParametricAlgorithm::npmap())?; // Check the results assert_eq!(result.cycles(), 0); diff --git a/tests/results_summary_tests.rs b/tests/results_summary_tests.rs index 516cbd758..6edcc8a89 100644 --- a/tests/results_summary_tests.rs +++ b/tests/results_summary_tests.rs @@ -46,7 +46,7 @@ fn test_nonparametric_fit_result_summary_surface() -> Result<()> { let prior = Theta::sobol_default(¶meters)?; let error_models = AssayErrorModels::new().add("0", assay_error)?; let result = EstimationProblem::nonparametric(simple_equation(), simple_data(), prior, error_models)? - .fit_with(NpagConfig::default())?; + .fit_with(NonParametricAlgorithm::npag())?; let summary = result.summary(); From cafeff5a6d3f2498383f331446a103c5b454783d Mon Sep 17 00:00:00 2001 From: Markus Date: Sat, 13 Jun 2026 10:15:34 +0200 Subject: [PATCH 47/47] Remove possibility for no-ops --- src/algorithms/nonparametric/mod.rs | 160 +++++++-------------------- src/algorithms/nonparametric/npag.rs | 10 ++ src/algorithms/nonparametric/npod.rs | 5 + src/algorithms/parametric/mod.rs | 70 ++++-------- 4 files changed, 79 insertions(+), 166 deletions(-) diff --git a/src/algorithms/nonparametric/mod.rs b/src/algorithms/nonparametric/mod.rs index 4c6c45b27..8e8eb809c 100644 --- a/src/algorithms/nonparametric/mod.rs +++ b/src/algorithms/nonparametric/mod.rs @@ -41,23 +41,30 @@ use pharmsol::prelude::simulator::Equation; /// The non-parametric algorithms supported by PMcore. /// -/// Each variant wraps the configuration for one algorithm. Construct a variant with its -/// default configuration using [`npag`](Self::npag), [`npod`](Self::npod), or -/// [`npmap`](Self::npmap), then refine it with the chainable setters: +/// Use the constructors to select an algorithm with its default configuration: /// /// ```no_run /// use pmcore::prelude::*; /// /// // Default NPAG configuration. /// let algorithm = NonParametricAlgorithm::npag(); +/// ``` +/// +/// To customize an algorithm, build its configuration struct (which exposes only the +/// setters valid for that algorithm) and pass it directly to +/// [`fit_with`](crate::estimation::EstimationProblem::fit_with): +/// +/// ```no_run +/// use pmcore::prelude::*; /// /// // NPAG with a tighter convergence criterion and a cycle cap. -/// let algorithm = NonParametricAlgorithm::npag().eps(0.1).max_cycles(500); +/// let config = NpagConfig::new().eps(0.1).max_cycles(500); +/// // `problem.fit_with(config)` accepts the config directly. /// ``` /// -/// The setters are passthroughs to the wrapped configuration. A setter that does not apply -/// to the active variant (for example calling [`eps`](Self::eps) on an [`Npod`](Self::Npod) -/// value) is a no-op. +/// Each configuration type ([`NpagConfig`], [`NpodConfig`], [`NpmapConfig`]) implements +/// [`Algorithm`] by delegating to the matching enum variant, so configs can be passed to +/// `fit_with` without converting them first. #[derive(Debug, Clone)] pub enum NonParametricAlgorithm { /// Non-Parametric Adaptive Grid. @@ -108,118 +115,6 @@ impl NonParametricAlgorithm { pub fn npmap() -> Self { Self::Npmap(NpmapConfig::default()) } - - /// Maximum number of cycles to run. - /// - /// Applies to the [`Npag`](Self::Npag) and [`Npod`](Self::Npod) variants. - pub fn max_cycles(mut self, cycles: usize) -> Self { - match &mut self { - Self::Npag(config) => config.max_cycles = cycles, - Self::Npod(config) => config.max_cycles = cycles, - Self::Npmap(_) => {} - } - self - } - - /// Whether to print progress information during fitting. - /// - /// Applies to the [`Npag`](Self::Npag) and [`Npod`](Self::Npod) variants. - pub fn progress(mut self, progress: bool) -> Self { - match &mut self { - Self::Npag(config) => config.progress = progress, - Self::Npod(config) => config.progress = progress, - Self::Npmap(_) => {} - } - self - } - - /// Initial convergence criterion (NPAG only). - pub fn eps(mut self, eps: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.eps = eps; - } - self - } - - /// Minimum convergence criterion (NPAG only). - pub fn min_eps(mut self, min_eps: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.min_eps = min_eps; - } - self - } - - /// Objective-function convergence tolerance (NPAG only). - pub fn objective_tolerance(mut self, tolerance: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.objective_tolerance = tolerance; - } - self - } - - /// P(Y|L) convergence tolerance (NPAG only). - pub fn pyl_tolerance(mut self, tolerance: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.pyl_tolerance = tolerance; - } - self - } - - /// Support-point pruning threshold (NPAG only). - pub fn prune_threshold(mut self, threshold: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.prune_threshold = threshold; - } - self - } - - /// QR decomposition tolerance (NPAG only). - pub fn qr_tolerance(mut self, tolerance: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.qr_tolerance = tolerance; - } - self - } - - /// Adaptive-grid tolerance (NPAG only). - pub fn grid_tolerance(mut self, tolerance: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.grid_tolerance = tolerance; - } - self - } - - /// Initial error-model step size (NPAG only). - pub fn error_step(mut self, step: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.error_step = step; - } - self - } - - /// Minimum error-model step size (NPAG only). - pub fn min_error_step(mut self, step: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.min_error_step = step; - } - self - } - - /// Error-model step growth factor (NPAG only). - pub fn error_step_growth(mut self, factor: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.error_step_growth = factor; - } - self - } - - /// Error-model step shrink factor (NPAG only). - pub fn error_step_shrink(mut self, factor: f64) -> Self { - if let Self::Npag(config) = &mut self { - config.error_step_shrink = factor; - } - self - } } impl Algorithm for NonParametricAlgorithm { @@ -262,3 +157,30 @@ impl Algorithm for NonParametric } } } + +// Each configuration struct delegates to its matching `NonParametricAlgorithm` variant so it +// can be passed directly to `fit_with`. This keeps the variant-specific setters on the config +// types (compile-time checked) while the enum remains the single source of fitting logic. +impl Algorithm for NpagConfig { + type Output = NonParametricResult; + + fn fit(self, problem: EstimationProblem) -> Result { + NonParametricAlgorithm::from(self).fit(problem) + } +} + +impl Algorithm for NpodConfig { + type Output = NonParametricResult; + + fn fit(self, problem: EstimationProblem) -> Result { + NonParametricAlgorithm::from(self).fit(problem) + } +} + +impl Algorithm for NpmapConfig { + type Output = NonParametricResult; + + fn fit(self, problem: EstimationProblem) -> Result { + NonParametricAlgorithm::from(self).fit(problem) + } +} diff --git a/src/algorithms/nonparametric/npag.rs b/src/algorithms/nonparametric/npag.rs index 5459e12bc..efe0caf0e 100644 --- a/src/algorithms/nonparametric/npag.rs +++ b/src/algorithms/nonparametric/npag.rs @@ -116,6 +116,16 @@ impl NpagConfig { self.error_step_shrink = factor; self } + + pub fn max_cycles(mut self, cycles: usize) -> Self { + self.max_cycles = cycles; + self + } + + pub fn progress(mut self, progress: bool) -> Self { + self.progress = progress; + self + } } #[derive(Debug)] diff --git a/src/algorithms/nonparametric/npod.rs b/src/algorithms/nonparametric/npod.rs index ca628ce7b..634c673f8 100644 --- a/src/algorithms/nonparametric/npod.rs +++ b/src/algorithms/nonparametric/npod.rs @@ -36,6 +36,11 @@ impl NpodConfig { self.max_cycles = cycles; self } + + pub fn progress(mut self, progress: bool) -> Self { + self.progress = progress; + self + } } impl Default for NpodConfig { diff --git a/src/algorithms/parametric/mod.rs b/src/algorithms/parametric/mod.rs index 55a6dc590..9951345f1 100644 --- a/src/algorithms/parametric/mod.rs +++ b/src/algorithms/parametric/mod.rs @@ -25,24 +25,32 @@ use pharmsol::prelude::simulator::Equation; /// The parametric algorithms supported by PMcore. /// -/// Each variant wraps the configuration for one algorithm. Construct a variant with its -/// default configuration using [`saem`](Self::saem), then refine it with the chainable -/// setters: +/// Use the constructors to select an algorithm with its default configuration: /// /// ```no_run /// use pmcore::prelude::*; /// /// // Default SAEM configuration. /// let algorithm = ParametricAlgorithm::saem(); +/// ``` +/// +/// To customize an algorithm, build its configuration struct (which exposes only the +/// setters valid for that algorithm) and pass it directly to +/// [`fit_with`](crate::estimation::EstimationProblem::fit_with): +/// +/// ```no_run +/// use pmcore::prelude::*; /// /// // SAEM with a custom iteration schedule and seed. -/// let algorithm = ParametricAlgorithm::saem() +/// let config = SaemConfig::new() /// .k1_iterations(500) /// .k2_iterations(200) /// .seed(42); +/// // `problem.fit_with(config)` accepts the config directly. /// ``` /// -/// The setters are passthroughs to the wrapped configuration. +/// [`SaemConfig`] implements [`Algorithm`] by delegating to the matching enum variant, so +/// configs can be passed to `fit_with` without converting them first. #[derive(Debug, Clone)] pub enum ParametricAlgorithm { /// Stochastic Approximation Expectation-Maximization. @@ -67,48 +75,6 @@ impl ParametricAlgorithm { pub fn saem() -> Self { Self::Saem(SaemConfig::default()) } - - /// Number of exploration-phase (K1) iterations (SAEM only). - pub fn k1_iterations(mut self, iterations: usize) -> Self { - let Self::Saem(config) = &mut self; - config.k1_iterations = iterations; - self - } - - /// Number of smoothing-phase (K2) iterations (SAEM only). - pub fn k2_iterations(mut self, iterations: usize) -> Self { - let Self::Saem(config) = &mut self; - config.k2_iterations = iterations; - self - } - - /// Number of burn-in iterations (SAEM only). - pub fn burn_in(mut self, burn_in: usize) -> Self { - let Self::Saem(config) = &mut self; - config.burn_in = burn_in; - self - } - - /// Number of MCMC chains (SAEM only). - pub fn n_chains(mut self, n_chains: usize) -> Self { - let Self::Saem(config) = &mut self; - config.n_chains = n_chains; - self - } - - /// MCMC step size (SAEM only). - pub fn mcmc_step_size(mut self, step_size: f64) -> Self { - let Self::Saem(config) = &mut self; - config.mcmc_step_size = step_size; - self - } - - /// Random-number-generator seed (SAEM only). - pub fn seed(mut self, seed: u64) -> Self { - let Self::Saem(config) = &mut self; - config.seed = seed; - self - } } impl Algorithm for ParametricAlgorithm { @@ -122,3 +88,13 @@ impl Algorithm for ParametricAlgori } } } + +// `SaemConfig` delegates to the matching `ParametricAlgorithm` variant so it can be passed +// directly to `fit_with`, keeping its setters compile-time checked. +impl Algorithm for SaemConfig { + type Output = ParametricResult; + + fn fit(self, problem: EstimationProblem) -> Result { + ParametricAlgorithm::from(self).fit(problem) + } +}