normalization of methods

This commit is contained in:
Miha Kralj
2026-02-10 21:33:16 -08:00
parent 915d7a007b
commit 6d6259a47d
527 changed files with 10525 additions and 2123 deletions
+4 -4
View File
@@ -150,8 +150,8 @@ public class DwmaTests
double[] output = new double[5];
double[] wrongSizeOutput = new double[3];
Assert.Throws<ArgumentException>(() => Dwma.Calculate(source.AsSpan(), output.AsSpan(), 0));
Assert.Throws<ArgumentException>(() => Dwma.Calculate(source.AsSpan(), wrongSizeOutput.AsSpan(), 3));
Assert.Throws<ArgumentException>(() => Dwma.Batch(source.AsSpan(), output.AsSpan(), 0));
Assert.Throws<ArgumentException>(() => Dwma.Batch(source.AsSpan(), wrongSizeOutput.AsSpan(), 3));
}
[Fact]
@@ -160,7 +160,7 @@ public class DwmaTests
double[] source = [100, 110, double.NaN, 120, 130];
double[] output = new double[5];
Dwma.Calculate(source.AsSpan(), output.AsSpan(), 3);
Dwma.Batch(source.AsSpan(), output.AsSpan(), 3);
foreach (var val in output)
{
@@ -185,7 +185,7 @@ public class DwmaTests
var tValues = series.Values.ToArray();
var spanInput = new ReadOnlySpan<double>(tValues);
var spanOutput = new double[tValues.Length];
Dwma.Calculate(spanInput, spanOutput, period);
Dwma.Batch(spanInput, spanOutput, period);
double spanResult = spanOutput[^1];
// 3. Streaming Mode
+17 -5
View File
@@ -22,6 +22,7 @@ public sealed class Dwma : AbstractBase
private readonly Wma _wma2;
private readonly ITValuePublisher? _source;
private readonly TValuePublishedHandler? _handler;
private bool _disposed;
private int _sampleCount;
public override bool IsHot => _sampleCount >= WarmupPeriod;
@@ -53,9 +54,13 @@ public sealed class Dwma : AbstractBase
protected override void Dispose(bool disposing)
{
if (disposing && _source != null && _handler != null)
if (!_disposed)
{
_source.Pub -= _handler;
if (disposing && _source != null && _handler != null)
{
_source.Pub -= _handler;
}
_disposed = true;
}
base.Dispose(disposing);
}
@@ -91,7 +96,7 @@ public sealed class Dwma : AbstractBase
var vSpan = CollectionsMarshal.AsSpan(v);
source.Times.CopyTo(tSpan);
Calculate(source.Values, vSpan, _period);
Batch(source.Values, vSpan, _period);
Reset();
@@ -129,7 +134,7 @@ public sealed class Dwma : AbstractBase
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Calculate(ReadOnlySpan<double> source, Span<double> output, int period)
public static void Batch(ReadOnlySpan<double> source, Span<double> output, int period)
{
if (period <= 0)
{
@@ -166,6 +171,13 @@ public sealed class Dwma : AbstractBase
}
}
public static (TSeries Results, Dwma Indicator) Calculate(TSeries source, int period)
{
var indicator = new Dwma(period);
TSeries results = indicator.Update(source);
return (results, indicator);
}
public override void Reset()
{
_wma1.Reset();
@@ -173,4 +185,4 @@ public sealed class Dwma : AbstractBase
_sampleCount = 0;
Last = default;
}
}
}