Merge pull request #887 from dlvoy/fix/882_optimize_tdd_calculation
Speed up TDD statistics calculation
This commit is contained in:
commit
7b39fb1e69
5 changed files with 39 additions and 6 deletions
|
@ -558,10 +558,7 @@ class IobCobCalculatorPlugin @Inject constructor(
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getTempBasalIncludingConvertedExtended(timestamp: Long): TemporaryBasal? {
|
private fun getConvertedExtended(timestamp: Long): TemporaryBasal? {
|
||||||
|
|
||||||
val tb = repository.getTemporaryBasalActiveAt(timestamp).blockingGet()
|
|
||||||
if (tb is ValueWrapper.Existing) return tb.value
|
|
||||||
if (activePlugin.activePump.isFakingTempsByExtendedBoluses) {
|
if (activePlugin.activePump.isFakingTempsByExtendedBoluses) {
|
||||||
val eb = repository.getExtendedBolusActiveAt(timestamp).blockingGet()
|
val eb = repository.getExtendedBolusActiveAt(timestamp).blockingGet()
|
||||||
val profile = profileFunction.getProfile(timestamp) ?: return null
|
val profile = profileFunction.getProfile(timestamp) ?: return null
|
||||||
|
@ -570,6 +567,22 @@ class IobCobCalculatorPlugin @Inject constructor(
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getTempBasalIncludingConvertedExtended(timestamp: Long): TemporaryBasal? {
|
||||||
|
val tb = repository.getTemporaryBasalActiveAt(timestamp).blockingGet()
|
||||||
|
if (tb is ValueWrapper.Existing) return tb.value
|
||||||
|
return getConvertedExtended(timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getTempBasalIncludingConvertedExtendedForRange(startTime: Long, endTime: Long, calculationStep: Long): Map<Long, TemporaryBasal?> {
|
||||||
|
val tempBasals = HashMap<Long, TemporaryBasal?>();
|
||||||
|
val tbs = repository.getTemporaryBasalsDataActiveBetweenTimeAndTime(startTime, endTime).blockingGet()
|
||||||
|
for (t in startTime until endTime step calculationStep) {
|
||||||
|
val tb = tbs.firstOrNull { basal -> basal.timestamp <= t && (basal.timestamp + basal.duration) > t }
|
||||||
|
tempBasals[t] = tb ?: getConvertedExtended(t)
|
||||||
|
}
|
||||||
|
return tempBasals;
|
||||||
|
}
|
||||||
|
|
||||||
override fun calculateAbsoluteIobFromBaseBasals(toTime: Long): IobTotal {
|
override fun calculateAbsoluteIobFromBaseBasals(toTime: Long): IobTotal {
|
||||||
val total = IobTotal(toTime)
|
val total = IobTotal(toTime)
|
||||||
var i = toTime - range()
|
var i = toTime - range()
|
||||||
|
|
|
@ -50,10 +50,12 @@ class TddCalculator @Inject constructor(
|
||||||
result.put(midnight, tdd)
|
result.put(midnight, tdd)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (t in startTime until endTime step T.mins(5).msecs()) {
|
val calculationStep = T.mins(5).msecs()
|
||||||
|
val tempBasals = iobCobCalculator.getTempBasalIncludingConvertedExtendedForRange(startTime, endTime, calculationStep)
|
||||||
|
for (t in startTime until endTime step calculationStep) {
|
||||||
val midnight = MidnightTime.calc(t)
|
val midnight = MidnightTime.calc(t)
|
||||||
val tdd = result[midnight] ?: TotalDailyDose(timestamp = midnight)
|
val tdd = result[midnight] ?: TotalDailyDose(timestamp = midnight)
|
||||||
val tbr = iobCobCalculator.getTempBasalIncludingConvertedExtended(t)
|
val tbr = tempBasals[t]
|
||||||
val profile = profileFunction.getProfile(t) ?: continue
|
val profile = profileFunction.getProfile(t) ?: continue
|
||||||
val absoluteRate = tbr?.convertedToAbsolute(t, profile) ?: profile.getBasal(t)
|
val absoluteRate = tbr?.convertedToAbsolute(t, profile) ?: profile.getBasal(t)
|
||||||
tdd.basalAmount += absoluteRate / 60.0 * 5.0
|
tdd.basalAmount += absoluteRate / 60.0 * 5.0
|
||||||
|
|
|
@ -64,6 +64,17 @@ interface IobCobCalculator {
|
||||||
*/
|
*/
|
||||||
fun getTempBasalIncludingConvertedExtended(timestamp: Long): TemporaryBasal?
|
fun getTempBasalIncludingConvertedExtended(timestamp: Long): TemporaryBasal?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get running temporary basals for given time range, sliced by calculationStep.
|
||||||
|
* For each step between given range it calculates equivalent of getTempBasalIncludingConvertedExtended
|
||||||
|
*
|
||||||
|
* @param startTime start of calculated period, timestamp
|
||||||
|
* @param endTime end of calculated period, timestamp
|
||||||
|
* @param calculationStep calculation step, in millisecond
|
||||||
|
* @return map where for each step, its timestamp is a key and calculated optional temporary basal is a value
|
||||||
|
*/
|
||||||
|
fun getTempBasalIncludingConvertedExtendedForRange(startTime: Long, endTime: Long, calculationStep: Long): Map<Long, TemporaryBasal?>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get running extended bolus at time
|
* Get running extended bolus at time
|
||||||
*
|
*
|
||||||
|
|
|
@ -685,6 +685,10 @@ import kotlin.math.roundToInt
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.toWrappedSingle()
|
.toWrappedSingle()
|
||||||
|
|
||||||
|
fun getTemporaryBasalsDataActiveBetweenTimeAndTime(from: Long, to: Long): Single<List<TemporaryBasal>> =
|
||||||
|
database.temporaryBasalDao.getTemporaryBasalActiveBetweenTimeAndTime(from, to)
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
|
||||||
fun getTemporaryBasalsDataFromTime(timestamp: Long, ascending: Boolean): Single<List<TemporaryBasal>> =
|
fun getTemporaryBasalsDataFromTime(timestamp: Long, ascending: Boolean): Single<List<TemporaryBasal>> =
|
||||||
database.temporaryBasalDao.getTemporaryBasalDataFromTime(timestamp)
|
database.temporaryBasalDao.getTemporaryBasalDataFromTime(timestamp)
|
||||||
.map { if (!ascending) it.reversed() else it }
|
.map { if (!ascending) it.reversed() else it }
|
||||||
|
|
|
@ -47,6 +47,9 @@ internal interface TemporaryBasalDao : TraceableDao<TemporaryBasal> {
|
||||||
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp <= :timestamp AND (timestamp + duration) > :timestamp AND referenceId IS NULL AND isValid = 1 ORDER BY timestamp DESC LIMIT 1")
|
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp <= :timestamp AND (timestamp + duration) > :timestamp AND referenceId IS NULL AND isValid = 1 ORDER BY timestamp DESC LIMIT 1")
|
||||||
fun getTemporaryBasalActiveAt(timestamp: Long): Maybe<TemporaryBasal>
|
fun getTemporaryBasalActiveAt(timestamp: Long): Maybe<TemporaryBasal>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp <= :to AND (timestamp + duration) > :from AND referenceId IS NULL AND isValid = 1 ORDER BY timestamp DESC")
|
||||||
|
fun getTemporaryBasalActiveBetweenTimeAndTime(from: Long, to: Long): Single<List<TemporaryBasal>>
|
||||||
|
|
||||||
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp >= :timestamp AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
|
@Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp >= :timestamp AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
|
||||||
fun getTemporaryBasalDataFromTime(timestamp: Long): Single<List<TemporaryBasal>>
|
fun getTemporaryBasalDataFromTime(timestamp: Long): Single<List<TemporaryBasal>>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue