Skip to content

Commit 824fe6a

Browse files
authored
Merge pull request #1242 from dm61/insulin-model-delay
Insulin model delay
2 parents b944488 + 40ae183 commit 824fe6a

File tree

3 files changed

+30
-14
lines changed

3 files changed

+30
-14
lines changed

DoseMathTests/DoseMathTests.swift

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ class RecommendTempBasalTests: XCTestCase {
347347
lastTempBasal: nil
348348
)
349349

350-
XCTAssertEqual(1.425, dose!.unitsPerHour, accuracy: 1.0 / 40.0)
350+
XCTAssertEqual(1.60, dose!.unitsPerHour, accuracy: 1.0 / 40.0)
351351
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)
352352
}
353353

@@ -365,7 +365,7 @@ class RecommendTempBasalTests: XCTestCase {
365365
lastTempBasal: nil
366366
)
367367

368-
XCTAssertEqual(1.475, dose!.unitsPerHour, accuracy: 1.0 / 40.0)
368+
XCTAssertEqual(1.60, dose!.unitsPerHour, accuracy: 1.0 / 40.0)
369369
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)
370370
}
371371

@@ -588,7 +588,7 @@ class RecommendBolusTests: XCTestCase {
588588
volumeRounder: fortyIncrementsPerUnitRounder
589589
)
590590

591-
XCTAssertEqual(1.575, dose.amount)
591+
XCTAssertEqual(1.7, dose.amount)
592592

593593
if case BolusRecommendationNotice.currentGlucoseBelowTarget(let glucose) = dose.notice! {
594594
XCTAssertEqual(glucose.quantity.doubleValue(for: .milligramsPerDeciliter), 60)
@@ -657,7 +657,7 @@ class RecommendBolusTests: XCTestCase {
657657
volumeRounder: fortyIncrementsPerUnitRounder
658658
)
659659

660-
XCTAssertEqual(1.4, dose.amount)
660+
XCTAssertEqual(1.575, dose.amount)
661661
XCTAssertEqual(BolusRecommendationNotice.predictedGlucoseBelowTarget(minGlucose: glucose[1]), dose.notice!)
662662
}
663663

@@ -676,7 +676,7 @@ class RecommendBolusTests: XCTestCase {
676676
volumeRounder: fortyIncrementsPerUnitRounder
677677
)
678678

679-
XCTAssertEqual(0.575, dose.amount)
679+
XCTAssertEqual(0.7, dose.amount)
680680
}
681681

682682
func testStartVeryLowEndHigh() {
@@ -708,7 +708,7 @@ class RecommendBolusTests: XCTestCase {
708708
maxBolus: maxBolus
709709
)
710710

711-
XCTAssertEqual(1.575, dose.amount, accuracy: 1.0 / 40.0)
711+
XCTAssertEqual(1.7, dose.amount, accuracy: 1.0 / 40.0)
712712
}
713713

714714
func testHighAndFalling() {
@@ -724,7 +724,7 @@ class RecommendBolusTests: XCTestCase {
724724
maxBolus: maxBolus
725725
)
726726

727-
XCTAssertEqual(0.325, dose.amount, accuracy: 1.0 / 40.0)
727+
XCTAssertEqual(0.4, dose.amount, accuracy: 1.0 / 40.0)
728728
}
729729

730730
func testInRangeAndRising() {
@@ -740,7 +740,7 @@ class RecommendBolusTests: XCTestCase {
740740
maxBolus: maxBolus
741741
)
742742

743-
XCTAssertEqual(0.325, dose.amount, accuracy: 1.0 / 40.0)
743+
XCTAssertEqual(0.4, dose.amount, accuracy: 1.0 / 40.0)
744744

745745
// Less existing temp
746746

@@ -771,7 +771,7 @@ class RecommendBolusTests: XCTestCase {
771771
volumeRounder: fortyIncrementsPerUnitRounder
772772
)
773773

774-
XCTAssertEqual(0.275, dose.amount)
774+
XCTAssertEqual(0.375, dose.amount)
775775
}
776776

777777
func testHighAndRising() {
@@ -787,7 +787,7 @@ class RecommendBolusTests: XCTestCase {
787787
maxBolus: maxBolus
788788
)
789789

790-
XCTAssertEqual(1.25, dose.amount)
790+
XCTAssertEqual(1.35, dose.amount, accuracy: 1.0 / 40.0)
791791

792792
// Use mmol sensitivity value
793793
let insulinSensitivitySchedule = InsulinSensitivitySchedule(unit: HKUnit.millimolesPerLiter, dailyItems: [RepeatingScheduleValue(startTime: 0.0, value: 10.0 / 3)])!
@@ -802,7 +802,7 @@ class RecommendBolusTests: XCTestCase {
802802
maxBolus: maxBolus
803803
)
804804

805-
XCTAssertEqual(1.25, dose.amount, accuracy: 1.0 / 40.0)
805+
XCTAssertEqual(1.35, dose.amount, accuracy: 1.0 / 40.0)
806806
}
807807

808808
func testRiseAfterDIA() {

Loop/Managers/DoseMath.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,8 @@ extension Collection where Element: GlucoseValue {
267267
// Compute the dose required to bring this prediction to target:
268268
// dose = (Glucose Δ) / (% effect × sensitivity)
269269

270-
let percentEffected = 1 - model.percentEffectRemaining(at: time)
270+
// For 0 <= time <= effectDelay, assume a small amount effected. This will result in large unit recommendation rather than no recommendation at all.
271+
let percentEffected = Swift.max(.ulpOfOne, 1 - model.percentEffectRemaining(at: time))
271272
let effectedSensitivity = percentEffected * sensitivityValue
272273
guard let correctionUnits = insulinCorrectionUnits(
273274
fromValue: predictedGlucoseValue,
@@ -299,7 +300,7 @@ extension Collection where Element: GlucoseValue {
299300
eventual.quantity < eventualGlucoseTargets.lowerBound
300301
{
301302
let time = min.startDate.timeIntervalSince(date)
302-
// For time = 0, assume a small amount effected. This will result in large (negative) unit recommendation rather than no recommendation at all.
303+
// For 0 <= time <= effectDelay, assume a small amount effected. This will result in large (negative) unit recommendation rather than no recommendation at all.
303304
let percentEffected = Swift.max(.ulpOfOne, 1 - model.percentEffectRemaining(at: time))
304305

305306
guard let units = insulinCorrectionUnits(

LoopCore/Insulin/ExponentialInsulinModelPreset.swift

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,20 @@ extension ExponentialInsulinModelPreset {
3838
return .minutes(55)
3939
}
4040
}
41+
42+
var effectDelay: TimeInterval {
43+
switch self {
44+
case .humalogNovologAdult:
45+
return .minutes(10)
46+
case .humalogNovologChild:
47+
return .minutes(10)
48+
case .fiasp:
49+
return .minutes(10)
50+
}
51+
}
4152

4253
var model: InsulinModel {
43-
return ExponentialInsulinModel(actionDuration: actionDuration, peakActivityTime: peakActivity)
54+
return ExponentialInsulinModel(actionDuration: actionDuration, peakActivityTime: peakActivity, delay: effectDelay)
4455
}
4556
}
4657

@@ -49,6 +60,10 @@ extension ExponentialInsulinModelPreset: InsulinModel {
4960
public var effectDuration: TimeInterval {
5061
return model.effectDuration
5162
}
63+
64+
public var delay: TimeInterval {
65+
return model.delay
66+
}
5267

5368
public func percentEffectRemaining(at time: TimeInterval) -> Double {
5469
return model.percentEffectRemaining(at: time)

0 commit comments

Comments
 (0)