pull/1916/merge
Kristian Tashkov 1 week ago committed by GitHub
commit b991437d6e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -249,12 +249,14 @@ open class EntryList {
entries: List<Entry> entries: List<Entry>
): ArrayList<Interval> { ): ArrayList<Interval> {
val filtered = entries.filter { it.value == YES_MANUAL } val filtered = entries.filter { it.value == YES_MANUAL }
val skips = entries.filter { it.value == SKIP }
val num = freq.numerator val num = freq.numerator
val den = freq.denominator val den = freq.denominator
val intervals = arrayListOf<Interval>() val intervals = arrayListOf<Interval>()
for (i in num - 1 until filtered.size) { for (i in num - 1 until filtered.size) {
val (begin, _) = filtered[i] val (begin, _) = filtered[i]
val (center, _) = filtered[i - num + 1] val (center, _) = filtered[i - num + 1]
val skipCounts = skips.filter { it.timestamp in begin..center }.size
var size = den var size = den
if (den == 30 || den == 31) { if (den == 30 || den == 31) {
val beginDate = begin.toLocalDate() val beginDate = begin.toLocalDate()
@ -264,8 +266,8 @@ open class EntryList {
beginDate.monthLength beginDate.monthLength
} }
} }
if (begin.daysUntil(center) < size) { if (begin.daysUntil(center) - skipCounts < size) {
val end = begin.plus(size - 1) val end = begin.plus(size - 1 + skipCounts)
intervals.add(Interval(begin, center, end)) intervals.add(Interval(begin, center, end))
} }
} }

@ -76,6 +76,7 @@ class ScoreList {
) { ) {
map.clear() map.clear()
var rollingSum = 0.0 var rollingSum = 0.0
var skipDays = 0
var numerator = frequency.numerator var numerator = frequency.numerator
var denominator = frequency.denominator var denominator = frequency.denominator
val freq = frequency.toDouble() val freq = frequency.toDouble()
@ -93,14 +94,19 @@ class ScoreList {
var previousValue = if (isNumerical && isAtMost) 1.0 else 0.0 var previousValue = if (isNumerical && isAtMost) 1.0 else 0.0
for (i in values.indices) { for (i in values.indices) {
val offset = values.size - i - 1 val offset = values.size - i - 1
var outsideRangeIndex = offset + denominator + skipDays
if (isNumerical) { if (isNumerical) {
rollingSum += max(0, values[offset]) rollingSum += max(0, values[offset])
if (offset + denominator < values.size) { if (values[offset] != Entry.SKIP) {
rollingSum -= max(0, values[offset + denominator]) if (outsideRangeIndex < values.size) {
while (values[outsideRangeIndex] == Entry.SKIP) {
skipDays -= 1
outsideRangeIndex -= 1
}
rollingSum -= max(0, values[outsideRangeIndex])
} }
val normalizedRollingSum = rollingSum / 1000 val normalizedRollingSum = rollingSum / 1000
if (values[offset] != Entry.SKIP) {
val percentageCompleted = if (!isAtMost) { val percentageCompleted = if (!isAtMost) {
if (targetValue > 0) { if (targetValue > 0) {
min(1.0, normalizedRollingSum / targetValue) min(1.0, normalizedRollingSum / targetValue)
@ -119,19 +125,27 @@ class ScoreList {
} }
previousValue = compute(freq, previousValue, percentageCompleted) previousValue = compute(freq, previousValue, percentageCompleted)
} else {
skipDays += 1
} }
} else { } else {
if (values[offset] == Entry.YES_MANUAL) { if (values[offset] == Entry.YES_MANUAL) {
rollingSum += 1.0 rollingSum += 1.0
} }
if (offset + denominator < values.size) { if (values[offset] != Entry.SKIP) {
if (values[offset + denominator] == Entry.YES_MANUAL) { if (outsideRangeIndex < values.size) {
while (values[outsideRangeIndex] == Entry.SKIP) {
skipDays -= 1
outsideRangeIndex -= 1
}
if (values[outsideRangeIndex] == Entry.YES_MANUAL) {
rollingSum -= 1.0 rollingSum -= 1.0
} }
} }
if (values[offset] != Entry.SKIP) {
val percentageCompleted = min(1.0, rollingSum / numerator) val percentageCompleted = min(1.0, rollingSum / numerator)
previousValue = compute(freq, previousValue, percentageCompleted) previousValue = compute(freq, previousValue, percentageCompleted)
} else {
skipDays += 1
} }
} }
val timestamp = from.plus(i) val timestamp = from.plus(i)

Loading…
Cancel
Save