Merge remote-tracking branch 'Nightscout/dev' into Autotune/SaveLastRun
# Conflicts: # app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePlugin.kt
This commit is contained in:
commit
220fd03d4a
5 changed files with 50 additions and 47 deletions
|
@ -324,7 +324,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
||||||
rT.reason += ", but Min. Delta " + minDelta.toFixed(2) + " > Exp. Delta " + expectedDelta;
|
rT.reason += ", but Min. Delta " + minDelta.toFixed(2) + " > Exp. Delta " + expectedDelta;
|
||||||
}
|
}
|
||||||
if (currenttemp.duration > 15 && (round_basal(basal, profile) === round_basal(currenttemp.rate, profile))) {
|
if (currenttemp.duration > 15 && (round_basal(basal, profile) === round_basal(currenttemp.rate, profile))) {
|
||||||
rT.reason += ", temp " + currenttemp.rate + " ~ req " + basal + "U/hr";
|
rT.reason += ", temp " + currenttemp.rate + " ~ req " + round(basal, 2) + "U/hr";
|
||||||
return rT;
|
return rT;
|
||||||
} else {
|
} else {
|
||||||
rT.reason += "; setting current basal of " + round(basal, 2) + " as temp";
|
rT.reason += "; setting current basal of " + round(basal, 2) + " as temp";
|
||||||
|
@ -367,10 +367,10 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
if (typeof currenttemp.rate !== 'undefined' && (currenttemp.duration > 5 && rate >= currenttemp.rate * 0.8)) {
|
if (typeof currenttemp.rate !== 'undefined' && (currenttemp.duration > 5 && rate >= currenttemp.rate * 0.8)) {
|
||||||
rT.reason += ", temp " + currenttemp.rate + " ~< req " + rate + "U/hr";
|
rT.reason += ", temp " + (currenttemp.rate).toFixed(3) + " ~< req " + round(rate, 2) + "U/hr";
|
||||||
return rT;
|
return rT;
|
||||||
} else {
|
} else {
|
||||||
rT.reason += ", setting " + rate + "U/hr";
|
rT.reason += ", setting " + round(rate, 2) + "U/hr";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -476,22 +476,22 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
||||||
|
|
||||||
var insulinScheduled = currenttemp.duration * (currenttemp.rate - basal) / 60;
|
var insulinScheduled = currenttemp.duration * (currenttemp.rate - basal) / 60;
|
||||||
if (insulinScheduled >= insulinReq * 2) { // if current temp would deliver >2x more than the required insulin, lower the rate
|
if (insulinScheduled >= insulinReq * 2) { // if current temp would deliver >2x more than the required insulin, lower the rate
|
||||||
rT.reason += currenttemp.duration + "m@" + (currenttemp.rate - basal).toFixed(3) + " = " + insulinScheduled.toFixed(3) + " > 2 * req " + insulinReq + ". Setting temp basal of " + rate + "U/hr";
|
rT.reason += currenttemp.duration + "m@" + (currenttemp.rate - basal).toFixed(3) + " = " + insulinScheduled.toFixed(3) + " > 2 * req " + insulinReq + ". Setting temp basal of " + round(rate, 2) + "U/hr";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof currenttemp.duration == 'undefined' || currenttemp.duration == 0) { // no temp is set
|
if (typeof currenttemp.duration == 'undefined' || currenttemp.duration == 0) { // no temp is set
|
||||||
rT.reason += "no temp, setting " + rate + "U/hr";
|
rT.reason += "no temp, setting " + round(rate, 2) + "U/hr";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currenttemp.duration > 5 && (round_basal(rate, profile) <= round_basal(currenttemp.rate, profile))) { // if required temp <~ existing temp basal
|
if (currenttemp.duration > 5 && (round_basal(rate, profile) <= round_basal(currenttemp.rate, profile))) { // if required temp <~ existing temp basal
|
||||||
rT.reason += "temp " + currenttemp.rate + " >~ req " + rate + "U/hr";
|
rT.reason += "temp " + (currenttemp.rate).toFixed(3) + " >~ req " + round(rate, 2) + "U/hr";
|
||||||
return rT;
|
return rT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// required temp > existing temp basal
|
// required temp > existing temp basal
|
||||||
rT.reason += "temp " + currenttemp.rate + "<" + rate + "U/hr";
|
rT.reason += "temp " + (currenttemp.rate).toFixed(3) + " < " + round(rate, 2) + "U/hr";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -955,7 +955,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
if (typeof currenttemp.rate !== 'undefined' && (currenttemp.duration > 5 && rate >= currenttemp.rate * 0.8)) {
|
if (typeof currenttemp.rate !== 'undefined' && (currenttemp.duration > 5 && rate >= currenttemp.rate * 0.8)) {
|
||||||
rT.reason += ", temp " + currenttemp.rate + " ~< req " + rate + "U/hr. ";
|
rT.reason += ", temp " + currenttemp.rate + " ~< req " + round(rate, 2) + "U/hr. ";
|
||||||
return rT;
|
return rT;
|
||||||
} else {
|
} else {
|
||||||
// calculate a long enough zero temp to eventually correct back up to target
|
// calculate a long enough zero temp to eventually correct back up to target
|
||||||
|
@ -976,7 +976,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
||||||
return tempBasalFunctions.setTempBasal(rate, durationReq, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, durationReq, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rT.reason += ", setting " + rate + "U/hr. ";
|
rT.reason += ", setting " + round(rate, 2) + "U/hr. ";
|
||||||
}
|
}
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
@ -1143,22 +1143,22 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
||||||
|
|
||||||
insulinScheduled = currenttemp.duration * (currenttemp.rate - basal) / 60;
|
insulinScheduled = currenttemp.duration * (currenttemp.rate - basal) / 60;
|
||||||
if (insulinScheduled >= insulinReq * 2) { // if current temp would deliver >2x more than the required insulin, lower the rate
|
if (insulinScheduled >= insulinReq * 2) { // if current temp would deliver >2x more than the required insulin, lower the rate
|
||||||
rT.reason += currenttemp.duration + "m@" + (currenttemp.rate).toFixed(2) + " > 2 * insulinReq. Setting temp basal of " + rate + "U/hr. ";
|
rT.reason += currenttemp.duration + "m@" + (currenttemp.rate).toFixed(2) + " > 2 * insulinReq. Setting temp basal of " + round(rate, 2) + "U/hr. ";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof currenttemp.duration === 'undefined' || currenttemp.duration === 0) { // no temp is set
|
if (typeof currenttemp.duration === 'undefined' || currenttemp.duration === 0) { // no temp is set
|
||||||
rT.reason += "no temp, setting " + rate + "U/hr. ";
|
rT.reason += "no temp, setting " + round(rate, 2) + "U/hr. ";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currenttemp.duration > 5 && (round_basal(rate, profile) <= round_basal(currenttemp.rate, profile))) { // if required temp <~ existing temp basal
|
if (currenttemp.duration > 5 && (round_basal(rate, profile) <= round_basal(currenttemp.rate, profile))) { // if required temp <~ existing temp basal
|
||||||
rT.reason += "temp " + currenttemp.rate + " >~ req " + rate + "U/hr. ";
|
rT.reason += "temp " + (currenttemp.rate).toFixed(2) + " >~ req " + round(rate, 2) + "U/hr. ";
|
||||||
return rT;
|
return rT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// required temp > existing temp basal
|
// required temp > existing temp basal
|
||||||
rT.reason += "temp " + currenttemp.rate + "<" + rate + "U/hr. ";
|
rT.reason += "temp " + (currenttemp.rate).toFixed(2) + " < " + round(rate, 2) + "U/hr. ";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1085,7 +1085,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
if (typeof currenttemp.rate !== 'undefined' && (currenttemp.duration > 5 && rate >= currenttemp.rate * 0.8)) {
|
if (typeof currenttemp.rate !== 'undefined' && (currenttemp.duration > 5 && rate >= currenttemp.rate * 0.8)) {
|
||||||
rT.reason += ", temp " + currenttemp.rate + " ~< req " + rate + "U/hr. ";
|
rT.reason += ", temp " + currenttemp.rate + " ~< req " + round(rate, 2) + "U/hr. ";
|
||||||
return rT;
|
return rT;
|
||||||
} else {
|
} else {
|
||||||
// calculate a long enough zero temp to eventually correct back up to target
|
// calculate a long enough zero temp to eventually correct back up to target
|
||||||
|
@ -1106,7 +1106,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
||||||
return tempBasalFunctions.setTempBasal(rate, durationReq, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, durationReq, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rT.reason += ", setting " + rate + "U/hr. ";
|
rT.reason += ", setting " + round(rate, 2) + "U/hr. ";
|
||||||
}
|
}
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
@ -1273,22 +1273,22 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
||||||
|
|
||||||
insulinScheduled = currenttemp.duration * (currenttemp.rate - basal) / 60;
|
insulinScheduled = currenttemp.duration * (currenttemp.rate - basal) / 60;
|
||||||
if (insulinScheduled >= insulinReq * 2) { // if current temp would deliver >2x more than the required insulin, lower the rate
|
if (insulinScheduled >= insulinReq * 2) { // if current temp would deliver >2x more than the required insulin, lower the rate
|
||||||
rT.reason += currenttemp.duration + "m@" + (currenttemp.rate).toFixed(2) + " > 2 * insulinReq. Setting temp basal of " + rate + "U/hr. ";
|
rT.reason += currenttemp.duration + "m@" + (currenttemp.rate).toFixed(2) + " > 2 * insulinReq. Setting temp basal of " + round(rate, 2) + "U/hr. ";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof currenttemp.duration === 'undefined' || currenttemp.duration === 0) { // no temp is set
|
if (typeof currenttemp.duration === 'undefined' || currenttemp.duration === 0) { // no temp is set
|
||||||
rT.reason += "no temp, setting " + rate + "U/hr. ";
|
rT.reason += "no temp, setting " + round(rate, 2) + "U/hr. ";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currenttemp.duration > 5 && (round_basal(rate, profile) <= round_basal(currenttemp.rate, profile))) { // if required temp <~ existing temp basal
|
if (currenttemp.duration > 5 && (round_basal(rate, profile) <= round_basal(currenttemp.rate, profile))) { // if required temp <~ existing temp basal
|
||||||
rT.reason += "temp " + currenttemp.rate + " >~ req " + rate + "U/hr. ";
|
rT.reason += "temp " + (currenttemp.rate).toFixed(2) + " >~ req " + round(rate, 2) + "U/hr. ";
|
||||||
return rT;
|
return rT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// required temp > existing temp basal
|
// required temp > existing temp basal
|
||||||
rT.reason += "temp " + currenttemp.rate + "<" + rate + "U/hr. ";
|
rT.reason += "temp " + (currenttemp.rate).toFixed(2) + " < " + round(rate, 2) + "U/hr. ";
|
||||||
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
return tempBasalFunctions.setTempBasal(rate, 30, profile, rT, currenttemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,9 +28,9 @@ class AutotuneCore @Inject constructor(
|
||||||
//console.error(isf);
|
//console.error(isf);
|
||||||
var carbRatio = previousAutotune.ic
|
var carbRatio = previousAutotune.ic
|
||||||
//console.error(carbRatio);
|
//console.error(carbRatio);
|
||||||
var csf = isf / carbRatio
|
val csf = isf / carbRatio
|
||||||
var dia = previousAutotune.dia
|
val dia = previousAutotune.dia
|
||||||
var peak = previousAutotune.peak
|
val peak = previousAutotune.peak
|
||||||
val csfGlucose = preppedGlucose.csfGlucoseData
|
val csfGlucose = preppedGlucose.csfGlucoseData
|
||||||
val isfGlucose = preppedGlucose.isfGlucoseData
|
val isfGlucose = preppedGlucose.isfGlucoseData
|
||||||
val basalGlucose = preppedGlucose.basalGlucoseData
|
val basalGlucose = preppedGlucose.basalGlucoseData
|
||||||
|
|
|
@ -117,29 +117,15 @@ class AutotunePlugin @Inject constructor(
|
||||||
val from = starttime + i * 24 * 60 * 60 * 1000L // get 24 hours BG values from 4 AM to 4 AM next day
|
val from = starttime + i * 24 * 60 * 60 * 1000L // get 24 hours BG values from 4 AM to 4 AM next day
|
||||||
val to = from + 24 * 60 * 60 * 1000L
|
val to = from + 24 * 60 * 60 * 1000L
|
||||||
log("Tune day " + (i + 1) + " of " + daysBack)
|
log("Tune day " + (i + 1) + " of " + daysBack)
|
||||||
tunedProfile?.let { tunedProfile ->
|
tunedProfile?.let { it ->
|
||||||
autotuneIob.initializeData(from, to, tunedProfile) //autotuneIob contains BG and Treatments data from history (<=> query for ns-treatments and ns-entries)
|
autotuneIob.initializeData(from, to, it) //autotuneIob contains BG and Treatments data from history (<=> query for ns-treatments and ns-entries)
|
||||||
autotuneFS.exportEntries(autotuneIob) //<=> ns-entries.yyyymmdd.json files exported for results compare with oref0 autotune on virtual machine
|
autotuneFS.exportEntries(autotuneIob) //<=> ns-entries.yyyymmdd.json files exported for results compare with oref0 autotune on virtual machine
|
||||||
autotuneFS.exportTreatments(autotuneIob) //<=> ns-treatments.yyyymmdd.json files exported for results compare with oref0 autotune on virtual machine (include treatments ,tempBasal and extended
|
autotuneFS.exportTreatments(autotuneIob) //<=> ns-treatments.yyyymmdd.json files exported for results compare with oref0 autotune on virtual machine (include treatments ,tempBasal and extended
|
||||||
preppedGlucose = autotunePrep.categorize(tunedProfile) //<=> autotune.yyyymmdd.json files exported for results compare with oref0 autotune on virtual machine
|
preppedGlucose = autotunePrep.categorize(it) //<=> autotune.yyyymmdd.json files exported for results compare with oref0 autotune on virtual machine
|
||||||
}
|
preppedGlucose?.let { preppedGlucose ->
|
||||||
|
|
||||||
if (preppedGlucose == null || tunedProfile == null) {
|
|
||||||
result = rh.gs(R.string.autotune_error)
|
|
||||||
log(result)
|
|
||||||
calculationRunning = false
|
|
||||||
rxBus.send(EventAutotuneUpdateGui())
|
|
||||||
tunedProfile = null
|
|
||||||
autotuneFS.exportResult(result)
|
|
||||||
autotuneFS.exportLogAndZip(lastRun)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
preppedGlucose?.let { preppedGlucose -> //preppedGlucose and tunedProfile should never be null here
|
|
||||||
autotuneFS.exportPreppedGlucose(preppedGlucose)
|
autotuneFS.exportPreppedGlucose(preppedGlucose)
|
||||||
tunedProfile = autotuneCore.tuneAllTheThings(preppedGlucose, tunedProfile!!, pumpProfile)
|
tunedProfile = autotuneCore.tuneAllTheThings(preppedGlucose, it, pumpProfile).also { tunedProfile ->
|
||||||
}
|
autotuneFS.exportTunedProfile(tunedProfile) //<=> newprofile.yyyymmdd.json files exported for results compare with oref0 autotune on virtual machine
|
||||||
// localInsulin = LocalInsulin("TunedInsulin", tunedProfile!!.peak, tunedProfile!!.dia) // Todo: Add tune Insulin option
|
|
||||||
autotuneFS.exportTunedProfile(tunedProfile!!) //<=> newprofile.yyyymmdd.json files exported for results compare with oref0 autotune on virtual machine
|
|
||||||
if (i < daysBack - 1) {
|
if (i < daysBack - 1) {
|
||||||
log("Partial result for day ${i + 1}".trimIndent())
|
log("Partial result for day ${i + 1}".trimIndent())
|
||||||
result = rh.gs(R.string.autotune_partial_result, i + 1, daysBack)
|
result = rh.gs(R.string.autotune_partial_result, i + 1, daysBack)
|
||||||
|
@ -149,6 +135,22 @@ class AutotunePlugin @Inject constructor(
|
||||||
if (detailedLog)
|
if (detailedLog)
|
||||||
autotuneFS.exportLog(lastRun, i + 1)
|
autotuneFS.exportLog(lastRun, i + 1)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
?: {
|
||||||
|
log("preppedGlucose is null on day ${i + 1}")
|
||||||
|
tunedProfile = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tunedProfile == null) {
|
||||||
|
result = rh.gs(R.string.autotune_error)
|
||||||
|
log("TunedProfile is null on day ${i + 1}")
|
||||||
|
calculationRunning = false
|
||||||
|
rxBus.send(EventAutotuneUpdateGui())
|
||||||
|
autotuneFS.exportResult(result)
|
||||||
|
autotuneFS.exportLogAndZip(lastRun)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
result = rh.gs(R.string.autotune_result, dateUtil.dateAndTimeString(lastRun))
|
result = rh.gs(R.string.autotune_result, dateUtil.dateAndTimeString(lastRun))
|
||||||
if (!detailedLog)
|
if (!detailedLog)
|
||||||
autotuneFS.exportLog(lastRun)
|
autotuneFS.exportLog(lastRun)
|
||||||
|
@ -189,11 +191,12 @@ class AutotunePlugin @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tunedProfile?.let {
|
||||||
lastRunSuccess = true
|
lastRunSuccess = true
|
||||||
saveLastRun()
|
saveLastRun()
|
||||||
rxBus.send(EventAutotuneUpdateGui())
|
rxBus.send(EventAutotuneUpdateGui())
|
||||||
calculationRunning = false
|
calculationRunning = false
|
||||||
tunedProfile?.let {
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
return "No Result" // should never occurs
|
return "No Result" // should never occurs
|
||||||
|
|
Loading…
Reference in a new issue