mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-20 11:38:05 +00:00
normalization of methods
This commit is contained in:
@@ -179,7 +179,7 @@ public class ReluTests
|
||||
var gbm = new GBM(startPrice: 100, mu: 0.05, sigma: 0.2, seed: 42000);
|
||||
var bars = gbm.Fetch(count, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
|
||||
// Use returns (which can be negative) for meaningful ReLU test
|
||||
var source = Change.Calculate(bars.Close);
|
||||
var source = Change.Batch(bars.Close);
|
||||
|
||||
// Streaming
|
||||
var streaming = new Relu();
|
||||
@@ -191,7 +191,7 @@ public class ReluTests
|
||||
}
|
||||
|
||||
// Batch
|
||||
var batch = Relu.Calculate(source);
|
||||
var batch = Relu.Batch(source);
|
||||
|
||||
// Compare all values
|
||||
for (int i = 0; i < source.Count; i++)
|
||||
@@ -206,15 +206,15 @@ public class ReluTests
|
||||
int count = 50;
|
||||
var gbm = new GBM(startPrice: 100, mu: 0.05, sigma: 0.2, seed: 42001);
|
||||
var bars = gbm.Fetch(count, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
|
||||
var source = Change.Calculate(bars.Close);
|
||||
var source = Change.Batch(bars.Close);
|
||||
|
||||
// TSeries batch
|
||||
var batchResult = Relu.Calculate(source);
|
||||
var batchResult = Relu.Batch(source);
|
||||
|
||||
// Span calculation
|
||||
var values = source.Values.ToArray();
|
||||
var output = new double[count];
|
||||
Relu.Calculate(values, output);
|
||||
Relu.Batch(values, output);
|
||||
|
||||
for (int i = 0; i < source.Count; i++)
|
||||
{
|
||||
@@ -228,14 +228,14 @@ public class ReluTests
|
||||
Assert.Throws<ArgumentException>(() =>
|
||||
{
|
||||
Span<double> output = stackalloc double[10];
|
||||
Relu.Calculate(ReadOnlySpan<double>.Empty, output);
|
||||
Relu.Batch(ReadOnlySpan<double>.Empty, output);
|
||||
});
|
||||
|
||||
Assert.Throws<ArgumentException>(() =>
|
||||
{
|
||||
ReadOnlySpan<double> source = stackalloc double[10];
|
||||
Span<double> output = stackalloc double[5];
|
||||
Relu.Calculate(source, output);
|
||||
Relu.Batch(source, output);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ public class ReluValidationTests
|
||||
time = time.AddMinutes(1);
|
||||
}
|
||||
|
||||
var result = Relu.Calculate(source);
|
||||
var result = Relu.Batch(source);
|
||||
|
||||
for (int i = 0; i < testValues.Length; i++)
|
||||
{
|
||||
@@ -54,7 +54,7 @@ public class ReluValidationTests
|
||||
double[] testValues = { -10.0, -5.0, -1.0, -0.5, 0.0, 0.5, 1.0, 5.0, 10.0 };
|
||||
double[] output = new double[testValues.Length];
|
||||
|
||||
Relu.Calculate(testValues, output);
|
||||
Relu.Batch(testValues, output);
|
||||
|
||||
for (int i = 0; i < testValues.Length; i++)
|
||||
{
|
||||
@@ -70,9 +70,9 @@ public class ReluValidationTests
|
||||
int count = 100;
|
||||
var gbm = new GBM(startPrice: 100, mu: 0.0, sigma: 0.5, seed: 43000);
|
||||
var bars = gbm.Fetch(count, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
|
||||
var source = Change.Calculate(bars.Close);
|
||||
var source = Change.Batch(bars.Close);
|
||||
|
||||
var result = Relu.Calculate(source);
|
||||
var result = Relu.Batch(source);
|
||||
|
||||
for (int i = 0; i < result.Count; i++)
|
||||
{
|
||||
@@ -87,7 +87,7 @@ public class ReluValidationTests
|
||||
double[] positiveValues = { 0.001, 0.1, 1.0, 10.0, 100.0, 1000.0 };
|
||||
double[] output = new double[positiveValues.Length];
|
||||
|
||||
Relu.Calculate(positiveValues, output);
|
||||
Relu.Batch(positiveValues, output);
|
||||
|
||||
for (int i = 0; i < positiveValues.Length; i++)
|
||||
{
|
||||
@@ -102,7 +102,7 @@ public class ReluValidationTests
|
||||
double[] negativeValues = { -0.001, -0.1, -1.0, -10.0, -100.0, -1000.0 };
|
||||
double[] output = new double[negativeValues.Length];
|
||||
|
||||
Relu.Calculate(negativeValues, output);
|
||||
Relu.Batch(negativeValues, output);
|
||||
|
||||
for (int i = 0; i < negativeValues.Length; i++)
|
||||
{
|
||||
@@ -125,7 +125,7 @@ public class ReluValidationTests
|
||||
int count = 100;
|
||||
var gbm = new GBM(startPrice: 100, mu: 0.05, sigma: 0.3, seed: 43001);
|
||||
var bars = gbm.Fetch(count, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
|
||||
var source = Change.Calculate(bars.Close);
|
||||
var source = Change.Batch(bars.Close);
|
||||
|
||||
// Streaming
|
||||
var streaming = new Relu();
|
||||
@@ -137,11 +137,11 @@ public class ReluValidationTests
|
||||
}
|
||||
|
||||
// Batch
|
||||
var batch = Relu.Calculate(source);
|
||||
var batch = Relu.Batch(source);
|
||||
|
||||
// Span
|
||||
var spanOutput = new double[source.Count];
|
||||
Relu.Calculate(source.Values.ToArray(), spanOutput);
|
||||
Relu.Batch(source.Values.ToArray(), spanOutput);
|
||||
|
||||
// All three should match
|
||||
for (int i = 0; i < source.Count; i++)
|
||||
|
||||
@@ -25,6 +25,7 @@ public sealed class Relu : AbstractBase
|
||||
private State _state, _p_state;
|
||||
private readonly ITValuePublisher? _source;
|
||||
private readonly TValuePublishedHandler? _handler;
|
||||
private bool _disposed;
|
||||
|
||||
public override bool IsHot => true; // No warmup needed
|
||||
|
||||
@@ -35,7 +36,7 @@ public sealed class Relu : AbstractBase
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Initializes a new ReLU indicator chained to a source publisher.
|
||||
/// </summary>
|
||||
/// <param name="source">Source indicator for chaining</param>
|
||||
public Relu(ITValuePublisher source) : this()
|
||||
@@ -47,9 +48,13 @@ public sealed class Relu : 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);
|
||||
}
|
||||
@@ -104,7 +109,7 @@ public sealed class Relu : AbstractBase
|
||||
var vSpan = System.Runtime.InteropServices.CollectionsMarshal.AsSpan(v);
|
||||
|
||||
// Use vectorized Calculate for batch processing
|
||||
Calculate(source.Values, vSpan);
|
||||
Batch(source.Values, vSpan);
|
||||
source.Times.CopyTo(tSpan);
|
||||
|
||||
// Restore state from last value
|
||||
@@ -130,7 +135,7 @@ public sealed class Relu : AbstractBase
|
||||
}
|
||||
}
|
||||
|
||||
public static TSeries Calculate(TSeries source)
|
||||
public static TSeries Batch(TSeries source)
|
||||
{
|
||||
var indicator = new Relu();
|
||||
return indicator.Update(source);
|
||||
@@ -139,7 +144,7 @@ public sealed class Relu : AbstractBase
|
||||
/// <summary>
|
||||
/// Calculates ReLU over a span of values with SIMD optimization.
|
||||
/// </summary>
|
||||
public static void Calculate(ReadOnlySpan<double> source, Span<double> output)
|
||||
public static void Batch(ReadOnlySpan<double> source, Span<double> output)
|
||||
{
|
||||
if (source.Length == 0)
|
||||
{
|
||||
@@ -213,10 +218,17 @@ public sealed class Relu : AbstractBase
|
||||
}
|
||||
}
|
||||
|
||||
public static (TSeries Results, Relu Indicator) Calculate(TSeries source)
|
||||
{
|
||||
var indicator = new Relu();
|
||||
TSeries results = indicator.Update(source);
|
||||
return (results, indicator);
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
_state = default;
|
||||
_p_state = default;
|
||||
Last = default;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user