Przeglądaj źródła

Merge pull request #567 from nightscout/oref-swift-temptarget-for-determine-basal

Small updates to the oref-swift `determineBasal` function to round out the current implementation
Sam King 9 miesięcy temu
rodzic
commit
854fbf28fa

+ 35 - 1
Trio/Sources/APS/OpenAPSSwift/DetermineBasal/DetermineBasal+Helpers.swift

@@ -267,7 +267,12 @@ extension DeterminationGenerator {
         currentBasalRate * sensitivityRatio
     }
 
-    static func computeAdjustedSensitivity(sensitivity: Decimal, sensitivityRatio: Decimal) -> Decimal {
+    static func computeAdjustedSensitivity(
+        sensitivity: Decimal,
+        sensitivityRatio: Decimal,
+        trioCustomOrefVariables: TrioCustomOrefVariables
+    ) -> Decimal {
+        let sensitivity = trioCustomOrefVariables.override(sensitivity: sensitivity)
         guard sensitivityRatio != 1.0 else { return sensitivity }
         return (sensitivity / sensitivityRatio).rounded(toPlaces: 1)
     }
@@ -303,6 +308,7 @@ extension DeterminationGenerator {
     static func adjustGlucoseTargets(
         profile: Profile,
         autosens: Autosens?,
+        trioCustomOrefVariables: TrioCustomOrefVariables,
         temptargetSet: Bool,
         targetGlucose: Decimal,
         minGlucose: Decimal,
@@ -313,6 +319,13 @@ extension DeterminationGenerator {
         var maxGlucose = maxGlucose
         var targetGlucose = targetGlucose
 
+        // Apply profile override first
+        if let overrideTarget = profile.profileTarget(trioCustomOrefVariables: trioCustomOrefVariables) {
+            targetGlucose = overrideTarget
+            minGlucose = overrideTarget
+            maxGlucose = overrideTarget
+        }
+
         // Only adjust glucose targets for autosens if no temp target set
         if !temptargetSet, let autosens = autosens {
             if (profile.sensitivityRaisesTarget && autosens.ratio < 1) ||
@@ -371,4 +384,25 @@ extension Profile {
 
         return minBg
     }
+
+    /// Calculates the profile ISF at this point in time and applies any overrides to it
+    func profileSensitivity(at: Date, trioCustomOrefVaribales: TrioCustomOrefVariables) -> Decimal {
+        let sensitivity = sensitivityFor(time: at)
+        return trioCustomOrefVaribales.override(sensitivity: sensitivity)
+    }
+}
+
+extension TrioCustomOrefVariables {
+    func override(sensitivity: Decimal) -> Decimal {
+        if useOverride {
+            let overrideFactor = overridePercentage / 100
+            if isfAndCr || isf {
+                return sensitivity / overrideFactor
+            } else {
+                return sensitivity
+            }
+        } else {
+            return sensitivity
+        }
+    }
 }

+ 23 - 14
Trio/Sources/APS/OpenAPSSwift/DetermineBasal/DetermineBasalGenerator.swift

@@ -47,7 +47,6 @@ enum DeterminationGenerator {
             return errorDetermination
         }
 
-        let sensitivityRatio: Decimal
         let dynamicIsfResult = DynamicISF.calculate(
             profile: profile,
             preferences: preferences,
@@ -57,21 +56,19 @@ enum DeterminationGenerator {
 
         // TODO: We need to add the dynamicIsfResult to our forcasting functions
         if let dynamicIsfResult = dynamicIsfResult {
-            sensitivityRatio = dynamicIsfResult.ratio
             autosensData = Autosens(
                 ratio: dynamicIsfResult.ratio,
                 newisf: autosensData.newisf,
                 deviationsUnsorted: autosensData.deviationsUnsorted,
                 timestamp: autosensData.timestamp
             )
-        } else {
-            sensitivityRatio = calculateSensitivityRatio(
-                profile: profile,
-                autosens: autosensData,
-                targetGlucose: profile.profileTarget(trioCustomOrefVariables: trioCustomOrefVariables) ?? 120,
-                temptargetSet: profile.temptargetSet ?? false
-            )
         }
+        let sensitivityRatio = calculateSensitivityRatio(
+            profile: profile,
+            autosens: autosensData,
+            targetGlucose: profile.profileTarget(trioCustomOrefVariables: trioCustomOrefVariables) ?? 120,
+            temptargetSet: profile.temptargetSet ?? false
+        )
 
         let basal: Decimal
         if let dynamicIsfResult = dynamicIsfResult, profile.tddAdjBasal {
@@ -85,9 +82,11 @@ enum DeterminationGenerator {
                 sensitivityRatio: sensitivityRatio
             )
         }
+
         let sensitivity = computeAdjustedSensitivity(
             sensitivity: profile.sens ?? profile.sensitivityFor(time: currentTime),
-            sensitivityRatio: sensitivityRatio
+            sensitivityRatio: sensitivityRatio,
+            trioCustomOrefVariables: trioCustomOrefVariables
         )
 
         // Safety check: current temp vs. last temp in iob
@@ -137,8 +136,9 @@ enum DeterminationGenerator {
         let (adjustedGlucoseTargets, threshold) = adjustGlucoseTargets(
             profile: profile,
             autosens: autosensData,
+            trioCustomOrefVariables: trioCustomOrefVariables,
             temptargetSet: profile.temptargetSet ?? false,
-            targetGlucose: profile.targetBg ?? 100, // TODO: grab from therapy settings
+            targetGlucose: profile.minBg ?? 100,
             minGlucose: profile.minBg ?? 70, // TODO: can we force unwrap?
             maxGlucose: profile.maxBg ?? 180,
             noise: 1
@@ -179,8 +179,17 @@ enum DeterminationGenerator {
             naiveEventualGlucose = (currentGlucose - (currentIob * sensitivity)).rounded(toPlaces: 0)
         } else {
             naiveEventualGlucose =
-                (currentGlucose - (currentIob * min(profile.sens ?? profile.sensitivityFor(time: currentTime), sensitivity)))
-                    .rounded(toPlaces: 0)
+                (
+                    currentGlucose -
+                        (
+                            currentIob *
+                                min(
+                                    profile.profileSensitivity(at: currentTime, trioCustomOrefVaribales: trioCustomOrefVariables),
+                                    sensitivity
+                                )
+                        )
+                )
+                .rounded(toPlaces: 0)
         }
 
         let eventualGlucose = naiveEventualGlucose + deviation
@@ -207,7 +216,7 @@ enum DeterminationGenerator {
 
         // used for pre dosing decision sanity later on
         let expectedDelta = calculateExpectedDelta(
-            targetGlucose: profile.minBg ?? 100,
+            targetGlucose: adjustedGlucoseTargets.targetGlucose,
             eventualGlucose: eventualGlucose,
             glucoseImpact: currentGlucoseImpact
         )

+ 1 - 6
Trio/Sources/APS/OpenAPSSwift/DynamicISF.swift

@@ -42,12 +42,7 @@ enum DynamicISF {
             return nil
         }
 
-        if trioCustomOrefVariables.useOverride {
-            let overrideFactor = trioCustomOrefVariables.overridePercentage / 100
-            if trioCustomOrefVariables.isfAndCr || trioCustomOrefVariables.isf {
-                sensitivity = sensitivity / overrideFactor
-            }
-        }
+        sensitivity = trioCustomOrefVariables.override(sensitivity: sensitivity)
 
         let minLimit = min(profile.autosensMin, profile.autosensMax)
         let maxLimit = max(profile.autosensMin, profile.autosensMax)