iints-sdk-python35 1.5.1__tar.gz → 1.5.3__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 (238) hide show
  1. {iints_sdk_python35-1.5.1/src/iints_sdk_python35.egg-info → iints_sdk_python35-1.5.3}/PKG-INFO +31 -7
  2. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/README.md +12 -1
  3. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/pyproject.toml +24 -6
  4. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/__init__.py +84 -7
  5. iints_sdk_python35-1.5.3/src/iints/analysis/__init__.py +129 -0
  6. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/baseline.py +2 -1
  7. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/booth_demo.py +286 -0
  8. iints_sdk_python35-1.5.3/src/iints/analysis/eucys_results.py +549 -0
  9. iints_sdk_python35-1.5.3/src/iints/analysis/study_analysis.py +1289 -0
  10. iints_sdk_python35-1.5.3/src/iints/analysis/study_engine.py +441 -0
  11. iints_sdk_python35-1.5.3/src/iints/analysis/study_poster.py +344 -0
  12. iints_sdk_python35-1.5.3/src/iints/analysis/study_protocol.py +274 -0
  13. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/cli/cli.py +1837 -147
  14. iints_sdk_python35-1.5.3/src/iints/cli/patient_cli.py +535 -0
  15. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/nightscout.py +4 -0
  16. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/registry.py +36 -1
  17. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/tidepool.py +5 -0
  18. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/highlevel.py +9 -3
  19. iints_sdk_python35-1.5.3/src/iints/live_patient/__init__.py +40 -0
  20. iints_sdk_python35-1.5.3/src/iints/live_patient/api.py +407 -0
  21. iints_sdk_python35-1.5.3/src/iints/live_patient/daemon.py +82 -0
  22. iints_sdk_python35-1.5.3/src/iints/live_patient/edge_benchmark.py +160 -0
  23. iints_sdk_python35-1.5.3/src/iints/live_patient/edge_ops.py +666 -0
  24. iints_sdk_python35-1.5.3/src/iints/live_patient/runtime.py +967 -0
  25. iints_sdk_python35-1.5.3/src/iints/live_patient/service_export.py +471 -0
  26. iints_sdk_python35-1.5.3/src/iints/live_patient/uno_q.py +413 -0
  27. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/scenarios/study_pack.py +4 -7
  28. iints_sdk_python35-1.5.3/src/iints/templates/uno_q/README.md +110 -0
  29. iints_sdk_python35-1.5.3/src/iints/templates/uno_q/iints_supervisor_bridge.ino +70 -0
  30. iints_sdk_python35-1.5.3/src/iints/utils/csv_safety.py +31 -0
  31. iints_sdk_python35-1.5.3/src/iints/utils/url_safety.py +33 -0
  32. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3/src/iints_sdk_python35.egg-info}/PKG-INFO +31 -7
  33. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints_sdk_python35.egg-info/SOURCES.txt +18 -0
  34. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints_sdk_python35.egg-info/requires.txt +21 -5
  35. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/tests/test_cli_booth_demo.py +6 -0
  36. iints_sdk_python35-1.5.3/tests/test_cli_cloud_import_security.py +131 -0
  37. iints_sdk_python35-1.5.3/tests/test_cli_edge_runtime.py +406 -0
  38. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/tests/test_cli_expo_tools.py +178 -0
  39. iints_sdk_python35-1.5.3/tests/test_cli_patient_runtime.py +225 -0
  40. iints_sdk_python35-1.5.1/src/iints/analysis/__init__.py +0 -46
  41. iints_sdk_python35-1.5.1/src/iints/analysis/study_analysis.py +0 -721
  42. iints_sdk_python35-1.5.1/src/iints/analysis/study_poster.py +0 -150
  43. iints_sdk_python35-1.5.1/src/iints/analysis/study_protocol.py +0 -310
  44. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/LICENSE +0 -0
  45. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/LICENSE-MIT-IINTS-LEGACY +0 -0
  46. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/NOTICE +0 -0
  47. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/setup.cfg +0 -0
  48. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/__init__.py +0 -0
  49. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/assistant.py +0 -0
  50. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/backends/__init__.py +0 -0
  51. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/backends/base.py +0 -0
  52. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/backends/mistral_api.py +0 -0
  53. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/backends/ollama.py +0 -0
  54. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/cli.py +0 -0
  55. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/mdmp_guard.py +0 -0
  56. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/model_catalog.py +0 -0
  57. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/prepare.py +0 -0
  58. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/ai/prompts.py +0 -0
  59. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/algorithm_xray.py +0 -0
  60. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/carelink_workbench.py +0 -0
  61. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/clinical_benchmark.py +0 -0
  62. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/clinical_metrics.py +0 -0
  63. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/clinical_tir_analyzer.py +0 -0
  64. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/diabetes_metrics.py +0 -0
  65. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/edge_efficiency.py +0 -0
  66. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/edge_performance_monitor.py +0 -0
  67. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/explainability.py +0 -0
  68. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/explainable_ai.py +0 -0
  69. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/hardware_benchmark.py +0 -0
  70. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/metrics.py +0 -0
  71. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/population_report.py +0 -0
  72. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/poster.py +0 -0
  73. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/reporting.py +0 -0
  74. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/safety_index.py +0 -0
  75. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/sensor_filtering.py +0 -0
  76. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/analysis/validator.py +0 -0
  77. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/api/__init__.py +0 -0
  78. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/api/base_algorithm.py +0 -0
  79. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/api/registry.py +0 -0
  80. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/api/template_algorithm.py +0 -0
  81. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/assets/iints_logo.png +0 -0
  82. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/cli/__init__.py +0 -0
  83. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/__init__.py +0 -0
  84. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/__init__.py +0 -0
  85. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/battle_runner.py +0 -0
  86. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/correction_bolus.py +0 -0
  87. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/discovery.py +0 -0
  88. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/fixed_basal_bolus.py +0 -0
  89. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/hybrid_algorithm.py +0 -0
  90. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/lstm_algorithm.py +0 -0
  91. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/mock_algorithms.py +0 -0
  92. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/pid_controller.py +0 -0
  93. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/algorithms/standard_pump_algo.py +0 -0
  94. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/device.py +0 -0
  95. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/device_manager.py +0 -0
  96. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/devices/__init__.py +0 -0
  97. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/devices/models.py +0 -0
  98. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/patient/__init__.py +0 -0
  99. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/patient/bergman_model.py +0 -0
  100. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/patient/models.py +0 -0
  101. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/patient/patient_factory.py +0 -0
  102. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/patient/profile.py +0 -0
  103. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/safety/__init__.py +0 -0
  104. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/safety/config.py +0 -0
  105. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/safety/input_validator.py +0 -0
  106. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/safety/supervisor.py +0 -0
  107. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/simulation/__init__.py +0 -0
  108. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/simulation/scenario_parser.py +0 -0
  109. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/simulator.py +0 -0
  110. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/core/supervisor.py +0 -0
  111. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/__init__.py +0 -0
  112. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/adapter.py +0 -0
  113. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/certify.py +0 -0
  114. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/column_mapper.py +0 -0
  115. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/contracts.py +0 -0
  116. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/datasets.json +0 -0
  117. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/demo/__init__.py +0 -0
  118. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/demo/demo_cgm.csv +0 -0
  119. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/guardians.py +0 -0
  120. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/importer.py +0 -0
  121. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/ingestor.py +0 -0
  122. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/mdmp_visualizer.py +0 -0
  123. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/quality_checker.py +0 -0
  124. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/runner.py +0 -0
  125. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/study_corruption.py +0 -0
  126. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/synthetic_mirror.py +0 -0
  127. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/universal_parser.py +0 -0
  128. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/virtual_patients/clinic_safe_baseline.yaml +0 -0
  129. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/virtual_patients/clinic_safe_hyper_challenge.yaml +0 -0
  130. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/virtual_patients/clinic_safe_hypo_prone.yaml +0 -0
  131. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/virtual_patients/clinic_safe_midnight.yaml +0 -0
  132. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/virtual_patients/clinic_safe_pizza.yaml +0 -0
  133. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/virtual_patients/clinic_safe_stress_meal.yaml +0 -0
  134. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/virtual_patients/default_patient.yaml +0 -0
  135. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/data/virtual_patients/patient_559_config.yaml +0 -0
  136. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/demo_assets.py +0 -0
  137. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/emulation/__init__.py +0 -0
  138. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/emulation/legacy_base.py +0 -0
  139. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/emulation/medtronic_780g.py +0 -0
  140. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/emulation/omnipod_5.py +0 -0
  141. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/emulation/tandem_controliq.py +0 -0
  142. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/learning/__init__.py +0 -0
  143. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/learning/autonomous_optimizer.py +0 -0
  144. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/learning/learning_system.py +0 -0
  145. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/mdmp/__init__.py +0 -0
  146. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/mdmp/backend.py +0 -0
  147. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/metrics.py +0 -0
  148. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/population/__init__.py +0 -0
  149. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/population/generator.py +0 -0
  150. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/population/runner.py +0 -0
  151. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/presets/__init__.py +0 -0
  152. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/presets/evidence_sources.yaml +0 -0
  153. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/presets/forecast_calibration_profiles.yaml +0 -0
  154. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/presets/golden_benchmark.yaml +0 -0
  155. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/presets/presets.json +0 -0
  156. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/presets/safety_contract_default.yaml +0 -0
  157. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/presets/validation_profiles.yaml +0 -0
  158. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/__init__.py +0 -0
  159. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/audit.py +0 -0
  160. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/calibration_gate.py +0 -0
  161. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/config.py +0 -0
  162. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/dataset.py +0 -0
  163. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/evaluation.py +0 -0
  164. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/losses.py +0 -0
  165. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/metrics.py +0 -0
  166. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/model_registry.py +0 -0
  167. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/research/predictor.py +0 -0
  168. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/scenarios/__init__.py +0 -0
  169. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/scenarios/generator.py +0 -0
  170. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/templates/__init__.py +0 -0
  171. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/templates/default_algorithm.py +0 -0
  172. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/templates/demos/__init__.py +0 -0
  173. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/templates/demos/live_stage_demo.py +0 -0
  174. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/templates/scenarios/__init__.py +0 -0
  175. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/templates/scenarios/chaos_insulin_stacking.json +0 -0
  176. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/templates/scenarios/chaos_runaway_ai.json +0 -0
  177. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/templates/scenarios/example_scenario.json +0 -0
  178. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/templates/scenarios/exercise_stress.json +0 -0
  179. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/utils/__init__.py +0 -0
  180. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/utils/plotting.py +0 -0
  181. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/utils/run_io.py +0 -0
  182. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/validation/__init__.py +0 -0
  183. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/validation/golden.py +0 -0
  184. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/validation/replay.py +0 -0
  185. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/validation/run_validation.py +0 -0
  186. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/validation/safety_contract.py +0 -0
  187. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/validation/schemas.py +0 -0
  188. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/visualization/__init__.py +0 -0
  189. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/visualization/cockpit.py +0 -0
  190. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints/visualization/uncertainty_cloud.py +0 -0
  191. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints_sdk_python35.egg-info/dependency_links.txt +0 -0
  192. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints_sdk_python35.egg-info/entry_points.txt +0 -0
  193. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/iints_sdk_python35.egg-info/top_level.txt +0 -0
  194. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_ai/__init__.py +0 -0
  195. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_ai/lineage.py +0 -0
  196. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/__init__.py +0 -0
  197. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/audit.py +0 -0
  198. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/bias_hooks.py +0 -0
  199. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/bundle.py +0 -0
  200. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/certification.py +0 -0
  201. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/cli.py +0 -0
  202. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/compare.py +0 -0
  203. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/conformance.py +0 -0
  204. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/contracts.py +0 -0
  205. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/crypto.py +0 -0
  206. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/data/conformance/vectors/delegation.json +0 -0
  207. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/data/conformance/vectors/fingerprint.json +0 -0
  208. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/data/conformance/vectors/grading.json +0 -0
  209. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/data/conformance/vectors/signing.json +0 -0
  210. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/delegate.py +0 -0
  211. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/diffing.py +0 -0
  212. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/drift.py +0 -0
  213. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/exceptions.py +0 -0
  214. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/fingerprint.py +0 -0
  215. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/fingerprint_store.py +0 -0
  216. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/hf.py +0 -0
  217. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/keys/mdmp_pub_v1.pem +0 -0
  218. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/llm_provenance.py +0 -0
  219. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/migrate.py +0 -0
  220. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/policy.py +0 -0
  221. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/prov.py +0 -0
  222. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/registry.py +0 -0
  223. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/runner.py +0 -0
  224. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/schema_export.py +0 -0
  225. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/synthetic.py +0 -0
  226. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/trust.py +0 -0
  227. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_core/visualizer.py +0 -0
  228. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_flavors/__init__.py +0 -0
  229. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_integrations/__init__.py +0 -0
  230. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_integrations/dvc.py +0 -0
  231. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_integrations/mlflow.py +0 -0
  232. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/src/mdmp_integrations/wandb.py +0 -0
  233. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/tests/test_bergman.py +0 -0
  234. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/tests/test_cli_carelink_workbench.py +0 -0
  235. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/tests/test_cli_demo_export.py +0 -0
  236. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/tests/test_cli_poster.py +0 -0
  237. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/tests/test_install_doctor.py +0 -0
  238. {iints_sdk_python35-1.5.1 → iints_sdk_python35-1.5.3}/tests/test_population.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iints-sdk-python35
3
- Version: 1.5.1
3
+ Version: 1.5.3
4
4
  Summary: A pre-clinical Edge-AI SDK for diabetes management validation.
5
5
  Author-email: Rune Bobbaers <rune.bobbaers@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -17,22 +17,35 @@ Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  License-File: NOTICE
19
19
  License-File: LICENSE-MIT-IINTS-LEGACY
20
- Requires-Dist: fpdf2>=2.8.0
21
- Requires-Dist: matplotlib>=3.5.0
20
+ Requires-Dist: fastapi>=0.115.0
22
21
  Requires-Dist: numpy>=1.24.0
23
- Requires-Dist: openpyxl>=3.0.0
24
22
  Requires-Dist: pandas>=2.0.0
25
- Requires-Dist: pillow>=12.1.1
26
23
  Requires-Dist: pydantic>=2.0.0
27
24
  Requires-Dist: PyYAML
28
25
  Requires-Dist: rich>=12.0.0
29
26
  Requires-Dist: scipy>=1.9.0
30
- Requires-Dist: seaborn>=0.11.0
31
27
  Requires-Dist: typer[all]
28
+ Requires-Dist: uvicorn>=0.30.0
29
+ Provides-Extra: edge
30
+ Requires-Dist: pyserial>=3.5; extra == "edge"
31
+ Provides-Extra: reports
32
+ Requires-Dist: fpdf2>=2.8.0; extra == "reports"
33
+ Requires-Dist: matplotlib>=3.5.0; extra == "reports"
34
+ Requires-Dist: openpyxl>=3.0.0; extra == "reports"
35
+ Requires-Dist: pillow>=12.1.1; extra == "reports"
36
+ Requires-Dist: seaborn>=0.11.0; extra == "reports"
37
+ Provides-Extra: full
38
+ Requires-Dist: fpdf2>=2.8.0; extra == "full"
39
+ Requires-Dist: matplotlib>=3.5.0; extra == "full"
40
+ Requires-Dist: openpyxl>=3.0.0; extra == "full"
41
+ Requires-Dist: pyserial>=3.5; extra == "full"
42
+ Requires-Dist: pillow>=12.1.1; extra == "full"
43
+ Requires-Dist: seaborn>=0.11.0; extra == "full"
32
44
  Provides-Extra: dev
33
45
  Requires-Dist: pytest>=7.0.0; extra == "dev"
34
46
  Requires-Dist: hypothesis>=6.0.0; extra == "dev"
35
47
  Requires-Dist: flake8; extra == "dev"
48
+ Requires-Dist: httpx>=0.27.0; extra == "dev"
36
49
  Requires-Dist: mypy; extra == "dev"
37
50
  Requires-Dist: pandas-stubs; extra == "dev"
38
51
  Requires-Dist: types-PyYAML; extra == "dev"
@@ -70,7 +83,16 @@ Docs: [python35.github.io/IINTS-SDK](https://python35.github.io/IINTS-SDK/)
70
83
  python3 -m venv .venv
71
84
  source .venv/bin/activate
72
85
  python -m pip install -U pip
73
- python -m pip install -U "iints-sdk-python35[mdmp]"
86
+ python -m pip install -U "iints-sdk-python35[full,mdmp]"
87
+ ```
88
+
89
+ For Raspberry Pi or UNO Q edge rigs, use `iints-sdk-python35[edge,mdmp]` and follow `docs/EDGE_HARDWARE.md`.
90
+
91
+ Edge workflow:
92
+ ```bash
93
+ iints edge setup --output-dir iints_edge_demo --board raspberry_pi
94
+ iints edge status --workspace iints_edge_demo/patient_runtime
95
+ iints edge bundle --workspace iints_edge_demo/patient_runtime --output results/edge_runtime_bundle.zip
74
96
  ```
75
97
 
76
98
  Sanity check:
@@ -90,6 +112,8 @@ iints ai report results/<run_id>
90
112
  ## Read Next
91
113
  - Start here: `docs/GETTING_STARTED.md`
92
114
  - Installation and paths: `docs/INSTALLATION.md`
115
+ - Edge hardware profiles: `docs/EDGE_HARDWARE.md`
116
+ - Raspberry Pi digital patient: `docs/DIGITAL_PATIENT_PI.md`
93
117
  - Study analysis: `docs/STUDY_ANALYSIS.md`
94
118
  - AI assistant: `docs/AI_ASSISTANT.md`
95
119
  - Data certification: `docs/MDMP_QUICKSTART.md`
@@ -17,7 +17,16 @@ Docs: [python35.github.io/IINTS-SDK](https://python35.github.io/IINTS-SDK/)
17
17
  python3 -m venv .venv
18
18
  source .venv/bin/activate
19
19
  python -m pip install -U pip
20
- python -m pip install -U "iints-sdk-python35[mdmp]"
20
+ python -m pip install -U "iints-sdk-python35[full,mdmp]"
21
+ ```
22
+
23
+ For Raspberry Pi or UNO Q edge rigs, use `iints-sdk-python35[edge,mdmp]` and follow `docs/EDGE_HARDWARE.md`.
24
+
25
+ Edge workflow:
26
+ ```bash
27
+ iints edge setup --output-dir iints_edge_demo --board raspberry_pi
28
+ iints edge status --workspace iints_edge_demo/patient_runtime
29
+ iints edge bundle --workspace iints_edge_demo/patient_runtime --output results/edge_runtime_bundle.zip
21
30
  ```
22
31
 
23
32
  Sanity check:
@@ -37,6 +46,8 @@ iints ai report results/<run_id>
37
46
  ## Read Next
38
47
  - Start here: `docs/GETTING_STARTED.md`
39
48
  - Installation and paths: `docs/INSTALLATION.md`
49
+ - Edge hardware profiles: `docs/EDGE_HARDWARE.md`
50
+ - Raspberry Pi digital patient: `docs/DIGITAL_PATIENT_PI.md`
40
51
  - Study analysis: `docs/STUDY_ANALYSIS.md`
41
52
  - AI assistant: `docs/AI_ASSISTANT.md`
42
53
  - Data certification: `docs/MDMP_QUICKSTART.md`
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "iints-sdk-python35"
7
- version = "1.5.1"
7
+ version = "1.5.3"
8
8
  authors = [
9
9
  { name="Rune Bobbaers", email="rune.bobbaers@gmail.com" },
10
10
  ]
@@ -23,25 +23,41 @@ classifiers = [
23
23
  "Development Status :: 5 - Production/Stable",
24
24
  ]
25
25
  dependencies = [
26
- "fpdf2>=2.8.0",
27
- "matplotlib>=3.5.0",
26
+ "fastapi>=0.115.0",
28
27
  "numpy>=1.24.0",
29
- "openpyxl>=3.0.0",
30
28
  "pandas>=2.0.0",
31
- "pillow>=12.1.1",
32
29
  "pydantic>=2.0.0",
33
30
  "PyYAML",
34
31
  "rich>=12.0.0",
35
32
  "scipy>=1.9.0",
36
- "seaborn>=0.11.0",
37
33
  "typer[all]",
34
+ "uvicorn>=0.30.0",
38
35
  ]
39
36
 
40
37
  [project.optional-dependencies]
38
+ edge = [
39
+ "pyserial>=3.5",
40
+ ]
41
+ reports = [
42
+ "fpdf2>=2.8.0",
43
+ "matplotlib>=3.5.0",
44
+ "openpyxl>=3.0.0",
45
+ "pillow>=12.1.1",
46
+ "seaborn>=0.11.0",
47
+ ]
48
+ full = [
49
+ "fpdf2>=2.8.0",
50
+ "matplotlib>=3.5.0",
51
+ "openpyxl>=3.0.0",
52
+ "pyserial>=3.5",
53
+ "pillow>=12.1.1",
54
+ "seaborn>=0.11.0",
55
+ ]
41
56
  dev = [
42
57
  "pytest>=7.0.0",
43
58
  "hypothesis>=6.0.0",
44
59
  "flake8",
60
+ "httpx>=0.27.0",
45
61
  "mypy",
46
62
  "pandas-stubs",
47
63
  "types-PyYAML",
@@ -86,6 +102,8 @@ where = ["src"]
86
102
  iints = [
87
103
  "templates/*.py",
88
104
  "templates/scenarios/*.json",
105
+ "templates/uno_q/*.ino",
106
+ "templates/uno_q/*.md",
89
107
  "assets/*.png",
90
108
  "data/*.json",
91
109
  "data/virtual_patients/*.yaml",
@@ -1,7 +1,7 @@
1
1
  # src/iints/__init__.py
2
2
 
3
3
  import pandas as pd # Required for type hints like pd.DataFrame
4
- from typing import Optional
4
+ from typing import Any, Optional
5
5
 
6
6
  try:
7
7
  from importlib.metadata import PackageNotFoundError, version
@@ -11,11 +11,18 @@ except ImportError: # pragma: no cover - Python < 3.8 fallback
11
11
  try:
12
12
  __version__ = version("iints-sdk-python35")
13
13
  except PackageNotFoundError: # pragma: no cover - source tree fallback
14
- __version__ = "1.5.1"
14
+ __version__ = "1.5.3"
15
15
 
16
16
  # Note to developers: this SDK is currently maintained by a single author.
17
17
  # Please report bugs via GitHub issues and feel free to contribute fixes via PRs.
18
18
 
19
+
20
+ def _missing_reports_dependency(feature: str, exc: Exception) -> None:
21
+ raise ImportError(
22
+ f"{feature} requires the optional reporting stack. Install "
23
+ f"'iints-sdk-python35[reports]' or 'iints-sdk-python35[full]'."
24
+ ) from exc
25
+
19
26
  # API Components for Algorithm Development
20
27
  from .api.base_algorithm import (
21
28
  InsulinAlgorithm,
@@ -72,16 +79,75 @@ from .data.guardians import mdmp_gate, MDMPGateError
72
79
  from .data.synthetic_mirror import generate_synthetic_mirror, SyntheticMirrorArtifact
73
80
  from .data.study_corruption import AVAILABLE_STUDY_CORRUPTIONS, apply_study_corruptions, write_corrupted_study_csv
74
81
  from .analysis.metrics import generate_benchmark_metrics # Added for benchmark
75
- from .analysis.booth_demo import build_booth_demo
76
- from .analysis.carelink_workbench import build_carelink_workbench
77
- from .analysis.poster import generate_results_poster
78
- from .analysis.reporting import ClinicalReportGenerator
79
82
  from .analysis.study_protocol import build_study_protocol_payload, render_study_protocol_markdown, write_study_protocol_bundle
80
83
  from .analysis.edge_efficiency import EnergyEstimate, estimate_energy_per_decision
81
84
  from .ai import AIResponse, IINTSAssistant, MDMPGuard
82
- from .highlevel import run_simulation, run_full, run_population
85
+ from .live_patient import (
86
+ create_edge_bundle,
87
+ export_edge_setup,
88
+ LivePatientDaemon,
89
+ PatientRuntimeConfig,
90
+ create_patient_app,
91
+ export_uno_q_bridge,
92
+ get_runtime_scenario_profile,
93
+ list_runtime_scenario_profiles,
94
+ run_edge_benchmark,
95
+ summarize_edge_workspace,
96
+ write_edge_update_script,
97
+ )
83
98
  from .scenarios import ScenarioGeneratorConfig, generate_random_scenario
84
99
 
100
+
101
+ def run_simulation(*args: Any, **kwargs: Any) -> Any:
102
+ from .highlevel import run_simulation as _run_simulation
103
+
104
+ return _run_simulation(*args, **kwargs)
105
+
106
+
107
+ def run_full(*args: Any, **kwargs: Any) -> Any:
108
+ from .highlevel import run_full as _run_full
109
+
110
+ return _run_full(*args, **kwargs)
111
+
112
+
113
+ def run_population(*args: Any, **kwargs: Any) -> Any:
114
+ from .highlevel import run_population as _run_population
115
+
116
+ return _run_population(*args, **kwargs)
117
+
118
+ try:
119
+ from .analysis.booth_demo import build_booth_demo
120
+ except Exception as exc: # pragma: no cover - optional reports stack
121
+ _build_booth_demo_exc = exc
122
+
123
+ def build_booth_demo(*args, **kwargs): # type: ignore[misc,no-redef]
124
+ _missing_reports_dependency("build_booth_demo()", _build_booth_demo_exc)
125
+
126
+ try:
127
+ from .analysis.carelink_workbench import build_carelink_workbench
128
+ except Exception as exc: # pragma: no cover - optional reports stack
129
+ _build_carelink_workbench_exc = exc
130
+
131
+ def build_carelink_workbench(*args, **kwargs): # type: ignore[misc,no-redef]
132
+ _missing_reports_dependency("build_carelink_workbench()", _build_carelink_workbench_exc)
133
+
134
+ try:
135
+ from .analysis.poster import generate_results_poster
136
+ except Exception as exc: # pragma: no cover - optional reports stack
137
+ _generate_results_poster_exc = exc
138
+
139
+ def generate_results_poster(*args, **kwargs): # type: ignore[misc,no-redef]
140
+ _missing_reports_dependency("generate_results_poster()", _generate_results_poster_exc)
141
+
142
+ try:
143
+ from .analysis.reporting import ClinicalReportGenerator
144
+ except Exception as exc: # pragma: no cover - optional reports stack
145
+ _clinical_report_generator_exc = exc
146
+
147
+ class ClinicalReportGenerator: # type: ignore[no-redef]
148
+ def __init__(self, *args, **kwargs):
149
+ _missing_reports_dependency("ClinicalReportGenerator", _clinical_report_generator_exc)
150
+
85
151
  # Population testing
86
152
  from .population import (
87
153
  PopulationGenerator,
@@ -202,6 +268,17 @@ __all__ = [
202
268
  "AIResponse",
203
269
  "IINTSAssistant",
204
270
  "MDMPGuard",
271
+ "create_edge_bundle",
272
+ "export_edge_setup",
273
+ "LivePatientDaemon",
274
+ "PatientRuntimeConfig",
275
+ "create_patient_app",
276
+ "export_uno_q_bridge",
277
+ "get_runtime_scenario_profile",
278
+ "list_runtime_scenario_profiles",
279
+ "run_edge_benchmark",
280
+ "summarize_edge_workspace",
281
+ "write_edge_update_script",
205
282
  # Reporting
206
283
  "generate_report",
207
284
  "generate_quickstart_report",
@@ -0,0 +1,129 @@
1
+ from .clinical_metrics import ClinicalMetricsCalculator, ClinicalMetricsResult
2
+ from .baseline import compute_metrics, run_baseline_comparison, write_baseline_comparison
3
+ from .study_engine import (
4
+ StudyAlgorithmSpec,
5
+ StudyArmSpec,
6
+ StudyDesignPayload,
7
+ StudyMatrixRow,
8
+ StudyProfileSpec,
9
+ build_algorithm_registry,
10
+ build_study_design_payload,
11
+ resolve_profile_specs,
12
+ )
13
+ from .study_protocol import (
14
+ build_study_protocol_payload,
15
+ render_study_protocol_markdown,
16
+ write_study_protocol_bundle,
17
+ )
18
+ from .study_analysis import (
19
+ analyze_run_directory,
20
+ analyze_study_directory,
21
+ compare_studies,
22
+ load_study_summary,
23
+ quality_badges_for_metrics,
24
+ StudyComparison,
25
+ StudyRunSummary,
26
+ StudySummary,
27
+ )
28
+ from .eucys_results import (
29
+ build_eucys_abstract_draft_markdown,
30
+ build_eucys_filled_abstract_markdown,
31
+ build_eucys_jury_qa_markdown,
32
+ build_eucys_limitations_and_ethics_markdown,
33
+ build_eucys_poster_outline_markdown,
34
+ generate_eucys_main_figure,
35
+ generate_eucys_results_bundle,
36
+ )
37
+
38
+
39
+ def _missing_reports_dependency(feature: str, exc: Exception) -> None:
40
+ raise ImportError(
41
+ f"{feature} requires the optional reporting stack. Install "
42
+ f"'iints-sdk-python35[reports]' or 'iints-sdk-python35[full]'."
43
+ ) from exc
44
+
45
+
46
+ try:
47
+ from .booth_demo import build_booth_demo
48
+ except Exception as exc: # pragma: no cover - optional reports stack
49
+ _build_booth_demo_exc = exc
50
+
51
+ def build_booth_demo(*args, **kwargs): # type: ignore[misc,no-redef]
52
+ _missing_reports_dependency("build_booth_demo()", _build_booth_demo_exc)
53
+
54
+
55
+ try:
56
+ from .carelink_workbench import build_carelink_workbench
57
+ except Exception as exc: # pragma: no cover - optional reports stack
58
+ _build_carelink_workbench_exc = exc
59
+
60
+ def build_carelink_workbench(*args, **kwargs): # type: ignore[misc,no-redef]
61
+ _missing_reports_dependency("build_carelink_workbench()", _build_carelink_workbench_exc)
62
+
63
+
64
+ try:
65
+ from .poster import generate_results_poster
66
+ except Exception as exc: # pragma: no cover - optional reports stack
67
+ _generate_results_poster_exc = exc
68
+
69
+ def generate_results_poster(*args, **kwargs): # type: ignore[misc,no-redef]
70
+ _missing_reports_dependency("generate_results_poster()", _generate_results_poster_exc)
71
+
72
+
73
+ try:
74
+ from .reporting import ClinicalReportGenerator
75
+ except Exception as exc: # pragma: no cover - optional reports stack
76
+ _clinical_report_generator_exc = exc
77
+
78
+ class ClinicalReportGenerator: # type: ignore[no-redef]
79
+ def __init__(self, *args, **kwargs):
80
+ _missing_reports_dependency("ClinicalReportGenerator", _clinical_report_generator_exc)
81
+
82
+
83
+ try:
84
+ from .study_poster import generate_study_poster
85
+ except Exception as exc: # pragma: no cover - optional reports stack
86
+ _generate_study_poster_exc = exc
87
+
88
+ def generate_study_poster(*args, **kwargs): # type: ignore[misc,no-redef]
89
+ _missing_reports_dependency("generate_study_poster()", _generate_study_poster_exc)
90
+
91
+
92
+ __all__ = [
93
+ "analyze_run_directory",
94
+ "analyze_study_directory",
95
+ "build_booth_demo",
96
+ "build_carelink_workbench",
97
+ "ClinicalMetricsCalculator",
98
+ "ClinicalMetricsResult",
99
+ "ClinicalReportGenerator",
100
+ "compute_metrics",
101
+ "compare_studies",
102
+ "build_eucys_abstract_draft_markdown",
103
+ "build_eucys_filled_abstract_markdown",
104
+ "build_eucys_jury_qa_markdown",
105
+ "build_eucys_limitations_and_ethics_markdown",
106
+ "build_eucys_poster_outline_markdown",
107
+ "generate_eucys_main_figure",
108
+ "resolve_profile_specs",
109
+ "generate_eucys_results_bundle",
110
+ "generate_results_poster",
111
+ "generate_study_poster",
112
+ "build_algorithm_registry",
113
+ "build_study_design_payload",
114
+ "build_study_protocol_payload",
115
+ "render_study_protocol_markdown",
116
+ "write_study_protocol_bundle",
117
+ "load_study_summary",
118
+ "quality_badges_for_metrics",
119
+ "run_baseline_comparison",
120
+ "StudyAlgorithmSpec",
121
+ "StudyArmSpec",
122
+ "StudyComparison",
123
+ "StudyDesignPayload",
124
+ "StudyMatrixRow",
125
+ "StudyProfileSpec",
126
+ "StudyRunSummary",
127
+ "StudySummary",
128
+ "write_baseline_comparison",
129
+ ]
@@ -12,6 +12,7 @@ from iints.core.algorithms.pid_controller import PIDController
12
12
  from iints.core.algorithms.standard_pump_algo import StandardPumpAlgorithm
13
13
  from iints.core.patient.models import PatientModel
14
14
  from iints.core.simulator import Simulator
15
+ from iints.utils.csv_safety import sanitize_csv_dataframe
15
16
  from iints.validation import build_stress_events
16
17
 
17
18
 
@@ -88,5 +89,5 @@ def write_baseline_comparison(comparison: Dict[str, Any], output_dir: Path) -> D
88
89
  json_path = output_dir / "baseline_comparison.json"
89
90
  csv_path = output_dir / "baseline_comparison.csv"
90
91
  json_path.write_text(json.dumps(comparison, indent=2))
91
- pd.DataFrame(comparison.get("rows", [])).to_csv(csv_path, index=False)
92
+ sanitize_csv_dataframe(pd.DataFrame(comparison.get("rows", []))).to_csv(csv_path, index=False)
92
93
  return {"json": str(json_path), "csv": str(csv_path)}