MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / aggregate_f64

Function aggregate_f64

nodedb/src/engine/timeseries/columnar_agg.rs:39–94  ·  view source on GitHub ↗

Compute all standard aggregates over an f64 column slice. Dispatches sum/min/max to SIMD kernels (AVX-512/AVX2/NEON) via `ts_runtime()`. Falls back to scalar with Kahan compensation.

(values: &[f64])

Source from the content-addressed store, hash-verified

37/// Dispatches sum/min/max to SIMD kernels (AVX-512/AVX2/NEON) via
38/// `ts_runtime()`. Falls back to scalar with Kahan compensation.
39pub fn aggregate_f64(values: &[f64]) -> AggResult {
40 if values.is_empty() {
41 return AggResult {
42 min: f64::NAN,
43 max: f64::NAN,
44 first: f64::NAN,
45 last: f64::NAN,
46 ..Default::default()
47 };
48 }
49
50 // Filter out NaN values for SIMD paths (SIMD min/max don't handle NaN correctly).
51 let has_nan = values.iter().any(|v| v.is_nan());
52
53 let (sum, min, max, count) = if has_nan {
54 // Slow path: skip NaN values.
55 let mut s = 0.0f64;
56 let mut comp = 0.0f64;
57 let mut mn = f64::INFINITY;
58 let mut mx = f64::NEG_INFINITY;
59 let mut c = 0u64;
60 for &v in values {
61 if v.is_nan() {
62 continue;
63 }
64 c += 1;
65 let y = v - comp;
66 let t = s + y;
67 comp = (t - s) - y;
68 s = t;
69 if v < mn {
70 mn = v;
71 }
72 if v > mx {
73 mx = v;
74 }
75 }
76 (s, mn, mx, c)
77 } else {
78 // Fast path: SIMD dispatch for clean data.
79 let rt = ts_runtime();
80 let s = (rt.sum_f64)(values);
81 let mn = (rt.min_f64)(values);
82 let mx = (rt.max_f64)(values);
83 (s, mn, mx, values.len() as u64)
84 };
85
86 AggResult {
87 count,
88 sum,
89 min,
90 max,
91 first: values[0],
92 last: values[values.len() - 1],
93 }
94}
95
96/// Compute aggregates over an i64 column slice.

Callers 5

empty_aggregateFunction · 0.85
simple_aggregateFunction · 0.85
kahan_accuracyFunction · 0.85
nan_values_skippedFunction · 0.85

Calls 4

ts_runtimeFunction · 0.85
is_emptyMethod · 0.45
iterMethod · 0.45
lenMethod · 0.45

Tested by 5

empty_aggregateFunction · 0.68
simple_aggregateFunction · 0.68
kahan_accuracyFunction · 0.68
nan_values_skippedFunction · 0.68