mic-50-90 1.0.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.
- mic_50_90-1.0.0/.github/workflows/release.yml +181 -0
- mic_50_90-1.0.0/.github/workflows/tests.yml +48 -0
- mic_50_90-1.0.0/.gitignore +40 -0
- mic_50_90-1.0.0/.zenodo.json +24 -0
- mic_50_90-1.0.0/CHANGELOG.md +17 -0
- mic_50_90-1.0.0/CITATION.cff +20 -0
- mic_50_90-1.0.0/LICENSE +21 -0
- mic_50_90-1.0.0/NOTICE.md +18 -0
- mic_50_90-1.0.0/PKG-INFO +153 -0
- mic_50_90-1.0.0/README.md +90 -0
- mic_50_90-1.0.0/README_REVIEWER.md +29 -0
- mic_50_90-1.0.0/codemeta.json +45 -0
- mic_50_90-1.0.0/data/LICENSES.md +16 -0
- mic_50_90-1.0.0/data/SOURCES.md +20 -0
- mic_50_90-1.0.0/docs/ACQUIRING_COUNTS.md +35 -0
- mic_50_90-1.0.0/docs/BUILD_WINDOWS.md +35 -0
- mic_50_90-1.0.0/docs/CALIBRATION_ASSESSMENT.md +54 -0
- mic_50_90-1.0.0/docs/CALIBRATION_PREPARATION.md +86 -0
- mic_50_90-1.0.0/docs/CLI_REFERENCE.md +148 -0
- mic_50_90-1.0.0/docs/CSV_WORKFLOWS.md +141 -0
- mic_50_90-1.0.0/docs/DATA_TERMS.md +12 -0
- mic_50_90-1.0.0/docs/DECISION_PLANNING.md +62 -0
- mic_50_90-1.0.0/docs/DISTRIBUTION_POLICY.md +16 -0
- mic_50_90-1.0.0/docs/ENGINEERING_VERIFICATION.md +24 -0
- mic_50_90-1.0.0/docs/GUI_GUIDE.md +342 -0
- mic_50_90-1.0.0/docs/LARGE_REPORTS.md +85 -0
- mic_50_90-1.0.0/docs/MISSING_INFORMATION.md +24 -0
- mic_50_90-1.0.0/docs/POPULATION_PRECISION.md +55 -0
- mic_50_90-1.0.0/docs/PUBLIC_FUNCTIONS.md +161 -0
- mic_50_90-1.0.0/docs/PYTHON_INTERFACE.md +142 -0
- mic_50_90-1.0.0/docs/REPORT_CONTENTS.md +109 -0
- mic_50_90-1.0.0/docs/REPRODUCING_RESULTS.md +53 -0
- mic_50_90-1.0.0/docs/RETURNED_COUNTS.md +44 -0
- mic_50_90-1.0.0/docs/SAMPLE_SIZE.md +14 -0
- mic_50_90-1.0.0/docs/SCIENTIFIC_CONTRIBUTION.md +14 -0
- mic_50_90-1.0.0/docs/SUFFICIENT_REPORTING.md +39 -0
- mic_50_90-1.0.0/docs/VERSION_POLICY.md +5 -0
- mic_50_90-1.0.0/docs/compatible-population-projection.md +150 -0
- mic_50_90-1.0.0/docs/distribution-user-guide.md +486 -0
- mic_50_90-1.0.0/docs/hunter-inference-kernel.md +141 -0
- mic_50_90-1.0.0/docs/joint-distribution-implementation.md +16 -0
- mic_50_90-1.0.0/docs/joint-distribution-method.md +343 -0
- mic_50_90-1.0.0/docs/population-row-lift.md +49 -0
- mic_50_90-1.0.0/docs/range-population-method.md +162 -0
- mic_50_90-1.0.0/examples/acquisition/README.md +43 -0
- mic_50_90-1.0.0/examples/acquisition/completed.csv +4 -0
- mic_50_90-1.0.0/examples/acquisition/laboratory-counts.csv +8 -0
- mic_50_90-1.0.0/examples/acquisition/laboratory-panels.csv +8 -0
- mic_50_90-1.0.0/examples/acquisition/laboratory-targets.csv +7 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries-category.json +45 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries-conditional-population.json +51 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries-population-category.json +45 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries-rank60.json +45 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries.json +47 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count-category.json +55 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count-conditional-population.json +61 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count-population-category.json +55 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count-rank60.json +55 -0
- mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count.json +57 -0
- mic_50_90-1.0.0/examples/biological_cases/chloramphenicol-67-censored.json +59 -0
- mic_50_90-1.0.0/examples/biological_cases/chloramphenicol-67-rounding-unknown.json +56 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-7133-one-count.json +61 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-7133-two-counts.json +68 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2007.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2008.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2009.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2010.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2011.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2012.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2013.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2014.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2015.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2016.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2017.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2018.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2019.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2020.json +63 -0
- mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2021.json +63 -0
- mic_50_90-1.0.0/examples/calibration_audit/README.md +10 -0
- mic_50_90-1.0.0/examples/calibration_audit/expected.csv +5 -0
- mic_50_90-1.0.0/examples/calibration_audit/observed.csv +5 -0
- mic_50_90-1.0.0/examples/calibration_preparation/README.md +16 -0
- mic_50_90-1.0.0/examples/calibration_preparation/counts.csv +19 -0
- mic_50_90-1.0.0/examples/calibration_preparation/future-summaries.csv +3 -0
- mic_50_90-1.0.0/examples/calibration_preparation/metadata.json +14 -0
- mic_50_90-1.0.0/examples/calibration_preparation/panels.csv +7 -0
- mic_50_90-1.0.0/examples/calibration_preparation/roster.csv +9 -0
- mic_50_90-1.0.0/examples/csv/calibration-scores.json +64 -0
- mic_50_90-1.0.0/examples/csv/calibrations.json +125 -0
- mic_50_90-1.0.0/examples/csv/counts.csv +7 -0
- mic_50_90-1.0.0/examples/csv/panels.csv +7 -0
- mic_50_90-1.0.0/examples/csv/summaries-calibrated.csv +2 -0
- mic_50_90-1.0.0/examples/csv/summaries.csv +3 -0
- mic_50_90-1.0.0/examples/csv/targets.csv +4 -0
- mic_50_90-1.0.0/examples/decision_planning/README.md +29 -0
- mic_50_90-1.0.0/examples/decision_planning/complete-counts.csv +3 -0
- mic_50_90-1.0.0/examples/decision_planning/panels.csv +6 -0
- mic_50_90-1.0.0/examples/decision_planning/returned-count.csv +2 -0
- mic_50_90-1.0.0/examples/decision_planning/summaries.csv +2 -0
- mic_50_90-1.0.0/examples/decision_planning/targets.csv +4 -0
- mic_50_90-1.0.0/examples/decision_planning/weighted-queries.csv +4 -0
- mic_50_90-1.0.0/examples/decision_planning/weighted-targets.csv +3 -0
- mic_50_90-1.0.0/examples/distribution/published-7133-counts.json +68 -0
- mic_50_90-1.0.0/examples/distribution/summaries.json +14 -0
- mic_50_90-1.0.0/examples/distribution/supplemented.json +18 -0
- mic_50_90-1.0.0/examples/empirical.json +39 -0
- mic_50_90-1.0.0/examples/laboratory_use/README.md +41 -0
- mic_50_90-1.0.0/examples/laboratory_use/laboratory/cohort-id-map.json +62 -0
- mic_50_90-1.0.0/examples/laboratory_use/laboratory/counts.csv +446 -0
- mic_50_90-1.0.0/examples/laboratory_use/laboratory/panels.csv +75 -0
- mic_50_90-1.0.0/examples/laboratory_use/laboratory/targets.csv +386 -0
- mic_50_90-1.0.0/examples/laboratory_use/published/panels.csv +34 -0
- mic_50_90-1.0.0/examples/laboratory_use/published/provenance.json +132 -0
- mic_50_90-1.0.0/examples/laboratory_use/published/summaries.csv +4 -0
- mic_50_90-1.0.0/examples/laboratory_use/published/targets.csv +4 -0
- mic_50_90-1.0.0/examples/laboratory_use/returned/additional-counts.csv +5 -0
- mic_50_90-1.0.0/examples/laboratory_use/returned/panels.csv +4 -0
- mic_50_90-1.0.0/examples/laboratory_use/returned/summaries.csv +5 -0
- mic_50_90-1.0.0/examples/laboratory_use/returned/targets.csv +5 -0
- mic_50_90-1.0.0/examples/population.json +33 -0
- mic_50_90-1.0.0/examples/publication_review/README.md +48 -0
- mic_50_90-1.0.0/examples/publication_review/amikacin-14-conflict.json +60 -0
- mic_50_90-1.0.0/examples/publication_review/ampicillin-227-conditional-after.json +58 -0
- mic_50_90-1.0.0/examples/publication_review/ampicillin-227-conditional-before.json +48 -0
- mic_50_90-1.0.0/examples/publication_review/ampicillin-227-counts.json +44 -0
- mic_50_90-1.0.0/examples/publication_review/cefiderocol-25-conditional-after.json +58 -0
- mic_50_90-1.0.0/examples/publication_review/cefiderocol-25-conditional-before.json +48 -0
- mic_50_90-1.0.0/examples/publication_review/cefiderocol-25-counts.json +44 -0
- mic_50_90-1.0.0/examples/publication_review/doxycycline-68-conditional-after.json +58 -0
- mic_50_90-1.0.0/examples/publication_review/doxycycline-68-conditional-before.json +48 -0
- mic_50_90-1.0.0/examples/publication_review/doxycycline-68-counts.json +44 -0
- mic_50_90-1.0.0/examples/publication_review/penicillin-21-conditional-after.json +74 -0
- mic_50_90-1.0.0/examples/publication_review/penicillin-21-conditional-before.json +56 -0
- mic_50_90-1.0.0/examples/publication_review/penicillin-21-counts.json +60 -0
- mic_50_90-1.0.0/examples/published_summaries/README.md +23 -0
- mic_50_90-1.0.0/examples/published_summaries/panels.csv +36 -0
- mic_50_90-1.0.0/examples/published_summaries/provenance.json +69 -0
- mic_50_90-1.0.0/examples/published_summaries/summaries.csv +10 -0
- mic_50_90-1.0.0/examples/published_summaries/targets.csv +5 -0
- mic_50_90-1.0.0/examples/published_table/README.md +26 -0
- mic_50_90-1.0.0/examples/published_table/SOURCE.json +48 -0
- mic_50_90-1.0.0/examples/published_table/counts.csv +14 -0
- mic_50_90-1.0.0/examples/published_table/panels.csv +14 -0
- mic_50_90-1.0.0/examples/published_table/summaries.csv +2 -0
- mic_50_90-1.0.0/examples/published_table/targets.csv +2 -0
- mic_50_90-1.0.0/examples/received_report/README.md +25 -0
- mic_50_90-1.0.0/examples/received_report/certificate.json +113 -0
- mic_50_90-1.0.0/examples/received_report/expected.json +110 -0
- mic_50_90-1.0.0/examples/received_report/laboratory-276-gui.json +80 -0
- mic_50_90-1.0.0/examples/received_report/verify.py +20 -0
- mic_50_90-1.0.0/examples/returned_counts/README.md +3 -0
- mic_50_90-1.0.0/examples/returned_counts/SOURCE.json +48 -0
- mic_50_90-1.0.0/examples/returned_counts/additional-counts.csv +2 -0
- mic_50_90-1.0.0/examples/returned_counts/panels.csv +14 -0
- mic_50_90-1.0.0/examples/returned_counts/summaries.csv +2 -0
- mic_50_90-1.0.0/examples/returned_counts/targets.csv +2 -0
- mic_50_90-1.0.0/examples/sufficient_reporting/README.md +3 -0
- mic_50_90-1.0.0/examples/sufficient_reporting/counts.csv +6 -0
- mic_50_90-1.0.0/examples/sufficient_reporting/panels.csv +6 -0
- mic_50_90-1.0.0/examples/sufficient_reporting/summaries.csv +2 -0
- mic_50_90-1.0.0/examples/sufficient_reporting/targets.csv +4 -0
- mic_50_90-1.0.0/examples/trained_calibration/README.md +16 -0
- mic_50_90-1.0.0/examples/trained_calibration/counts.csv +31 -0
- mic_50_90-1.0.0/examples/trained_calibration/expected.json +26 -0
- mic_50_90-1.0.0/examples/trained_calibration/metadata.json +1 -0
- mic_50_90-1.0.0/examples/trained_calibration/panels.csv +7 -0
- mic_50_90-1.0.0/examples/trained_calibration/roster.csv +13 -0
- mic_50_90-1.0.0/examples/trained_calibration/summaries.csv +3 -0
- mic_50_90-1.0.0/examples/wasserstein_calibration.json +145 -0
- mic_50_90-1.0.0/formal/P6Core.lean +429 -0
- mic_50_90-1.0.0/formal/README.md +46 -0
- mic_50_90-1.0.0/formal/lakefile.toml +11 -0
- mic_50_90-1.0.0/formal/lean-toolchain +1 -0
- mic_50_90-1.0.0/pyproject.toml +130 -0
- mic_50_90-1.0.0/reproducibility/self_test.py +214 -0
- mic_50_90-1.0.0/reproducibility/v1.0.0/joint-distribution-20260930/oracle.py +129 -0
- mic_50_90-1.0.0/reproducibility/v1.0.0/joint-distribution-20260930/production_adapter.py +41 -0
- mic_50_90-1.0.0/schemas/input.schema.json +641 -0
- mic_50_90-1.0.0/schemas/output.schema.json +149 -0
- mic_50_90-1.0.0/scripts/build_release_bundle.py +84 -0
- mic_50_90-1.0.0/scripts/check_release_archives.py +67 -0
- mic_50_90-1.0.0/scripts/generate_cli_reference.py +43 -0
- mic_50_90-1.0.0/scripts/library_closure.py +99 -0
- mic_50_90-1.0.0/scripts/manifest_tools.py +59 -0
- mic_50_90-1.0.0/scripts/package_files.py +45 -0
- mic_50_90-1.0.0/scripts/refresh_package_manifest.py +82 -0
- mic_50_90-1.0.0/scripts/run_external_validation.py +1186 -0
- mic_50_90-1.0.0/scripts/run_stage0_unit_audit.py +362 -0
- mic_50_90-1.0.0/scripts/run_v1_coverage_simulations.py +142 -0
- mic_50_90-1.0.0/scripts/run_v1_stress_test.py +191 -0
- mic_50_90-1.0.0/scripts/verify_manuscript_numbers.py +212 -0
- mic_50_90-1.0.0/scripts/verify_question_closure.py +80 -0
- mic_50_90-1.0.0/scripts/verify_width_identity.py +165 -0
- mic_50_90-1.0.0/scripts/write_campaign_receipts.py +196 -0
- mic_50_90-1.0.0/src/mic_50_90/__init__.py +47 -0
- mic_50_90-1.0.0/src/mic_50_90/__main__.py +5 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/__init__.py +1 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/budget.py +33 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/calibration.py +78 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/contractor.py +83 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/count_partition.py +26 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/dense.py +86 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/endpoint.py +513 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/fast_pairs.py +95 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/helpers.py +18 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/multiple_roots.py +275 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/pairwise.py +586 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/score.py +310 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/tie_witness.py +94 -0
- mic_50_90-1.0.0/src/mic_50_90/_hunter/upper_score.py +60 -0
- mic_50_90-1.0.0/src/mic_50_90/_version.py +1 -0
- mic_50_90-1.0.0/src/mic_50_90/acquisition.py +268 -0
- mic_50_90-1.0.0/src/mic_50_90/analysis.py +519 -0
- mic_50_90-1.0.0/src/mic_50_90/bayes.py +150 -0
- mic_50_90-1.0.0/src/mic_50_90/calibration_audit.py +446 -0
- mic_50_90-1.0.0/src/mic_50_90/calibration_binding.py +56 -0
- mic_50_90-1.0.0/src/mic_50_90/calibration_preparation.py +554 -0
- mic_50_90-1.0.0/src/mic_50_90/censoring.py +76 -0
- mic_50_90-1.0.0/src/mic_50_90/cli.py +198 -0
- mic_50_90-1.0.0/src/mic_50_90/comparability.py +204 -0
- mic_50_90-1.0.0/src/mic_50_90/conformal.py +738 -0
- mic_50_90-1.0.0/src/mic_50_90/count_updates.py +522 -0
- mic_50_90-1.0.0/src/mic_50_90/decision_planning.py +431 -0
- mic_50_90-1.0.0/src/mic_50_90/decision_report.py +209 -0
- mic_50_90-1.0.0/src/mic_50_90/decisions.py +121 -0
- mic_50_90-1.0.0/src/mic_50_90/distribution_decisions.py +100 -0
- mic_50_90-1.0.0/src/mic_50_90/distribution_options.py +33 -0
- mic_50_90-1.0.0/src/mic_50_90/distribution_report.py +297 -0
- mic_50_90-1.0.0/src/mic_50_90/distribution_resolution.py +86 -0
- mic_50_90-1.0.0/src/mic_50_90/distribution_targets.py +88 -0
- mic_50_90-1.0.0/src/mic_50_90/distribution_workflow.py +626 -0
- mic_50_90-1.0.0/src/mic_50_90/dro.py +319 -0
- mic_50_90-1.0.0/src/mic_50_90/empirical.py +581 -0
- mic_50_90-1.0.0/src/mic_50_90/exact_population.py +167 -0
- mic_50_90-1.0.0/src/mic_50_90/file_safety.py +15 -0
- mic_50_90-1.0.0/src/mic_50_90/gui.py +336 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/app.js +421 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/DejaVuSans-Bold.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/DejaVuSans-BoldOblique.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/DejaVuSans-Oblique.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/DejaVuSans.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/FONT_MANIFEST.json +102 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/GUST-FONT-LICENSE.txt +30 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/LICENSE_DEJAVU +99 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/OFL-FAQ.txt +225 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/OFL.txt +103 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/README.md +10 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmunbi.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmunbx.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmunrm.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmunti.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmuntt.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/latinmodern-math.woff +0 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/index.html +98 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/model.js +301 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/report_print.css +21 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/report_view.js +76 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/style.css +15 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_assets/typography.css +21 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_documents.py +142 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_forms.py +398 -0
- mic_50_90-1.0.0/src/mic_50_90/gui_worker.py +144 -0
- mic_50_90-1.0.0/src/mic_50_90/hunter_population.py +114 -0
- mic_50_90-1.0.0/src/mic_50_90/input_context.py +67 -0
- mic_50_90-1.0.0/src/mic_50_90/joint_population.py +836 -0
- mic_50_90-1.0.0/src/mic_50_90/likelihood.py +382 -0
- mic_50_90-1.0.0/src/mic_50_90/model.py +580 -0
- mic_50_90-1.0.0/src/mic_50_90/population.py +360 -0
- mic_50_90-1.0.0/src/mic_50_90/population_acquisition.py +157 -0
- mic_50_90-1.0.0/src/mic_50_90/population_precision.py +59 -0
- mic_50_90-1.0.0/src/mic_50_90/population_questions.py +86 -0
- mic_50_90-1.0.0/src/mic_50_90/py.typed +0 -0
- mic_50_90-1.0.0/src/mic_50_90/range_certificates.py +89 -0
- mic_50_90-1.0.0/src/mic_50_90/range_population.py +312 -0
- mic_50_90-1.0.0/src/mic_50_90/report.py +504 -0
- mic_50_90-1.0.0/src/mic_50_90/report_checks.py +49 -0
- mic_50_90-1.0.0/src/mic_50_90/report_pages.py +259 -0
- mic_50_90-1.0.0/src/mic_50_90/report_status.py +64 -0
- mic_50_90-1.0.0/src/mic_50_90/reporting_report.py +37 -0
- mic_50_90-1.0.0/src/mic_50_90/result_schema.py +22 -0
- mic_50_90-1.0.0/src/mic_50_90/result_view.py +434 -0
- mic_50_90-1.0.0/src/mic_50_90/scenarios.py +122 -0
- mic_50_90-1.0.0/src/mic_50_90/sufficient_reporting.py +181 -0
- mic_50_90-1.0.0/src/mic_50_90/typography.py +70 -0
- mic_50_90-1.0.0/src/mic_50_90/utility.py +249 -0
- mic_50_90-1.0.0/src/mic_50_90/validation.py +97 -0
- mic_50_90-1.0.0/src/mic_50_90/workflows.py +707 -0
- mic_50_90-1.0.0/tests/browser/check_acceptance.cjs +63 -0
- mic_50_90-1.0.0/tests/browser/check_reopened_options.cjs +56 -0
- mic_50_90-1.0.0/tests/browser/check_worked_example.cjs +81 -0
- mic_50_90-1.0.0/tests/fixtures/legacy-calibration-manifests.json +248 -0
- mic_50_90-1.0.0/tests/test_acquisition.py +82 -0
- mic_50_90-1.0.0/tests/test_acquisition_bounds.py +69 -0
- mic_50_90-1.0.0/tests/test_acquisition_oracle.py +119 -0
- mic_50_90-1.0.0/tests/test_acquisition_workflow.py +89 -0
- mic_50_90-1.0.0/tests/test_advanced_validation.py +113 -0
- mic_50_90-1.0.0/tests/test_analysis.py +70 -0
- mic_50_90-1.0.0/tests/test_boundary_geometry.py +45 -0
- mic_50_90-1.0.0/tests/test_bounded_counts.py +111 -0
- mic_50_90-1.0.0/tests/test_bounded_workflow.py +54 -0
- mic_50_90-1.0.0/tests/test_calibration_assessment.py +206 -0
- mic_50_90-1.0.0/tests/test_calibration_endpoint_roundoff.py +81 -0
- mic_50_90-1.0.0/tests/test_calibration_preparation.py +327 -0
- mic_50_90-1.0.0/tests/test_calibration_rank_boundary.py +23 -0
- mic_50_90-1.0.0/tests/test_censoring.py +35 -0
- mic_50_90-1.0.0/tests/test_cli_usability.py +100 -0
- mic_50_90-1.0.0/tests/test_comparability.py +108 -0
- mic_50_90-1.0.0/tests/test_compatible_population_projection.py +175 -0
- mic_50_90-1.0.0/tests/test_completion_review.py +72 -0
- mic_50_90-1.0.0/tests/test_conformal.py +385 -0
- mic_50_90-1.0.0/tests/test_consistency_boundary_contracts.py +116 -0
- mic_50_90-1.0.0/tests/test_consistency_reporting.py +105 -0
- mic_50_90-1.0.0/tests/test_count_updates.py +196 -0
- mic_50_90-1.0.0/tests/test_critical_properties.py +156 -0
- mic_50_90-1.0.0/tests/test_critical_radius_geometry.py +36 -0
- mic_50_90-1.0.0/tests/test_critical_semantics.py +129 -0
- mic_50_90-1.0.0/tests/test_csv_workflows.py +94 -0
- mic_50_90-1.0.0/tests/test_decision_planning.py +182 -0
- mic_50_90-1.0.0/tests/test_decision_reporting.py +142 -0
- mic_50_90-1.0.0/tests/test_decision_workflow.py +237 -0
- mic_50_90-1.0.0/tests/test_distribution_calibration_reporting.py +128 -0
- mic_50_90-1.0.0/tests/test_distribution_range_questions.py +204 -0
- mic_50_90-1.0.0/tests/test_distribution_resolution.py +103 -0
- mic_50_90-1.0.0/tests/test_distribution_workflow.py +342 -0
- mic_50_90-1.0.0/tests/test_empirical.py +145 -0
- mic_50_90-1.0.0/tests/test_exact_population.py +124 -0
- mic_50_90-1.0.0/tests/test_final_review_regressions.py +56 -0
- mic_50_90-1.0.0/tests/test_gui_backend.py +384 -0
- mic_50_90-1.0.0/tests/test_gui_censoring.cjs +17 -0
- mic_50_90-1.0.0/tests/test_gui_context.cjs +53 -0
- mic_50_90-1.0.0/tests/test_gui_input_repairs.py +145 -0
- mic_50_90-1.0.0/tests/test_gui_integration.py +23 -0
- mic_50_90-1.0.0/tests/test_gui_plain_entry.cjs +41 -0
- mic_50_90-1.0.0/tests/test_gui_saved_inputs.cjs +100 -0
- mic_50_90-1.0.0/tests/test_gui_scientific_input.cjs +96 -0
- mic_50_90-1.0.0/tests/test_gui_source_scale.cjs +31 -0
- mic_50_90-1.0.0/tests/test_gui_usability.cjs +40 -0
- mic_50_90-1.0.0/tests/test_hunter_adapter.py +153 -0
- mic_50_90-1.0.0/tests/test_hunter_audit_safety.py +197 -0
- mic_50_90-1.0.0/tests/test_hunter_budget.py +51 -0
- mic_50_90-1.0.0/tests/test_hunter_count_partition.py +26 -0
- mic_50_90-1.0.0/tests/test_hunter_independent_boundaries.py +115 -0
- mic_50_90-1.0.0/tests/test_hunter_multiple_roots.py +117 -0
- mic_50_90-1.0.0/tests/test_hunter_package.py +94 -0
- mic_50_90-1.0.0/tests/test_interval_observations.py +69 -0
- mic_50_90-1.0.0/tests/test_interval_scale_targets.py +151 -0
- mic_50_90-1.0.0/tests/test_joint_certificates.py +164 -0
- mic_50_90-1.0.0/tests/test_joint_independent.py +170 -0
- mic_50_90-1.0.0/tests/test_joint_population.py +108 -0
- mic_50_90-1.0.0/tests/test_laboratory_explanations.py +86 -0
- mic_50_90-1.0.0/tests/test_likelihood.py +89 -0
- mic_50_90-1.0.0/tests/test_likelihood_precision.py +128 -0
- mic_50_90-1.0.0/tests/test_lp_properties.py +99 -0
- mic_50_90-1.0.0/tests/test_new_workflow_integration.py +103 -0
- mic_50_90-1.0.0/tests/test_numerical_audit_regressions.py +111 -0
- mic_50_90-1.0.0/tests/test_optional_failure_isolation.py +50 -0
- mic_50_90-1.0.0/tests/test_panel_conventions.py +119 -0
- mic_50_90-1.0.0/tests/test_population.py +53 -0
- mic_50_90-1.0.0/tests/test_population_acquisition.py +106 -0
- mic_50_90-1.0.0/tests/test_population_budget.py +43 -0
- mic_50_90-1.0.0/tests/test_population_question_search.py +135 -0
- mic_50_90-1.0.0/tests/test_population_resolution.py +109 -0
- mic_50_90-1.0.0/tests/test_population_task_assessment.py +92 -0
- mic_50_90-1.0.0/tests/test_practical_context.py +133 -0
- mic_50_90-1.0.0/tests/test_probability_certificates.py +68 -0
- mic_50_90-1.0.0/tests/test_question_scaling.py +44 -0
- mic_50_90-1.0.0/tests/test_range_population.py +231 -0
- mic_50_90-1.0.0/tests/test_range_witnesses.py +72 -0
- mic_50_90-1.0.0/tests/test_release_contract.py +134 -0
- mic_50_90-1.0.0/tests/test_release_publisher.py +198 -0
- mic_50_90-1.0.0/tests/test_release_recovery.py +66 -0
- mic_50_90-1.0.0/tests/test_release_test_evidence.py +65 -0
- mic_50_90-1.0.0/tests/test_repair_file_safety.py +102 -0
- mic_50_90-1.0.0/tests/test_repair_input_semantics.py +186 -0
- mic_50_90-1.0.0/tests/test_repair_numerical_postconditions.py +50 -0
- mic_50_90-1.0.0/tests/test_report_completeness.py +78 -0
- mic_50_90-1.0.0/tests/test_report_interface_consistency.py +128 -0
- mic_50_90-1.0.0/tests/test_report_pagination.py +264 -0
- mic_50_90-1.0.0/tests/test_report_typography.py +87 -0
- mic_50_90-1.0.0/tests/test_result_chart_semantics.py +43 -0
- mic_50_90-1.0.0/tests/test_result_explanations.py +133 -0
- mic_50_90-1.0.0/tests/test_result_guidance.py +84 -0
- mic_50_90-1.0.0/tests/test_retained_functions.py +63 -0
- mic_50_90-1.0.0/tests/test_revision_review.py +79 -0
- mic_50_90-1.0.0/tests/test_scenarios.py +72 -0
- mic_50_90-1.0.0/tests/test_schemas_v1.py +17 -0
- mic_50_90-1.0.0/tests/test_software_release.py +111 -0
- mic_50_90-1.0.0/tests/test_sufficient_reporting.py +98 -0
- mic_50_90-1.0.0/tests/test_sufficient_reporting_workflow.py +63 -0
- mic_50_90-1.0.0/tests/test_surgical_repairs.py +157 -0
- mic_50_90-1.0.0/tests/test_trained_calibration.py +207 -0
- mic_50_90-1.0.0/tests/test_usability_backend.py +180 -0
- mic_50_90-1.0.0/tests/test_user_workflow_repairs.py +169 -0
- mic_50_90-1.0.0/tests/test_verifier_repairs.py +278 -0
- mic_50_90-1.0.0/tests/test_windows_licence.py +61 -0
- mic_50_90-1.0.0/tools/build_windows.py +82 -0
- mic_50_90-1.0.0/tools/check_browser.py +77 -0
- mic_50_90-1.0.0/tools/check_interfaces.py +174 -0
- mic_50_90-1.0.0/tools/check_platforms.py +100 -0
- mic_50_90-1.0.0/tools/check_release_tests.py +67 -0
- mic_50_90-1.0.0/tools/check_windows_release.py +115 -0
- mic_50_90-1.0.0/tools/desktop_launcher.py +7 -0
- mic_50_90-1.0.0/tools/prepare_browser_fixtures.py +26 -0
- mic_50_90-1.0.0/tools/print_reports.cjs +35 -0
- mic_50_90-1.0.0/tools/publish_software_release.py +212 -0
- mic_50_90-1.0.0/tools/recover_software_release.py +130 -0
- mic_50_90-1.0.0/tools/replay_companion.py +104 -0
- mic_50_90-1.0.0/tools/software_release.py +168 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
name: Build and publish software
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
release_tag:
|
|
7
|
+
description: Version 1.0.0 tag (optionally with a release label)
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
default: v1.0.0
|
|
11
|
+
publish_pypi:
|
|
12
|
+
description: Publish to PyPI using an already configured trusted publisher
|
|
13
|
+
required: true
|
|
14
|
+
type: boolean
|
|
15
|
+
default: false
|
|
16
|
+
|
|
17
|
+
permissions:
|
|
18
|
+
contents: read
|
|
19
|
+
|
|
20
|
+
concurrency:
|
|
21
|
+
group: software-release-1.0.0
|
|
22
|
+
cancel-in-progress: false
|
|
23
|
+
|
|
24
|
+
env:
|
|
25
|
+
RELEASE_TAG: ${{ inputs.release_tag }}
|
|
26
|
+
|
|
27
|
+
jobs:
|
|
28
|
+
test:
|
|
29
|
+
if: github.ref == 'refs/heads/main'
|
|
30
|
+
runs-on: ${{ matrix.os }}
|
|
31
|
+
timeout-minutes: 30
|
|
32
|
+
strategy:
|
|
33
|
+
fail-fast: false
|
|
34
|
+
matrix:
|
|
35
|
+
os: [ubuntu-latest, windows-latest]
|
|
36
|
+
python: ['3.11', '3.12', '3.13']
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v4
|
|
39
|
+
- uses: actions/setup-python@v5
|
|
40
|
+
with:
|
|
41
|
+
python-version: ${{ matrix.python }}
|
|
42
|
+
- uses: actions/setup-node@v4
|
|
43
|
+
with:
|
|
44
|
+
node-version: '22'
|
|
45
|
+
- run: python -m pip install '.[test]' build
|
|
46
|
+
- name: Test Python behaviour
|
|
47
|
+
run: python -m pytest --junitxml=test-results.xml
|
|
48
|
+
- name: Test form behaviour
|
|
49
|
+
run: node --test "tests/*.cjs"
|
|
50
|
+
- uses: actions/upload-artifact@v4
|
|
51
|
+
if: always()
|
|
52
|
+
with:
|
|
53
|
+
name: verification-${{ matrix.os }}-${{ matrix.python }}
|
|
54
|
+
overwrite: true
|
|
55
|
+
path: test-results.xml
|
|
56
|
+
if-no-files-found: error
|
|
57
|
+
|
|
58
|
+
packages:
|
|
59
|
+
if: github.ref == 'refs/heads/main'
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
timeout-minutes: 20
|
|
62
|
+
steps:
|
|
63
|
+
- uses: actions/checkout@v4
|
|
64
|
+
- uses: actions/setup-python@v5
|
|
65
|
+
with:
|
|
66
|
+
python-version: '3.12'
|
|
67
|
+
- run: python -m pip install build twine
|
|
68
|
+
- name: Build and inspect distributions
|
|
69
|
+
run: |
|
|
70
|
+
python -c 'import os, sys; sys.path.insert(0, "tools"); from publish_software_release import validate_tag; validate_tag(os.environ["RELEASE_TAG"])'
|
|
71
|
+
python -m build --outdir release
|
|
72
|
+
python -m twine check --strict release/*
|
|
73
|
+
python tools/software_release.py source --output release/MIC-50-90-1.0.0-software-source.zip
|
|
74
|
+
python tools/software_release.py check release/*
|
|
75
|
+
- name: Install both distributions outside the checkout
|
|
76
|
+
run: python scripts/check_release_archives.py release --receipt release/CLI-install-check.json
|
|
77
|
+
- name: Build and smoke-test the optional Docker environment
|
|
78
|
+
run: |
|
|
79
|
+
docker build -t mic-50-90:1.0.0 .
|
|
80
|
+
docker run --rm mic-50-90:1.0.0 bash -euo pipefail -c 'node --version; uv pip check; python reproducibility/self_test.py; python scripts/refresh_package_manifest.py --check'
|
|
81
|
+
python -c 'import json, os; from pathlib import Path; Path("release/Docker-runtime-check.json").write_text(json.dumps({"status": "passed", "source_commit": os.environ["GITHUB_SHA"], "image": "mic-50-90:1.0.0", "checks": ["node", "dependencies", "offline_self_test", "source_manifest"]}, indent=2) + "\n", encoding="utf-8")'
|
|
82
|
+
- uses: actions/upload-artifact@v4
|
|
83
|
+
with:
|
|
84
|
+
name: software-packages
|
|
85
|
+
overwrite: true
|
|
86
|
+
path: release/*
|
|
87
|
+
if-no-files-found: error
|
|
88
|
+
|
|
89
|
+
windows:
|
|
90
|
+
if: github.ref == 'refs/heads/main'
|
|
91
|
+
runs-on: windows-latest
|
|
92
|
+
timeout-minutes: 30
|
|
93
|
+
steps:
|
|
94
|
+
- uses: actions/checkout@v4
|
|
95
|
+
- uses: actions/setup-python@v5
|
|
96
|
+
with:
|
|
97
|
+
python-version: '3.12'
|
|
98
|
+
- uses: actions/setup-node@v4
|
|
99
|
+
with:
|
|
100
|
+
node-version: '22'
|
|
101
|
+
- run: python -m pip install . pyinstaller
|
|
102
|
+
- name: Build Windows application
|
|
103
|
+
run: python tools/build_windows.py --output windows-build
|
|
104
|
+
- name: Run the packaged application and compare it with CLI
|
|
105
|
+
run: python tools/check_windows_release.py --application windows-build/application/MIC-50-90/MIC-50-90.exe --receipt release/Windows-runtime-check.json
|
|
106
|
+
- run: npm install --no-save playwright
|
|
107
|
+
- run: npx playwright install chromium
|
|
108
|
+
- name: Test the packaged form in Chromium
|
|
109
|
+
run: python tools/check_browser.py --application windows-build/application/MIC-50-90/MIC-50-90.exe --output browser-check
|
|
110
|
+
- name: Package the tested Windows application
|
|
111
|
+
run: python tools/software_release.py windows --application windows-build/application/MIC-50-90 --output release/MIC-50-90-1.0.0-Windows-x64.zip
|
|
112
|
+
- name: Include Windows verification receipts
|
|
113
|
+
run: |
|
|
114
|
+
Copy-Item -LiteralPath windows-build/BUILD_RECEIPT.json -Destination release/Windows-build-receipt.json
|
|
115
|
+
Copy-Item -LiteralPath browser-check/REOPENED_OPTIONS.json -Destination release/Windows-browser-check.json
|
|
116
|
+
- uses: actions/upload-artifact@v4
|
|
117
|
+
with:
|
|
118
|
+
name: software-windows
|
|
119
|
+
overwrite: true
|
|
120
|
+
path: release/*
|
|
121
|
+
if-no-files-found: error
|
|
122
|
+
|
|
123
|
+
publish:
|
|
124
|
+
needs: [test, packages, windows]
|
|
125
|
+
if: github.ref == 'refs/heads/main'
|
|
126
|
+
runs-on: ubuntu-latest
|
|
127
|
+
timeout-minutes: 15
|
|
128
|
+
permissions:
|
|
129
|
+
contents: write
|
|
130
|
+
steps:
|
|
131
|
+
- uses: actions/checkout@v4
|
|
132
|
+
- uses: actions/setup-python@v5
|
|
133
|
+
with:
|
|
134
|
+
python-version: '3.12'
|
|
135
|
+
- uses: actions/download-artifact@v4
|
|
136
|
+
with:
|
|
137
|
+
pattern: software-*
|
|
138
|
+
path: release
|
|
139
|
+
merge-multiple: true
|
|
140
|
+
- uses: actions/download-artifact@v4
|
|
141
|
+
with:
|
|
142
|
+
pattern: verification-*
|
|
143
|
+
path: verification
|
|
144
|
+
- name: Record tests and inspect the complete release
|
|
145
|
+
run: |
|
|
146
|
+
python tools/check_release_tests.py verification --receipt release/TEST_MATRIX_VERIFICATION.json
|
|
147
|
+
python -c 'import sys; from pathlib import Path; sys.path.insert(0, "tools"); from publish_software_release import pack_test_evidence; pack_test_evidence(Path("verification"), Path("release/Software-test-results.zip"))'
|
|
148
|
+
python tools/software_release.py manifest --directory release --commit "$GITHUB_SHA" --run-url "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
|
|
149
|
+
- name: Publish verified assets using the Actions token
|
|
150
|
+
env:
|
|
151
|
+
GH_TOKEN: ${{ github.token }}
|
|
152
|
+
run: python tools/publish_software_release.py --directory release --tag "$RELEASE_TAG"
|
|
153
|
+
- uses: actions/upload-artifact@v4
|
|
154
|
+
if: always()
|
|
155
|
+
with:
|
|
156
|
+
name: release-verification
|
|
157
|
+
overwrite: true
|
|
158
|
+
path: |
|
|
159
|
+
release/SOFTWARE_MANIFEST.json
|
|
160
|
+
release/SHA256SUMS.txt
|
|
161
|
+
RELEASE_PUBLICATION.json
|
|
162
|
+
|
|
163
|
+
pypi:
|
|
164
|
+
needs: publish
|
|
165
|
+
if: inputs.publish_pypi && github.ref == 'refs/heads/main'
|
|
166
|
+
runs-on: ubuntu-latest
|
|
167
|
+
environment: pypi
|
|
168
|
+
permissions:
|
|
169
|
+
contents: read
|
|
170
|
+
id-token: write
|
|
171
|
+
steps:
|
|
172
|
+
- uses: actions/download-artifact@v4
|
|
173
|
+
with:
|
|
174
|
+
name: software-packages
|
|
175
|
+
path: packages
|
|
176
|
+
- name: Select Python distributions
|
|
177
|
+
run: |
|
|
178
|
+
mkdir dist
|
|
179
|
+
cp packages/*.whl packages/*.tar.gz dist/
|
|
180
|
+
- name: Publish to PyPI
|
|
181
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
name: tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
test:
|
|
9
|
+
runs-on: ${{ matrix.os }}
|
|
10
|
+
strategy:
|
|
11
|
+
matrix:
|
|
12
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
13
|
+
os: [ubuntu-latest, windows-latest]
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: ${{ matrix.python-version }}
|
|
19
|
+
- uses: actions/setup-node@v4
|
|
20
|
+
with:
|
|
21
|
+
node-version: '22'
|
|
22
|
+
- run: python -m pip install --upgrade pip
|
|
23
|
+
- run: python -m pip install build
|
|
24
|
+
- name: Build distributions
|
|
25
|
+
run: python -m build
|
|
26
|
+
- name: Install and exercise wheel and source archive outside checkout
|
|
27
|
+
run: python scripts/check_release_archives.py dist --receipt archive-check.json
|
|
28
|
+
- name: Test the installed wheel
|
|
29
|
+
shell: bash
|
|
30
|
+
run: |
|
|
31
|
+
python -m pip install "$(find dist -name '*.whl' -print -quit)[test]"
|
|
32
|
+
python -m pytest --cov=mic_50_90 --cov-report=term-missing --cov-report=xml
|
|
33
|
+
- name: Test form model
|
|
34
|
+
run: node --test "tests/*.cjs"
|
|
35
|
+
- name: Exercise saved options in the real browser
|
|
36
|
+
if: matrix.python-version == '3.12'
|
|
37
|
+
run: |
|
|
38
|
+
npm install --no-save playwright
|
|
39
|
+
npx playwright install chromium
|
|
40
|
+
python tools/check_browser.py --output browser-check
|
|
41
|
+
- uses: actions/upload-artifact@v4
|
|
42
|
+
if: always()
|
|
43
|
+
with:
|
|
44
|
+
name: checks-${{ matrix.os }}-${{ matrix.python-version }}
|
|
45
|
+
path: |
|
|
46
|
+
archive-check.json
|
|
47
|
+
coverage.xml
|
|
48
|
+
browser-check/REOPENED_OPTIONS.json
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
.pytest_cache/
|
|
5
|
+
.coverage
|
|
6
|
+
htmlcov/
|
|
7
|
+
build/
|
|
8
|
+
# The directory, not its contents: git cannot re-include a file inside an excluded
|
|
9
|
+
# directory, and the repository root deliberately keeps the two release artefacts that
|
|
10
|
+
# scripts/build_release_bundle.py requires. Without these negations the root's decision
|
|
11
|
+
# has no effect and a fresh clone cannot build the bundle.
|
|
12
|
+
dist/*
|
|
13
|
+
!dist/mic_50_90-1.0.0-py3-none-any.whl
|
|
14
|
+
!dist/mic_50_90-1.0.0.tar.gz
|
|
15
|
+
*.egg-info/
|
|
16
|
+
data/raw/*.xlsx
|
|
17
|
+
data/processed/*.parquet
|
|
18
|
+
data/processed/*.tmp
|
|
19
|
+
results/qa/
|
|
20
|
+
manuscript/rendered/
|
|
21
|
+
.v/
|
|
22
|
+
.hypothesis/
|
|
23
|
+
coverage.xml
|
|
24
|
+
.superpowers/
|
|
25
|
+
.ruff_cache/
|
|
26
|
+
.playwright-cli/
|
|
27
|
+
|
|
28
|
+
# Obtained directly from the publisher; verified by the fetch helper.
|
|
29
|
+
/tools/publication/template/softwarex-osp-template-v6.docx
|
|
30
|
+
|
|
31
|
+
# Editorial documents are maintained outside the public software repository.
|
|
32
|
+
/manuscript/
|
|
33
|
+
/Article/
|
|
34
|
+
/Supplementary-Appendices/
|
|
35
|
+
/Technical-Archive/
|
|
36
|
+
/tools/publication/
|
|
37
|
+
**/MIC-50-90-main-*
|
|
38
|
+
**/MIC-50-90-*-Appendix-*
|
|
39
|
+
**/appendix_*_claims_*.json
|
|
40
|
+
**/manuscript_claims_*.json
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"upload_type": "software",
|
|
3
|
+
"title": "MIC-50-90: Software for incomplete MIC distributions and laboratory reporting",
|
|
4
|
+
"description": "<p><strong>MIC-50-90 1.0.0</strong> combines MIC50/MIC90, observed extremes, exact or bounded counts and explicitly rounded percentages to describe MIC distributions compatible with incomplete laboratory reports. The Windows application and command line produce graphical HTML reports, CSV/JSON results and reusable settings.</p><p>Users can distinguish missing counts from measurement censoring, update the same collection with additional counts, select concentration groups at a requested precision, and prepare a sufficient laboratory report for independent checking. Sample identification, population confidence under independent observations from the same distribution, and calibration for exchangeable study units have separate assumptions.</p><p>This deposit contains software, tests, formal algebra, example inputs, user documentation, build instructions and checksums. It excludes the manuscript, supplementary appendices and editorial figures. MIT applies to the software; example data and bundled fonts retain their own attributed terms.</p>",
|
|
5
|
+
"creators": [
|
|
6
|
+
{
|
|
7
|
+
"name": "Kochanowski, Maciej",
|
|
8
|
+
"orcid": "0000-0002-9982-3028",
|
|
9
|
+
"affiliation": "Department of Bacteriology and Bacterial Diseases, National Veterinary Research Institute, 57 Partyzantów Avenue, 24-100 Puławy, Poland"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"access_right": "open",
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"keywords": [
|
|
16
|
+
"antimicrobial resistance",
|
|
17
|
+
"minimum inhibitory concentration",
|
|
18
|
+
"incomplete reporting",
|
|
19
|
+
"partial identification",
|
|
20
|
+
"simultaneous confidence",
|
|
21
|
+
"research software"
|
|
22
|
+
],
|
|
23
|
+
"language": "eng"
|
|
24
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# MIC-50-90 1.0.0 release contents
|
|
2
|
+
|
|
3
|
+
The local release provides the following supported workflows:
|
|
4
|
+
|
|
5
|
+
- Input from MIC summaries, panel definitions, exact or bounded counts, and explicitly rounded percentages.
|
|
6
|
+
- Sharp compatible sample-count ranges, including reporting variants and interval-recorded MIC measurements.
|
|
7
|
+
- Separate iid population inference and calibrated study-unit inference, with stated assumptions and numerical status.
|
|
8
|
+
- Certified selected-table calculations for eligible population endpoints, backed by the stated proofs and Lean 4 algebraic formalization.
|
|
9
|
+
- Cost-aware additional-count planning, sufficient laboratory reporting, and recipient verification.
|
|
10
|
+
- Saved same-sample updates that preserve previously confirmed information.
|
|
11
|
+
- An English local Windows application and installed CLI, with explanatory HTML, CSV/JSON records and SVG/PNG/PDF exports.
|
|
12
|
+
- Software usage guides, example inputs, test suites, formal proof sources and build instructions.
|
|
13
|
+
|
|
14
|
+
The supplied manifest identifies this exact 1.0.0 software package. Consult
|
|
15
|
+
`PACKAGE_STATUS.json` for the release location and the Actions verification assets
|
|
16
|
+
for execution evidence. Statistical guarantees, numerical precision, formalized
|
|
17
|
+
algebra and engineering checks have separate scopes.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use MIC-50-90, cite this software using the metadata below."
|
|
3
|
+
title: "MIC-50-90: Software for incomplete MIC distributions and laboratory reporting"
|
|
4
|
+
type: software
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
repository-code: "https://github.com/maciejkochanowski/mic-50-90"
|
|
7
|
+
license: MIT
|
|
8
|
+
authors:
|
|
9
|
+
- family-names: Kochanowski
|
|
10
|
+
given-names: Maciej
|
|
11
|
+
orcid: "https://orcid.org/0000-0002-9982-3028"
|
|
12
|
+
affiliation: "Department of Bacteriology and Bacterial Diseases, National Veterinary Research Institute, 57 Partyzantów Avenue, 24-100 Puławy, Poland"
|
|
13
|
+
email: "maciej.kochanowski@piwet.pulawy.pl"
|
|
14
|
+
keywords:
|
|
15
|
+
- antimicrobial resistance
|
|
16
|
+
- minimum inhibitory concentration
|
|
17
|
+
- partial identification
|
|
18
|
+
- order statistics
|
|
19
|
+
date-released: "2026-10-07"
|
|
20
|
+
url: "https://github.com/maciejkochanowski/mic-50-90/releases/tag/v1.0.0"
|
mic_50_90-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, MIC-50-90 contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Scientific scope
|
|
2
|
+
|
|
3
|
+
MIC-50-90 1.0.0 is research software for incomplete MIC summaries and reporting audits.
|
|
4
|
+
|
|
5
|
+
Sharp finite-sample bounds are conditional on the correctness of the supplied panel, ranks, summaries and category semantics. They require no sampling model, but incorrect metadata can invalidate their interpretation. The iid population layer additionally requires iid sampling. The calibrated layer requires exchangeable study units and a reference/score protocol matching manifest 1.2; a global fallback is not a group-conditional guarantee.
|
|
6
|
+
|
|
7
|
+
A calibrated tail-containment event does not establish that the whole true distribution is in a Wasserstein ball. Complete category counts do not determine concentrations inside censored intervals. Assumption scenarios remain distinct from all three inferential layers.
|
|
8
|
+
|
|
9
|
+
The program does not infer clinical breakpoints, classify individual susceptibility or recommend treatment. It requires only aggregate information; identifiable patient records are unnecessary.
|
|
10
|
+
|
|
11
|
+
# Bundled typography
|
|
12
|
+
|
|
13
|
+
The desktop and exported reports embed web-font derivatives of CMU Serif,
|
|
14
|
+
CMU Typewriter, Latin Modern Math and DejaVu Sans. Their glyph outlines and
|
|
15
|
+
metrics match the source fonts used for the supplementary documents and plots.
|
|
16
|
+
The renamed MIC Web faces retain their original copyright notices. Font
|
|
17
|
+
licences and the source-to-web-file SHA-256 manifest are included in
|
|
18
|
+
`mic_50_90/gui_assets/fonts/`. These fonts require no system installation.
|
mic_50_90-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: mic-50-90
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Distribution bounds and reporting tools for incomplete MIC data
|
|
5
|
+
Project-URL: Documentation, https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/GUI_GUIDE.md
|
|
6
|
+
Project-URL: Download, https://github.com/maciejkochanowski/mic-50-90/releases/tag/v1.0.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/maciejkochanowski/mic-50-90
|
|
8
|
+
Project-URL: Repository, https://github.com/maciejkochanowski/mic-50-90
|
|
9
|
+
Project-URL: Issues, https://github.com/maciejkochanowski/mic-50-90/issues
|
|
10
|
+
Author-email: Maciej Kochanowski <maciej.kochanowski@piwet.pulawy.pl>
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: AMR,MIC,Wasserstein,order statistics,partial identification
|
|
14
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Medical Science Apps.
|
|
23
|
+
Classifier: Typing :: Typed
|
|
24
|
+
Requires-Python: >=3.11
|
|
25
|
+
Requires-Dist: numpy>=1.26
|
|
26
|
+
Requires-Dist: scipy>=1.13
|
|
27
|
+
Provides-Extra: all
|
|
28
|
+
Requires-Dist: curl-cffi>=0.7; extra == 'all'
|
|
29
|
+
Requires-Dist: duckdb>=1.1; extra == 'all'
|
|
30
|
+
Requires-Dist: hypothesis>=6.110; extra == 'all'
|
|
31
|
+
Requires-Dist: ipykernel>=6.29; extra == 'all'
|
|
32
|
+
Requires-Dist: jsonschema>=4.22; extra == 'all'
|
|
33
|
+
Requires-Dist: lxml>=5.3; extra == 'all'
|
|
34
|
+
Requires-Dist: matplotlib>=3.8; extra == 'all'
|
|
35
|
+
Requires-Dist: nbclient>=0.10; extra == 'all'
|
|
36
|
+
Requires-Dist: nbformat>=5.10; extra == 'all'
|
|
37
|
+
Requires-Dist: openpyxl>=3.1; extra == 'all'
|
|
38
|
+
Requires-Dist: pandas>=2.2; extra == 'all'
|
|
39
|
+
Requires-Dist: pyarrow>=17; extra == 'all'
|
|
40
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'all'
|
|
41
|
+
Requires-Dist: pytest>=8.2; extra == 'all'
|
|
42
|
+
Requires-Dist: python-docx>=1.1; extra == 'all'
|
|
43
|
+
Provides-Extra: benchmark
|
|
44
|
+
Requires-Dist: curl-cffi>=0.7; extra == 'benchmark'
|
|
45
|
+
Requires-Dist: duckdb>=1.1; extra == 'benchmark'
|
|
46
|
+
Requires-Dist: ipykernel>=6.29; extra == 'benchmark'
|
|
47
|
+
Requires-Dist: lxml>=5.3; extra == 'benchmark'
|
|
48
|
+
Requires-Dist: matplotlib>=3.8; extra == 'benchmark'
|
|
49
|
+
Requires-Dist: nbclient>=0.10; extra == 'benchmark'
|
|
50
|
+
Requires-Dist: nbformat>=5.10; extra == 'benchmark'
|
|
51
|
+
Requires-Dist: openpyxl>=3.1; extra == 'benchmark'
|
|
52
|
+
Requires-Dist: pandas>=2.2; extra == 'benchmark'
|
|
53
|
+
Requires-Dist: pyarrow>=17; extra == 'benchmark'
|
|
54
|
+
Requires-Dist: python-docx>=1.1; extra == 'benchmark'
|
|
55
|
+
Provides-Extra: test
|
|
56
|
+
Requires-Dist: duckdb>=1.1; extra == 'test'
|
|
57
|
+
Requires-Dist: hypothesis>=6.110; extra == 'test'
|
|
58
|
+
Requires-Dist: jsonschema>=4.22; extra == 'test'
|
|
59
|
+
Requires-Dist: pandas>=2.2; extra == 'test'
|
|
60
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'test'
|
|
61
|
+
Requires-Dist: pytest>=8.2; extra == 'test'
|
|
62
|
+
Description-Content-Type: text/markdown
|
|
63
|
+
|
|
64
|
+
# MIC-50-90 1.0.0
|
|
65
|
+
|
|
66
|
+
MIC-50-90 is research software for describing MIC distributions from incomplete laboratory reports. It combines MIC50/MIC90, observed extremes, exact or interval counts, and explicitly rounded percentages to show the smallest and largest category shares compatible with the reported information. A local Windows application, Python command line and Python interface support the same calculation workflows.
|
|
67
|
+
|
|
68
|
+
Use it to interpret an unreported concentration range, distinguish missing counts from measurement censoring, determine which additional counts would resolve a question, or prepare a short laboratory report whose conclusions a recipient can verify. Inputs refer to the same original isolates and retain their denominator, panel, units and reporting convention.
|
|
69
|
+
|
|
70
|
+
## Install and start
|
|
71
|
+
|
|
72
|
+
**Windows application:** download the portable Windows archive from the [version 1.0.0 software release](https://github.com/maciejkochanowski/mic-50-90/releases/tag/v1.0.0), extract it, and open `MIC-50-90.exe`. Keep the `_internal` folder beside the executable. Python is included. The application opens a guided form in your browser and performs calculations locally. Use **Quit application** to stop it.
|
|
73
|
+
|
|
74
|
+
**Python:** use Python 3.11–3.13 in a separate environment. Install version 1.0.0 from PyPI:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
python -m pip install mic-50-90==1.0.0
|
|
78
|
+
mic-50-90 gui
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Alternatively, download the verified wheel from the software release and install it with `python -m pip install mic_50_90-1.0.0-py3-none-any.whl`.
|
|
82
|
+
|
|
83
|
+
To inspect the command-line interface:
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
mic-50-90 --help
|
|
87
|
+
mic-50-90 distribution --help
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Download the source archive for the example inputs, schemas and documentation. From its extracted directory, run:
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
mic-50-90 distribution examples/distribution/summaries.json --precision-pp 10 --output-dir output/distribution
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Open the generated `report.html`. Reports also provide CSV/JSON results and reusable input settings. The wheel installs the application and library; the software source release supplies the tests, formal checks, examples and user documentation.
|
|
97
|
+
|
|
98
|
+
## Choose the inference you need
|
|
99
|
+
|
|
100
|
+
| Question | Result | Requirements |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| What follows about these isolates? | Sharp finite-sample bounds over the distributions compatible with the report | Truthful summaries, ranks, panel geometry and category definitions |
|
|
103
|
+
| What follows about the source population? | Simultaneous confidence bounds accounting for incomplete reporting and sampling uncertainty | Independent observations from the same distribution, a declared population and confidence level |
|
|
104
|
+
| What is covered for a new study unit? | Calibrated bounds for the quantities in the declared protocol | Exchangeable study units and a matching reference, score, unit and calibration contract |
|
|
105
|
+
|
|
106
|
+
These layers answer different questions. Complete category counts can still leave concentrations uncertain inside measurement intervals. Optional likelihood, Bayesian, entropy and reference-based analyses report their additional assumptions. Incomplete numerical searches retain valid available bounds and their explicit completion status.
|
|
107
|
+
|
|
108
|
+
## Practical workflows
|
|
109
|
+
|
|
110
|
+
- Analyse published MIC summaries or counts, including several declared rank interpretations when necessary.
|
|
111
|
+
- Add a count from the original collection and update the analysis while preserving previous truthful information.
|
|
112
|
+
- Select contiguous concentration groups at a requested sample or population precision.
|
|
113
|
+
- Plan one request or successive requests for additional counts, with explicit permitted questions and costs.
|
|
114
|
+
- Select sufficient counts from a complete histogram so a recipient can verify the stated sample conclusions.
|
|
115
|
+
- Prepare and assess study-unit calibration with its own reference and sampling requirements.
|
|
116
|
+
|
|
117
|
+
The main mathematical result gives a checkable P6 endpoint-attainment condition: when it holds, a selected family of compatible count tables attains the same population-range endpoints as considering every compatible table for the fixed confidence construction. Written proofs, independent numerical checks and 29 Lean-checked algebraic declarations have distinct roles; the Lean development does not certify the entire program or all statistical assumptions.
|
|
118
|
+
|
|
119
|
+
## Documentation and checks
|
|
120
|
+
|
|
121
|
+
### What the repository contains
|
|
122
|
+
|
|
123
|
+
| Folder | Purpose |
|
|
124
|
+
|---|---|
|
|
125
|
+
| `src` | Calculation engine, CLI, Windows application and report resources |
|
|
126
|
+
| `tests` | Automated checks of calculations, input handling and interfaces |
|
|
127
|
+
| `tools` and `.github/workflows` | Build, test and publish the software packages |
|
|
128
|
+
| `docs` and `schemas` | Installation, usage, input formats and output definitions |
|
|
129
|
+
| `examples` and `data` | Small example inputs, source attribution and data terms |
|
|
130
|
+
| `formal` and `reproducibility` | Formal algebra and independent checks of the implemented calculations |
|
|
131
|
+
| `scripts` | Software integrity, reference calculations and validation utilities |
|
|
132
|
+
|
|
133
|
+
The Windows application and CLI use the same calculation engine. Cluster job submissions and article-production files are maintained outside this repository.
|
|
134
|
+
|
|
135
|
+
- [Windows user guide](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/GUI_GUIDE.md): installation, data entry, saved analyses and reports.
|
|
136
|
+
- [Distribution guide](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/distribution-user-guide.md): an end-to-end CLI analysis and interpretation.
|
|
137
|
+
- [CLI reference](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/CLI_REFERENCE.md): every command and option.
|
|
138
|
+
- [Python interface](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/PYTHON_INTERFACE.md): callable analysis functions and update contracts.
|
|
139
|
+
- [Report contents](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/REPORT_CONTENTS.md): results, numerical checks and exports.
|
|
140
|
+
- [Public functions](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/PUBLIC_FUNCTIONS.md): tasks, implementation and independent checks.
|
|
141
|
+
- [Reproducing software checks](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/REPRODUCING_RESULTS.md) and [formal algebra](https://github.com/maciejkochanowski/mic-50-90/blob/main/formal/README.md).
|
|
142
|
+
|
|
143
|
+
The GitHub Actions workflow tests installed packages on Windows and Linux with Python 3.11–3.13. The release workflow builds the Python and Windows packages, checks their contents and attaches only software assets. Consult the completed Actions run and the release checksums for the exact distributed files.
|
|
144
|
+
|
|
145
|
+
Manuscripts, supplementary appendices and editorial figures are maintained separately. They are not included in this repository, its software release assets, or a software deposit generated from this repository. [Distribution policy](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/DISTRIBUTION_POLICY.md).
|
|
146
|
+
|
|
147
|
+
## Scientific scope and licence
|
|
148
|
+
|
|
149
|
+
MIC-50-90 supports research and reporting audits. It does not infer clinical breakpoints, classify individual susceptibility or recommend treatment. Results depend on correct metadata and the assumptions attached to the chosen inference layer.
|
|
150
|
+
|
|
151
|
+
The software is distributed under **MIT**. Example data, source publications and bundled fonts retain their own attributed terms; some publication examples have noncommercial source terms. Source URLs, hashes and exclusions are documented in `docs/DATA_TERMS.md` and the evidence collection's `data/LICENSES.md`. The software licence does not relicense third-party material.
|
|
152
|
+
|
|
153
|
+
Author: **Maciej Kochanowski**, Department of Bacteriology and Bacterial Diseases, National Veterinary Research Institute, Puławy, Poland. [ORCID 0000-0002-9982-3028](https://orcid.org/0000-0002-9982-3028). Use `CITATION.cff` for citation metadata. Report issues through the [GitHub issue tracker](https://github.com/maciejkochanowski/mic-50-90/issues).
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# MIC-50-90 1.0.0
|
|
2
|
+
|
|
3
|
+
MIC-50-90 is research software for describing MIC distributions from incomplete laboratory reports. It combines MIC50/MIC90, observed extremes, exact or interval counts, and explicitly rounded percentages to show the smallest and largest category shares compatible with the reported information. A local Windows application, Python command line and Python interface support the same calculation workflows.
|
|
4
|
+
|
|
5
|
+
Use it to interpret an unreported concentration range, distinguish missing counts from measurement censoring, determine which additional counts would resolve a question, or prepare a short laboratory report whose conclusions a recipient can verify. Inputs refer to the same original isolates and retain their denominator, panel, units and reporting convention.
|
|
6
|
+
|
|
7
|
+
## Install and start
|
|
8
|
+
|
|
9
|
+
**Windows application:** download the portable Windows archive from the [version 1.0.0 software release](https://github.com/maciejkochanowski/mic-50-90/releases/tag/v1.0.0), extract it, and open `MIC-50-90.exe`. Keep the `_internal` folder beside the executable. Python is included. The application opens a guided form in your browser and performs calculations locally. Use **Quit application** to stop it.
|
|
10
|
+
|
|
11
|
+
**Python:** use Python 3.11–3.13 in a separate environment. Install version 1.0.0 from PyPI:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
python -m pip install mic-50-90==1.0.0
|
|
15
|
+
mic-50-90 gui
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Alternatively, download the verified wheel from the software release and install it with `python -m pip install mic_50_90-1.0.0-py3-none-any.whl`.
|
|
19
|
+
|
|
20
|
+
To inspect the command-line interface:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
mic-50-90 --help
|
|
24
|
+
mic-50-90 distribution --help
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Download the source archive for the example inputs, schemas and documentation. From its extracted directory, run:
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
mic-50-90 distribution examples/distribution/summaries.json --precision-pp 10 --output-dir output/distribution
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Open the generated `report.html`. Reports also provide CSV/JSON results and reusable input settings. The wheel installs the application and library; the software source release supplies the tests, formal checks, examples and user documentation.
|
|
34
|
+
|
|
35
|
+
## Choose the inference you need
|
|
36
|
+
|
|
37
|
+
| Question | Result | Requirements |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| What follows about these isolates? | Sharp finite-sample bounds over the distributions compatible with the report | Truthful summaries, ranks, panel geometry and category definitions |
|
|
40
|
+
| What follows about the source population? | Simultaneous confidence bounds accounting for incomplete reporting and sampling uncertainty | Independent observations from the same distribution, a declared population and confidence level |
|
|
41
|
+
| What is covered for a new study unit? | Calibrated bounds for the quantities in the declared protocol | Exchangeable study units and a matching reference, score, unit and calibration contract |
|
|
42
|
+
|
|
43
|
+
These layers answer different questions. Complete category counts can still leave concentrations uncertain inside measurement intervals. Optional likelihood, Bayesian, entropy and reference-based analyses report their additional assumptions. Incomplete numerical searches retain valid available bounds and their explicit completion status.
|
|
44
|
+
|
|
45
|
+
## Practical workflows
|
|
46
|
+
|
|
47
|
+
- Analyse published MIC summaries or counts, including several declared rank interpretations when necessary.
|
|
48
|
+
- Add a count from the original collection and update the analysis while preserving previous truthful information.
|
|
49
|
+
- Select contiguous concentration groups at a requested sample or population precision.
|
|
50
|
+
- Plan one request or successive requests for additional counts, with explicit permitted questions and costs.
|
|
51
|
+
- Select sufficient counts from a complete histogram so a recipient can verify the stated sample conclusions.
|
|
52
|
+
- Prepare and assess study-unit calibration with its own reference and sampling requirements.
|
|
53
|
+
|
|
54
|
+
The main mathematical result gives a checkable P6 endpoint-attainment condition: when it holds, a selected family of compatible count tables attains the same population-range endpoints as considering every compatible table for the fixed confidence construction. Written proofs, independent numerical checks and 29 Lean-checked algebraic declarations have distinct roles; the Lean development does not certify the entire program or all statistical assumptions.
|
|
55
|
+
|
|
56
|
+
## Documentation and checks
|
|
57
|
+
|
|
58
|
+
### What the repository contains
|
|
59
|
+
|
|
60
|
+
| Folder | Purpose |
|
|
61
|
+
|---|---|
|
|
62
|
+
| `src` | Calculation engine, CLI, Windows application and report resources |
|
|
63
|
+
| `tests` | Automated checks of calculations, input handling and interfaces |
|
|
64
|
+
| `tools` and `.github/workflows` | Build, test and publish the software packages |
|
|
65
|
+
| `docs` and `schemas` | Installation, usage, input formats and output definitions |
|
|
66
|
+
| `examples` and `data` | Small example inputs, source attribution and data terms |
|
|
67
|
+
| `formal` and `reproducibility` | Formal algebra and independent checks of the implemented calculations |
|
|
68
|
+
| `scripts` | Software integrity, reference calculations and validation utilities |
|
|
69
|
+
|
|
70
|
+
The Windows application and CLI use the same calculation engine. Cluster job submissions and article-production files are maintained outside this repository.
|
|
71
|
+
|
|
72
|
+
- [Windows user guide](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/GUI_GUIDE.md): installation, data entry, saved analyses and reports.
|
|
73
|
+
- [Distribution guide](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/distribution-user-guide.md): an end-to-end CLI analysis and interpretation.
|
|
74
|
+
- [CLI reference](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/CLI_REFERENCE.md): every command and option.
|
|
75
|
+
- [Python interface](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/PYTHON_INTERFACE.md): callable analysis functions and update contracts.
|
|
76
|
+
- [Report contents](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/REPORT_CONTENTS.md): results, numerical checks and exports.
|
|
77
|
+
- [Public functions](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/PUBLIC_FUNCTIONS.md): tasks, implementation and independent checks.
|
|
78
|
+
- [Reproducing software checks](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/REPRODUCING_RESULTS.md) and [formal algebra](https://github.com/maciejkochanowski/mic-50-90/blob/main/formal/README.md).
|
|
79
|
+
|
|
80
|
+
The GitHub Actions workflow tests installed packages on Windows and Linux with Python 3.11–3.13. The release workflow builds the Python and Windows packages, checks their contents and attaches only software assets. Consult the completed Actions run and the release checksums for the exact distributed files.
|
|
81
|
+
|
|
82
|
+
Manuscripts, supplementary appendices and editorial figures are maintained separately. They are not included in this repository, its software release assets, or a software deposit generated from this repository. [Distribution policy](https://github.com/maciejkochanowski/mic-50-90/blob/main/docs/DISTRIBUTION_POLICY.md).
|
|
83
|
+
|
|
84
|
+
## Scientific scope and licence
|
|
85
|
+
|
|
86
|
+
MIC-50-90 supports research and reporting audits. It does not infer clinical breakpoints, classify individual susceptibility or recommend treatment. Results depend on correct metadata and the assumptions attached to the chosen inference layer.
|
|
87
|
+
|
|
88
|
+
The software is distributed under **MIT**. Example data, source publications and bundled fonts retain their own attributed terms; some publication examples have noncommercial source terms. Source URLs, hashes and exclusions are documented in `docs/DATA_TERMS.md` and the evidence collection's `data/LICENSES.md`. The software licence does not relicense third-party material.
|
|
89
|
+
|
|
90
|
+
Author: **Maciej Kochanowski**, Department of Bacteriology and Bacterial Diseases, National Veterinary Research Institute, Puławy, Poland. [ORCID 0000-0002-9982-3028](https://orcid.org/0000-0002-9982-3028). Use `CITATION.cff` for citation metadata. Report issues through the [GitHub issue tracker](https://github.com/maciejkochanowski/mic-50-90/issues).
|