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
@@ -76,6 +76,19 @@ class MinMaxPyramid {
|
||||
/// whose samples were all non-finite is stored as an empty aggregate
|
||||
/// (count 0, zero sums) that every reader treats as absent.
|
||||
void append(f32 v);
|
||||
/// Folds a backfilled sample into every aggregate that covers absolute index
|
||||
/// `absolute_sample`.
|
||||
///
|
||||
/// **Precondition: the sample at that index was appended non-finite.** That is what makes
|
||||
/// this purely additive -- min/max widen, sum/sumsq accumulate and count rises by one, at
|
||||
/// every covering level -- so no bucket is ever recomputed and the cost is O(levels)
|
||||
/// regardless of how wide the repaired span is. Amending a *finite* sample would need the
|
||||
/// old value removed from sum/sumsq and could not restore min/max at all, which is why
|
||||
/// this is a one-way NaN-to-value operation and not a general write.
|
||||
///
|
||||
/// An index outside `[window_base(), window_end())` is a no-op: the window slides on the
|
||||
/// consumer thread, so a caller cannot prove the slot is still held before asking.
|
||||
void amend(u64 absolute_sample, f32 v);
|
||||
/// Slides the retained window's leading edge to absolute sample index
|
||||
/// `absolute_sample`, dropping every aggregate that covered a sample before it.
|
||||
/// Monotonic, and a no-op only when `absolute_sample <= window_base()`: an empty
|
||||
|
||||
Reference in new issue
Block a user