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
@@ -1,6 +1,6 @@
---
description: Configuration for AI behavior when interacting with Codacy's MCP Server
applyTo: '**'
description: Configuration for AI behavior when interacting with Codacy's MCP Server
applyTo: '**'
---
---
# Codacy Rules
+14 -14
View File
@@ -97,7 +97,7 @@ public sealed class Lsma : AbstractBase
// O(1) update for sum_xy
// sum_xy_new = sum_xy_old + sum_y_prev - n * oldest
_state.SumXY = _state.SumXY + prev_sum_y - _period * oldest;
_state.SumXY = Math.FusedMultiplyAdd(-_period, oldest, _state.SumXY + prev_sum_y);
// O(1) update for sum_y
_state.SumY = _state.SumY - oldest + val;
@@ -119,7 +119,7 @@ public sealed class Lsma : AbstractBase
// index j in buffer corresponds to x = count - 1 - j
// sum_xy = sum(x * y)
int x = span.Length - 1 - i;
_state.SumXY += x * span[i];
_state.SumXY = Math.FusedMultiplyAdd(x, span[i], _state.SumXY);
}
}
@@ -139,7 +139,7 @@ public sealed class Lsma : AbstractBase
for (int i = 0; i < span.Length; i++)
{
int x = span.Length - 1 - i;
_state.SumXY += x * span[i];
_state.SumXY = Math.FusedMultiplyAdd(x, span[i], _state.SumXY);
}
}
@@ -197,11 +197,11 @@ public sealed class Lsma : AbstractBase
}
else
{
double m = (n * _state.SumXY - sx * _state.SumY) / denom;
double b = (_state.SumY - m * sx) / n;
double m = Math.FusedMultiplyAdd(n, _state.SumXY, -sx * _state.SumY) / denom;
double b = Math.FusedMultiplyAdd(-m, sx, _state.SumY) / n;
// LSMA = b - m * offset
result = b - m * _offset;
result = Math.FusedMultiplyAdd(-m, _offset, b);
}
}
@@ -335,7 +335,7 @@ public sealed class Lsma : AbstractBase
{
// buffer[j] is at index j
// x = count - 1 - j
sum_xy += (count - 1 - j) * buffer[j];
sum_xy = Math.FusedMultiplyAdd(count - 1 - j, buffer[j], sum_xy);
}
if (count <= 1)
@@ -355,9 +355,9 @@ public sealed class Lsma : AbstractBase
}
else
{
double m = (n * sum_xy - sx * sum_y) / denom;
double b = (sum_y - m * sx) / n;
output[i] = b - m * offset;
double m = Math.FusedMultiplyAdd(n, sum_xy, -sx * sum_y) / denom;
double b = Math.FusedMultiplyAdd(-m, sx, sum_y) / n;
output[i] = Math.FusedMultiplyAdd(-m, offset, b);
}
}
@@ -373,7 +373,7 @@ public sealed class Lsma : AbstractBase
double prev_sum_y = sum_y;
// sum_xy_new = sum_xy_old + sum_y_prev - n * oldest
sum_xy = sum_xy + prev_sum_y - period * oldest;
sum_xy = Math.FusedMultiplyAdd(-period, oldest, sum_xy + prev_sum_y);
sum_y = sum_y - oldest + val;
buffer[bufferIndex] = val;
@@ -382,9 +382,9 @@ public sealed class Lsma : AbstractBase
if (bufferIndex >= period)
bufferIndex = 0;
double m = (period * sum_xy - full_sum_x * sum_y) / full_denom;
double b = (sum_y - m * full_sum_x) / period;
output[i] = b - m * offset;
double m = Math.FusedMultiplyAdd(period, sum_xy, -full_sum_x * sum_y) / full_denom;
double b = Math.FusedMultiplyAdd(-m, full_sum_x, sum_y) / period;
output[i] = Math.FusedMultiplyAdd(-m, offset, b);
}
}
}