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

Remove manualBolusErrorString

Since Trio doesn't use manualBolusErrorString, we are removing it from
the determination to help simplify the dosing logic. This commit also
removes a unit test from low eventual glucose that we meant to remove
previously as we instead switch to unit tests vs going through
determineBasal.
Sam King 10 месяцев назад
Родитель
Сommit
711b77b4fd

+ 0 - 8
Model/JSONImporter.swift

@@ -518,8 +518,6 @@ extension Determination: Codable {
         case isf = "ISF"
         case current_target
         case tdd = "TDD"
-        case insulinForManualBolus
-        case manualBolusErrorString
         case minDelta
         case expectedDelta
         case minGuardBG
@@ -553,7 +551,6 @@ extension Determination: Codable {
         isf = try container.decodeIfPresent(Decimal.self, forKey: .isf)
         current_target = try container.decodeIfPresent(Decimal.self, forKey: .current_target)
         tdd = try container.decodeIfPresent(Decimal.self, forKey: .tdd)
-        manualBolusErrorString = try container.decodeIfPresent(Decimal.self, forKey: .manualBolusErrorString)
         minDelta = try container.decodeIfPresent(Decimal.self, forKey: .minDelta)
         expectedDelta = try container.decodeIfPresent(Decimal.self, forKey: .expectedDelta)
         minGuardBG = try container.decodeIfPresent(Decimal.self, forKey: .minGuardBG)
@@ -594,7 +591,6 @@ extension Determination: Codable {
         try container.encodeIfPresent(isf, forKey: .isf)
         try container.encodeIfPresent(current_target, forKey: .current_target)
         try container.encodeIfPresent(tdd, forKey: .tdd)
-        try container.encodeIfPresent(manualBolusErrorString, forKey: .manualBolusErrorString)
         try container.encodeIfPresent(minDelta, forKey: .minDelta)
         try container.encodeIfPresent(expectedDelta, forKey: .expectedDelta)
         try container.encodeIfPresent(minGuardBG, forKey: .minGuardBG)
@@ -632,9 +628,6 @@ extension Determination: Codable {
         guard let isf = isf else {
             throw JSONImporterError.missingRequiredPropertyInDetermination("ISF")
         }
-        guard let manualBolusErrorString = manualBolusErrorString else {
-            throw JSONImporterError.missingRequiredPropertyInDetermination("manualBolusErrorString")
-        }
         guard let cob = cob else {
             throw JSONImporterError.missingRequiredPropertyInDetermination("COB")
         }
@@ -685,7 +678,6 @@ extension Determination: Codable {
         newOrefDetermination.sensitivityRatio = decimalToNSDecimalNumber(sensitivityRatio)
         newOrefDetermination.expectedDelta = decimalToNSDecimalNumber(expectedDelta)
         newOrefDetermination.cob = Int16(Int(cob ?? 0))
-        newOrefDetermination.manualBolusErrorString = decimalToNSDecimalNumber(manualBolusErrorString)
         newOrefDetermination.smbToDeliver = units.map { NSDecimalNumber(decimal: $0) }
         newOrefDetermination.carbsRequired = Int16(Int(carbsReq ?? 0))
         newOrefDetermination.isUploadedToNS = true

+ 0 - 4
Trio.xcodeproj/project.pbxproj

@@ -663,7 +663,6 @@
 		DD30BA162E0780A500DA677C /* AdjustedGlucoseTargets.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD30BA152E0780A500DA677C /* AdjustedGlucoseTargets.swift */; };
 		DD30BA182E078F8900DA677C /* ComputedInsulinSensitivities+Getter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD30BA172E078F8100DA677C /* ComputedInsulinSensitivities+Getter.swift */; };
 		DD30BA1A2E08AB9F00DA677C /* CarbImpactParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD30BA192E08AB9F00DA677C /* CarbImpactParams.swift */; };
-		DD30BA1C2E08BA8800DA677C /* DetermineBasal+Dosing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD30BA1B2E08BA8100DA677C /* DetermineBasal+Dosing.swift */; };
 		DD32CF982CC82463003686D6 /* TrioRemoteControl+Bolus.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD32CF972CC82460003686D6 /* TrioRemoteControl+Bolus.swift */; };
 		DD32CF9A2CC8247B003686D6 /* TrioRemoteControl+Meal.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD32CF992CC8246F003686D6 /* TrioRemoteControl+Meal.swift */; };
 		DD32CF9C2CC82499003686D6 /* TrioRemoteControl+TempTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD32CF9B2CC82495003686D6 /* TrioRemoteControl+TempTarget.swift */; };
@@ -1598,7 +1597,6 @@
 		DD30BA152E0780A500DA677C /* AdjustedGlucoseTargets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdjustedGlucoseTargets.swift; sourceTree = "<group>"; };
 		DD30BA172E078F8100DA677C /* ComputedInsulinSensitivities+Getter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ComputedInsulinSensitivities+Getter.swift"; sourceTree = "<group>"; };
 		DD30BA192E08AB9F00DA677C /* CarbImpactParams.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarbImpactParams.swift; sourceTree = "<group>"; };
-		DD30BA1B2E08BA8100DA677C /* DetermineBasal+Dosing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DetermineBasal+Dosing.swift"; sourceTree = "<group>"; };
 		DD32CF972CC82460003686D6 /* TrioRemoteControl+Bolus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TrioRemoteControl+Bolus.swift"; sourceTree = "<group>"; };
 		DD32CF992CC8246F003686D6 /* TrioRemoteControl+Meal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TrioRemoteControl+Meal.swift"; sourceTree = "<group>"; };
 		DD32CF9B2CC82495003686D6 /* TrioRemoteControl+TempTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TrioRemoteControl+TempTarget.swift"; sourceTree = "<group>"; };
@@ -3765,7 +3763,6 @@
 			isa = PBXGroup;
 			children = (
 				DD30BA072E076CAA00DA677C /* DeterminationError.swift */,
-				DD30BA1B2E08BA8100DA677C /* DetermineBasal+Dosing.swift */,
 				DD30BA052E07667000DA677C /* DetermineBasal+Helpers.swift */,
 				DD30B9C62E06257300DA677C /* DetermineBasalGenerator.swift */,
 				3BAE876D2E47F12900FCA8D2 /* DosingEngine.swift */,
@@ -5107,7 +5104,6 @@
 				583684062BD178DB00070A60 /* GlucoseStored+helper.swift in Sources */,
 				49B9B57F2D5768D2009C6B59 /* AdjustmentStored+Helper.swift in Sources */,
 				F90692D6274B9A450037068D /* HealthKitStateModel.swift in Sources */,
-				DD30BA1C2E08BA8800DA677C /* DetermineBasal+Dosing.swift in Sources */,
 				BD1661312B82ADAB00256551 /* CustomProgressView.swift in Sources */,
 				C967DACD3B1E638F8B43BE06 /* ManualTempBasalStateModel.swift in Sources */,
 				38E4453B274E411700EC9A94 /* Disk+VolumeInformation.swift in Sources */,

+ 0 - 1
Trio/Sources/APS/OpenAPS/OpenAPS.swift

@@ -54,7 +54,6 @@ final class OpenAPS {
             newOrefDetermination.sensitivityRatio = self.decimalToNSDecimalNumber(determination.sensitivityRatio)
             newOrefDetermination.expectedDelta = self.decimalToNSDecimalNumber(determination.expectedDelta)
             newOrefDetermination.cob = Int16(Int(determination.cob ?? 0))
-            newOrefDetermination.manualBolusErrorString = self.decimalToNSDecimalNumber(determination.manualBolusErrorString)
             newOrefDetermination.smbToDeliver = determination.units.map { NSDecimalNumber(decimal: $0) }
             newOrefDetermination.carbsRequired = Int16(Int(determination.carbsReq ?? 0))
             newOrefDetermination.isUploadedToNS = false

+ 0 - 31
Trio/Sources/APS/OpenAPSSwift/DetermineBasal/DetermineBasal+Dosing.swift

@@ -1,31 +0,0 @@
-import Foundation
-
-extension DeterminationGenerator {
-    struct DosingMetrics {
-        var rate: Decimal?
-        var duration: Decimal?
-        var units: Decimal? // microbolus
-        var insulinReq: Decimal?
-        var carbsReq: Decimal?
-        var reason: String
-        var manualBolusErrorString: Int?
-        var insulinForManualBolus: Decimal?
-        var minGuardBG: Decimal?
-        var minPredBG: Decimal?
-        var smbEnabled: Bool
-    }
-
-    static func determineDosing(
-        profile _: Profile,
-        currentTemp _: TempBasal,
-        iobData _: IobResult,
-        mealData _: ComputedCarbs,
-        autosensData _: Autosens,
-        forecastResult _: ForecastResult,
-        glucoseStatus _: GlucoseStatus,
-        enableSMB _: Bool,
-        currentTime _: Date
-    ) -> DosingMetrics? {
-        nil
-    }
-}

+ 0 - 5
Trio/Sources/APS/OpenAPSSwift/DetermineBasal/DetermineBasalGenerator.swift

@@ -109,7 +109,6 @@ enum DeterminationGenerator {
                 timestamp: currentTime,
                 tdd: nil,
                 current_target: profile.targetBg,
-                manualBolusErrorString: nil,
                 minDelta: nil,
                 expectedDelta: nil,
                 minGuardBG: nil,
@@ -326,7 +325,6 @@ enum DeterminationGenerator {
             timestamp: currentTime,
             tdd: nil,
             current_target: nil,
-            manualBolusErrorString: smbDecision.manualBolusError.map { Decimal($0) },
             minDelta: nil,
             expectedDelta: expectedDelta,
             minGuardBG: smbDecision.minGuardGlucose ?? forecastResult.minGuardGlucose,
@@ -510,7 +508,6 @@ enum DeterminationGenerator {
                 timestamp: currentTime,
                 tdd: nil,
                 current_target: profile.targetBg,
-                manualBolusErrorString: nil,
                 minDelta: minDelta,
                 expectedDelta: nil,
                 minGuardBG: nil,
@@ -543,7 +540,6 @@ enum DeterminationGenerator {
                 timestamp: currentTime,
                 tdd: nil,
                 current_target: profile.targetBg,
-                manualBolusErrorString: nil,
                 minDelta: minDelta,
                 expectedDelta: nil,
                 minGuardBG: nil,
@@ -576,7 +572,6 @@ enum DeterminationGenerator {
                 timestamp: currentTime,
                 tdd: nil,
                 current_target: profile.targetBg,
-                manualBolusErrorString: nil,
                 minDelta: minDelta,
                 expectedDelta: nil,
                 minGuardBG: nil,

+ 0 - 5
Trio/Sources/APS/OpenAPSSwift/DetermineBasal/DosingEngine.swift

@@ -9,7 +9,6 @@ enum DosingEngine {
     /// struct to keep the relevant state needed for the output of the SMB decision logic
     struct SMBDecision {
         let isEnabled: Bool
-        let manualBolusError: Int?
         let minGuardGlucose: Decimal?
         let reason: String?
     }
@@ -129,11 +128,9 @@ enum DosingEngine {
         // function in JS but we should keep all of the smb enabling logic
         // in one place. Note: We can't shortcut the return value because
         // the determineBasal logic always evaluates this logic
-        var manualBolusError: Int?
         var minGuardGlucoseDecision: Decimal?
         var reason: String?
         if smbIsEnabled, minGuardGlucose < threshold {
-            manualBolusError = 1
             minGuardGlucoseDecision = minGuardGlucose
             smbIsEnabled = false
         }
@@ -147,7 +144,6 @@ enum DosingEngine {
 
         return SMBDecision(
             isEnabled: smbIsEnabled,
-            manualBolusError: manualBolusError,
             minGuardGlucose: minGuardGlucoseDecision,
             reason: reason
         )
@@ -313,7 +309,6 @@ enum DosingEngine {
 
             let glucoseUndershoot = targetGlucose - minGuardGlucose
             if minGuardGlucose < threshold {
-                newDetermination.manualBolusErrorString = 2
                 newDetermination.minGuardBG = minGuardGlucose
             }
 

+ 3 - 2
Trio/Sources/APS/OpenAPSSwift/Logging/OrefFunction.swift

@@ -57,11 +57,12 @@ enum OrefFunction: String, Codable {
                 "ISF",
                 "current_target",
                 "TDD",
-                "insulinForManualBolus",
-                "manualBolusErrorString",
                 "minDelta",
                 "received",
                 "reason",
+                // intentionally removed from Swift, but in JS
+                "insulinForManualBolus",
+                "manualBolusErrorString",
                 // in JS but not in Swift
                 "tick",
                 "BGI",

+ 0 - 1
Trio/Sources/APS/Storage/DeterminationStorage.swift

@@ -183,7 +183,6 @@ final class BaseDeterminationStorage: DeterminationStorage, Injectable {
                         isf: self.decimal(from: orefDetermination.insulinSensitivity),
                         timestamp: orefDetermination.timestamp,
                         current_target: self.decimal(from: orefDetermination.currentTarget),
-                        manualBolusErrorString: self.decimal(from: orefDetermination.manualBolusErrorString),
                         minDelta: self.decimal(from: orefDetermination.minDelta),
                         expectedDelta: self.decimal(from: orefDetermination.expectedDelta),
                         minGuardBG: nil,

+ 0 - 2
Trio/Sources/Models/Determination.swift

@@ -29,7 +29,6 @@ struct Determination: JSON, Equatable {
     var tdd: Decimal?
 
     var current_target: Decimal?
-    var manualBolusErrorString: Decimal?
     var minDelta: Decimal?
     var expectedDelta: Decimal?
     var minGuardBG: Decimal?
@@ -69,7 +68,6 @@ extension Determination {
         case current_target
         case tdd = "TDD"
         case insulinForManualBolus
-        case manualBolusErrorString
         case minDelta
         case expectedDelta
         case minGuardBG

+ 0 - 1
Trio/Sources/Modules/Treatments/TreatmentsStateModel.swift

@@ -875,7 +875,6 @@ extension Treatments.StateModel {
                     carbsReq: 0,
                     temp: nil,
                     reservoir: 0,
-                    manualBolusErrorString: 0,
                     carbRatio: 0,
                     received: false
                 )

+ 0 - 1
TrioTests/JSONImporterTests.swift

@@ -276,7 +276,6 @@ class BundleReference {}
         #expect(determination.reservoir == Decimal(string: "3735928559").map(NSDecimalNumber.init))
         #expect(determination.insulinSensitivity == Decimal(string: "4.6").map(NSDecimalNumber.init))
         #expect(determination.currentTarget == Decimal(string: "94").map(NSDecimalNumber.init))
-        #expect(determination.manualBolusErrorString == Decimal(string: "0").map(NSDecimalNumber.init))
         #expect(determination.minDelta == NSDecimalNumber(5))
         #expect(determination.expectedDelta == Decimal(string: "-5.9").map(NSDecimalNumber.init))
         #expect(determination.threshold == Decimal(string: "3.7").map(NSDecimalNumber.init))

+ 0 - 1
TrioTests/OpenAPSSwiftTests/DetermineBasalEnableSmbTests.swift

@@ -155,7 +155,6 @@ import Testing
             trioCustomOrefVariables: inputs.trioCustomOrefVariables, clock: inputs.clock
         )
         #expect(decision.isEnabled == false)
-        #expect(decision.manualBolusError == 1)
         #expect(decision.minGuardGlucose == 65)
     }
 

+ 1 - 153
TrioTests/OpenAPSSwiftTests/DetermineBasalLowEventualGlucoseTests.swift

@@ -2,161 +2,10 @@ import Foundation
 import Testing
 @testable import Trio
 
-@Suite("DetermineBasal low eventual glucose") struct DetermineBasalLowEventualGlucoseTests {
-    // Helper to create a mock IOB array with linear decay for testing purposes
-    private func mockIobArray(iob: Decimal, activity: Decimal, currentTime: Date) -> [IobResult] {
-        (0 ..< 48).map { i in
-            IobResult(
-                iob: iob - (activity * Decimal(i)),
-                activity: activity,
-                basaliob: 0,
-                bolusiob: 0,
-                netbasalinsulin: 0,
-                bolusinsulin: 0,
-                time: currentTime,
-                iobWithZeroTemp: IobResult.IobWithZeroTemp(
-                    iob: 0, activity: 0, basaliob: 0, bolusiob: 0, netbasalinsulin: 0, bolusinsulin: 0, time: currentTime
-                ),
-                lastBolusTime: nil,
-                lastTemp: IobResult.LastTemp(
-                    rate: 0,
-                    timestamp: currentTime,
-                    started_at: currentTime,
-                    date: UInt64(currentTime.timeIntervalSince1970 * 1000),
-                    duration: 0
-                )
-            )
-        }
-    }
-
-    private func createDefaultInputs(currentTime: Date = Date()) -> (
-        profile: Profile,
-        preferences: Preferences,
-        currentTemp: TempBasal,
-        iobData: [IobResult],
-        mealData: ComputedCarbs,
-        autosensData: Autosens,
-        reservoirData: Decimal,
-        glucoseStatus: GlucoseStatus,
-        trioCustomOrefVariables: TrioCustomOrefVariables,
-        currentTime: Date
-    ) {
-        var profile = Profile()
-        profile.maxIob = 2.5
-        profile.dia = 3
-        profile.currentBasal = 1.0
-        profile.maxDailyBasal = 1.3
-        profile.maxBasal = 3.5
-        profile.maxBg = 120
-        profile.minBg = 100
-        profile.sens = 50
-        profile.carbRatio = 10
-        profile.thresholdSetting = 80
-        profile.temptargetSet = false
-        profile.bolusIncrement = 0.1
-        profile.useCustomPeakTime = false
-        profile.curve = .rapidActing
-        profile.enableUAM = false // Important for these tests
-
-        var preferences = Preferences()
-        preferences.useNewFormula = false
-        preferences.sigmoid = false
-        preferences.adjustmentFactor = 0.8
-        preferences.adjustmentFactorSigmoid = 0.5
-        preferences.curve = .rapidActing
-        preferences.useCustomPeakTime = false
-
-        let currentTemp = TempBasal(duration: 0, rate: 0, temp: .absolute, timestamp: currentTime)
-        let iobData = mockIobArray(iob: 0, activity: 0, currentTime: currentTime)
-        let mealData = ComputedCarbs(
-            carbs: 0,
-            mealCOB: 0,
-            currentDeviation: 0,
-            maxDeviation: 0,
-            minDeviation: 0,
-            slopeFromMaxDeviation: 0,
-            slopeFromMinDeviation: 0,
-            allDeviations: [0, 0, 0, 0, 0],
-            lastCarbTime: 0
-        )
-        let autosensData = Autosens(ratio: 1.0, newisf: nil)
-        let glucoseStatus = GlucoseStatus(
-            delta: 0,
-            glucose: 115,
-            noise: 1,
-            shortAvgDelta: 0,
-            longAvgDelta: 0.1,
-            date: currentTime,
-            lastCalIndex: nil,
-            device: "test"
-        )
-
-        let trioCustomOrefVariables = TrioCustomOrefVariables(
-            average_total_data: 0,
-            weightedAverage: 0,
-            currentTDD: 0,
-            past2hoursAverage: 0,
-            date: currentTime,
-            overridePercentage: 100,
-            useOverride: false,
-            duration: 0,
-            unlimited: false,
-            overrideTarget: 0,
-            smbIsOff: false,
-            advancedSettings: false,
-            isfAndCr: false,
-            isf: false,
-            cr: false,
-            smbIsScheduledOff: false,
-            start: 0,
-            end: 0,
-            smbMinutes: 30,
-            uamMinutes: 30,
-            shouldProtectDueToHIGH: false
-        )
-
-        return (
-            profile: profile,
-            preferences: preferences,
-            currentTemp: currentTemp,
-            iobData: iobData,
-            mealData: mealData,
-            autosensData: autosensData,
-            reservoirData: 100,
-            glucoseStatus: glucoseStatus,
-            trioCustomOrefVariables: trioCustomOrefVariables,
-            currentTime: currentTime
-        )
-    }
-
-    @Test("should set a low temp when eventual BG is low and rising") func lowTempRising() throws {
-        var (
-            profile, preferences, currentTemp, _, mealData, autosensData, reservoirData, _, trioCustomOrefVariables, currentTime
-        ) = createDefaultInputs()
-
-        profile.minBg = 100
-        let glucoseStatus = GlucoseStatus(
-            delta: 1, glucose: 90, noise: 1, shortAvgDelta: 1, longAvgDelta: 0.1, date: currentTime, lastCalIndex: nil,
-            device: "test"
-        )
-        let iobData = mockIobArray(iob: 0, activity: 0, currentTime: currentTime)
-
-        let result = try DeterminationGenerator.determineBasal(
-            profile: profile, preferences: preferences, currentTemp: currentTemp, iobData: iobData, mealData: mealData,
-            autosensData: autosensData, reservoirData: reservoirData, glucoseStatus: glucoseStatus,
-            trioCustomOrefVariables: trioCustomOrefVariables, currentTime: currentTime
-        )
-
-        #expect(result?.rate == 0.7)
-        #expect(result?.duration == 30)
-        #expect(result?.reason.contains("setting 0.7U/hr") == true)
-    }
-}
-
 /// these tests should be an exact copy of the JS tests here:
 /// - https://github.com/kingst/trio-oref/blob/dev-fixes-for-swift-comparison/tests/determine-basal-low-eventual-glucose.test.js
 /// We had to extract the key functionality from JS and put it in a function to facilitate testing
-@Suite("DosingEngine.handleLowEventualGlucose") struct HandleLowEventualGlucoseTests {
+@Suite("DetermineBasal low eventual glucose") struct HandleLowEventualGlucoseTests {
     private func defaultProfile() -> Profile {
         var profile = Profile()
         profile.minBg = 100
@@ -215,7 +64,6 @@ import Testing
             timestamp: nil,
             tdd: nil,
             current_target: nil,
-            manualBolusErrorString: nil,
             minDelta: nil,
             expectedDelta: nil,
             minGuardBG: nil,

+ 0 - 1
TrioTests/OpenAPSSwiftTests/SetTempBasalTests.swift

@@ -48,7 +48,6 @@ import Testing
             timestamp: Date(),
             tdd: nil,
             current_target: nil,
-            manualBolusErrorString: nil,
             minDelta: nil,
             expectedDelta: nil,
             minGuardBG: nil,