feat: a non-finite aggregate can be amended additively at every level
This commit is contained in:
1 parent
37e414bcc5
commit
2ebf2be571
3 files changed
+117
No files matched your search
@@ -179,6 +179,43 @@ void MinMaxPyramid::append(f32 v) {
|
||||
}
|
||||
}
|
||||
|
||||
void MinMaxPyramid::amend(u64 absolute_sample, f32 v) {
|
||||
if (!std::isfinite(v)) return;
|
||||
if (absolute_sample < base_ || absolute_sample >= count_) return;
|
||||
|
||||
const f64 vd = f64(v);
|
||||
const auto fold = [&](Entry& e) {
|
||||
// An empty bucket's `mm` is meaningless (see the Entry note), so the first finite
|
||||
// sample *sets* the extremes instead of widening from a zero that was never a sample.
|
||||
if (e.count == 0) {
|
||||
e.mm.min = v;
|
||||
e.mm.max = v;
|
||||
} else {
|
||||
e.mm.min = std::min(e.mm.min, v);
|
||||
e.mm.max = std::max(e.mm.max, v);
|
||||
}
|
||||
e.sum += vd;
|
||||
e.sumsq += vd * vd;
|
||||
++e.count;
|
||||
};
|
||||
|
||||
// The in-progress level-0 bucket, when the index lies inside it. It is not an entry yet,
|
||||
// so the loop below cannot reach it; leaving it out would lose the amendment for a hole
|
||||
// whose tail is still filling, which is exactly the hole a prompt backfill arrives into.
|
||||
if (count_ % kBucket != 0 && absolute_sample >= (count_ / kBucket) * kBucket) {
|
||||
fold(pending_);
|
||||
}
|
||||
|
||||
// Every level independently: min/max/sum/sumsq/count are each associative, so folding the
|
||||
// value into a parent gives the same aggregate as re-merging its children would.
|
||||
for (u32 l = 0; l < static_cast<u32>(levels_.size()); ++l) {
|
||||
const u64 i = absolute_sample / level_span(l);
|
||||
if (i < levels_[l].base) continue;
|
||||
if (i - levels_[l].base >= static_cast<u64>(levels_[l].entries.size())) continue;
|
||||
fold(levels_[l].entries[static_cast<usize>(i - levels_[l].base)]);
|
||||
}
|
||||
}
|
||||
|
||||
void MinMaxPyramid::drop_before(u64 absolute_sample) {
|
||||
if (absolute_sample <= base_) return;
|
||||
if (absolute_sample > count_) {
|
||||
|
||||
Reference in new issue
Block a user