From d5d1420a0b42ca4da07a204129f6185dbb4018b5 Mon Sep 17 00:00:00 2001 From: Kristian Tashkov Date: Fri, 5 Jan 2024 22:40:48 +0200 Subject: [PATCH] Fix SKIP behavior in YES_AUTO and score --- .../isoron/uhabits/core/models/EntryList.kt | 6 ++-- .../isoron/uhabits/core/models/ScoreList.kt | 35 +++++++++++++------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/EntryList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/EntryList.kt index 5c5499f49..23d92269d 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/EntryList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/EntryList.kt @@ -249,12 +249,14 @@ open class EntryList { entries: List ): ArrayList { val filtered = entries.filter { it.value == YES_MANUAL } + val skips = entries.filter { it.value == SKIP } val num = freq.numerator val den = freq.denominator val intervals = arrayListOf() for (i in num - 1 until filtered.size) { val (begin, _) = filtered[i] val (center, _) = filtered[i - num + 1] + val skipCounts = skips.filter { it.timestamp in begin..center }.size var size = den if (den == 30 || den == 31) { val beginDate = begin.toLocalDate() @@ -264,8 +266,8 @@ open class EntryList { beginDate.monthLength } } - if (begin.daysUntil(center) < size) { - val end = begin.plus(size - 1) + if (begin.daysUntil(center) - skipCounts < size) { + val end = begin.plus(size - 1 + skipCounts) intervals.add(Interval(begin, center, end)) } } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt index 3acc19e1c..182c9eac3 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/ScoreList.kt @@ -76,6 +76,7 @@ class ScoreList { ) { map.clear() var rollingSum = 0.0 + var skipDays = 0 var numerator = frequency.numerator var denominator = frequency.denominator val freq = frequency.toDouble() @@ -93,14 +94,19 @@ class ScoreList { var previousValue = if (isNumerical && isAtMost) 1.0 else 0.0 for (i in values.indices) { val offset = values.size - i - 1 + var outsideRangeIndex = offset + denominator + skipDays if (isNumerical) { rollingSum += max(0, values[offset]) - if (offset + denominator < values.size) { - rollingSum -= max(0, values[offset + denominator]) - } - - val normalizedRollingSum = rollingSum / 1000 if (values[offset] != Entry.SKIP) { + if (outsideRangeIndex < values.size) { + while (values[outsideRangeIndex] == Entry.SKIP) { + skipDays -= 1 + outsideRangeIndex -= 1 + } + rollingSum -= max(0, values[outsideRangeIndex]) + } + + val normalizedRollingSum = rollingSum / 1000 val percentageCompleted = if (!isAtMost) { if (targetValue > 0) { min(1.0, normalizedRollingSum / targetValue) @@ -120,18 +126,27 @@ class ScoreList { previousValue = compute(freq, previousValue, percentageCompleted) } + else { + skipDays += 1 + } } else { if (values[offset] == Entry.YES_MANUAL) { rollingSum += 1.0 } - if (offset + denominator < values.size) { - if (values[offset + denominator] == Entry.YES_MANUAL) { - rollingSum -= 1.0 - } - } if (values[offset] != Entry.SKIP) { + if (outsideRangeIndex < values.size) { + while (values[outsideRangeIndex] == Entry.SKIP) { + skipDays -= 1 + outsideRangeIndex -= 1 + } + if (values[outsideRangeIndex] == Entry.YES_MANUAL) { + rollingSum -= 1.0 + } + } val percentageCompleted = min(1.0, rollingSum / numerator) previousValue = compute(freq, previousValue, percentageCompleted) + } else { + skipDays += 1 } } val timestamp = from.plus(i)