├── .gitattributes ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── example.py ├── pyloopkit ├── __init__.py ├── carb_math.py ├── carb_status.py ├── carb_store.py ├── date.py ├── depreciated │ ├── glucose_effect.py │ └── glucose_effect_velocity.py ├── docs │ └── pyloopkit_documentation.md ├── dose.py ├── dose_entry.py ├── dose_math.py ├── dose_store.py ├── environment.yml ├── example_files │ ├── custom-scenario-table-template-complex.csv.html │ ├── example_from_previous_run.json │ ├── example_issue_report_1-output.html │ ├── example_issue_report_1-output.json │ ├── example_issue_report_1.json │ ├── example_issue_report_2-output.json │ ├── example_issue_report_2.json │ ├── example_issue_report_3-output.json │ ├── example_issue_report_3.json │ ├── example_issue_report_4-output.json │ └── example_issue_report_4.json ├── exponential_insulin_model.py ├── generate_graphs.py ├── glucose_math.py ├── glucose_store.py ├── input_validation_tools.py ├── insulin_math.py ├── loop_data_manager.py ├── loop_math.py ├── pyloop_parser.py ├── requirements.txt ├── tests │ └── fixtures │ │ └── LoopKit │ │ └── basal.json └── walsh_insulin_model.py ├── pypi_push.sh ├── requirements.txt ├── setup.py └── tests ├── __init__.py ├── fixtures ├── Loop │ ├── DoseMath │ │ ├── far_future_high_bg_forecast.json │ │ ├── read_selected_basal_profile.json │ │ ├── recommend_temp_basal_correct_low_at_min.json │ │ ├── recommend_temp_basal_dropping_then_rising.json │ │ ├── recommend_temp_basal_flat_and_high.json │ │ ├── recommend_temp_basal_high_and_falling.json │ │ ├── recommend_temp_basal_high_and_rising.json │ │ ├── recommend_temp_basal_in_range_and_rising.json │ │ ├── recommend_temp_basal_no_change_glucose.json │ │ ├── recommend_temp_basal_start_high_end_in_range.json │ │ ├── recommend_temp_basal_start_high_end_low.json │ │ ├── recommend_temp_basal_start_low_end_high.json │ │ ├── recommend_temp_basal_start_low_end_in_range.json │ │ ├── recommend_temp_basal_start_very_low_end_high.json │ │ ├── recommend_temp_basal_very_low_end_in_range.json │ │ └── recommended_temp_start_low_end_just_above_range.json │ └── LoopDataManager │ │ ├── Effect Tests │ │ ├── flat_and_stable │ │ │ ├── flat_and_stable_carb_effect.json │ │ │ ├── flat_and_stable_counteraction_effect.json │ │ │ ├── flat_and_stable_insulin_effect.json │ │ │ ├── flat_and_stable_momentum_effect.json │ │ │ └── flat_and_stable_predicted_glucose.json │ │ ├── high_and_falling │ │ │ ├── high_and_falling_carb_effect.json │ │ │ ├── high_and_falling_counteraction_effect.json │ │ │ ├── high_and_falling_insulin_effect.json │ │ │ ├── high_and_falling_momentum_effect.json │ │ │ └── high_and_falling_predicted_glucose.json │ │ ├── high_and_rising_with_cob │ │ │ ├── high_and_rising_with_cob_carb_effect.json │ │ │ ├── high_and_rising_with_cob_counteraction_effect.json │ │ │ ├── high_and_rising_with_cob_insulin_effect.json │ │ │ ├── high_and_rising_with_cob_momentum_effect.json │ │ │ └── high_and_rising_with_cob_predicted_glucose.json │ │ ├── high_and_stable │ │ │ ├── high_and_stable_carb_effect.json │ │ │ ├── high_and_stable_counteraction_effect.json │ │ │ ├── high_and_stable_insulin_effect.json │ │ │ ├── high_and_stable_momentum_effect.json │ │ │ └── high_and_stable_predicted_glucose.json │ │ ├── low_and_falling │ │ │ ├── low_and_falling_carb_effect.json │ │ │ ├── low_and_falling_counteraction_effect.json │ │ │ ├── low_and_falling_insulin_effect.json │ │ │ ├── low_and_falling_momentum_effect.json │ │ │ └── low_and_falling_predicted_glucose.json │ │ └── low_with_low_treatment │ │ │ ├── low_with_low_treatment_carb_effect.json │ │ │ ├── low_with_low_treatment_counteraction_effect.json │ │ │ ├── low_with_low_treatment_insulin_effect.json │ │ │ ├── low_with_low_treatment_momentum_effect.json │ │ │ └── low_with_low_treatment_predicted_glucose.json │ │ ├── Issue Reports │ │ ├── basal_and_bolus_report.json │ │ ├── high_bg_recommended_basal_and_bolus_report.json │ │ ├── loop_issue_report.json │ │ ├── one_basal_issue_report.json │ │ ├── timezoned_issue_report.json │ │ └── utc_issue_report.json │ │ ├── basal_schedule.json │ │ ├── bolus_dose.json │ │ ├── carb_ratios.json │ │ ├── exponential_settings.json │ │ ├── insulin_sensitivity_schedule.json │ │ ├── long_basal_dose.json │ │ ├── long_basal_dose_output.json │ │ ├── reconcile_history.json │ │ ├── reconcile_history_effects_output.json │ │ ├── short_basal_dose_output.json │ │ ├── short_basal_dose_units_output.json │ │ └── walsh_settings.json └── LoopKit │ ├── CarbKit │ ├── carb_effect_from_history_input.json │ ├── carb_effect_from_history_output.json │ ├── carb_entry_input.json │ ├── carbs_on_board_output.json │ ├── dynamic_glucose_effect_fully_observed_output.json │ ├── dynamic_glucose_effect_never_fully_observed_output.json │ ├── dynamic_glucose_effect_none_observed_output.json │ ├── dynamic_glucose_effect_partially_observed_output.json │ ├── grouped_by_overlapping_absorption_times_border_case_input.json │ ├── grouped_by_overlapping_absorption_times_border_case_output.json │ ├── grouped_by_overlapping_absorption_times_input.json │ ├── grouped_by_overlapping_absorption_times_output.json │ ├── ice_1_hour_input.json │ ├── ice_1_hour_output.json │ ├── ice_35_min_input.json │ ├── ice_35_min_none_output.json │ ├── ice_35_min_partial_output.json │ ├── ice_slow_absorption.json │ ├── ice_slow_absorption_output.json │ ├── reconcile_bolus_wizard_duplicates_input.json │ └── reconcile_bolus_wizard_duplicates_output.json │ ├── GlucoseKit │ ├── counteraction_effect_falling_glucose_almost_duplicates_input.json │ ├── counteraction_effect_falling_glucose_almost_duplicates_output.json │ ├── counteraction_effect_falling_glucose_double_entries_input.json │ ├── counteraction_effect_falling_glucose_input.json │ ├── counteraction_effect_falling_glucose_insulin.json │ ├── counteraction_effect_falling_glucose_output.json │ ├── momentum_effect_bouncing_glucose_input.json │ ├── momentum_effect_bouncing_glucose_output.json │ ├── momentum_effect_display_only_glucose_input.json │ ├── momentum_effect_duplicate_glucose_input.json │ ├── momentum_effect_falling_glucose_duplicate_input.json │ ├── momentum_effect_falling_glucose_input.json │ ├── momentum_effect_falling_glucose_output.json │ ├── momentum_effect_incomplete_glucose_input.json │ ├── momentum_effect_mixed_provenance_glucose_input.json │ ├── momentum_effect_rising_glucose_double_entries_input.json │ ├── momentum_effect_rising_glucose_input.json │ ├── momentum_effect_rising_glucose_output.json │ ├── momentum_effect_stable_glucose_input.json │ └── momentum_effect_stable_glucose_output.json │ ├── InsulinKit │ ├── basal_dose.json │ ├── bolus_dose.json │ ├── doses_overlay_basal_profile_output.json │ ├── effect_from_basal_output.json │ ├── effect_from_basal_output_exponential.json │ ├── effect_from_bolus_output.json │ ├── effect_from_bolus_output_exponential.json │ ├── effect_from_history_output.json │ ├── effect_from_history_output_exponential.json │ ├── effect_from_short_basal_output.json │ ├── iob_from_bolus_120min_output.json │ ├── iob_from_bolus_180min_output.json │ ├── iob_from_bolus_240min_output.json │ ├── iob_from_bolus_300min_output.json │ ├── iob_from_bolus_312min_output.json │ ├── iob_from_bolus_360min_output.json │ ├── iob_from_bolus_420min_output.json │ ├── iob_from_bolus_exponential_output.json │ ├── iob_from_doses_exponential_output.json │ ├── iob_from_doses_exponential_output_new.json │ ├── iob_from_doses_output.json │ ├── iob_from_doses_output_new.json │ ├── iob_from_reservoir_output.json │ ├── normalize_edge_case_doses_input.json │ ├── normalize_edge_case_doses_output.json │ ├── normalized_doses.json │ ├── normalized_reservoir_history_output.json │ ├── reconcile_history_input.json │ ├── reconcile_history_output.json │ ├── reconcile_resume_before_rewind_input.json │ ├── reconcile_resume_before_rewind_output.json │ ├── reservoir_history_with_continuity_holes.json │ ├── reservoir_history_with_rewind_and_prime_input.json │ ├── reservoir_history_with_rewind_and_prime_output.json │ ├── short_basal_dose.json │ ├── suspend_dose.json │ ├── suspend_dose_reconciled.json │ ├── suspend_dose_reconciled_normalized.json │ └── suspend_dose_reconciled_normalized_iob.json │ ├── LoopMath │ ├── combined_sums_with_gaps_output.json │ ├── glucose_from_effects_carb_effect_input.json │ ├── glucose_from_effects_glucose_input.json │ ├── glucose_from_effects_insulin_effect_input.json │ ├── glucose_from_effects_momentum_blend_glucose_input.json │ ├── glucose_from_effects_momentum_blend_insulin_effect_input.json │ ├── glucose_from_effects_momentum_blend_momentum_input.json │ ├── glucose_from_effects_momentum_blend_output.json │ ├── glucose_from_effects_momentum_down_input.json │ ├── glucose_from_effects_momentum_down_output.json │ ├── glucose_from_effects_momentum_flat_glucose_input.json │ ├── glucose_from_effects_momentum_flat_input.json │ ├── glucose_from_effects_momentum_flat_output.json │ ├── glucose_from_effects_momentum_up_input.json │ ├── glucose_from_effects_momentum_up_output.json │ ├── glucose_from_effects_no_momentum_output.json │ ├── glucose_from_effects_non_zero_carb_input.json │ ├── glucose_from_effects_non_zero_glucose_input.json │ ├── glucose_from_effects_non_zero_insulin_input.json │ ├── glucose_from_effects_non_zero_output.json │ ├── ice_minus_carb_effect_with_gaps_output.json │ ├── ice_minus_flat_carb_effect_output.json │ ├── subtracting_carb_effect_carb_input.json │ ├── subtracting_carb_effect_counteration_input.json │ ├── subtracting_flat_carb_from_ice_counteraction_input.json │ └── sums_with_gaps_output.json │ ├── basal.json │ └── read_carb_ratios.json ├── generate_test_fixtures.py ├── loop_kit_tests.py ├── path_grabber.py ├── test_carb_math.py ├── test_data_store.py ├── test_dose_math.py ├── test_glucose_math.py ├── test_insulin_math.py ├── test_loop_data_manager.py ├── test_loop_math.py └── test_ns_date.py /.gitattributes: -------------------------------------------------------------------------------- 1 | fixtures/* linguist-generated=true 2 | example_files/* linguist-documentation 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | \.DS_Store 2 | *.pyc 3 | *.png 4 | build 5 | dist 6 | pyloopkit.egg-info 7 | 8 | *output.html 9 | 10 | *-output.json 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | # We don't actually use the Travis Python, but this keeps it organized. 4 | - '3.9' 5 | 6 | script: 7 | - python -m unittest -v 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2019, Tidepool Project 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyLoopKit 2 | A set of Python tools for building closed-loop insulin delivery apps (Python port of LoopKit) 3 | 4 | [Link to Tidepool Loop repository version used for algorithm](https://github.com/tidepool-org/Loop/tree/8c1dfdba38fbf6588b07cee995a8b28fcf80ef69) 5 | 6 | [Link of Tidepool LoopKit repository version used for algorithm](https://github.com/tidepool-org/LoopKit/tree/57a9f2ba65ae3765ef7baafe66b883e654e08391) 7 | 8 | # To use this project 9 | ## Please review [the documentation](pyloopkit/docs/pyloopkit_documentation.md) for usage instructions, input data requirements, and other important details. 10 | 11 | ### To recreate the Virtual Environment 12 | 1. This environment was developed with Anaconda. You'll need to install [Miniconda](https://conda.io/miniconda.html) or [Anaconda](https://anaconda-installer.readthedocs.io/en/latest/) for your platform. 13 | 2. In a terminal, navigate to the directory where the environment.yml 14 | is located (likely in PyLoopKit/pyloopkit folder). 15 | 3. Run `conda env create`; this will download all of the package dependencies 16 | and install them in a virtual environment named py-loop. PLEASE NOTE: this 17 | may take up to 30 minutes to complete. 18 | 19 | ### To use the Virtual Environment 20 | In Bash run `source activate py-loop`, or in the Anaconda Prompt 21 | run `conda activate py-loop` to start the environment. 22 | 23 | Run `deactivate` to stop the environment. 24 | 25 | ### To create the PyLoopKit package 26 | If you want to install a version of the PyLoopKit package based on the PyLoopKit on your local machine, run `python3 setup.py install` within your PyLoopKit repo to call the setup script and install the package. You'll likely want to do this within the `py-loop` environment. 27 | 28 | ### Running the unittests 29 | To run PyLoopKit's unit tests, run `python3 -m unittest discover` within your PyLoopKit repo 30 | -------------------------------------------------------------------------------- /pyloopkit/__init__.py: -------------------------------------------------------------------------------- 1 | name = "pyloopkit" 2 | 3 | from pyloopkit.loop_math import predict_glucose 4 | from pyloopkit.loop_data_manager import update 5 | -------------------------------------------------------------------------------- /pyloopkit/date.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Fri Jun 14 08:45:26 2019 5 | 6 | @author: annaquinlan 7 | 8 | Github URL: https://github.com/tidepool-org/LoopKit/blob/ 9 | 57a9f2ba65ae3765ef7baafe66b883e654e08391/LoopKit/Extensions/Date.swift 10 | """ 11 | import datetime 12 | import math 13 | 14 | REF_TIME = datetime.datetime.fromisoformat("2001-01-01T00:00:00") 15 | TIMEZONE_REF_TIME = datetime.datetime.strptime( 16 | "2001-01-01 00:00:00 +0000", 17 | "%Y-%m-%d %H:%M:%S %z" 18 | ) 19 | 20 | 21 | def time_interval_since_reference_date(actual_time): 22 | """ Calculate seconds since since January, 1st, 2001 @ 12:00 AM 23 | 24 | Arguments: 25 | actual_time -- datetime object to compare to Jan 1st, 2001 @ 12:00 AM 26 | 27 | Output: 28 | Num of seconds since Jan 1st, 2001 @ 12:00 AM (without a sign) 29 | """ 30 | if actual_time.tzinfo: 31 | return abs(actual_time - TIMEZONE_REF_TIME).total_seconds() 32 | 33 | return abs(actual_time - REF_TIME).total_seconds() 34 | 35 | 36 | def time_interval_since(date_1, date_2): 37 | """ Calculate seconds between two times 38 | 39 | Arguments: 40 | date_1 -- datetime object #1 41 | date_2 -- datetime object #2 42 | 43 | Output: 44 | Num of seconds between the two times (with a sign) 45 | """ 46 | return (date_1 - date_2).total_seconds() 47 | 48 | 49 | def date_floored_to_time_interval(time_, interval): 50 | """ Floor a datetime object to a particular minute interval 51 | 52 | Arguments: 53 | time -- datetime object to be floored 54 | interval -- interval to floor the time to, measured in minutes 55 | 56 | Output: 57 | Floored datetime object 58 | 59 | Example: 60 | 2/2/19 2:03 PM, interval=5 -> 2/2/19 2:00 PM 61 | """ 62 | if interval == 0: 63 | return time_ 64 | 65 | floored_delta = (math.floor(time_interval_since_reference_date(time_) / 66 | interval / 60) * interval * 60) 67 | 68 | if time_.tzinfo: 69 | return TIMEZONE_REF_TIME + datetime.timedelta(seconds=floored_delta) 70 | 71 | return REF_TIME + datetime.timedelta(seconds=floored_delta) 72 | 73 | 74 | def date_ceiled_to_time_interval(time, interval): 75 | """ Ceil a datetime object to a particular minute interval 76 | 77 | Arguments: 78 | time -- datetime object to be ceiled 79 | interval -- interval to ceil the time to, measured in minutes 80 | 81 | Output: 82 | Ceiled datetime object 83 | 84 | Example: 85 | 2/2/19 2:03 PM, interval=5 -> 2/2/19 2:05 PM 86 | """ 87 | if interval == 0: 88 | return time 89 | 90 | ceiled_delta = (math.ceil(time_interval_since_reference_date(time) / 91 | interval / 60) * interval * 60) 92 | 93 | if time.tzinfo: 94 | return TIMEZONE_REF_TIME + datetime.timedelta(seconds=ceiled_delta) 95 | 96 | return REF_TIME + datetime.timedelta(seconds=ceiled_delta) 97 | -------------------------------------------------------------------------------- /pyloopkit/depreciated/glucose_effect.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Fri Jun 14 09:21:47 2019 5 | 6 | @author: annaquinlan 7 | 8 | Github URL: https://github.com/tidepool-org/LoopKit/blob/ 9 | 57a9f2ba65ae3765ef7baafe66b883e654e08391/LoopKit/GlucoseEffect.swift 10 | """ 11 | 12 | 13 | class GlucoseEffect: 14 | """ Constructs a glucose effect 15 | 16 | Attributes: 17 | start_date -- date and time of the effect 18 | quantity -- glucose value (mg/dL) 19 | """ 20 | def __init__(self, start_date, quantity): 21 | self.start_date = start_date 22 | self.quantity = quantity 23 | 24 | def __lt__(self, other): 25 | return self.start_date < other.start_date 26 | -------------------------------------------------------------------------------- /pyloopkit/depreciated/glucose_effect_velocity.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Fri Jun 14 09:23:51 2019 5 | 6 | @author: annaquinlan 7 | 8 | Github URL: https://github.com/tidepool-org/LoopKit/blob/ 9 | 57a9f2ba65ae3765ef7baafe66b883e654e08391/LoopKit/GlucoseEffectVelocity.swift 10 | """ 11 | 12 | 13 | class GlucoseEffectVelocity: 14 | """ Constructs a velocity of a glucose effect 15 | 16 | Attributes: 17 | start_date -- start date and time of the effect 18 | end_date -- end date and time of the effect 19 | quantity -- glucose value (mg/dL) 20 | """ 21 | def __init__(self, start_date, end_date, quantity): 22 | self.start_date = start_date 23 | self.end_date = end_date 24 | self.quantity = quantity 25 | -------------------------------------------------------------------------------- /pyloopkit/dose.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Thu Aug 15 09:54:54 2019 5 | 6 | @author: annaquinlan 7 | """ 8 | from enum import Enum 9 | 10 | 11 | class DoseType(Enum): 12 | suspend = 0 13 | resume = 1 14 | basal = 2 15 | tempbasal = 3 16 | bolus = 4 17 | meal = 5 # meals are included for compatability with Loop tests 18 | 19 | @staticmethod 20 | def from_str(label): 21 | if label.lower() in ["suspend", "pumpsuspend"]: 22 | return DoseType.suspend 23 | elif label.lower() in ["resume", "pumpresume"]: 24 | return DoseType.resume 25 | elif label.lower() in ["basal", "basalprofilestart"]: 26 | return DoseType.basal 27 | elif label.lower() == "tempbasal": 28 | return DoseType.tempbasal 29 | elif label.lower() == "bolus": 30 | return DoseType.bolus 31 | elif label.lower() == "meal": 32 | return DoseType.meal 33 | else: 34 | raise NotImplementedError(label, "not recognized") 35 | -------------------------------------------------------------------------------- /pyloopkit/dose_entry.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Fri Jun 21 09:57:26 2019 5 | 6 | @author: annaquinlan 7 | 8 | Github URL: https://github.com/tidepool-org/LoopKit/blob/ 9 | 57a9f2ba65ae3765ef7baafe66b883e654e08391/LoopKit/InsulinKit/DoseEntry.swift 10 | """ 11 | from pyloopkit.date import time_interval_since 12 | from pyloopkit.dose import DoseType 13 | 14 | 15 | def net_basal_units(type_, value, start, end, scheduled_basal_rate, delivered_units): 16 | """ Find the units of insulin delivered, net of any scheduled basal rate 17 | (if dose is a temp basal) 18 | 19 | Arguments: 20 | type_ -- type of dose (basal, bolus, suspend, etc) 21 | value -- if bolus: amount given, if temp basal: temp rate (U/hr) 22 | start -- datetime object representing start of dose 23 | end -- datetime object representing end of dose 24 | scheduled_basal_rate -- the rate scheduled during the time the dose was 25 | given (0 for boluses) 26 | delivered_units -- units actually delivered by pump 27 | 28 | Output: 29 | Bolus amount (if a bolus), or basal units given, net of whatever the 30 | scheduled basal is 31 | """ 32 | MINIMUM_MINIMED_INCREMENT = 20 33 | 34 | if type_ == DoseType.bolus: 35 | return delivered_units if delivered_units is not None else value 36 | 37 | elif type_ == DoseType.basal: 38 | return 0 39 | 40 | hours_ = hours(end, start) 41 | 42 | if hours_ <= 0: 43 | return 0 44 | 45 | if type_ == DoseType.suspend: 46 | scheduled_units = -scheduled_basal_rate * hours_ 47 | else: 48 | scheduled_units = (value - scheduled_basal_rate) * hours_ 49 | 50 | net_delivered_units = None 51 | if delivered_units: 52 | net_delivered_units = delivered_units - (scheduled_basal_rate * hours_) 53 | 54 | return net_delivered_units if net_delivered_units is not None else round(scheduled_units * MINIMUM_MINIMED_INCREMENT) / MINIMUM_MINIMED_INCREMENT 55 | 56 | 57 | def total_units_given(type_, value, start, end): 58 | """ Find total units given for a dose """ 59 | if type_ in [DoseType.bolus, DoseType.suspend]: 60 | return value 61 | 62 | return value * hours(end, start) 63 | 64 | 65 | def hours(start_date, end_date): 66 | """ Find hours between two dates for the purposes of calculating basal 67 | delivery 68 | """ 69 | return abs(time_interval_since(end_date, start_date))/3600 # secs -> hrs 70 | -------------------------------------------------------------------------------- /pyloopkit/dose_store.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Wed Jul 10 17:03:59 2019 5 | 6 | @author: annaquinlan 7 | 8 | Github URL: https://github.com/tidepool-org/LoopKit/blob/ 9 | 57a9f2ba65ae3765ef7baafe66b883e654e08391/LoopKit/InsulinKit/DoseStore.swift 10 | """ 11 | # pylint: disable=R0913, R0914, C0200 12 | from datetime import timedelta 13 | 14 | from pyloopkit.dose_math import filter_date_range_for_doses 15 | from pyloopkit.insulin_math import (annotated, trim, glucose_effects, reconciled) 16 | from pyloopkit.loop_math import filter_date_range, sort_dose_lists 17 | 18 | 19 | def get_glucose_effects( 20 | types, starts, ends, values, delivered_units, 21 | start_date, 22 | basal_starts, basal_rates, basal_minutes, 23 | sensitivity_starts, sensitivity_ends, sensitivity_values, 24 | insulin_model, 25 | delay=10, 26 | end_date=None 27 | ): 28 | """ Get the glucose effects at a particular time, given a list of 29 | doses and a time interval 30 | 31 | Arguments: 32 | types -- list of types of dose (basal, bolus, etc) 33 | starts -- start dates of the doses (datetime obj) 34 | ends -- end dates of the doses (datetime obj) 35 | values -- actual basal rates of doses in U/hr (if a basal) 36 | or the value of the boluses if in U 37 | delivered_units -- net Units of insulin actually delivered by a dose 38 | 39 | start_date -- date to start calculating glucose effects 40 | 41 | basal_starts -- list of times the basal rates start at 42 | basal_rates -- list of basal rates(U/hr) 43 | basal_minutes -- list of basal lengths (in mins) 44 | 45 | sensitivity_starts -- list of time objects of start times of 46 | given insulin sensitivity values 47 | sensitivity_ends -- list of time objects of start times of 48 | given insulin sensitivity values 49 | sensitivity_values -- list of sensitivities (mg/dL/U) 50 | 51 | insulin_model -- list in format [DIA (in hours)] if Walsh model, or 52 | [DIA (minutes), peak (minutes)] if exponential model 53 | 54 | end_date -- date to stop calculating glucose effects 55 | 56 | Output: 57 | Glucose effects in the format (effect_date, effect_value) 58 | """ 59 | assert len(types) == len(starts) == len(ends) == len(values) == len(delivered_units),\ 60 | "expected input shapes to match" 61 | 62 | # to properly know glucose effects at start_date, 63 | # we need to go back another DIA hours 64 | if len(insulin_model) == 1: # if using Walsh model 65 | dose_start = (start_date 66 | - timedelta( 67 | hours=insulin_model[0] 68 | ) 69 | ) 70 | else: 71 | dose_start = (start_date 72 | - timedelta( 73 | minutes=insulin_model[0] 74 | ) 75 | ) 76 | 77 | filtered_doses = filter_date_range_for_doses( 78 | types, starts, ends, values, delivered_units, 79 | dose_start, 80 | end_date 81 | ) 82 | 83 | # reconcile the doses to get a cleaner data set 84 | # (add resumes for suspends and trim any overlapping temp basals) 85 | reconciled_doses = reconciled( 86 | *filtered_doses 87 | ) 88 | # sort the lists because they could be slightly out of order due to 89 | # basals and suspends 90 | sorted_reconciled_doses = sort_dose_lists(*reconciled_doses)[0:5] 91 | 92 | # annotate the doses with scheduled basal rate 93 | (a_types, 94 | a_starts, 95 | a_ends, 96 | a_values, 97 | a_scheduled_rates, 98 | a_delivered_units 99 | ) = annotated( 100 | *sorted_reconciled_doses, 101 | basal_starts, basal_rates, basal_minutes, 102 | convert_to_units_hr=False 103 | ) 104 | 105 | # trim the doses to start of interval 106 | for i in range(0, len(a_types)): 107 | result = trim( 108 | a_types[i], a_starts[i], a_ends[i], a_values[i], 109 | a_scheduled_rates[i], a_delivered_units[i], 110 | start_interval=dose_start, 111 | end_interval=end_date 112 | ) 113 | 114 | a_starts[i] = result[1] 115 | a_ends[i] = result[2] 116 | a_delivered_units[i] = result[5] 117 | 118 | # get the glucose effects using the prepared dose data 119 | glucose_effect = glucose_effects( 120 | a_types, a_starts, a_ends, a_values, a_scheduled_rates, a_delivered_units, 121 | insulin_model, 122 | sensitivity_starts, sensitivity_ends, sensitivity_values, 123 | delay=delay, 124 | start=start_date, 125 | end=end_date 126 | ) 127 | 128 | # don't return effects that are less than the start date or greater than 129 | # the end date (if there is one) 130 | (filtered_starts, 131 | ends, 132 | filtered_effect_values) = filter_date_range( 133 | glucose_effect[0], 134 | [], 135 | glucose_effect[1], 136 | start_date, 137 | end_date 138 | ) 139 | 140 | return (filtered_starts, filtered_effect_values) 141 | -------------------------------------------------------------------------------- /pyloopkit/environment.yml: -------------------------------------------------------------------------------- 1 | name: py-loop 2 | channels: 3 | - defaults 4 | dependencies: 5 | - matplotlib 6 | - pip 7 | - spyder=3.3.6 8 | - pylint=2.3.1 9 | - python==3.7.3 10 | - pip: 11 | - backports-datetime-fromisoformat==1.0.0 12 | - tensorflow==2.0.0-beta1 13 | - numpy==1.16.4 14 | - pandas==0.24.2 15 | - plotly==4.1.0 16 | -------------------------------------------------------------------------------- /pyloopkit/exponential_insulin_model.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Thu Jun 20 16:04:11 2019 5 | 6 | @author: annaquinlan 7 | 8 | https://github.com/tidepool-org/LoopKit/blob/ 9 | 57a9f2ba65ae3765ef7baafe66b883e654e08391/LoopKit/InsulinKit/ 10 | ExponentialInsulinModel.swift 11 | """ 12 | # pylint: disable=C0103 13 | import math 14 | 15 | 16 | def percent_effect_remaining(time, action_duration, peak_activity_time): 17 | """ Returns the percentage of total insulin effect remaining at a specified 18 | interval after delivery; aka insulin on board (IOB) 19 | 20 | This model allows us to specify time of peak activity, as well as 21 | duration, and provides activity and IOB decay functions 22 | 23 | Arguments: 24 | time -- the minutes after insulin delivery (it can be negative) 25 | action_duration -- the total duration on insulin activity (DIA) 26 | peak_activity_time -- the time (in minutes) of the peak of insulin activity 27 | from dose 28 | 29 | Output: 30 | The percentage of total insulin effect remaining 31 | """ 32 | 33 | if time <= 0: 34 | return 1 35 | if time > action_duration: 36 | return 0 37 | 38 | tau = (peak_activity_time * (1 - peak_activity_time / action_duration) / 39 | (1 - 2 * peak_activity_time / action_duration) 40 | ) 41 | a = 2 * tau / action_duration 42 | S = 1 / (1 - a + (1 + a) * math.exp(-action_duration / tau)) 43 | 44 | return 1 - S * (1 - a) * ((pow(time, 2) / (tau * action_duration * (1 - a)) 45 | - time / tau - 1) * math.exp(-time / tau) + 1) 46 | -------------------------------------------------------------------------------- /pyloopkit/glucose_store.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Mon Jul 15 18:54:26 2019 5 | 6 | @author: annaquinlan 7 | 8 | Github URL: https://github.com/tidepool-org/LoopKit/blob/ 9 | 57a9f2ba65ae3765ef7baafe66b883e654e08391/LoopKit/GlucoseKit/GlucoseStore.swift 10 | """ 11 | # pylint: disable=R0913, W0612 12 | from datetime import timedelta 13 | 14 | from pyloopkit.loop_math import filter_date_range 15 | from pyloopkit.glucose_math import linear_momentum_effect, counteraction_effects 16 | 17 | 18 | def get_recent_momentum_effects( 19 | glucose_starts, glucose_values, 20 | start_date, 21 | now_date, 22 | momentum_data_interval=15, 23 | delta=5, 24 | display_list=None, 25 | provenances=None, 26 | settings_dictionary=None 27 | ): 28 | """ Get glucose momentum effects 29 | 30 | Arguments: 31 | glucose_starts -- list of datetime objects of times of glucose values 32 | glucose_values -- list of glucose values (unit: mg/dL) 33 | 34 | start_date -- date to start calculating momentum effects 35 | now_date -- the date to assume as the "now" time (aka datetime.now()) 36 | 37 | momentum_data_interval -- time to generate momentum effects out to (mins) 38 | delta -- time between blood glucose measurements (mins) 39 | 40 | display_list -- list of display_only booleans 41 | provenances -- list of provenances (Strings) 42 | 43 | Output: 44 | Momentum effects in format (date_of_effect, value_of_effect) 45 | """ 46 | assert len(glucose_starts) == len(glucose_values),\ 47 | "expected input shapes to match" 48 | 49 | if not glucose_starts or not start_date: 50 | return ([], []) 51 | 52 | (filtered_dates, 53 | ends, 54 | filtered_values) = filter_date_range( 55 | glucose_starts, 56 | [], 57 | glucose_values, 58 | now_date - timedelta(minutes=momentum_data_interval), 59 | None 60 | ) 61 | 62 | if not display_list: 63 | display_list = [False for i in filtered_dates] 64 | if not provenances: 65 | provenances = ["PyLoop" for i in filtered_dates] 66 | 67 | effects = linear_momentum_effect( 68 | filtered_dates, filtered_values, display_list, provenances, 69 | momentum_data_interval, 70 | delta, 71 | settings_dictionary 72 | ) 73 | 74 | return effects 75 | 76 | 77 | def get_counteraction_effects( 78 | glucose_starts, glucose_values, 79 | start_date, 80 | effect_starts, effect_values, 81 | display_list=None, 82 | provenances=None 83 | ): 84 | """ Get counteraction effects 85 | 86 | Arguments: 87 | glucose_starts -- list of datetime objects of times of glucose values 88 | glucose_values -- list of glucose values (unit: mg/dL) 89 | 90 | start_date -- date to begin using glucose data (datetime) 91 | 92 | effect_dates -- list of datetime objects associated with a glucose effect 93 | effect_values -- list of values associated with a glucose effect 94 | 95 | display_list -- list of display_only booleans 96 | provenances -- list of provenances (Strings) 97 | 98 | Output: 99 | Counteraction effects in form (effect start, effect end, effect value) 100 | """ 101 | assert len(glucose_starts) == len(glucose_values),\ 102 | "expected input shapes to match" 103 | 104 | if not glucose_starts or not start_date: 105 | return ([], []) 106 | 107 | (filtered_starts, 108 | ends, 109 | filtered_values) = filter_date_range( 110 | glucose_starts, 111 | [], 112 | glucose_values, 113 | start_date, 114 | None 115 | ) 116 | 117 | if not display_list: 118 | display_list = [False for i in filtered_starts] 119 | if not provenances: 120 | provenances = ["PyLoop" for i in filtered_starts] 121 | 122 | counteractions = counteraction_effects( 123 | filtered_starts, filtered_values, display_list, provenances, 124 | effect_starts, effect_values 125 | ) 126 | 127 | return counteractions 128 | -------------------------------------------------------------------------------- /pyloopkit/requirements.txt: -------------------------------------------------------------------------------- 1 | numpy==1.22.0 2 | backports-datetime-fromisoformat==1.0.0 3 | 4 | -------------------------------------------------------------------------------- /pyloopkit/tests/fixtures/LoopKit/basal.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/PyLoopKit/91362215f115b8c9596a72fb0e69ec988a0f3861/pyloopkit/tests/fixtures/LoopKit/basal.json -------------------------------------------------------------------------------- /pyloopkit/walsh_insulin_model.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Fri Jun 21 15:08:22 2019 5 | 6 | @author: annaquinlan 7 | 8 | Github URL: https://github.com/tidepool-org/LoopKit/blob/ 9 | 57a9f2ba65ae3765ef7baafe66b883e654e08391/LoopKit/InsulinKit/ 10 | WalshInsulinModel.swift 11 | """ 12 | 13 | 14 | def walsh_percent_effect_remaining(minutes, action_duration): 15 | """ Give percent of insulin remaining for IOB calculations. 16 | This curve is only included for the purposes of running glucose 17 | activity tests 18 | 19 | Arguments: 20 | minutes -- minutes after insulin delivery 21 | dia -- duration of insulin action, in hours 22 | """ 23 | if minutes <= 0: 24 | return 1 25 | if minutes >= action_duration * 60: 26 | return 0 27 | 28 | dia = round(action_duration) 29 | if dia < 3: 30 | dia = 3 31 | elif dia > 6: 32 | dia = 6 33 | 34 | minutes = minutes * dia / action_duration 35 | 36 | if dia == 3: 37 | return -3.2030e-9 * pow(minutes, 4) + 1.354e-6 * pow(minutes, 3)\ 38 | - 1.759e-4 * pow(minutes, 2) + 9.255e-4 * minutes + 0.99951 39 | if dia == 4: 40 | return -3.310e-10 * pow(minutes, 4) + 2.530e-7 * pow(minutes, 3)\ 41 | - 5.510e-5 * pow(minutes, 2) - 9.086e-4 * minutes + 0.99950 42 | if dia == 5: 43 | return -2.950e-10 * pow(minutes, 4) + 2.320e-7 * pow(minutes, 3)\ 44 | - 5.550e-5 * pow(minutes, 2) + 4.490e-4 * minutes + 0.99300 45 | if dia == 6: 46 | return -1.493e-10 * pow(minutes, 4) + 1.413e-7 * pow(minutes, 3)\ 47 | - 4.095e-5 * pow(minutes, 2) + 6.365e-4 * minutes + 0.99700 48 | 49 | raise RuntimeError 50 | -------------------------------------------------------------------------------- /pypi_push.sh: -------------------------------------------------------------------------------- 1 | ##STOP - Make sure you updated the version in the setup.py to match the version in github to be uploaded. 2 | rm dist/* 3 | python setup.py sdist 4 | echo "RUN: twine upload dist/{VERSION}.tar.gz" -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | backports-datetime-fromisoformat==1.0.0 -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | import sys 3 | 4 | 5 | if sys.version_info < (3, 6): 6 | sys.exit("Sorry, Python < 3.6 is not supported") 7 | 8 | with open("README.md", "r") as fh: 9 | long_description = fh.read() 10 | 11 | version_string = "v0.1.0" 12 | 13 | setup( 14 | name="pyloopkit", 15 | version=version_string, 16 | author="Tidepool", 17 | author_email="ed@tidepool.org", 18 | description="Python implementation of the Loop algorithm", 19 | long_description=long_description, 20 | long_description_content_type="text/markdown", 21 | url="https://github.com/tidepool-org/PyLoopKit", 22 | packages=find_packages(), 23 | classifiers=[ 24 | 'Development Status :: 3 - Alpha', 25 | 'Intended Audience :: Developers', 26 | 'License :: OSI Approved :: BSD License', 27 | 'Programming Language :: Python :: 3.7', 28 | 'Programming Language :: Python :: 3.6', 29 | ], 30 | install_requires=[ 31 | 'numpy>=1.22.0', 32 | 'backports-datetime-fromisoformat>=1.0.0', 33 | ], 34 | python_requires='>=3.6', 35 | ) 36 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/PyLoopKit/91362215f115b8c9596a72fb0e69ec988a0f3861/tests/__init__.py -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/far_future_high_bg_forecast.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T16:30:00", "amount": 90}, 3 | {"date": "2015-07-19T17:00:00", "amount": 90}, 4 | {"date": "2015-07-19T17:30:00", "amount": 90}, 5 | {"date": "2015-07-19T18:00:00", "amount": 90}, 6 | {"date": "2015-07-19T18:30:00", "amount": 95}, 7 | {"date": "2015-07-19T19:00:00", "amount": 100}, 8 | {"date": "2015-07-19T19:30:00", "amount": 105}, 9 | {"date": "2015-07-19T20:00:00", "amount": 110}, 10 | {"date": "2015-07-19T20:30:00", "amount": 115}, 11 | {"date": "2015-07-19T21:00:00", "amount": 118}, 12 | {"date": "2015-07-19T21:30:00", "amount": 120}, 13 | {"date": "2015-07-19T21:30:00", "amount": 140}, 14 | {"date": "2015-07-19T21:30:00", "amount": 160}, 15 | {"date": "2015-07-19T21:30:00", "amount": 180} 16 | ] 17 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/read_selected_basal_profile.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "i": 0, 4 | "start": "00:00:00", 5 | "rate": 0.9, 6 | "minutes": 0 7 | }, 8 | { 9 | "i": 1, 10 | "start": "04:00:00", 11 | "rate": 0.925, 12 | "minutes": 240 13 | }, 14 | { 15 | "i": 2, 16 | "start": "07:00:00", 17 | "rate": 0.85, 18 | "minutes": 420 19 | }, 20 | { 21 | "i": 3, 22 | "start": "10:00:00", 23 | "rate": 0.85, 24 | "minutes": 600 25 | }, 26 | { 27 | "i": 4, 28 | "start": "12:00:00", 29 | "rate": 0.75, 30 | "minutes": 720 31 | }, 32 | { 33 | "i": 5, 34 | "start": "15:00:00", 35 | "rate": 0.8, 36 | "minutes": 900 37 | }, 38 | { 39 | "i": 6, 40 | "start": "22:00:00", 41 | "rate": 0.9, 42 | "minutes": 1320 43 | } 44 | ] -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_correct_low_at_min.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 100}, 3 | {"date": "2015-07-19T18:30:00", "amount": 90}, 4 | {"date": "2015-07-19T19:00:00", "amount": 85}, 5 | {"date": "2015-07-19T19:30:00", "amount": 90}, 6 | {"date": "2015-07-19T20:00:00", "amount": 100} 7 | ] -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_dropping_then_rising.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 90}, 3 | {"date": "2015-07-19T19:00:00", "amount": 80}, 4 | {"date": "2015-07-19T20:00:00", "amount": 100}, 5 | {"date": "2015-07-19T21:00:00", "amount": 160}, 6 | {"date": "2015-07-19T22:00:00", "amount": 200} 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_flat_and_high.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 200}, 3 | {"date": "2015-07-19T22:00:00", "amount": 200} 4 | ] 5 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_high_and_falling.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 240}, 3 | {"date": "2015-07-19T19:00:00", "amount": 220}, 4 | {"date": "2015-07-19T20:00:00", "amount": 200}, 5 | {"date": "2015-07-19T21:00:00", "amount": 160}, 6 | {"date": "2015-07-19T22:00:00", "amount": 124} 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_high_and_rising.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 140}, 3 | {"date": "2015-07-19T19:00:00", "amount": 150}, 4 | {"date": "2015-07-19T20:00:00", "amount": 160}, 5 | {"date": "2015-07-19T21:00:00", "amount": 170}, 6 | {"date": "2015-07-19T22:00:00", "amount": 180} 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_in_range_and_rising.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 90}, 3 | {"date": "2015-07-19T19:00:00", "amount": 100}, 4 | {"date": "2015-07-19T20:00:00", "amount": 110}, 5 | {"date": "2015-07-19T21:00:00", "amount": 120}, 6 | {"date": "2015-07-19T22:00:00", "amount": 125} 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_no_change_glucose.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T20:00:00", "amount": 100}, 3 | {"date": "2015-07-19T20:30:00", "amount": 100} 4 | ] 5 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_start_high_end_in_range.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 200}, 3 | {"date": "2015-07-19T18:30:00", "amount": 180}, 4 | {"date": "2015-07-19T19:00:00", "amount": 150}, 5 | {"date": "2015-07-19T19:30:00", "amount": 120}, 6 | {"date": "2015-07-19T20:00:00", "amount": 100} 7 | ] -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_start_high_end_low.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 200}, 3 | {"date": "2015-07-19T18:30:00", "amount": 160}, 4 | {"date": "2015-07-19T19:00:00", "amount": 120}, 5 | {"date": "2015-07-19T19:30:00", "amount": 80}, 6 | {"date": "2015-07-19T20:00:00", "amount": 60} 7 | ] -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_start_low_end_high.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 60}, 3 | {"date": "2015-07-19T19:00:00", "amount": 80}, 4 | {"date": "2015-07-19T20:00:00", "amount": 120}, 5 | {"date": "2015-07-19T21:00:00", "amount": 160}, 6 | {"date": "2015-07-19T22:00:00", "amount": 200} 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_start_low_end_in_range.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 60}, 3 | {"date": "2015-07-19T18:30:00", "amount": 70}, 4 | {"date": "2015-07-19T19:00:00", "amount": 80}, 5 | {"date": "2015-07-19T19:30:00", "amount": 90}, 6 | {"date": "2015-07-19T20:00:00", "amount": 100} 7 | ] -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_start_very_low_end_high.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 40}, 3 | {"date": "2015-07-19T18:30:00", "amount": 50}, 4 | {"date": "2015-07-19T19:00:00", "amount": 80}, 5 | {"date": "2015-07-19T19:30:00", "amount": 160}, 6 | {"date": "2015-07-19T20:00:00", "amount": 200} 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommend_temp_basal_very_low_end_in_range.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2015-07-19T18:00:00", "amount": 60}, 3 | {"date": "2015-07-19T18:30:00", "amount": 50}, 4 | {"date": "2015-07-19T19:00:00", "amount": 60}, 5 | {"date": "2015-07-19T19:30:00", "amount": 70}, 6 | {"date": "2015-07-19T20:00:00", "amount": 100} 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/DoseMath/recommended_temp_start_low_end_just_above_range.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2017-09-17T10:38:21", "amount": 57}, 3 | {"date": "2017-09-17T10:40:00", "amount": 57.6448}, 4 | {"date": "2017-09-17T10:45:00", "amount": 59.7488}, 5 | {"date": "2017-09-17T10:50:00", "amount": 61.8207}, 6 | {"date": "2017-09-17T10:55:00", "amount": 63.8623}, 7 | {"date": "2017-09-17T11:00:00", "amount": 65.8754}, 8 | {"date": "2017-09-17T11:05:00", "amount": 67.8615}, 9 | {"date": "2017-09-17T11:10:00", "amount": 69.8222}, 10 | {"date": "2017-09-17T11:15:00", "amount": 71.759}, 11 | {"date": "2017-09-17T11:20:00", "amount": 73.6728}, 12 | {"date": "2017-09-17T11:25:00", "amount": 75.5648}, 13 | {"date": "2017-09-17T11:30:00", "amount": 77.436}, 14 | {"date": "2017-09-17T11:35:00", "amount": 79.2873}, 15 | {"date": "2017-09-17T11:40:00", "amount": 81.1198}, 16 | {"date": "2017-09-17T11:45:00", "amount": 82.9344}, 17 | {"date": "2017-09-17T11:50:00", "amount": 84.7321}, 18 | {"date": "2017-09-17T11:55:00", "amount": 86.5139}, 19 | {"date": "2017-09-17T12:00:00", "amount": 88.281}, 20 | {"date": "2017-09-17T12:05:00", "amount": 90.0348}, 21 | {"date": "2017-09-17T12:10:00", "amount": 91.7764}, 22 | {"date": "2017-09-17T12:15:00", "amount": 93.507}, 23 | {"date": "2017-09-17T12:20:00", "amount": 95.2275}, 24 | {"date": "2017-09-17T12:25:00", "amount": 96.9392}, 25 | {"date": "2017-09-17T12:30:00", "amount": 98.6428}, 26 | {"date": "2017-09-17T12:35:00", "amount": 100.339}, 27 | {"date": "2017-09-17T12:40:00", "amount": 102.03}, 28 | {"date": "2017-09-17T12:45:00", "amount": 103.715}, 29 | {"date": "2017-09-17T12:50:00", "amount": 105.395}, 30 | {"date": "2017-09-17T12:55:00", "amount": 107.072}, 31 | {"date": "2017-09-17T13:00:00", "amount": 108.746}, 32 | {"date": "2017-09-17T13:05:00", "amount": 110.417}, 33 | {"date": "2017-09-17T13:10:00", "amount": 112.086}, 34 | {"date": "2017-09-17T13:15:00", "amount": 113.753}, 35 | {"date": "2017-09-17T13:20:00", "amount": 115.42}, 36 | {"date": "2017-09-17T13:25:00", "amount": 117.087}, 37 | {"date": "2017-09-17T13:30:00", "amount": 118.754}, 38 | {"date": "2017-09-17T13:35:00", "amount": 120.42}, 39 | {"date": "2017-09-17T13:40:00", "amount": 121.914}, 40 | {"date": "2017-09-17T13:45:00", "amount": 121.914}, 41 | {"date": "2017-09-17T13:50:00", "amount": 121.914}, 42 | {"date": "2017-09-17T16:38:21", "amount": 121.914} 43 | ] 44 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/Effect Tests/flat_and_stable/flat_and_stable_carb_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2020-08-11T17:30:13", 4 | "unit": "mg/dL", 5 | "amount": 0 6 | } 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/Effect Tests/flat_and_stable/flat_and_stable_momentum_effect.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "date": "2020-08-11T20:45:02", 3 | "unit": "mg/dL", 4 | "amount": 0 5 | }] 6 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/Effect Tests/high_and_falling/high_and_falling_carb_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2020-08-11T19:49:58", 4 | "unit": "mg/dL", 5 | "amount": 0 6 | } 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/Effect Tests/high_and_falling/high_and_falling_momentum_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2020-08-11T22:55:00", 4 | "unit": "mg/dL", 5 | "amount": 0.0 6 | }, 7 | { 8 | "date": "2020-08-11T23:00:00", 9 | "unit": "mg/dL", 10 | "amount": 0.0 11 | }, 12 | { 13 | "date": "2020-08-11T23:05:00", 14 | "unit": "mg/dL", 15 | "amount": 0.0 16 | }, 17 | { 18 | "date": "2020-08-11T23:10:00", 19 | "unit": "mg/dL", 20 | "amount": 0.0 21 | }, 22 | { 23 | "date": "2020-08-11T23:15:00", 24 | "unit": "mg/dL", 25 | "amount": 0.0 26 | } 27 | ] -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/Effect Tests/high_and_rising_with_cob/high_and_rising_with_cob_momentum_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2020-08-11T21:45:00", 4 | "unit": "mg/dL", 5 | "amount": 0.0 6 | }, 7 | { 8 | "date": "2020-08-11T21:50:00", 9 | "unit": "mg/dL", 10 | "amount": 0.0596641 11 | }, 12 | { 13 | "date": "2020-08-11T21:55:00", 14 | "unit": "mg/dL", 15 | "amount": 0.233866 16 | }, 17 | { 18 | "date": "2020-08-11T22:00:00", 19 | "unit": "mg/dL", 20 | "amount": 0.408067 21 | }, 22 | { 23 | "date": "2020-08-11T22:05:00", 24 | "unit": "mg/dL", 25 | "amount": 0.582269 26 | } 27 | ] -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/Effect Tests/high_and_stable/high_and_stable_momentum_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2020-08-12T12:35:00", 4 | "unit": "mg/dL", 5 | "amount": 0.0 6 | }, 7 | { 8 | "date": "2020-08-12T12:40:00", 9 | "unit": "mg/dL", 10 | "amount": 0.0 11 | }, 12 | { 13 | "date": "2020-08-12T12:45:00", 14 | "unit": "mg/dL", 15 | "amount": 0.0 16 | }, 17 | { 18 | "date": "2020-08-12T12:50:00", 19 | "unit": "mg/dL", 20 | "amount": 0.0 21 | }, 22 | { 23 | "date": "2020-08-12T12:55:00", 24 | "unit": "mg/dL", 25 | "amount": 0.0 26 | } 27 | ] -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/Effect Tests/low_and_falling/low_and_falling_counteraction_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "startDate": "2020-08-11T19:06:06", 4 | "endDate": "2020-08-11T19:11:06", 5 | "unit": "mg\/min·dL", 6 | "value": -0.3485359639226971 7 | }, 8 | { 9 | "startDate": "2020-08-11T19:11:06", 10 | "endDate": "2020-08-11T19:16:06", 11 | "unit": "mg\/min·dL", 12 | "value": -0.34571948711910916 13 | }, 14 | { 15 | "startDate": "2020-08-11T19:16:06", 16 | "endDate": "2020-08-11T19:21:06", 17 | "unit": "mg\/min·dL", 18 | "value": -0.3110996208816001 19 | }, 20 | { 21 | "startDate": "2020-08-11T19:21:06", 22 | "endDate": "2020-08-11T19:26:06", 23 | "unit": "mg\/min·dL", 24 | "value": -0.17115290442012446 25 | }, 26 | { 27 | "startDate": "2020-08-11T19:26:06", 28 | "endDate": "2020-08-11T19:31:06", 29 | "unit": "mg\/min·dL", 30 | "value": -0.035078937546724906 31 | }, 32 | { 33 | "startDate": "2020-08-11T19:31:06", 34 | "endDate": "2020-08-11T19:36:06", 35 | "unit": "mg\/min·dL", 36 | "value": 0.08735109214809061 37 | }, 38 | { 39 | "startDate": "2020-08-11T19:36:06", 40 | "endDate": "2020-08-11T19:41:06", 41 | "unit": "mg\/min·dL", 42 | "value": 0.19746935782304254 43 | }, 44 | { 45 | "startDate": "2020-08-11T19:41:06", 46 | "endDate": "2020-08-11T19:46:06", 47 | "unit": "mg\/min·dL", 48 | "value": 0.2964814415989495 49 | }, 50 | { 51 | "startDate": "2020-08-11T19:46:06", 52 | "endDate": "2020-08-11T19:51:06", 53 | "unit": "mg\/min·dL", 54 | "value": 0.3854747645772338 55 | }, 56 | { 57 | "startDate": "2020-08-11T19:51:06", 58 | "endDate": "2020-08-11T19:56:06", 59 | "unit": "mg\/min·dL", 60 | "value": 0.4654266535840445 61 | }, 62 | { 63 | "startDate": "2020-08-11T19:56:06", 64 | "endDate": "2020-08-11T20:01:06", 65 | "unit": "mg\/min·dL", 66 | "value": 0.5372120677140927 67 | }, 68 | { 69 | "startDate": "2020-08-11T20:01:06", 70 | "endDate": "2020-08-11T20:06:06", 71 | "unit": "mg\/min·dL", 72 | "value": 0.6016110049547307 73 | }, 74 | { 75 | "startDate": "2020-08-11T20:06:06", 76 | "endDate": "2020-08-11T20:11:06", 77 | "unit": "mg\/min·dL", 78 | "value": 0.6593156065538323 79 | }, 80 | { 81 | "startDate": "2020-08-11T20:11:06", 82 | "endDate": "2020-08-11T20:16:06", 83 | "unit": "mg\/min·dL", 84 | "value": 0.7109369743543738 85 | }, 86 | { 87 | "startDate": "2020-08-11T20:16:06", 88 | "endDate": "2020-08-11T20:21:06", 89 | "unit": "mg\/min·dL", 90 | "value": 0.7570117140551543 91 | }, 92 | { 93 | "startDate": "2020-08-11T20:21:06", 94 | "endDate": "2020-08-11T20:26:06", 95 | "unit": "mg\/min·dL", 96 | "value": 0.7980082152690883 97 | }, 98 | { 99 | "startDate": "2020-08-11T20:26:06", 100 | "endDate": "2020-08-11T20:31:06", 101 | "unit": "mg\/min·dL", 102 | "value": 0.8343326773392674 103 | }, 104 | { 105 | "startDate": "2020-08-11T20:31:06", 106 | "endDate": "2020-08-11T20:36:06", 107 | "unit": "mg\/min·dL", 108 | "value": 0.8663348881353556 109 | }, 110 | { 111 | "startDate": "2020-08-11T20:36:06", 112 | "endDate": "2020-08-11T20:41:06", 113 | "unit": "mg\/min·dL", 114 | "value": 0.894313761489434 115 | }, 116 | { 117 | "startDate": "2020-08-11T20:41:06", 118 | "endDate": "2020-08-11T20:46:06", 119 | "unit": "mg\/min·dL", 120 | "value": 0.9185226375377566 121 | }, 122 | { 123 | "startDate": "2020-08-11T20:46:06", 124 | "endDate": "2020-08-11T20:51:06", 125 | "unit": "mg\/min·dL", 126 | "value": 0.9391743490118711 127 | }, 128 | { 129 | "startDate": "2020-08-11T20:51:06", 130 | "endDate": "2020-08-11T20:56:06", 131 | "unit": "mg\/min·dL", 132 | "value": 0.9564460554651047 133 | }, 134 | { 135 | "startDate": "2020-08-11T20:56:06", 136 | "endDate": "2020-08-11T21:01:06", 137 | "unit": "mg\/min·dL", 138 | "value": 0.9704838465264228 139 | }, 140 | { 141 | "startDate": "2020-08-11T21:01:06", 142 | "endDate": "2020-08-11T21:06:06", 143 | "unit": "mg\/min·dL", 144 | "value": 0.9814071145378676 145 | }, 146 | { 147 | "startDate": "2020-08-11T21:06:06", 148 | "endDate": "2020-08-11T21:11:06", 149 | "unit": "mg\/min·dL", 150 | "value": 0.9893126963505664 151 | }, 152 | { 153 | "startDate": "2020-08-11T21:11:06", 154 | "endDate": "2020-08-11T21:16:06", 155 | "unit": "mg\/min·dL", 156 | "value": 0.9942787836220887 157 | }, 158 | { 159 | "startDate": "2020-08-11T21:16:06", 160 | "endDate": "2020-08-11T21:21:06", 161 | "unit": "mg\/min·dL", 162 | "value": 0.9963686006690381 163 | }, 164 | { 165 | "startDate": "2020-08-11T21:21:06", 166 | "endDate": "2020-08-11T21:26:06", 167 | "unit": "mg\/min·dL", 168 | "value": 0.9956338487771189 169 | }, 170 | { 171 | "startDate": "2020-08-11T21:26:06", 172 | "endDate": "2020-08-11T21:31:06", 173 | "unit": "mg\/min·dL", 174 | "value": 0.9921179158496414 175 | }, 176 | { 177 | "startDate": "2020-08-11T21:31:06", 178 | "endDate": "2020-08-11T21:36:06", 179 | "unit": "mg\/min·dL", 180 | "value": 0.9858588503769765 181 | }, 182 | { 183 | "startDate": "2020-08-11T21:36:06", 184 | "endDate": "2020-08-11T21:41:06", 185 | "unit": "mg\/min·dL", 186 | "value": 0.9768920989266177 187 | }, 188 | { 189 | "startDate": "2020-08-11T21:41:06", 190 | "endDate": "2020-08-11T21:46:06", 191 | "unit": "mg\/min·dL", 192 | "value": 0.965253006677156 193 | }, 194 | { 195 | "startDate": "2020-08-11T21:46:06", 196 | "endDate": "2020-08-11T21:51:06", 197 | "unit": "mg\/min·dL", 198 | "value": 0.9509790809419911 199 | }, 200 | { 201 | "startDate": "2020-08-11T21:51:06", 202 | "endDate": "2020-08-11T21:56:06", 203 | "unit": "mg\/min·dL", 204 | "value": 0.9341120181395608 205 | }, 206 | { 207 | "startDate": "2020-08-11T21:56:06", 208 | "endDate": "2020-08-11T22:01:06", 209 | "unit": "mg\/min·dL", 210 | "value": 0.9146994952586709 211 | }, 212 | { 213 | "startDate": "2020-08-11T22:01:06", 214 | "endDate": "2020-08-11T22:06:06", 215 | "unit": "mg\/min·dL", 216 | "value": 0.8927967275284316 217 | } 218 | ] 219 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/Effect Tests/low_and_falling/low_and_falling_momentum_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2020-08-11T22:05:00", 4 | "unit": "mg/dL", 5 | "amount": 0.0 6 | }, 7 | { 8 | "date": "2020-08-11T22:10:00", 9 | "unit": "mg/dL", 10 | "amount": 1.35325 11 | }, 12 | { 13 | "date": "2020-08-11T22:15:00", 14 | "unit": "mg/dL", 15 | "amount": 3.09052 16 | }, 17 | { 18 | "date": "2020-08-11T22:20:00", 19 | "unit": "mg/dL", 20 | "amount": 4.8278 21 | }, 22 | { 23 | "date": "2020-08-11T22:25:00", 24 | "unit": "mg/dL", 25 | "amount": 6.56507 26 | } 27 | ] -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/Effect Tests/low_with_low_treatment/low_with_low_treatment_momentum_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2020-08-11T22:23:55", 4 | "unit": "mg/dL", 5 | "amount": 0 6 | } 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/basal_schedule.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "i": 0, 4 | "start": "00:00:00", 5 | "rate": 0.9, 6 | "minutes": 0 7 | }, 8 | { 9 | "i": 1, 10 | "start": "04:00:00", 11 | "rate": 0.925, 12 | "minutes": 240 13 | }, 14 | { 15 | "i": 2, 16 | "start": "07:00:00", 17 | "rate": 0.85, 18 | "minutes": 420 19 | }, 20 | { 21 | "i": 3, 22 | "start": "10:00:00", 23 | "rate": 0.85, 24 | "minutes": 600 25 | }, 26 | { 27 | "i": 4, 28 | "start": "12:00:00", 29 | "rate": 0.75, 30 | "minutes": 720 31 | }, 32 | { 33 | "i": 5, 34 | "start": "15:00:00", 35 | "rate": 0.8, 36 | "minutes": 900 37 | }, 38 | { 39 | "i": 6, 40 | "start": "22:00:00", 41 | "rate": 0.9, 42 | "minutes": 1320 43 | } 44 | ] 45 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/bolus_dose.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "Bolus", 4 | "start_at": "2015-07-13T12:02:37", 5 | "end_at": "2015-07-13T12:02:37", 6 | "amount": 1.5, 7 | "unit": "U" 8 | } 9 | ] 10 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/carb_ratios.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "i": 0, 4 | "offset": 0, 5 | "q": 0, 6 | "r": 100, 7 | "ratio": 10.0, 8 | "start": "00:00:00", 9 | "x": 0 10 | }, 11 | { 12 | "i": 23, 13 | "offset": 690, 14 | "q": 0, 15 | "r": 80, 16 | "ratio": 9.0, 17 | "start": "11:30:00", 18 | "x": 1 19 | }, 20 | { 21 | "i": 36, 22 | "offset": 1080, 23 | "q": 0, 24 | "r": 80, 25 | "ratio": 8.0, 26 | "start": "18:00:00", 27 | "x": 2 28 | }, 29 | { 30 | "i": 45, 31 | "offset": 1350, 32 | "q": 0, 33 | "r": 90, 34 | "ratio": 9.0, 35 | "start": "22:30:00", 36 | "x": 3 37 | } 38 | ] 39 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/exponential_settings.json: -------------------------------------------------------------------------------- 1 | {"model": [360, 75]} 2 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/insulin_sensitivity_schedule.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "start": "00:00:00", 4 | "end": "23:59:59", 5 | "value": 40 6 | } 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/long_basal_dose.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "TempBasal", 4 | "start_at": "2015-07-13T11:41:32", 5 | "end_at": "2015-07-13T12:11:32", 6 | "amount": 6.0, 7 | "unit": "U/hour", 8 | "scheduled": 0.0 9 | } 10 | ] 11 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/long_basal_dose_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-07-13 09:40:00", "unit": "mg/dL", "amount": 0.0}, {"amount": 0.0, "date": "2015-07-13 09:45:00", "unit": "mg/dL"}, {"date": "2015-07-13 09:50:00", "unit": "mg/dL", "amount": 0.0}, {"unit": "mg/dL", "date": "2015-07-13 09:55:00", "amount": -0.07453863339073694}, {"unit": "mg/dL", "date": "2015-07-13 10:00:00", "amount": -0.2823210032318105}, {"amount": -0.6656498736878421, "date": "2015-07-13 10:05:00", "unit": "mg/dL"}, {"date": "2015-07-13 10:10:00", "amount": -1.2408701138894014, "unit": "mg/dL"}, {"unit": "mg/dL", "date": "2015-07-13 10:15:00", "amount": -2.0852820724033623}, {"amount": -3.21433723465325, "date": "2015-07-13 10:20:00", "unit": "mg/dL"}, {"amount": -4.581661076914929, "unit": "mg/dL", "date": "2015-07-13 10:25:00"}, {"date": "2015-07-13 10:30:00", "unit": "mg/dL", "amount": -6.156096131851549}, {"unit": "mg/dL", "date": "2015-07-13 10:35:00", "amount": -7.922972244004863}, {"unit": "mg/dL", "date": "2015-07-13 10:40:00", "amount": -9.865476658379063}, {"date": "2015-07-13 10:45:00", "amount": -11.967312979978324, "unit": "mg/dL"}, {"amount": -14.212701173806844, "unit": "mg/dL", "date": "2015-07-13 10:50:00"}, {"date": "2015-07-13 10:55:00", "amount": -16.586377564868805, "unit": "mg/dL"}, {"unit": "mg/dL", "amount": -19.073594838168386, "date": "2015-07-13 11:00:00"}, {"amount": -21.66012203870978, "date": "2015-07-13 11:05:00", "unit": "mg/dL"}, {"unit": "mg/dL", "date": "2015-07-13 11:10:00", "amount": -24.33224457149717}, {"date": "2015-07-13 11:15:00", "amount": -27.07676420153475, "unit": "mg/dL"}, {"date": "2015-07-13 11:20:00", "amount": -29.8809990538267, "unit": "mg/dL"}, {"date": "2015-07-13 11:25:00", "amount": -32.73278361337721, "unit": "mg/dL"}, {"amount": -35.620468725190456, "date": "2015-07-13 11:30:00", "unit": "mg/dL"}, {"amount": -38.532921594270626, "date": "2015-07-13 11:35:00", "unit": "mg/dL"}, {"amount": -41.45952578562191, "date": "2015-07-13 11:40:00", "unit": "mg/dL"}, {"unit": "mg/dL", "date": "2015-07-13 11:45:00", "amount": -44.390181224248515}, {"date": "2015-07-13 11:50:00", "unit": "mg/dL", "amount": -47.31530419515458}, {"amount": -50.225827343344335, "unit": "mg/dL", "date": "2015-07-13 11:55:00"}, {"date": "2015-07-13 12:00:00", "amount": -53.113199673821946, "unit": "mg/dL"}, {"amount": -55.9693865515916, "date": "2015-07-13 12:05:00", "unit": "mg/dL"}, {"unit": "mg/dL", "date": "2015-07-13 12:10:00", "amount": -58.78686970165748}, {"unit": "mg/dL", "date": "2015-07-13 12:15:00", "amount": -61.558647209023775}, {"amount": -64.27823351869468, "unit": "mg/dL", "date": "2015-07-13 12:20:00"}, {"date": "2015-07-13 12:25:00", "unit": "mg/dL", "amount": -66.93965943567437}, {"unit": "mg/dL", "date": "2015-07-13 12:30:00", "amount": -69.53747212496704}, {"date": "2015-07-13 12:35:00", "unit": "mg/dL", "amount": -72.06673511157686}, {"unit": "mg/dL", "amount": -74.52302828050804, "date": "2015-07-13 12:40:00"}, {"date": "2015-07-13 12:45:00", "unit": "mg/dL", "amount": -76.90244787676474}, {"amount": -79.20160650535118, "unit": "mg/dL", "date": "2015-07-13 12:50:00"}, {"date": "2015-07-13 12:55:00", "unit": "mg/dL", "amount": -81.41763313127151}, {"unit": "mg/dL", "date": "2015-07-13 13:00:00", "amount": -83.54817307952993}, {"amount": -85.59138803513063, "unit": "mg/dL", "date": "2015-07-13 13:05:00"}, {"amount": -87.54595604307781, "date": "2015-07-13 13:10:00", "unit": "mg/dL"}, {"amount": -89.41107150837561, "unit": "mg/dL", "date": "2015-07-13 13:15:00"}, {"unit": "mg/dL", "date": "2015-07-13 13:20:00", "amount": -91.18644519602825}, {"date": "2015-07-13 13:25:00", "amount": -92.87230423103992, "unit": "mg/dL"}, {"date": "2015-07-13 13:30:00", "amount": -94.4693920984148, "unit": "mg/dL"}, {"unit": "mg/dL", "amount": -95.97896864315706, "date": "2015-07-13 13:35:00"}, {"amount": -97.40281007027093, "unit": "mg/dL", "date": "2015-07-13 13:40:00"}, {"unit": "mg/dL", "date": "2015-07-13 13:45:00", "amount": -98.74320894476055}, {"unit": "mg/dL", "date": "2015-07-13 13:50:00", "amount": -100.00297419163013}, {"date": "2015-07-13 13:55:00", "unit": "mg/dL", "amount": -101.19218065893907}, {"unit": "mg/dL", "date": "2015-07-13 14:00:00", "amount": -102.15216514383653}, {"date": "2015-07-13 14:05:00", "amount": -102.89670444326316, "unit": "mg/dL"}, {"amount": -103.55784883713874, "unit": "mg/dL", "date": "2015-07-13 14:10:00"}, {"amount": -103.90959607702312, "unit": "mg/dL", "date": "2015-07-13 14:15:00"}, {"unit": "mg/dL", "amount": -104.0, "date": "2015-07-13 14:20:00"}, {"unit": "mg/dL", "amount": -104.0, "date": "2015-07-13 14:25:00"} 2 | ] 3 | -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/short_basal_dose_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-07-13T12:00:00", "unit": "mg/dL", "amount": 0}, {"date": "2015-07-13T12:05:00", "unit": "mg/dL", "amount": 0.0}, {"date": "2015-07-13T12:10:00", "unit": "mg/dL", "amount": 0.0}, {"date": "2015-07-13T12:15:00", "unit": "mg/dL", "amount": -0.2473362673606172}, {"date": "2015-07-13T12:20:00", "unit": "mg/dL", "amount": -0.6894695199257705}, {"date": "2015-07-13T12:25:00", "unit": "mg/dL", "amount": -1.2719730383725925}, {"date": "2015-07-13T12:30:00", "unit": "mg/dL", "amount": -1.984562366951076}, {"date": "2015-07-13T12:35:00", "unit": "mg/dL", "amount": -2.817238537411228}, {"date": "2015-07-13T12:40:00", "unit": "mg/dL", "amount": -3.7602880690030442}, {"date": "2015-07-13T12:45:00", "unit": "mg/dL", "amount": -4.804282968476528}, {"date": "2015-07-13T12:50:00", "unit": "mg/dL", "amount": -5.940080730081685}, {"date": "2015-07-13T12:55:00", "unit": "mg/dL", "amount": -7.158824335568501}, {"date": "2015-07-13T13:00:00", "unit": "mg/dL", "amount": -8.45194225418699}, {"date": "2015-07-13T13:05:00", "unit": "mg/dL", "amount": -9.811148442687136}, {"date": "2015-07-13T13:10:00", "unit": "mg/dL", "amount": -11.22844234531896}, {"date": "2015-07-13T13:15:00", "unit": "mg/dL", "amount": -12.696108893832443}, {"date": "2015-07-13T13:20:00", "unit": "mg/dL", "amount": -14.206718507477593}, {"date": "2015-07-13T13:25:00", "unit": "mg/dL", "amount": -15.753127093004409}, {"date": "2015-07-13T13:30:00", "unit": "mg/dL", "amount": -17.328476044662896}, {"date": "2015-07-13T13:35:00", "unit": "mg/dL", "amount": -18.926192244203055}, {"date": "2015-07-13T13:40:00", "unit": "mg/dL", "amount": -20.539988060874865}, {"date": "2015-07-13T13:45:00", "unit": "mg/dL", "amount": -22.16386135142836}, {"date": "2015-07-13T13:50:00", "unit": "mg/dL", "amount": -23.792095460113504}, {"date": "2015-07-13T13:55:00", "unit": "mg/dL", "amount": -25.419259218680324}, {"date": "2015-07-13T14:00:00", "unit": "mg/dL", "amount": -27.040206946378806}, {"date": "2015-07-13T14:05:00", "unit": "mg/dL", "amount": -28.650078449958958}, {"date": "2015-07-13T14:10:00", "unit": "mg/dL", "amount": -30.24429902367078}, {"date": "2015-07-13T14:15:00", "unit": "mg/dL", "amount": -31.818579449264266}, {"date": "2015-07-13T14:20:00", "unit": "mg/dL", "amount": -33.36891599598941}, {"date": "2015-07-13T14:25:00", "unit": "mg/dL", "amount": -34.89159042059623}, {"date": "2015-07-13T14:30:00", "unit": "mg/dL", "amount": -36.38316996733472}, {"date": "2015-07-13T14:35:00", "unit": "mg/dL", "amount": -37.840507367954864}, {"date": "2015-07-13T14:40:00", "unit": "mg/dL", "amount": -39.26074084170669}, {"date": "2015-07-13T14:45:00", "unit": "mg/dL", "amount": -40.64129409534017}, {"date": "2015-07-13T14:50:00", "unit": "mg/dL", "amount": -41.97987632310531}, {"date": "2015-07-13T14:55:00", "unit": "mg/dL", "amount": -43.27448220675213}, {"date": "2015-07-13T15:00:00", "unit": "mg/dL", "amount": -44.523391915530624}, {"date": "2015-07-13T15:05:00", "unit": "mg/dL", "amount": -45.725171106190786}, {"date": "2015-07-13T15:10:00", "unit": "mg/dL", "amount": -46.87867092298259}, {"date": "2015-07-13T15:15:00", "unit": "mg/dL", "amount": -47.98302799765608}, {"date": "2015-07-13T15:20:00", "unit": "mg/dL", "amount": -49.03766444946123}, {"date": "2015-07-13T15:25:00", "unit": "mg/dL", "amount": -50.04228788514805}, {"date": "2015-07-13T15:30:00", "unit": "mg/dL", "amount": -50.99689139896653}, {"date": "2015-07-13T15:35:00", "unit": "mg/dL", "amount": -51.901753572666685}, {"date": "2015-07-13T15:40:00", "unit": "mg/dL", "amount": -52.757438475498496}, {"date": "2015-07-13T15:45:00", "unit": "mg/dL", "amount": -53.56479566421198}, {"date": "2015-07-13T15:50:00", "unit": "mg/dL", "amount": -54.32496018305712}, {"date": "2015-07-13T15:55:00", "unit": "mg/dL", "amount": -55.039352563783964}, {"date": "2015-07-13T16:00:00", "unit": "mg/dL", "amount": -55.70967882564244}, {"date": "2015-07-13T16:05:00", "unit": "mg/dL", "amount": -56.3379304753826}, {"date": "2015-07-13T16:10:00", "unit": "mg/dL", "amount": -56.926384507254426}, {"date": "2015-07-13T16:15:00", "unit": "mg/dL", "amount": -57.5}, {"date": "2015-07-13T16:20:00", "unit": "mg/dL", "amount": -57.5}] -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/short_basal_dose_units_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-07-13T12:00:00", "unit": "mg/dL", "amount": 0}, {"date": "2015-07-13T12:05:00", "unit": "mg/dL", "amount": 0.0}, {"date": "2015-07-13T12:10:00", "unit": "mg/dL", "amount": 0.0}, {"date": "2015-07-13T12:15:00", "unit": "mg/dL", "amount": -0.2473362673606172}, {"date": "2015-07-13T12:20:00", "unit": "mg/dL", "amount": -0.6894695199257705}, {"date": "2015-07-13T12:25:00", "unit": "mg/dL", "amount": -1.2719730383725925}, {"date": "2015-07-13T12:30:00", "unit": "mg/dL", "amount": -1.984562366951076}, {"date": "2015-07-13T12:35:00", "unit": "mg/dL", "amount": -2.817238537411228}, {"date": "2015-07-13T12:40:00", "unit": "mg/dL", "amount": -3.7602880690030442}, {"date": "2015-07-13T12:45:00", "unit": "mg/dL", "amount": -4.804282968476528}, {"date": "2015-07-13T12:50:00", "unit": "mg/dL", "amount": -5.940080730081685}, {"date": "2015-07-13T12:55:00", "unit": "mg/dL", "amount": -7.158824335568501}, {"date": "2015-07-13T13:00:00", "unit": "mg/dL", "amount": -8.45194225418699}, {"date": "2015-07-13T13:05:00", "unit": "mg/dL", "amount": -9.811148442687136}, {"date": "2015-07-13T13:10:00", "unit": "mg/dL", "amount": -11.22844234531896}, {"date": "2015-07-13T13:15:00", "unit": "mg/dL", "amount": -12.696108893832443}, {"date": "2015-07-13T13:20:00", "unit": "mg/dL", "amount": -14.206718507477593}, {"date": "2015-07-13T13:25:00", "unit": "mg/dL", "amount": -15.753127093004409}, {"date": "2015-07-13T13:30:00", "unit": "mg/dL", "amount": -17.328476044662896}, {"date": "2015-07-13T13:35:00", "unit": "mg/dL", "amount": -18.926192244203055}, {"date": "2015-07-13T13:40:00", "unit": "mg/dL", "amount": -20.539988060874865}, {"date": "2015-07-13T13:45:00", "unit": "mg/dL", "amount": -22.16386135142836}, {"date": "2015-07-13T13:50:00", "unit": "mg/dL", "amount": -23.792095460113504}, {"date": "2015-07-13T13:55:00", "unit": "mg/dL", "amount": -25.419259218680324}, {"date": "2015-07-13T14:00:00", "unit": "mg/dL", "amount": -27.040206946378806}, {"date": "2015-07-13T14:05:00", "unit": "mg/dL", "amount": -28.650078449958958}, {"date": "2015-07-13T14:10:00", "unit": "mg/dL", "amount": -30.24429902367078}, {"date": "2015-07-13T14:15:00", "unit": "mg/dL", "amount": -31.818579449264266}, {"date": "2015-07-13T14:20:00", "unit": "mg/dL", "amount": -33.36891599598941}, {"date": "2015-07-13T14:25:00", "unit": "mg/dL", "amount": -34.89159042059623}, {"date": "2015-07-13T14:30:00", "unit": "mg/dL", "amount": -36.38316996733472}, {"date": "2015-07-13T14:35:00", "unit": "mg/dL", "amount": -37.840507367954864}, {"date": "2015-07-13T14:40:00", "unit": "mg/dL", "amount": -39.26074084170669}, {"date": "2015-07-13T14:45:00", "unit": "mg/dL", "amount": -40.64129409534017}, {"date": "2015-07-13T14:50:00", "unit": "mg/dL", "amount": -41.97987632310531}, {"date": "2015-07-13T14:55:00", "unit": "mg/dL", "amount": -43.27448220675213}, {"date": "2015-07-13T15:00:00", "unit": "mg/dL", "amount": -44.523391915530624}, {"date": "2015-07-13T15:05:00", "unit": "mg/dL", "amount": -45.725171106190786}, {"date": "2015-07-13T15:10:00", "unit": "mg/dL", "amount": -46.87867092298259}, {"date": "2015-07-13T15:15:00", "unit": "mg/dL", "amount": -47.98302799765608}, {"date": "2015-07-13T15:20:00", "unit": "mg/dL", "amount": -49.03766444946123}, {"date": "2015-07-13T15:25:00", "unit": "mg/dL", "amount": -50.04228788514805}, {"date": "2015-07-13T15:30:00", "unit": "mg/dL", "amount": -50.99689139896653}, {"date": "2015-07-13T15:35:00", "unit": "mg/dL", "amount": -51.901753572666685}, {"date": "2015-07-13T15:40:00", "unit": "mg/dL", "amount": -52.757438475498496}, {"date": "2015-07-13T15:45:00", "unit": "mg/dL", "amount": -53.56479566421198}, {"date": "2015-07-13T15:50:00", "unit": "mg/dL", "amount": -54.32496018305712}, {"date": "2015-07-13T15:55:00", "unit": "mg/dL", "amount": -55.039352563783964}, {"date": "2015-07-13T16:00:00", "unit": "mg/dL", "amount": -55.70967882564244}, {"date": "2015-07-13T16:05:00", "unit": "mg/dL", "amount": -56.3379304753826}, {"date": "2015-07-13T16:10:00", "unit": "mg/dL", "amount": -56.926384507254426}, {"date": "2015-07-13T16:15:00", "unit": "mg/dL", "amount": -57.5}, {"date": "2015-07-13T16:20:00", "unit": "mg/dL", "amount": -57.5}] -------------------------------------------------------------------------------- /tests/fixtures/Loop/LoopDataManager/walsh_settings.json: -------------------------------------------------------------------------------- 1 | {"model": [4]} 2 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/carb_effect_from_history_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "amount": 44, 4 | "description": "BolusWizard: 44g", 5 | "end_at": "2015-10-15T21:35:12", 6 | "start_at": "2015-10-15T21:35:12", 7 | "type": "Meal", 8 | "unit": "g" 9 | }, 10 | { 11 | "amount": 35, 12 | "description": "JournalEntryMealMarker: 35g", 13 | "end_at": "2015-10-15T20:55:28", 14 | "start_at": "2015-10-15T20:55:28", 15 | "type": "Meal", 16 | "unit": "g" 17 | }, 18 | { 19 | "amount": 30, 20 | "description": "BolusWizard: 30g", 21 | "end_at": "2015-10-15T20:05:10", 22 | "start_at": "2015-10-15T20:05:10", 23 | "type": "Meal", 24 | "unit": "g" 25 | }, 26 | { 27 | "amount": 20, 28 | "description": "JournalEntryMealMarker: 20g", 29 | "end_at": "2015-10-15T18:58:10", 30 | "start_at": "2015-10-15T18:58:10", 31 | "type": "Meal", 32 | "unit": "g" 33 | }, 34 | { 35 | "amount": 30, 36 | "description": "JournalEntryMealMarker: 30g", 37 | "end_at": "2015-10-15T18:52:32", 38 | "start_at": "2015-10-15T18:52:32", 39 | "type": "Meal", 40 | "unit": "g" 41 | }, 42 | { 43 | "amount": 30, 44 | "description": "JournalEntryMealMarker: 30g", 45 | "end_at": "2015-10-15T18:43:56", 46 | "start_at": "2015-10-15T18:43:56", 47 | "type": "Meal", 48 | "unit": "g" 49 | } 50 | ] 51 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/carb_entry_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "amount": 44, 4 | "start_at": "2015-10-15T21:35:12", 5 | "absorption_time": 120, 6 | "unit": "g" 7 | }, 8 | { 9 | "amount": 30, 10 | "start_at": "2015-10-15T21:55:00", 11 | "absorption_time": 120, 12 | "unit": "g" 13 | }, 14 | { 15 | "amount": 30, 16 | "start_at": "2015-10-15T23:00:00", 17 | "absorption_time": 120, 18 | "unit": "g" 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/dynamic_glucose_effect_fully_observed_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date" : "2015-10-15T21:30:00", 4 | "amount" : 0 5 | }, 6 | { 7 | "date" : "2015-10-15T21:35:00", 8 | "amount" : 0 9 | }, 10 | { 11 | "amount" : 0, 12 | "date" : "2015-10-15T21:40:00" 13 | }, 14 | { 15 | "date" : "2015-10-15T21:45:00", 16 | "amount" : 25.000000000000004 17 | }, 18 | { 19 | "amount" : 40, 20 | "date" : "2015-10-15T21:50:00" 21 | }, 22 | { 23 | "date" : "2015-10-15T21:55:00", 24 | "amount" : 50.000000000000007 25 | }, 26 | { 27 | "date" : "2015-10-15T22:00:00", 28 | "amount" : 65 29 | }, 30 | { 31 | "date" : "2015-10-15T22:05:00", 32 | "amount" : 90 33 | }, 34 | { 35 | "date" : "2015-10-15T22:10:00", 36 | "amount" : 90 37 | }, 38 | { 39 | "amount" : 90, 40 | "date" : "2015-10-15T22:15:00" 41 | }, 42 | { 43 | "date" : "2015-10-15T22:20:00", 44 | "amount" : 115 45 | }, 46 | { 47 | "date" : "2015-10-15T22:25:00", 48 | "amount" : 135 49 | }, 50 | { 51 | "amount" : 150, 52 | "date" : "2015-10-15T22:30:00" 53 | }, 54 | { 55 | "date" : "2015-10-15T22:35:00", 56 | "amount" : 160 57 | }, 58 | { 59 | "date" : "2015-10-15T22:40:00", 60 | "amount" : 165 61 | }, 62 | { 63 | "date" : "2015-10-15T22:45:00", 64 | "amount" : 170 65 | }, 66 | { 67 | "date" : "2015-10-15T22:50:00", 68 | "amount" : 175 69 | }, 70 | { 71 | "amount" : 185, 72 | "date" : "2015-10-15T22:55:00" 73 | }, 74 | { 75 | "date" : "2015-10-15T23:00:00", 76 | "amount" : 200 77 | }, 78 | { 79 | "amount" : 220, 80 | "date" : "2015-10-15T23:05:00" 81 | }, 82 | { 83 | "amount" : 220, 84 | "date" : "2015-10-15T23:10:00" 85 | }, 86 | { 87 | "amount" : 220, 88 | "date" : "2015-10-15T23:15:00" 89 | }, 90 | { 91 | "date" : "2015-10-15T23:20:00", 92 | "amount" : 220 93 | }, 94 | { 95 | "date" : "2015-10-15T23:25:00", 96 | "amount" : 220 97 | }, 98 | { 99 | "date" : "2015-10-15T23:30:00", 100 | "amount" : 220 101 | }, 102 | { 103 | "date" : "2015-10-15T23:35:00", 104 | "amount" : 220 105 | }, 106 | { 107 | "date" : "2015-10-15T23:40:00", 108 | "amount" : 220 109 | }, 110 | { 111 | "amount" : 220, 112 | "date" : "2015-10-15T23:45:00" 113 | }, 114 | { 115 | "amount" : 220, 116 | "date" : "2015-10-15T23:50:00" 117 | }, 118 | { 119 | "date" : "2015-10-15T23:55:00", 120 | "amount" : 220 121 | }, 122 | { 123 | "date" : "2015-10-16T00:00:00", 124 | "amount" : 220 125 | }, 126 | { 127 | "date" : "2015-10-16T00:05:00", 128 | "amount" : 220 129 | }, 130 | { 131 | "amount" : 220, 132 | "date" : "2015-10-16T00:10:00" 133 | }, 134 | { 135 | "amount" : 220, 136 | "date" : "2015-10-16T00:15:00" 137 | }, 138 | { 139 | "date" : "2015-10-16T00:20:00", 140 | "amount" : 220 141 | }, 142 | { 143 | "date" : "2015-10-16T00:25:00", 144 | "amount" : 220 145 | }, 146 | { 147 | "amount" : 220, 148 | "date" : "2015-10-16T00:30:00" 149 | }, 150 | { 151 | "date" : "2015-10-16T00:35:00", 152 | "amount" : 220 153 | }, 154 | { 155 | "date" : "2015-10-16T00:40:00", 156 | "amount" : 220 157 | }, 158 | { 159 | "amount" : 220, 160 | "date" : "2015-10-16T00:45:00" 161 | }, 162 | { 163 | "date" : "2015-10-16T00:50:00", 164 | "amount" : 220 165 | }, 166 | { 167 | "amount" : 220, 168 | "date" : "2015-10-16T00:55:00" 169 | }, 170 | { 171 | "amount" : 220, 172 | "date" : "2015-10-16T01:00:00" 173 | }, 174 | { 175 | "amount" : 220, 176 | "date" : "2015-10-16T01:05:00" 177 | }, 178 | { 179 | "date" : "2015-10-16T01:10:00", 180 | "amount" : 220 181 | }, 182 | { 183 | "amount" : 220, 184 | "date" : "2015-10-16T01:15:00" 185 | }, 186 | { 187 | "date" : "2015-10-16T01:20:00", 188 | "amount" : 220 189 | }, 190 | { 191 | "amount" : 220, 192 | "date" : "2015-10-16T01:25:00" 193 | }, 194 | { 195 | "date" : "2015-10-16T01:30:00", 196 | "amount" : 220 197 | }, 198 | { 199 | "amount" : 220, 200 | "date" : "2015-10-16T01:35:00" 201 | }, 202 | { 203 | "date" : "2015-10-16T01:40:00", 204 | "amount" : 220 205 | }, 206 | { 207 | "amount" : 220, 208 | "date" : "2015-10-16T01:45:00" 209 | }, 210 | { 211 | "date" : "2015-10-16T01:50:00", 212 | "amount" : 220 213 | }, 214 | { 215 | "date" : "2015-10-16T01:55:00", 216 | "amount" : 220 217 | }, 218 | { 219 | "amount" : 220, 220 | "date" : "2015-10-16T02:00:00" 221 | }, 222 | { 223 | "amount" : 220, 224 | "date" : "2015-10-16T02:05:00" 225 | }, 226 | { 227 | "date" : "2015-10-16T02:10:00", 228 | "amount" : 220 229 | }, 230 | { 231 | "amount" : 220, 232 | "date" : "2015-10-16T02:15:00" 233 | }, 234 | { 235 | "amount" : 220, 236 | "date" : "2015-10-16T02:20:00" 237 | }, 238 | { 239 | "amount" : 220, 240 | "date" : "2015-10-16T02:25:00" 241 | }, 242 | { 243 | "amount" : 220, 244 | "date" : "2015-10-16T02:30:00" 245 | }, 246 | { 247 | "date" : "2015-10-16T02:35:00", 248 | "amount" : 220 249 | }, 250 | { 251 | "amount" : 220, 252 | "date" : "2015-10-16T02:40:00" 253 | }, 254 | { 255 | "amount" : 220, 256 | "date" : "2015-10-16T02:45:00" 257 | }, 258 | { 259 | "amount" : 220, 260 | "date" : "2015-10-16T02:50:00" 261 | }, 262 | { 263 | "date" : "2015-10-16T02:55:00", 264 | "amount" : 220 265 | }, 266 | { 267 | "amount" : 220, 268 | "date" : "2015-10-16T03:00:00" 269 | }, 270 | { 271 | "date" : "2015-10-16T03:05:00", 272 | "amount" : 220 273 | }, 274 | { 275 | "date" : "2015-10-16T03:10:00", 276 | "amount" : 220 277 | }, 278 | { 279 | "amount" : 220, 280 | "date" : "2015-10-16T03:15:00" 281 | }, 282 | { 283 | "amount" : 220, 284 | "date" : "2015-10-16T03:20:00" 285 | }, 286 | { 287 | "amount" : 220, 288 | "date" : "2015-10-16T03:25:00" 289 | }, 290 | { 291 | "amount" : 220, 292 | "date" : "2015-10-16T03:30:00" 293 | }, 294 | { 295 | "amount" : 220, 296 | "date" : "2015-10-16T03:35:00" 297 | } 298 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/grouped_by_overlapping_absorption_times_border_case_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "amount": 44, 4 | "description": "BolusWizard: 44g", 5 | "end_at": "2015-10-15T15:55:28", 6 | "start_at": "2015-10-15T15:55:28", 7 | "type": "Meal", 8 | "unit": "g" 9 | }, 10 | { 11 | "amount": 35, 12 | "description": "JournalEntryMealMarker: 35g", 13 | "end_at": "2015-10-15T12:55:28", 14 | "start_at": "2015-10-15T12:55:28", 15 | "type": "Meal", 16 | "unit": "g" 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/grouped_by_overlapping_absorption_times_border_case_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | [ 3 | { 4 | "amount": 35, 5 | "description": "JournalEntryMealMarker: 35g", 6 | "end_at": "2015-10-15T12:55:28", 7 | "start_at": "2015-10-15T12:55:28", 8 | "type": "Meal", 9 | "unit": "g" 10 | } 11 | ], 12 | [ 13 | { 14 | "amount": 44, 15 | "description": "BolusWizard: 44g", 16 | "end_at": "2015-10-15T15:55:28", 17 | "start_at": "2015-10-15T15:55:28", 18 | "type": "Meal", 19 | "unit": "g" 20 | } 21 | ] 22 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/grouped_by_overlapping_absorption_times_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "amount": 44, 4 | "description": "BolusWizard: 44g", 5 | "end_at": "2015-10-15T21:35:12", 6 | "start_at": "2015-10-15T21:35:12", 7 | "type": "Meal", 8 | "unit": "g" 9 | }, 10 | { 11 | "amount": 35, 12 | "description": "JournalEntryMealMarker: 35g", 13 | "end_at": "2015-10-15T12:55:28", 14 | "start_at": "2015-10-15T12:55:28", 15 | "type": "Meal", 16 | "unit": "g" 17 | }, 18 | { 19 | "amount": 30, 20 | "description": "BolusWizard: 30g", 21 | "end_at": "2015-10-15T15:05:10", 22 | "start_at": "2015-10-15T15:05:10", 23 | "type": "Meal", 24 | "unit": "g" 25 | }, 26 | { 27 | "amount": 20, 28 | "description": "JournalEntryMealMarker: 20g", 29 | "end_at": "2015-10-15T18:58:10", 30 | "start_at": "2015-10-15T18:58:10", 31 | "type": "Meal", 32 | "unit": "g" 33 | }, 34 | { 35 | "amount": 30, 36 | "description": "JournalEntryMealMarker: 30g", 37 | "end_at": "2015-10-15T18:52:32", 38 | "start_at": "2015-10-15T18:52:32", 39 | "type": "Meal", 40 | "unit": "g" 41 | }, 42 | { 43 | "amount": 30, 44 | "description": "JournalEntryMealMarker: 30g", 45 | "end_at": "2015-10-15T18:43:56", 46 | "start_at": "2015-10-15T18:43:56", 47 | "type": "Meal", 48 | "unit": "g" 49 | } 50 | ] 51 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/grouped_by_overlapping_absorption_times_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | [ 3 | { 4 | "amount": 35, 5 | "description": "JournalEntryMealMarker: 35g", 6 | "end_at": "2015-10-15T12:55:28", 7 | "start_at": "2015-10-15T12:55:28", 8 | "type": "Meal", 9 | "unit": "g" 10 | }, 11 | { 12 | "amount": 30, 13 | "description": "BolusWizard: 30g", 14 | "end_at": "2015-10-15T15:05:10", 15 | "start_at": "2015-10-15T15:05:10", 16 | "type": "Meal", 17 | "unit": "g" 18 | } 19 | ], 20 | [ 21 | { 22 | "amount": 30, 23 | "description": "JournalEntryMealMarker: 30g", 24 | "end_at": "2015-10-15T18:43:56", 25 | "start_at": "2015-10-15T18:43:56", 26 | "type": "Meal", 27 | "unit": "g" 28 | }, 29 | { 30 | "amount": 30, 31 | "description": "JournalEntryMealMarker: 30g", 32 | "end_at": "2015-10-15T18:52:32", 33 | "start_at": "2015-10-15T18:52:32", 34 | "type": "Meal", 35 | "unit": "g" 36 | }, 37 | { 38 | "amount": 20, 39 | "description": "JournalEntryMealMarker: 20g", 40 | "end_at": "2015-10-15T18:58:10", 41 | "start_at": "2015-10-15T18:58:10", 42 | "type": "Meal", 43 | "unit": "g" 44 | }, 45 | { 46 | "amount": 44, 47 | "description": "BolusWizard: 44g", 48 | "end_at": "2015-10-15T21:35:12", 49 | "start_at": "2015-10-15T21:35:12", 50 | "type": "Meal", 51 | "unit": "g" 52 | } 53 | ] 54 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/ice_1_hour_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "velocity": 0.0, 4 | "start_at": "2015-10-15T21:30:12", 5 | "end_at": "2015-10-15T21:35:12" 6 | }, 7 | { 8 | "velocity": 5.0, 9 | "start_at": "2015-10-15T21:35:12", 10 | "end_at": "2015-10-15T21:40:12" 11 | }, 12 | { 13 | "velocity": 3.0, 14 | "start_at": "2015-10-15T21:40:12", 15 | "end_at": "2015-10-15T21:45:12" 16 | }, 17 | { 18 | "velocity": 2.0, 19 | "start_at": "2015-10-15T21:45:12", 20 | "end_at": "2015-10-15T21:50:12" 21 | }, 22 | { 23 | "velocity": 3.0, 24 | "start_at": "2015-10-15T21:50:12", 25 | "end_at": "2015-10-15T21:55:12" 26 | }, 27 | { 28 | "velocity": 5.0, 29 | "start_at": "2015-10-15T21:55:12", 30 | "end_at": "2015-10-15T22:00:12" 31 | }, 32 | { 33 | "velocity": -2.0, 34 | "start_at": "2015-10-15T22:00:12", 35 | "end_at": "2015-10-15T22:05:12" 36 | }, 37 | { 38 | "velocity": -1.0, 39 | "start_at": "2015-10-15T22:05:12", 40 | "end_at": "2015-10-15T22:10:12" 41 | }, 42 | { 43 | "velocity": 5.0, 44 | "start_at": "2015-10-15T22:10:12", 45 | "end_at": "2015-10-15T22:15:12" 46 | }, 47 | { 48 | "velocity": 4.0, 49 | "start_at": "2015-10-15T22:15:12", 50 | "end_at": "2015-10-15T22:20:12" 51 | }, 52 | { 53 | "velocity": 3.0, 54 | "start_at": "2015-10-15T22:20:12", 55 | "end_at": "2015-10-15T22:25:12" 56 | }, 57 | { 58 | "velocity": 2.0, 59 | "start_at": "2015-10-15T22:25:12", 60 | "end_at": "2015-10-15T22:30:12" 61 | }, 62 | { 63 | "velocity": 1.0, 64 | "start_at": "2015-10-15T22:30:12", 65 | "end_at": "2015-10-15T22:35:12" 66 | }, 67 | { 68 | "velocity": 1.0, 69 | "start_at": "2015-10-15T22:35:12", 70 | "end_at": "2015-10-15T22:40:12" 71 | }, 72 | { 73 | "velocity": 1.0, 74 | "start_at": "2015-10-15T22:40:12", 75 | "end_at": "2015-10-15T22:45:12" 76 | }, 77 | { 78 | "velocity": 2.0, 79 | "start_at": "2015-10-15T22:45:12", 80 | "end_at": "2015-10-15T22:50:12" 81 | }, 82 | { 83 | "velocity": 3.0, 84 | "start_at": "2015-10-15T22:50:12", 85 | "end_at": "2015-10-15T22:55:12" 86 | }, 87 | { 88 | "velocity": 4.0, 89 | "start_at": "2015-10-15T22:55:12", 90 | "end_at": "2015-10-15T23:00:12" 91 | } 92 | ] 93 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/ice_35_min_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "velocity": 0.0, 4 | "start_at": "2015-10-15T21:30:12", 5 | "end_at": "2015-10-15T21:35:12" 6 | }, 7 | { 8 | "velocity": 5.0, 9 | "start_at": "2015-10-15T21:35:12", 10 | "end_at": "2015-10-15T21:40:12" 11 | }, 12 | { 13 | "velocity": 3.0, 14 | "start_at": "2015-10-15T21:40:12", 15 | "end_at": "2015-10-15T21:45:12" 16 | }, 17 | { 18 | "velocity": 2.0, 19 | "start_at": "2015-10-15T21:45:12", 20 | "end_at": "2015-10-15T21:50:12" 21 | }, 22 | { 23 | "velocity": 3.0, 24 | "start_at": "2015-10-15T21:50:12", 25 | "end_at": "2015-10-15T21:55:12" 26 | }, 27 | { 28 | "velocity": 5.0, 29 | "start_at": "2015-10-15T21:55:12", 30 | "end_at": "2015-10-15T22:00:12" 31 | }, 32 | { 33 | "velocity": -2.0, 34 | "start_at": "2015-10-15T22:00:12", 35 | "end_at": "2015-10-15T22:05:12" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/ice_slow_absorption.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "velocity": 0.0, 4 | "start_at": "2015-10-15T21:30:12", 5 | "end_at": "2015-10-15T21:35:12" 6 | }, 7 | { 8 | "velocity": 2.0, 9 | "start_at": "2015-10-15T21:35:12", 10 | "end_at": "2015-10-15T21:40:12" 11 | }, 12 | { 13 | "velocity": 3.0, 14 | "start_at": "2015-10-15T21:40:12", 15 | "end_at": "2015-10-15T21:45:12" 16 | }, 17 | { 18 | "velocity": 2.0, 19 | "start_at": "2015-10-15T21:45:12", 20 | "end_at": "2015-10-15T21:50:12" 21 | }, 22 | { 23 | "velocity": 1.0, 24 | "start_at": "2015-10-15T21:50:12", 25 | "end_at": "2015-10-15T21:55:12" 26 | }, 27 | { 28 | "velocity": 0.0, 29 | "start_at": "2015-10-15T21:55:12", 30 | "end_at": "2015-10-15T22:00:12" 31 | }, 32 | { 33 | "velocity": -2.0, 34 | "start_at": "2015-10-15T22:00:12", 35 | "end_at": "2015-10-15T22:05:12" 36 | }, 37 | { 38 | "velocity": -1.0, 39 | "start_at": "2015-10-15T22:05:12", 40 | "end_at": "2015-10-15T22:10:12" 41 | }, 42 | { 43 | "velocity": 0.0, 44 | "start_at": "2015-10-15T22:10:12", 45 | "end_at": "2015-10-15T22:15:12" 46 | }, 47 | { 48 | "velocity": 1.0, 49 | "start_at": "2015-10-15T22:15:12", 50 | "end_at": "2015-10-15T22:20:12" 51 | }, 52 | { 53 | "velocity": 0.0, 54 | "start_at": "2015-10-15T22:20:12", 55 | "end_at": "2015-10-15T22:25:12" 56 | }, 57 | { 58 | "velocity": 0.0, 59 | "start_at": "2015-10-15T22:25:12", 60 | "end_at": "2015-10-15T22:30:12" 61 | }, 62 | { 63 | "velocity": -1.0, 64 | "start_at": "2015-10-15T22:30:12", 65 | "end_at": "2015-10-15T22:35:12" 66 | }, 67 | { 68 | "velocity": -2.0, 69 | "start_at": "2015-10-15T22:35:12", 70 | "end_at": "2015-10-15T22:40:12" 71 | }, 72 | { 73 | "velocity": -2.0, 74 | "start_at": "2015-10-15T22:40:12", 75 | "end_at": "2015-10-15T22:45:12" 76 | }, 77 | { 78 | "velocity": -3.0, 79 | "start_at": "2015-10-15T22:45:12", 80 | "end_at": "2015-10-15T22:50:12" 81 | }, 82 | { 83 | "velocity": -3.0, 84 | "start_at": "2015-10-15T22:50:12", 85 | "end_at": "2015-10-15T22:55:12" 86 | }, 87 | { 88 | "velocity": -2.0, 89 | "start_at": "2015-10-15T22:55:12", 90 | "end_at": "2015-10-15T23:00:12" 91 | } 92 | ] 93 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/reconcile_bolus_wizard_duplicates_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "amount": 2.0, 4 | "description": "Normal bolus: 2.0U", 5 | "end_at": "2015-06-05T16:21:01", 6 | "start_at": "2015-06-05T16:21:01", 7 | "type": "Bolus", 8 | "unit": "U" 9 | }, 10 | { 11 | "amount": 65, 12 | "description": "BolusWizard: 65g", 13 | "end_at": "2015-06-05T18:44:47", 14 | "start_at": "2015-06-05T18:44:47", 15 | "type": "Meal", 16 | "unit": "g" 17 | }, 18 | { 19 | "amount": 65, 20 | "description": "BolusWizard: 65g", 21 | "end_at": "2015-06-05T18:44:54", 22 | "start_at": "2015-06-05T18:44:54", 23 | "type": "Meal", 24 | "unit": "g" 25 | }, 26 | { 27 | "amount": 0.6, 28 | "description": "Normal bolus: 0.6U", 29 | "end_at": "2015-06-05T18:44:54", 30 | "start_at": "2015-06-05T18:44:54", 31 | "type": "Bolus", 32 | "unit": "U" 33 | }, 34 | { 35 | "amount": 30, 36 | "description": "BolusWizard: 30g", 37 | "end_at": "2015-06-05T18:54:43", 38 | "start_at": "2015-06-05T18:54:43", 39 | "type": "Meal", 40 | "unit": "g" 41 | }, 42 | { 43 | "amount": 2.0, 44 | "description": "Normal bolus: 2.0U", 45 | "end_at": "2015-06-05T18:54:43", 46 | "start_at": "2015-06-05T18:54:43", 47 | "type": "Bolus", 48 | "unit": "U" 49 | }, 50 | { 51 | "amount": 10, 52 | "description": "BolusWizard: 10g", 53 | "end_at": "2015-06-05T18:57:22", 54 | "start_at": "2015-06-05T18:57:22", 55 | "type": "Meal", 56 | "unit": "g" 57 | } 58 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/CarbKit/reconcile_bolus_wizard_duplicates_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "amount": 2.0, 4 | "description": "Normal bolus: 2.0U", 5 | "end_at": "2015-06-05T16:21:01", 6 | "start_at": "2015-06-05T16:21:01", 7 | "type": "Bolus", 8 | "unit": "U" 9 | }, 10 | { 11 | "amount": 65, 12 | "description": "BolusWizard: 65g", 13 | "end_at": "2015-06-05T18:44:54", 14 | "start_at": "2015-06-05T18:44:54", 15 | "type": "Meal", 16 | "unit": "g" 17 | }, 18 | { 19 | "amount": 0.6, 20 | "description": "Normal bolus: 0.6U", 21 | "end_at": "2015-06-05T18:44:54", 22 | "start_at": "2015-06-05T18:44:54", 23 | "type": "Bolus", 24 | "unit": "U" 25 | }, 26 | { 27 | "amount": 30, 28 | "description": "BolusWizard: 30g", 29 | "end_at": "2015-06-05T18:54:43", 30 | "start_at": "2015-06-05T18:54:43", 31 | "type": "Meal", 32 | "unit": "g" 33 | }, 34 | { 35 | "amount": 2.0, 36 | "description": "Normal bolus: 2.0U", 37 | "end_at": "2015-06-05T18:54:43", 38 | "start_at": "2015-06-05T18:54:43", 39 | "type": "Bolus", 40 | "unit": "U" 41 | }, 42 | { 43 | "amount": 10, 44 | "description": "BolusWizard: 10g", 45 | "end_at": "2015-06-05T18:57:22", 46 | "start_at": "2015-06-05T18:57:22", 47 | "type": "Meal", 48 | "unit": "g" 49 | } 50 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/counteraction_effect_falling_glucose_almost_duplicates_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:15:00", 4 | "amount": 159 5 | }, 6 | { 7 | "date": "2015-10-25T19:15:01", 8 | "amount": 159 9 | }, 10 | { 11 | "date": "2015-10-25T19:19:59", 12 | "amount": 136 13 | }, 14 | { 15 | "date": "2015-10-25T19:20:00", 16 | "amount": 136 17 | }, 18 | { 19 | "date": "2015-10-25T19:25:00", 20 | "amount": 123 21 | }, 22 | { 23 | "date": "2015-10-25T19:25:01", 24 | "amount": 123 25 | }, 26 | { 27 | "date": "2015-10-25T19:30:00", 28 | "amount": 120 29 | }, 30 | { 31 | "date": "2015-10-25T19:30:01", 32 | "amount": 120 33 | } 34 | ] 35 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/counteraction_effect_falling_glucose_almost_duplicates_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "value" : -4.61538461538461, 4 | "startDate" : "2015-10-25T19:15:00", 5 | "unit" : "mg\/min·dL", 6 | "endDate" : "2015-10-25T19:19:59" 7 | }, 8 | { 9 | "value" : -2.59136212624585, 10 | "startDate" : "2015-10-25T19:19:59", 11 | "unit" : "mg\/min·dL", 12 | "endDate" : "2015-10-25T19:25:00" 13 | }, 14 | { 15 | "value" : -0.59999999999999998, 16 | "startDate" : "2015-10-25T19:25:00", 17 | "unit" : "mg\/min·dL", 18 | "endDate" : "2015-10-25T19:30:00" 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/counteraction_effect_falling_glucose_double_entries_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:15:00", 4 | "amount": 159 5 | }, 6 | { 7 | "date": "2015-10-25T19:15:00", 8 | "amount": 159 9 | }, 10 | { 11 | "date": "2015-10-25T19:20:00", 12 | "amount": 136 13 | }, 14 | { 15 | "date": "2015-10-25T19:20:00", 16 | "amount": 136 17 | }, 18 | { 19 | "date": "2015-10-25T19:25:00", 20 | "amount": 123 21 | }, 22 | { 23 | "date": "2015-10-25T19:25:00", 24 | "amount": 123 25 | }, 26 | { 27 | "date": "2015-10-25T19:30:00", 28 | "amount": 120 29 | }, 30 | { 31 | "date": "2015-10-25T19:30:00", 32 | "amount": 120 33 | } 34 | ] 35 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/counteraction_effect_falling_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:15:00", 4 | "amount": 159 5 | }, 6 | { 7 | "date": "2015-10-25T19:20:00", 8 | "amount": 136 9 | }, 10 | { 11 | "date": "2015-10-25T19:25:00", 12 | "amount": 123 13 | }, 14 | { 15 | "date": "2015-10-25T19:30:00", 16 | "amount": 120 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/counteraction_effect_falling_glucose_insulin.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:15:00", 4 | "amount": 100, 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "date": "2015-10-25T19:20:00", 9 | "amount": 100, 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "date": "2015-10-25T19:25:00", 14 | "amount": 100, 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "date": "2015-10-25T19:30:00", 19 | "amount": 100, 20 | "unit": "mg/dL" 21 | } 22 | ] 23 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/counteraction_effect_falling_glucose_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "value" : -4.5999999999999988, 4 | "startDate" : "2015-10-25T19:15:00", 5 | "unit" : "mg\/min·dL", 6 | "endDate" : "2015-10-25T19:20:00" 7 | }, 8 | { 9 | "value" : -2.5999999999999996, 10 | "startDate" : "2015-10-25T19:20:00", 11 | "unit" : "mg\/min·dL", 12 | "endDate" : "2015-10-25T19:25:00" 13 | }, 14 | { 15 | "value" : -0.59999999999999998, 16 | "startDate" : "2015-10-25T19:25:00", 17 | "unit" : "mg\/min·dL", 18 | "endDate" : "2015-10-25T19:30:00" 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_bouncing_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:19:37", 4 | "amount": 123 5 | }, 6 | { 7 | "date": "2015-10-25T19:24:36", 8 | "amount": 120 9 | }, 10 | { 11 | "date": "2015-10-25T19:29:37", 12 | "amount": 129 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_bouncing_glucose_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:25:00", 4 | "amount": 0.0, 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "date": "2015-10-25T19:30:00", 9 | "amount": 0.23051025736941719, 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "date": "2015-10-25T19:35:00", 14 | "amount": 3.2371657882748588, 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "date": "2015-10-25T19:40:00", 19 | "amount": 6.2438213191803005, 20 | "unit": "mg/dL" 21 | }, 22 | { 23 | "date": "2015-10-25T19:45:00", 24 | "amount": 9.2504768500857413, 25 | "unit": "mg/dL" 26 | }, 27 | { 28 | "date": "2015-10-25T19:50:00", 29 | "amount": 12.257132380991184, 30 | "unit": "mg/dL" 31 | }, 32 | { 33 | "date": "2015-10-25T19:55:00", 34 | "amount": 15.263787911896625, 35 | "unit": "mg/dL" 36 | }, 37 | { 38 | "date": "2015-10-25T20:00:00", 39 | "amount": 18.270443442802062, 40 | "unit": "mg/dL" 41 | } 42 | ] 43 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_display_only_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:19:37", 4 | "amount": 123, 5 | "display_only": "false" 6 | }, 7 | { 8 | "date": "2015-10-25T19:24:36", 9 | "amount": 120, 10 | "display_only": "true" 11 | }, 12 | { 13 | "date": "2015-10-25T19:29:37", 14 | "amount": 129, 15 | "display_only": "false" 16 | } 17 | ] 18 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_duplicate_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:25:00", 4 | "amount": 125 5 | }, 6 | { 7 | "date": "2015-10-25T19:25:00", 8 | "amount": 125 9 | }, 10 | { 11 | "date": "2015-10-25T19:25:00", 12 | "amount": 125 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_falling_glucose_duplicate_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:15:00", 4 | "amount": 129 5 | }, 6 | { 7 | "date": "2015-10-25T19:15:00", 8 | "amount": 129 9 | }, 10 | { 11 | "date": "2015-10-25T19:20:00", 12 | "amount": 126 13 | }, 14 | { 15 | "date": "2015-10-25T19:20:00", 16 | "amount": 126 17 | }, 18 | { 19 | "date": "2015-10-25T19:25:00", 20 | "amount": 123 21 | }, 22 | { 23 | "date": "2015-10-25T19:25:00", 24 | "amount": 123 25 | }, 26 | { 27 | "date": "2015-10-25T19:30:00", 28 | "amount": 120 29 | }, 30 | { 31 | "date": "2015-10-25T19:30:00", 32 | "amount": 120 33 | } 34 | ] 35 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_falling_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:15:00", 4 | "amount": 129 5 | }, 6 | { 7 | "date": "2015-10-25T19:20:00", 8 | "amount": 126 9 | }, 10 | { 11 | "date": "2015-10-25T19:25:00", 12 | "amount": 123 13 | }, 14 | { 15 | "date": "2015-10-25T19:30:00", 16 | "amount": 120 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_falling_glucose_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:30:00", 4 | "amount": 0.0, 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "date": "2015-10-25T19:35:00", 9 | "amount": -3, 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "date": "2015-10-25T19:40:00", 14 | "amount": -6, 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "date": "2015-10-25T19:45:00", 19 | "amount": -9, 20 | "unit": "mg/dL" 21 | }, 22 | { 23 | "date": "2015-10-25T19:50:00", 24 | "amount": -12, 25 | "unit": "mg/dL" 26 | }, 27 | { 28 | "date": "2015-10-25T19:55:00", 29 | "amount": -15, 30 | "unit": "mg/dL" 31 | }, 32 | { 33 | "date": "2015-10-25T20:00:00", 34 | "amount": -18, 35 | "unit": "mg/dL" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_incomplete_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:14:37", 4 | "amount": 123 5 | }, 6 | { 7 | "date": "2015-10-25T19:24:36", 8 | "amount": 120 9 | }, 10 | { 11 | "date": "2015-10-25T19:29:37", 12 | "amount": 129 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_mixed_provenance_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:19:37", 4 | "amount": 123, 5 | "display_only": "false" 6 | }, 7 | { 8 | "date": "2015-10-25T19:24:36", 9 | "amount": 120, 10 | "display_only": "false", 11 | "provenance_identifier": "com.developer.BLEGlucoseMeter" 12 | }, 13 | { 14 | "date": "2015-10-25T19:29:37", 15 | "amount": 129, 16 | "display_only": "false" 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_rising_glucose_double_entries_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:15:00", 4 | "amount": 120 5 | }, 6 | { 7 | "date": "2015-10-25T19:17:30", 8 | "amount": 121.5 9 | }, 10 | { 11 | "date": "2015-10-25T19:20:00", 12 | "amount": 123 13 | }, 14 | { 15 | "date": "2015-10-25T19:22:30", 16 | "amount": 124.5 17 | }, 18 | { 19 | "date": "2015-10-25T19:25:00", 20 | "amount": 126 21 | }, 22 | { 23 | "date": "2015-10-25T19:27:30", 24 | "amount": 127.5 25 | }, 26 | { 27 | "date": "2015-10-25T19:30:00", 28 | "amount": 129 29 | } 30 | ] 31 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_rising_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:15:00", 4 | "amount": 120 5 | }, 6 | { 7 | "date": "2015-10-25T19:20:00", 8 | "amount": 123 9 | }, 10 | { 11 | "date": "2015-10-25T19:25:00", 12 | "amount": 126 13 | }, 14 | { 15 | "date": "2015-10-25T19:30:00", 16 | "amount": 129 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_rising_glucose_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:30:00", 4 | "amount": 0.0, 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "date": "2015-10-25T19:35:00", 9 | "amount": 3, 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "date": "2015-10-25T19:40:00", 14 | "amount": 6, 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "date": "2015-10-25T19:45:00", 19 | "amount": 9, 20 | "unit": "mg/dL" 21 | }, 22 | { 23 | "date": "2015-10-25T19:50:00", 24 | "amount": 12, 25 | "unit": "mg/dL" 26 | }, 27 | { 28 | "date": "2015-10-25T19:55:00", 29 | "amount": 15, 30 | "unit": "mg/dL" 31 | }, 32 | { 33 | "date": "2015-10-25T20:00:00", 34 | "amount": 18, 35 | "unit": "mg/dL" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_stable_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:20:00", 4 | "amount": 120 5 | }, 6 | { 7 | "date": "2015-10-25T19:25:00", 8 | "amount": 120 9 | }, 10 | { 11 | "date": "2015-10-25T19:30:00", 12 | "amount": 120 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/GlucoseKit/momentum_effect_stable_glucose_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-25T19:30:00", 4 | "amount": 0.0, 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "date": "2015-10-25T19:35:00", 9 | "amount": 0.0, 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "date": "2015-10-25T19:40:00", 14 | "amount": 0.0, 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "date": "2015-10-25T19:45:00", 19 | "amount": 0.0, 20 | "unit": "mg/dL" 21 | }, 22 | { 23 | "date": "2015-10-25T19:50:00", 24 | "amount": 0.0, 25 | "unit": "mg/dL" 26 | }, 27 | { 28 | "date": "2015-10-25T19:55:00", 29 | "amount": 0.0, 30 | "unit": "mg/dL" 31 | }, 32 | { 33 | "date": "2015-10-25T20:00:00", 34 | "amount": 0.0, 35 | "unit": "mg/dL" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/basal_dose.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "TempBasal", 4 | "start_at": "2015-07-13T12:00:00", 5 | "end_at": "2015-07-13T13:00:00", 6 | "amount": 2.0, 7 | "unit": "U/hour", 8 | "scheduled": 1.0 9 | } 10 | ] 11 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/bolus_dose.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "Bolus", 4 | "start_at": "2015-07-13T12:02:37", 5 | "end_at": "2015-07-13T12:02:37", 6 | "amount": 1.5, 7 | "unit": "U" 8 | } 9 | ] 10 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/effect_from_basal_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-07-13T12:00:00", "amount": 0.0, "unit": "mg/dL"}, {"date": "2015-07-13T12:05:00", "amount": 0.0, "unit": "mg/dL"}, {"date": "2015-07-13T12:10:00", "amount": 0.0, "unit": "mg/dL"}, {"date": "2015-07-13T12:15:00", "amount": -0.0212969395833333, "unit": "mg/dL"}, {"date": "2015-07-13T12:20:00", "amount": -0.070784639583333, "unit": "mg/dL"}, {"date": "2015-07-13T12:25:00", "amount": -0.156415912499999, "unit": "mg/dL"}, {"date": "2015-07-13T12:30:00", "amount": -0.285552445833332, "unit": "mg/dL"}, {"date": "2015-07-13T12:35:00", "amount": -1.439312598291702, "unit": "mg/dL"}, {"date": "2015-07-13T12:40:00", "amount": -1.646352036684694, "unit": "mg/dL"}, {"date": "2015-07-13T12:45:00", "amount": -1.9135041214355557, "unit": "mg/dL"}, {"date": "2015-07-13T12:50:00", "amount": -2.244933881729385, "unit": "mg/dL"}, {"date": "2015-07-13T12:55:00", "amount": -2.6460811799493813, "unit": "mg/dL"}, {"date": "2015-07-13T13:00:00", "amount": -3.121352446768033, "unit": "mg/dL"}, {"date": "2015-07-13T13:05:00", "amount": -3.674670564478693, "unit": "mg/dL"}, {"date": "2015-07-13T13:10:00", "amount": -4.307710907658077, "unit": "mg/dL"}, {"date": "2015-07-13T13:15:00", "amount": -5.009601365473694, "unit": "mg/dL"}, {"date": "2015-07-13T13:20:00", "amount": -5.771810136391176, "unit": "mg/dL"}, {"date": "2015-07-13T13:25:00", "amount": -6.58856323870386, "unit": "mg/dL"}, {"date": "2015-07-13T13:30:00", "amount": -7.454146661371742, "unit": "mg/dL"}, {"date": "2015-07-13T13:35:00", "amount": -8.363039697354816, "unit": "mg/dL"}, {"date": "2015-07-13T13:40:00", "amount": -9.309914943613103, "unit": "mg/dL"}, {"date": "2015-07-13T13:45:00", "amount": -10.289638301106587, "unit": "mg/dL"}, {"date": "2015-07-13T13:50:00", "amount": -11.297268974795276, "unit": "mg/dL"}, {"date": "2015-07-13T13:55:00", "amount": -12.328059473639158, "unit": "mg/dL"}, {"date": "2015-07-13T14:00:00", "amount": -13.377455610598233, "unit": "mg/dL"}, {"date": "2015-07-13T14:05:00", "amount": -14.441096502632519, "unit": "mg/dL"}, {"date": "2015-07-13T14:10:00", "amount": -15.514814570702004, "unit": "mg/dL"}, {"date": "2015-07-13T14:15:00", "amount": -16.594635539766685, "unit": "mg/dL"}, {"date": "2015-07-13T14:20:00", "amount": -17.676778438786563, "unit": "mg/dL"}, {"date": "2015-07-13T14:25:00", "amount": -18.757655600721648, "unit": "mg/dL"}, {"date": "2015-07-13T14:30:00", "amount": -19.833872662531927, "unit": "mg/dL"}, {"date": "2015-07-13T14:35:00", "amount": -20.90222856517741, "unit": "mg/dL"}, {"date": "2015-07-13T14:40:00", "amount": -21.95971555361809, "unit": "mg/dL"}, {"date": "2015-07-13T14:45:00", "amount": -23.003519176813974, "unit": "mg/dL"}, {"date": "2015-07-13T14:50:00", "amount": -24.03101828772506, "unit": "mg/dL"}, {"date": "2015-07-13T14:55:00", "amount": -25.039785043311344, "unit": "mg/dL"}, {"date": "2015-07-13T15:00:00", "amount": -26.027584904532823, "unit": "mg/dL"}, {"date": "2015-07-13T15:05:00", "amount": -26.99237663634951, "unit": "mg/dL"}, {"date": "2015-07-13T15:10:00", "amount": -27.93231230772139, "unit": "mg/dL"}, {"date": "2015-07-13T15:15:00", "amount": -28.845737291608465, "unit": "mg/dL"}, {"date": "2015-07-13T15:20:00", "amount": -29.731190264970753, "unit": "mg/dL"}, {"date": "2015-07-13T15:25:00", "amount": -30.587403208768237, "unit": "mg/dL"}, {"date": "2015-07-13T15:30:00", "amount": -31.41330140796092, "unit": "mg/dL"}, {"date": "2015-07-13T15:35:00", "amount": -32.2080034515088, "unit": "mg/dL"}, {"date": "2015-07-13T15:40:00", "amount": -32.97082123237188, "unit": "mg/dL"}, {"date": "2015-07-13T15:45:00", "amount": -33.70125994751017, "unit": "mg/dL"}, {"date": "2015-07-13T15:50:00", "amount": -34.39901809788364, "unit": "mg/dL"}, {"date": "2015-07-13T15:55:00", "amount": -35.06398748845233, "unit": "mg/dL"}, {"date": "2015-07-13T16:00:00", "amount": -35.69625322817621, "unit": "mg/dL"}, {"date": "2015-07-13T16:05:00", "amount": -36.29609373001529, "unit": "mg/dL"}, {"date": "2015-07-13T16:10:00", "amount": -36.86583922826291, "unit": "mg/dL"}, {"date": "2015-07-13T16:15:00", "amount": -37.408830876376534, "unit": "mg/dL"}, {"date": "2015-07-13T16:20:00", "amount": -37.89110380286491, "unit": "mg/dL"}, {"date": "2015-07-13T16:25:00", "amount": -38.31555703053625, "unit": "mg/dL"}, {"date": "2015-07-13T16:30:00", "amount": -38.68508788661321, "unit": "mg/dL"}, {"date": "2015-07-13T16:35:00", "amount": -39.00257545273462, "unit": "mg/dL"}, {"date": "2015-07-13T16:40:00", "amount": -39.27829808429049, "unit": "mg/dL"}, {"date": "2015-07-13T16:45:00", "amount": -39.49976700542361, "unit": "mg/dL"}, {"date": "2015-07-13T16:50:00", "amount": -39.677555985574045, "unit": "mg/dL"}, {"date": "2015-07-13T16:55:00", "amount": -39.81430562072619, "unit": "mg/dL"}, {"date": "2015-07-13T17:00:00", "amount": -39.91255551127546, "unit": "mg/dL"}, {"date": "2015-07-13T17:05:00", "amount": -39.97472771203005, "unit": "mg/dL"}, {"date": "2015-07-13T17:10:00", "amount": -40.0, "unit": "mg/dL"}] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/effect_from_bolus_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-07-13T12:00:00", "amount": 0.0, "unit": "mg/dL"}, {"date": "2015-07-13T12:05:00", "amount": 0.0, "unit": "mg/dL"}, {"date": "2015-07-13T12:10:00", "amount": 0.0, "unit": "mg/dL"}, {"date": "2015-07-13T12:15:00", "amount": -0.25809001811542664, "unit": "mg/dL"}, {"date": "2015-07-13T12:20:00", "amount": -0.7194464555747171, "unit": "mg/dL"}, {"date": "2015-07-13T12:25:00", "amount": -1.3272762139540095, "unit": "mg/dL"}, {"date": "2015-07-13T12:30:00", "amount": -2.0708476872532966, "unit": "mg/dL"}, {"date": "2015-07-13T12:35:00", "amount": -2.9397271694725857, "unit": "mg/dL"}, {"date": "2015-07-13T12:40:00", "amount": -3.9237788546118724, "unit": "mg/dL"}, {"date": "2015-07-13T12:45:00", "amount": -5.0131648366711605, "unit": "mg/dL"}, {"date": "2015-07-13T12:50:00", "amount": -6.198345109650454, "unit": "mg/dL"}, {"date": "2015-07-13T12:55:00", "amount": -7.47007756754974, "unit": "mg/dL"}, {"date": "2015-07-13T13:00:00", "amount": -8.819418004369034, "unit": "mg/dL"}, {"date": "2015-07-13T13:05:00", "amount": -10.237720114108315, "unit": "mg/dL"}, {"date": "2015-07-13T13:10:00", "amount": -11.716635490767612, "unit": "mg/dL"}, {"date": "2015-07-13T13:15:00", "amount": -13.248113628346898, "unit": "mg/dL"}, {"date": "2015-07-13T13:20:00", "amount": -14.824401920846185, "unit": "mg/dL"}, {"date": "2015-07-13T13:25:00", "amount": -16.43804566226547, "unit": "mg/dL"}, {"date": "2015-07-13T13:30:00", "amount": -18.08188804660476, "unit": "mg/dL"}, {"date": "2015-07-13T13:35:00", "amount": -19.749070167864055, "unit": "mg/dL"}, {"date": "2015-07-13T13:40:00", "amount": -21.433031020043337, "unit": "mg/dL"}, {"date": "2015-07-13T13:45:00", "amount": -23.127507497142634, "unit": "mg/dL"}, {"date": "2015-07-13T13:50:00", "amount": -24.826534393161918, "unit": "mg/dL"}, {"date": "2015-07-13T13:55:00", "amount": -26.52444440210121, "unit": "mg/dL"}, {"date": "2015-07-13T14:00:00", "amount": -28.215868117960493, "unit": "mg/dL"}, {"date": "2015-07-13T14:05:00", "amount": -29.89573403473978, "unit": "mg/dL"}, {"date": "2015-07-13T14:10:00", "amount": -31.559268546439075, "unit": "mg/dL"}, {"date": "2015-07-13T14:15:00", "amount": -33.201995947058364, "unit": "mg/dL"}, {"date": "2015-07-13T14:20:00", "amount": -34.819738430597646, "unit": "mg/dL"}, {"date": "2015-07-13T14:25:00", "amount": -36.408616091056935, "unit": "mg/dL"}, {"date": "2015-07-13T14:30:00", "amount": -37.96504692243623, "unit": "mg/dL"}, {"date": "2015-07-13T14:35:00", "amount": -39.48574681873551, "unit": "mg/dL"}, {"date": "2015-07-13T14:40:00", "amount": -40.967729573954806, "unit": "mg/dL"}, {"date": "2015-07-13T14:45:00", "amount": -42.408306882094095, "unit": "mg/dL"}, {"date": "2015-07-13T14:50:00", "amount": -43.805088337153364, "unit": "mg/dL"}, {"date": "2015-07-13T14:55:00", "amount": -45.15598143313266, "unit": "mg/dL"}, {"date": "2015-07-13T15:00:00", "amount": -46.459191564031954, "unit": "mg/dL"}, {"date": "2015-07-13T15:05:00", "amount": -47.71322202385125, "unit": "mg/dL"}, {"date": "2015-07-13T15:10:00", "amount": -48.91687400659053, "unit": "mg/dL"}, {"date": "2015-07-13T15:15:00", "amount": -50.06924660624982, "unit": "mg/dL"}, {"date": "2015-07-13T15:20:00", "amount": -51.16973681682911, "unit": "mg/dL"}, {"date": "2015-07-13T15:25:00", "amount": -52.218039532328405, "unit": "mg/dL"}, {"date": "2015-07-13T15:30:00", "amount": -53.21414754674769, "unit": "mg/dL"}, {"date": "2015-07-13T15:35:00", "amount": -54.15835155408698, "unit": "mg/dL"}, {"date": "2015-07-13T15:40:00", "amount": -55.05124014834625, "unit": "mg/dL"}, {"date": "2015-07-13T15:45:00", "amount": -55.893699823525544, "unit": "mg/dL"}, {"date": "2015-07-13T15:50:00", "amount": -56.68691497362482, "unit": "mg/dL"}, {"date": "2015-07-13T15:55:00", "amount": -57.43236789264414, "unit": "mg/dL"}, {"date": "2015-07-13T16:00:00", "amount": -58.131838774583414, "unit": "mg/dL"}, {"date": "2015-07-13T16:05:00", "amount": -58.787405713442716, "unit": "mg/dL"}, {"date": "2015-07-13T16:10:00", "amount": -59.40144470322201, "unit": "mg/dL"}, {"date": "2015-07-13T16:15:00", "amount": -60.0, "unit": "mg/dL"}] 2 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/effect_from_bolus_output_exponential.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-07-13T12:00:00", "unit": "mg/dL", "amount": 0}, {"date": "2015-07-13T12:05:00", "unit": "mg/dL", "amount": 0.0}, {"date": "2015-07-13T12:10:00", "unit": "mg/dL", "amount": 0.0}, {"date": "2015-07-13T12:15:00", "unit": "mg/dL", "amount": -0.03358203815813976}, {"date": "2015-07-13T12:20:00", "unit": "mg/dL", "amount": -0.30906641125849843}, {"date": "2015-07-13T12:25:00", "unit": "mg/dL", "amount": -0.833847552959297}, {"date": "2015-07-13T12:30:00", "unit": "mg/dL", "amount": -1.576153688315154}, {"date": "2015-07-13T12:35:00", "unit": "mg/dL", "amount": -2.50703318144335}, {"date": "2015-07-13T12:40:00", "unit": "mg/dL", "amount": -3.60014053836333}, {"date": "2015-07-13T12:45:00", "unit": "mg/dL", "amount": -4.831537243142794}, {"date": "2015-07-13T12:50:00", "unit": "mg/dL", "amount": -6.179506458770194}, {"date": "2015-07-13T12:55:00", "unit": "mg/dL", "amount": -7.624380684780818}, {"date": "2015-07-13T13:00:00", "unit": "mg/dL", "amount": -9.148381520596887}, {"date": "2015-07-13T13:05:00", "unit": "mg/dL", "amount": -10.73547073702134}, {"date": "2015-07-13T13:10:00", "unit": "mg/dL", "amount": -12.371211908552288}, {"date": "2015-07-13T13:15:00", "unit": "mg/dL", "amount": -14.04264190635355}, {"date": "2015-07-13T13:20:00", "unit": "mg/dL", "amount": -15.738151596009132}, {"date": "2015-07-13T13:25:00", "unit": "mg/dL", "amount": -17.44737512577476}, {"date": "2015-07-13T13:30:00", "unit": "mg/dL", "amount": -19.161087230080387}, {"date": "2015-07-13T13:35:00", "unit": "mg/dL", "amount": -20.87110800968425}, {"date": "2015-07-13T13:40:00", "unit": "mg/dL", "amount": -22.570214684274998}, {"date": "2015-07-13T13:45:00", "unit": "mg/dL", "amount": -24.252059845598563}, {"date": "2015-07-13T13:50:00", "unit": "mg/dL", "amount": -25.91109576947541}, {"date": "2015-07-13T13:55:00", "unit": "mg/dL", "amount": -27.54250437349347}, {"date": "2015-07-13T14:00:00", "unit": "mg/dL", "amount": -29.14213243382236}, {"date": "2015-07-13T14:05:00", "unit": "mg/dL", "amount": -30.706431699602387}, {"date": "2015-07-13T14:10:00", "unit": "mg/dL", "amount": -32.2324035668159}, {"date": "2015-07-13T14:15:00", "unit": "mg/dL", "amount": -33.71754799554312}, {"date": "2015-07-13T14:20:00", "unit": "mg/dL", "amount": -35.159816375127406}, {"date": "2015-07-13T14:25:00", "unit": "mg/dL", "amount": -36.5575680611081}, {"date": "2015-07-13T14:30:00", "unit": "mg/dL", "amount": -37.90953032590286}, {"date": "2015-07-13T14:35:00", "unit": "mg/dL", "amount": -39.21476148220575}, {"date": "2015-07-13T14:40:00", "unit": "mg/dL", "amount": -40.472616953985515}, {"date": "2015-07-13T14:45:00", "unit": "mg/dL", "amount": -41.682718084880996}, {"date": "2015-07-13T14:50:00", "unit": "mg/dL", "amount": -42.84492348776248}, {"date": "2015-07-13T14:55:00", "unit": "mg/dL", "amount": -43.959302752314166}, {"date": "2015-07-13T15:00:00", "unit": "mg/dL", "amount": -45.026112339748536}, {"date": "2015-07-13T15:05:00", "unit": "mg/dL", "amount": -46.04577350523923}, {"date": "2015-07-13T15:10:00", "unit": "mg/dL", "amount": -47.01885209940312}, {"date": "2015-07-13T15:15:00", "unit": "mg/dL", "amount": -47.94604011021888}, {"date": "2015-07-13T15:20:00", "unit": "mg/dL", "amount": -48.82813881618142}, {"date": "2015-07-13T15:25:00", "unit": "mg/dL", "amount": -49.666043430298885}, {"date": "2015-07-13T15:30:00", "unit": "mg/dL", "amount": -50.46072912277806}, {"date": "2015-07-13T15:35:00", "unit": "mg/dL", "amount": -51.21323831795147}, {"date": "2015-07-13T15:40:00", "unit": "mg/dL", "amount": -51.924669168206954}, {"date": "2015-07-13T15:45:00", "unit": "mg/dL", "amount": -52.59616511441956}, {"date": "2015-07-13T15:50:00", "unit": "mg/dL", "amount": -53.22890544868629}, {"date": "2015-07-13T15:55:00", "unit": "mg/dL", "amount": -53.82409680105188}, {"date": "2015-07-13T16:00:00", "unit": "mg/dL", "amount": -54.382965477416526}, {"date": "2015-07-13T16:05:00", "unit": "mg/dL", "amount": -54.90675058095669}, {"date": "2015-07-13T16:10:00", "unit": "mg/dL", "amount": -55.39669785419167}, {"date": "2015-07-13T16:15:00", "unit": "mg/dL", "amount": -55.854054183312066}, {"date": "2015-07-13T16:20:00", "unit": "mg/dL", "amount": -56.280062710572146}, {"date": "2015-07-13T16:25:00", "unit": "mg/dL", "amount": -56.675958504455416}, {"date": "2015-07-13T16:30:00", "unit": "mg/dL", "amount": -57.04296474096819}, {"date": "2015-07-13T16:35:00", "unit": "mg/dL", "amount": -57.38228935281747}, {"date": "2015-07-13T16:40:00", "unit": "mg/dL", "amount": -57.69512210640151}, {"date": "2015-07-13T16:45:00", "unit": "mg/dL", "amount": -57.982632069499346}, {"date": "2015-07-13T16:50:00", "unit": "mg/dL", "amount": -58.24596543530279}, {"date": "2015-07-13T16:55:00", "unit": "mg/dL", "amount": -58.48624367100376}, {"date": "2015-07-13T17:00:00", "unit": "mg/dL", "amount": -58.704561961543426}, {"date": "2015-07-13T17:05:00", "unit": "mg/dL", "amount": -58.90198792135912}, {"date": "2015-07-13T17:10:00", "unit": "mg/dL", "amount": -59.079560549040565}, {"date": "2015-07-13T17:15:00", "unit": "mg/dL", "amount": -59.238289401738825}, {"date": "2015-07-13T17:20:00", "unit": "mg/dL", "amount": -59.3791539679688}, {"date": "2015-07-13T17:25:00", "unit": "mg/dL", "amount": -59.50310321911812}, {"date": "2015-07-13T17:30:00", "unit": "mg/dL", "amount": -59.61105532152972}, {"date": "2015-07-13T17:35:00", "unit": "mg/dL", "amount": -59.70389749246986}, {"date": "2015-07-13T17:40:00", "unit": "mg/dL", "amount": -59.78248598463642}, {"date": "2015-07-13T17:45:00", "unit": "mg/dL", "amount": -59.847646185107976}, {"date": "2015-07-13T17:50:00", "unit": "mg/dL", "amount": -59.90017281579249}, {"date": "2015-07-13T17:55:00", "unit": "mg/dL", "amount": -59.94083022350739}, {"date": "2015-07-13T18:00:00", "unit": "mg/dL", "amount": -59.970352748819785}, {"date": "2015-07-13T18:05:00", "unit": "mg/dL", "amount": -59.98944516369822}, {"date": "2015-07-13T18:10:00", "unit": "mg/dL", "amount": -59.99878316888391}, {"date": "2015-07-13T18:15:00", "unit": "mg/dL", "amount": -60.0}] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/effect_from_short_basal_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-07-13T12:00:00", "amount": 0.0, "unit": "mg/dL"}, {"date": "2015-07-13T12:05:00", "amount": 0.0, "unit": "mg/dL"}, {"date": "2015-07-13T12:10:00", "amount": 0.0, "unit": "mg/dL"}, {"date": "2015-07-13T12:15:00", "amount": -0.25809001811542664, "unit": "mg/dL"}, {"date": "2015-07-13T12:20:00", "amount": -0.7194464555747171, "unit": "mg/dL"}, {"date": "2015-07-13T12:25:00", "amount": -1.3272762139540095, "unit": "mg/dL"}, {"date": "2015-07-13T12:30:00", "amount": -2.0708476872532966, "unit": "mg/dL"}, {"date": "2015-07-13T12:35:00", "amount": -2.9397271694725857, "unit": "mg/dL"}, {"date": "2015-07-13T12:40:00", "amount": -3.9237788546118724, "unit": "mg/dL"}, {"date": "2015-07-13T12:45:00", "amount": -5.0131648366711605, "unit": "mg/dL"}, {"date": "2015-07-13T12:50:00", "amount": -6.198345109650454, "unit": "mg/dL"}, {"date": "2015-07-13T12:55:00", "amount": -7.47007756754974, "unit": "mg/dL"}, {"date": "2015-07-13T13:00:00", "amount": -8.819418004369034, "unit": "mg/dL"}, {"date": "2015-07-13T13:05:00", "amount": -10.237720114108315, "unit": "mg/dL"}, {"date": "2015-07-13T13:10:00", "amount": -11.716635490767612, "unit": "mg/dL"}, {"date": "2015-07-13T13:15:00", "amount": -13.248113628346898, "unit": "mg/dL"}, {"date": "2015-07-13T13:20:00", "amount": -14.824401920846185, "unit": "mg/dL"}, {"date": "2015-07-13T13:25:00", "amount": -16.43804566226547, "unit": "mg/dL"}, {"date": "2015-07-13T13:30:00", "amount": -18.08188804660476, "unit": "mg/dL"}, {"date": "2015-07-13T13:35:00", "amount": -19.749070167864055, "unit": "mg/dL"}, {"date": "2015-07-13T13:40:00", "amount": -21.433031020043337, "unit": "mg/dL"}, {"date": "2015-07-13T13:45:00", "amount": -23.127507497142634, "unit": "mg/dL"}, {"date": "2015-07-13T13:50:00", "amount": -24.826534393161918, "unit": "mg/dL"}, {"date": "2015-07-13T13:55:00", "amount": -26.52444440210121, "unit": "mg/dL"}, {"date": "2015-07-13T14:00:00", "amount": -28.215868117960493, "unit": "mg/dL"}, {"date": "2015-07-13T14:05:00", "amount": -29.89573403473978, "unit": "mg/dL"}, {"date": "2015-07-13T14:10:00", "amount": -31.559268546439075, "unit": "mg/dL"}, {"date": "2015-07-13T14:15:00", "amount": -33.201995947058364, "unit": "mg/dL"}, {"date": "2015-07-13T14:20:00", "amount": -34.819738430597646, "unit": "mg/dL"}, {"date": "2015-07-13T14:25:00", "amount": -36.408616091056935, "unit": "mg/dL"}, {"date": "2015-07-13T14:30:00", "amount": -37.96504692243623, "unit": "mg/dL"}, {"date": "2015-07-13T14:35:00", "amount": -39.48574681873551, "unit": "mg/dL"}, {"date": "2015-07-13T14:40:00", "amount": -40.967729573954806, "unit": "mg/dL"}, {"date": "2015-07-13T14:45:00", "amount": -42.408306882094095, "unit": "mg/dL"}, {"date": "2015-07-13T14:50:00", "amount": -43.805088337153364, "unit": "mg/dL"}, {"date": "2015-07-13T14:55:00", "amount": -45.15598143313266, "unit": "mg/dL"}, {"date": "2015-07-13T15:00:00", "amount": -46.459191564031954, "unit": "mg/dL"}, {"date": "2015-07-13T15:05:00", "amount": -47.71322202385125, "unit": "mg/dL"}, {"date": "2015-07-13T15:10:00", "amount": -48.91687400659053, "unit": "mg/dL"}, {"date": "2015-07-13T15:15:00", "amount": -50.06924660624982, "unit": "mg/dL"}, {"date": "2015-07-13T15:20:00", "amount": -51.16973681682911, "unit": "mg/dL"}, {"date": "2015-07-13T15:25:00", "amount": -52.218039532328405, "unit": "mg/dL"}, {"date": "2015-07-13T15:30:00", "amount": -53.21414754674769, "unit": "mg/dL"}, {"date": "2015-07-13T15:35:00", "amount": -54.15835155408698, "unit": "mg/dL"}, {"date": "2015-07-13T15:40:00", "amount": -55.05124014834625, "unit": "mg/dL"}, {"date": "2015-07-13T15:45:00", "amount": -55.893699823525544, "unit": "mg/dL"}, {"date": "2015-07-13T15:50:00", "amount": -56.68691497362482, "unit": "mg/dL"}, {"date": "2015-07-13T15:55:00", "amount": -57.43236789264414, "unit": "mg/dL"}, {"date": "2015-07-13T16:00:00", "amount": -58.131838774583414, "unit": "mg/dL"}, {"date": "2015-07-13T16:05:00", "amount": -58.787405713442716, "unit": "mg/dL"}, {"date": "2015-07-13T16:10:00", "amount": -59.40144470322201, "unit": "mg/dL"}, {"date": "2015-07-13T16:15:00", "amount": -60.0, "unit": "mg/dL"}, {"date": "2015-07-13T16:20:00", "amount": -60.0, "unit": "mg/dL"}] 2 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/iob_from_bolus_120min_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date" : "2015-07-13T12:00:00", 4 | "value" : 0 5 | }, 6 | { 7 | "date" : "2015-07-13T12:05:00", 8 | "value" : 1.5 9 | }, 10 | { 11 | "date" : "2015-07-13T12:10:00", 12 | "value" : 1.5 13 | }, 14 | { 15 | "date" : "2015-07-13T12:15:00", 16 | "value" : 1.500947838937214 17 | }, 18 | { 19 | "date" : "2015-07-13T12:20:00", 20 | "value" : 1.484963834098891 21 | }, 22 | { 23 | "date" : "2015-07-13T12:25:00", 24 | "value" : 1.446460021180044 25 | }, 26 | { 27 | "date" : "2015-07-13T12:30:00", 28 | "value" : 1.389856198466611 29 | }, 30 | { 31 | "date" : "2015-07-13T12:35:00", 32 | "value" : 1.31920732252578 33 | }, 34 | { 35 | "date" : "2015-07-13T12:40:00", 36 | "value" : 1.238203508205988 37 | }, 38 | { 39 | "date" : "2015-07-13T12:45:00", 40 | "value" : 1.150170028636922 41 | }, 42 | { 43 | "date" : "2015-07-13T12:50:00", 44 | "value" : 1.058067315229521 45 | }, 46 | { 47 | "date" : "2015-07-13T12:55:00", 48 | "value" : 0.964490957675971 49 | }, 50 | { 51 | "date" : "2015-07-13T13:00:00", 52 | "value" : 0.8716717039497102 53 | }, 54 | { 55 | "date" : "2015-07-13T13:05:00", 56 | "value" : 0.7814754603054258 57 | }, 58 | { 59 | "date" : "2015-07-13T13:10:00", 60 | "value" : 0.6954032912790558 61 | }, 62 | { 63 | "date" : "2015-07-13T13:15:00", 64 | "value" : 0.6145914196877871 65 | }, 66 | { 67 | "date" : "2015-07-13T13:20:00", 68 | "value" : 0.5398112266300577 69 | }, 70 | { 71 | "date" : "2015-07-13T13:25:00", 72 | "value" : 0.4714692514855546 73 | }, 74 | { 75 | "date" : "2015-07-13T13:30:00", 76 | "value" : 0.4096071919152159 77 | }, 78 | { 79 | "date" : "2015-07-13T13:35:00", 80 | "value" : 0.3539019038612285 81 | }, 82 | { 83 | "date" : "2015-07-13T13:40:00", 84 | "value" : 0.3036654015470306 85 | }, 86 | { 87 | "date" : "2015-07-13T13:45:00", 88 | "value" : 0.2578448574773081 89 | }, 90 | { 91 | "date" : "2015-07-13T13:50:00", 92 | "value" : 0.2150226024380012 93 | }, 94 | { 95 | "date" : "2015-07-13T13:55:00", 96 | "value" : 0.1734161254962953 97 | }, 98 | { 99 | "date" : "2015-07-13T14:00:00", 100 | "value" : 0.130878074000628 101 | }, 102 | { 103 | "date" : "2015-07-13T14:05:00", 104 | "value" : 0.08489625358068836 105 | }, 106 | { 107 | "date" : "2015-07-13T14:10:00", 108 | "value" : 0.03259362814740968 109 | }, 110 | { 111 | "date" : "2015-07-13T14:15:00", 112 | "value" : 0 113 | } 114 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/iob_from_bolus_180min_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date" : "2015-07-13T12:00:00", 4 | "value" : 0 5 | }, 6 | { 7 | "date" : "2015-07-13T12:05:00", 8 | "value" : 1.5 9 | }, 10 | { 11 | "date" : "2015-07-13T12:10:00", 12 | "value" : 1.5 13 | }, 14 | { 15 | "date" : "2015-07-13T12:15:00", 16 | "value" : 1.501102261857068 17 | }, 18 | { 19 | "date" : "2015-07-13T12:20:00", 20 | "value" : 1.495934680094406 21 | }, 22 | { 23 | "date" : "2015-07-13T12:25:00", 24 | "value" : 1.479739352013368 25 | }, 26 | { 27 | "date" : "2015-07-13T12:30:00", 28 | "value" : 1.453897074188956 29 | }, 30 | { 31 | "date" : "2015-07-13T12:35:00", 32 | "value" : 1.419716575696168 33 | }, 34 | { 35 | "date" : "2015-07-13T12:40:00", 36 | "value" : 1.378434518110006 37 | }, 38 | { 39 | "date" : "2015-07-13T12:45:00", 40 | "value" : 1.331215495505468 41 | }, 42 | { 43 | "date" : "2015-07-13T12:50:00", 44 | "value" : 1.279152034457555 45 | }, 46 | { 47 | "date" : "2015-07-13T12:55:00", 48 | "value" : 1.223264594041267 49 | }, 50 | { 51 | "date" : "2015-07-13T13:00:00", 52 | "value" : 1.164501565831605 53 | }, 54 | { 55 | "date" : "2015-07-13T13:05:00", 56 | "value" : 1.103739273903567 57 | }, 58 | { 59 | "date" : "2015-07-13T13:10:00", 60 | "value" : 1.041781974832154 61 | }, 62 | { 63 | "date" : "2015-07-13T13:15:00", 64 | "value" : 0.9793618576923671 65 | }, 66 | { 67 | "date" : "2015-07-13T13:20:00", 68 | "value" : 0.917139044059204 69 | }, 70 | { 71 | "date" : "2015-07-13T13:25:00", 72 | "value" : 0.8557015880076666 73 | }, 74 | { 75 | "date" : "2015-07-13T13:30:00", 76 | "value" : 0.795565476112754 77 | }, 78 | { 79 | "date" : "2015-07-13T13:35:00", 80 | "value" : 0.7371746274494664 81 | }, 82 | { 83 | "date" : "2015-07-13T13:40:00", 84 | "value" : 0.680900893592804 85 | }, 86 | { 87 | "date" : "2015-07-13T13:45:00", 88 | "value" : 0.627044058617766 89 | }, 90 | { 91 | "date" : "2015-07-13T13:50:00", 92 | "value" : 0.5758318390993532 93 | }, 94 | { 95 | "date" : "2015-07-13T13:55:00", 96 | "value" : 0.5274198841125657 97 | }, 98 | { 99 | "date" : "2015-07-13T14:00:00", 100 | "value" : 0.4818917752324039 101 | }, 102 | { 103 | "date" : "2015-07-13T14:05:00", 104 | "value" : 0.4392590265338656 105 | }, 106 | { 107 | "date" : "2015-07-13T14:10:00", 108 | "value" : 0.3994610845919526 109 | }, 110 | { 111 | "date" : "2015-07-13T14:15:00", 112 | "value" : 0.362365328481666 113 | }, 114 | { 115 | "date" : "2015-07-13T14:20:00", 116 | "value" : 0.327767069778003 117 | }, 118 | { 119 | "date" : "2015-07-13T14:25:00", 120 | "value" : 0.2953895525559652 121 | }, 122 | { 123 | "date" : "2015-07-13T14:30:00", 124 | "value" : 0.2648839533905529 125 | }, 126 | { 127 | "date" : "2015-07-13T14:35:00", 128 | "value" : 0.2358293813567644 129 | }, 130 | { 131 | "date" : "2015-07-13T14:40:00", 132 | "value" : 0.2077328780296031 133 | }, 134 | { 135 | "date" : "2015-07-13T14:45:00", 136 | "value" : 0.180029417484065 137 | }, 138 | { 139 | "date" : "2015-07-13T14:50:00", 140 | "value" : 0.1520819062951513 141 | }, 142 | { 143 | "date" : "2015-07-13T14:55:00", 144 | "value" : 0.1231811835378662 145 | }, 146 | { 147 | "date" : "2015-07-13T15:00:00", 148 | "value" : 0.0925460207872027 149 | }, 150 | { 151 | "date" : "2015-07-13T15:05:00", 152 | "value" : 0.05932312211816376 153 | }, 154 | { 155 | "date" : "2015-07-13T15:10:00", 156 | "value" : 0.02258712410575253 157 | }, 158 | { 159 | "date" : "2015-07-13T15:15:00", 160 | "value" : 0 161 | } 162 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/iob_from_bolus_240min_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date" : "2015-07-13T12:00:00", 4 | "value" : 0 5 | }, 6 | { 7 | "date" : "2015-07-13T12:05:00", 8 | "value" : 1.5 9 | }, 10 | { 11 | "date" : "2015-07-13T12:10:00", 12 | "value" : 1.5 13 | }, 14 | { 15 | "date" : "2015-07-13T12:15:00", 16 | "value" : 1.495537401691061 17 | }, 18 | { 19 | "date" : "2015-07-13T12:20:00", 20 | "value" : 1.48483297535133 21 | }, 22 | { 23 | "date" : "2015-07-13T12:25:00", 24 | "value" : 1.470407604834223 25 | }, 26 | { 27 | "date" : "2015-07-13T12:30:00", 28 | "value" : 1.452531193914742 29 | }, 30 | { 31 | "date" : "2015-07-13T12:35:00", 32 | "value" : 1.431466198867885 33 | }, 34 | { 35 | "date" : "2015-07-13T12:40:00", 36 | "value" : 1.407467628468654 37 | }, 38 | { 39 | "date" : "2015-07-13T12:45:00", 40 | "value" : 1.380783043992047 41 | }, 42 | { 43 | "date" : "2015-07-13T12:50:00", 44 | "value" : 1.351652559213066 45 | }, 46 | { 47 | "date" : "2015-07-13T12:55:00", 48 | "value" : 1.320308840406709 49 | }, 50 | { 51 | "date" : "2015-07-13T13:00:00", 52 | "value" : 1.286977106347978 53 | }, 54 | { 55 | "date" : "2015-07-13T13:05:00", 56 | "value" : 1.251875128311871 57 | }, 58 | { 59 | "date" : "2015-07-13T13:10:00", 60 | "value" : 1.21521323007339 61 | }, 62 | { 63 | "date" : "2015-07-13T13:15:00", 64 | "value" : 1.177194287907533 65 | }, 66 | { 67 | "date" : "2015-07-13T13:20:00", 68 | "value" : 1.138013730589301 69 | }, 70 | { 71 | "date" : "2015-07-13T13:25:00", 72 | "value" : 1.097859539393695 73 | }, 74 | { 75 | "date" : "2015-07-13T13:30:00", 76 | "value" : 1.056912248095713 77 | }, 78 | { 79 | "date" : "2015-07-13T13:35:00", 80 | "value" : 1.015344942970357 81 | }, 82 | { 83 | "date" : "2015-07-13T13:40:00", 84 | "value" : 0.9733232627926256 85 | }, 86 | { 87 | "date" : "2015-07-13T13:45:00", 88 | "value" : 0.9310053988375189 89 | }, 90 | { 91 | "date" : "2015-07-13T13:50:00", 92 | "value" : 0.8885420948800374 93 | }, 94 | { 95 | "date" : "2015-07-13T13:55:00", 96 | "value" : 0.8460766471951808 97 | }, 98 | { 99 | "date" : "2015-07-13T14:00:00", 100 | "value" : 0.8037449045579494 101 | }, 102 | { 103 | "date" : "2015-07-13T14:05:00", 104 | "value" : 0.7616752682433428 105 | }, 106 | { 107 | "date" : "2015-07-13T14:10:00", 108 | "value" : 0.7199886920263612 109 | }, 110 | { 111 | "date" : "2015-07-13T14:15:00", 112 | "value" : 0.6787986821820048 113 | }, 114 | { 115 | "date" : "2015-07-13T14:20:00", 116 | "value" : 0.6382112974852733 117 | }, 118 | { 119 | "date" : "2015-07-13T14:25:00", 120 | "value" : 0.5983251492111668 121 | }, 122 | { 123 | "date" : "2015-07-13T14:30:00", 124 | "value" : 0.5592314011346853 125 | }, 126 | { 127 | "date" : "2015-07-13T14:35:00", 128 | "value" : 0.5210137695308286 129 | }, 130 | { 131 | "date" : "2015-07-13T14:40:00", 132 | "value" : 0.483748523174597 133 | }, 134 | { 135 | "date" : "2015-07-13T14:45:00", 136 | "value" : 0.4475044833409908 137 | }, 138 | { 139 | "date" : "2015-07-13T14:50:00", 140 | "value" : 0.412343023805009 141 | }, 142 | { 143 | "date" : "2015-07-13T14:55:00", 144 | "value" : 0.378318070841653 145 | }, 146 | { 147 | "date" : "2015-07-13T15:00:00", 148 | "value" : 0.3454761032259215 149 | }, 150 | { 151 | "date" : "2015-07-13T15:05:00", 152 | "value" : 0.3138561522328148 153 | }, 154 | { 155 | "date" : "2015-07-13T15:10:00", 156 | "value" : 0.2834898016373331 157 | }, 158 | { 159 | "date" : "2015-07-13T15:15:00", 160 | "value" : 0.2544011877144767 161 | }, 162 | { 163 | "date" : "2015-07-13T15:20:00", 164 | "value" : 0.2266069992392455 165 | }, 166 | { 167 | "date" : "2015-07-13T15:25:00", 168 | "value" : 0.2001164774866391 169 | }, 170 | { 171 | "date" : "2015-07-13T15:30:00", 172 | "value" : 0.174931416231657 173 | }, 174 | { 175 | "date" : "2015-07-13T15:35:00", 176 | "value" : 0.1510461617493006 177 | }, 178 | { 179 | "date" : "2015-07-13T15:40:00", 180 | "value" : 0.128447612814569 181 | }, 182 | { 183 | "date" : "2015-07-13T15:45:00", 184 | "value" : 0.1071152207024623 185 | }, 186 | { 187 | "date" : "2015-07-13T15:50:00", 188 | "value" : 0.08702098918798074 189 | }, 190 | { 191 | "date" : "2015-07-13T15:55:00", 192 | "value" : 0.06812947454612395 193 | }, 194 | { 195 | "date" : "2015-07-13T16:00:00", 196 | "value" : 0.05039778555189273 197 | }, 198 | { 199 | "date" : "2015-07-13T16:05:00", 200 | "value" : 0.0337755834802867 201 | }, 202 | { 203 | "date" : "2015-07-13T16:10:00", 204 | "value" : 0.01820508210630561 205 | }, 206 | { 207 | "date" : "2015-07-13T16:15:00", 208 | "value" : 0 209 | } 210 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/iob_from_bolus_300min_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date" : "2015-07-13T12:00:00", 4 | "value" : 0 5 | }, 6 | { 7 | "date" : "2015-07-13T12:05:00", 8 | "value" : 1.5 9 | }, 10 | { 11 | "date" : "2015-07-13T12:10:00", 12 | "value" : 1.5 13 | }, 14 | { 15 | "date" : "2015-07-13T12:15:00", 16 | "value" : 1.49063698881988 17 | }, 18 | { 19 | "date" : "2015-07-13T12:20:00", 20 | "value" : 1.490073169155184 21 | }, 22 | { 23 | "date" : "2015-07-13T12:25:00", 24 | "value" : 1.485724469683612 25 | }, 26 | { 27 | "date" : "2015-07-13T12:30:00", 28 | "value" : 1.477838770280166 29 | }, 30 | { 31 | "date" : "2015-07-13T12:35:00", 32 | "value" : 1.466657313319844 33 | }, 34 | { 35 | "date" : "2015-07-13T12:40:00", 36 | "value" : 1.452414703677648 37 | }, 38 | { 39 | "date" : "2015-07-13T12:45:00", 40 | "value" : 1.435338908728576 41 | }, 42 | { 43 | "date" : "2015-07-13T12:50:00", 44 | "value" : 1.41565125834763 45 | }, 46 | { 47 | "date" : "2015-07-13T12:55:00", 48 | "value" : 1.393566444909808 49 | }, 50 | { 51 | "date" : "2015-07-13T13:00:00", 52 | "value" : 1.369292523290112 53 | }, 54 | { 55 | "date" : "2015-07-13T13:05:00", 56 | "value" : 1.34303091086354 57 | }, 58 | { 59 | "date" : "2015-07-13T13:10:00", 60 | "value" : 1.314976387505094 61 | }, 62 | { 63 | "date" : "2015-07-13T13:15:00", 64 | "value" : 1.285317095589772 65 | }, 66 | { 67 | "date" : "2015-07-13T13:20:00", 68 | "value" : 1.254234539992575 69 | }, 70 | { 71 | "date" : "2015-07-13T13:25:00", 72 | "value" : 1.221903588088504 73 | }, 74 | { 75 | "date" : "2015-07-13T13:30:00", 76 | "value" : 1.188492469752558 77 | }, 78 | { 79 | "date" : "2015-07-13T13:35:00", 80 | "value" : 1.154162777359736 81 | }, 82 | { 83 | "date" : "2015-07-13T13:40:00", 84 | "value" : 1.11906946578504 85 | }, 86 | { 87 | "date" : "2015-07-13T13:45:00", 88 | "value" : 1.083360852403468 89 | }, 90 | { 91 | "date" : "2015-07-13T13:50:00", 92 | "value" : 1.047178617090021 93 | }, 94 | { 95 | "date" : "2015-07-13T13:55:00", 96 | "value" : 1.0106578022197 97 | }, 98 | { 99 | "date" : "2015-07-13T14:00:00", 100 | "value" : 0.9739268126675034 101 | }, 102 | { 103 | "date" : "2015-07-13T14:05:00", 104 | "value" : 0.9371074158084317 105 | }, 106 | { 107 | "date" : "2015-07-13T14:10:00", 108 | "value" : 0.9003147415174855 109 | }, 110 | { 111 | "date" : "2015-07-13T14:15:00", 112 | "value" : 0.8636572821696638 113 | }, 114 | { 115 | "date" : "2015-07-13T14:20:00", 116 | "value" : 0.8272368926399674 117 | }, 118 | { 119 | "date" : "2015-07-13T14:25:00", 120 | "value" : 0.7911487903033959 121 | }, 122 | { 123 | "date" : "2015-07-13T14:30:00", 124 | "value" : 0.7554815550349494 125 | }, 126 | { 127 | "date" : "2015-07-13T14:35:00", 128 | "value" : 0.7203171292096276 129 | }, 130 | { 131 | "date" : "2015-07-13T14:40:00", 132 | "value" : 0.6857308177024313 133 | }, 134 | { 135 | "date" : "2015-07-13T14:45:00", 136 | "value" : 0.6517912878883598 137 | }, 138 | { 139 | "date" : "2015-07-13T14:50:00", 140 | "value" : 0.6185605696424131 141 | }, 142 | { 143 | "date" : "2015-07-13T14:55:00", 144 | "value" : 0.5860940553395918 145 | }, 146 | { 147 | "date" : "2015-07-13T15:00:00", 148 | "value" : 0.5544404998548951 149 | }, 150 | { 151 | "date" : "2015-07-13T15:05:00", 152 | "value" : 0.5236420205633237 153 | }, 154 | { 155 | "date" : "2015-07-13T15:10:00", 156 | "value" : 0.4937340973398772 157 | }, 158 | { 159 | "date" : "2015-07-13T15:15:00", 160 | "value" : 0.4647455725595555 161 | }, 162 | { 163 | "date" : "2015-07-13T15:20:00", 164 | "value" : 0.4366986510973594 165 | }, 166 | { 167 | "date" : "2015-07-13T15:25:00", 168 | "value" : 0.4096089003282874 169 | }, 170 | { 171 | "date" : "2015-07-13T15:30:00", 172 | "value" : 0.3834852501273406 173 | }, 174 | { 175 | "date" : "2015-07-13T15:35:00", 176 | "value" : 0.3583299928695195 177 | }, 178 | { 179 | "date" : "2015-07-13T15:40:00", 180 | "value" : 0.3341387834298227 181 | }, 182 | { 183 | "date" : "2015-07-13T15:45:00", 184 | "value" : 0.3109006391832512 185 | }, 186 | { 187 | "date" : "2015-07-13T15:50:00", 188 | "value" : 0.2885979400048053 189 | }, 190 | { 191 | "date" : "2015-07-13T15:55:00", 192 | "value" : 0.2672064282694833 193 | }, 194 | { 195 | "date" : "2015-07-13T16:00:00", 196 | "value" : 0.2466952088522872 197 | }, 198 | { 199 | "date" : "2015-07-13T16:05:00", 200 | "value" : 0.2270267491282156 201 | }, 202 | { 203 | "date" : "2015-07-13T16:10:00", 204 | "value" : 0.208156878972269 205 | }, 206 | { 207 | "date" : "2015-07-13T16:15:00", 208 | "value" : 0.1900347907594464 209 | }, 210 | { 211 | "date" : "2015-07-13T16:20:00", 212 | "value" : 0.1726030393647512 213 | }, 214 | { 215 | "date" : "2015-07-13T16:25:00", 216 | "value" : 0.1557975421631793 217 | }, 218 | { 219 | "date" : "2015-07-13T16:30:00", 220 | "value" : 0.1395475790297329 221 | }, 222 | { 223 | "date" : "2015-07-13T16:35:00", 224 | "value" : 0.1237757923394113 225 | }, 226 | { 227 | "date" : "2015-07-13T16:40:00", 228 | "value" : 0.1083981869672155 229 | }, 230 | { 231 | "date" : "2015-07-13T16:45:00", 232 | "value" : 0.09332413028814285 233 | }, 234 | { 235 | "date" : "2015-07-13T16:50:00", 236 | "value" : 0.07845635217719643 237 | }, 238 | { 239 | "date" : "2015-07-13T16:55:00", 240 | "value" : 0.0636909450093765 241 | }, 242 | { 243 | "date" : "2015-07-13T17:00:00", 244 | "value" : 0.04891736365967769 245 | }, 246 | { 247 | "date" : "2015-07-13T17:05:00", 248 | "value" : 0.03401842550310802 249 | }, 250 | { 251 | "date" : "2015-07-13T17:10:00", 252 | "value" : 0.01887031041466186 253 | }, 254 | { 255 | "date" : "2015-07-13T17:15:00", 256 | "value" : 0 257 | } 258 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/normalize_edge_case_doses_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "TempBasal", 4 | "start_at": "2015-07-12T23:59:59", 5 | "end_at": "2015-07-13T07:54:00", 6 | "amount": 2.0, 7 | "unit": "U/hour" 8 | }, 9 | { 10 | "type": "Bolus", 11 | "start_at": "2015-07-13T11:00:00", 12 | "end_at": "2015-07-13T11:00:00", 13 | "amount": 3.0, 14 | "unit": "U" 15 | } 16 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/normalize_edge_case_doses_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "TempBasal", 4 | "start_at": "2015-07-12T23:59:59", 5 | "end_at": "2015-07-13T00:00:00", 6 | "amount": 1.1, 7 | "unit": "U/hour" 8 | }, 9 | { 10 | "type": "TempBasal", 11 | "start_at": "2015-07-13T00:00:00", 12 | "end_at": "2015-07-13T04:00:00", 13 | "amount": 1.1, 14 | "unit": "U/hour" 15 | }, 16 | { 17 | "type": "TempBasal", 18 | "start_at": "2015-07-13T04:00:00", 19 | "end_at": "2015-07-13T07:00:00", 20 | "amount": 1.075, 21 | "unit": "U/hour" 22 | }, 23 | { 24 | "type": "TempBasal", 25 | "start_at": "2015-07-13T07:00:00", 26 | "end_at": "2015-07-13T07:54:00", 27 | "amount": 1.15, 28 | "unit": "U/hour" 29 | }, 30 | { 31 | "type": "Bolus", 32 | "start_at": "2015-07-13T11:00:00", 33 | "end_at": "2015-07-13T11:00:00", 34 | "amount": 3.0, 35 | "unit": "U" 36 | } 37 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/normalized_doses.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "amount": 3.225, 4 | "start_at": "2015-10-15T22:00:00", 5 | "description": "TempBasal: 3.125U/hour over 30min", 6 | "type": "TempBasal", 7 | "unit": "U/hour", 8 | "end_at": "2015-10-15T22:29:50", 9 | "scheduled": 1.0 10 | }, 11 | { 12 | "amount": 3.325, 13 | "start_at": "2015-10-15T21:59:50", 14 | "description": "TempBasal: 3.125U/hour over 30min", 15 | "type": "TempBasal", 16 | "unit": "U/hour", 17 | "end_at": "2015-10-15T22:00:00", 18 | "scheduled": 1.0 19 | }, 20 | { 21 | "amount": 1.09999999999999998, 22 | "start_at": "2015-10-15T21:39:49", 23 | "description": "TempBasal: 0.9U/hour over 4min", 24 | "type": "TempBasal", 25 | "unit": "U/hour", 26 | "end_at": "2015-10-15T21:43:49", 27 | "scheduled": 1.0 28 | }, 29 | { 30 | "start_at": "2015-10-15T21:35:12", 31 | "description": "Normal bolus: 4.0U", 32 | "end_at": "2015-10-15T21:35:12", 33 | "amount": 4.0, 34 | "type": "Bolus", 35 | "unit": "U" 36 | }, 37 | { 38 | "amount": 2.075, 39 | "start_at": "2015-10-15T21:04:34", 40 | "description": "TempBasal: 1.875U/hour over 10min", 41 | "type": "TempBasal", 42 | "unit": "U/hour", 43 | "end_at": "2015-10-15T21:14:34", 44 | "scheduled": 1.0 45 | }, 46 | { 47 | "amount": 2.7, 48 | "start_at": "2015-10-15T21:00:04", 49 | "description": "TempBasal: 2.5U/hour over 4min", 50 | "type": "TempBasal", 51 | "unit": "U/hour", 52 | "end_at": "2015-10-15T21:04:04", 53 | "scheduled": 1.0 54 | }, 55 | { 56 | "amount": 0.0, 57 | "start_at": "2015-10-15T20:39:52", 58 | "description": "TempBasal: 0.0U/hour over 20min", 59 | "type": "TempBasal", 60 | "unit": "U/hour", 61 | "end_at": "2015-10-15T20:59:52", 62 | "scheduled": 0.8 63 | }, 64 | { 65 | "amount": 0.05, 66 | "start_at": "2015-10-15T20:34:34", 67 | "description": "TempBasal: 0.05U/hour over 5min", 68 | "type": "TempBasal", 69 | "unit": "U/hour", 70 | "end_at": "2015-10-15T20:39:34", 71 | "scheduled": 0.8 72 | }, 73 | { 74 | "amount": 0.95, 75 | "start_at": "2015-10-15T20:29:51", 76 | "description": "TempBasal: 0.75U/hour over 4min", 77 | "type": "TempBasal", 78 | "unit": "U/hour", 79 | "end_at": "2015-10-15T20:33:51", 80 | "scheduled": 1.0 81 | }, 82 | { 83 | "amount": 1.375, 84 | "start_at": "2015-10-15T20:14:37", 85 | "description": "TempBasal: 1.175U/hour over 5min", 86 | "type": "TempBasal", 87 | "unit": "U/hour", 88 | "end_at": "2015-10-15T20:19:37", 89 | "scheduled": 1.0 90 | }, 91 | { 92 | "amount": 2.075, 93 | "start_at": "2015-10-15T20:09:52", 94 | "description": "TempBasal: 1.875U/hour over 4min", 95 | "type": "TempBasal", 96 | "unit": "U/hour", 97 | "end_at": "2015-10-15T20:13:52", 98 | "scheduled": 1.0 99 | }, 100 | { 101 | "start_at": "2015-10-15T20:05:10", 102 | "description": "Normal bolus: 3.3U", 103 | "end_at": "2015-10-15T20:05:10", 104 | "amount": 3.3, 105 | "type": "Bolus", 106 | "unit": "U" 107 | }, 108 | { 109 | "amount": 3.7, 110 | "start_at": "2015-10-15T19:54:51", 111 | "description": "TempBasal: 3.5U/hour over 15min", 112 | "type": "TempBasal", 113 | "unit": "U/hour", 114 | "end_at": "2015-10-15T20:09:51", 115 | "scheduled": 1.0 116 | }, 117 | { 118 | "start_at": "2015-10-15T19:25:54", 119 | "description": "Normal bolus: 5.0U", 120 | "end_at": "2015-10-15T19:25:54", 121 | "amount": 5.0, 122 | "type": "Bolus", 123 | "unit": "U" 124 | }, 125 | { 126 | "amount": 3.7, 127 | "start_at": "2015-10-15T19:24:52", 128 | "description": "TempBasal: 3.5U/hour over 29min", 129 | "type": "TempBasal", 130 | "unit": "U/hour", 131 | "end_at": "2015-10-15T19:53:52", 132 | "scheduled": 1.0 133 | }, 134 | { 135 | "amount": 0.4, 136 | "start_at": "2015-10-15T19:19:39", 137 | "description": "TempBasal: 0.2U/hour over 5min", 138 | "type": "TempBasal", 139 | "unit": "U/hour", 140 | "end_at": "2015-10-15T19:24:39", 141 | "scheduled": 1.0 142 | }, 143 | { 144 | "amount": 0.2, 145 | "start_at": "2015-10-15T19:00:07", 146 | "description": "TempBasal: 0.0U/hour over 19min", 147 | "type": "TempBasal", 148 | "unit": "U/hour", 149 | "end_at": "2015-10-15T19:19:07", 150 | "scheduled": 1.0 151 | }, 152 | { 153 | "amount": 0.0, 154 | "start_at": "2015-10-15T18:14:54", 155 | "description": "TempBasal: 0.0U/hour over 30min", 156 | "type": "TempBasal", 157 | "unit": "U/hour", 158 | "end_at": "2015-10-15T18:44:54", 159 | "scheduled": 0.8 160 | }, 161 | { 162 | "amount": 0.775, 163 | "start_at": "2015-10-15T18:09:35", 164 | "description": "TempBasal: 0.575U/hour over 5min", 165 | "type": "TempBasal", 166 | "unit": "U/hour", 167 | "end_at": "2015-10-15T18:14:35", 168 | "scheduled": 1.0 169 | } 170 | ] 171 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/reconcile_resume_before_rewind_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "unit": "U/hour", 4 | "type": "BasalProfileStart", 5 | "description": "BasalProfileStartPumpEvent(length: 10, rawData: 10 bytes, timestamp: calendar: gregorian (fixed) year: 2017 month: 9 day: 21 hour: 6 minute: 51 second: 28 isLeapMonth: false , scheduleEntry: MinimedKi", 6 | "start_at": "2017-09-21T06:51:28", 7 | "end_at": "2017-09-22T06:51:28", 8 | "amount": 1.05 9 | }, 10 | { 11 | "unit": "U/hour", 12 | "type": "TempBasal", 13 | "description": "TempBasalDurationPumpEvent(length: 7, rawData: 7 bytes, duration: 30, timestamp: calendar: gregorian (fixed) year: 2017 month: 9 day: 21 hour: 7 minute: 11 second: 29 isLeapMonth: false )", 14 | "start_at": "2017-09-21T07:11:29", 15 | "end_at": "2017-09-21T07:41:29", 16 | "amount": 1.85 17 | }, 18 | { 19 | "unit": "U", 20 | "type": "PumpSuspend", 21 | "description": "SuspendPumpEvent(length: 7, rawData: 7 bytes, timestamp: calendar: gregorian (fixed) year: 2017 month: 9 day: 21 hour: 7 minute: 16 second: 48 isLeapMonth: false )", 22 | "start_at": "2017-09-21T07:16:48", 23 | "end_at": "2017-09-21T07:16:48", 24 | "amount": 0 25 | }, 26 | { 27 | "unit": "U", 28 | "type": "PumpResume", 29 | "description": "ResumePumpEvent(length: 7, rawData: 7 bytes, timestamp: calendar: gregorian (fixed) year: 2017 month: 9 day: 21 hour: 7 minute: 23 second: 34 isLeapMonth: false )", 30 | "start_at": "2017-09-21T07:23:34", 31 | "end_at": "2017-09-21T07:23:34", 32 | "amount": 0 33 | }, 34 | { 35 | "unit": "U", 36 | "type": "PumpSuspend", 37 | "description": "RewindPumpEvent(length: 7, rawData: 7 bytes, timestamp: calendar: gregorian (fixed) year: 2017 month: 9 day: 21 hour: 7 minute: 23 second: 40 isLeapMonth: false )", 38 | "start_at": "2017-09-21T07:23:40", 39 | "end_at": "2017-09-21T07:23:40", 40 | "amount": 0 41 | }, 42 | { 43 | "unit": "U", 44 | "type": "PumpResume", 45 | "description": "PrimePumpEvent(length: 10, rawData: 10 bytes, timestamp: calendar: gregorian (fixed) year: 2017 month: 9 day: 21 hour: 7 minute: 25 second: 16 isLeapMonth: false , amount: 14.199999999999999, primeTyp", 46 | "start_at": "2017-09-21T07:25:16", 47 | "end_at": "2017-09-21T07:25:16", 48 | "amount": 0 49 | }, 50 | { 51 | "unit": "U/hour", 52 | "type": "BasalProfileStart", 53 | "description": "BasalProfileStartPumpEvent(length: 10, rawData: 10 bytes, timestamp: calendar: gregorian (fixed) year: 2017 month: 9 day: 21 hour: 7 minute: 41 second: 29 isLeapMonth: false , scheduleEntry: MinimedKi", 54 | "start_at": "2017-09-21T07:41:29", 55 | "end_at": "2017-09-22T07:41:29", 56 | "amount": 1.05 57 | }, 58 | { 59 | "unit": "U/hour", 60 | "type": "TempBasal", 61 | "description": "TempBasalDurationPumpEvent(length: 7, rawData: 7 bytes, duration: 30, timestamp: calendar: gregorian (fixed) year: 2017 month: 9 day: 21 hour: 7 minute: 42 second: 1 isLeapMonth: false )", 62 | "start_at": "2017-09-21T07:42:01", 63 | "end_at": "2017-09-22T08:12:01", 64 | "amount": 2.025 65 | } 66 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/reconcile_resume_before_rewind_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "start_at" : "2017-09-21T06:51:28", 4 | "end_at" : "2017-09-21T07:11:29", 5 | "type" : "BasalProfileStart", 6 | "amount" : 1.05, 7 | "unit" : "U\/hour" 8 | }, 9 | { 10 | "start_at" : "2017-09-21T07:11:29", 11 | "end_at" : "2017-09-21T07:16:48", 12 | "type" : "TempBasal", 13 | "amount" : 1.85, 14 | "unit" : "U\/hour" 15 | }, 16 | { 17 | "start_at" : "2017-09-21T07:16:48", 18 | "end_at" : "2017-09-21T07:23:34", 19 | "type" : "PumpSuspend", 20 | "amount" : 0, 21 | "unit" : "U" 22 | }, 23 | { 24 | "start_at" : "2017-09-21T07:23:34", 25 | "end_at" : "2017-09-21T07:23:40", 26 | "type" : "TempBasal", 27 | "amount" : 1.85, 28 | "unit" : "U\/hour" 29 | }, 30 | { 31 | "start_at" : "2017-09-21T07:23:40", 32 | "end_at" : "2017-09-21T07:25:16", 33 | "type" : "PumpSuspend", 34 | "amount" : 0, 35 | "unit" : "U" 36 | }, 37 | { 38 | "start_at" : "2017-09-21T07:25:16", 39 | "end_at" : "2017-09-21T07:41:29", 40 | "type" : "TempBasal", 41 | "amount" : 1.85, 42 | "unit" : "U\/hour" 43 | }, 44 | { 45 | "start_at" : "2017-09-21T07:41:29", 46 | "end_at" : "2017-09-21T07:42:01", 47 | "type" : "BasalProfileStart", 48 | "amount" : 1.05, 49 | "unit" : "U\/hour" 50 | }, 51 | { 52 | "start_at" : "2017-09-21T07:42:01", 53 | "end_at" : "2017-09-22T08:12:01", 54 | "type" : "TempBasal", 55 | "amount" : 2.025, 56 | "unit" : "U\/hour" 57 | } 58 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/reservoir_history_with_continuity_holes.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2016-01-30T15:40:49", 4 | "amount": 0.2, 5 | "unit": "U" 6 | }, 7 | { 8 | "date": "2016-01-30T15:45:42", 9 | "amount": 0.0, 10 | "unit": "U" 11 | }, 12 | { 13 | "date": "2016-01-30T15:50:42", 14 | "amount": 0.0, 15 | "unit": "U" 16 | }, 17 | { 18 | "date": "2016-01-30T15:55:41", 19 | "amount": 294.0, 20 | "unit": "U" 21 | }, 22 | { 23 | "date": "2016-01-30T16:00:42", 24 | "amount": 145.75, 25 | "unit": "U" 26 | }, 27 | { 28 | "date": "2016-01-30T16:05:42", 29 | "amount": 145.75, 30 | "unit": "U" 31 | }, 32 | { 33 | "date": "2016-01-30T16:10:42", 34 | "amount": 145.7, 35 | "unit": "U" 36 | }, 37 | { 38 | "date": "2016-01-30T16:15:42", 39 | "amount": 145.625, 40 | "unit": "U" 41 | }, 42 | { 43 | "date": "2016-01-30T16:20:41", 44 | "amount": 145.55, 45 | "unit": "U" 46 | }, 47 | { 48 | "date": "2016-01-30T16:25:42", 49 | "amount": 145.5, 50 | "unit": "U" 51 | }, 52 | { 53 | "date": "2016-01-30T16:30:42", 54 | "amount": 145.35, 55 | "unit": "U" 56 | }, 57 | { 58 | "date": "2016-01-30T16:35:43", 59 | "amount": 145.2, 60 | "unit": "U" 61 | }, 62 | { 63 | "date": "2016-01-30T16:40:42", 64 | "amount": 144.95, 65 | "unit": "U" 66 | }, 67 | { 68 | "date": "2016-01-30T16:45:42", 69 | "amount": 144.75, 70 | "unit": "U" 71 | }, 72 | { 73 | "date": "2016-01-30T16:50:42", 74 | "amount": 144.55, 75 | "unit": "U" 76 | }, 77 | { 78 | "date": "2016-01-30T17:00:45", 79 | "amount": 144.05, 80 | "unit": "U" 81 | }, 82 | { 83 | "date": "2016-01-30T17:05:42", 84 | "amount": 140.175, 85 | "unit": "U" 86 | }, 87 | { 88 | "date": "2016-01-30T17:10:41", 89 | "amount": 140.125, 90 | "unit": "U" 91 | }, 92 | { 93 | "date": "2016-01-30T17:15:42", 94 | "amount": 140.05, 95 | "unit": "U" 96 | }, 97 | { 98 | "date": "2016-01-30T17:20:44", 99 | "amount": 139.975, 100 | "unit": "U" 101 | }, 102 | { 103 | "date": "2016-01-30T17:25:43", 104 | "amount": 139.925, 105 | "unit": "U" 106 | }, 107 | { 108 | "date": "2016-01-30T17:30:41", 109 | "amount": 139.775, 110 | "unit": "U" 111 | }, 112 | { 113 | "date": "2016-01-30T17:35:42", 114 | "amount": 139.625, 115 | "unit": "U" 116 | }, 117 | { 118 | "date": "2016-01-30T17:40:42", 119 | "amount": 139.525, 120 | "unit": "U" 121 | }, 122 | { 123 | "date": "2016-01-30T18:15:44", 124 | "amount": 137.775, 125 | "unit": "U" 126 | }, 127 | { 128 | "date": "2016-01-30T18:20:42", 129 | "amount": 137.775, 130 | "unit": "U" 131 | }, 132 | { 133 | "date": "2016-01-30T18:25:43", 134 | "amount": 137.725, 135 | "unit": "U" 136 | }, 137 | { 138 | "date": "2016-01-30T18:30:42", 139 | "amount": 137.65, 140 | "unit": "U" 141 | }, 142 | { 143 | "date": "2016-01-30T19:00:42", 144 | "amount": 137.425, 145 | "unit": "U" 146 | }, 147 | { 148 | "date": "2016-01-30T19:10:41", 149 | "amount": 137.3, 150 | "unit": "U" 151 | }, 152 | { 153 | "date": "2016-01-30T19:35:42", 154 | "amount": 136.4, 155 | "unit": "U" 156 | }, 157 | { 158 | "date": "2016-01-30T20:00:41", 159 | "amount": 135.075, 160 | "unit": "U" 161 | }, 162 | { 163 | "date": "2016-01-30T20:25:42", 164 | "amount": 133.125, 165 | "unit": "U" 166 | }, 167 | { 168 | "date": "2016-01-30T20:30:43", 169 | "amount": 133.05, 170 | "unit": "U" 171 | }, 172 | { 173 | "date": "2016-01-30T20:35:41", 174 | "amount": 132.975, 175 | "unit": "U" 176 | } 177 | ] 178 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/reservoir_history_with_rewind_and_prime_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2016-01-30T15:40:49", 4 | "amount": 0.4, 5 | "unit": "U" 6 | }, 7 | { 8 | "date": "2016-01-30T15:45:42", 9 | "amount": 0.2, 10 | "unit": "U" 11 | }, 12 | { 13 | "date": "2016-01-30T15:50:42", 14 | "amount": 0.2, 15 | "unit": "U" 16 | }, 17 | { 18 | "date": "2016-01-30T15:55:41", 19 | "amount": 294.0, 20 | "unit": "U" 21 | }, 22 | { 23 | "date": "2016-01-30T16:00:42", 24 | "amount": 145.75, 25 | "unit": "U" 26 | }, 27 | { 28 | "date": "2016-01-30T16:05:42", 29 | "amount": 145.75, 30 | "unit": "U" 31 | }, 32 | { 33 | "date": "2016-01-30T16:10:42", 34 | "amount": 145.7, 35 | "unit": "U" 36 | }, 37 | { 38 | "date": "2016-01-30T16:15:42", 39 | "amount": 145.625, 40 | "unit": "U" 41 | }, 42 | { 43 | "date": "2016-01-30T16:20:41", 44 | "amount": 145.55, 45 | "unit": "U" 46 | }, 47 | { 48 | "date": "2016-01-30T16:25:42", 49 | "amount": 145.5, 50 | "unit": "U" 51 | }, 52 | { 53 | "date": "2016-01-30T16:30:42", 54 | "amount": 145.35, 55 | "unit": "U" 56 | }, 57 | { 58 | "date": "2016-01-30T16:35:43", 59 | "amount": 145.2, 60 | "unit": "U" 61 | }, 62 | { 63 | "date": "2016-01-30T16:40:42", 64 | "amount": 144.95, 65 | "unit": "U" 66 | }, 67 | { 68 | "date": "2016-01-30T16:45:42", 69 | "amount": 144.75, 70 | "unit": "U" 71 | }, 72 | { 73 | "date": "2016-01-30T16:50:42", 74 | "amount": 144.55, 75 | "unit": "U" 76 | }, 77 | { 78 | "date": "2016-01-30T17:00:45", 79 | "amount": 144.05, 80 | "unit": "U" 81 | }, 82 | { 83 | "date": "2016-01-30T17:05:42", 84 | "amount": 140.175, 85 | "unit": "U" 86 | }, 87 | { 88 | "date": "2016-01-30T17:10:41", 89 | "amount": 140.125, 90 | "unit": "U" 91 | }, 92 | { 93 | "date": "2016-01-30T17:15:42", 94 | "amount": 140.05, 95 | "unit": "U" 96 | }, 97 | { 98 | "date": "2016-01-30T17:20:44", 99 | "amount": 139.975, 100 | "unit": "U" 101 | }, 102 | { 103 | "date": "2016-01-30T17:25:43", 104 | "amount": 139.925, 105 | "unit": "U" 106 | }, 107 | { 108 | "date": "2016-01-30T17:30:41", 109 | "amount": 139.775, 110 | "unit": "U" 111 | }, 112 | { 113 | "date": "2016-01-30T17:35:42", 114 | "amount": 139.625, 115 | "unit": "U" 116 | }, 117 | { 118 | "date": "2016-01-30T17:40:42", 119 | "amount": 139.525, 120 | "unit": "U" 121 | }, 122 | { 123 | "date": "2016-01-30T17:45:44", 124 | "amount": 139.375, 125 | "unit": "U" 126 | }, 127 | { 128 | "date": "2016-01-30T17:50:44", 129 | "amount": 139.3, 130 | "unit": "U" 131 | }, 132 | { 133 | "date": "2016-01-30T17:55:42", 134 | "amount": 139.25, 135 | "unit": "U" 136 | }, 137 | { 138 | "date": "2016-01-30T18:00:42", 139 | "amount": 139.175, 140 | "unit": "U" 141 | }, 142 | { 143 | "date": "2016-01-30T18:05:42", 144 | "amount": 137.8, 145 | "unit": "U" 146 | }, 147 | { 148 | "date": "2016-01-30T18:10:42", 149 | "amount": 137.775, 150 | "unit": "U" 151 | }, 152 | { 153 | "date": "2016-01-30T18:15:44", 154 | "amount": 137.775, 155 | "unit": "U" 156 | }, 157 | { 158 | "date": "2016-01-30T18:20:42", 159 | "amount": 137.8, 160 | "unit": "U" 161 | }, 162 | { 163 | "date": "2016-01-30T18:25:43", 164 | "amount": 137.725, 165 | "unit": "U" 166 | }, 167 | { 168 | "date": "2016-01-30T18:30:42", 169 | "amount": 137.65, 170 | "unit": "U" 171 | }, 172 | { 173 | "date": "2016-01-30T18:35:41", 174 | "amount": 137.575, 175 | "unit": "U" 176 | }, 177 | { 178 | "date": "2016-01-30T18:40:43", 179 | "amount": 137.525, 180 | "unit": "U" 181 | }, 182 | { 183 | "date": "2016-01-30T18:45:41", 184 | "amount": 137.5, 185 | "unit": "U" 186 | }, 187 | { 188 | "date": "2016-01-30T18:50:41", 189 | "amount": 137.5, 190 | "unit": "U" 191 | }, 192 | { 193 | "date": "2016-01-30T18:55:41", 194 | "amount": 137.5, 195 | "unit": "U" 196 | }, 197 | { 198 | "date": "2016-01-30T19:00:42", 199 | "amount": 137.425, 200 | "unit": "U" 201 | }, 202 | { 203 | "date": "2016-01-30T19:05:42", 204 | "amount": 137.35, 205 | "unit": "U" 206 | }, 207 | { 208 | "date": "2016-01-30T19:10:41", 209 | "amount": 137.3, 210 | "unit": "U" 211 | }, 212 | { 213 | "date": "2016-01-30T19:15:42", 214 | "amount": 137.225, 215 | "unit": "U" 216 | }, 217 | { 218 | "date": "2016-01-30T19:20:42", 219 | "amount": 137.15, 220 | "unit": "U" 221 | }, 222 | { 223 | "date": "2016-01-30T19:25:42", 224 | "amount": 137.1, 225 | "unit": "U" 226 | }, 227 | { 228 | "date": "2016-01-30T19:35:42", 229 | "amount": 136.4, 230 | "unit": "U" 231 | }, 232 | { 233 | "date": "2016-01-30T19:40:41", 234 | "amount": 135.6, 235 | "unit": "U" 236 | }, 237 | { 238 | "date": "2016-01-30T19:45:41", 239 | "amount": 135.525, 240 | "unit": "U" 241 | }, 242 | { 243 | "date": "2016-01-30T19:50:41", 244 | "amount": 135.425, 245 | "unit": "U" 246 | }, 247 | { 248 | "date": "2016-01-30T19:55:41", 249 | "amount": 135.225, 250 | "unit": "U" 251 | }, 252 | { 253 | "date": "2016-01-30T20:00:41", 254 | "amount": 135.075, 255 | "unit": "U" 256 | }, 257 | { 258 | "date": "2016-01-30T20:05:42", 259 | "amount": 134.825, 260 | "unit": "U" 261 | }, 262 | { 263 | "date": "2016-01-30T20:10:42", 264 | "amount": 134.625, 265 | "unit": "U" 266 | }, 267 | { 268 | "date": "2016-01-30T20:15:41", 269 | "amount": 134.375, 270 | "unit": "U" 271 | }, 272 | { 273 | "date": "2016-01-30T20:20:42", 274 | "amount": 133.175, 275 | "unit": "U" 276 | }, 277 | { 278 | "date": "2016-01-30T20:25:42", 279 | "amount": 133.125, 280 | "unit": "U" 281 | }, 282 | { 283 | "date": "2016-01-30T20:30:43", 284 | "amount": 133.05, 285 | "unit": "U" 286 | }, 287 | { 288 | "date": "2016-01-30T20:35:41", 289 | "amount": 132.975, 290 | "unit": "U" 291 | } 292 | ] 293 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/short_basal_dose.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "TempBasal", 4 | "start_at": "2015-07-13T12:01:32", 5 | "end_at": "2015-07-13T12:06:32", 6 | "amount": 18.0, 7 | "unit": "U/hour", 8 | "scheduled": 0.0 9 | } 10 | ] 11 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/suspend_dose.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "PumpSuspend", 4 | "start_at": "2015-07-13T12:00:00", 5 | "end_at": "2015-07-13T12:00:00", 6 | "amount": 0.0, 7 | "unit": "U" 8 | } 9 | ] 10 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/suspend_dose_reconciled.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "PumpSuspend", 4 | "start_at": "2015-07-13T12:00:00", 5 | "end_at": "2015-07-13T12:00:00", 6 | "amount": 0.0, 7 | "unit": "U" 8 | } 9 | ] 10 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/suspend_dose_reconciled_normalized.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "TempBasal", 4 | "start_at": "2015-07-13T12:00:00", 5 | "end_at": "2015-07-13T12:00:00", 6 | "amount": -0.75, 7 | "unit": "U/hour" 8 | } 9 | ] 10 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/InsulinKit/suspend_dose_reconciled_normalized_iob.json: -------------------------------------------------------------------------------- 1 | [{"unit":"U","date":"2015-07-13T12:00:00","value":0},{"unit":"U","date":"2015-07-13T12:05:00","value":0},{"unit":"U","date":"2015-07-13T12:10:00","value":0},{"unit":"U","date":"2015-07-13T12:15:00","value":0},{"unit":"U","date":"2015-07-13T12:20:00","value":0},{"unit":"U","date":"2015-07-13T12:25:00","value":0},{"unit":"U","date":"2015-07-13T12:30:00","value":0},{"unit":"U","date":"2015-07-13T12:35:00","value":0},{"unit":"U","date":"2015-07-13T12:40:00","value":0},{"unit":"U","date":"2015-07-13T12:45:00","value":0},{"unit":"U","date":"2015-07-13T12:50:00","value":0},{"unit":"U","date":"2015-07-13T12:55:00","value":0},{"unit":"U","date":"2015-07-13T13:00:00","value":0},{"unit":"U","date":"2015-07-13T13:05:00","value":0},{"unit":"U","date":"2015-07-13T13:10:00","value":0},{"unit":"U","date":"2015-07-13T13:15:00","value":0},{"unit":"U","date":"2015-07-13T13:20:00","value":0},{"unit":"U","date":"2015-07-13T13:25:00","value":0},{"unit":"U","date":"2015-07-13T13:30:00","value":0},{"unit":"U","date":"2015-07-13T13:35:00","value":0},{"unit":"U","date":"2015-07-13T13:40:00","value":0},{"unit":"U","date":"2015-07-13T13:45:00","value":0},{"unit":"U","date":"2015-07-13T13:50:00","value":0},{"unit":"U","date":"2015-07-13T13:55:00","value":0},{"unit":"U","date":"2015-07-13T14:00:00","value":0},{"unit":"U","date":"2015-07-13T14:05:00","value":0},{"unit":"U","date":"2015-07-13T14:10:00","value":0},{"unit":"U","date":"2015-07-13T14:15:00","value":0},{"unit":"U","date":"2015-07-13T14:20:00","value":0},{"unit":"U","date":"2015-07-13T14:25:00","value":0},{"unit":"U","date":"2015-07-13T14:30:00","value":0},{"unit":"U","date":"2015-07-13T14:35:00","value":0},{"unit":"U","date":"2015-07-13T14:40:00","value":0},{"unit":"U","date":"2015-07-13T14:45:00","value":0},{"unit":"U","date":"2015-07-13T14:50:00","value":0},{"unit":"U","date":"2015-07-13T14:55:00","value":0},{"unit":"U","date":"2015-07-13T15:00:00","value":0},{"unit":"U","date":"2015-07-13T15:05:00","value":0},{"unit":"U","date":"2015-07-13T15:10:00","value":0},{"unit":"U","date":"2015-07-13T15:15:00","value":0},{"unit":"U","date":"2015-07-13T15:20:00","value":0},{"unit":"U","date":"2015-07-13T15:25:00","value":0},{"unit":"U","date":"2015-07-13T15:30:00","value":0},{"unit":"U","date":"2015-07-13T15:35:00","value":0},{"unit":"U","date":"2015-07-13T15:40:00","value":0},{"unit":"U","date":"2015-07-13T15:45:00","value":0},{"unit":"U","date":"2015-07-13T15:50:00","value":0},{"unit":"U","date":"2015-07-13T15:55:00","value":0},{"unit":"U","date":"2015-07-13T16:00:00","value":0},{"unit":"U","date":"2015-07-13T16:05:00","value":0},{"unit":"U","date":"2015-07-13T16:10:00","value":0}] 2 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/combined_sums_with_gaps_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"endDate": "2018-08-16 01:13:44 +0000", "startDate": "2018-08-16 01:13:44 +0000", "value": -7.914677985345208}, 3 | {"startDate": "2018-08-16 01:13:44 +0000", "value": -13.84284360394594, "endDate": "2018-08-16 01:18:44 +0000"}, 4 | {"value": -12.613217502012784, "endDate": "2018-08-16 01:23:44 +0000", "startDate": "2018-08-16 01:13:44 +0000"}, 5 | {"value": -11.206618583133514, "endDate": "2018-08-16 01:28:43 +0000", "startDate": "2018-08-16 01:13:44 +0000"}, 6 | {"startDate": "2018-08-16 02:03:43 +0000", "endDate": "2018-08-16 02:03:43 +0000", "value": 6.071196836763691}, 7 | {"startDate": "2018-08-16 03:13:44 +0000", "endDate": "2018-08-16 03:13:44 +0000", "value": 1.735876471025445}, 8 | {"startDate": "2018-08-16 03:13:44 +0000", "endDate": "2018-08-16 03:18:44 +0000", "value": 2.2702059848264096}, 9 | {"endDate": "2018-08-16 03:23:43 +0000", "startDate": "2018-08-16 03:13:44 +0000", "value": 3.754918289224931}, 10 | {"value": 5.444256153348801, "startDate": "2018-08-16 03:13:44 +0000", "endDate": "2018-08-16 03:28:44 +0000"}, 11 | {"value": 11.486797488154545, "startDate": "2018-08-16 03:13:44 +0000", "endDate": "2018-08-16 03:33:43 +0000"}, 12 | {"endDate": "2018-08-16 03:38:43 +0000", "startDate": "2018-08-16 03:13:44 +0000", "value": 1.7953524267912058}, 13 | {"endDate": "2018-08-16 03:43:44 +0000", "value": 2.376773676557343, "startDate": "2018-08-16 03:13:44 +0000"}, 14 | {"endDate": "2018-08-16 03:48:43 +0000", "value": -6.551474763321222, "startDate": "2018-08-16 03:18:44 +0000"}, 15 | {"endDate": "2018-08-16 03:53:44 +0000", "value": -11.56463836036644, "startDate": "2018-08-16 03:28:44 +0000"}, 16 | {"endDate": "2018-08-16 03:58:43 +0000", "value": -23.524929675277797, "startDate": "2018-08-16 03:28:44 +0000"}, 17 | {"startDate": "2018-08-16 03:33:43 +0000", "endDate": "2018-08-16 04:03:43 +0000", "value": -26.46553805353557}, 18 | {"startDate": "2018-08-16 03:38:43 +0000", "endDate": "2018-08-16 04:08:43 +0000", "value": -32.50957095033954}, 19 | {"value": -22.823727411197925, "endDate": "2018-08-16 04:13:44 +0000", "startDate": "2018-08-16 03:43:44 +0000"}, 20 | {"endDate": "2018-08-16 04:18:43 +0000", "value": -23.399872617600906, "startDate": "2018-08-16 03:48:43 +0000"}, 21 | {"endDate": "2018-08-16 04:23:44 +0000", "value": -16.21261395015381, "startDate": "2018-08-16 03:53:44 +0000"}, 22 | {"value": -1.2556785583940788, "endDate": "2018-08-16 04:28:44 +0000", "startDate": "2018-08-16 04:03:43 +0000"}, 23 | {"startDate": "2018-08-16 04:03:43 +0000", "value": -3.0507010894534323, "endDate": "2018-08-16 04:33:43 +0000"} 24 | ] 25 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_glucose_input.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "trend_arrow": "FLAT", 3 | "system_time": "2015-10-16T16:51:46", 4 | "display_time": "2015-10-16T09:51:08", 5 | "glucose": 147 6 | }] 7 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_blend_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "trend_arrow": "FLAT", 4 | "system_time": "2015-10-30T17:16:36", 5 | "display_time": "2015-10-30T09:17:27", 6 | "glucose": 111 7 | }, 8 | { 9 | "trend_arrow": "FLAT", 10 | "system_time": "2015-10-30T17:11:36", 11 | "display_time": "2015-10-30T09:12:27", 12 | "glucose": 111 13 | }, 14 | { 15 | "trend_arrow": "FLAT", 16 | "system_time": "2015-10-30T17:06:36", 17 | "display_time": "2015-10-30T09:07:28", 18 | "glucose": 113 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_blend_insulin_effect_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-30T09:15:00", 4 | "amount": -96.64432176805616, 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "date": "2015-10-30T09:20:00", 9 | "amount": -96.91899878577772, 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "date": "2015-10-30T09:25:00", 14 | "amount": -97.14706680030386, 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "date": "2015-10-30T09:30:00", 19 | "amount": -97.30954106615258, 20 | "unit": "mg/dL" 21 | }, 22 | { 23 | "date": "2015-10-30T09:35:00", 24 | "amount": -97.40780654695538, 25 | "unit": "mg/dL" 26 | }, 27 | { 28 | "date": "2015-10-30T09:40:00", 29 | "amount": -97.44702440741187, 30 | "unit": "mg/dL" 31 | }, 32 | { 33 | "date": "2015-10-30T09:45:00", 34 | "amount": -97.428432128785, 35 | "unit": "mg/dL" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_blend_momentum_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"amount": -0.00, "date": "2015-10-30T09:15:00", "unit": "mg/dL"}, 3 | {"amount": -0.51, "date": "2015-10-30T09:20:00", "unit": "mg/dL"}, 4 | {"amount": -1.51, "date": "2015-10-30T09:25:00", "unit": "mg/dL"}, 5 | {"amount": -2.51, "date": "2015-10-30T09:30:00", "unit": "mg/dL"}, 6 | {"amount": -3.51, "date": "2015-10-30T09:35:00", "unit": "mg/dL"} 7 | ] 8 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_blend_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-10-30T09:17:27", "amount": 111.0, "unit": "mg/dL"}, {"date": "2015-10-30T09:20:00", "amount": 110.49, "unit": "mg/dL"}, {"date": "2015-10-30T09:25:00", "amount": 109.62122843753055, "unit": "mg/dL"}, {"date": "2015-10-30T09:30:00", "amount": 109.04278305705336, "unit": "mg/dL"}, {"date": "2015-10-30T09:35:00", "amount": 108.79723427144835, "unit": "mg/dL"}, {"date": "2015-10-30T09:40:00", "amount": 108.75801641099186, "unit": "mg/dL"}, {"date": "2015-10-30T09:45:00", "amount": 108.77660868961873, "unit": "mg/dL"}] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_down_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-16T09:50:00", 4 | "amount": -11.0, 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "date": "2015-10-16T09:55:00", 9 | "amount": -14.0, 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "date": "2015-10-16T10:00:00", 14 | "amount": -17.0, 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "date": "2015-10-16T10:05:00", 19 | "amount": -20.0, 20 | "unit": "mg/dL" 21 | }, 22 | { 23 | "date": "2015-10-16T10:10:00", 24 | "amount": -23.0, 25 | "unit": "mg/dL" 26 | }, 27 | { 28 | "date": "2015-10-16T10:15:00", 29 | "amount": -26.0, 30 | "unit": "mg/dL" 31 | }, 32 | { 33 | "date": "2015-10-16T10:20:00", 34 | "amount": -29.0, 35 | "unit": "mg/dL" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_down_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-10-16T09:51:08", "amount": 147.0, "unit": "mg/dL"}, {"date": "2015-10-16T09:55:00", "amount": 144.0, "unit": "mg/dL"}, {"date": "2015-10-16T10:00:00", "amount": 141.48288815336815, "unit": "mg/dL"}, {"date": "2015-10-16T10:05:00", "amount": 139.52941258933004, "unit": "mg/dL"}, {"date": "2015-10-16T10:10:00", "amount": 138.06988445366972, "unit": "mg/dL"}, {"date": "2015-10-16T10:15:00", "amount": 137.51056554586722, "unit": "mg/dL"}, {"date": "2015-10-16T10:20:00", "amount": 137.68859084523504, "unit": "mg/dL"}, {"date": "2015-10-16T10:25:00", "amount": 138.1133041621285, "unit": "mg/dL"}, {"date": "2015-10-16T10:30:00", "amount": 138.65064036101472, "unit": "mg/dL"}, {"date": "2015-10-16T10:35:00", "amount": 139.32919561319252, "unit": "mg/dL"}, {"date": "2015-10-16T10:40:00", "amount": 140.18295161697267, "unit": "mg/dL"}, {"date": "2015-10-16T10:45:00", "amount": 141.23940234368996, "unit": "mg/dL"}, {"date": "2015-10-16T10:50:00", "amount": 142.5253861270015, "unit": "mg/dL"}, {"date": "2015-10-16T10:55:00", "amount": 144.06699974437902, "unit": "mg/dL"}, {"date": "2015-10-16T11:00:00", "amount": 145.88728462544324, "unit": "mg/dL"}, {"date": "2015-10-16T11:05:00", "amount": 148.01133464815607, "unit": "mg/dL"}, {"date": "2015-10-16T11:10:00", "amount": 150.45302965360258, "unit": "mg/dL"}, {"date": "2015-10-16T11:15:00", "amount": 153.23420781458637, "unit": "mg/dL"}, {"date": "2015-10-16T11:20:00", "amount": 156.3805872827024, "unit": "mg/dL"}, {"date": "2015-10-16T11:25:00", "amount": 159.7346459582777, "unit": "mg/dL"}, {"date": "2015-10-16T11:30:00", "amount": 162.62633895934403, "unit": "mg/dL"}, {"date": "2015-10-16T11:35:00", "amount": 165.00641219768852, "unit": "mg/dL"}, {"date": "2015-10-16T11:40:00", "amount": 166.903184917778, "unit": "mg/dL"}, {"date": "2015-10-16T11:45:00", "amount": 168.33402305421913, "unit": "mg/dL"}, {"date": "2015-10-16T11:50:00", "amount": 169.31545369383554, "unit": "mg/dL"}, {"date": "2015-10-16T11:55:00", "amount": 169.8631650756672, "unit": "mg/dL"}, {"date": "2015-10-16T12:00:00", "amount": 169.9926587060791, "unit": "mg/dL"}, {"date": "2015-10-16T12:05:00", "amount": 169.7227533944518, "unit": "mg/dL"}, {"date": "2015-10-16T12:10:00", "amount": 169.03538206370123, "unit": "mg/dL"}, {"date": "2015-10-16T12:15:00", "amount": 167.94444690310482, "unit": "mg/dL"}, {"date": "2015-10-16T12:20:00", "amount": 166.4628454103736, "unit": "mg/dL"}, {"date": "2015-10-16T12:25:00", "amount": 164.5995610631349, "unit": "mg/dL"}, {"date": "2015-10-16T12:30:00", "amount": 162.3780441943358, "unit": "mg/dL"}, {"date": "2015-10-16T12:35:00", "amount": 159.7947730438392, "unit": "mg/dL"}, {"date": "2015-10-16T12:40:00", "amount": 156.8660756046061, "unit": "mg/dL"}, {"date": "2015-10-16T12:45:00", "amount": 153.59524348911737, "unit": "mg/dL"}, {"date": "2015-10-16T12:50:00", "amount": 149.98890670479062, "unit": "mg/dL"}, {"date": "2015-10-16T12:55:00", "amount": 146.14179727544717, "unit": "mg/dL"}, {"date": "2015-10-16T13:00:00", "amount": 142.4037996456909, "unit": "mg/dL"}, {"date": "2015-10-16T13:05:00", "amount": 138.81267323892257, "unit": "mg/dL"}, {"date": "2015-10-16T13:10:00", "amount": 135.36472401959404, "unit": "mg/dL"}, {"date": "2015-10-16T13:15:00", "amount": 132.08348262344984, "unit": "mg/dL"}, {"date": "2015-10-16T13:20:00", "amount": 128.97681130846786, "unit": "mg/dL"}, {"date": "2015-10-16T13:25:00", "amount": 126.0383802891227, "unit": "mg/dL"}, {"date": "2015-10-16T13:30:00", "amount": 123.26290995394177, "unit": "mg/dL"}, {"date": "2015-10-16T13:35:00", "amount": 120.70797158224826, "unit": "mg/dL"}, {"date": "2015-10-16T13:40:00", "amount": 118.35284840210196, "unit": "mg/dL"}, {"date": "2015-10-16T13:45:00", "amount": 116.18141436727487, "unit": "mg/dL"}, {"date": "2015-10-16T13:50:00", "amount": 114.18404485920465, "unit": "mg/dL"}, {"date": "2015-10-16T13:55:00", "amount": 112.18280277475125, "unit": "mg/dL"}, {"date": "2015-10-16T14:00:00", "amount": 111.87870094924963, "unit": "mg/dL"}, {"date": "2015-10-16T14:05:00", "amount": 111.62167687086679, "unit": "mg/dL"}, {"date": "2015-10-16T14:10:00", "amount": 111.41233553885309, "unit": "mg/dL"}, {"date": "2015-10-16T14:15:00", "amount": 111.2474901115553, "unit": "mg/dL"}, {"date": "2015-10-16T14:20:00", "amount": 111.12412319038174, "unit": "mg/dL"}, {"date": "2015-10-16T14:25:00", "amount": 111.04063618007595, "unit": "mg/dL"}, {"date": "2015-10-16T14:30:00", "amount": 110.99450801550861, "unit": "mg/dL"}, {"date": "2015-10-16T14:35:00", "amount": 110.99215178227135, "unit": "mg/dL"}] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_flat_glucose_input.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "trend_arrow": "FLAT", 3 | "system_time": "2015-10-16T16:54:46", 4 | "display_time": "2015-10-16T09:54:08", 5 | "glucose": 147 6 | }] 7 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_flat_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-16T09:50:00", 4 | "amount": 0.0, 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "date": "2015-10-16T09:55:00", 9 | "amount": 0.0, 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "date": "2015-10-16T10:00:00", 14 | "amount": 0.0, 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "date": "2015-10-16T10:05:00", 19 | "amount": 0.0, 20 | "unit": "mg/dL" 21 | }, 22 | { 23 | "date": "2015-10-16T10:10:00", 24 | "amount": 0.0, 25 | "unit": "mg/dL" 26 | }, 27 | { 28 | "date": "2015-10-16T10:15:00", 29 | "amount": 0.0, 30 | "unit": "mg/dL" 31 | }, 32 | { 33 | "date": "2015-10-16T10:20:00", 34 | "amount": 0.0, 35 | "unit": "mg/dL" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_flat_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-10-16T09:54:08", "amount": 147.0, "unit": "mg/dL"}, {"date": "2015-10-16T09:55:00", "amount": 147.0, "unit": "mg/dL"}, {"date": "2015-10-16T10:00:00", "amount": 147.004233551617, "unit": "mg/dL"}, {"date": "2015-10-16T10:05:00", "amount": 146.9926707724038, "unit": "mg/dL"}, {"date": "2015-10-16T10:10:00", "amount": 146.8958674737854, "unit": "mg/dL"}, {"date": "2015-10-16T10:15:00", "amount": 147.04445439937905, "unit": "mg/dL"}, {"date": "2015-10-16T10:20:00", "amount": 147.31900724491572, "unit": "mg/dL"}, {"date": "2015-10-16T10:25:00", "amount": 147.74372056180917, "unit": "mg/dL"}, {"date": "2015-10-16T10:30:00", "amount": 148.2810567606954, "unit": "mg/dL"}, {"date": "2015-10-16T10:35:00", "amount": 148.9596120128732, "unit": "mg/dL"}, {"date": "2015-10-16T10:40:00", "amount": 149.81336801665336, "unit": "mg/dL"}, {"date": "2015-10-16T10:45:00", "amount": 150.86981874337064, "unit": "mg/dL"}, {"date": "2015-10-16T10:50:00", "amount": 152.15580252668218, "unit": "mg/dL"}, {"date": "2015-10-16T10:55:00", "amount": 153.6974161440597, "unit": "mg/dL"}, {"date": "2015-10-16T11:00:00", "amount": 155.51770102512393, "unit": "mg/dL"}, {"date": "2015-10-16T11:05:00", "amount": 157.64175104783675, "unit": "mg/dL"}, {"date": "2015-10-16T11:10:00", "amount": 160.08344605328327, "unit": "mg/dL"}, {"date": "2015-10-16T11:15:00", "amount": 162.86462421426705, "unit": "mg/dL"}, {"date": "2015-10-16T11:20:00", "amount": 166.0110036823831, "unit": "mg/dL"}, {"date": "2015-10-16T11:25:00", "amount": 169.36506235795838, "unit": "mg/dL"}, {"date": "2015-10-16T11:30:00", "amount": 172.2567553590247, "unit": "mg/dL"}, {"date": "2015-10-16T11:35:00", "amount": 174.6368285973692, "unit": "mg/dL"}, {"date": "2015-10-16T11:40:00", "amount": 176.53360131745868, "unit": "mg/dL"}, {"date": "2015-10-16T11:45:00", "amount": 177.96443945389981, "unit": "mg/dL"}, {"date": "2015-10-16T11:50:00", "amount": 178.9458700935162, "unit": "mg/dL"}, {"date": "2015-10-16T11:55:00", "amount": 179.49358147534787, "unit": "mg/dL"}, {"date": "2015-10-16T12:00:00", "amount": 179.62307510575977, "unit": "mg/dL"}, {"date": "2015-10-16T12:05:00", "amount": 179.35316979413244, "unit": "mg/dL"}, {"date": "2015-10-16T12:10:00", "amount": 178.6657984633819, "unit": "mg/dL"}, {"date": "2015-10-16T12:15:00", "amount": 177.57486330278547, "unit": "mg/dL"}, {"date": "2015-10-16T12:20:00", "amount": 176.09326181005426, "unit": "mg/dL"}, {"date": "2015-10-16T12:25:00", "amount": 174.22997746281555, "unit": "mg/dL"}, {"date": "2015-10-16T12:30:00", "amount": 172.00846059401647, "unit": "mg/dL"}, {"date": "2015-10-16T12:35:00", "amount": 169.42518944351986, "unit": "mg/dL"}, {"date": "2015-10-16T12:40:00", "amount": 166.49649200428675, "unit": "mg/dL"}, {"date": "2015-10-16T12:45:00", "amount": 163.22565988879802, "unit": "mg/dL"}, {"date": "2015-10-16T12:50:00", "amount": 159.61932310447128, "unit": "mg/dL"}, {"date": "2015-10-16T12:55:00", "amount": 155.77221367512783, "unit": "mg/dL"}, {"date": "2015-10-16T13:00:00", "amount": 152.03421604537155, "unit": "mg/dL"}, {"date": "2015-10-16T13:05:00", "amount": 148.44308963860323, "unit": "mg/dL"}, {"date": "2015-10-16T13:10:00", "amount": 144.9951404192747, "unit": "mg/dL"}, {"date": "2015-10-16T13:15:00", "amount": 141.7138990231305, "unit": "mg/dL"}, {"date": "2015-10-16T13:20:00", "amount": 138.6072277081485, "unit": "mg/dL"}, {"date": "2015-10-16T13:25:00", "amount": 135.66879668880335, "unit": "mg/dL"}, {"date": "2015-10-16T13:30:00", "amount": 132.89332635362243, "unit": "mg/dL"}, {"date": "2015-10-16T13:35:00", "amount": 130.33838798192892, "unit": "mg/dL"}, {"date": "2015-10-16T13:40:00", "amount": 127.98326480178261, "unit": "mg/dL"}, {"date": "2015-10-16T13:45:00", "amount": 125.81183076695552, "unit": "mg/dL"}, {"date": "2015-10-16T13:50:00", "amount": 123.8144612588853, "unit": "mg/dL"}, {"date": "2015-10-16T13:55:00", "amount": 121.81321917443191, "unit": "mg/dL"}, {"date": "2015-10-16T14:00:00", "amount": 121.50911734893029, "unit": "mg/dL"}, {"date": "2015-10-16T14:05:00", "amount": 121.25209327054745, "unit": "mg/dL"}, {"date": "2015-10-16T14:10:00", "amount": 121.04275193853374, "unit": "mg/dL"}, {"date": "2015-10-16T14:15:00", "amount": 120.87790651123595, "unit": "mg/dL"}, {"date": "2015-10-16T14:20:00", "amount": 120.7545395900624, "unit": "mg/dL"}, {"date": "2015-10-16T14:25:00", "amount": 120.6710525797566, "unit": "mg/dL"}, {"date": "2015-10-16T14:30:00", "amount": 120.62492441518927, "unit": "mg/dL"}, {"date": "2015-10-16T14:35:00", "amount": 120.622568181952, "unit": "mg/dL"}] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_up_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "date": "2015-10-16T09:50:00", 4 | "amount": 0.0, 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "date": "2015-10-16T09:55:00", 9 | "amount": 3.0, 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "date": "2015-10-16T10:00:00", 14 | "amount": 6.0, 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "date": "2015-10-16T10:05:00", 19 | "amount": 9.0, 20 | "unit": "mg/dL" 21 | }, 22 | { 23 | "date": "2015-10-16T10:10:00", 24 | "amount": 12.0, 25 | "unit": "mg/dL" 26 | }, 27 | { 28 | "date": "2015-10-16T10:15:00", 29 | "amount": 15.0, 30 | "unit": "mg/dL" 31 | }, 32 | { 33 | "date": "2015-10-16T10:20:00", 34 | "amount": 18.0, 35 | "unit": "mg/dL" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_momentum_up_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-10-16T09:51:08", "amount": 147.0, "unit": "mg/dL"}, {"date": "2015-10-16T09:55:00", "amount": 150.0, "unit": "mg/dL"}, {"date": "2015-10-16T10:00:00", "amount": 152.55488815336815, "unit": "mg/dL"}, {"date": "2015-10-16T10:05:00", "amount": 154.47341258933002, "unit": "mg/dL"}, {"date": "2015-10-16T10:10:00", "amount": 155.6858844536697, "unit": "mg/dL"}, {"date": "2015-10-16T10:15:00", "amount": 156.5985655458672, "unit": "mg/dL"}, {"date": "2015-10-16T10:20:00", "amount": 157.048590845235, "unit": "mg/dL"}, {"date": "2015-10-16T10:25:00", "amount": 157.47330416212844, "unit": "mg/dL"}, {"date": "2015-10-16T10:30:00", "amount": 158.01064036101468, "unit": "mg/dL"}, {"date": "2015-10-16T10:35:00", "amount": 158.68919561319248, "unit": "mg/dL"}, {"date": "2015-10-16T10:40:00", "amount": 159.54295161697263, "unit": "mg/dL"}, {"date": "2015-10-16T10:45:00", "amount": 160.59940234368992, "unit": "mg/dL"}, {"date": "2015-10-16T10:50:00", "amount": 161.88538612700145, "unit": "mg/dL"}, {"date": "2015-10-16T10:55:00", "amount": 163.42699974437897, "unit": "mg/dL"}, {"date": "2015-10-16T11:00:00", "amount": 165.2472846254432, "unit": "mg/dL"}, {"date": "2015-10-16T11:05:00", "amount": 167.37133464815602, "unit": "mg/dL"}, {"date": "2015-10-16T11:10:00", "amount": 169.81302965360254, "unit": "mg/dL"}, {"date": "2015-10-16T11:15:00", "amount": 172.59420781458633, "unit": "mg/dL"}, {"date": "2015-10-16T11:20:00", "amount": 175.74058728270236, "unit": "mg/dL"}, {"date": "2015-10-16T11:25:00", "amount": 179.09464595827765, "unit": "mg/dL"}, {"date": "2015-10-16T11:30:00", "amount": 181.98633895934398, "unit": "mg/dL"}, {"date": "2015-10-16T11:35:00", "amount": 184.36641219768848, "unit": "mg/dL"}, {"date": "2015-10-16T11:40:00", "amount": 186.26318491777795, "unit": "mg/dL"}, {"date": "2015-10-16T11:45:00", "amount": 187.6940230542191, "unit": "mg/dL"}, {"date": "2015-10-16T11:50:00", "amount": 188.6754536938355, "unit": "mg/dL"}, {"date": "2015-10-16T11:55:00", "amount": 189.22316507566717, "unit": "mg/dL"}, {"date": "2015-10-16T12:00:00", "amount": 189.35265870607907, "unit": "mg/dL"}, {"date": "2015-10-16T12:05:00", "amount": 189.08275339445174, "unit": "mg/dL"}, {"date": "2015-10-16T12:10:00", "amount": 188.3953820637012, "unit": "mg/dL"}, {"date": "2015-10-16T12:15:00", "amount": 187.30444690310478, "unit": "mg/dL"}, {"date": "2015-10-16T12:20:00", "amount": 185.82284541037356, "unit": "mg/dL"}, {"date": "2015-10-16T12:25:00", "amount": 183.95956106313486, "unit": "mg/dL"}, {"date": "2015-10-16T12:30:00", "amount": 181.73804419433577, "unit": "mg/dL"}, {"date": "2015-10-16T12:35:00", "amount": 179.15477304383916, "unit": "mg/dL"}, {"date": "2015-10-16T12:40:00", "amount": 176.22607560460605, "unit": "mg/dL"}, {"date": "2015-10-16T12:45:00", "amount": 172.95524348911732, "unit": "mg/dL"}, {"date": "2015-10-16T12:50:00", "amount": 169.34890670479058, "unit": "mg/dL"}, {"date": "2015-10-16T12:55:00", "amount": 165.50179727544713, "unit": "mg/dL"}, {"date": "2015-10-16T13:00:00", "amount": 161.76379964569085, "unit": "mg/dL"}, {"date": "2015-10-16T13:05:00", "amount": 158.17267323892253, "unit": "mg/dL"}, {"date": "2015-10-16T13:10:00", "amount": 154.724724019594, "unit": "mg/dL"}, {"date": "2015-10-16T13:15:00", "amount": 151.4434826234498, "unit": "mg/dL"}, {"date": "2015-10-16T13:20:00", "amount": 148.33681130846782, "unit": "mg/dL"}, {"date": "2015-10-16T13:25:00", "amount": 145.39838028912266, "unit": "mg/dL"}, {"date": "2015-10-16T13:30:00", "amount": 142.62290995394173, "unit": "mg/dL"}, {"date": "2015-10-16T13:35:00", "amount": 140.06797158224822, "unit": "mg/dL"}, {"date": "2015-10-16T13:40:00", "amount": 137.7128484021019, "unit": "mg/dL"}, {"date": "2015-10-16T13:45:00", "amount": 135.54141436727483, "unit": "mg/dL"}, {"date": "2015-10-16T13:50:00", "amount": 133.5440448592046, "unit": "mg/dL"}, {"date": "2015-10-16T13:55:00", "amount": 131.5428027747512, "unit": "mg/dL"}, {"date": "2015-10-16T14:00:00", "amount": 131.2387009492496, "unit": "mg/dL"}, {"date": "2015-10-16T14:05:00", "amount": 130.98167687086675, "unit": "mg/dL"}, {"date": "2015-10-16T14:10:00", "amount": 130.77233553885304, "unit": "mg/dL"}, {"date": "2015-10-16T14:15:00", "amount": 130.60749011155525, "unit": "mg/dL"}, {"date": "2015-10-16T14:20:00", "amount": 130.4841231903817, "unit": "mg/dL"}, {"date": "2015-10-16T14:25:00", "amount": 130.4006361800759, "unit": "mg/dL"}, {"date": "2015-10-16T14:30:00", "amount": 130.35450801550857, "unit": "mg/dL"}, {"date": "2015-10-16T14:35:00", "amount": 130.3521517822713, "unit": "mg/dL"}] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_no_momentum_output.json: -------------------------------------------------------------------------------- 1 | [{"date": "2015-10-16T09:51:08", "amount": 147.0, "unit": "mg/dL"}, {"date": "2015-10-16T09:55:00", "amount": 147.31844287141575, "unit": "mg/dL"}, {"date": "2015-10-16T10:00:00", "amount": 147.4405645526754, "unit": "mg/dL"}, {"date": "2015-10-16T10:05:00", "amount": 147.391291345801, "unit": "mg/dL"}, {"date": "2015-10-16T10:10:00", "amount": 147.16858437045187, "unit": "mg/dL"}, {"date": "2015-10-16T10:15:00", "amount": 147.40270242548388, "unit": "mg/dL"}, {"date": "2015-10-16T10:20:00", "amount": 147.73163954074346, "unit": "mg/dL"}, {"date": "2015-10-16T10:25:00", "amount": 148.1563528576369, "unit": "mg/dL"}, {"date": "2015-10-16T10:30:00", "amount": 148.69368905652314, "unit": "mg/dL"}, {"date": "2015-10-16T10:35:00", "amount": 149.37224430870094, "unit": "mg/dL"}, {"date": "2015-10-16T10:40:00", "amount": 150.2260003124811, "unit": "mg/dL"}, {"date": "2015-10-16T10:45:00", "amount": 151.28245103919838, "unit": "mg/dL"}, {"date": "2015-10-16T10:50:00", "amount": 152.56843482250991, "unit": "mg/dL"}, {"date": "2015-10-16T10:55:00", "amount": 154.11004843988744, "unit": "mg/dL"}, {"date": "2015-10-16T11:00:00", "amount": 155.93033332095166, "unit": "mg/dL"}, {"date": "2015-10-16T11:05:00", "amount": 158.05438334366448, "unit": "mg/dL"}, {"date": "2015-10-16T11:10:00", "amount": 160.496078349111, "unit": "mg/dL"}, {"date": "2015-10-16T11:15:00", "amount": 163.2772565100948, "unit": "mg/dL"}, {"date": "2015-10-16T11:20:00", "amount": 166.42363597821083, "unit": "mg/dL"}, {"date": "2015-10-16T11:25:00", "amount": 169.7776946537861, "unit": "mg/dL"}, {"date": "2015-10-16T11:30:00", "amount": 172.66938765485244, "unit": "mg/dL"}, {"date": "2015-10-16T11:35:00", "amount": 175.04946089319694, "unit": "mg/dL"}, {"date": "2015-10-16T11:40:00", "amount": 176.9462336132864, "unit": "mg/dL"}, {"date": "2015-10-16T11:45:00", "amount": 178.37707174972755, "unit": "mg/dL"}, {"date": "2015-10-16T11:50:00", "amount": 179.35850238934393, "unit": "mg/dL"}, {"date": "2015-10-16T11:55:00", "amount": 179.9062137711756, "unit": "mg/dL"}, {"date": "2015-10-16T12:00:00", "amount": 180.0357074015875, "unit": "mg/dL"}, {"date": "2015-10-16T12:05:00", "amount": 179.76580208996018, "unit": "mg/dL"}, {"date": "2015-10-16T12:10:00", "amount": 179.07843075920962, "unit": "mg/dL"}, {"date": "2015-10-16T12:15:00", "amount": 177.9874955986132, "unit": "mg/dL"}, {"date": "2015-10-16T12:20:00", "amount": 176.505894105882, "unit": "mg/dL"}, {"date": "2015-10-16T12:25:00", "amount": 174.6426097586433, "unit": "mg/dL"}, {"date": "2015-10-16T12:30:00", "amount": 172.4210928898442, "unit": "mg/dL"}, {"date": "2015-10-16T12:35:00", "amount": 169.8378217393476, "unit": "mg/dL"}, {"date": "2015-10-16T12:40:00", "amount": 166.90912430011448, "unit": "mg/dL"}, {"date": "2015-10-16T12:45:00", "amount": 163.63829218462575, "unit": "mg/dL"}, {"date": "2015-10-16T12:50:00", "amount": 160.031955400299, "unit": "mg/dL"}, {"date": "2015-10-16T12:55:00", "amount": 156.18484597095556, "unit": "mg/dL"}, {"date": "2015-10-16T13:00:00", "amount": 152.44684834119928, "unit": "mg/dL"}, {"date": "2015-10-16T13:05:00", "amount": 148.85572193443096, "unit": "mg/dL"}, {"date": "2015-10-16T13:10:00", "amount": 145.40777271510242, "unit": "mg/dL"}, {"date": "2015-10-16T13:15:00", "amount": 142.12653131895823, "unit": "mg/dL"}, {"date": "2015-10-16T13:20:00", "amount": 139.01986000397625, "unit": "mg/dL"}, {"date": "2015-10-16T13:25:00", "amount": 136.0814289846311, "unit": "mg/dL"}, {"date": "2015-10-16T13:30:00", "amount": 133.30595864945016, "unit": "mg/dL"}, {"date": "2015-10-16T13:35:00", "amount": 130.75102027775665, "unit": "mg/dL"}, {"date": "2015-10-16T13:40:00", "amount": 128.39589709761034, "unit": "mg/dL"}, {"date": "2015-10-16T13:45:00", "amount": 126.22446306278326, "unit": "mg/dL"}, {"date": "2015-10-16T13:50:00", "amount": 124.22709355471304, "unit": "mg/dL"}, {"date": "2015-10-16T13:55:00", "amount": 122.22585147025964, "unit": "mg/dL"}, {"date": "2015-10-16T14:00:00", "amount": 121.92174964475802, "unit": "mg/dL"}, {"date": "2015-10-16T14:05:00", "amount": 121.66472556637518, "unit": "mg/dL"}, {"date": "2015-10-16T14:10:00", "amount": 121.45538423436147, "unit": "mg/dL"}, {"date": "2015-10-16T14:15:00", "amount": 121.29053880706368, "unit": "mg/dL"}, {"date": "2015-10-16T14:20:00", "amount": 121.16717188589013, "unit": "mg/dL"}, {"date": "2015-10-16T14:25:00", "amount": 121.08368487558434, "unit": "mg/dL"}, {"date": "2015-10-16T14:30:00", "amount": 121.037556711017, "unit": "mg/dL"}, {"date": "2015-10-16T14:35:00", "amount": 121.03520047777974, "unit": "mg/dL"}] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_non_zero_carb_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "value": 345.692710028959, 4 | "startDate": "2016-03-05T00:05:00-0800", 5 | "unit": "mg/dL" 6 | }, 7 | { 8 | "value": 357.4968709800336, 9 | "startDate": "2016-03-05T00:10:00-0800", 10 | "unit": "mg/dL" 11 | }, 12 | { 13 | "value": 368.2585079256211, 14 | "startDate": "2016-03-05T00:15:00-0800", 15 | "unit": "mg/dL" 16 | }, 17 | { 18 | "value": 377.9776208657216, 19 | "startDate": "2016-03-05T00:20:00-0800", 20 | "unit": "mg/dL" 21 | }, 22 | { 23 | "value": 386.6542098003353, 24 | "startDate": "2016-03-05T00:25:00-0800", 25 | "unit": "mg/dL" 26 | }, 27 | { 28 | "value": 394.2882747294619, 29 | "startDate": "2016-03-05T00:30:00-0800", 30 | "unit": "mg/dL" 31 | }, 32 | { 33 | "value": 400.9472251181222, 34 | "startDate": "2016-03-05T00:35:00-0800", 35 | "unit": "mg/dL" 36 | }, 37 | { 38 | "value": 406.9048840115836, 39 | "startDate": "2016-03-05T00:40:00-0800", 40 | "unit": "mg/dL" 41 | }, 42 | { 43 | "value": 412.1903892699285, 44 | "startDate": "2016-03-05T00:45:00-0800", 45 | "unit": "mg/dL" 46 | }, 47 | { 48 | "value": 416.8037408931565, 49 | "startDate": "2016-03-05T00:50:00-0800", 50 | "unit": "mg/dL" 51 | }, 52 | { 53 | "value": 420.7449388812682, 54 | "startDate": "2016-03-05T00:55:00-0800", 55 | "unit": "mg/dL" 56 | }, 57 | { 58 | "value": 424.013983234263, 59 | "startDate": "2016-03-05T01:00:00-0800", 60 | "unit": "mg/dL" 61 | }, 62 | { 63 | "value": 426.6108739521414, 64 | "startDate": "2016-03-05T01:05:00-0800", 65 | "unit": "mg/dL" 66 | }, 67 | { 68 | "value": 428.5356110349032, 69 | "startDate": "2016-03-05T01:10:00-0800", 70 | "unit": "mg/dL" 71 | }, 72 | { 73 | "value": 429.7881944825484, 74 | "startDate": "2016-03-05T01:15:00-0800", 75 | "unit": "mg/dL" 76 | }, 77 | { 78 | "value": 430.461332114007, 79 | "startDate": "2016-03-05T01:20:00-0800", 80 | "unit": "mg/dL" 81 | }, 82 | { 83 | "value": 430.885657674135, 84 | "startDate": "2016-03-05T01:25:00-0800", 85 | "unit": "mg/dL" 86 | }, 87 | { 88 | "value": 431.0905044962657, 89 | "startDate": "2016-03-05T01:30:00-0800", 90 | "unit": "mg/dL" 91 | }, 92 | { 93 | "value": 431.1111111111111, 94 | "startDate": "2016-03-05T01:35:00-0800", 95 | "unit": "mg/dL" 96 | }, 97 | { 98 | "value": 431.1111111111111, 99 | "startDate": "2016-03-05T01:40:00-0800", 100 | "unit": "mg/dL" 101 | }, 102 | { 103 | "value": 431.1111111111111, 104 | "startDate": "2016-03-05T01:45:00-0800", 105 | "unit": "mg/dL" 106 | }, 107 | { 108 | "value": 431.1111111111111, 109 | "startDate": "2016-03-05T01:50:00-0800", 110 | "unit": "mg/dL" 111 | }, 112 | { 113 | "value": 431.1111111111111, 114 | "startDate": "2016-03-05T01:55:00-0800", 115 | "unit": "mg/dL" 116 | }, 117 | { 118 | "value": 431.1111111111111, 119 | "startDate": "2016-03-05T02:00:00-0800", 120 | "unit": "mg/dL" 121 | }, 122 | { 123 | "value": 431.1111111111111, 124 | "startDate": "2016-03-05T02:05:00-0800", 125 | "unit": "mg/dL" 126 | }, 127 | { 128 | "value": 431.1111111111111, 129 | "startDate": "2016-03-05T02:10:00-0800", 130 | "unit": "mg/dL" 131 | }, 132 | { 133 | "value": 431.1111111111111, 134 | "startDate": "2016-03-05T02:15:00-0800", 135 | "unit": "mg/dL" 136 | }, 137 | { 138 | "value": 431.1111111111111, 139 | "startDate": "2016-03-05T02:20:00-0800", 140 | "unit": "mg/dL" 141 | }, 142 | { 143 | "value": 431.1111111111111, 144 | "startDate": "2016-03-05T02:25:00-0800", 145 | "unit": "mg/dL" 146 | }, 147 | { 148 | "value": 431.1111111111111, 149 | "startDate": "2016-03-05T02:30:00-0800", 150 | "unit": "mg/dL" 151 | }, 152 | { 153 | "value": 431.1111111111111, 154 | "startDate": "2016-03-05T02:35:00-0800", 155 | "unit": "mg/dL" 156 | } 157 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/glucose_from_effects_non_zero_glucose_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "value": 178, 4 | "startDate": "2016-03-05T00:03:14-0800", 5 | "unit": "mg/dL" 6 | } 7 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/ice_minus_carb_effect_with_gaps_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "unit" : "mg\/dL", 4 | "date" : "2018-08-16 01:13:44 +0000", 5 | "value" : -7.9146779853452083 6 | }, 7 | { 8 | "unit" : "mg\/dL", 9 | "date" : "2018-08-16 01:18:44 +0000", 10 | "value" : -5.9281656186007314 11 | }, 12 | { 13 | "unit" : "mg\/dL", 14 | "date" : "2018-08-16 01:23:44 +0000", 15 | "value" : 1.2296261019331554 16 | }, 17 | { 18 | "unit" : "mg\/dL", 19 | "date" : "2018-08-16 01:28:43 +0000", 20 | "value" : 1.4065989188792711 21 | }, 22 | { 23 | "unit" : "mg\/dL", 24 | "date" : "2018-08-16 02:03:43 +0000", 25 | "value" : 6.0711968367636908 26 | }, 27 | { 28 | "unit" : "mg\/dL", 29 | "date" : "2018-08-16 03:13:44 +0000", 30 | "value" : 1.7358764710254451 31 | }, 32 | { 33 | "unit" : "mg\/dL", 34 | "date" : "2018-08-16 03:18:44 +0000", 35 | "value" : 0.5343295138009645 36 | }, 37 | { 38 | "unit" : "mg\/dL", 39 | "date" : "2018-08-16 03:23:43 +0000", 40 | "value" : 1.4847123043985215 41 | }, 42 | { 43 | "unit" : "mg\/dL", 44 | "date" : "2018-08-16 03:28:44 +0000", 45 | "value" : 1.6893378641238699 46 | }, 47 | { 48 | "unit" : "mg\/dL", 49 | "date" : "2018-08-16 03:33:43 +0000", 50 | "value" : 6.042541334805744 51 | }, 52 | { 53 | "unit" : "mg\/dL", 54 | "date" : "2018-08-16 03:38:43 +0000", 55 | "value" : -9.6914450613633392 56 | }, 57 | { 58 | "unit" : "mg\/dL", 59 | "date" : "2018-08-16 03:43:44 +0000", 60 | "value" : 0.58142124976613774 61 | }, 62 | { 63 | "unit" : "mg\/dL", 64 | "date" : "2018-08-16 03:48:43 +0000", 65 | "value" : -7.1923719688531209 66 | }, 67 | { 68 | "unit" : "mg\/dL", 69 | "date" : "2018-08-16 03:53:44 +0000", 70 | "value" : -2.9941217788457295 71 | }, 72 | { 73 | "unit" : "mg\/dL", 74 | "date" : "2018-08-16 03:58:43 +0000", 75 | "value" : -11.960291314911359 76 | }, 77 | { 78 | "unit" : "mg\/dL", 79 | "date" : "2018-08-16 04:03:43 +0000", 80 | "value" : -1.2512705141339 81 | }, 82 | { 83 | "unit" : "mg\/dL", 84 | "date" : "2018-08-16 04:08:43 +0000", 85 | "value" : -0.0014915619982254213 86 | }, 87 | { 88 | "unit" : "mg\/dL", 89 | "date" : "2018-08-16 04:13:44 +0000", 90 | "value" : -0.0056015222217293825 91 | }, 92 | { 93 | "unit" : "mg\/dL", 94 | "date" : "2018-08-16 04:18:43 +0000", 95 | "value" : 0.0052760433631586778 96 | }, 97 | { 98 | "unit" : "mg\/dL", 99 | "date" : "2018-08-16 04:23:44 +0000", 100 | "value" : -0.0051133014060256166 101 | }, 102 | { 103 | "unit" : "mg\/dL", 104 | "date" : "2018-08-16 04:28:44 +0000", 105 | "value" : 0.0025222980026429198 106 | }, 107 | { 108 | "unit" : "mg\/dL", 109 | "date" : "2018-08-16 04:33:43 +0000", 110 | "value" : -1.7950225310593533 111 | } 112 | ] 113 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/ice_minus_flat_carb_effect_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "value" : 3.6517114683289944, 4 | "date" : "2018-08-26 00:48:28 +0000", 5 | "unit" : "mg\/dL" 6 | }, 7 | { 8 | "value" : 3.5831456523646765, 9 | "date" : "2018-08-26 00:53:28 +0000", 10 | "unit" : "mg\/dL" 11 | }, 12 | { 13 | "value" : 1.4811396601622886, 14 | "date" : "2018-08-26 00:58:28 +0000", 15 | "unit" : "mg\/dL" 16 | }, 17 | { 18 | "value" : 1.3650980083318285, 19 | "date" : "2018-08-26 01:03:27 +0000", 20 | "unit" : "mg\/dL" 21 | }, 22 | { 23 | "value" : 2.230280467937936, 24 | "date" : "2018-08-26 01:08:28 +0000", 25 | "unit" : "mg\/dL" 26 | }, 27 | { 28 | "value" : 2.1065985817633233, 29 | "date" : "2018-08-26 01:13:28 +0000", 30 | "unit" : "mg\/dL" 31 | }, 32 | { 33 | "value" : 4.9741468447377066, 34 | "date" : "2018-08-26 01:18:27 +0000", 35 | "unit" : "mg\/dL" 36 | }, 37 | { 38 | "value" : 4.8261191053223191, 39 | "date" : "2018-08-26 01:23:28 +0000", 40 | "unit" : "mg\/dL" 41 | } 42 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/subtracting_carb_effect_carb_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"date": "2018-08-16T03:00:00", "amount": 69.38642455065255, "unit": "mg/dL"}, 3 | {"amount": 69.38642455065255, "date": "2018-08-16T03:05:00", "unit": "mg/dL"}, 4 | {"amount": 72.18741125500856, "date": "2018-08-16T03:10:00", "unit": "mg/dL"}, 5 | {"unit": "mg/dL", "date": "2018-08-16T03:15:00", "amount": 82.00120184863087}, 6 | {"unit": "mg/dL", "amount": 90.79285286260895, "date": "2018-08-16T03:20:00"}, 7 | {"amount": 93.5316456300059, "date": "2018-08-16T03:25:00", "unit": "mg/dL"}, 8 | {"amount": 98.19664696604428, "unit": "mg/dL", "date": "2018-08-16T03:30:00"}, 9 | {"amount": 98.5800323225078, "unit": "mg/dL", "date": "2018-08-16T03:35:00"}, 10 | {"unit": "mg/dL", "amount": 100.09237800152016, "date": "2018-08-16T03:40:00"}, 11 | {"unit": "mg/dL", "amount": 101.60472368053252, "date": "2018-08-16T03:45:00"}, 12 | {"unit": "mg/dL", "date": "2018-08-16T03:50:00", "amount": 103.11706935954487}, 13 | {"date": "2018-08-16T03:55:00", "unit": "mg/dL", "amount": 104.6294150385572}, 14 | {"amount": 129.38642455065255, "unit": "mg/dL", "date": "2018-08-16T04:00:00"}, 15 | {"amount": 129.38642455065255, "date": "2018-08-16T04:05:00", "unit": "mg/dL"}, 16 | {"unit": "mg/dL", "date": "2018-08-16T04:10:00", "amount": 132.18741125500856}, 17 | {"amount": 142.00120184863087, "unit": "mg/dL", "date": "2018-08-16T04:15:00"}, 18 | {"amount": 150.79285286260895, "date": "2018-08-16T04:20:00", "unit": "mg/dL"}, 19 | {"date": "2018-08-16T04:25:00", "amount": 153.5316456300059, "unit": "mg/dL"}, 20 | {"unit": "mg/dL", "date": "2018-08-16T04:30:00", "amount": 158.19664696604428}, 21 | {"amount": 158.5800323225078, "date": "2018-08-16T04:35:00", "unit": "mg/dL"}, 22 | {"amount": 160.09237800152016, "unit": "mg/dL", "date": "2018-08-16T04:40:00"}, 23 | {"amount": 161.60472368053252, "unit": "mg/dL", "date": "2018-08-16T04:45:00"}, 24 | {"date": "2018-08-16T04:50:00", "amount": 163.11706935954487, "unit": "mg/dL"}, 25 | {"amount": 164.6294150385572, "unit": "mg/dL", "date": "2018-08-16T04:55:00"}, 26 | {"date": "2018-08-16T05:00:00", "unit": "mg/dL", "amount": 166.14176071756955}, 27 | {"unit": "mg/dL", "amount": 167.65410639658188, "date": "2018-08-16T05:05:00"}, 28 | {"unit": "mg/dL", "date": "2018-08-16T05:10:00", "amount": 169.16645207559424}, 29 | {"date": "2018-08-16T05:15:00", "amount": 170.6787977546066, "unit": "mg/dL"}, 30 | {"amount": 172.19114343361895, "unit": "mg/dL", "date": "2018-08-16T05:20:00"}, 31 | {"amount": 173.70348911263127, "unit": "mg/dL", "date": "2018-08-16T05:25:00"}, 32 | {"date": "2018-08-16T05:30:00", "amount": 175.21583479164363, "unit": "mg/dL"}, 33 | {"date": "2018-08-16T05:35:00", "amount": 176.72818047065596, "unit": "mg/dL"}, 34 | {"date": "2018-08-16T05:40:00", "amount": 178.2405261496683, "unit": "mg/dL"}, 35 | {"unit": "mg/dL", "date": "2018-08-16T05:45:00", "amount": 179.75287182868067}, 36 | {"date": "2018-08-16T05:50:00", "amount": 181.26521750769302, "unit": "mg/dL"}, 37 | {"amount": 182.77756318670535, "unit": "mg/dL", "date": "2018-08-16T05:55:00"}, 38 | {"unit": "mg/dL", "date": "2018-08-16T06:00:00", "amount": 189.38642455065255}, 39 | {"amount": 189.38642455065255, "unit": "mg/dL", "date": "2018-08-16T06:05:00"}, 40 | {"date": "2018-08-16T06:10:00", "amount": 192.18741125500856, "unit": "mg/dL"}, 41 | {"date": "2018-08-16T06:15:00", "unit": "mg/dL", "amount": 202.00120184863087}, 42 | {"unit": "mg/dL", "date": "2018-08-16T06:20:00", "amount": 210.79285286260895}, 43 | {"amount": 213.5316456300059, "date": "2018-08-16T06:25:00", "unit": "mg/dL"}, 44 | {"unit": "mg/dL", "amount": 218.19664696604428, "date": "2018-08-16T06:30:00"}, 45 | {"date": "2018-08-16T06:35:00", "amount": 218.5800323225078, "unit": "mg/dL"}, 46 | {"amount": 220.09237800152016, "unit": "mg/dL", "date": "2018-08-16T06:40:00"}, 47 | {"amount": 221.60472368053252, "date": "2018-08-16T06:45:00", "unit": "mg/dL"}, 48 | {"date": "2018-08-16T06:50:00", "amount": 223.11706935954487, "unit": "mg/dL"}, 49 | {"date": "2018-08-16T06:55:00", "amount": 224.6294150385572, "unit": "mg/dL"}, 50 | {"date": "2018-08-16T07:00:00", "amount": 226.14176071756955, "unit": "mg/dL"}, 51 | {"amount": 227.65410639658188, "date": "2018-08-16T07:05:00", "unit": "mg/dL"}, 52 | {"date": "2018-08-16T07:10:00", "amount": 229.16645207559424, "unit": "mg/dL"}, 53 | {"unit": "mg/dL", "date": "2018-08-16T07:15:00", "amount": 230.6787977546066}, 54 | {"date": "2018-08-16T07:20:00", "unit": "mg/dL", "amount": 232.19114343361895}, 55 | {"amount": 233.70348911263127, "unit": "mg/dL", "date": "2018-08-16T07:25:00"}, 56 | {"date": "2018-08-16T07:30:00", "amount": 235.21583479164363, "unit": "mg/dL"}, 57 | {"date": "2018-08-16T07:35:00", "amount": 236.72818047065596, "unit": "mg/dL"}, 58 | {"date": "2018-08-16T07:40:00", "amount": 238.2405261496683, "unit": "mg/dL"}, 59 | {"unit": "mg/dL", "date": "2018-08-16T07:45:00", "amount": 239.75287182868067}, 60 | {"date": "2018-08-16T07:50:00", "amount": 241.26521750769302, "unit": "mg/dL"}, 61 | {"unit": "mg/dL", "date": "2018-08-16T07:55:00", "amount": 242.77756318670535}, 62 | {"amount": 244.28990886571768, "unit": "mg/dL", "date": "2018-08-16T08:00:00"}, 63 | {"date": "2018-08-16T08:05:00", "amount": 245.80225454473003, "unit": "mg/dL"}, 64 | {"unit": "mg/dL", "date": "2018-08-16T08:10:00", "amount": 247.3146002237424}, 65 | {"unit": "mg/dL", "date": "2018-08-16T08:15:00", "amount": 248.82694590275474}, 66 | {"unit": "mg/dL", "date": "2018-08-16T08:20:00", "amount": 250.33929158176707}, 67 | {"amount": 251.85163726077943, "unit": "mg/dL", "date": "2018-08-16T08:25:00"}, 68 | {"date": "2018-08-16T08:30:00", "amount": 253.16666666666669, "unit": "mg/dL"}, 69 | {"unit": "mg/dL", "amount": 253.16666666666669, "date": "2018-08-16T08:35:00"}, 70 | {"amount": 253.16666666666669, "date": "2018-08-16T08:40:00", "unit": "mg/dL"} 71 | ] 72 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/subtracting_carb_effect_counteration_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"startDate": "2018-08-16T03:03:43", "value": -0.00636304, "endDate": "2018-08-16T03:08:43"}, 3 | {"endDate": "2018-08-16T03:13:44", "value": 0.379823, "startDate": "2018-08-16T03:08:43"}, 4 | {"startDate": "2018-08-16T03:13:44", "endDate": "2018-08-16T03:18:44", "value": 0.572697}, 5 | {"startDate": "2018-08-16T03:18:44", "endDate": "2018-08-16T03:23:44", "value": 0.793684}, 6 | {"endDate": "2018-08-16T03:28:43", "value": 1.21432, "startDate": "2018-08-16T03:23:44"}, 7 | {"endDate": "2018-08-16T04:03:43", "startDate": "2018-08-16T03:28:43", "value": 1.21424}, 8 | {"startDate": "2018-08-16T04:03:43", "value": 0.649644, "endDate": "2018-08-16T05:13:44"}, 9 | {"startDate": "2018-08-16T05:13:44", "endDate": "2018-08-16T05:18:44", "value": 0.409335}, 10 | {"value": 0.599412, "startDate": "2018-08-16T05:18:44", "endDate": "2018-08-16T05:23:43"}, 11 | {"startDate": "2018-08-16T05:23:43", "endDate": "2018-08-16T05:28:44", "value": 0.640337}, 12 | {"value": 1.51098, "startDate": "2018-08-16T05:28:44", "endDate": "2018-08-16T05:33:43"}, 13 | {"value": -1.63582, "endDate": "2018-08-16T05:38:43", "startDate": "2018-08-16T05:33:43"}, 14 | {"startDate": "2018-08-16T05:38:43", "endDate": "2018-08-16T05:43:44", "value": 0.418753}, 15 | {"endDate": "2018-08-16T05:48:43", "value": -1.13601, "startDate": "2018-08-16T05:43:44"}, 16 | {"endDate": "2018-08-16T05:53:44", "value": -0.296355, "startDate": "2018-08-16T05:48:43"}, 17 | {"startDate": "2018-08-16T05:53:44", "endDate": "2018-08-16T05:58:43", "value": -1.07029}, 18 | {"value": -0.250254, "startDate": "2018-08-16T05:58:43", "endDate": "2018-08-16T06:03:43"}, 19 | {"startDate": "2018-08-16T06:03:43", "endDate": "2018-08-16T06:08:43", "value": 0.559899}, 20 | {"value": 1.96164, "startDate": "2018-08-16T06:08:43", "endDate": "2018-08-16T06:13:44"}, 21 | {"endDate": "2018-08-16T06:18:43", "value": 1.75939, "startDate": "2018-08-16T06:13:44"}, 22 | {"endDate": "2018-08-16T06:23:44", "value": 0.546736, "startDate": "2018-08-16T06:18:43"}, 23 | {"startDate": "2018-08-16T06:23:44", "endDate": "2018-08-16T06:28:44", "value": 0.933505}, 24 | {"value": -0.282327, "startDate": "2018-08-16T06:28:44", "endDate": "2018-08-16T06:33:43"} 25 | ] 26 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/subtracting_flat_carb_from_ice_counteraction_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"startDate": "2018-08-26 00:23:27 +0000", "endDate": "2018-08-26 00:28:28 +0000", "value": 0.3711911901542791}, 3 | {"startDate": "2018-08-26 00:28:28 +0000", "endDate": "2018-08-26 00:33:27 +0000", "value": -0.4382943196158106}, 4 | {"startDate": "2018-08-26 00:33:27 +0000", "endDate": "2018-08-26 00:38:27 +0000", "value": -0.24797050925219474}, 5 | {"startDate": "2018-08-26 00:38:27 +0000", "endDate": "2018-08-26 00:43:28 +0000", "value": -0.05800368381887202}, 6 | {"startDate": "2018-08-26 00:43:28 +0000", "endDate": "2018-08-26 00:48:28 +0000", "value": 0.7303422936657988}, 7 | {"startDate": "2018-08-26 00:48:28 +0000", "endDate": "2018-08-26 00:53:28 +0000", "value": 0.7166291304729353}, 8 | {"startDate": "2018-08-26 00:53:28 +0000", "endDate": "2018-08-26 00:58:28 +0000", "value": 0.2962279320324577}, 9 | {"startDate": "2018-08-26 00:58:28 +0000", "endDate": "2018-08-26 01:03:27 +0000", "value": 0.2730196016663657}, 10 | {"startDate": "2018-08-26 01:03:27 +0000", "endDate": "2018-08-26 01:08:28 +0000", "value": 0.44605609358758713}, 11 | {"startDate": "2018-08-26 01:08:27 +0000", "endDate": "2018-08-26 01:13:28 +0000", "value": 0.42131971635266463}, 12 | {"startDate": "2018-08-26 01:13:27 +0000", "endDate": "2018-08-26 01:18:28 +0000", "value": 0.9948293689475411}, 13 | {"startDate": "2018-08-26 01:18:27 +0000", "endDate": "2018-08-26 01:23:28 +0000", "value": 0.9652238210644638} 14 | ] 15 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/LoopMath/sums_with_gaps_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"amount": -7.914677985345208, "unit": "mg/dL", "date": "2018-08-16T03:13:44"}, 3 | {"unit": "mg/dL", "amount": -13.84284360394594, "date": "2018-08-16T03:13:44"}, 4 | {"amount": -12.613217502012784, "unit": "mg/dL", "date": "2018-08-16T03:13:44"}, 5 | {"unit": "mg/dL", "date": "2018-08-16T03:13:44", "amount": -11.206618583133514}, 6 | {"amount": 6.071196836763691, "unit": "mg/dL", "date": "2018-08-16T04:03:43"}, 7 | {"date": "2018-08-16T05:13:44", "unit": "mg/dL", "amount": 1.735876471025445}, 8 | {"unit": "mg/dL", "date": "2018-08-16T05:13:44", "amount": 2.2702059848264096}, 9 | {"amount": 3.754918289224931, "unit": "mg/dL", "date": "2018-08-16T05:13:44"}, 10 | {"unit": "mg/dL", "date": "2018-08-16T05:13:44", "amount": 5.444256153348801}, 11 | {"unit": "mg/dL", "amount": 11.486797488154545, "date": "2018-08-16T05:13:44"}, 12 | {"unit": "mg/dL", "date": "2018-08-16T05:13:44", "amount": 1.7953524267912058}, 13 | {"date": "2018-08-16T05:13:44", "unit": "mg/dL", "amount": 2.376773676557343}, 14 | {"date": "2018-08-16T05:18:44", "amount": -6.551474763321222, "unit": "mg/dL"}, 15 | {"amount": -11.56463836036644, "date": "2018-08-16T05:28:44", "unit": "mg/dL"}, 16 | {"amount": -23.524929675277797, "unit": "mg/dL", "date": "2018-08-16T05:28:44"}, 17 | {"amount": -26.46553805353557, "date": "2018-08-16T05:33:43", "unit": "mg/dL"}, 18 | {"date": "2018-08-16T05:38:43", "unit": "mg/dL", "amount": -32.50957095033954}, 19 | {"date": "2018-08-16T05:43:44", "unit": "mg/dL", "amount": -22.823727411197925}, 20 | {"date": "2018-08-16T05:48:43", "amount": -23.399872617600906, "unit": "mg/dL"}, 21 | {"amount": -16.21261395015381, "unit": "mg/dL", "date": "2018-08-16T05:53:44"}, 22 | {"unit": "mg/dL", "amount": -1.2556785583940788, "date": "2018-08-16T06:03:43"}, 23 | {"amount": -3.0507010894534323, "unit": "mg/dL", "date": "2018-08-16T06:03:43"} 24 | ] 25 | -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/basal.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "i": 0, 4 | "start": "00:00:00", 5 | "rate": 0.9, 6 | "minutes": 0 7 | }, 8 | { 9 | "i": 1, 10 | "start": "04:00:00", 11 | "rate": 0.925, 12 | "minutes": 240 13 | }, 14 | { 15 | "i": 2, 16 | "start": "07:00:00", 17 | "rate": 0.85, 18 | "minutes": 420 19 | }, 20 | { 21 | "i": 3, 22 | "start": "10:00:00", 23 | "rate": 0.85, 24 | "minutes": 600 25 | }, 26 | { 27 | "i": 4, 28 | "start": "12:00:00", 29 | "rate": 0.75, 30 | "minutes": 720 31 | }, 32 | { 33 | "i": 5, 34 | "start": "15:00:00", 35 | "rate": 0.8, 36 | "minutes": 900 37 | }, 38 | { 39 | "i": 6, 40 | "start": "22:00:00", 41 | "rate": 0.9, 42 | "minutes": 1320 43 | } 44 | ] -------------------------------------------------------------------------------- /tests/fixtures/LoopKit/read_carb_ratios.json: -------------------------------------------------------------------------------- 1 | { 2 | "first": 1, 3 | "schedule": [ 4 | { 5 | "i": 0, 6 | "offset": 0, 7 | "q": 0, 8 | "r": 100, 9 | "ratio": 10.0, 10 | "start": "00:00:00", 11 | "x": 0 12 | }, 13 | { 14 | "i": 23, 15 | "offset": 690, 16 | "q": 0, 17 | "r": 80, 18 | "ratio": 9.0, 19 | "start": "11:30:00", 20 | "x": 1 21 | }, 22 | { 23 | "i": 36, 24 | "offset": 1080, 25 | "q": 0, 26 | "r": 80, 27 | "ratio": 8.0, 28 | "start": "18:00:00", 29 | "x": 2 30 | }, 31 | { 32 | "i": 45, 33 | "offset": 1350, 34 | "q": 0, 35 | "r": 90, 36 | "ratio": 9.0, 37 | "start": "22:30:00", 38 | "x": 3 39 | } 40 | ], 41 | "units": "grams" 42 | } 43 | -------------------------------------------------------------------------------- /tests/loop_kit_tests.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Fri Jun 14 09:25:37 2019 5 | 6 | @author: annaquinlan 7 | 8 | Github URL: https://github.com/tidepool-org/LoopKit/blob/ 9 | 57a9f2ba65ae3765ef7baafe66b883e654e08391/LoopKitTests/LoopKitTests.swift 10 | """ 11 | import json 12 | import os 13 | 14 | 15 | def load_fixture(resource_name, extension): 16 | """ Load file given name and extension 17 | 18 | Arguments: 19 | resource_name -- name of file without the extension 20 | extension -- ending of file (ex: ".json") 21 | 22 | Output: 23 | contents of file 24 | """ 25 | path = find_full_path(resource_name, extension) 26 | 27 | with open(path) as json_file: 28 | file = json.load(json_file) 29 | 30 | return file 31 | 32 | 33 | def find_full_path(resource_name, extension): 34 | """ Find file path, given name and extension 35 | example: "/home/pi/Media/tidepool_demo.json" 36 | 37 | This will return the *first* instance of the file 38 | 39 | Arguments: 40 | resource_name -- name of file without the extension 41 | extension -- ending of file (ex: ".json") 42 | 43 | Output: 44 | path to file 45 | """ 46 | search_dir = os.path.dirname(__file__) 47 | for root, dirs, files in os.walk(search_dir): # pylint: disable=W0612 48 | for name in files: 49 | (base, ext) = os.path.splitext(name) 50 | if base == resource_name and extension == ext: 51 | return os.path.join(root, name) 52 | 53 | print("No file found for that key") 54 | return "" 55 | 56 | 57 | def find_root_path(resource_name, extension): 58 | """ Find root path, given name and extension 59 | (example: "/home/pi/Media") 60 | 61 | This will return the *first* instance of the file 62 | 63 | Arguments: 64 | resource_name -- name of file without the extension 65 | extension -- ending of file (ex: ".json") 66 | 67 | Output: 68 | root path to file 69 | """ 70 | search_dir = os.path.dirname(__file__) 71 | for root, dirs, files in os.walk(search_dir): # pylint: disable=W0612 72 | for name in files: 73 | (base, ext) = os.path.splitext(name) 74 | if base == resource_name and extension == ext: 75 | return root 76 | 77 | print("No file found for that key") 78 | return "" 79 | -------------------------------------------------------------------------------- /tests/path_grabber.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Mon Jun 17 15:44:25 2019 5 | 6 | @author: annaquinlan 7 | """ 8 | 9 | import os 10 | import sys 11 | 12 | """ Set system path to import from parent directory """ 13 | sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 14 | -------------------------------------------------------------------------------- /tests/test_ns_date.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Sun Jun 16 15:41:18 2019 5 | 6 | @author: annaquinlan 7 | """ 8 | # pylint: disable=C0111, C0411, W0105 9 | import unittest 10 | from datetime import datetime, timedelta 11 | 12 | #from . import path_grabber # pylint: disable=unused-import 13 | from pyloopkit.date import (date_floored_to_time_interval, date_ceiled_to_time_interval, 14 | time_interval_since_reference_date, time_interval_since) 15 | 16 | REF_DATE = datetime(2001, 1, 1, 0, 0, 0) 17 | 18 | 19 | class TestDateFunctions(unittest.TestCase): 20 | 21 | """ Tests for date_ceiled_to_time_interval """ 22 | def test_date_ceiled_to_interval(self): 23 | calendar = datetime.now() 24 | five_01 = calendar.replace(hour=5, minute=0, second=1, microsecond=0) 25 | five_05 = calendar.replace(hour=5, minute=5, second=0, microsecond=0) 26 | self.assertEqual(five_05, date_ceiled_to_time_interval(five_01, 5)) 27 | self.assertEqual(five_01, date_ceiled_to_time_interval(five_01, 0)) 28 | 29 | six = calendar.replace(hour=6, minute=0, second=0, microsecond=0) 30 | self.assertEqual(six, date_ceiled_to_time_interval(five_01, 60)) 31 | 32 | self.assertEqual(five_05, date_ceiled_to_time_interval(five_05, 5)) 33 | 34 | five_47 = calendar.replace(hour=5, minute=47, second=58, microsecond=0) 35 | five_50 = calendar.replace(hour=5, minute=50, second=0, microsecond=0) 36 | self.assertEqual(five_50, date_ceiled_to_time_interval(five_47, 5)) 37 | 38 | twenty_three_59 = calendar.replace( 39 | hour=23, minute=59, second=0, microsecond=0 40 | ) 41 | tomorrow_midnight = (calendar.replace( 42 | hour=23, minute=59, second=0, microsecond=0 43 | ) + timedelta(minutes=1)) 44 | self.assertEqual(tomorrow_midnight, 45 | date_ceiled_to_time_interval(twenty_three_59, 5)) 46 | 47 | """ Tests for date_floored_to_time_interval """ 48 | def test_date_floored_to_interval(self): 49 | calendar = datetime.now() 50 | five_01 = calendar.replace(hour=5, minute=0, second=1, microsecond=0) 51 | five = calendar.replace(hour=5, minute=0, second=0, microsecond=0) 52 | self.assertEqual(five, date_floored_to_time_interval(five_01, 5)) 53 | 54 | five_59 = calendar.replace(hour=5, minute=59, second=0, microsecond=0) 55 | self.assertEqual(five, date_floored_to_time_interval(five_59, 60)) 56 | 57 | five_55 = calendar.replace(hour=5, minute=55, second=0, microsecond=0) 58 | self.assertEqual(five_55, date_floored_to_time_interval(five_59, 5)) 59 | 60 | self.assertEqual(five, date_floored_to_time_interval(five, 5)) 61 | self.assertEqual(five_01, date_floored_to_time_interval(five_01, 0)) 62 | 63 | """ Tests for time_interval_since_reference_date """ 64 | def test_time_interval_since_reference_date(self): 65 | self.assertEqual(0, time_interval_since_reference_date(REF_DATE)) 66 | 67 | self.assertEqual(371, time_interval_since_reference_date( 68 | REF_DATE + timedelta(seconds=371))) 69 | self.assertEqual(12345, time_interval_since_reference_date( 70 | REF_DATE + timedelta(seconds=12345))) 71 | self.assertEqual(200, time_interval_since_reference_date( 72 | REF_DATE + timedelta(seconds=-200))) 73 | self.assertEqual(86400, time_interval_since_reference_date( 74 | REF_DATE + timedelta(seconds=-86400))) 75 | self.assertEqual(86400, time_interval_since_reference_date( 76 | REF_DATE + timedelta(seconds=86400))) 77 | 78 | def test_time_interval_since(self): 79 | date = datetime.now() 80 | self.assertEqual(0, time_interval_since(date, date)) 81 | 82 | self.assertEqual(-371, 83 | time_interval_since(date, date + 84 | timedelta(seconds=371))) 85 | self.assertEqual(123456, time_interval_since( 86 | date, date + timedelta(seconds=-123456))) 87 | self.assertEqual(-200, 88 | time_interval_since(date, date + 89 | timedelta(seconds=200))) 90 | self.assertEqual(200, time_interval_since( 91 | date, date + timedelta(seconds=-200))) 92 | self.assertEqual(86400, time_interval_since( 93 | date, date + timedelta(seconds=-86400))) 94 | self.assertEqual(-86400, 95 | time_interval_since(date, date + 96 | timedelta(seconds=86400))) 97 | 98 | 99 | if __name__ == '__main__': 100 | unittest.main() 101 | --------------------------------------------------------------------------------