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.
Files changed (408) hide show
  1. mic_50_90-1.0.0/.github/workflows/release.yml +181 -0
  2. mic_50_90-1.0.0/.github/workflows/tests.yml +48 -0
  3. mic_50_90-1.0.0/.gitignore +40 -0
  4. mic_50_90-1.0.0/.zenodo.json +24 -0
  5. mic_50_90-1.0.0/CHANGELOG.md +17 -0
  6. mic_50_90-1.0.0/CITATION.cff +20 -0
  7. mic_50_90-1.0.0/LICENSE +21 -0
  8. mic_50_90-1.0.0/NOTICE.md +18 -0
  9. mic_50_90-1.0.0/PKG-INFO +153 -0
  10. mic_50_90-1.0.0/README.md +90 -0
  11. mic_50_90-1.0.0/README_REVIEWER.md +29 -0
  12. mic_50_90-1.0.0/codemeta.json +45 -0
  13. mic_50_90-1.0.0/data/LICENSES.md +16 -0
  14. mic_50_90-1.0.0/data/SOURCES.md +20 -0
  15. mic_50_90-1.0.0/docs/ACQUIRING_COUNTS.md +35 -0
  16. mic_50_90-1.0.0/docs/BUILD_WINDOWS.md +35 -0
  17. mic_50_90-1.0.0/docs/CALIBRATION_ASSESSMENT.md +54 -0
  18. mic_50_90-1.0.0/docs/CALIBRATION_PREPARATION.md +86 -0
  19. mic_50_90-1.0.0/docs/CLI_REFERENCE.md +148 -0
  20. mic_50_90-1.0.0/docs/CSV_WORKFLOWS.md +141 -0
  21. mic_50_90-1.0.0/docs/DATA_TERMS.md +12 -0
  22. mic_50_90-1.0.0/docs/DECISION_PLANNING.md +62 -0
  23. mic_50_90-1.0.0/docs/DISTRIBUTION_POLICY.md +16 -0
  24. mic_50_90-1.0.0/docs/ENGINEERING_VERIFICATION.md +24 -0
  25. mic_50_90-1.0.0/docs/GUI_GUIDE.md +342 -0
  26. mic_50_90-1.0.0/docs/LARGE_REPORTS.md +85 -0
  27. mic_50_90-1.0.0/docs/MISSING_INFORMATION.md +24 -0
  28. mic_50_90-1.0.0/docs/POPULATION_PRECISION.md +55 -0
  29. mic_50_90-1.0.0/docs/PUBLIC_FUNCTIONS.md +161 -0
  30. mic_50_90-1.0.0/docs/PYTHON_INTERFACE.md +142 -0
  31. mic_50_90-1.0.0/docs/REPORT_CONTENTS.md +109 -0
  32. mic_50_90-1.0.0/docs/REPRODUCING_RESULTS.md +53 -0
  33. mic_50_90-1.0.0/docs/RETURNED_COUNTS.md +44 -0
  34. mic_50_90-1.0.0/docs/SAMPLE_SIZE.md +14 -0
  35. mic_50_90-1.0.0/docs/SCIENTIFIC_CONTRIBUTION.md +14 -0
  36. mic_50_90-1.0.0/docs/SUFFICIENT_REPORTING.md +39 -0
  37. mic_50_90-1.0.0/docs/VERSION_POLICY.md +5 -0
  38. mic_50_90-1.0.0/docs/compatible-population-projection.md +150 -0
  39. mic_50_90-1.0.0/docs/distribution-user-guide.md +486 -0
  40. mic_50_90-1.0.0/docs/hunter-inference-kernel.md +141 -0
  41. mic_50_90-1.0.0/docs/joint-distribution-implementation.md +16 -0
  42. mic_50_90-1.0.0/docs/joint-distribution-method.md +343 -0
  43. mic_50_90-1.0.0/docs/population-row-lift.md +49 -0
  44. mic_50_90-1.0.0/docs/range-population-method.md +162 -0
  45. mic_50_90-1.0.0/examples/acquisition/README.md +43 -0
  46. mic_50_90-1.0.0/examples/acquisition/completed.csv +4 -0
  47. mic_50_90-1.0.0/examples/acquisition/laboratory-counts.csv +8 -0
  48. mic_50_90-1.0.0/examples/acquisition/laboratory-panels.csv +8 -0
  49. mic_50_90-1.0.0/examples/acquisition/laboratory-targets.csv +7 -0
  50. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries-category.json +45 -0
  51. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries-conditional-population.json +51 -0
  52. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries-population-category.json +45 -0
  53. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries-rank60.json +45 -0
  54. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-summaries.json +47 -0
  55. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count-category.json +55 -0
  56. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count-conditional-population.json +61 -0
  57. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count-population-category.json +55 -0
  58. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count-rank60.json +55 -0
  59. mic_50_90-1.0.0/examples/biological_cases/ampicillin-67-with-count.json +57 -0
  60. mic_50_90-1.0.0/examples/biological_cases/chloramphenicol-67-censored.json +59 -0
  61. mic_50_90-1.0.0/examples/biological_cases/chloramphenicol-67-rounding-unknown.json +56 -0
  62. mic_50_90-1.0.0/examples/biological_cases/penicillin-7133-one-count.json +61 -0
  63. mic_50_90-1.0.0/examples/biological_cases/penicillin-7133-two-counts.json +68 -0
  64. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2007.json +63 -0
  65. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2008.json +63 -0
  66. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2009.json +63 -0
  67. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2010.json +63 -0
  68. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2011.json +63 -0
  69. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2012.json +63 -0
  70. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2013.json +63 -0
  71. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2014.json +63 -0
  72. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2015.json +63 -0
  73. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2016.json +63 -0
  74. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2017.json +63 -0
  75. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2018.json +63 -0
  76. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2019.json +63 -0
  77. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2020.json +63 -0
  78. mic_50_90-1.0.0/examples/biological_cases/penicillin-annual/2021.json +63 -0
  79. mic_50_90-1.0.0/examples/calibration_audit/README.md +10 -0
  80. mic_50_90-1.0.0/examples/calibration_audit/expected.csv +5 -0
  81. mic_50_90-1.0.0/examples/calibration_audit/observed.csv +5 -0
  82. mic_50_90-1.0.0/examples/calibration_preparation/README.md +16 -0
  83. mic_50_90-1.0.0/examples/calibration_preparation/counts.csv +19 -0
  84. mic_50_90-1.0.0/examples/calibration_preparation/future-summaries.csv +3 -0
  85. mic_50_90-1.0.0/examples/calibration_preparation/metadata.json +14 -0
  86. mic_50_90-1.0.0/examples/calibration_preparation/panels.csv +7 -0
  87. mic_50_90-1.0.0/examples/calibration_preparation/roster.csv +9 -0
  88. mic_50_90-1.0.0/examples/csv/calibration-scores.json +64 -0
  89. mic_50_90-1.0.0/examples/csv/calibrations.json +125 -0
  90. mic_50_90-1.0.0/examples/csv/counts.csv +7 -0
  91. mic_50_90-1.0.0/examples/csv/panels.csv +7 -0
  92. mic_50_90-1.0.0/examples/csv/summaries-calibrated.csv +2 -0
  93. mic_50_90-1.0.0/examples/csv/summaries.csv +3 -0
  94. mic_50_90-1.0.0/examples/csv/targets.csv +4 -0
  95. mic_50_90-1.0.0/examples/decision_planning/README.md +29 -0
  96. mic_50_90-1.0.0/examples/decision_planning/complete-counts.csv +3 -0
  97. mic_50_90-1.0.0/examples/decision_planning/panels.csv +6 -0
  98. mic_50_90-1.0.0/examples/decision_planning/returned-count.csv +2 -0
  99. mic_50_90-1.0.0/examples/decision_planning/summaries.csv +2 -0
  100. mic_50_90-1.0.0/examples/decision_planning/targets.csv +4 -0
  101. mic_50_90-1.0.0/examples/decision_planning/weighted-queries.csv +4 -0
  102. mic_50_90-1.0.0/examples/decision_planning/weighted-targets.csv +3 -0
  103. mic_50_90-1.0.0/examples/distribution/published-7133-counts.json +68 -0
  104. mic_50_90-1.0.0/examples/distribution/summaries.json +14 -0
  105. mic_50_90-1.0.0/examples/distribution/supplemented.json +18 -0
  106. mic_50_90-1.0.0/examples/empirical.json +39 -0
  107. mic_50_90-1.0.0/examples/laboratory_use/README.md +41 -0
  108. mic_50_90-1.0.0/examples/laboratory_use/laboratory/cohort-id-map.json +62 -0
  109. mic_50_90-1.0.0/examples/laboratory_use/laboratory/counts.csv +446 -0
  110. mic_50_90-1.0.0/examples/laboratory_use/laboratory/panels.csv +75 -0
  111. mic_50_90-1.0.0/examples/laboratory_use/laboratory/targets.csv +386 -0
  112. mic_50_90-1.0.0/examples/laboratory_use/published/panels.csv +34 -0
  113. mic_50_90-1.0.0/examples/laboratory_use/published/provenance.json +132 -0
  114. mic_50_90-1.0.0/examples/laboratory_use/published/summaries.csv +4 -0
  115. mic_50_90-1.0.0/examples/laboratory_use/published/targets.csv +4 -0
  116. mic_50_90-1.0.0/examples/laboratory_use/returned/additional-counts.csv +5 -0
  117. mic_50_90-1.0.0/examples/laboratory_use/returned/panels.csv +4 -0
  118. mic_50_90-1.0.0/examples/laboratory_use/returned/summaries.csv +5 -0
  119. mic_50_90-1.0.0/examples/laboratory_use/returned/targets.csv +5 -0
  120. mic_50_90-1.0.0/examples/population.json +33 -0
  121. mic_50_90-1.0.0/examples/publication_review/README.md +48 -0
  122. mic_50_90-1.0.0/examples/publication_review/amikacin-14-conflict.json +60 -0
  123. mic_50_90-1.0.0/examples/publication_review/ampicillin-227-conditional-after.json +58 -0
  124. mic_50_90-1.0.0/examples/publication_review/ampicillin-227-conditional-before.json +48 -0
  125. mic_50_90-1.0.0/examples/publication_review/ampicillin-227-counts.json +44 -0
  126. mic_50_90-1.0.0/examples/publication_review/cefiderocol-25-conditional-after.json +58 -0
  127. mic_50_90-1.0.0/examples/publication_review/cefiderocol-25-conditional-before.json +48 -0
  128. mic_50_90-1.0.0/examples/publication_review/cefiderocol-25-counts.json +44 -0
  129. mic_50_90-1.0.0/examples/publication_review/doxycycline-68-conditional-after.json +58 -0
  130. mic_50_90-1.0.0/examples/publication_review/doxycycline-68-conditional-before.json +48 -0
  131. mic_50_90-1.0.0/examples/publication_review/doxycycline-68-counts.json +44 -0
  132. mic_50_90-1.0.0/examples/publication_review/penicillin-21-conditional-after.json +74 -0
  133. mic_50_90-1.0.0/examples/publication_review/penicillin-21-conditional-before.json +56 -0
  134. mic_50_90-1.0.0/examples/publication_review/penicillin-21-counts.json +60 -0
  135. mic_50_90-1.0.0/examples/published_summaries/README.md +23 -0
  136. mic_50_90-1.0.0/examples/published_summaries/panels.csv +36 -0
  137. mic_50_90-1.0.0/examples/published_summaries/provenance.json +69 -0
  138. mic_50_90-1.0.0/examples/published_summaries/summaries.csv +10 -0
  139. mic_50_90-1.0.0/examples/published_summaries/targets.csv +5 -0
  140. mic_50_90-1.0.0/examples/published_table/README.md +26 -0
  141. mic_50_90-1.0.0/examples/published_table/SOURCE.json +48 -0
  142. mic_50_90-1.0.0/examples/published_table/counts.csv +14 -0
  143. mic_50_90-1.0.0/examples/published_table/panels.csv +14 -0
  144. mic_50_90-1.0.0/examples/published_table/summaries.csv +2 -0
  145. mic_50_90-1.0.0/examples/published_table/targets.csv +2 -0
  146. mic_50_90-1.0.0/examples/received_report/README.md +25 -0
  147. mic_50_90-1.0.0/examples/received_report/certificate.json +113 -0
  148. mic_50_90-1.0.0/examples/received_report/expected.json +110 -0
  149. mic_50_90-1.0.0/examples/received_report/laboratory-276-gui.json +80 -0
  150. mic_50_90-1.0.0/examples/received_report/verify.py +20 -0
  151. mic_50_90-1.0.0/examples/returned_counts/README.md +3 -0
  152. mic_50_90-1.0.0/examples/returned_counts/SOURCE.json +48 -0
  153. mic_50_90-1.0.0/examples/returned_counts/additional-counts.csv +2 -0
  154. mic_50_90-1.0.0/examples/returned_counts/panels.csv +14 -0
  155. mic_50_90-1.0.0/examples/returned_counts/summaries.csv +2 -0
  156. mic_50_90-1.0.0/examples/returned_counts/targets.csv +2 -0
  157. mic_50_90-1.0.0/examples/sufficient_reporting/README.md +3 -0
  158. mic_50_90-1.0.0/examples/sufficient_reporting/counts.csv +6 -0
  159. mic_50_90-1.0.0/examples/sufficient_reporting/panels.csv +6 -0
  160. mic_50_90-1.0.0/examples/sufficient_reporting/summaries.csv +2 -0
  161. mic_50_90-1.0.0/examples/sufficient_reporting/targets.csv +4 -0
  162. mic_50_90-1.0.0/examples/trained_calibration/README.md +16 -0
  163. mic_50_90-1.0.0/examples/trained_calibration/counts.csv +31 -0
  164. mic_50_90-1.0.0/examples/trained_calibration/expected.json +26 -0
  165. mic_50_90-1.0.0/examples/trained_calibration/metadata.json +1 -0
  166. mic_50_90-1.0.0/examples/trained_calibration/panels.csv +7 -0
  167. mic_50_90-1.0.0/examples/trained_calibration/roster.csv +13 -0
  168. mic_50_90-1.0.0/examples/trained_calibration/summaries.csv +3 -0
  169. mic_50_90-1.0.0/examples/wasserstein_calibration.json +145 -0
  170. mic_50_90-1.0.0/formal/P6Core.lean +429 -0
  171. mic_50_90-1.0.0/formal/README.md +46 -0
  172. mic_50_90-1.0.0/formal/lakefile.toml +11 -0
  173. mic_50_90-1.0.0/formal/lean-toolchain +1 -0
  174. mic_50_90-1.0.0/pyproject.toml +130 -0
  175. mic_50_90-1.0.0/reproducibility/self_test.py +214 -0
  176. mic_50_90-1.0.0/reproducibility/v1.0.0/joint-distribution-20260930/oracle.py +129 -0
  177. mic_50_90-1.0.0/reproducibility/v1.0.0/joint-distribution-20260930/production_adapter.py +41 -0
  178. mic_50_90-1.0.0/schemas/input.schema.json +641 -0
  179. mic_50_90-1.0.0/schemas/output.schema.json +149 -0
  180. mic_50_90-1.0.0/scripts/build_release_bundle.py +84 -0
  181. mic_50_90-1.0.0/scripts/check_release_archives.py +67 -0
  182. mic_50_90-1.0.0/scripts/generate_cli_reference.py +43 -0
  183. mic_50_90-1.0.0/scripts/library_closure.py +99 -0
  184. mic_50_90-1.0.0/scripts/manifest_tools.py +59 -0
  185. mic_50_90-1.0.0/scripts/package_files.py +45 -0
  186. mic_50_90-1.0.0/scripts/refresh_package_manifest.py +82 -0
  187. mic_50_90-1.0.0/scripts/run_external_validation.py +1186 -0
  188. mic_50_90-1.0.0/scripts/run_stage0_unit_audit.py +362 -0
  189. mic_50_90-1.0.0/scripts/run_v1_coverage_simulations.py +142 -0
  190. mic_50_90-1.0.0/scripts/run_v1_stress_test.py +191 -0
  191. mic_50_90-1.0.0/scripts/verify_manuscript_numbers.py +212 -0
  192. mic_50_90-1.0.0/scripts/verify_question_closure.py +80 -0
  193. mic_50_90-1.0.0/scripts/verify_width_identity.py +165 -0
  194. mic_50_90-1.0.0/scripts/write_campaign_receipts.py +196 -0
  195. mic_50_90-1.0.0/src/mic_50_90/__init__.py +47 -0
  196. mic_50_90-1.0.0/src/mic_50_90/__main__.py +5 -0
  197. mic_50_90-1.0.0/src/mic_50_90/_hunter/__init__.py +1 -0
  198. mic_50_90-1.0.0/src/mic_50_90/_hunter/budget.py +33 -0
  199. mic_50_90-1.0.0/src/mic_50_90/_hunter/calibration.py +78 -0
  200. mic_50_90-1.0.0/src/mic_50_90/_hunter/contractor.py +83 -0
  201. mic_50_90-1.0.0/src/mic_50_90/_hunter/count_partition.py +26 -0
  202. mic_50_90-1.0.0/src/mic_50_90/_hunter/dense.py +86 -0
  203. mic_50_90-1.0.0/src/mic_50_90/_hunter/endpoint.py +513 -0
  204. mic_50_90-1.0.0/src/mic_50_90/_hunter/fast_pairs.py +95 -0
  205. mic_50_90-1.0.0/src/mic_50_90/_hunter/helpers.py +18 -0
  206. mic_50_90-1.0.0/src/mic_50_90/_hunter/multiple_roots.py +275 -0
  207. mic_50_90-1.0.0/src/mic_50_90/_hunter/pairwise.py +586 -0
  208. mic_50_90-1.0.0/src/mic_50_90/_hunter/score.py +310 -0
  209. mic_50_90-1.0.0/src/mic_50_90/_hunter/tie_witness.py +94 -0
  210. mic_50_90-1.0.0/src/mic_50_90/_hunter/upper_score.py +60 -0
  211. mic_50_90-1.0.0/src/mic_50_90/_version.py +1 -0
  212. mic_50_90-1.0.0/src/mic_50_90/acquisition.py +268 -0
  213. mic_50_90-1.0.0/src/mic_50_90/analysis.py +519 -0
  214. mic_50_90-1.0.0/src/mic_50_90/bayes.py +150 -0
  215. mic_50_90-1.0.0/src/mic_50_90/calibration_audit.py +446 -0
  216. mic_50_90-1.0.0/src/mic_50_90/calibration_binding.py +56 -0
  217. mic_50_90-1.0.0/src/mic_50_90/calibration_preparation.py +554 -0
  218. mic_50_90-1.0.0/src/mic_50_90/censoring.py +76 -0
  219. mic_50_90-1.0.0/src/mic_50_90/cli.py +198 -0
  220. mic_50_90-1.0.0/src/mic_50_90/comparability.py +204 -0
  221. mic_50_90-1.0.0/src/mic_50_90/conformal.py +738 -0
  222. mic_50_90-1.0.0/src/mic_50_90/count_updates.py +522 -0
  223. mic_50_90-1.0.0/src/mic_50_90/decision_planning.py +431 -0
  224. mic_50_90-1.0.0/src/mic_50_90/decision_report.py +209 -0
  225. mic_50_90-1.0.0/src/mic_50_90/decisions.py +121 -0
  226. mic_50_90-1.0.0/src/mic_50_90/distribution_decisions.py +100 -0
  227. mic_50_90-1.0.0/src/mic_50_90/distribution_options.py +33 -0
  228. mic_50_90-1.0.0/src/mic_50_90/distribution_report.py +297 -0
  229. mic_50_90-1.0.0/src/mic_50_90/distribution_resolution.py +86 -0
  230. mic_50_90-1.0.0/src/mic_50_90/distribution_targets.py +88 -0
  231. mic_50_90-1.0.0/src/mic_50_90/distribution_workflow.py +626 -0
  232. mic_50_90-1.0.0/src/mic_50_90/dro.py +319 -0
  233. mic_50_90-1.0.0/src/mic_50_90/empirical.py +581 -0
  234. mic_50_90-1.0.0/src/mic_50_90/exact_population.py +167 -0
  235. mic_50_90-1.0.0/src/mic_50_90/file_safety.py +15 -0
  236. mic_50_90-1.0.0/src/mic_50_90/gui.py +336 -0
  237. mic_50_90-1.0.0/src/mic_50_90/gui_assets/app.js +421 -0
  238. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/DejaVuSans-Bold.woff +0 -0
  239. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/DejaVuSans-BoldOblique.woff +0 -0
  240. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/DejaVuSans-Oblique.woff +0 -0
  241. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/DejaVuSans.woff +0 -0
  242. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/FONT_MANIFEST.json +102 -0
  243. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/GUST-FONT-LICENSE.txt +30 -0
  244. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/LICENSE_DEJAVU +99 -0
  245. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/OFL-FAQ.txt +225 -0
  246. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/OFL.txt +103 -0
  247. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/README.md +10 -0
  248. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmunbi.woff +0 -0
  249. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmunbx.woff +0 -0
  250. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmunrm.woff +0 -0
  251. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmunti.woff +0 -0
  252. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/cmuntt.woff +0 -0
  253. mic_50_90-1.0.0/src/mic_50_90/gui_assets/fonts/latinmodern-math.woff +0 -0
  254. mic_50_90-1.0.0/src/mic_50_90/gui_assets/index.html +98 -0
  255. mic_50_90-1.0.0/src/mic_50_90/gui_assets/model.js +301 -0
  256. mic_50_90-1.0.0/src/mic_50_90/gui_assets/report_print.css +21 -0
  257. mic_50_90-1.0.0/src/mic_50_90/gui_assets/report_view.js +76 -0
  258. mic_50_90-1.0.0/src/mic_50_90/gui_assets/style.css +15 -0
  259. mic_50_90-1.0.0/src/mic_50_90/gui_assets/typography.css +21 -0
  260. mic_50_90-1.0.0/src/mic_50_90/gui_documents.py +142 -0
  261. mic_50_90-1.0.0/src/mic_50_90/gui_forms.py +398 -0
  262. mic_50_90-1.0.0/src/mic_50_90/gui_worker.py +144 -0
  263. mic_50_90-1.0.0/src/mic_50_90/hunter_population.py +114 -0
  264. mic_50_90-1.0.0/src/mic_50_90/input_context.py +67 -0
  265. mic_50_90-1.0.0/src/mic_50_90/joint_population.py +836 -0
  266. mic_50_90-1.0.0/src/mic_50_90/likelihood.py +382 -0
  267. mic_50_90-1.0.0/src/mic_50_90/model.py +580 -0
  268. mic_50_90-1.0.0/src/mic_50_90/population.py +360 -0
  269. mic_50_90-1.0.0/src/mic_50_90/population_acquisition.py +157 -0
  270. mic_50_90-1.0.0/src/mic_50_90/population_precision.py +59 -0
  271. mic_50_90-1.0.0/src/mic_50_90/population_questions.py +86 -0
  272. mic_50_90-1.0.0/src/mic_50_90/py.typed +0 -0
  273. mic_50_90-1.0.0/src/mic_50_90/range_certificates.py +89 -0
  274. mic_50_90-1.0.0/src/mic_50_90/range_population.py +312 -0
  275. mic_50_90-1.0.0/src/mic_50_90/report.py +504 -0
  276. mic_50_90-1.0.0/src/mic_50_90/report_checks.py +49 -0
  277. mic_50_90-1.0.0/src/mic_50_90/report_pages.py +259 -0
  278. mic_50_90-1.0.0/src/mic_50_90/report_status.py +64 -0
  279. mic_50_90-1.0.0/src/mic_50_90/reporting_report.py +37 -0
  280. mic_50_90-1.0.0/src/mic_50_90/result_schema.py +22 -0
  281. mic_50_90-1.0.0/src/mic_50_90/result_view.py +434 -0
  282. mic_50_90-1.0.0/src/mic_50_90/scenarios.py +122 -0
  283. mic_50_90-1.0.0/src/mic_50_90/sufficient_reporting.py +181 -0
  284. mic_50_90-1.0.0/src/mic_50_90/typography.py +70 -0
  285. mic_50_90-1.0.0/src/mic_50_90/utility.py +249 -0
  286. mic_50_90-1.0.0/src/mic_50_90/validation.py +97 -0
  287. mic_50_90-1.0.0/src/mic_50_90/workflows.py +707 -0
  288. mic_50_90-1.0.0/tests/browser/check_acceptance.cjs +63 -0
  289. mic_50_90-1.0.0/tests/browser/check_reopened_options.cjs +56 -0
  290. mic_50_90-1.0.0/tests/browser/check_worked_example.cjs +81 -0
  291. mic_50_90-1.0.0/tests/fixtures/legacy-calibration-manifests.json +248 -0
  292. mic_50_90-1.0.0/tests/test_acquisition.py +82 -0
  293. mic_50_90-1.0.0/tests/test_acquisition_bounds.py +69 -0
  294. mic_50_90-1.0.0/tests/test_acquisition_oracle.py +119 -0
  295. mic_50_90-1.0.0/tests/test_acquisition_workflow.py +89 -0
  296. mic_50_90-1.0.0/tests/test_advanced_validation.py +113 -0
  297. mic_50_90-1.0.0/tests/test_analysis.py +70 -0
  298. mic_50_90-1.0.0/tests/test_boundary_geometry.py +45 -0
  299. mic_50_90-1.0.0/tests/test_bounded_counts.py +111 -0
  300. mic_50_90-1.0.0/tests/test_bounded_workflow.py +54 -0
  301. mic_50_90-1.0.0/tests/test_calibration_assessment.py +206 -0
  302. mic_50_90-1.0.0/tests/test_calibration_endpoint_roundoff.py +81 -0
  303. mic_50_90-1.0.0/tests/test_calibration_preparation.py +327 -0
  304. mic_50_90-1.0.0/tests/test_calibration_rank_boundary.py +23 -0
  305. mic_50_90-1.0.0/tests/test_censoring.py +35 -0
  306. mic_50_90-1.0.0/tests/test_cli_usability.py +100 -0
  307. mic_50_90-1.0.0/tests/test_comparability.py +108 -0
  308. mic_50_90-1.0.0/tests/test_compatible_population_projection.py +175 -0
  309. mic_50_90-1.0.0/tests/test_completion_review.py +72 -0
  310. mic_50_90-1.0.0/tests/test_conformal.py +385 -0
  311. mic_50_90-1.0.0/tests/test_consistency_boundary_contracts.py +116 -0
  312. mic_50_90-1.0.0/tests/test_consistency_reporting.py +105 -0
  313. mic_50_90-1.0.0/tests/test_count_updates.py +196 -0
  314. mic_50_90-1.0.0/tests/test_critical_properties.py +156 -0
  315. mic_50_90-1.0.0/tests/test_critical_radius_geometry.py +36 -0
  316. mic_50_90-1.0.0/tests/test_critical_semantics.py +129 -0
  317. mic_50_90-1.0.0/tests/test_csv_workflows.py +94 -0
  318. mic_50_90-1.0.0/tests/test_decision_planning.py +182 -0
  319. mic_50_90-1.0.0/tests/test_decision_reporting.py +142 -0
  320. mic_50_90-1.0.0/tests/test_decision_workflow.py +237 -0
  321. mic_50_90-1.0.0/tests/test_distribution_calibration_reporting.py +128 -0
  322. mic_50_90-1.0.0/tests/test_distribution_range_questions.py +204 -0
  323. mic_50_90-1.0.0/tests/test_distribution_resolution.py +103 -0
  324. mic_50_90-1.0.0/tests/test_distribution_workflow.py +342 -0
  325. mic_50_90-1.0.0/tests/test_empirical.py +145 -0
  326. mic_50_90-1.0.0/tests/test_exact_population.py +124 -0
  327. mic_50_90-1.0.0/tests/test_final_review_regressions.py +56 -0
  328. mic_50_90-1.0.0/tests/test_gui_backend.py +384 -0
  329. mic_50_90-1.0.0/tests/test_gui_censoring.cjs +17 -0
  330. mic_50_90-1.0.0/tests/test_gui_context.cjs +53 -0
  331. mic_50_90-1.0.0/tests/test_gui_input_repairs.py +145 -0
  332. mic_50_90-1.0.0/tests/test_gui_integration.py +23 -0
  333. mic_50_90-1.0.0/tests/test_gui_plain_entry.cjs +41 -0
  334. mic_50_90-1.0.0/tests/test_gui_saved_inputs.cjs +100 -0
  335. mic_50_90-1.0.0/tests/test_gui_scientific_input.cjs +96 -0
  336. mic_50_90-1.0.0/tests/test_gui_source_scale.cjs +31 -0
  337. mic_50_90-1.0.0/tests/test_gui_usability.cjs +40 -0
  338. mic_50_90-1.0.0/tests/test_hunter_adapter.py +153 -0
  339. mic_50_90-1.0.0/tests/test_hunter_audit_safety.py +197 -0
  340. mic_50_90-1.0.0/tests/test_hunter_budget.py +51 -0
  341. mic_50_90-1.0.0/tests/test_hunter_count_partition.py +26 -0
  342. mic_50_90-1.0.0/tests/test_hunter_independent_boundaries.py +115 -0
  343. mic_50_90-1.0.0/tests/test_hunter_multiple_roots.py +117 -0
  344. mic_50_90-1.0.0/tests/test_hunter_package.py +94 -0
  345. mic_50_90-1.0.0/tests/test_interval_observations.py +69 -0
  346. mic_50_90-1.0.0/tests/test_interval_scale_targets.py +151 -0
  347. mic_50_90-1.0.0/tests/test_joint_certificates.py +164 -0
  348. mic_50_90-1.0.0/tests/test_joint_independent.py +170 -0
  349. mic_50_90-1.0.0/tests/test_joint_population.py +108 -0
  350. mic_50_90-1.0.0/tests/test_laboratory_explanations.py +86 -0
  351. mic_50_90-1.0.0/tests/test_likelihood.py +89 -0
  352. mic_50_90-1.0.0/tests/test_likelihood_precision.py +128 -0
  353. mic_50_90-1.0.0/tests/test_lp_properties.py +99 -0
  354. mic_50_90-1.0.0/tests/test_new_workflow_integration.py +103 -0
  355. mic_50_90-1.0.0/tests/test_numerical_audit_regressions.py +111 -0
  356. mic_50_90-1.0.0/tests/test_optional_failure_isolation.py +50 -0
  357. mic_50_90-1.0.0/tests/test_panel_conventions.py +119 -0
  358. mic_50_90-1.0.0/tests/test_population.py +53 -0
  359. mic_50_90-1.0.0/tests/test_population_acquisition.py +106 -0
  360. mic_50_90-1.0.0/tests/test_population_budget.py +43 -0
  361. mic_50_90-1.0.0/tests/test_population_question_search.py +135 -0
  362. mic_50_90-1.0.0/tests/test_population_resolution.py +109 -0
  363. mic_50_90-1.0.0/tests/test_population_task_assessment.py +92 -0
  364. mic_50_90-1.0.0/tests/test_practical_context.py +133 -0
  365. mic_50_90-1.0.0/tests/test_probability_certificates.py +68 -0
  366. mic_50_90-1.0.0/tests/test_question_scaling.py +44 -0
  367. mic_50_90-1.0.0/tests/test_range_population.py +231 -0
  368. mic_50_90-1.0.0/tests/test_range_witnesses.py +72 -0
  369. mic_50_90-1.0.0/tests/test_release_contract.py +134 -0
  370. mic_50_90-1.0.0/tests/test_release_publisher.py +198 -0
  371. mic_50_90-1.0.0/tests/test_release_recovery.py +66 -0
  372. mic_50_90-1.0.0/tests/test_release_test_evidence.py +65 -0
  373. mic_50_90-1.0.0/tests/test_repair_file_safety.py +102 -0
  374. mic_50_90-1.0.0/tests/test_repair_input_semantics.py +186 -0
  375. mic_50_90-1.0.0/tests/test_repair_numerical_postconditions.py +50 -0
  376. mic_50_90-1.0.0/tests/test_report_completeness.py +78 -0
  377. mic_50_90-1.0.0/tests/test_report_interface_consistency.py +128 -0
  378. mic_50_90-1.0.0/tests/test_report_pagination.py +264 -0
  379. mic_50_90-1.0.0/tests/test_report_typography.py +87 -0
  380. mic_50_90-1.0.0/tests/test_result_chart_semantics.py +43 -0
  381. mic_50_90-1.0.0/tests/test_result_explanations.py +133 -0
  382. mic_50_90-1.0.0/tests/test_result_guidance.py +84 -0
  383. mic_50_90-1.0.0/tests/test_retained_functions.py +63 -0
  384. mic_50_90-1.0.0/tests/test_revision_review.py +79 -0
  385. mic_50_90-1.0.0/tests/test_scenarios.py +72 -0
  386. mic_50_90-1.0.0/tests/test_schemas_v1.py +17 -0
  387. mic_50_90-1.0.0/tests/test_software_release.py +111 -0
  388. mic_50_90-1.0.0/tests/test_sufficient_reporting.py +98 -0
  389. mic_50_90-1.0.0/tests/test_sufficient_reporting_workflow.py +63 -0
  390. mic_50_90-1.0.0/tests/test_surgical_repairs.py +157 -0
  391. mic_50_90-1.0.0/tests/test_trained_calibration.py +207 -0
  392. mic_50_90-1.0.0/tests/test_usability_backend.py +180 -0
  393. mic_50_90-1.0.0/tests/test_user_workflow_repairs.py +169 -0
  394. mic_50_90-1.0.0/tests/test_verifier_repairs.py +278 -0
  395. mic_50_90-1.0.0/tests/test_windows_licence.py +61 -0
  396. mic_50_90-1.0.0/tools/build_windows.py +82 -0
  397. mic_50_90-1.0.0/tools/check_browser.py +77 -0
  398. mic_50_90-1.0.0/tools/check_interfaces.py +174 -0
  399. mic_50_90-1.0.0/tools/check_platforms.py +100 -0
  400. mic_50_90-1.0.0/tools/check_release_tests.py +67 -0
  401. mic_50_90-1.0.0/tools/check_windows_release.py +115 -0
  402. mic_50_90-1.0.0/tools/desktop_launcher.py +7 -0
  403. mic_50_90-1.0.0/tools/prepare_browser_fixtures.py +26 -0
  404. mic_50_90-1.0.0/tools/print_reports.cjs +35 -0
  405. mic_50_90-1.0.0/tools/publish_software_release.py +212 -0
  406. mic_50_90-1.0.0/tools/recover_software_release.py +130 -0
  407. mic_50_90-1.0.0/tools/replay_companion.py +104 -0
  408. 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"
@@ -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.
@@ -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).