iints-sdk-python35 1.5.2__tar.gz → 1.5.4__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.4/PKG-INFO +200 -0
- iints_sdk_python35-1.5.4/README.md +134 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/pyproject.toml +6 -2
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/__init__.py +20 -3
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/cli.py +8 -8
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/__init__.py +44 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/baseline.py +7 -2
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/booth_demo.py +286 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/carelink_workbench.py +1 -1
- iints_sdk_python35-1.5.4/src/iints/analysis/eucys_results.py +549 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/hardware_benchmark.py +17 -7
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/reporting.py +5 -2
- iints_sdk_python35-1.5.4/src/iints/analysis/study_analysis.py +1289 -0
- iints_sdk_python35-1.5.4/src/iints/analysis/study_engine.py +442 -0
- iints_sdk_python35-1.5.4/src/iints/analysis/study_experiment.py +168 -0
- iints_sdk_python35-1.5.4/src/iints/analysis/study_poster.py +344 -0
- iints_sdk_python35-1.5.4/src/iints/analysis/study_protocol.py +307 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/cli/cli.py +3028 -607
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/cli/patient_cli.py +100 -15
- iints_sdk_python35-1.5.4/src/iints/core/algorithms/clinical_baseline.py +151 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/pid_controller.py +22 -6
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/patient/models.py +27 -8
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/simulator.py +2 -1
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/nightscout.py +4 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/registry.py +36 -1
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/tidepool.py +5 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/highlevel.py +9 -3
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/live_patient/__init__.py +23 -1
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/live_patient/api.py +182 -51
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/live_patient/daemon.py +22 -1
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/live_patient/edge_benchmark.py +3 -3
- iints_sdk_python35-1.5.4/src/iints/live_patient/edge_ops.py +1221 -0
- iints_sdk_python35-1.5.4/src/iints/live_patient/long_study.py +885 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/live_patient/runtime.py +101 -20
- iints_sdk_python35-1.5.4/src/iints/live_patient/service_export.py +578 -0
- iints_sdk_python35-1.5.4/src/iints/live_patient/uno_q.py +413 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/scenarios/study_pack.py +4 -7
- iints_sdk_python35-1.5.4/src/iints/templates/uno_q/README.md +110 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/uno_q/iints_supervisor_bridge.ino +4 -0
- iints_sdk_python35-1.5.4/src/iints/utils/csv_safety.py +31 -0
- iints_sdk_python35-1.5.4/src/iints/utils/url_safety.py +33 -0
- iints_sdk_python35-1.5.4/src/iints_sdk_python35.egg-info/PKG-INFO +200 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints_sdk_python35.egg-info/SOURCES.txt +10 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints_sdk_python35.egg-info/requires.txt +3 -0
- iints_sdk_python35-1.5.4/tests/test_cli_algorithm_loading.py +24 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/tests/test_cli_booth_demo.py +6 -0
- iints_sdk_python35-1.5.4/tests/test_cli_cloud_import_security.py +131 -0
- iints_sdk_python35-1.5.4/tests/test_cli_edge_runtime.py +686 -0
- iints_sdk_python35-1.5.4/tests/test_cli_expo_tools.py +518 -0
- iints_sdk_python35-1.5.4/tests/test_cli_onboarding.py +92 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/tests/test_cli_patient_runtime.py +88 -0
- iints_sdk_python35-1.5.2/PKG-INFO +0 -120
- iints_sdk_python35-1.5.2/README.md +0 -57
- iints_sdk_python35-1.5.2/src/iints/analysis/study_analysis.py +0 -721
- iints_sdk_python35-1.5.2/src/iints/analysis/study_poster.py +0 -150
- iints_sdk_python35-1.5.2/src/iints/analysis/study_protocol.py +0 -310
- iints_sdk_python35-1.5.2/src/iints/live_patient/edge_ops.py +0 -391
- iints_sdk_python35-1.5.2/src/iints/live_patient/service_export.py +0 -71
- iints_sdk_python35-1.5.2/src/iints/live_patient/uno_q.py +0 -37
- iints_sdk_python35-1.5.2/src/iints/templates/uno_q/README.md +0 -21
- iints_sdk_python35-1.5.2/src/iints_sdk_python35.egg-info/PKG-INFO +0 -120
- iints_sdk_python35-1.5.2/tests/test_cli_edge_runtime.py +0 -43
- iints_sdk_python35-1.5.2/tests/test_cli_expo_tools.py +0 -246
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/LICENSE +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/LICENSE-MIT-IINTS-LEGACY +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/NOTICE +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/setup.cfg +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/assistant.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/backends/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/backends/base.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/backends/mistral_api.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/backends/ollama.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/mdmp_guard.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/model_catalog.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/prepare.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/ai/prompts.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/algorithm_xray.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/clinical_benchmark.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/clinical_metrics.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/clinical_tir_analyzer.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/diabetes_metrics.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/edge_efficiency.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/edge_performance_monitor.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/explainability.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/explainable_ai.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/metrics.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/population_report.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/poster.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/safety_index.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/sensor_filtering.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/analysis/validator.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/api/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/api/base_algorithm.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/api/registry.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/api/template_algorithm.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/assets/iints_logo.png +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/cli/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/battle_runner.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/correction_bolus.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/discovery.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/fixed_basal_bolus.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/hybrid_algorithm.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/lstm_algorithm.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/mock_algorithms.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/algorithms/standard_pump_algo.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/device.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/device_manager.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/devices/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/devices/models.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/patient/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/patient/bergman_model.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/patient/patient_factory.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/patient/profile.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/safety/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/safety/config.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/safety/input_validator.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/safety/supervisor.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/simulation/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/simulation/scenario_parser.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/core/supervisor.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/adapter.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/certify.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/column_mapper.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/contracts.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/datasets.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/demo/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/demo/demo_cgm.csv +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/guardians.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/importer.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/ingestor.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/mdmp_visualizer.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/quality_checker.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/runner.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/study_corruption.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/synthetic_mirror.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/universal_parser.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/virtual_patients/clinic_safe_baseline.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/virtual_patients/clinic_safe_hyper_challenge.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/virtual_patients/clinic_safe_hypo_prone.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/virtual_patients/clinic_safe_midnight.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/virtual_patients/clinic_safe_pizza.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/virtual_patients/clinic_safe_stress_meal.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/virtual_patients/default_patient.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/data/virtual_patients/patient_559_config.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/demo_assets.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/emulation/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/emulation/legacy_base.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/emulation/medtronic_780g.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/emulation/omnipod_5.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/emulation/tandem_controliq.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/learning/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/learning/autonomous_optimizer.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/learning/learning_system.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/mdmp/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/mdmp/backend.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/metrics.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/population/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/population/generator.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/population/runner.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/presets/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/presets/evidence_sources.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/presets/forecast_calibration_profiles.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/presets/golden_benchmark.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/presets/presets.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/presets/safety_contract_default.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/presets/validation_profiles.yaml +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/audit.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/calibration_gate.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/config.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/dataset.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/evaluation.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/losses.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/metrics.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/model_registry.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/research/predictor.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/scenarios/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/scenarios/generator.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/default_algorithm.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/demos/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/demos/live_stage_demo.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/scenarios/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/scenarios/chaos_insulin_stacking.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/scenarios/chaos_runaway_ai.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/scenarios/example_scenario.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/templates/scenarios/exercise_stress.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/utils/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/utils/plotting.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/utils/run_io.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/validation/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/validation/golden.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/validation/replay.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/validation/run_validation.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/validation/safety_contract.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/validation/schemas.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/visualization/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/visualization/cockpit.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints/visualization/uncertainty_cloud.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints_sdk_python35.egg-info/dependency_links.txt +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints_sdk_python35.egg-info/entry_points.txt +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/iints_sdk_python35.egg-info/top_level.txt +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_ai/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_ai/lineage.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/audit.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/bias_hooks.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/bundle.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/certification.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/cli.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/compare.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/conformance.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/contracts.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/crypto.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/data/conformance/vectors/delegation.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/data/conformance/vectors/fingerprint.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/data/conformance/vectors/grading.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/data/conformance/vectors/signing.json +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/delegate.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/diffing.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/drift.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/exceptions.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/fingerprint.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/fingerprint_store.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/hf.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/keys/mdmp_pub_v1.pem +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/llm_provenance.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/migrate.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/policy.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/prov.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/registry.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/runner.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/schema_export.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/synthetic.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/trust.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_core/visualizer.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_flavors/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_integrations/__init__.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_integrations/dvc.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_integrations/mlflow.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/src/mdmp_integrations/wandb.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/tests/test_bergman.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/tests/test_cli_carelink_workbench.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/tests/test_cli_demo_export.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/tests/test_cli_poster.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/tests/test_install_doctor.py +0 -0
- {iints_sdk_python35-1.5.2 → iints_sdk_python35-1.5.4}/tests/test_population.py +0 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: iints-sdk-python35
|
|
3
|
+
Version: 1.5.4
|
|
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: Operating System :: OS Independent
|
|
14
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
15
|
+
Requires-Python: >=3.10
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE
|
|
18
|
+
License-File: NOTICE
|
|
19
|
+
License-File: LICENSE-MIT-IINTS-LEGACY
|
|
20
|
+
Requires-Dist: fastapi>=0.115.0
|
|
21
|
+
Requires-Dist: numpy>=1.24.0
|
|
22
|
+
Requires-Dist: pandas>=2.0.0
|
|
23
|
+
Requires-Dist: pydantic>=2.0.0
|
|
24
|
+
Requires-Dist: PyYAML
|
|
25
|
+
Requires-Dist: rich>=12.0.0
|
|
26
|
+
Requires-Dist: scipy>=1.9.0
|
|
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"
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
46
|
+
Requires-Dist: hypothesis>=6.0.0; extra == "dev"
|
|
47
|
+
Requires-Dist: flake8; extra == "dev"
|
|
48
|
+
Requires-Dist: httpx>=0.27.0; extra == "dev"
|
|
49
|
+
Requires-Dist: mypy; extra == "dev"
|
|
50
|
+
Requires-Dist: pandas-stubs; extra == "dev"
|
|
51
|
+
Requires-Dist: types-PyYAML; extra == "dev"
|
|
52
|
+
Requires-Dist: types-psutil; extra == "dev"
|
|
53
|
+
Provides-Extra: torch
|
|
54
|
+
Requires-Dist: torch>=1.9.0; extra == "torch"
|
|
55
|
+
Provides-Extra: nightscout
|
|
56
|
+
Requires-Dist: py-nightscout; extra == "nightscout"
|
|
57
|
+
Provides-Extra: research
|
|
58
|
+
Requires-Dist: torch>=2.0.0; extra == "research"
|
|
59
|
+
Requires-Dist: pyarrow>=12.0.0; extra == "research"
|
|
60
|
+
Requires-Dist: h5py>=3.10.0; extra == "research"
|
|
61
|
+
Requires-Dist: onnx>=1.16.0; extra == "research"
|
|
62
|
+
Requires-Dist: onnxscript>=0.1.0; extra == "research"
|
|
63
|
+
Provides-Extra: mdmp
|
|
64
|
+
Requires-Dist: cryptography>=42.0.0; extra == "mdmp"
|
|
65
|
+
Dynamic: license-file
|
|
66
|
+
|
|
67
|
+
# IINTS-AF SDK
|
|
68
|
+
[](https://eucys.eu)
|
|
69
|
+
[](https://badge.fury.io/py/iints-sdk-python35)
|
|
70
|
+
[](https://github.com/python35/IINTS-SDK/actions/workflows/python-package.yml)
|
|
71
|
+
[](https://python35.github.io/IINTS-SDK/)
|
|
72
|
+
|
|
73
|
+
> "Code shouldn't be a secret when it's managing a life."
|
|
74
|
+
|
|
75
|
+
Insulin pumps make hundreds of autonomous decisions about drug delivery every day.
|
|
76
|
+
The algorithms behind those decisions are proprietary, unauditable, and difficult to inspect or improve, even by the patients whose lives depend on them.
|
|
77
|
+
|
|
78
|
+
IINTS-AF is an open-source research platform that changes that.
|
|
79
|
+
|
|
80
|
+
## Core Research Question
|
|
81
|
+
|
|
82
|
+
**Can open-source simulation and deterministic safety supervision make insulin delivery algorithm development safer and more transparent for researchers and patients?**
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## What It Does
|
|
87
|
+
|
|
88
|
+
**Simulate:** Run virtual patients through thousands of scenarios before any algorithm reaches a real device. A deterministic safety supervisor audits every AI decision. The AI may suggest. The supervisor decides.
|
|
89
|
+
|
|
90
|
+
**Certify:** Every dataset is fingerprinted and graded before it touches a study workflow. The goal is to keep benchmark inputs traceable, reviewable, and reproducible.
|
|
91
|
+
|
|
92
|
+
**Understand:** Generate audit-ready reports, visual posters, and local AI summaries from the same study bundle. IINTS-AF can use local models such as Ministral for explanation workflows on your own hardware.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Research Results
|
|
97
|
+
|
|
98
|
+
Final locked benchmark: `3600` simulation runs, `6` profiles, `4` scenario families, `5` algorithms, `10` fixed seeds.
|
|
99
|
+
|
|
100
|
+
| Metric | ExampleAlgorithm | PID Baseline | Delta |
|
|
101
|
+
|---|---:|---:|---:|
|
|
102
|
+
| Time in Range | 87.16% | 83.72% | +3.44% |
|
|
103
|
+
| Time < 70 mg/dL | 1.28% | 5.25% | -3.97% |
|
|
104
|
+
| Supervisor interventions | 99 | 177 | -78 |
|
|
105
|
+
|
|
106
|
+
Additional benchmark result:
|
|
107
|
+
- clean certified conditions showed `+17.64` Time-in-Range points versus corrupted uncertified conditions
|
|
108
|
+
|
|
109
|
+
For the full scientific write-up, see:
|
|
110
|
+
- `research/EUCYS_REPORT.md`
|
|
111
|
+
- `research/EUCYS_REPORT.pdf`
|
|
112
|
+
- `results/eucys_2026/EUCYS_RESULTS/EUCYS_SUMMARY.md`
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Install
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
python3 -m venv .venv && source .venv/bin/activate
|
|
120
|
+
pip install -U "iints-sdk-python35[full,mdmp]"
|
|
121
|
+
iints doctor --smoke-run
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Edge devices (Raspberry Pi 5, Arduino UNO Q):**
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
pip install -U "iints-sdk-python35[edge,mdmp]"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Quick Start
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
iints quickstart --project-name my_study
|
|
136
|
+
cd my_study
|
|
137
|
+
iints presets run --name baseline_t1d --algo algorithms/example_algorithm.py
|
|
138
|
+
iints data certify contracts/clinical_mdmp_contract.yaml data/demo/diabetes_cgm.csv --output-json audit/certification.json
|
|
139
|
+
iints ai report results/<run_id>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Final Benchmark Workflow
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
tools/research/run_eucys_final.sh \
|
|
148
|
+
--algo algorithms/example_algorithm.py \
|
|
149
|
+
--output-dir results/eucys_2026 \
|
|
150
|
+
--seeds 1,2,3,4,5,6,7,8,9,10
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Then render the report:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
tools/research/render_eucys_report_pdf.sh
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Main final artifacts:
|
|
160
|
+
- `results/eucys_2026/`
|
|
161
|
+
- `results/eucys_2026/EUCYS_RESULTS/EUCYS_MAIN_FIGURE.png`
|
|
162
|
+
- `results/eucys_2026/EUCYS_RESULTS/EUCYS_RESULTS_TABLE.csv`
|
|
163
|
+
- `research/EUCYS_REPORT.md`
|
|
164
|
+
- `research/EUCYS_REPORT.pdf`
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Live Digital Patient (Raspberry Pi)
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
iints patient start \
|
|
172
|
+
--algo algorithms/example_algorithm.py \
|
|
173
|
+
--scenario-profile expo_hot_start \
|
|
174
|
+
--mode demo-time --speed 60x
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Open `http://127.0.0.1:8765/dashboard`. You will see a virtual patient running continuously, reacting to meals, exercise, and sleep in real time.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Documentation
|
|
182
|
+
|
|
183
|
+
| | |
|
|
184
|
+
|---|---|
|
|
185
|
+
| Getting started | [Open guide](https://python35.github.io/IINTS-SDK/GETTING_STARTED/) |
|
|
186
|
+
| Edge hardware | [Open guide](https://python35.github.io/IINTS-SDK/EDGE_HARDWARE/) |
|
|
187
|
+
| Raspberry Pi setup | [Open guide](https://python35.github.io/IINTS-SDK/DIGITAL_PATIENT_PI/) |
|
|
188
|
+
| Data certification | [Open guide](https://python35.github.io/IINTS-SDK/MDMP_QUICKSTART/) |
|
|
189
|
+
| Full manual | [Open PDF manual](https://python35.github.io/IINTS-SDK/manuals/IINTS-AF_SDK_Manual.pdf) |
|
|
190
|
+
| Research report | [Open report source](research/EUCYS_REPORT.md) |
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
> IINTS-AF is research software. Not a medical device.
|
|
195
|
+
> No clinical dosing advice. MIT Licensed.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
*Built by a 17-year-old with type 1 diabetes who wanted to
|
|
200
|
+
understand the device managing his life.*
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# IINTS-AF SDK
|
|
2
|
+
[](https://eucys.eu)
|
|
3
|
+
[](https://badge.fury.io/py/iints-sdk-python35)
|
|
4
|
+
[](https://github.com/python35/IINTS-SDK/actions/workflows/python-package.yml)
|
|
5
|
+
[](https://python35.github.io/IINTS-SDK/)
|
|
6
|
+
|
|
7
|
+
> "Code shouldn't be a secret when it's managing a life."
|
|
8
|
+
|
|
9
|
+
Insulin pumps make hundreds of autonomous decisions about drug delivery every day.
|
|
10
|
+
The algorithms behind those decisions are proprietary, unauditable, and difficult to inspect or improve, even by the patients whose lives depend on them.
|
|
11
|
+
|
|
12
|
+
IINTS-AF is an open-source research platform that changes that.
|
|
13
|
+
|
|
14
|
+
## Core Research Question
|
|
15
|
+
|
|
16
|
+
**Can open-source simulation and deterministic safety supervision make insulin delivery algorithm development safer and more transparent for researchers and patients?**
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## What It Does
|
|
21
|
+
|
|
22
|
+
**Simulate:** Run virtual patients through thousands of scenarios before any algorithm reaches a real device. A deterministic safety supervisor audits every AI decision. The AI may suggest. The supervisor decides.
|
|
23
|
+
|
|
24
|
+
**Certify:** Every dataset is fingerprinted and graded before it touches a study workflow. The goal is to keep benchmark inputs traceable, reviewable, and reproducible.
|
|
25
|
+
|
|
26
|
+
**Understand:** Generate audit-ready reports, visual posters, and local AI summaries from the same study bundle. IINTS-AF can use local models such as Ministral for explanation workflows on your own hardware.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Research Results
|
|
31
|
+
|
|
32
|
+
Final locked benchmark: `3600` simulation runs, `6` profiles, `4` scenario families, `5` algorithms, `10` fixed seeds.
|
|
33
|
+
|
|
34
|
+
| Metric | ExampleAlgorithm | PID Baseline | Delta |
|
|
35
|
+
|---|---:|---:|---:|
|
|
36
|
+
| Time in Range | 87.16% | 83.72% | +3.44% |
|
|
37
|
+
| Time < 70 mg/dL | 1.28% | 5.25% | -3.97% |
|
|
38
|
+
| Supervisor interventions | 99 | 177 | -78 |
|
|
39
|
+
|
|
40
|
+
Additional benchmark result:
|
|
41
|
+
- clean certified conditions showed `+17.64` Time-in-Range points versus corrupted uncertified conditions
|
|
42
|
+
|
|
43
|
+
For the full scientific write-up, see:
|
|
44
|
+
- `research/EUCYS_REPORT.md`
|
|
45
|
+
- `research/EUCYS_REPORT.pdf`
|
|
46
|
+
- `results/eucys_2026/EUCYS_RESULTS/EUCYS_SUMMARY.md`
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Install
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
python3 -m venv .venv && source .venv/bin/activate
|
|
54
|
+
pip install -U "iints-sdk-python35[full,mdmp]"
|
|
55
|
+
iints doctor --smoke-run
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Edge devices (Raspberry Pi 5, Arduino UNO Q):**
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install -U "iints-sdk-python35[edge,mdmp]"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Quick Start
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
iints quickstart --project-name my_study
|
|
70
|
+
cd my_study
|
|
71
|
+
iints presets run --name baseline_t1d --algo algorithms/example_algorithm.py
|
|
72
|
+
iints data certify contracts/clinical_mdmp_contract.yaml data/demo/diabetes_cgm.csv --output-json audit/certification.json
|
|
73
|
+
iints ai report results/<run_id>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Final Benchmark Workflow
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
tools/research/run_eucys_final.sh \
|
|
82
|
+
--algo algorithms/example_algorithm.py \
|
|
83
|
+
--output-dir results/eucys_2026 \
|
|
84
|
+
--seeds 1,2,3,4,5,6,7,8,9,10
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Then render the report:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
tools/research/render_eucys_report_pdf.sh
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Main final artifacts:
|
|
94
|
+
- `results/eucys_2026/`
|
|
95
|
+
- `results/eucys_2026/EUCYS_RESULTS/EUCYS_MAIN_FIGURE.png`
|
|
96
|
+
- `results/eucys_2026/EUCYS_RESULTS/EUCYS_RESULTS_TABLE.csv`
|
|
97
|
+
- `research/EUCYS_REPORT.md`
|
|
98
|
+
- `research/EUCYS_REPORT.pdf`
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Live Digital Patient (Raspberry Pi)
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
iints patient start \
|
|
106
|
+
--algo algorithms/example_algorithm.py \
|
|
107
|
+
--scenario-profile expo_hot_start \
|
|
108
|
+
--mode demo-time --speed 60x
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Open `http://127.0.0.1:8765/dashboard`. You will see a virtual patient running continuously, reacting to meals, exercise, and sleep in real time.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Documentation
|
|
116
|
+
|
|
117
|
+
| | |
|
|
118
|
+
|---|---|
|
|
119
|
+
| Getting started | [Open guide](https://python35.github.io/IINTS-SDK/GETTING_STARTED/) |
|
|
120
|
+
| Edge hardware | [Open guide](https://python35.github.io/IINTS-SDK/EDGE_HARDWARE/) |
|
|
121
|
+
| Raspberry Pi setup | [Open guide](https://python35.github.io/IINTS-SDK/DIGITAL_PATIENT_PI/) |
|
|
122
|
+
| Data certification | [Open guide](https://python35.github.io/IINTS-SDK/MDMP_QUICKSTART/) |
|
|
123
|
+
| Full manual | [Open PDF manual](https://python35.github.io/IINTS-SDK/manuals/IINTS-AF_SDK_Manual.pdf) |
|
|
124
|
+
| Research report | [Open report source](research/EUCYS_REPORT.md) |
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
> IINTS-AF is research software. Not a medical device.
|
|
129
|
+
> No clinical dosing advice. MIT Licensed.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
*Built by a 17-year-old with type 1 diabetes who wanted to
|
|
134
|
+
understand the device managing his life.*
|
|
@@ -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.4"
|
|
8
8
|
authors = [
|
|
9
9
|
{ name="Rune Bobbaers", email="rune.bobbaers@gmail.com" },
|
|
10
10
|
]
|
|
@@ -35,7 +35,9 @@ dependencies = [
|
|
|
35
35
|
]
|
|
36
36
|
|
|
37
37
|
[project.optional-dependencies]
|
|
38
|
-
edge = [
|
|
38
|
+
edge = [
|
|
39
|
+
"pyserial>=3.5",
|
|
40
|
+
]
|
|
39
41
|
reports = [
|
|
40
42
|
"fpdf2>=2.8.0",
|
|
41
43
|
"matplotlib>=3.5.0",
|
|
@@ -47,6 +49,7 @@ full = [
|
|
|
47
49
|
"fpdf2>=2.8.0",
|
|
48
50
|
"matplotlib>=3.5.0",
|
|
49
51
|
"openpyxl>=3.0.0",
|
|
52
|
+
"pyserial>=3.5",
|
|
50
53
|
"pillow>=12.1.1",
|
|
51
54
|
"seaborn>=0.11.0",
|
|
52
55
|
]
|
|
@@ -54,6 +57,7 @@ dev = [
|
|
|
54
57
|
"pytest>=7.0.0",
|
|
55
58
|
"hypothesis>=6.0.0",
|
|
56
59
|
"flake8",
|
|
60
|
+
"httpx>=0.27.0",
|
|
57
61
|
"mypy",
|
|
58
62
|
"pandas-stubs",
|
|
59
63
|
"types-PyYAML",
|
|
@@ -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,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.4"
|
|
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.
|
|
@@ -95,9 +95,26 @@ from .live_patient import (
|
|
|
95
95
|
summarize_edge_workspace,
|
|
96
96
|
write_edge_update_script,
|
|
97
97
|
)
|
|
98
|
-
from .highlevel import run_simulation, run_full, run_population
|
|
99
98
|
from .scenarios import ScenarioGeneratorConfig, generate_random_scenario
|
|
100
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
|
+
|
|
101
118
|
try:
|
|
102
119
|
from .analysis.booth_demo import build_booth_demo
|
|
103
120
|
except Exception as exc: # pragma: no cover - optional reports stack
|
|
@@ -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,
|
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
from .clinical_metrics import ClinicalMetricsCalculator, ClinicalMetricsResult
|
|
2
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
|
+
)
|
|
3
13
|
from .study_protocol import (
|
|
4
14
|
build_study_protocol_payload,
|
|
5
15
|
render_study_protocol_markdown,
|
|
6
16
|
write_study_protocol_bundle,
|
|
7
17
|
)
|
|
18
|
+
from .study_experiment import (
|
|
19
|
+
StudyExperimentConfig,
|
|
20
|
+
build_study_experiment_template,
|
|
21
|
+
load_study_experiment_config,
|
|
22
|
+
render_study_experiment_yaml,
|
|
23
|
+
)
|
|
8
24
|
from .study_analysis import (
|
|
9
25
|
analyze_run_directory,
|
|
10
26
|
analyze_study_directory,
|
|
@@ -15,6 +31,15 @@ from .study_analysis import (
|
|
|
15
31
|
StudyRunSummary,
|
|
16
32
|
StudySummary,
|
|
17
33
|
)
|
|
34
|
+
from .eucys_results import (
|
|
35
|
+
build_eucys_abstract_draft_markdown,
|
|
36
|
+
build_eucys_filled_abstract_markdown,
|
|
37
|
+
build_eucys_jury_qa_markdown,
|
|
38
|
+
build_eucys_limitations_and_ethics_markdown,
|
|
39
|
+
build_eucys_poster_outline_markdown,
|
|
40
|
+
generate_eucys_main_figure,
|
|
41
|
+
generate_eucys_results_bundle,
|
|
42
|
+
)
|
|
18
43
|
|
|
19
44
|
|
|
20
45
|
def _missing_reports_dependency(feature: str, exc: Exception) -> None:
|
|
@@ -80,15 +105,34 @@ __all__ = [
|
|
|
80
105
|
"ClinicalReportGenerator",
|
|
81
106
|
"compute_metrics",
|
|
82
107
|
"compare_studies",
|
|
108
|
+
"build_eucys_abstract_draft_markdown",
|
|
109
|
+
"build_eucys_filled_abstract_markdown",
|
|
110
|
+
"build_eucys_jury_qa_markdown",
|
|
111
|
+
"build_eucys_limitations_and_ethics_markdown",
|
|
112
|
+
"build_eucys_poster_outline_markdown",
|
|
113
|
+
"generate_eucys_main_figure",
|
|
114
|
+
"resolve_profile_specs",
|
|
115
|
+
"generate_eucys_results_bundle",
|
|
83
116
|
"generate_results_poster",
|
|
84
117
|
"generate_study_poster",
|
|
118
|
+
"build_algorithm_registry",
|
|
119
|
+
"build_study_design_payload",
|
|
85
120
|
"build_study_protocol_payload",
|
|
121
|
+
"build_study_experiment_template",
|
|
86
122
|
"render_study_protocol_markdown",
|
|
123
|
+
"render_study_experiment_yaml",
|
|
87
124
|
"write_study_protocol_bundle",
|
|
125
|
+
"load_study_experiment_config",
|
|
88
126
|
"load_study_summary",
|
|
89
127
|
"quality_badges_for_metrics",
|
|
90
128
|
"run_baseline_comparison",
|
|
129
|
+
"StudyAlgorithmSpec",
|
|
130
|
+
"StudyArmSpec",
|
|
91
131
|
"StudyComparison",
|
|
132
|
+
"StudyDesignPayload",
|
|
133
|
+
"StudyExperimentConfig",
|
|
134
|
+
"StudyMatrixRow",
|
|
135
|
+
"StudyProfileSpec",
|
|
92
136
|
"StudyRunSummary",
|
|
93
137
|
"StudySummary",
|
|
94
138
|
"write_baseline_comparison",
|
|
@@ -8,10 +8,12 @@ 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
|
|
14
15
|
from iints.core.simulator import Simulator
|
|
16
|
+
from iints.utils.csv_safety import sanitize_csv_dataframe
|
|
15
17
|
from iints.validation import build_stress_events
|
|
16
18
|
|
|
17
19
|
|
|
@@ -50,7 +52,10 @@ def run_baseline_comparison(
|
|
|
50
52
|
}
|
|
51
53
|
)
|
|
52
54
|
|
|
53
|
-
baselines: List[Tuple[str, InsulinAlgorithm]] = [
|
|
55
|
+
baselines: List[Tuple[str, InsulinAlgorithm]] = [
|
|
56
|
+
("Clinical Baseline", ClinicalBaselineAlgorithm()),
|
|
57
|
+
("Standard PID", PIDController()),
|
|
58
|
+
]
|
|
54
59
|
if compare_standard_pump:
|
|
55
60
|
baselines.append(("Standard Pump", StandardPumpAlgorithm()))
|
|
56
61
|
|
|
@@ -88,5 +93,5 @@ def write_baseline_comparison(comparison: Dict[str, Any], output_dir: Path) -> D
|
|
|
88
93
|
json_path = output_dir / "baseline_comparison.json"
|
|
89
94
|
csv_path = output_dir / "baseline_comparison.csv"
|
|
90
95
|
json_path.write_text(json.dumps(comparison, indent=2))
|
|
91
|
-
pd.DataFrame(comparison.get("rows", [])).to_csv(csv_path, index=False)
|
|
96
|
+
sanitize_csv_dataframe(pd.DataFrame(comparison.get("rows", []))).to_csv(csv_path, index=False)
|
|
92
97
|
return {"json": str(json_path), "csv": str(csv_path)}
|