iints-sdk-python35 1.5.3__tar.gz → 1.5.5__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.
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/LICENSE +2 -2
- iints_sdk_python35-1.5.5/PKG-INFO +131 -0
- iints_sdk_python35-1.5.5/README.md +64 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/pyproject.toml +40 -39
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/__init__.py +7 -3
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/cli.py +8 -8
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/__init__.py +10 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/baseline.py +5 -1
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/carelink_workbench.py +1 -1
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/eucys_results.py +2 -2
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/hardware_benchmark.py +17 -7
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/reporting.py +5 -2
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/study_engine.py +1 -0
- iints_sdk_python35-1.5.5/src/iints/analysis/study_experiment.py +168 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/study_protocol.py +33 -0
- iints_sdk_python35-1.5.5/src/iints/api/registry.py +383 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/cli/cli.py +2655 -501
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/cli/patient_cli.py +14 -14
- iints_sdk_python35-1.5.5/src/iints/core/algorithms/clinical_baseline.py +151 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/pid_controller.py +22 -6
- iints_sdk_python35-1.5.5/src/iints/core/devices/__init__.py +3 -0
- iints_sdk_python35-1.5.5/src/iints/core/devices/models.py +333 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/patient/bergman_model.py +28 -13
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/patient/models.py +27 -8
- iints_sdk_python35-1.5.5/src/iints/core/physiology_variation.py +119 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/simulator.py +45 -9
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/__init__.py +48 -1
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/datasets.json +62 -5
- iints_sdk_python35-1.5.5/src/iints/data/demo/demo_cgm.csv +289 -0
- iints_sdk_python35-1.5.5/src/iints/data/physiology_residual_profiles.json +13953 -0
- iints_sdk_python35-1.5.5/src/iints/data/realism_dashboard.py +390 -0
- iints_sdk_python35-1.5.5/src/iints/data/realism_reference.py +229 -0
- iints_sdk_python35-1.5.5/src/iints/data/realism_references.json +56 -0
- iints_sdk_python35-1.5.5/src/iints/data/realism_validator.py +813 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/synthetic_mirror.py +183 -10
- iints_sdk_python35-1.5.5/src/iints/data/tidepool.py +268 -0
- iints_sdk_python35-1.5.5/src/iints/data/virtual_patients/reference_azt1d_t1d.yaml +12 -0
- iints_sdk_python35-1.5.5/src/iints/data/virtual_patients/reference_free_living_t1d.yaml +12 -0
- iints_sdk_python35-1.5.5/src/iints/data/virtual_patients/reference_hupa_ucm_t1d.yaml +12 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/highlevel.py +38 -25
- iints_sdk_python35-1.5.5/src/iints/jetson/__init__.py +25 -0
- iints_sdk_python35-1.5.5/src/iints/jetson/endurance.py +949 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/live_patient/__init__.py +12 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/live_patient/api.py +97 -36
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/live_patient/daemon.py +3 -2
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/live_patient/edge_benchmark.py +1 -1
- iints_sdk_python35-1.5.5/src/iints/live_patient/edge_ops.py +1425 -0
- iints_sdk_python35-1.5.5/src/iints/live_patient/long_study.py +885 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/live_patient/runtime.py +101 -22
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/live_patient/service_export.py +107 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/live_patient/uno_q.py +3 -3
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/presets/evidence_sources.yaml +9 -1
- iints_sdk_python35-1.5.5/src/iints/presets/presets.json +476 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/research/__init__.py +11 -1
- iints_sdk_python35-1.5.5/src/iints/research/evaluation.py +285 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/scenarios/study_pack.py +31 -18
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/utils/run_io.py +11 -0
- iints_sdk_python35-1.5.5/src/iints_sdk_python35.egg-info/PKG-INFO +131 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints_sdk_python35.egg-info/SOURCES.txt +25 -1
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints_sdk_python35.egg-info/entry_points.txt +1 -1
- iints_sdk_python35-1.5.5/src/iints_sdk_python35.egg-info/requires.txt +53 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_bergman.py +8 -0
- iints_sdk_python35-1.5.5/tests/test_ci_governance.py +28 -0
- iints_sdk_python35-1.5.5/tests/test_cli_algorithm_loading.py +24 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_cli_cloud_import_security.py +22 -16
- iints_sdk_python35-1.5.5/tests/test_cli_demo_live.py +54 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_cli_edge_runtime.py +317 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_cli_expo_tools.py +94 -0
- iints_sdk_python35-1.5.5/tests/test_cli_onboarding.py +167 -0
- iints_sdk_python35-1.5.5/tests/test_jetson_endurance.py +207 -0
- iints_sdk_python35-1.5.5/tests/test_physiology_variation.py +32 -0
- iints_sdk_python35-1.5.5/tests/test_plugin_system.py +89 -0
- iints_sdk_python35-1.5.5/tests/test_presets_realism.py +158 -0
- iints_sdk_python35-1.5.5/tests/test_research_realism_tools.py +53 -0
- iints_sdk_python35-1.5.5/tests/test_simulator_calibration.py +67 -0
- iints_sdk_python35-1.5.3/PKG-INFO +0 -123
- iints_sdk_python35-1.5.3/README.md +0 -57
- iints_sdk_python35-1.5.3/src/iints/api/registry.py +0 -103
- iints_sdk_python35-1.5.3/src/iints/core/devices/__init__.py +0 -3
- iints_sdk_python35-1.5.3/src/iints/core/devices/models.py +0 -160
- iints_sdk_python35-1.5.3/src/iints/data/demo/demo_cgm.csv +0 -289
- iints_sdk_python35-1.5.3/src/iints/data/tidepool.py +0 -43
- iints_sdk_python35-1.5.3/src/iints/live_patient/edge_ops.py +0 -666
- iints_sdk_python35-1.5.3/src/iints/presets/presets.json +0 -114
- iints_sdk_python35-1.5.3/src/iints/research/evaluation.py +0 -70
- iints_sdk_python35-1.5.3/src/iints_sdk_python35.egg-info/PKG-INFO +0 -123
- iints_sdk_python35-1.5.3/src/iints_sdk_python35.egg-info/requires.txt +0 -53
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/LICENSE-MIT-IINTS-LEGACY +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/NOTICE +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/setup.cfg +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/assistant.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/backends/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/backends/base.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/backends/mistral_api.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/backends/ollama.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/mdmp_guard.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/model_catalog.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/prepare.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/ai/prompts.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/algorithm_xray.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/booth_demo.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/clinical_benchmark.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/clinical_metrics.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/clinical_tir_analyzer.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/diabetes_metrics.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/edge_efficiency.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/edge_performance_monitor.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/explainability.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/explainable_ai.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/metrics.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/population_report.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/poster.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/safety_index.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/sensor_filtering.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/study_analysis.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/study_poster.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/validator.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/api/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/api/base_algorithm.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/api/template_algorithm.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/assets/iints_logo.png +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/cli/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/battle_runner.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/correction_bolus.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/discovery.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/fixed_basal_bolus.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/hybrid_algorithm.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/lstm_algorithm.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/mock_algorithms.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/algorithms/standard_pump_algo.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/device.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/device_manager.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/patient/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/patient/patient_factory.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/patient/profile.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/safety/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/safety/config.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/safety/input_validator.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/safety/supervisor.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/simulation/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/simulation/scenario_parser.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/core/supervisor.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/adapter.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/certify.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/column_mapper.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/contracts.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/demo/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/guardians.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/importer.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/ingestor.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/mdmp_visualizer.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/nightscout.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/quality_checker.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/registry.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/runner.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/study_corruption.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/universal_parser.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/virtual_patients/clinic_safe_baseline.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/virtual_patients/clinic_safe_hyper_challenge.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/virtual_patients/clinic_safe_hypo_prone.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/virtual_patients/clinic_safe_midnight.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/virtual_patients/clinic_safe_pizza.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/virtual_patients/clinic_safe_stress_meal.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/virtual_patients/default_patient.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/data/virtual_patients/patient_559_config.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/demo_assets.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/emulation/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/emulation/legacy_base.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/emulation/medtronic_780g.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/emulation/omnipod_5.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/emulation/tandem_controliq.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/learning/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/learning/autonomous_optimizer.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/learning/learning_system.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/mdmp/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/mdmp/backend.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/metrics.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/population/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/population/generator.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/population/runner.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/presets/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/presets/forecast_calibration_profiles.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/presets/golden_benchmark.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/presets/safety_contract_default.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/presets/validation_profiles.yaml +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/research/audit.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/research/calibration_gate.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/research/config.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/research/dataset.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/research/losses.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/research/metrics.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/research/model_registry.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/research/predictor.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/scenarios/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/scenarios/generator.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/default_algorithm.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/demos/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/demos/live_stage_demo.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/scenarios/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/scenarios/chaos_insulin_stacking.json +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/scenarios/chaos_runaway_ai.json +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/scenarios/example_scenario.json +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/scenarios/exercise_stress.json +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/uno_q/README.md +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/templates/uno_q/iints_supervisor_bridge.ino +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/utils/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/utils/csv_safety.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/utils/plotting.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/utils/url_safety.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/validation/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/validation/golden.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/validation/replay.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/validation/run_validation.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/validation/safety_contract.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/validation/schemas.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/visualization/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/visualization/cockpit.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/visualization/uncertainty_cloud.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints_sdk_python35.egg-info/dependency_links.txt +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints_sdk_python35.egg-info/top_level.txt +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_ai/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_ai/lineage.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/audit.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/bias_hooks.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/bundle.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/certification.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/cli.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/compare.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/conformance.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/contracts.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/crypto.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/data/conformance/vectors/delegation.json +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/data/conformance/vectors/fingerprint.json +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/data/conformance/vectors/grading.json +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/data/conformance/vectors/signing.json +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/delegate.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/diffing.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/drift.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/exceptions.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/fingerprint.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/fingerprint_store.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/hf.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/keys/mdmp_pub_v1.pem +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/llm_provenance.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/migrate.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/policy.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/prov.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/registry.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/runner.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/schema_export.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/synthetic.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/trust.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_core/visualizer.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_flavors/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_integrations/__init__.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_integrations/dvc.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_integrations/mlflow.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/mdmp_integrations/wandb.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_cli_booth_demo.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_cli_carelink_workbench.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_cli_demo_export.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_cli_patient_runtime.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_cli_poster.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_install_doctor.py +0 -0
- {iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/tests/test_population.py +0 -0
|
@@ -164,8 +164,8 @@ the Work or Derivative Works thereof, You may choose to offer,
|
|
|
164
164
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
165
165
|
or other liability obligations and/or rights consistent with this
|
|
166
166
|
License. However, in accepting such obligations, You may act only
|
|
167
|
-
on Your own behalf and on Your sole responsibility, not on behalf
|
|
168
|
-
|
|
167
|
+
on Your own behalf and on Your sole responsibility, not on behalf of
|
|
168
|
+
any other Contributor, and only if You agree to indemnify,
|
|
169
169
|
defend, and hold each Contributor harmless for any liability
|
|
170
170
|
incurred by, or claims asserted against, such Contributor by reason
|
|
171
171
|
of your accepting any such warranty or additional liability.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: iints-sdk-python35
|
|
3
|
+
Version: 1.5.5
|
|
4
|
+
Summary: A pre-clinical Edge-AI SDK for diabetes management validation.
|
|
5
|
+
Author-email: Rune Bobbaers <rune.bobbaers@gmail.com>
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/python35/IINTS-SDK
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
16
|
+
Requires-Python: <3.15,>=3.10
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
License-File: NOTICE
|
|
20
|
+
License-File: LICENSE-MIT-IINTS-LEGACY
|
|
21
|
+
Requires-Dist: fastapi<1.0.0,>=0.115.0
|
|
22
|
+
Requires-Dist: numpy<3.0.0,>=1.24.0
|
|
23
|
+
Requires-Dist: pandas<3.0.0,>=2.0.0
|
|
24
|
+
Requires-Dist: pydantic<3.0.0,>=2.0.0
|
|
25
|
+
Requires-Dist: PyYAML<7.0.0,>=6.0.0
|
|
26
|
+
Requires-Dist: rich<16.0.0,>=12.0.0
|
|
27
|
+
Requires-Dist: scipy<2.0.0,>=1.9.0
|
|
28
|
+
Requires-Dist: typer[all]<1.0.0,>=0.9.0
|
|
29
|
+
Requires-Dist: uvicorn<1.0.0,>=0.30.0
|
|
30
|
+
Provides-Extra: edge
|
|
31
|
+
Requires-Dist: pyserial<4.0,>=3.5; extra == "edge"
|
|
32
|
+
Provides-Extra: reports
|
|
33
|
+
Requires-Dist: fpdf2<3.0.0,>=2.8.0; extra == "reports"
|
|
34
|
+
Requires-Dist: matplotlib<4.0.0,>=3.5.0; extra == "reports"
|
|
35
|
+
Requires-Dist: openpyxl<4.0.0,>=3.0.0; extra == "reports"
|
|
36
|
+
Requires-Dist: pillow<13.0.0,>=12.1.1; extra == "reports"
|
|
37
|
+
Requires-Dist: seaborn<1.0.0,>=0.11.0; extra == "reports"
|
|
38
|
+
Provides-Extra: full
|
|
39
|
+
Requires-Dist: fpdf2<3.0.0,>=2.8.0; extra == "full"
|
|
40
|
+
Requires-Dist: matplotlib<4.0.0,>=3.5.0; extra == "full"
|
|
41
|
+
Requires-Dist: openpyxl<4.0.0,>=3.0.0; extra == "full"
|
|
42
|
+
Requires-Dist: pyserial<4.0,>=3.5; extra == "full"
|
|
43
|
+
Requires-Dist: pillow<13.0.0,>=12.1.1; extra == "full"
|
|
44
|
+
Requires-Dist: seaborn<1.0.0,>=0.11.0; extra == "full"
|
|
45
|
+
Provides-Extra: dev
|
|
46
|
+
Requires-Dist: pytest<10.0.0,>=7.0.0; extra == "dev"
|
|
47
|
+
Requires-Dist: hypothesis<7.0.0,>=6.0.0; extra == "dev"
|
|
48
|
+
Requires-Dist: flake8<8.0.0,>=7.0.0; extra == "dev"
|
|
49
|
+
Requires-Dist: httpx<1.0.0,>=0.27.0; extra == "dev"
|
|
50
|
+
Requires-Dist: mypy<3.0.0,>=1.8.0; extra == "dev"
|
|
51
|
+
Requires-Dist: pandas-stubs<3.0.0,>=2.0.0; extra == "dev"
|
|
52
|
+
Requires-Dist: types-PyYAML<7.0.0,>=6.0.0; extra == "dev"
|
|
53
|
+
Requires-Dist: types-psutil<8.0.0,>=7.0.0; extra == "dev"
|
|
54
|
+
Provides-Extra: torch
|
|
55
|
+
Requires-Dist: torch<3.0.0,>=1.9.0; extra == "torch"
|
|
56
|
+
Provides-Extra: nightscout
|
|
57
|
+
Requires-Dist: py-nightscout; extra == "nightscout"
|
|
58
|
+
Provides-Extra: research
|
|
59
|
+
Requires-Dist: torch<3.0.0,>=2.0.0; extra == "research"
|
|
60
|
+
Requires-Dist: pyarrow<25.0.0,>=12.0.0; extra == "research"
|
|
61
|
+
Requires-Dist: h5py<4.0.0,>=3.10.0; extra == "research"
|
|
62
|
+
Requires-Dist: onnx<2.0.0,>=1.16.0; extra == "research"
|
|
63
|
+
Requires-Dist: onnxscript<1.0.0,>=0.1.0; extra == "research"
|
|
64
|
+
Provides-Extra: mdmp
|
|
65
|
+
Requires-Dist: cryptography<49.0.0,>=42.0.0; extra == "mdmp"
|
|
66
|
+
Dynamic: license-file
|
|
67
|
+
|
|
68
|
+
# IINTS-AF SDK
|
|
69
|
+
|
|
70
|
+
[](https://www.uni-kiel.de/en/eucys2026)
|
|
71
|
+
[](https://badge.fury.io/py/iints-sdk-python35)
|
|
72
|
+
[](https://github.com/python35/IINTS-SDK/actions/workflows/python-package.yml)
|
|
73
|
+
[](https://python35.github.io/IINTS-SDK/)
|
|
74
|
+
|
|
75
|
+
> "Code shouldn't be a secret when it's managing a life."
|
|
76
|
+
|
|
77
|
+
Open-source research platform for insulin delivery algorithm simulation and validation.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## What It Does
|
|
82
|
+
|
|
83
|
+
- **Simulate** virtual patients across thousands of scenarios before any algorithm reaches a real device
|
|
84
|
+
- **Certify** datasets cryptographically — traceable, consented, reproducible
|
|
85
|
+
- **Understand** results with audit-ready reports and local AI explanation via Ministral
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Install
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pip install "iints-sdk-python35[full,mdmp]"
|
|
93
|
+
iints doctor --smoke-run
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Raspberry Pi / Arduino UNO Q:**
|
|
97
|
+
```bash
|
|
98
|
+
pip install "iints-sdk-python35[edge,mdmp]"
|
|
99
|
+
iints edge quickstart --board raspberry_pi
|
|
100
|
+
iints edge quickstart --board uno_q
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Quick Start
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
iints quickstart --project-name my_study
|
|
109
|
+
cd my_study
|
|
110
|
+
iints presets run --name baseline_t1d --algo algorithms/example_algorithm.py
|
|
111
|
+
iints ai report results/<run_id>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Full documentation: [python35.github.io/IINTS-SDK](https://python35.github.io/IINTS-SDK/)
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Live Demo
|
|
119
|
+
|
|
120
|
+
For a Zoom call, jury walkthrough, or sponsor demo where you want to show both the code and the generated outputs in one terminal flow:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
iints demo-live --output-dir results/live_demo
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
That exports the showable demo script, prints the key SDK calls, runs the demo, and lists the poster plus proof artifacts to open next.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
> Research software. Not a medical device. MIT Licensed.
|
|
131
|
+
> *Built by a 17-year-old with type 1 diabetes.*
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# IINTS-AF SDK
|
|
2
|
+
|
|
3
|
+
[](https://www.uni-kiel.de/en/eucys2026)
|
|
4
|
+
[](https://badge.fury.io/py/iints-sdk-python35)
|
|
5
|
+
[](https://github.com/python35/IINTS-SDK/actions/workflows/python-package.yml)
|
|
6
|
+
[](https://python35.github.io/IINTS-SDK/)
|
|
7
|
+
|
|
8
|
+
> "Code shouldn't be a secret when it's managing a life."
|
|
9
|
+
|
|
10
|
+
Open-source research platform for insulin delivery algorithm simulation and validation.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## What It Does
|
|
15
|
+
|
|
16
|
+
- **Simulate** virtual patients across thousands of scenarios before any algorithm reaches a real device
|
|
17
|
+
- **Certify** datasets cryptographically — traceable, consented, reproducible
|
|
18
|
+
- **Understand** results with audit-ready reports and local AI explanation via Ministral
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Install
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pip install "iints-sdk-python35[full,mdmp]"
|
|
26
|
+
iints doctor --smoke-run
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Raspberry Pi / Arduino UNO Q:**
|
|
30
|
+
```bash
|
|
31
|
+
pip install "iints-sdk-python35[edge,mdmp]"
|
|
32
|
+
iints edge quickstart --board raspberry_pi
|
|
33
|
+
iints edge quickstart --board uno_q
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Quick Start
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
iints quickstart --project-name my_study
|
|
42
|
+
cd my_study
|
|
43
|
+
iints presets run --name baseline_t1d --algo algorithms/example_algorithm.py
|
|
44
|
+
iints ai report results/<run_id>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Full documentation: [python35.github.io/IINTS-SDK](https://python35.github.io/IINTS-SDK/)
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Live Demo
|
|
52
|
+
|
|
53
|
+
For a Zoom call, jury walkthrough, or sponsor demo where you want to show both the code and the generated outputs in one terminal flow:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
iints demo-live --output-dir results/live_demo
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
That exports the showable demo script, prints the key SDK calls, runs the demo, and lists the poster plus proof artifacts to open next.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
> Research software. Not a medical device. MIT Licensed.
|
|
64
|
+
> *Built by a 17-year-old with type 1 diabetes.*
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "iints-sdk-python35"
|
|
7
|
-
version = "1.5.
|
|
7
|
+
version = "1.5.5"
|
|
8
8
|
authors = [
|
|
9
9
|
{ name="Rune Bobbaers", email="rune.bobbaers@gmail.com" },
|
|
10
10
|
]
|
|
@@ -12,72 +12,73 @@ description = "A pre-clinical Edge-AI SDK for diabetes management validation."
|
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
license = "Apache-2.0"
|
|
14
14
|
license-files = ["LICENSE", "NOTICE", "LICENSE-MIT-IINTS-LEGACY"]
|
|
15
|
-
requires-python = ">=3.10"
|
|
15
|
+
requires-python = ">=3.10,<3.15"
|
|
16
16
|
classifiers = [
|
|
17
17
|
"Programming Language :: Python :: 3",
|
|
18
18
|
"Programming Language :: Python :: 3.10",
|
|
19
19
|
"Programming Language :: Python :: 3.11",
|
|
20
20
|
"Programming Language :: Python :: 3.12",
|
|
21
21
|
"Programming Language :: Python :: 3.13",
|
|
22
|
+
"Programming Language :: Python :: 3.14",
|
|
22
23
|
"Operating System :: OS Independent",
|
|
23
24
|
"Development Status :: 5 - Production/Stable",
|
|
24
25
|
]
|
|
25
26
|
dependencies = [
|
|
26
|
-
"fastapi>=0.115.0",
|
|
27
|
-
"numpy>=1.24.0",
|
|
28
|
-
"pandas>=2.0.0",
|
|
29
|
-
"pydantic>=2.0.0",
|
|
30
|
-
"PyYAML",
|
|
31
|
-
"rich>=12.0.0",
|
|
32
|
-
"scipy>=1.9.0",
|
|
33
|
-
"typer[all]",
|
|
34
|
-
"uvicorn>=0.30.0",
|
|
27
|
+
"fastapi>=0.115.0,<1.0.0",
|
|
28
|
+
"numpy>=1.24.0,<3.0.0",
|
|
29
|
+
"pandas>=2.0.0,<3.0.0",
|
|
30
|
+
"pydantic>=2.0.0,<3.0.0",
|
|
31
|
+
"PyYAML>=6.0.0,<7.0.0",
|
|
32
|
+
"rich>=12.0.0,<16.0.0",
|
|
33
|
+
"scipy>=1.9.0,<2.0.0",
|
|
34
|
+
"typer[all]>=0.9.0,<1.0.0",
|
|
35
|
+
"uvicorn>=0.30.0,<1.0.0",
|
|
35
36
|
]
|
|
36
37
|
|
|
37
38
|
[project.optional-dependencies]
|
|
38
39
|
edge = [
|
|
39
|
-
"pyserial>=3.5",
|
|
40
|
+
"pyserial>=3.5,<4.0",
|
|
40
41
|
]
|
|
41
42
|
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",
|
|
43
|
+
"fpdf2>=2.8.0,<3.0.0",
|
|
44
|
+
"matplotlib>=3.5.0,<4.0.0",
|
|
45
|
+
"openpyxl>=3.0.0,<4.0.0",
|
|
46
|
+
"pillow>=12.1.1,<13.0.0",
|
|
47
|
+
"seaborn>=0.11.0,<1.0.0",
|
|
47
48
|
]
|
|
48
49
|
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",
|
|
50
|
+
"fpdf2>=2.8.0,<3.0.0",
|
|
51
|
+
"matplotlib>=3.5.0,<4.0.0",
|
|
52
|
+
"openpyxl>=3.0.0,<4.0.0",
|
|
53
|
+
"pyserial>=3.5,<4.0",
|
|
54
|
+
"pillow>=12.1.1,<13.0.0",
|
|
55
|
+
"seaborn>=0.11.0,<1.0.0",
|
|
55
56
|
]
|
|
56
57
|
dev = [
|
|
57
|
-
"pytest>=7.0.0",
|
|
58
|
-
"hypothesis>=6.0.0",
|
|
59
|
-
"flake8",
|
|
60
|
-
"httpx>=0.27.0",
|
|
61
|
-
"mypy",
|
|
62
|
-
"pandas-stubs",
|
|
63
|
-
"types-PyYAML",
|
|
64
|
-
"types-psutil",
|
|
58
|
+
"pytest>=7.0.0,<10.0.0",
|
|
59
|
+
"hypothesis>=6.0.0,<7.0.0",
|
|
60
|
+
"flake8>=7.0.0,<8.0.0",
|
|
61
|
+
"httpx>=0.27.0,<1.0.0",
|
|
62
|
+
"mypy>=1.8.0,<3.0.0",
|
|
63
|
+
"pandas-stubs>=2.0.0,<3.0.0",
|
|
64
|
+
"types-PyYAML>=6.0.0,<7.0.0",
|
|
65
|
+
"types-psutil>=7.0.0,<8.0.0",
|
|
65
66
|
]
|
|
66
67
|
torch = [
|
|
67
|
-
"torch>=1.9.0",
|
|
68
|
+
"torch>=1.9.0,<3.0.0",
|
|
68
69
|
]
|
|
69
70
|
nightscout = [
|
|
70
71
|
"py-nightscout",
|
|
71
72
|
]
|
|
72
73
|
research = [
|
|
73
|
-
"torch>=2.0.0",
|
|
74
|
-
"pyarrow>=12.0.0",
|
|
75
|
-
"h5py>=3.10.0",
|
|
76
|
-
"onnx>=1.16.0",
|
|
77
|
-
"onnxscript>=0.1.0",
|
|
74
|
+
"torch>=2.0.0,<3.0.0",
|
|
75
|
+
"pyarrow>=12.0.0,<25.0.0",
|
|
76
|
+
"h5py>=3.10.0,<4.0.0",
|
|
77
|
+
"onnx>=1.16.0,<2.0.0",
|
|
78
|
+
"onnxscript>=0.1.0,<1.0.0",
|
|
78
79
|
]
|
|
79
80
|
mdmp = [
|
|
80
|
-
"cryptography>=42.0.0",
|
|
81
|
+
"cryptography>=42.0.0,<49.0.0",
|
|
81
82
|
]
|
|
82
83
|
|
|
83
84
|
[project.scripts]
|
|
@@ -87,7 +88,7 @@ iints-sdk-doctor = "iints_sdk_python35_doctor:main"
|
|
|
87
88
|
[project.entry-points."iints.algorithms"]
|
|
88
89
|
"PID Controller" = "iints.core.algorithms.pid_controller:PIDController"
|
|
89
90
|
"Fixed Basal Bolus" = "iints.core.algorithms.fixed_basal_bolus:FixedBasalBolus"
|
|
90
|
-
"Correction Bolus" = "iints.core.algorithms.correction_bolus:
|
|
91
|
+
"Correction Bolus" = "iints.core.algorithms.correction_bolus:CorrectionBolus"
|
|
91
92
|
"Standard Pump" = "iints.core.algorithms.standard_pump_algo:StandardPumpAlgorithm"
|
|
92
93
|
"Mock Constant Dose" = "iints.core.algorithms.mock_algorithms:ConstantDoseAlgorithm"
|
|
93
94
|
"Mock Random Dose" = "iints.core.algorithms.mock_algorithms:RandomDoseAlgorithm"
|
|
@@ -11,7 +11,7 @@ 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.
|
|
14
|
+
__version__ = "1.5.5"
|
|
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.
|
|
@@ -47,7 +47,7 @@ except Exception: # pragma: no cover - fallback if torch/device manager import
|
|
|
47
47
|
def get_device(self):
|
|
48
48
|
return self._device
|
|
49
49
|
from .core.safety import SafetyConfig, SafetySupervisor
|
|
50
|
-
from .core.devices.models import SensorModel, PumpModel
|
|
50
|
+
from .core.devices.models import SENSOR_PROFILES, SensorModel, PumpModel, create_sensor_model
|
|
51
51
|
from .core.algorithms.standard_pump_algo import StandardPumpAlgorithm
|
|
52
52
|
from .core.algorithms.mock_algorithms import (
|
|
53
53
|
ConstantDoseAlgorithm,
|
|
@@ -74,7 +74,7 @@ from .data.importer import (
|
|
|
74
74
|
summarize_carelink_csv,
|
|
75
75
|
)
|
|
76
76
|
from .data.nightscout import NightscoutConfig, import_nightscout
|
|
77
|
-
from .data.tidepool import TidepoolClient, load_openapi_spec
|
|
77
|
+
from .data.tidepool import TidepoolClient, TidepoolConfig, import_tidepool, load_openapi_spec
|
|
78
78
|
from .data.guardians import mdmp_gate, MDMPGateError
|
|
79
79
|
from .data.synthetic_mirror import generate_synthetic_mirror, SyntheticMirrorArtifact
|
|
80
80
|
from .data.study_corruption import AVAILABLE_STUDY_CORRUPTIONS, apply_study_corruptions, write_corrupted_study_csv
|
|
@@ -224,6 +224,8 @@ __all__ = [
|
|
|
224
224
|
"SafetyConfig",
|
|
225
225
|
"SensorModel",
|
|
226
226
|
"PumpModel",
|
|
227
|
+
"SENSOR_PROFILES",
|
|
228
|
+
"create_sensor_model",
|
|
227
229
|
"StandardPumpAlgorithm",
|
|
228
230
|
"ConstantDoseAlgorithm",
|
|
229
231
|
"RandomDoseAlgorithm",
|
|
@@ -247,6 +249,8 @@ __all__ = [
|
|
|
247
249
|
"NightscoutConfig",
|
|
248
250
|
"import_nightscout",
|
|
249
251
|
"TidepoolClient",
|
|
252
|
+
"TidepoolConfig",
|
|
253
|
+
"import_tidepool",
|
|
250
254
|
"load_openapi_spec",
|
|
251
255
|
"mdmp_gate",
|
|
252
256
|
"MDMPGateError",
|
|
@@ -160,7 +160,7 @@ def _render_local_check(console: Console, status: dict[str, object]) -> None:
|
|
|
160
160
|
console.print("[bold red]Ollama is too old for the open Ministral 3 runtime.[/bold red]")
|
|
161
161
|
|
|
162
162
|
|
|
163
|
-
@app.command("models")
|
|
163
|
+
@app.command(name="models")
|
|
164
164
|
def models() -> None:
|
|
165
165
|
console = Console()
|
|
166
166
|
table = Table(title="IINTS AI Local Mistral Model Guide")
|
|
@@ -189,7 +189,7 @@ def models() -> None:
|
|
|
189
189
|
)
|
|
190
190
|
|
|
191
191
|
|
|
192
|
-
@app.command("prepare")
|
|
192
|
+
@app.command(name="prepare")
|
|
193
193
|
def prepare(
|
|
194
194
|
run_dir: Annotated[Path, typer.Argument(help="Run output directory containing results.csv and run_metadata.json.")],
|
|
195
195
|
create_dev_mdmp_cert: Annotated[
|
|
@@ -254,7 +254,7 @@ def _build_assistant(
|
|
|
254
254
|
)
|
|
255
255
|
|
|
256
256
|
|
|
257
|
-
@app.command("local-check")
|
|
257
|
+
@app.command(name="local-check")
|
|
258
258
|
def local_check(
|
|
259
259
|
model: Annotated[str, typer.Option(help="Ollama model name to validate locally.")] = DEFAULT_MINISTRAL_MODEL,
|
|
260
260
|
ollama_host: Annotated[Optional[str], typer.Option(help="Override the Ollama base URL.")] = None,
|
|
@@ -294,7 +294,7 @@ def local_check(
|
|
|
294
294
|
raise typer.Exit(code=1)
|
|
295
295
|
|
|
296
296
|
|
|
297
|
-
@app.command("explain")
|
|
297
|
+
@app.command(name="explain")
|
|
298
298
|
def explain(
|
|
299
299
|
input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with a single simulation step or decision context.")],
|
|
300
300
|
mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
|
|
@@ -335,7 +335,7 @@ def explain(
|
|
|
335
335
|
raise typer.Exit(code=1)
|
|
336
336
|
|
|
337
337
|
|
|
338
|
-
@app.command("trends")
|
|
338
|
+
@app.command(name="trends")
|
|
339
339
|
def trends(
|
|
340
340
|
input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with glucose trace data or a run payload.")],
|
|
341
341
|
mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
|
|
@@ -376,7 +376,7 @@ def trends(
|
|
|
376
376
|
raise typer.Exit(code=1)
|
|
377
377
|
|
|
378
378
|
|
|
379
|
-
@app.command("anomalies")
|
|
379
|
+
@app.command(name="anomalies")
|
|
380
380
|
def anomalies(
|
|
381
381
|
input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with simulation results or run summary.")],
|
|
382
382
|
mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
|
|
@@ -417,7 +417,7 @@ def anomalies(
|
|
|
417
417
|
raise typer.Exit(code=1)
|
|
418
418
|
|
|
419
419
|
|
|
420
|
-
@app.command("report")
|
|
420
|
+
@app.command(name="report")
|
|
421
421
|
def report(
|
|
422
422
|
input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with run-level simulation outputs.")],
|
|
423
423
|
mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
|
|
@@ -458,7 +458,7 @@ def report(
|
|
|
458
458
|
raise typer.Exit(code=1)
|
|
459
459
|
|
|
460
460
|
|
|
461
|
-
@app.command("review")
|
|
461
|
+
@app.command(name="review")
|
|
462
462
|
def review(
|
|
463
463
|
input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with run-level simulation outputs.")],
|
|
464
464
|
mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
|
|
@@ -15,6 +15,12 @@ from .study_protocol import (
|
|
|
15
15
|
render_study_protocol_markdown,
|
|
16
16
|
write_study_protocol_bundle,
|
|
17
17
|
)
|
|
18
|
+
from .study_experiment import (
|
|
19
|
+
StudyExperimentConfig,
|
|
20
|
+
build_study_experiment_template,
|
|
21
|
+
load_study_experiment_config,
|
|
22
|
+
render_study_experiment_yaml,
|
|
23
|
+
)
|
|
18
24
|
from .study_analysis import (
|
|
19
25
|
analyze_run_directory,
|
|
20
26
|
analyze_study_directory,
|
|
@@ -112,8 +118,11 @@ __all__ = [
|
|
|
112
118
|
"build_algorithm_registry",
|
|
113
119
|
"build_study_design_payload",
|
|
114
120
|
"build_study_protocol_payload",
|
|
121
|
+
"build_study_experiment_template",
|
|
115
122
|
"render_study_protocol_markdown",
|
|
123
|
+
"render_study_experiment_yaml",
|
|
116
124
|
"write_study_protocol_bundle",
|
|
125
|
+
"load_study_experiment_config",
|
|
117
126
|
"load_study_summary",
|
|
118
127
|
"quality_badges_for_metrics",
|
|
119
128
|
"run_baseline_comparison",
|
|
@@ -121,6 +130,7 @@ __all__ = [
|
|
|
121
130
|
"StudyArmSpec",
|
|
122
131
|
"StudyComparison",
|
|
123
132
|
"StudyDesignPayload",
|
|
133
|
+
"StudyExperimentConfig",
|
|
124
134
|
"StudyMatrixRow",
|
|
125
135
|
"StudyProfileSpec",
|
|
126
136
|
"StudyRunSummary",
|
|
@@ -8,6 +8,7 @@ import pandas as pd
|
|
|
8
8
|
|
|
9
9
|
from iints.analysis.clinical_metrics import ClinicalMetricsCalculator
|
|
10
10
|
from iints.api.base_algorithm import InsulinAlgorithm
|
|
11
|
+
from iints.core.algorithms.clinical_baseline import ClinicalBaselineAlgorithm
|
|
11
12
|
from iints.core.algorithms.pid_controller import PIDController
|
|
12
13
|
from iints.core.algorithms.standard_pump_algo import StandardPumpAlgorithm
|
|
13
14
|
from iints.core.patient.models import PatientModel
|
|
@@ -51,7 +52,10 @@ def run_baseline_comparison(
|
|
|
51
52
|
}
|
|
52
53
|
)
|
|
53
54
|
|
|
54
|
-
baselines: List[Tuple[str, InsulinAlgorithm]] = [
|
|
55
|
+
baselines: List[Tuple[str, InsulinAlgorithm]] = [
|
|
56
|
+
("Clinical Baseline", ClinicalBaselineAlgorithm()),
|
|
57
|
+
("Standard PID", PIDController()),
|
|
58
|
+
]
|
|
55
59
|
if compare_standard_pump:
|
|
56
60
|
baselines.append(("Standard Pump", StandardPumpAlgorithm()))
|
|
57
61
|
|
|
@@ -70,7 +70,7 @@ def build_eucys_abstract_draft_markdown() -> str:
|
|
|
70
70
|
"",
|
|
71
71
|
"The central research question is whether a transparent, safety-first benchmark can evaluate candidate insulin-decision algorithms more rigorously than isolated demo runs or single-metric comparisons. "
|
|
72
72
|
"The platform combines virtual patient simulation, baseline comparison, safety-layer analysis, protocol bundles, subgroup summaries, and exportable study artifacts. "
|
|
73
|
-
"Instead of showing one favorable run, IINTS-AF compares a candidate algorithm against classical baselines such as `PID Controller`, `Standard Pump`, and `Correction Bolus` across predefined patient profiles, scenario families, and random seeds.",
|
|
73
|
+
"Instead of showing one favorable run, IINTS-AF compares a candidate algorithm against classical baselines such as `Clinical Baseline`, `PID Controller`, `Standard Pump`, and `Correction Bolus` across predefined patient profiles, scenario families, and random seeds.",
|
|
74
74
|
"",
|
|
75
75
|
"In the final benchmark bundle, the platform evaluated **[RUN_COUNT]** runs across **[PROFILE_COUNT]** patient profiles, **[SCENARIO_COUNT]** scenario families, and **[ALGORITHM_COUNT]** algorithms. "
|
|
76
76
|
"The candidate algorithm achieved **[CANDIDATE_TIR]%** time in range compared with **[BASELINE_TIR]%** for the strongest baseline, while the safety analysis showed **[SAFETY_RESULT]**. "
|
|
@@ -235,7 +235,7 @@ def build_eucys_filled_abstract_markdown(
|
|
|
235
235
|
"In this project, I developed **IINTS-AF**, a simulation-first benchmark platform for testing insulin-decision algorithms under fixed study protocols.",
|
|
236
236
|
"",
|
|
237
237
|
"The platform combines virtual patient simulation, baseline comparison, safety-layer analysis, protocol bundles, subgroup summaries, and exportable study artifacts. "
|
|
238
|
-
"Instead of showing a single favorable run, IINTS-AF compares a candidate algorithm against classical baselines such as `PID Controller`, `Standard Pump`, and `Correction Bolus` across predefined profiles, scenario families, and random seeds.",
|
|
238
|
+
"Instead of showing a single favorable run, IINTS-AF compares a candidate algorithm against classical baselines such as `Clinical Baseline`, `PID Controller`, `Standard Pump`, and `Correction Bolus` across predefined profiles, scenario families, and random seeds.",
|
|
239
239
|
"",
|
|
240
240
|
f"In the current benchmark bundle, the platform evaluated **{run_count}** runs across **{counts['profile_count']}** patient profiles, **{counts['scenario_count']}** scenario families, and **{counts['algorithm_count']}** algorithms. "
|
|
241
241
|
f"In the clean certified arm, **{candidate_name}** achieved **{candidate_tir}** time in range compared with **{baseline_tir}** for **{strongest_baseline}**, while the safety layer recorded **{safety_result}**. "
|
{iints_sdk_python35-1.5.3 → iints_sdk_python35-1.5.5}/src/iints/analysis/hardware_benchmark.py
RENAMED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import logging
|
|
1
5
|
import time
|
|
2
6
|
import subprocess
|
|
3
7
|
import threading
|
|
4
8
|
import psutil
|
|
5
|
-
import json
|
|
6
9
|
from typing import Dict, List, Optional
|
|
7
10
|
from dataclasses import dataclass, asdict
|
|
8
11
|
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
9
15
|
@dataclass
|
|
10
16
|
class PerformanceMetrics:
|
|
11
17
|
timestamp: float
|
|
@@ -32,7 +38,8 @@ class HardwareBenchmark:
|
|
|
32
38
|
with open('/proc/device-tree/model', 'r') as f:
|
|
33
39
|
model = f.read().strip()
|
|
34
40
|
return 'jetson' in model.lower()
|
|
35
|
-
except:
|
|
41
|
+
except (FileNotFoundError, OSError, ValueError) as exc:
|
|
42
|
+
logger.debug("Jetson detection unavailable: %s", exc)
|
|
36
43
|
return False
|
|
37
44
|
|
|
38
45
|
def _get_tegrastats_metrics(self) -> Optional[Dict]:
|
|
@@ -51,8 +58,11 @@ class HardwareBenchmark:
|
|
|
51
58
|
line = lines[-1] # Get last line
|
|
52
59
|
# This is a simplified parser - real implementation would be more robust
|
|
53
60
|
return {"raw_tegrastats": line}
|
|
54
|
-
|
|
55
|
-
|
|
61
|
+
logger.debug("tegrastats exited with non-zero status: %s", result.returncode)
|
|
62
|
+
except subprocess.TimeoutExpired as exc:
|
|
63
|
+
logger.debug("tegrastats timed out: %s", exc)
|
|
64
|
+
except (FileNotFoundError, OSError, ValueError) as exc:
|
|
65
|
+
logger.debug("tegrastats unavailable: %s", exc)
|
|
56
66
|
return None
|
|
57
67
|
|
|
58
68
|
def _collect_metrics(self) -> PerformanceMetrics:
|
|
@@ -82,8 +92,8 @@ class HardwareBenchmark:
|
|
|
82
92
|
with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f:
|
|
83
93
|
temp_millicelsius = int(f.read().strip())
|
|
84
94
|
temperature = temp_millicelsius / 1000.0
|
|
85
|
-
except:
|
|
86
|
-
|
|
95
|
+
except (FileNotFoundError, OSError, ValueError) as exc:
|
|
96
|
+
logger.debug("temperature probe unavailable: %s", exc)
|
|
87
97
|
|
|
88
98
|
return PerformanceMetrics(
|
|
89
99
|
timestamp=timestamp,
|
|
@@ -218,4 +228,4 @@ class HardwareBenchmark:
|
|
|
218
228
|
|
|
219
229
|
def clear_metrics(self):
|
|
220
230
|
"""Clear collected metrics."""
|
|
221
|
-
self.metrics_history.clear()
|
|
231
|
+
self.metrics_history.clear()
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import tempfile
|
|
3
|
+
import logging
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
from typing import Any, Dict, Optional
|
|
5
6
|
|
|
@@ -14,6 +15,8 @@ from fpdf.enums import XPos, YPos
|
|
|
14
15
|
from iints.analysis.clinical_metrics import ClinicalMetricsCalculator
|
|
15
16
|
from iints.utils.plotting import apply_plot_style
|
|
16
17
|
|
|
18
|
+
logger = logging.getLogger("iints")
|
|
19
|
+
|
|
17
20
|
|
|
18
21
|
class ClinicalReportGenerator:
|
|
19
22
|
"""Generate a clean, publication-ready PDF report."""
|
|
@@ -41,8 +44,8 @@ class ClinicalReportGenerator:
|
|
|
41
44
|
x_pos = pdf.w - pdf.r_margin - logo_width
|
|
42
45
|
y_pos = 6
|
|
43
46
|
pdf.image(str(logo_path), x=x_pos, y=y_pos, w=logo_width)
|
|
44
|
-
except
|
|
45
|
-
|
|
47
|
+
except (OSError, RuntimeError, ValueError) as exc:
|
|
48
|
+
logger.debug("Skipping report logo render: %s", exc)
|
|
46
49
|
return
|
|
47
50
|
|
|
48
51
|
def _plot_glucose(self, df: pd.DataFrame, output_path: Path) -> None:
|