From 40b059fa7c3a508a7970bbe89fca53998a31fed0 Mon Sep 17 00:00:00 2001 From: Paul Dickens Date: Sun, 22 Jan 2017 23:11:45 +1100 Subject: [PATCH 1/2] remove +ve momentum from bolus calculation --- Loop/Managers/LoopDataManager.swift | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Loop/Managers/LoopDataManager.swift b/Loop/Managers/LoopDataManager.swift index 394ebe78cb..a0fa8edfed 100644 --- a/Loop/Managers/LoopDataManager.swift +++ b/Loop/Managers/LoopDataManager.swift @@ -212,7 +212,7 @@ final class LoopDataManager { } } - if self.predictedGlucose == nil { + if (self.predictedGlucose == nil || self.predictedGlucoseWithoutMomentum == nil) { do { try self.updatePredictedGlucoseAndRecommendedBasal() } catch let error { @@ -336,6 +336,7 @@ final class LoopDataManager { recommendedTempBasal = nil } } + private var predictedGlucoseWithoutMomentum: [GlucoseValue]? private var retrospectivePredictedGlucose: [GlucoseValue]? { didSet { retrospectiveGlucoseEffect = [] @@ -540,6 +541,7 @@ final class LoopDataManager { } self.predictedGlucose = retrospectiveCorrectionEnabled ? predictionWithRetrospectiveEffect : prediction + self.predictedGlucoseWithoutMomentum = LoopMath.predictGlucose(glucose, effects: carbEffect, insulinEffect) guard let maxBasal = deviceDataManager.maximumBasalRatePerHour, @@ -597,6 +599,7 @@ final class LoopDataManager { private func recommendBolus() throws -> Double { guard let glucose = self.predictedGlucose, + let glucoseWithoutMomentum = self.predictedGlucoseWithoutMomentum, let maxBolus = self.deviceDataManager.maximumBolus, let glucoseTargetRange = self.deviceDataManager.glucoseTargetRangeSchedule, let insulinSensitivity = self.deviceDataManager.insulinSensitivitySchedule, @@ -617,13 +620,23 @@ final class LoopDataManager { let pendingBolusAmount: Double = lastBolus?.units ?? 0 - return max(0, DoseMath.recommendBolusFromPredictedGlucose(glucose, + let recommendedBolusWithMomentum = max(0, DoseMath.recommendBolusFromPredictedGlucose(glucose, lastTempBasal: self.lastTempBasal, maxBolus: maxBolus, glucoseTargetRange: glucoseTargetRange, insulinSensitivity: insulinSensitivity, basalRateSchedule: basalRates ) - pendingBolusAmount) + + let recommendedBolusWithoutMomentum = max(0, DoseMath.recommendBolusFromPredictedGlucose(glucoseWithoutMomentum, + lastTempBasal: self.lastTempBasal, + maxBolus: maxBolus, + glucoseTargetRange: glucoseTargetRange, + insulinSensitivity: insulinSensitivity, + basalRateSchedule: basalRates + ) - pendingBolusAmount) + + return min(recommendedBolusWithMomentum, recommendedBolusWithoutMomentum) } func getRecommendedBolus(_ resultsHandler: @escaping (_ units: Double?, _ error: Error?) -> Void) { From d9ae3dba5cb367863c9083ad96f64c9e7f7ce62f Mon Sep 17 00:00:00 2001 From: Paul Dickens Date: Thu, 26 Jan 2017 21:36:30 +1100 Subject: [PATCH 2/2] add logging, set prediction to nil when inputs change --- Loop/Managers/DiagnosticLogger+LoopKit.swift | 7 +++++-- Loop/Managers/LoopDataManager.swift | 12 +++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Loop/Managers/DiagnosticLogger+LoopKit.swift b/Loop/Managers/DiagnosticLogger+LoopKit.swift index f6e9d01925..01099258d3 100644 --- a/Loop/Managers/DiagnosticLogger+LoopKit.swift +++ b/Loop/Managers/DiagnosticLogger+LoopKit.swift @@ -26,7 +26,7 @@ extension DiagnosticLogger { addError(String(describing: message), fromSource: source) } - func addLoopStatus(startDate: Date, endDate: Date, glucose: GlucoseValue, effects: [String: [GlucoseEffect]], error: Error?, prediction: [GlucoseValue], predictionWithRetrospectiveEffect: Double, recommendedTempBasal: LoopDataManager.TempBasalRecommendation?) { + func addLoopStatus(startDate: Date, endDate: Date, glucose: GlucoseValue, effects: [String: [GlucoseEffect]], error: Error?, prediction: [GlucoseValue], predictionWithRetrospectiveEffect: Double, eventualBG: Double, eventualBGWithRetrospectiveEffect: Double, eventualBGWithoutMomentum: Double, recommendedTempBasal: LoopDataManager.TempBasalRecommendation?) { let dateFormatter = DateFormatter.ISO8601StrictDateFormatter() let unit = HKUnit.milligramsPerDeciliterUnit() @@ -57,7 +57,10 @@ extension DiagnosticLogger { "unit": unit.unitString ] }, - "prediction_retrospect_delta": predictionWithRetrospectiveEffect + "prediction_retrospect_delta": predictionWithRetrospectiveEffect, + "eventualBG": eventualBG, + "eventualBGWithRetrospectiveEffect": eventualBGWithRetrospectiveEffect, + "eventualBGWithoutMomentum": eventualBGWithoutMomentum ] if let error = error { diff --git a/Loop/Managers/LoopDataManager.swift b/Loop/Managers/LoopDataManager.swift index a0fa8edfed..25df46f8bc 100644 --- a/Loop/Managers/LoopDataManager.swift +++ b/Loop/Managers/LoopDataManager.swift @@ -305,6 +305,7 @@ final class LoopDataManager { private var carbEffect: [GlucoseEffect]? { didSet { predictedGlucose = nil + predictedGlucoseWithoutMomentum = nil // Carb data may be back-dated, so re-calculate the retrospective glucose. retrospectivePredictedGlucose = nil @@ -318,6 +319,7 @@ final class LoopDataManager { } predictedGlucose = nil + predictedGlucoseWithoutMomentum = nil } } private var insulinOnBoard: InsulinValue? @@ -510,6 +512,7 @@ final class LoopDataManager { let prediction = LoopMath.predictGlucose(glucose, momentum: momentum, effects: carbEffect, insulinEffect) let predictionWithRetrospectiveEffect = LoopMath.predictGlucose(glucose, momentum: momentum, effects: carbEffect, insulinEffect, retrospectiveGlucoseEffect) + let predictionWithoutMomentum = LoopMath.predictGlucose(glucose, effects: carbEffect, insulinEffect) let predictDiff: Double @@ -522,6 +525,10 @@ final class LoopDataManager { predictDiff = 0 } + let eventualBG: Double = prediction.last?.quantity.doubleValue(for: unit) ?? 0 + let eventualBGWithRetrospectiveEffect: Double = predictionWithRetrospectiveEffect.last?.quantity.doubleValue(for: unit) ?? 0 + let eventualBGWithoutMomentum: Double = predictionWithoutMomentum.last?.quantity.doubleValue(for: unit) ?? 0 + defer { deviceDataManager.logger.addLoopStatus( startDate: startDate, @@ -536,12 +543,15 @@ final class LoopDataManager { error: error, prediction: prediction, predictionWithRetrospectiveEffect: predictDiff, + eventualBG: eventualBG, + eventualBGWithRetrospectiveEffect: eventualBGWithRetrospectiveEffect, + eventualBGWithoutMomentum: eventualBGWithoutMomentum, recommendedTempBasal: recommendedTempBasal ) } self.predictedGlucose = retrospectiveCorrectionEnabled ? predictionWithRetrospectiveEffect : prediction - self.predictedGlucoseWithoutMomentum = LoopMath.predictGlucose(glucose, effects: carbEffect, insulinEffect) + self.predictedGlucoseWithoutMomentum = predictionWithoutMomentum guard let maxBasal = deviceDataManager.maximumBasalRatePerHour,