feat(statistics): add Variance indicator with O(1) calculation and usage example

This commit is contained in:
Miha Kralj
2025-12-25 17:18:41 -08:00
parent 9ba89812cd
commit 4ff6dc0ad9
61 changed files with 6069 additions and 99 deletions
+9 -3
View File
@@ -240,7 +240,11 @@ public sealed class Ema : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static double Compute(double input, double alpha, double decay, ref State state)
{
state.Ema += alpha * (input - state.Ema);
// state.Ema += alpha * (input - state.Ema)
// state.Ema = state.Ema + alpha * input - alpha * state.Ema
// state.Ema = state.Ema * (1 - alpha) + alpha * input
// state.Ema = state.Ema * decay + alpha * input
state.Ema = Math.FusedMultiplyAdd(state.Ema, decay, alpha * input);
double result;
if (!state.IsCompensated)
@@ -285,7 +289,8 @@ public sealed class Ema : AbstractBase
else
val = lastValidValue;
state.Ema += alpha * (val - state.Ema);
state.Ema = Math.FusedMultiplyAdd(state.Ema, decay, alpha * val);
state.E *= decay;
if (!state.IsHot && state.E <= COVERAGE_THRESHOLD)
@@ -305,7 +310,8 @@ public sealed class Ema : AbstractBase
else
val = lastValidValue;
state.Ema += alpha * (val - state.Ema);
// state.Ema += alpha * (val - state.Ema); // skipcq: S125
state.Ema = Math.FusedMultiplyAdd(state.Ema, decay, alpha * val);
output[i] = state.Ema;
}
}