@@ -343,7 +343,7 @@ final class LoopDataManager: ObservableObject {
343343 throw LoopError . configurationError ( . basalRateSchedule)
344344 }
345345
346- let forecastEndTime = baseTime. addingTimeInterval ( InsulinMath . defaultInsulinActivityDuration) . dateCeiledToTimeInterval ( . minutes ( GlucoseMath . defaultDelta) )
346+ let forecastEndTime = baseTime. addingTimeInterval ( InsulinMath . defaultInsulinActivityDuration) . dateCeiledToTimeInterval ( GlucoseMath . defaultDelta)
347347
348348 let carbsStart = baseTime. addingTimeInterval ( CarbMath . dateAdjustmentPast + . minutes( - 1 ) ) // additional minute to handle difference in seconds between carb entry and carb ratio
349349
@@ -366,9 +366,24 @@ final class LoopDataManager: ObservableObject {
366366
367367 let glucose = try await glucoseStore. getGlucoseSamples ( start: carbsStart, end: baseTime)
368368
369- let sensitivityStart = min ( carbsStart , dosesStart )
369+ let dosesWithModel = doses . map { $0 . simpleDose ( with : insulinModel ( for : $0 . insulinType ) ) }
370370
371- let sensitivity = try await settingsProvider. getInsulinSensitivityHistory ( startDate: sensitivityStart, endDate: forecastEndTime)
371+ let recommendationInsulinModel = insulinModel ( for: deliveryDelegate? . pumpInsulinType ?? . novolog)
372+
373+ let recommendationEffectInterval = DateInterval (
374+ start: baseTime,
375+ duration: recommendationInsulinModel. effectDuration
376+ )
377+ let neededSensitivityTimeline = LoopAlgorithm . timelineIntervalForSensitivity (
378+ doses: dosesWithModel,
379+ glucoseHistoryStart: glucose. first? . startDate ?? baseTime,
380+ recommendationEffectInterval: recommendationEffectInterval
381+ )
382+
383+ let sensitivity = try await settingsProvider. getInsulinSensitivityHistory (
384+ startDate: neededSensitivityTimeline. start,
385+ endDate: neededSensitivityTimeline. end
386+ )
372387
373388 let target = try await settingsProvider. getTargetRangeHistory ( startDate: baseTime, endDate: forecastEndTime)
374389
@@ -382,7 +397,7 @@ final class LoopDataManager: ObservableObject {
382397 throw LoopError . configurationError ( . maximumBasalRatePerHour)
383398 }
384399
385- var overrides = temporaryPresetsManager. overrideHistory. getOverrideHistory ( startDate: sensitivityStart , endDate: forecastEndTime)
400+ var overrides = temporaryPresetsManager. overrideHistory. getOverrideHistory ( startDate: neededSensitivityTimeline . start , endDate: forecastEndTime)
386401
387402 // Bug (https://tidepool.atlassian.net/browse/LOOP-4759) pre-meal is not recorded in override history
388403 // So currently we handle automatic forecast by manually adding it in, and when meal bolusing, we do not do this.
@@ -433,7 +448,7 @@ final class LoopDataManager: ObservableObject {
433448
434449 return StoredDataAlgorithmInput (
435450 glucoseHistory: glucose,
436- doses: doses . map { $0 . simpleDose ( with : insulinModel ( for : $0 . insulinType ) ) } ,
451+ doses: dosesWithModel ,
437452 carbEntries: carbEntries,
438453 predictionStart: baseTime,
439454 basal: basalWithOverrides,
@@ -446,7 +461,7 @@ final class LoopDataManager: ObservableObject {
446461 useIntegralRetrospectiveCorrection: UserDefaults . standard. integralRetrospectiveCorrectionEnabled,
447462 includePositiveVelocityAndRC: true ,
448463 carbAbsorptionModel: carbAbsorptionModel,
449- recommendationInsulinModel: insulinModel ( for : deliveryDelegate ? . pumpInsulinType ?? . novolog ) ,
464+ recommendationInsulinModel: recommendationInsulinModel ,
450465 recommendationType: . manualBolus,
451466 automaticBolusApplicationFactor: effectiveBolusApplicationFactor)
452467 }
@@ -1018,6 +1033,7 @@ extension StoredDataAlgorithmInput {
10181033 carbRatio: carbRatio,
10191034 algorithmEffectsOptions: effectsOptions,
10201035 useIntegralRetrospectiveCorrection: self . useIntegralRetrospectiveCorrection,
1036+ useMidAbsorptionISF: true ,
10211037 carbAbsorptionModel: self . carbAbsorptionModel. model
10221038 )
10231039 return prediction. glucose
0 commit comments