Просмотр исходного кода

Make UAM and COB forecasts optional and add logic to omit when needed

Sam King 9 месяцев назад
Родитель
Сommit
dc48295529

+ 2 - 2
Trio/Sources/APS/OpenAPSSwift/DetermineBasal/DetermineBasalGenerator.swift

@@ -254,8 +254,8 @@ enum DeterminationGenerator {
             predictions: Predictions(
                 iob: forecastResult.iob.map { Int($0.jsRounded()) },
                 zt: forecastResult.zt.map { Int($0.jsRounded()) },
-                cob: forecastResult.cob.map { Int($0.jsRounded()) },
-                uam: forecastResult.uam.map { Int($0.jsRounded()) }
+                cob: forecastResult.cob?.map { Int($0.jsRounded()) },
+                uam: forecastResult.uam?.map { Int($0.jsRounded()) }
             ),
             deliverAt: currentTime,
             carbsReq: nil,

+ 12 - 2
Trio/Sources/APS/OpenAPSSwift/Forecasts/ForecastGenerator.swift

@@ -128,10 +128,20 @@ enum ForecastGenerator {
          }
           */
 
+        var finalCobForecast: [Decimal]?
+        if mealData.mealCOB > 0, carbImpact > 0 || carbImpactParams.remainingCarbImpactPeak > 0 {
+            finalCobForecast = cobForecast
+        }
+
+        var finalUamForecast: [Decimal]?
+        if profile.enableUAM, carbImpact > 0 || carbImpactParams.remainingCarbImpactPeak > 0 {
+            finalUamForecast = uamForecast
+        }
+
         return ForecastResult(
             iob: iobForecast,
-            cob: cobForecast,
-            uam: uamForecast,
+            cob: finalCobForecast,
+            uam: finalUamForecast,
             zt: ztForecast,
             eventualGlucose: eventualGlucose,
             minForecastedGlucose: blendedForecasts.minForecastedGlucose,

+ 2 - 2
Trio/Sources/APS/OpenAPSSwift/Models/ForecastResult.swift

@@ -2,8 +2,8 @@ import Foundation
 
 struct ForecastResult {
     public let iob: [Decimal]
-    public let cob: [Decimal]
-    public let uam: [Decimal]
+    public let cob: [Decimal]?
+    public let uam: [Decimal]?
     public let zt: [Decimal]
     public let eventualGlucose: Decimal
     public let minForecastedGlucose: Decimal

+ 7 - 3
TrioTests/OpenAPSSwiftTests/DetermineBasalJsonTests.swift

@@ -103,7 +103,7 @@ import Testing
         // this test is meant for one-off analysis so it's ok to hard code
         // a file, just make sure to _not_ check in updates to this to
         // avoid polluting our change logs
-        let algorithmComparison = try await HttpFiles.downloadFile(at: "/files/93450f65-2c8e-4c39-94b3-bf73309a7402.2.json")
+        let algorithmComparison = try await HttpFiles.downloadFile(at: "/files/e914bd84-3cf5-4f89-bb6c-996f41cd505e.2.json")
         let determineBasalInput = algorithmComparison.determineBasalInput!
 
         let encoder = JSONCoding.encoder
@@ -194,9 +194,13 @@ import Testing
         let swift = forecasts.swift.toDictionary()
 
         for forecastType in ["IOB", "ZT", "UAM", "COB"] {
-            let swiftForecast = swift[forecastType]!.toIntArray()
-            let jsForecast = js[forecastType]!.toIntArray()
             print("")
+            guard let swiftForecast = swift[forecastType]?.toIntArray(),
+                  let jsForecast = js[forecastType]?.toIntArray()
+            else {
+                print("missing \(forecastType) forecast, skipping")
+                continue
+            }
             if swiftForecast.count == jsForecast.count {
                 print(forecastType)
             } else {