openpkflow 2.3.0__tar.gz → 2.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openpkflow-2.3.0 → openpkflow-2.6.0}/.gitignore +24 -0
- openpkflow-2.3.0/CLAUDE.md → openpkflow-2.6.0/AGENTS.md +50 -44
- {openpkflow-2.3.0 → openpkflow-2.6.0}/CHANGELOG.md +128 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/CITATION.cff +2 -2
- openpkflow-2.6.0/CLAUDE.md +376 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/PKG-INFO +72 -44
- {openpkflow-2.3.0 → openpkflow-2.6.0}/README.md +69 -43
- {openpkflow-2.3.0 → openpkflow-2.6.0}/VALIDATION.md +47 -8
- openpkflow-2.6.0/docs/changelog.md +245 -0
- openpkflow-2.6.0/docs/index.md +102 -0
- openpkflow-2.6.0/docs/logo.png +0 -0
- openpkflow-2.6.0/docs/migration-cheatsheet.md +196 -0
- openpkflow-2.6.0/docs/openfit/CLAUDE.md +402 -0
- openpkflow-2.6.0/docs/openfit/OPENASSAYFLOW_CLAUDE.md +228 -0
- openpkflow-2.6.0/docs/openfit/ROADMAP.md +230 -0
- openpkflow-2.6.0/docs/positioning.md +104 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/be.md +53 -3
- openpkflow-2.6.0/docs/reference/pipeline.md +51 -0
- openpkflow-2.6.0/docs/theory.md +482 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/bayes.md +4 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/be.md +39 -4
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/dissolution.md +5 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/ivivc.md +5 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/nca.md +5 -0
- openpkflow-2.6.0/docs/tutorials/pipeline.md +209 -0
- openpkflow-2.6.0/docs/tutorials/pop.md +225 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/sim.md +5 -0
- openpkflow-2.6.0/docs/validation-matrix.md +53 -0
- openpkflow-2.6.0/examples/pipeline_walkthrough.py +105 -0
- openpkflow-2.6.0/examples/replicate_be_partial.csv +10 -0
- openpkflow-2.6.0/examples/study_pipeline_example.json +9 -0
- openpkflow-2.6.0/examples/study_pipeline_example.yaml +13 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/mkdocs.yml +11 -1
- {openpkflow-2.3.0 → openpkflow-2.6.0}/pyproject.toml +49 -2
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/conda-forge/meta.yaml +10 -5
- openpkflow-2.6.0/scripts/crossval_winnonlin.py +252 -0
- openpkflow-2.6.0/scripts/powertost_crossval.R +95 -0
- openpkflow-2.6.0/scripts/release_readiness.py +78 -0
- openpkflow-2.6.0/scripts/replicate_be_crossval.R +154 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/__init__.py +1 -1
- openpkflow-2.6.0/src/openpkflow/be/__init__.py +28 -0
- openpkflow-2.6.0/src/openpkflow/be/methods.py +309 -0
- openpkflow-2.6.0/src/openpkflow/be/replicate.py +311 -0
- openpkflow-2.6.0/src/openpkflow/be/reporting.py +289 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/cli.py +299 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/__init__.py +10 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/models.py +20 -3
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/study.py +111 -47
- openpkflow-2.6.0/src/openpkflow/dissolution/supac.py +300 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/__init__.py +14 -0
- openpkflow-2.6.0/src/openpkflow/ivivc/level_bc.py +313 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/methods.py +129 -44
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/reporting.py +13 -6
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/results.py +11 -4
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/study.py +38 -10
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/__init__.py +2 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/loader.py +22 -3
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/methods.py +83 -18
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/study.py +20 -1
- openpkflow-2.6.0/src/openpkflow/pipeline/__init__.py +15 -0
- openpkflow-2.6.0/src/openpkflow/pipeline/config.py +253 -0
- openpkflow-2.6.0/src/openpkflow/pipeline/reporting.py +250 -0
- openpkflow-2.6.0/src/openpkflow/pipeline/study.py +374 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/omega.py +5 -5
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/result.py +3 -2
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/docx.py +9 -5
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/pdf.py +9 -5
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/dissolution_report.html +60 -16
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/ivivc_report.html +8 -4
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/multi_media_report.html +62 -18
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/nca_single_report.html +65 -21
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/nca_summary_report.html +58 -13
- openpkflow-2.6.0/src/openpkflow/report/templates/pipeline_report.html +479 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/__init__.py +4 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/methods.py +237 -0
- openpkflow-2.6.0/src/openpkflow/student/__init__.py +36 -0
- openpkflow-2.6.0/src/openpkflow/student/dissolution.py +509 -0
- openpkflow-2.6.0/src/openpkflow/student/nca.py +404 -0
- openpkflow-2.6.0/src/openpkflow/student/sim.py +497 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/be/test_methods.py +27 -0
- openpkflow-2.6.0/tests/be/test_methods_hypothesis.py +112 -0
- openpkflow-2.6.0/tests/be/test_replicate.py +150 -0
- openpkflow-2.6.0/tests/dissolution/test_bootstrap_hypothesis.py +68 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_m13b.py +36 -33
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_models.py +1 -1
- openpkflow-2.6.0/tests/dissolution/test_similarity_hypothesis.py +107 -0
- openpkflow-2.6.0/tests/dissolution/test_supac.py +151 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/ivivc/test_ivivc.py +46 -19
- openpkflow-2.6.0/tests/ivivc/test_level_bc.py +186 -0
- openpkflow-2.6.0/tests/ivivc/test_methods_hypothesis.py +70 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_loader.py +25 -3
- openpkflow-2.6.0/tests/nca/test_methods_hypothesis.py +623 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_steady_state_urine.py +17 -4
- openpkflow-2.6.0/tests/pipeline/test_study_pipeline.py +237 -0
- openpkflow-2.6.0/tests/pop/test_omega.py +14 -0
- openpkflow-2.6.0/tests/sim/test_dosing_hypothesis.py +153 -0
- openpkflow-2.6.0/tests/sim/test_methods_hypothesis.py +313 -0
- openpkflow-2.6.0/tests/sim/test_models_hypothesis.py +118 -0
- openpkflow-2.6.0/tests/sim/test_simulate_hypothesis.py +133 -0
- openpkflow-2.6.0/tests/sim/test_steady_state_metrics.py +97 -0
- openpkflow-2.6.0/tests/sim/test_transit.py +103 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/test_cli.py +72 -0
- openpkflow-2.6.0/tests/test_student.py +357 -0
- openpkflow-2.6.0/tests/validation/__init__.py +0 -0
- openpkflow-2.6.0/tests/validation/test_be_power_reference.py +232 -0
- openpkflow-2.6.0/tests/validation/test_be_replicate_reference.py +133 -0
- openpkflow-2.6.0/tests/validation/test_ivivc_convolution_reference.py +268 -0
- openpkflow-2.6.0/tests/validation/test_nca_winnonlin_reference.py +788 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_pop_foce_reference.py +2 -0
- openpkflow-2.3.0/.github/ISSUE_TEMPLATE/bug_report.md +0 -25
- openpkflow-2.3.0/.github/ISSUE_TEMPLATE/feature_request.md +0 -18
- openpkflow-2.3.0/.github/PULL_REQUEST_TEMPLATE.md +0 -66
- openpkflow-2.3.0/.github/dependabot.yml +0 -46
- openpkflow-2.3.0/.github/workflows/ci.yml +0 -102
- openpkflow-2.3.0/.github/workflows/docs.yml +0 -29
- openpkflow-2.3.0/.github/workflows/publish.yml +0 -77
- openpkflow-2.3.0/.pre-commit-config.yaml +0 -37
- openpkflow-2.3.0/FUTURE_PLANS.md +0 -181
- openpkflow-2.3.0/HANDOFF.md +0 -135
- openpkflow-2.3.0/ROADMAP.md +0 -233
- openpkflow-2.3.0/V2_ARCHITECTURE_DECISION.md +0 -194
- openpkflow-2.3.0/demo.ipynb +0 -201
- openpkflow-2.3.0/docs/index.md +0 -72
- openpkflow-2.3.0/docs/logo.png +0 -0
- openpkflow-2.3.0/docs/tutorials/pop.md +0 -100
- openpkflow-2.3.0/src/openpkflow/be/__init__.py +0 -14
- openpkflow-2.3.0/src/openpkflow/be/methods.py +0 -157
- openpkflow-2.3.0/src/openpkflow/be/reporting.py +0 -133
- {openpkflow-2.3.0 → openpkflow-2.6.0}/CODE_OF_CONDUCT.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/CONTRIBUTING.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/LICENSE +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/SECURITY.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/codecov.yml +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/bayes.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/dissolution.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/ivivc.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/ml.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/nca.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/pop.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/sim.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/validation.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/be_report.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/dissolution_advanced.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/dissolution_basic.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/dissolution_comparison.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/ivivc_report.md +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/openpkflow_tour.ipynb +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/report_dissolution.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/bootf2_dissolution_crossval.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/dissolution_models_crossval.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/ivivc_wn_lr_crossval.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/nlmixr2_popk_crossval.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/noncompart_theoph_crossval.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/pknca_ss_crossval.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/pknca_theoph_crossval.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/pknca_theoph_crossval_extended.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/probe_bootf2.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/probe_foce_i.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/probe_noncompart.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/urine_nca_crossval.R +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/bayes_be.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/bayes_pk.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/map_pk.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/priors.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/reporting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/results.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/be/results.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/be/study.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/example_dissolution.csv +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/example_not_similar.csv +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/example_similar.csv +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/ss_crossval.csv +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/theoph.csv +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/bootstrap.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/loader.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/multi_media.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/plotting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/reporting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/similarity.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ml/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ml/surrogate.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/reporting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/results.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/sparse.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/dataset.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/diagnostics.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/foce_i.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/foce_inner.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/model.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/objective.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/plotting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/reporting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/saem.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/saem_kernel.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/gof.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/plotting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/reporting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/vpc.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/py.typed +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/html.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/bayes_be_report.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/be_report.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/fit_report.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/map_pk_report.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/pop_gof_report.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/pop_vpc_report.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/sim_report.html +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/dosing.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/models.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/plotting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/reporting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/results.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/simulate.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/validation/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/bayes/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/bayes/test_bayes_be.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/bayes/test_map_pk.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/be/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/be/test_study.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_alternatives.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_bootstrap.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_excel_loader.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_model_comparison.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_multi_media.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_similarity.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_study.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/ml/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/ml/test_surrogate.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_methods.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_nca_pdf_docx.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_nca_reporting.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_nca_results.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_sparse_nca.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_study.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_theoph_reference.py +0 -0
- {openpkflow-2.3.0/tests/pop → openpkflow-2.6.0/tests/pipeline}/__init__.py +0 -0
- {openpkflow-2.3.0/tests/report → openpkflow-2.6.0/tests/pop}/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_dataset.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_estimation_diagnostics.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_estimation_model.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_estimation_objective.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_foce_i.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_gof.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_pop_vpc.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_saem.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_vpc.py +0 -0
- {openpkflow-2.3.0/tests/sim → openpkflow-2.6.0/tests/report}/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/report/test_docx.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/report/test_pdf.py +0 -0
- {openpkflow-2.3.0/tests/validation → openpkflow-2.6.0/tests/sim}/__init__.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/sim/test_methods.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/sim/test_roundtrip_nca.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/sim/test_sim_models.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/sim/test_simulate.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/test_benchmark.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_dissolution_bootf2_reference.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_dissolution_models_reference.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_ivivc_wn_lr_reference.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_noncompart_reference.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_ss_reference.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_theoph_reference.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_urine_reference.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_validation.py +0 -0
- {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_sim_validation.py +0 -0
|
@@ -22,6 +22,8 @@ ENV/
|
|
|
22
22
|
.coverage
|
|
23
23
|
htmlcov/
|
|
24
24
|
.tox/
|
|
25
|
+
.hypothesis/
|
|
26
|
+
.ruff_cache/
|
|
25
27
|
|
|
26
28
|
# Type checking
|
|
27
29
|
.mypy_cache/
|
|
@@ -65,10 +67,32 @@ handout/
|
|
|
65
67
|
!src/**/*.html
|
|
66
68
|
!examples/**/*.html
|
|
67
69
|
!docs/**
|
|
70
|
+
!webapp/index.html
|
|
68
71
|
|
|
69
72
|
# MkDocs generated site
|
|
70
73
|
site/
|
|
74
|
+
!site/
|
|
75
|
+
site/*
|
|
76
|
+
!site/app/
|
|
77
|
+
!site/app/index.html
|
|
71
78
|
|
|
72
79
|
# Uploaded images
|
|
73
80
|
*.png
|
|
74
81
|
!docs/**/*.png
|
|
82
|
+
|
|
83
|
+
# Frontend tooling (never ship in sdist)
|
|
84
|
+
webapp/node_modules/
|
|
85
|
+
webapp/test-results/
|
|
86
|
+
webapp/playwright-report/
|
|
87
|
+
webapp/vite-dev.log
|
|
88
|
+
**/node_modules/
|
|
89
|
+
|
|
90
|
+
# Cloudflare / Wrangler local state (account metadata)
|
|
91
|
+
.wrangler/
|
|
92
|
+
wrangler.toml.bak
|
|
93
|
+
|
|
94
|
+
# Local handoff archives / extraction (not package source)
|
|
95
|
+
Untitled-handoff.zip
|
|
96
|
+
untitled-handoff-extracted/
|
|
97
|
+
*-handoff.zip
|
|
98
|
+
*-handoff-extracted/
|
|
@@ -1,19 +1,32 @@
|
|
|
1
|
-
#
|
|
1
|
+
# AGENTS.md
|
|
2
2
|
|
|
3
|
-
This file provides guidance to
|
|
3
|
+
This file provides guidance to Codex (Codex.ai/code) when working with code in this repository.
|
|
4
4
|
|
|
5
5
|
## Scope and boundary (read this first)
|
|
6
6
|
|
|
7
7
|
**In scope — build, extend, polish:**
|
|
8
|
-
- `dissolution/` — f1, f2, MSD, model fitting, multi-media
|
|
8
|
+
- `dissolution/` — f1, f2, MSD, model fitting, multi-media, SUPAC screening, alcohol f2
|
|
9
9
|
- `nca/` — sparse, steady-state, urinary, CDISC PP (greenfield moat)
|
|
10
|
-
- `ivivc/` — Level A (
|
|
11
|
-
- `sim/` — analytical compartment models
|
|
10
|
+
- `ivivc/` — Level A + Level B/C helpers (MDT/MRT correlation)
|
|
11
|
+
- `sim/` — analytical compartment models, transit oral, SS metrics
|
|
12
|
+
- `pipeline/` — multi-stage study orchestration + unified reports (v2.6.0)
|
|
12
13
|
- `bayes/` — MAP individual PK (scipy, screening tool, not regulatory primary)
|
|
13
|
-
- `be/` — paired TOST convenience layer + BioEqPy export
|
|
14
|
+
- `be/` — paired TOST convenience layer + power/n + BioEqPy export
|
|
14
15
|
- `report/` — HTML, PDF, DOCX, Markdown
|
|
15
16
|
- `validation/` — cross-checks against published references
|
|
16
17
|
|
|
18
|
+
**Web app layer (same as CLAUDE.md):**
|
|
19
|
+
- `api/` — FastAPI REST adapter. Current routers: nca, dissolution (incl. multi-media),
|
|
20
|
+
sim, ivivc, be (incl. power / sample-size). Adding a new endpoint requires a schema
|
|
21
|
+
(schemas/), service (services/), router (routers/), and registration in main.py.
|
|
22
|
+
Follow the existing nca router pattern exactly.
|
|
23
|
+
- `webapp/` — React + Vite + Tailwind frontend. Current pages: Home, NCA, Dissolution
|
|
24
|
+
(single + multi-media tab), Sim, IVIVC, BE (analysis + power tab).
|
|
25
|
+
See `progress_web_app.md` for the full file map and next candidates.
|
|
26
|
+
- Do NOT add pharmacometric logic to api/ or webapp/. Add to src/openpkflow/ first.
|
|
27
|
+
|
|
28
|
+
**Takeover:** read `HANDOFF.md` first for branch/PR/release state.
|
|
29
|
+
|
|
17
30
|
**Out of scope — do not extend (existing code is frozen at v2.3.0):**
|
|
18
31
|
- `pop/estimation/` — FOCE-I and SAEM exist but must not be extended. Pharmpy and
|
|
19
32
|
nlmixr2 are validated NLME engines. Bug fixes only. No IOV, no 3-cmt, no covariate
|
|
@@ -28,7 +41,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
28
41
|
3. The former covariate API in `pop/estimation/` (`CovariateModel`, `apply_covariates`)
|
|
29
42
|
was a non-functional v2.2.0 skeleton and was removed in v2.3.0. Do not reintroduce
|
|
30
43
|
covariate estimation without a full external validation plan.
|
|
31
|
-
4. When ROADMAP.md and
|
|
44
|
+
4. When ROADMAP.md and AGENTS.md disagree, AGENTS.md wins. Flag the conflict to the user.
|
|
32
45
|
5. Never use `--no-verify` to bypass pre-commit hooks. Fix the underlying issue instead.
|
|
33
46
|
|
|
34
47
|
---
|
|
@@ -95,17 +108,19 @@ openpkflow dissolution compare data.csv --reference reference --test test --repo
|
|
|
95
108
|
### Module map
|
|
96
109
|
|
|
97
110
|
```
|
|
98
|
-
dissolution/ -- f1, f2,
|
|
99
|
-
nca/ -- AUC, lambda_z,
|
|
100
|
-
ivivc/ --
|
|
101
|
-
sim/ --
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
111
|
+
dissolution/ -- f1, f2, bootstrap, MSD, models, multi_media, supac DONE (+ v2.6)
|
|
112
|
+
nca/ -- AUC, lambda_z, SS, urine, sparse, CDISC PP DONE
|
|
113
|
+
ivivc/ -- Level A WN/LR/convolution/Levy + Level B/C helpers DONE (+ v2.6)
|
|
114
|
+
sim/ -- 1/2-cmt, dosing, transit oral, SS metrics DONE (+ v2.6)
|
|
115
|
+
pipeline/ -- StudyPipeline multi-stage orchestration + reports DONE v2.6.0
|
|
116
|
+
pop/ -- GOF/VPC + estimation/ FROZEN (bug fixes only) DONE
|
|
117
|
+
bayes/ -- MAP + optional PyMC DONE
|
|
118
|
+
ml/ -- PKSurrogate (torch MLP, EXPERIMENTAL) DONE
|
|
119
|
+
report/ -- Markdown, HTML, PDF (ReportLab), Word (python-docx) DONE
|
|
120
|
+
datasets/ -- example CSVs (dissolution + theoph NCA reference)
|
|
121
|
+
validation/ -- reference comparison utilities
|
|
122
|
+
student/ -- simplified teaching APIs DONE v2.5
|
|
123
|
+
cli.py -- Typer: dissolution, be, ivivc, pop, study run
|
|
109
124
|
```
|
|
110
125
|
|
|
111
126
|
### NCA module layout
|
|
@@ -233,9 +248,15 @@ Each test cites a source: paper DOI, FDA guidance ID, or reference implementatio
|
|
|
233
248
|
|
|
234
249
|
## Current focus
|
|
235
250
|
|
|
236
|
-
v2.
|
|
237
|
-
|
|
238
|
-
|
|
251
|
+
**v2.6.0** is the current tree version (pipeline, SUPAC/alcohol, IVIVC B/C, transit sim,
|
|
252
|
+
webapp polish, convolution validation). Code lives on PR #27 until merge.
|
|
253
|
+
|
|
254
|
+
**Immediate next work (in order):**
|
|
255
|
+
1. Merge PR #27 when CI is green; tag/release v2.6.0 (`RELEASE.md`, `HANDOFF.md`).
|
|
256
|
+
2. Webapp: study pipeline page; sparse NCA / MAP adapters; SUPAC UI; deploy.
|
|
257
|
+
3. Keep validation discipline; do not extend frozen `pop/estimation/`.
|
|
258
|
+
|
|
259
|
+
See `HANDOFF.md` for branch/PR state and `ROADMAP.md` for the full ladder.
|
|
239
260
|
|
|
240
261
|
**Before any new feature:** run `python -m build && python -m twine check dist/*` to confirm the wheel is clean.
|
|
241
262
|
|
|
@@ -244,29 +265,14 @@ See `ROADMAP.md` for the full ladder.
|
|
|
244
265
|
## Release Ladder
|
|
245
266
|
|
|
246
267
|
```
|
|
247
|
-
0.1.0
|
|
248
|
-
|
|
249
|
-
0.
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
0.
|
|
255
|
-
0.5.0 PK simulation (1-comp, 2-comp, oral, IV, infusion, repeated dosing) DONE
|
|
256
|
-
0.6.0 population PK diagnostics, GOF plots, VPC helpers DONE
|
|
257
|
-
0.7.0 Pharmpy bridge SKIPPED (reserved)
|
|
258
|
-
0.8.0 Bayesian PK (PyMC, CmdStanPy) DEFERRED (extras wired)
|
|
259
|
-
0.9.0 ML surrogate (torch MLP, EXPERIMENTAL) DONE
|
|
260
|
-
1.0.0 stable public release DONE
|
|
261
|
-
1.1.0 dissolution regulatory toolkit: MSD, model-dependent comparison, RSD check DONE
|
|
262
|
-
1.2.0 IVIVC Level A: Wagner-Nelson, Loo-Riegelman, convolution predict, %PE DONE
|
|
263
|
-
1.3.0 NCA expansion: steady-state, urinary excretion, CDISC PP output DONE
|
|
264
|
-
1.4.0 multi-media dissolution: pH 1.2/4.5/6.8 panel, alcohol dose-dumping DONE
|
|
265
|
-
1.5.0 Sparse-sampling NCA: model-informed 1-cmt oral from 3-5 data points DONE
|
|
266
|
-
2.0.0 Bayesian PK: MAP individual estimation + full posterior + Bayesian BE (PyMC) DONE
|
|
267
|
-
2.1.0 FOCE-I & SAEM population PK (1-cmt, diagonal Omega) DONE
|
|
268
|
-
2.2.0 2-cmt models, full Omega matrix, covariate skeleton DONE
|
|
269
|
-
2.3.0 Remove covariate skeleton, FOCE-I nlme cross-validation, conda-forge prep DONE
|
|
268
|
+
0.1.0 - 1.0.0 core dissolution, NCA, sim, reports, stable release DONE
|
|
269
|
+
1.1.0 - 1.5.0 MSD, IVIVC Level A, SS/urine NCA, multi-media, sparse NCA DONE
|
|
270
|
+
2.0.0 Bayesian MAP + PyMC BE DONE
|
|
271
|
+
2.1.0 - 2.3.0 FOCE-I/SAEM, 2-cmt Omega, freeze pop estimation + nlme val DONE
|
|
272
|
+
2.4.0 replicate BE screening + release credibility sprint DONE
|
|
273
|
+
2.5.0 web app (api/ + webapp/) + student helpers DONE
|
|
274
|
+
2.6.0 study pipeline, SUPAC/alcohol, IVIVC B/C, transit, web polish CODE DONE (tag pending)
|
|
275
|
+
0.7.0 Pharmpy bridge SKIPPED (reserved)
|
|
270
276
|
```
|
|
271
277
|
|
|
272
278
|
See `ROADMAP.md` for full milestone detail, scope rationale, and definition of done.
|
|
@@ -9,6 +9,134 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
The v2.6.0 release candidate passes the full standard suite (1275 passed),
|
|
13
|
+
API tests, frontend lint/build/browser tests, strict docs build, mypy, and
|
|
14
|
+
wheel/sdist validation. Tag/PyPI publish remains pending until the hardening
|
|
15
|
+
change is green on `main`.
|
|
16
|
+
|
|
17
|
+
### Release hardening
|
|
18
|
+
|
|
19
|
+
- **CI**: added API, frontend lint/build/Playwright, Python 3.13 Linux/Windows
|
|
20
|
+
smoke, and enforced type-check jobs; recent Codecov uploads were verified.
|
|
21
|
+
- **API**: upload reads are bounded by the configured size limit; standard
|
|
22
|
+
anti-sniffing, framing, referrer, and browser-permission headers are added.
|
|
23
|
+
- **Population PK**: fixed full-Omega label generation, which reused a string
|
|
24
|
+
loop variable as an integer and crashed for `omega_type="full"`.
|
|
25
|
+
- **Student APIs**: typed dissolution comparison results and fail-closed PK
|
|
26
|
+
route validation; unsupported routes no longer fall through as IV bolus.
|
|
27
|
+
- **Typing**: non-frozen modules pass strict mypy. The frozen legacy
|
|
28
|
+
`pop.estimation` implementation has an explicit module override until it is
|
|
29
|
+
reactivated with external validation.
|
|
30
|
+
|
|
31
|
+
### Fixed (correction sprint)
|
|
32
|
+
|
|
33
|
+
- **BE**: paired-design intra-subject CV now uses variance-halving
|
|
34
|
+
(`sigma_w^2 = s_d^2 / 2`) before log-normal CV back-transform.
|
|
35
|
+
- **NCA / pipeline**: fail-closed config (unknown keys rejected; explicit
|
|
36
|
+
AUC/BLQ methods required for NCA stages); `auc_tau` enforces times in
|
|
37
|
+
`[0, tau]` and rejects unknown methods; string BLQ markers such as
|
|
38
|
+
`<0.5` no longer become observed concentrations under `blq_method="none"`.
|
|
39
|
+
- **Sim transit**: Savic transit chain + absorption depot; `CL_F`/`Vz_F`
|
|
40
|
+
naming; MTT is applied for all `n_transit` including 1.
|
|
41
|
+
- **IVIVC**: dissolution minutes converted to hours when requested;
|
|
42
|
+
incomplete dissolution no longer renormalised to 100%; default `kel=0.1`
|
|
43
|
+
removed; single-formulation FDA overall-pass disabled (use multi-
|
|
44
|
+
formulation aggregate for Cmax and AUC separately).
|
|
45
|
+
- **Dissolution**: `compare(f2_method=...)` defaults to `regulatory`;
|
|
46
|
+
prerequisite warnings persisted on `ComparisonResult`; ICH M13B Step 2
|
|
47
|
+
absolute SD > 8% at any time point (not RSD only when mean <= 60%).
|
|
48
|
+
- **SUPAC-IR**: function-specific threshold tables (filler, binder,
|
|
49
|
+
disintegrants, stearates, glidants, film coat).
|
|
50
|
+
- **Packaging**: Hatch sdist allowlist excludes `node_modules`, Wrangler
|
|
51
|
+
state, Hypothesis caches, Playwright artifacts; `.gitignore` extended.
|
|
52
|
+
- **Webapp**: NCA/IVIVC snapshot request with result; stale forms disable
|
|
53
|
+
report download until re-run. Extended the same guard to the BE and
|
|
54
|
+
Dissolution analysis tabs (parameter/limit/alpha/sequence/column-mapping
|
|
55
|
+
changes now invalidate the on-screen result); Sim page disables report
|
|
56
|
+
download while a live re-fetch is in flight.
|
|
57
|
+
- **CI/CD**: `publish.yml` now refuses to publish to PyPI unless the pushed
|
|
58
|
+
tag's commit is reachable from `main`.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## [2.6.0] - 2026-07-09
|
|
63
|
+
|
|
64
|
+
### Notes
|
|
65
|
+
|
|
66
|
+
- **Not a corrected release.** Feature merge (#27). Correction sprint must
|
|
67
|
+
land before any scientific claim or tag re-cut for this version line.
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
### Added
|
|
71
|
+
|
|
72
|
+
- **Study pipeline** (`openpkflow.pipeline`): compose dissolution, NCA, and BE
|
|
73
|
+
stages into one run with audit metadata, HTML/Markdown multi-section reports,
|
|
74
|
+
and CLI `openpkflow study run config.json --report out.html`.
|
|
75
|
+
- **SUPAC-IR screening** helpers: `classify_supac_ir_level()` and
|
|
76
|
+
`alcohol_dose_dumping_assessment()` in `dissolution/supac.py` (screening only;
|
|
77
|
+
not a substitute for full guidance interpretation).
|
|
78
|
+
- **IVIVC Level B/C**: MDT, MRT, and linear correlation helpers
|
|
79
|
+
(`mean_dissolution_time`, `mean_residence_time`, `level_b_correlation`,
|
|
80
|
+
`level_c_correlation`).
|
|
81
|
+
- **Transit-compartment oral absorption**: `c_1cmt_oral_transit()` (Savic-style
|
|
82
|
+
n/MTT convention) and closed-form `steady_state_metrics_1cmt_oral()`.
|
|
83
|
+
- **Web API / app**: BE power and sample-size endpoints + calculator tab;
|
|
84
|
+
multi-media dissolution analyze/report + Dissolution page tab; IVIVC load
|
|
85
|
+
example and dose_diss/dose_iv UI; expanded Playwright smoke tests.
|
|
86
|
+
- **Validation**: analytical IVIVC convolution cross-check
|
|
87
|
+
(`tests/validation/test_ivivc_convolution_reference.py`); BE power edge
|
|
88
|
+
cases (boundary GMR ~ alpha, monotonicity in n).
|
|
89
|
+
- **Docs**: positioning page, pipeline tutorial, validation matrix updates,
|
|
90
|
+
Docker/compose polish, `examples/pipeline_walkthrough.py`.
|
|
91
|
+
|
|
92
|
+
### Notes
|
|
93
|
+
|
|
94
|
+
- Pop PK estimation remains frozen (bug fixes only). Formal RSABE remains out
|
|
95
|
+
of scope (companion BioEqPy). SUPAC and replicate BE are screening tools.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## [2.5.0] - 2026-06-12
|
|
100
|
+
|
|
101
|
+
### Added
|
|
102
|
+
|
|
103
|
+
- Student-friendly interface (`openpkflow.student`) with three one-call
|
|
104
|
+
functions: `analyze_pk()` for NCA, `fit_dissolution()` for dissolution
|
|
105
|
+
model fitting + f1/f2 comparison, and `fit_pk_model()` for 1/2-compartment
|
|
106
|
+
PK curve fitting.
|
|
107
|
+
- `student/sim.py` compartmental equations delegate to validated
|
|
108
|
+
`sim/methods.py` functions (c_1cmt_oral, c_1cmt_iv_bolus, c_2cmt_oral) --
|
|
109
|
+
no duplicate math.
|
|
110
|
+
- Hixson-Crowell model added to dissolution `_REGISTRY` (now 6 default
|
|
111
|
+
models: zero_order, first_order, higuchi, korsmeyer_peppas, weibull,
|
|
112
|
+
hixson_crowell).
|
|
113
|
+
- External validation of NCA engine against WinNonlin(r) (Kim et al. 2018,
|
|
114
|
+
PMC6989226, Table 3): all 8 parameters within 0.02% for Theoph Subject 8
|
|
115
|
+
(Cmax, Tmax, lambda_z, t1/2, AUClast, AUCinf, CL/F, Vz/F).
|
|
116
|
+
|
|
117
|
+
### Fixed
|
|
118
|
+
|
|
119
|
+
- Mandated disclaimer text (CLAUDE.md rule 7) applied to all student module
|
|
120
|
+
report summaries.
|
|
121
|
+
- `test_all_default_models_fit` updated to expect 6 default models.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## [2.4.0] — 2026-05-30
|
|
126
|
+
|
|
127
|
+
### Added
|
|
128
|
+
|
|
129
|
+
- Research-grade replicate bioequivalence screening via `replicate_be()`:
|
|
130
|
+
long-format full/partial replicate data parsing, GMR + conventional 90% CI,
|
|
131
|
+
CVwR estimation, EMA-style scaled-limit summaries, and FDA-style RSABE point
|
|
132
|
+
criterion screening. These outputs are explicitly documented as exploratory
|
|
133
|
+
and not a replacement for jurisdiction-specific validated SAS/R workflows.
|
|
134
|
+
- Replicate BE CLI/report workflow: `openpkflow be replicate`, HTML/Markdown
|
|
135
|
+
reports, JSON export, example partial-replicate CSV, and scalar reference
|
|
136
|
+
validation fixtures for the screening calculations.
|
|
137
|
+
- Release-readiness documentation and slow-validation workflow for heavyweight
|
|
138
|
+
reference checks, plus a read-only `scripts/release_readiness.py` checker.
|
|
139
|
+
|
|
12
140
|
---
|
|
13
141
|
|
|
14
142
|
## [2.3.0] — 2026-05-24
|
|
@@ -5,7 +5,7 @@ authors:
|
|
|
5
5
|
given-names: Priyam
|
|
6
6
|
email: priyamthakar1@gmail.com
|
|
7
7
|
title: "OpenPKFlow: Python-first pharmacometrics and dissolution toolkit"
|
|
8
|
-
version:
|
|
9
|
-
date-released: 2026-
|
|
8
|
+
version: 2.6.0
|
|
9
|
+
date-released: 2026-07-09
|
|
10
10
|
url: "https://github.com/priyamthakar/openpkflow"
|
|
11
11
|
license: MIT
|