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

Fix bugs in oref iob implementation for testing bundle

This commit fixes two bugs in the testing iob implementation:
  - Adds filtering for future suspend / resume events
  - Uses the correct timestamp for temp bolus creation on suspends
Sam King 10 месяцев назад
Родитель
Сommit
950afd045d

+ 4 - 0
Trio.xcodeproj/project.pbxproj

@@ -314,6 +314,7 @@
 		3BD9687F2D8DDD8800899469 /* CryptoSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 3BD9687E2D8DDD8800899469 /* CryptoSwift */; };
 		3BE2F1E82E030E2F009E2900 /* MealCobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE2F1E72E030E2F009E2900 /* MealCobTests.swift */; };
 		3BE2F1EA2E031951009E2900 /* MealCobBucketingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE2F1E92E031951009E2900 /* MealCobBucketingTests.swift */; };
+		3BE4C0DB2E17549E00C8520C /* as_error_iob_inputs.json in Resources */ = {isa = PBXBuildFile; fileRef = 3BE4C0DA2E17549E00C8520C /* as_error_iob_inputs.json */; };
 		3BEA3AE02D58F79700A67A1D /* OrefFunction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA3ADE2D58F79700A67A1D /* OrefFunction.swift */; };
 		3BEA3AE12D58F79700A67A1D /* AlgorithmComparison.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA3ADB2D58F79700A67A1D /* AlgorithmComparison.swift */; };
 		3BEA3AE22D58F79700A67A1D /* JsSwiftOrefComparisonLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BEA3ADD2D58F79700A67A1D /* JsSwiftOrefComparisonLogger.swift */; };
@@ -1225,6 +1226,7 @@
 		3BDEA2DC60EDE0A3CA54DC73 /* TargetsEditorProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TargetsEditorProvider.swift; sourceTree = "<group>"; };
 		3BE2F1E72E030E2F009E2900 /* MealCobTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MealCobTests.swift; sourceTree = "<group>"; };
 		3BE2F1E92E031951009E2900 /* MealCobBucketingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MealCobBucketingTests.swift; sourceTree = "<group>"; };
+		3BE4C0DA2E17549E00C8520C /* as_error_iob_inputs.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = as_error_iob_inputs.json; sourceTree = "<group>"; };
 		3BEA3ADB2D58F79700A67A1D /* AlgorithmComparison.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlgorithmComparison.swift; sourceTree = "<group>"; };
 		3BEA3ADC2D58F79700A67A1D /* JSONCompare.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONCompare.swift; sourceTree = "<group>"; };
 		3BEA3ADD2D58F79700A67A1D /* JsSwiftOrefComparisonLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JsSwiftOrefComparisonLogger.swift; sourceTree = "<group>"; };
@@ -2807,6 +2809,7 @@
 			isa = PBXGroup;
 			children = (
 				3B8B5D2C2DF5234C00365ED3 /* autosens */,
+				3BE4C0DA2E17549E00C8520C /* as_error_iob_inputs.json */,
 				3BF92F392D86F1AA006B545A /* iob-error-log.json */,
 			);
 			path = json;
@@ -4396,6 +4399,7 @@
 				3BF92F322D86DEE9006B545A /* glucose-get-last.js in Resources */,
 				3BF92F332D86DEE9006B545A /* iob.js in Resources */,
 				3BF92F352D86DEE9006B545A /* basal-set-temp.js in Resources */,
+				3BE4C0DB2E17549E00C8520C /* as_error_iob_inputs.json in Resources */,
 				3BF92F362D86DEE9006B545A /* autotune-core.js in Resources */,
 				3BC0AA3B2DA74C87000DF7B7 /* iob-total.js in Resources */,
 				3BC0AA3E2DA817EC000DF7B7 /* iob-calculate.js in Resources */,

+ 4 - 0
Trio/Sources/APS/OpenAPSSwift/Extensions/Decimal+rounding.swift

@@ -25,6 +25,10 @@ extension Decimal {
         return (self * multiplier + 0.5).rounded(scale: 0, roundingMode: .down) / multiplier
     }
 
+    func jsRounded() -> Decimal {
+        jsRounded(scale: 0)
+    }
+
     func clamp(lowerBound: Decimal, upperBound: Decimal) -> Decimal {
         if self < lowerBound {
             return lowerBound

+ 6 - 6
Trio/Sources/APS/OpenAPSSwift/Iob/IobCalculation.swift

@@ -107,12 +107,12 @@ enum IobCalculation {
         }
 
         return IobTotal(
-            iob: iob.rounded(scale: 3),
-            activity: activity.rounded(scale: 4),
-            basaliob: basaliob.rounded(scale: 3),
-            bolusiob: bolusiob.rounded(scale: 3),
-            netbasalinsulin: netbasalinsulin.rounded(scale: 3),
-            bolusinsulin: bolusinsulin.rounded(scale: 3),
+            iob: iob.jsRounded(scale: 3),
+            activity: activity.jsRounded(scale: 4),
+            basaliob: basaliob.jsRounded(scale: 3),
+            bolusiob: bolusiob.jsRounded(scale: 3),
+            netbasalinsulin: netbasalinsulin.jsRounded(scale: 3),
+            bolusinsulin: bolusinsulin.jsRounded(scale: 3),
             time: now
         )
     }

+ 33 - 2
TrioTests/OpenAPSSwiftTests/AutosensJsonTests.swift

@@ -160,7 +160,7 @@ import Testing
         "should produce same results for autosens for fixed JS",
         .enabled(if: ReplayTests.enabled)
     ) func replayErrorInputs() async throws {
-        let timezone = "Europe/Berlin"
+        let timezone = "America/Los_Angeles"
         var skippedTimezones = Set<String>()
         let files = try await HttpFiles.listFiles()
         for filePath in files {
@@ -199,7 +199,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/4f38ce73-1526-4bcd-80d5-1dee5b002519.0.json")
+        let algorithmComparison = try await HttpFiles.downloadFile(at: "/files/b1d693c2-6432-4742-bc68-aebf02386229.0.json")
         let autosensInputs = algorithmComparison.autosensInput!
 
         let encoder = JSONCoding.encoder
@@ -242,4 +242,35 @@ import Testing
 
         timeZoneForTests.resetTimezone()
     }
+
+    @Test(
+        "Testing IoB difference with Autosens",
+        .enabled(if: ReplayTests.enabled)
+    ) func testAutosensErrorWithIoB() async throws {
+        let currentBasalRate = Decimal(0.55)
+        let currentGlucoseDate = Date("2025-06-27T13:56:54.596Z")!
+        let iobInputs: IobInputs = try loadJson("as_error_iob_inputs")
+
+        let treatments = try IobHistory.calcTempTreatments(
+            history: iobInputs.history.map({ $0.computedEvent() }),
+            profile: iobInputs.profile,
+            clock: iobInputs.clock,
+            autosens: nil,
+            zeroTempDuration: nil
+        )
+
+        let encoder = JSONCoding.encoder
+        let output = try encoder.encode(treatments)
+
+        let sharedDir = FileManager.default.temporaryDirectory
+        let outputURL = sharedDir.appendingPathComponent("treatments-swift.json")
+        try output.write(to: outputURL)
+        print("WROTE FILE TO: \(outputURL.path)")
+
+        var simulatedProfile = iobInputs.profile
+        simulatedProfile.currentBasal = currentBasalRate
+        simulatedProfile.temptargetSet = false
+        let iob = try IobCalculation.iobTotal(treatments: treatments, profile: simulatedProfile, time: currentGlucoseDate)
+        print(iob)
+    }
 }

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
TrioTests/OpenAPSSwiftTests/javascript/bundle/autosens.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
TrioTests/OpenAPSSwiftTests/javascript/bundle/autotune-prep.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
TrioTests/OpenAPSSwiftTests/javascript/bundle/iob-history.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
TrioTests/OpenAPSSwiftTests/javascript/bundle/iob.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
TrioTests/OpenAPSSwiftTests/javascript/bundle/meal.js


Разница между файлами не показана из-за своего большого размера
+ 2990 - 0
TrioTests/OpenAPSSwiftTests/json/as_error_iob_inputs.json