diff --git a/.editorconfig b/.editorconfig index 030b2cc8..2350d179 100644 --- a/.editorconfig +++ b/.editorconfig @@ -20,12 +20,43 @@ resharper_for_can_be_converted_to_foreach_highlighting = none resharper_unused_parameter_local_highlighting = none resharper_conditional_access_qualifier_is_non_nullable_according_to_api_contract_highlighting = none resharper_redundant_lambda_parameter_type_highlighting = none +resharper_not_accessed_positional_property_local_highlighting = none +resharper_possible_loss_of_fraction_highlighting = hint + +# Suppress JB InspectCode false positives / intentional patterns +resharper_unused_method_return_value_local_highlighting = none +resharper_member_initializer_value_ignored_highlighting = none +resharper_redundant_explicit_array_creation_highlighting = hint +resharper_with_expression_modifies_all_members_highlighting = hint +resharper_redundant_delegate_creation_highlighting = hint +resharper_redundant_default_member_initializer_highlighting = hint +resharper_redundant_empty_switch_section_highlighting = hint +resharper_empty_for_statement_highlighting = hint +resharper_using_statement_resource_initialization_highlighting = hint +resharper_unused_member_local_highlighting = hint +resharper_not_accessed_variable_highlighting = hint +resharper_private_field_can_be_converted_to_local_variable_highlighting = hint +resharper_collection_never_queried_local_highlighting = hint +resharper_unused_auto_property_accessor_local_highlighting = hint +resharper_unused_tuple_component_in_return_value_highlighting = hint +resharper_convert_type_check_to_null_check_highlighting = hint +resharper_redundant_name_qualifier_highlighting = hint +resharper_redundant_suppress_nullable_warning_expression_highlighting = hint +resharper_possible_null_reference_exception_highlighting = hint +resharper_assign_null_to_not_null_attribute_highlighting = hint +resharper_default_struct_equality_is_used_global_highlighting = hint +dotnet_diagnostic.CS0628.severity = none +dotnet_diagnostic.CS8602.severity = none +dotnet_diagnostic.CS8601.severity = none +dotnet_diagnostic.CS0660.severity = none +dotnet_diagnostic.CS0661.severity = none resharper_redundant_cast_highlighting = hint resharper_redundant_assignment_highlighting = hint resharper_not_accessed_field_local_highlighting = hint resharper_unused_auto_property_accessor_global_highlighting = hint resharper_condition_is_always_true_or_false_highlighting = hint +resharper_condition_is_always_true_or_false_according_to_nullable_api_contract_highlighting = hint resharper_access_to_modified_closure_highlighting = hint resharper_generic_enumerator_not_disposed_highlighting = hint @@ -85,6 +116,10 @@ csharp_style_var_for_built_in_types = false:silent csharp_style_var_when_type_is_apparent = true:suggestion csharp_style_var_elsewhere = false:silent +[python/src/**.cs] +resharper_enforce_if_statement_braces_highlighting = none +csharp_prefer_braces = false:silent + [ndepend/**] dotnet_analyzer_diagnostic.severity = none generated_code = true diff --git a/.gitignore b/.gitignore index d125cc48..5f04fe62 100644 --- a/.gitignore +++ b/.gitignore @@ -36,9 +36,8 @@ bld/ *.coverage *.coveragexml -# NDepend -ndepend/NDependOut/ -ndepend/coverage/ +# NDepend (entire directory — tooling + generated output) +ndepend/ # BenchmarkDotNet BenchmarkDotNet.Artifacts/ @@ -49,7 +48,7 @@ BenchmarkDotNet.Artifacts/ # Temporary files and agent workspace temp/ -temp_pandas_ta/ +pandas_ta/ temp_decompile/ Invoke-WebRequest/ .temp/ diff --git a/QuanTAlib.slnx b/QuanTAlib.slnx index f448c0f5..b91e4df7 100644 --- a/QuanTAlib.slnx +++ b/QuanTAlib.slnx @@ -10,4 +10,7 @@ + + + diff --git a/README.md b/README.md index 521cd57d..02703b4d 100644 --- a/README.md +++ b/README.md @@ -8,14 +8,14 @@ [![.NET](https://img.shields.io/badge/.NET-8.0%20|%2010.0-blue?style=flat-square)](https://dotnet.microsoft.com/en-us/download/dotnet) [![Indicators](https://img.shields.io/badge/%23%20Indicators-393-blue?style=flat-square)](lib/_index.md) -[![Classes](ndepend/badges/classes.svg)](ndepend/ndependout/ndependreport.html) -[![Files](ndepend/badges/files.svg)](ndepend/ndependout/ndependreport.html) -[![Methods](ndepend/badges/methods.svg)](ndepend/ndependout/ndependreport.html) -[![Lines of Code](ndepend/badges/loc.svg)](ndepend/ndependout/ndependreport.html) -[![Public APIs](ndepend/badges/public-api.svg)](ndepend/ndependout/ndependreport.html) -[![Comments](ndepend/badges/comments.svg)](ndepend/ndependout/ndependreport.html) +[![Classes](docs/img/classes.svg)](docs/ndepend.md) +[![Files](docs/img/files.svg)](docs/ndepend.md) +[![Methods](docs/img/methods.svg)](docs/ndepend.md) +[![Lines of Code](docs/img/loc.svg)](docs/ndepend.md) +[![Public APIs](docs/img/public-api.svg)](docs/ndepend.md) +[![Comments](docs/img/comments.svg)](docs/ndepend.md) -Static code analysis provided by [ndepend](https://www.ndepend.com/) +Static code analysis provided by [ndepend](https://www.ndepend.com/) # QuanTAlib - Quantitative Technical Indicators Without Compromises diff --git a/ndepend/badges/classes.svg b/docs/img/classes.svg similarity index 93% rename from ndepend/badges/classes.svg rename to docs/img/classes.svg index 811fc0a3..104c8248 100644 --- a/ndepend/badges/classes.svg +++ b/docs/img/classes.svg @@ -1,6 +1,6 @@ - # Classes: 1583 + # Classes: 1126 @@ -16,7 +16,7 @@ # Classes - - 1583 + + 1126 \ No newline at end of file diff --git a/ndepend/badges/comments.svg b/docs/img/comments.svg similarity index 92% rename from ndepend/badges/comments.svg rename to docs/img/comments.svg index ae2b6ac2..e460a53a 100644 --- a/ndepend/badges/comments.svg +++ b/docs/img/comments.svg @@ -1,6 +1,6 @@ - Percentage of Comments: 31.22 + Percentage of Comments: 33.35 @@ -16,7 +16,7 @@ Percentage of Comments - - 31.22 + + 33.35 \ No newline at end of file diff --git a/ndepend/badges/complexity.svg b/docs/img/complexity.svg similarity index 91% rename from ndepend/badges/complexity.svg rename to docs/img/complexity.svg index b25dd871..f10d4fbd 100644 --- a/ndepend/badges/complexity.svg +++ b/docs/img/complexity.svg @@ -1,6 +1,6 @@ - Average Cyclomatic Complexity for Methods: 2.08 + Average Cyclomatic Complexity for Methods: 2.16 @@ -16,7 +16,7 @@ Average Cyclomatic Complexity for Methods - - 2.08 + + 2.16 \ No newline at end of file diff --git a/ndepend/badges/files.svg b/docs/img/files.svg similarity index 92% rename from ndepend/badges/files.svg rename to docs/img/files.svg index c33c7a2a..7720ce1f 100644 --- a/ndepend/badges/files.svg +++ b/docs/img/files.svg @@ -1,6 +1,6 @@ - # Source Files: 1685 + # Source Files: 1812 @@ -16,7 +16,7 @@ # Source Files - - 1685 + + 1812 \ No newline at end of file diff --git a/ndepend/badges/loc.svg b/docs/img/loc.svg similarity index 92% rename from ndepend/badges/loc.svg rename to docs/img/loc.svg index 60f49dd8..5db9379b 100644 --- a/ndepend/badges/loc.svg +++ b/docs/img/loc.svg @@ -1,6 +1,6 @@ - # Lines of Code: 182513 + # Lines of Code: 145378 @@ -16,7 +16,7 @@ # Lines of Code - - 182513 + + 145378 \ No newline at end of file diff --git a/ndepend/badges/methods.svg b/docs/img/methods.svg similarity index 93% rename from ndepend/badges/methods.svg rename to docs/img/methods.svg index 97a982c5..65fcf2a0 100644 --- a/ndepend/badges/methods.svg +++ b/docs/img/methods.svg @@ -1,6 +1,6 @@ - # Methods: 20231 + # Methods: 14666 @@ -16,7 +16,7 @@ # Methods - - 20231 + + 14666 \ No newline at end of file diff --git a/ndepend/badges/public-api.svg b/docs/img/public-api.svg similarity index 92% rename from ndepend/badges/public-api.svg rename to docs/img/public-api.svg index b4fc5f9b..c3717bfa 100644 --- a/ndepend/badges/public-api.svg +++ b/docs/img/public-api.svg @@ -1,6 +1,6 @@ - # Public Types: 1731 + # Public Types: 1165 @@ -16,7 +16,7 @@ # Public Types - - 1731 + + 1165 \ No newline at end of file diff --git a/docs/ndepend.md b/docs/ndepend.md index 3feb0eb9..4db3e4d0 100644 --- a/docs/ndepend.md +++ b/docs/ndepend.md @@ -73,7 +73,7 @@ This script: 1. Builds the solution in Release configuration 2. Runs NDepend analysis against the compiled assemblies 3. Generates the HTML report at `ndepend/NDependOut/NDependReport.html` -4. Updates quality gate badges in `ndepend/badges/` +4. Updates quality gate badges in `docs/img/` **Prerequisites:** NDepend license (set `NDEPEND_LICENSE` environment variable). Without a license, the script runs but produces warnings instead of full analysis. diff --git a/global.json b/global.json deleted file mode 100644 index 991126f1..00000000 --- a/global.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "sdk": { - "version": "10.0.103", - "allowPrerelease": false - } -} \ No newline at end of file diff --git a/lib/QuanTAlib.Tests.csproj b/lib/QuanTAlib.Tests.csproj index e351131b..bc69a21b 100644 --- a/lib/QuanTAlib.Tests.csproj +++ b/lib/QuanTAlib.Tests.csproj @@ -8,6 +8,7 @@ true $(NoWarn);CS8892 false + https://www.myget.org/F/ooplesfinance_stockindicators/api/v3/index.json diff --git a/lib/channels/aberr/Aberr.cs b/lib/channels/aberr/Aberr.cs index 492dd580..edf80c70 100644 --- a/lib/channels/aberr/Aberr.cs +++ b/lib/channels/aberr/Aberr.cs @@ -96,12 +96,12 @@ public sealed class Aberr : ITValuePublisher, IDisposable { if (period <= 0) { - throw new ArgumentException("Period must be greater than 0", nameof(period)); + throw new ArgumentOutOfRangeException(nameof(period), "Period must be greater than 0"); } if (multiplier <= 0) { - throw new ArgumentException("Multiplier must be greater than 0", nameof(multiplier)); + throw new ArgumentOutOfRangeException(nameof(multiplier), "Multiplier must be greater than 0"); } _period = period; @@ -132,13 +132,13 @@ public sealed class Aberr : ITValuePublisher, IDisposable _source.Pub += _handler; } - private void HandleValue(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); + private void HandleValue(object? _, in TValueEventArgs e) => Update(e.Value, e.IsNew); /// /// Helper to invoke the Pub event. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void PubEvent(TValue value, bool isNew = true) + private void PubEvent(TValue value, bool isNew) { Pub?.Invoke(this, new TValueEventArgs { Value = value, IsNew = isNew }); } @@ -301,7 +301,8 @@ public sealed class Aberr : ITValuePublisher, IDisposable } else { - double recalcSumSource = 0, recalcSumDeviation = 0; + double recalcSumSource = 0; + double recalcSumDeviation = 0; for (int k = 0; k < period; k++) { recalcSumSource += buffers.Source[k]; @@ -439,11 +440,11 @@ public sealed class Aberr : ITValuePublisher, IDisposable [StructLayout(LayoutKind.Auto)] private ref struct ScalarState { - public double SumSource; - public double SumDeviation; - public double LastValidValue; - public int BufferIndex; - public int TickCount; + internal double SumSource; + internal double SumDeviation; + internal double LastValidValue; + internal int BufferIndex; + internal int TickCount; } /// @@ -452,8 +453,8 @@ public sealed class Aberr : ITValuePublisher, IDisposable [StructLayout(LayoutKind.Auto)] private readonly ref struct WorkBuffers(Span source, Span deviation) { - public readonly Span Source = source; - public readonly Span Deviation = deviation; + internal readonly Span Source = source; + internal readonly Span Deviation = deviation; } /// @@ -510,12 +511,12 @@ public sealed class Aberr : ITValuePublisher, IDisposable if (period <= 0) { - throw new ArgumentException("Period must be greater than 0", nameof(period)); + throw new ArgumentOutOfRangeException(nameof(period), "Period must be greater than 0"); } if (multiplier <= 0) { - throw new ArgumentException("Multiplier must be greater than 0", nameof(multiplier)); + throw new ArgumentOutOfRangeException(nameof(multiplier), "Multiplier must be greater than 0"); } if (len == 0) @@ -701,5 +702,6 @@ public sealed class Aberr : ITValuePublisher, IDisposable } _disposed = true; } + GC.SuppressFinalize(this); } } diff --git a/lib/channels/accbands/AccBands.cs b/lib/channels/accbands/AccBands.cs index 9c8efc57..d9279d98 100644 --- a/lib/channels/accbands/AccBands.cs +++ b/lib/channels/accbands/AccBands.cs @@ -528,14 +528,14 @@ public sealed class AccBands : ITValuePublisher, IDisposable [StructLayout(LayoutKind.Auto)] private ref struct ScalarState { - public double SumAdjHigh; - public double SumAdjLow; - public double SumClose; - public double LastValidHigh; - public double LastValidLow; - public double LastValidClose; - public int BufferIndex; - public int TickCount; + internal double SumAdjHigh; + internal double SumAdjLow; + internal double SumClose; + internal double LastValidHigh; + internal double LastValidLow; + internal double LastValidClose; + internal int BufferIndex; + internal int TickCount; } /// @@ -544,9 +544,9 @@ public sealed class AccBands : ITValuePublisher, IDisposable [StructLayout(LayoutKind.Auto)] private readonly ref struct WorkBuffers(Span adjHigh, Span adjLow, Span close) { - public readonly Span AdjHigh = adjHigh; - public readonly Span AdjLow = adjLow; - public readonly Span Close = close; + internal readonly Span AdjHigh = adjHigh; + internal readonly Span AdjLow = adjLow; + internal readonly Span Close = close; } /// diff --git a/lib/channels/apz/Apz.cs b/lib/channels/apz/Apz.cs index f339b444..11d79623 100644 --- a/lib/channels/apz/Apz.cs +++ b/lib/channels/apz/Apz.cs @@ -439,15 +439,15 @@ public sealed class Apz : ITValuePublisher [StructLayout(LayoutKind.Auto)] private ref struct ScalarState { - public double Ema1Price; - public double Ema2Price; - public double Ema1Range; - public double Ema2Range; - public double E; - public double LastValidPrice; - public double LastValidHigh; - public double LastValidLow; - public bool IsHot; + internal double Ema1Price; + internal double Ema2Price; + internal double Ema1Range; + internal double Ema2Range; + internal double E; + internal double LastValidPrice; + internal double LastValidHigh; + internal double LastValidLow; + internal bool IsHot; } /// diff --git a/lib/channels/dchannel/Dchannel.cs b/lib/channels/dchannel/Dchannel.cs index 64631797..1ddad134 100644 --- a/lib/channels/dchannel/Dchannel.cs +++ b/lib/channels/dchannel/Dchannel.cs @@ -269,8 +269,8 @@ public sealed class Dchannel : ITValuePublisher try { - QuanTAlib.Highest.Batch(high, top.AsSpan(0, len), period); - QuanTAlib.Lowest.Batch(low, bot.AsSpan(0, len), period); + Highest.Batch(high, top.AsSpan(0, len), period); + Lowest.Batch(low, bot.AsSpan(0, len), period); for (int i = 0; i < len; i++) { diff --git a/lib/channels/decaychannel/Decaychannel.cs b/lib/channels/decaychannel/Decaychannel.cs index 299921b8..bbf98faf 100644 --- a/lib/channels/decaychannel/Decaychannel.cs +++ b/lib/channels/decaychannel/Decaychannel.cs @@ -16,8 +16,8 @@ public sealed class Decaychannel : ITValuePublisher private readonly double _decayLambda; private readonly double[] _hBuf; private readonly double[] _lBuf; - private readonly double[] _hBuf_prev; - private readonly double[] _lBuf_prev; + private readonly double[] _hBufPrev; + private readonly double[] _lBufPrev; private int _count; private long _index; @@ -42,7 +42,7 @@ public sealed class Decaychannel : ITValuePublisher long Index); private State _state; - private State _p_state; + private State _pState; private readonly TBarPublishedHandler _barHandler; @@ -66,8 +66,8 @@ public sealed class Decaychannel : ITValuePublisher _decayLambda = Math.Log(2.0) / period; _hBuf = new double[_period]; _lBuf = new double[_period]; - _hBuf_prev = new double[_period]; - _lBuf_prev = new double[_period]; + _hBufPrev = new double[_period]; + _lBufPrev = new double[_period]; _count = 0; _index = -1; _currentMax = double.NaN; @@ -78,7 +78,7 @@ public sealed class Decaychannel : ITValuePublisher _minAge = 0; _state = new State(double.NaN, double.NaN, double.NaN, double.NaN, 0, 0, double.NaN, double.NaN, 0, -1); - _p_state = _state; + _pState = _state; Name = $"Decaychannel({period})"; WarmupPeriod = period; @@ -135,25 +135,25 @@ public sealed class Decaychannel : ITValuePublisher _index); // Save buffer contents - Array.Copy(_hBuf, _hBuf_prev, _period); - Array.Copy(_lBuf, _lBuf_prev, _period); + Array.Copy(_hBuf, _hBufPrev, _period); + Array.Copy(_lBuf, _lBufPrev, _period); } private void RestoreState() { - _currentMax = _p_state.CurrentMax; - _currentMin = _p_state.CurrentMin; - _maxAge = _p_state.MaxAge; - _minAge = _p_state.MinAge; - _rawMax = _p_state.RawMax; - _rawMin = _p_state.RawMin; - _count = _p_state.Count; - _index = _p_state.Index; - _state = _p_state; + _currentMax = _pState.CurrentMax; + _currentMin = _pState.CurrentMin; + _maxAge = _pState.MaxAge; + _minAge = _pState.MinAge; + _rawMax = _pState.RawMax; + _rawMin = _pState.RawMin; + _count = _pState.Count; + _index = _pState.Index; + _state = _pState; // Restore buffer contents - Array.Copy(_hBuf_prev, _hBuf, _period); - Array.Copy(_lBuf_prev, _lBuf, _period); + Array.Copy(_hBufPrev, _hBuf, _period); + Array.Copy(_lBufPrev, _lBuf, _period); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -200,7 +200,7 @@ public sealed class Decaychannel : ITValuePublisher { // Save state BEFORE advancing (this is state from end of previous bar) SaveState(); - _p_state = _state; + _pState = _state; // Now advance to new bar _index++; @@ -379,8 +379,8 @@ public sealed class Decaychannel : ITValuePublisher { Array.Clear(_hBuf); Array.Clear(_lBuf); - Array.Clear(_hBuf_prev); - Array.Clear(_lBuf_prev); + Array.Clear(_hBufPrev); + Array.Clear(_lBufPrev); _count = 0; _index = -1; _currentMax = double.NaN; @@ -390,7 +390,7 @@ public sealed class Decaychannel : ITValuePublisher _maxAge = 0; _minAge = 0; _state = new State(double.NaN, double.NaN, double.NaN, double.NaN, 0, 0, double.NaN, double.NaN, 0, -1); - _p_state = _state; + _pState = _state; Last = default; Upper = default; Lower = default; @@ -436,8 +436,8 @@ public sealed class Decaychannel : ITValuePublisher try { - QuanTAlib.Highest.Batch(high, rawMaxArr.AsSpan(0, len), period); - QuanTAlib.Lowest.Batch(low, rawMinArr.AsSpan(0, len), period); + Highest.Batch(high, rawMaxArr.AsSpan(0, len), period); + Lowest.Batch(low, rawMinArr.AsSpan(0, len), period); double currentMax = double.NaN; double currentMin = double.NaN; diff --git a/lib/channels/vwapsd/Vwapsd.Quantower.cs b/lib/channels/vwapsd/Vwapsd.Quantower.cs index fb7355ec..350daa36 100644 --- a/lib/channels/vwapsd/Vwapsd.Quantower.cs +++ b/lib/channels/vwapsd/Vwapsd.Quantower.cs @@ -58,18 +58,6 @@ public class VwapsdIndicator : Indicator, IWatchlistIndicator base.OnInit(); } - private void UpdateSeriesNames() - { - if (UpperSeries != null) - { - UpperSeries.Name = $"Upper (+{NumDevs:F1}σ)"; - } - if (LowerSeries != null) - { - LowerSeries.Name = $"Lower (-{NumDevs:F1}σ)"; - } - } - protected override void OnUpdate(UpdateArgs args) { var item = HistoricalData[0, SeekOriginHistory.End]; diff --git a/lib/core/avgprice/Avgprice.cs b/lib/core/avgprice/Avgprice.cs index b8710434..db181582 100644 --- a/lib/core/avgprice/Avgprice.cs +++ b/lib/core/avgprice/Avgprice.cs @@ -132,8 +132,6 @@ public sealed class Avgprice : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -201,8 +199,6 @@ public sealed class Avgprice : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -210,8 +206,6 @@ public sealed class Avgprice : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 0, 0, 0, 0, 0); diff --git a/lib/core/ha/Ha.cs b/lib/core/ha/Ha.cs index ff2e659a..1987f350 100644 --- a/lib/core/ha/Ha.cs +++ b/lib/core/ha/Ha.cs @@ -117,8 +117,6 @@ public sealed class Ha : AbstractBase return result; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -204,8 +202,6 @@ public sealed class Ha : AbstractBase PubEvent(Last, isNew); return LastBar; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -213,8 +209,6 @@ public sealed class Ha : AbstractBase Update(new TValue(DateTime.UtcNow.Ticks, source[i]), isNew: true); } } - - /// public override void Reset() { _s = default; diff --git a/lib/core/medprice/Medprice.cs b/lib/core/medprice/Medprice.cs index 16e22eab..98bee37f 100644 --- a/lib/core/medprice/Medprice.cs +++ b/lib/core/medprice/Medprice.cs @@ -130,8 +130,6 @@ public sealed class Medprice : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -197,8 +195,6 @@ public sealed class Medprice : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -206,8 +202,6 @@ public sealed class Medprice : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 0, 0, 0); diff --git a/lib/core/midbody/Midbody.cs b/lib/core/midbody/Midbody.cs index b8ffaba7..1872f05a 100644 --- a/lib/core/midbody/Midbody.cs +++ b/lib/core/midbody/Midbody.cs @@ -130,8 +130,6 @@ public sealed class Midbody : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -197,8 +195,6 @@ public sealed class Midbody : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -206,8 +202,6 @@ public sealed class Midbody : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 0, 0, 0); diff --git a/lib/core/midprice/Midprice.cs b/lib/core/midprice/Midprice.cs index ea5a4ed7..159bf94d 100644 --- a/lib/core/midprice/Midprice.cs +++ b/lib/core/midprice/Midprice.cs @@ -135,8 +135,6 @@ public sealed class Midprice : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { var result = new TSeries(source.Count); @@ -178,8 +176,6 @@ public sealed class Midprice : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { TimeSpan interval = step ?? TimeSpan.FromSeconds(1); @@ -191,8 +187,6 @@ public sealed class Midprice : AbstractBase time += interval; } } - - /// public override void Reset() { _highBuffer.Clear(); diff --git a/lib/core/typprice/Typprice.cs b/lib/core/typprice/Typprice.cs index edafbd37..82d77867 100644 --- a/lib/core/typprice/Typprice.cs +++ b/lib/core/typprice/Typprice.cs @@ -132,8 +132,6 @@ public sealed class Typprice : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -200,8 +198,6 @@ public sealed class Typprice : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -209,8 +205,6 @@ public sealed class Typprice : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 0, 0, 0, 0); diff --git a/lib/core/wclprice/Wclprice.cs b/lib/core/wclprice/Wclprice.cs index 43dd9271..da0add8d 100644 --- a/lib/core/wclprice/Wclprice.cs +++ b/lib/core/wclprice/Wclprice.cs @@ -131,8 +131,6 @@ public sealed class Wclprice : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -199,8 +197,6 @@ public sealed class Wclprice : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -208,8 +204,6 @@ public sealed class Wclprice : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 0, 0, 0, 0); diff --git a/lib/cycles/ccyc/Ccyc.Tests.cs b/lib/cycles/ccyc/Ccyc.Tests.cs index 6314442f..e4faf26d 100644 --- a/lib/cycles/ccyc/Ccyc.Tests.cs +++ b/lib/cycles/ccyc/Ccyc.Tests.cs @@ -287,13 +287,6 @@ public class CcycTests Assert.Equal(source.Count, batchResults.Count); - // Compare last 50 values - for (int i = source.Count - 50; i < source.Count; i++) - { - // Streaming processes all bars and streaming result is the last one - // But for exact comparison, batch results should match streaming approach - } - // The batch method creates a fresh indicator and calls Update(TSeries), // which processes sequentially — should match streaming exactly var ccyc2 = new Ccyc(); diff --git a/lib/dynamics/ichimoku/Ichimoku.cs b/lib/dynamics/ichimoku/Ichimoku.cs index 901a7ab8..2d97ab6d 100644 --- a/lib/dynamics/ichimoku/Ichimoku.cs +++ b/lib/dynamics/ichimoku/Ichimoku.cs @@ -208,8 +208,8 @@ public sealed class Ichimoku : ITValuePublisher _p_state = _state; Array.Fill(_highBuffer, double.NaN); Array.Fill(_lowBuffer, double.NaN); - Array.Copy(_highBuffer, _p_highBuffer!, _highBuffer.Length); - Array.Copy(_lowBuffer, _p_lowBuffer!, _lowBuffer.Length); + Array.Copy(_highBuffer, _p_highBuffer, _highBuffer.Length); + Array.Copy(_lowBuffer, _p_lowBuffer, _lowBuffer.Length); Tenkan = default; Kijun = default; SenkouA = default; @@ -299,14 +299,14 @@ public sealed class Ichimoku : ITValuePublisher if (isNew) { _p_state = _state; - Array.Copy(_highBuffer, _p_highBuffer!, _highBuffer.Length); - Array.Copy(_lowBuffer, _p_lowBuffer!, _lowBuffer.Length); + Array.Copy(_highBuffer, _p_highBuffer, _highBuffer.Length); + Array.Copy(_lowBuffer, _p_lowBuffer, _lowBuffer.Length); } else { _state = _p_state; - Array.Copy(_p_highBuffer!, _highBuffer, _highBuffer.Length); - Array.Copy(_p_lowBuffer!, _lowBuffer, _lowBuffer.Length); + Array.Copy(_p_highBuffer, _highBuffer, _highBuffer.Length); + Array.Copy(_p_lowBuffer, _lowBuffer, _lowBuffer.Length); } var (high, low, close) = GetValidHLC(bar); diff --git a/lib/dynamics/pfe/Pfe.cs b/lib/dynamics/pfe/Pfe.cs index db0ef5b7..cc08c68e 100644 --- a/lib/dynamics/pfe/Pfe.cs +++ b/lib/dynamics/pfe/Pfe.cs @@ -198,8 +198,6 @@ public sealed class Pfe : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { if (source.Count == 0) @@ -225,8 +223,6 @@ public sealed class Pfe : AbstractBase Last = new TValue(tSpan[len - 1], vSpan[len - 1]); return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -457,8 +453,6 @@ public sealed class Pfe : AbstractBase } } } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void Reset() { diff --git a/lib/dynamics/ravi/Ravi.cs b/lib/dynamics/ravi/Ravi.cs index bb4dbc50..b649054a 100644 --- a/lib/dynamics/ravi/Ravi.cs +++ b/lib/dynamics/ravi/Ravi.cs @@ -184,8 +184,6 @@ public sealed class Ravi : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { if (source.Count == 0) @@ -211,8 +209,6 @@ public sealed class Ravi : AbstractBase Last = new TValue(tSpan[len - 1], vSpan[len - 1]); return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -465,8 +461,6 @@ public sealed class Ravi : AbstractBase } } } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void Reset() { diff --git a/lib/dynamics/ttm_squeeze/TtmSqueeze.Validation.Tests.cs b/lib/dynamics/ttm_squeeze/TtmSqueeze.Validation.Tests.cs index ab0bb038..9058adb4 100644 --- a/lib/dynamics/ttm_squeeze/TtmSqueeze.Validation.Tests.cs +++ b/lib/dynamics/ttm_squeeze/TtmSqueeze.Validation.Tests.cs @@ -49,7 +49,7 @@ public class TtmSqueezeValidationTests } // Momentum should be near zero since price = midline - Assert.True(System.Math.Abs(squeeze.Momentum.Value) < 1.0); + Assert.True(Math.Abs(squeeze.Momentum.Value) < 1.0); } [Fact] @@ -250,7 +250,7 @@ public class TtmSqueezeValidationTests for (int i = 0; i < 50; i++) { - double price = 100 + System.Math.Sin(i * 0.2) * 10; + double price = 100 + Math.Sin(i * 0.2) * 10; double high = price + 2; double low = price - 2; source.Add(new TBar(baseTime + i * 60000, price, high, low, price + 0.5, 1000)); @@ -306,7 +306,7 @@ public class TtmSqueezeValidationTests Assert.True(double.IsFinite(squeeze.Momentum.Value)); // With constant price, donchian midline = price, so momentum should be near 0 - Assert.True(System.Math.Abs(squeeze.Momentum.Value) < 0.01); + Assert.True(Math.Abs(squeeze.Momentum.Value) < 0.01); } [Fact] diff --git a/lib/dynamics/vhf/Vhf.cs b/lib/dynamics/vhf/Vhf.cs index 22578b28..feaef26d 100644 --- a/lib/dynamics/vhf/Vhf.cs +++ b/lib/dynamics/vhf/Vhf.cs @@ -184,8 +184,6 @@ public sealed class Vhf : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { if (source.Count == 0) @@ -211,8 +209,6 @@ public sealed class Vhf : AbstractBase Last = new TValue(tSpan[len - 1], vSpan[len - 1]); return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -461,8 +457,6 @@ public sealed class Vhf : AbstractBase } } } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void Reset() { diff --git a/lib/errors/wrmse/Wrmse.cs b/lib/errors/wrmse/Wrmse.cs index 397e3706..cb6f70c9 100644 --- a/lib/errors/wrmse/Wrmse.cs +++ b/lib/errors/wrmse/Wrmse.cs @@ -187,26 +187,18 @@ public sealed class Wrmse : AbstractBase { return Update(actual, predicted, DefaultWeight, isNew); } - - /// public override TValue Update(TValue input, bool isNew = true) { throw new NotSupportedException("WRMSE requires two inputs. Use Update(actual, predicted) or Update(actual, predicted, weight)."); } - - /// public override TSeries Update(TSeries source) { throw new NotSupportedException("WRMSE requires two inputs. Use Batch(actualSeries, predictedSeries, period) or Batch(actualSeries, predictedSeries, weightsSeries, period)."); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { throw new NotSupportedException("WRMSE requires two inputs."); } - - /// public override void Reset() { _weightedErrorBuffer.Clear(); diff --git a/lib/feeds/csvfeed/CsvFeed.cs b/lib/feeds/csvfeed/CsvFeed.cs index 4bbff254..407de657 100644 --- a/lib/feeds/csvfeed/CsvFeed.cs +++ b/lib/feeds/csvfeed/CsvFeed.cs @@ -16,12 +16,12 @@ internal readonly record struct ParsedOhlcv(long Time, double Open, double High, [StructLayout(LayoutKind.Auto)] internal ref struct OhlcvParseState { - public long Time; - public double Open; - public double High; - public double Low; - public double Close; - public double Volume; + internal long Time; + internal double Open; + internal double High; + internal double Low; + internal double Close; + internal double Volume; } /// diff --git a/lib/filters/agc/agc_signature.svg b/lib/filters/agc/agc_signature.svg new file mode 100644 index 00000000..bb3ca732 --- /dev/null +++ b/lib/filters/agc/agc_signature.svg @@ -0,0 +1,19694 @@ + + + + + + + + 2026-03-02T15:01:50.968359 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/alaguerre/ALaguerre.cs b/lib/filters/alaguerre/ALaguerre.cs index 2e6301a7..2c527d60 100644 --- a/lib/filters/alaguerre/ALaguerre.cs +++ b/lib/filters/alaguerre/ALaguerre.cs @@ -117,13 +117,9 @@ public sealed class ALaguerre : AbstractBase } source.Pub += Handle; } - - /// public override bool IsHot => _s.Count >= WarmupPeriod; private const int StackAllocThreshold = 512; - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -203,8 +199,6 @@ public sealed class ALaguerre : AbstractBase } return _lastValidValue; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public override TValue Update(TValue input, bool isNew = true) { @@ -230,8 +224,6 @@ public sealed class ALaguerre : AbstractBase PubEvent(Last, isNew); return Last; } - - /// [MethodImpl(MethodImplOptions.AggressiveOptimization)] public override TSeries Update(TSeries source) { @@ -571,8 +563,6 @@ public sealed class ALaguerre : AbstractBase coeffBuf, ref cHead, ref cCount, ref state, ref lastValid); } - - /// public override void Reset() { _s = State.New(); diff --git a/lib/filters/baxterking/BaxterKing.cs b/lib/filters/baxterking/BaxterKing.cs index 0d3a1592..6089a88e 100644 --- a/lib/filters/baxterking/BaxterKing.cs +++ b/lib/filters/baxterking/BaxterKing.cs @@ -247,9 +247,6 @@ public sealed class BaxterKing : AbstractBase } } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static double SoftBandPass(double value) => value; - public static TSeries Batch(TSeries source, int pLow = 6, int pHigh = 32, int k = 12) { double[] input = source.Values.ToArray(); diff --git a/lib/filters/butter2/Butter2.cs b/lib/filters/butter2/Butter2.cs index 005bc1f2..3ac0678d 100644 --- a/lib/filters/butter2/Butter2.cs +++ b/lib/filters/butter2/Butter2.cs @@ -34,7 +34,7 @@ public sealed class Butter2 : AbstractBase CalculateCoefficients(); Name = $"Butter2({_period})"; WarmupPeriod = 4 * period; - _handler = new TValuePublishedHandler(Handle); + _handler = Handle; Init(); } diff --git a/lib/filters/butter3/Butter3.cs b/lib/filters/butter3/Butter3.cs index 438d620e..fe16bfd4 100644 --- a/lib/filters/butter3/Butter3.cs +++ b/lib/filters/butter3/Butter3.cs @@ -33,7 +33,7 @@ public sealed class Butter3 : AbstractBase CalculateCoefficients(); Name = $"Butter3({_period})"; WarmupPeriod = 6 * period; - _handler = new TValuePublishedHandler(Handle); + _handler = Handle; Init(); } diff --git a/lib/filters/cfitz/Cfitz.cs b/lib/filters/cfitz/Cfitz.cs index 8434975c..32406088 100644 --- a/lib/filters/cfitz/Cfitz.cs +++ b/lib/filters/cfitz/Cfitz.cs @@ -232,19 +232,6 @@ public sealed class Cfitz : AbstractBase return weightedSum; } - /// - /// Computes the ideal band-pass weight B_j for lag j. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static double IdealWeight(double wl, double wh, int j) - { - if (j == 0) - { - return (wh - wl) / Math.PI; - } - return (Math.Sin(j * wh) - Math.Sin(j * wl)) / (Math.PI * j); - } - public static TSeries Batch(TSeries source, int pLow = 6, int pHigh = 32) { double[] input = source.Values.ToArray(); diff --git a/lib/filters/cheby1/Cheby1.cs b/lib/filters/cheby1/Cheby1.cs index 408ed3cc..8bc13c3b 100644 --- a/lib/filters/cheby1/Cheby1.cs +++ b/lib/filters/cheby1/Cheby1.cs @@ -65,7 +65,7 @@ public sealed class Cheby1 : AbstractBase double wc = 2.0 * Math.PI / period; double Wc = Math.Tan(wc * 0.5); double epsilon = Math.Sqrt(Math.Pow(10.0, safeRipple * 0.1) - 1.0); - double mu = System.Math.Asinh(1.0 / epsilon) * 0.5; + double mu = Math.Asinh(1.0 / epsilon) * 0.5; double sinhMu = Math.Sinh(mu); double coshMu = Math.Cosh(mu); double sigma = -sinhMu * Wc; @@ -226,7 +226,7 @@ public sealed class Cheby1 : AbstractBase double wc = 2.0 * Math.PI / period; double Wc = Math.Tan(wc * 0.5); double epsilon = Math.Sqrt(Math.Pow(10.0, safeRipple * 0.1) - 1.0); - double mu = System.Math.Asinh(1.0 / epsilon) * 0.5; + double mu = Math.Asinh(1.0 / epsilon) * 0.5; double sinhMu = Math.Sinh(mu); double coshMu = Math.Cosh(mu); double sigma = -sinhMu * Wc; diff --git a/lib/filters/cheby2/Cheby2.cs b/lib/filters/cheby2/Cheby2.cs index 30fbd1ed..0e7b2c88 100644 --- a/lib/filters/cheby2/Cheby2.cs +++ b/lib/filters/cheby2/Cheby2.cs @@ -65,7 +65,7 @@ public sealed class Cheby2 : AbstractBase double wc = 2.0 * Math.PI / period; double Wc = 2.0 * Math.Tan(wc * 0.5); double epsilon = 1.0 / Math.Sqrt(Math.Pow(10.0, safeAtten * 0.1) - 1.0); - double mu = System.Math.Asinh(1.0 / epsilon) * 0.5; + double mu = Math.Asinh(1.0 / epsilon) * 0.5; double sinhMu = Math.Sinh(mu); double coshMu = Math.Cosh(mu); double sqrt2 = Math.Sqrt(2.0); @@ -246,7 +246,7 @@ public sealed class Cheby2 : AbstractBase double wc = 2.0 * Math.PI / period; double Wc = 2.0 * Math.Tan(wc * 0.5); double epsilon = 1.0 / Math.Sqrt(Math.Pow(10.0, safeAtten * 0.1) - 1.0); - double mu = System.Math.Asinh(1.0 / epsilon) * 0.5; + double mu = Math.Asinh(1.0 / epsilon) * 0.5; double sinhMu = Math.Sinh(mu); double coshMu = Math.Cosh(mu); double sqrt2 = Math.Sqrt(2.0); diff --git a/lib/filters/gauss/Gauss.cs b/lib/filters/gauss/Gauss.cs index 649b3037..7dec560d 100644 --- a/lib/filters/gauss/Gauss.cs +++ b/lib/filters/gauss/Gauss.cs @@ -278,53 +278,53 @@ public sealed class Gauss : AbstractBase weights[i] *= invSum; } - // Apply filter - for (int i = 0; i < source.Length; i++) - { - double result = 0; - double wSum = 0; + // Apply filter + for (int i = 0; i < source.Length; i++) + { + double result = 0; + double wSum = 0; - // This loop logic matches the RingBuffer partial fill logic. - // If i < kernelSize, we don't have enough history. - // The available history is source[0]...source[i]. - // This history maps to the END of the kernel weights. - // E.g. if we have only 1 item (index i=0), it corresponds to weights[kernelSize-1]. + // This loop logic matches the RingBuffer partial fill logic. + // If i < kernelSize, we don't have enough history. + // The available history is source[0]...source[i]. + // This history maps to the END of the kernel weights. + // E.g. if we have only 1 item (index i=0), it corresponds to weights[kernelSize-1]. - int count = Math.Min(i + 1, kernelSize); + int count = Math.Min(i + 1, kernelSize); - for (int j = 0; j < count; j++) - { - // Source index: i - (count - 1) + j - // if j=0, source index is i - count + 1. - // if count=kernelSize, init index is i - kernelSize + 1. - // if count=1 (i=0), init index is 0. + for (int j = 0; j < count; j++) + { + // Source index: i - (count - 1) + j + // if j=0, source index is i - count + 1. + // if count=kernelSize, init index is i - kernelSize + 1. + // if count=1 (i=0), init index is 0. - int srcIdx = i - (count - 1) + j; - double val = source[srcIdx]; + int srcIdx = i - (count - 1) + j; + double val = source[srcIdx]; - if (!double.IsNaN(val)) - { - // Weight index: - // If full buffer, we use full weights 0..kernelSize-1. - // If partial, we align to end of weights. - // j=0 (oldest available) -> weights[kernelSize - count] - int weightIdx = kernelSize - count + j; + if (!double.IsNaN(val)) + { + // Weight index: + // If full buffer, we use full weights 0..kernelSize-1. + // If partial, we align to end of weights. + // j=0 (oldest available) -> weights[kernelSize - count] + int weightIdx = kernelSize - count + j; - double w = weights[weightIdx]; - result += val * w; - wSum += w; - } - } + double w = weights[weightIdx]; + result += val * w; + wSum += w; + } + } - if (wSum > 0) - { - output[i] = result / wSum; - } - else - { - output[i] = double.NaN; - } - } + if (wSum > 0) + { + output[i] = result / wSum; + } + else + { + output[i] = double.NaN; + } + } } finally { diff --git a/lib/filters/gauss/gauss_signature.svg b/lib/filters/gauss/gauss_signature.svg new file mode 100644 index 00000000..590e9f8b --- /dev/null +++ b/lib/filters/gauss/gauss_signature.svg @@ -0,0 +1,19604 @@ + + + + + + + + 2026-03-02T15:01:53.693012 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/hann/Hann.cs b/lib/filters/hann/Hann.cs index 27a7f27b..a6f658df 100644 --- a/lib/filters/hann/Hann.cs +++ b/lib/filters/hann/Hann.cs @@ -81,14 +81,11 @@ public sealed class Hann : AbstractBase [MethodImpl(MethodImplOptions.AggressiveInlining)] private void GenerateWeights() { - double coefSum = 0; double denom = Length - 1; for (int i = 0; i < Length; i++) { - double w = 0.5 * (1.0 - Math.Cos(2.0 * Math.PI * i / denom)); - _weights[i] = w; - coefSum += w; + _weights[i] = 0.5 * (1.0 - Math.Cos(2.0 * Math.PI * i / denom)); } } diff --git a/lib/filters/hp/hp_signature.svg b/lib/filters/hp/hp_signature.svg new file mode 100644 index 00000000..b06c1e35 --- /dev/null +++ b/lib/filters/hp/hp_signature.svg @@ -0,0 +1,19672 @@ + + + + + + + + 2026-03-02T15:01:56.463971 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/kalman/kalman_signature.svg b/lib/filters/kalman/kalman_signature.svg new file mode 100644 index 00000000..33eddc2d --- /dev/null +++ b/lib/filters/kalman/kalman_signature.svg @@ -0,0 +1,19669 @@ + + + + + + + + 2026-03-02T15:01:58.600642 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/laguerre/laguerre_signature.svg b/lib/filters/laguerre/laguerre_signature.svg new file mode 100644 index 00000000..e79defb8 --- /dev/null +++ b/lib/filters/laguerre/laguerre_signature.svg @@ -0,0 +1,19699 @@ + + + + + + + + 2026-03-02T15:02:01.001914 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/lms/lms_signature.svg b/lib/filters/lms/lms_signature.svg new file mode 100644 index 00000000..eae2c9b5 --- /dev/null +++ b/lib/filters/lms/lms_signature.svg @@ -0,0 +1,19405 @@ + + + + + + + + 2026-03-02T15:02:04.237059 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/oneeuro/oneeuro_signature.svg b/lib/filters/oneeuro/oneeuro_signature.svg new file mode 100644 index 00000000..d0fead12 --- /dev/null +++ b/lib/filters/oneeuro/oneeuro_signature.svg @@ -0,0 +1,19637 @@ + + + + + + + + 2026-03-02T15:02:07.493025 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/rls/rls_signature.svg b/lib/filters/rls/rls_signature.svg new file mode 100644 index 00000000..fa0716f8 --- /dev/null +++ b/lib/filters/rls/rls_signature.svg @@ -0,0 +1,19484 @@ + + + + + + + + 2026-03-02T15:02:10.485463 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/roofing/roofing_signature.svg b/lib/filters/roofing/roofing_signature.svg new file mode 100644 index 00000000..9fa9c70a --- /dev/null +++ b/lib/filters/roofing/roofing_signature.svg @@ -0,0 +1,19488 @@ + + + + + + + + 2026-03-02T15:02:13.896994 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/spbf/spbf_signature.svg b/lib/filters/spbf/spbf_signature.svg new file mode 100644 index 00000000..51d5b789 --- /dev/null +++ b/lib/filters/spbf/spbf_signature.svg @@ -0,0 +1,19761 @@ + + + + + + + + 2026-03-02T15:02:16.910049 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/filters/ssf3/Ssf3.cs b/lib/filters/ssf3/Ssf3.cs index 0d10d7e5..d8190ac2 100644 --- a/lib/filters/ssf3/Ssf3.cs +++ b/lib/filters/ssf3/Ssf3.cs @@ -33,7 +33,7 @@ public sealed class Ssf3 : AbstractBase CalculateCoefficients(); Name = $"Ssf3({_period})"; WarmupPeriod = 6 * period; - _handler = new TValuePublishedHandler(Handle); + _handler = Handle; Init(); } diff --git a/lib/filters/wavelet/wavelet_signature.svg b/lib/filters/wavelet/wavelet_signature.svg new file mode 100644 index 00000000..2f780e17 --- /dev/null +++ b/lib/filters/wavelet/wavelet_signature.svg @@ -0,0 +1,19717 @@ + + + + + + + + 2026-03-02T15:02:20.060294 + image/svg+xml + + + Matplotlib v3.10.8, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/momentum/cci/Cci.Quantower.Tests.cs b/lib/momentum/cci/Cci.Quantower.Tests.cs index d91bff0d..55e4c0cc 100644 --- a/lib/momentum/cci/Cci.Quantower.Tests.cs +++ b/lib/momentum/cci/Cci.Quantower.Tests.cs @@ -127,6 +127,6 @@ public class CciIndicatorTests public void CciIndicator_ImplementsIWatchlistIndicator() { var indicator = new CciIndicator(); - Assert.True(indicator is IWatchlistIndicator); + Assert.IsAssignableFrom(indicator); } } diff --git a/lib/momentum/cmo/Cmo.cs b/lib/momentum/cmo/Cmo.cs index 2b30c929..4f5d74c0 100644 --- a/lib/momentum/cmo/Cmo.cs +++ b/lib/momentum/cmo/Cmo.cs @@ -36,8 +36,6 @@ public sealed class Cmo : AbstractBase private readonly TValuePublishedHandler _handler; private double _prevValue; private double _p_prevValue; - - /// public override bool IsHot => _upBuffer.IsFull; /// @@ -72,9 +70,6 @@ public sealed class Cmo : AbstractBase { source.Pub += _handler; } - - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -131,8 +126,6 @@ public sealed class Cmo : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { if (source.Count == 0) @@ -167,8 +160,6 @@ public sealed class Cmo : AbstractBase { Update(args.Value, args.IsNew); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { foreach (var value in source) @@ -290,8 +281,6 @@ public sealed class Cmo : AbstractBase TSeries results = indicator.Update(source); return (results, indicator); } - - /// public override void Reset() { _upBuffer.Clear(); @@ -300,8 +289,6 @@ public sealed class Cmo : AbstractBase _p_prevValue = double.NaN; Last = default; } - - /// protected override void Dispose(bool disposing) { if (disposing) diff --git a/lib/momentum/prs/Prs.cs b/lib/momentum/prs/Prs.cs index ba808ed4..84eae8a4 100644 --- a/lib/momentum/prs/Prs.cs +++ b/lib/momentum/prs/Prs.cs @@ -145,15 +145,11 @@ public sealed class Prs : AbstractBase { return Update(new TValue(DateTime.UtcNow, baseValue), new TValue(DateTime.UtcNow, compValue), isNew); } - - /// /// Not supported for bi-input indicator. Use Update(baseValue, compValue) instead. public override TValue Update(TValue input, bool isNew = true) { throw new NotSupportedException("PRS requires two inputs (base and comparison). Use Update(baseValue, compValue)."); } - - /// /// Not supported for bi-input indicator. Use Calculate(baseSeries, compSeries, period) instead. public override TSeries Update(TSeries source) { @@ -240,8 +236,6 @@ public sealed class Prs : AbstractBase return _ema; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { throw new NotSupportedException("PRS requires two inputs. Use Prime(baseSource, compSource)."); diff --git a/lib/momentum/sam/Sam.cs b/lib/momentum/sam/Sam.cs index e501199d..4715554d 100644 --- a/lib/momentum/sam/Sam.cs +++ b/lib/momentum/sam/Sam.cs @@ -36,7 +36,6 @@ public sealed class Sam : AbstractBase private readonly double _ssC3; private const double TwoPi = 2.0 * Math.PI; - private const double HalfPi = Math.PI / 2.0; private const double Sqrt2 = 1.4142135623730951; private const int MaxCyclePeriod = 50; private const int MinCyclePeriod = 6; diff --git a/lib/oscillators/bbb/Bbb.cs b/lib/oscillators/bbb/Bbb.cs index 769de92b..9e143bcd 100644 --- a/lib/oscillators/bbb/Bbb.cs +++ b/lib/oscillators/bbb/Bbb.cs @@ -94,8 +94,6 @@ public sealed class Bbb : AbstractBase /// Standard deviation multiplier. /// public double Multiplier => _multiplier; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -167,8 +165,6 @@ public sealed class Bbb : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { Reset(); @@ -304,8 +300,6 @@ public sealed class Bbb : AbstractBase _state.SumSq += v * v; } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -313,8 +307,6 @@ public sealed class Bbb : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/oscillators/bbi/Bbi.cs b/lib/oscillators/bbi/Bbi.cs index 2a442a97..89478ae0 100644 --- a/lib/oscillators/bbi/Bbi.cs +++ b/lib/oscillators/bbi/Bbi.cs @@ -110,8 +110,6 @@ public sealed class Bbi : AbstractBase /// True when enough bars have been processed for valid (full-window) output. public override bool IsHot => _s.Index >= WarmupPeriod; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -202,8 +200,6 @@ public sealed class Bbi : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -227,8 +223,6 @@ public sealed class Bbi : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -236,8 +230,6 @@ public sealed class Bbi : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { Array.Clear(_buf1); diff --git a/lib/oscillators/cfo/Cfo.cs b/lib/oscillators/cfo/Cfo.cs index 5c2d8ef1..943a191c 100644 --- a/lib/oscillators/cfo/Cfo.cs +++ b/lib/oscillators/cfo/Cfo.cs @@ -81,8 +81,6 @@ public sealed class Cfo : AbstractBase /// Period of the indicator. /// public int Period => _period; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -153,8 +151,6 @@ public sealed class Cfo : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -191,8 +187,6 @@ public sealed class Cfo : AbstractBase _state.SumXY += i * v; } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -200,8 +194,6 @@ public sealed class Cfo : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/oscillators/crsi/Crsi.cs b/lib/oscillators/crsi/Crsi.cs index 7072e00e..9ac79ead 100644 --- a/lib/oscillators/crsi/Crsi.cs +++ b/lib/oscillators/crsi/Crsi.cs @@ -118,8 +118,6 @@ public sealed class Crsi : AbstractBase /// Percent rank lookback period. /// public int RankPeriod => _rankPeriod; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -224,8 +222,6 @@ public sealed class Crsi : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -250,8 +246,6 @@ public sealed class Crsi : AbstractBase Last = new TValue(tSpan[len - 1], vSpan[len - 1]); return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -259,8 +253,6 @@ public sealed class Crsi : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _priceRsi.Reset(); diff --git a/lib/oscillators/cti/Cti.cs b/lib/oscillators/cti/Cti.cs index 7fb37890..97e61692 100644 --- a/lib/oscillators/cti/Cti.cs +++ b/lib/oscillators/cti/Cti.cs @@ -77,14 +77,10 @@ public sealed class Cti : AbstractBase [MethodImpl(MethodImplOptions.AggressiveInlining)] private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); - - /// public override bool IsHot => _buffer.IsFull; /// Period of the indicator. public int Period => _period; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -151,8 +147,6 @@ public sealed class Cti : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -207,8 +201,6 @@ public sealed class Cti : AbstractBase _s.SumXY = Math.FusedMultiplyAdd(i, v, _s.SumXY); } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -216,8 +208,6 @@ public sealed class Cti : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/oscillators/dem/Dem.cs b/lib/oscillators/dem/Dem.cs index 72719209..1aab42f6 100644 --- a/lib/oscillators/dem/Dem.cs +++ b/lib/oscillators/dem/Dem.cs @@ -278,7 +278,6 @@ public sealed class Dem : ITValuePublisher double prevHigh = double.NaN; double prevLow = double.NaN; int idx = 0; - int count = 0; for (int i = 0; i < len; i++) { @@ -302,7 +301,6 @@ public sealed class Dem : ITValuePublisher deMinSum += deMin; idx = (idx + 1) % period; - count++; prevHigh = h; prevLow = l; diff --git a/lib/oscillators/dosc/Dosc.cs b/lib/oscillators/dosc/Dosc.cs index 4c5cb561..d4eb3baa 100644 --- a/lib/oscillators/dosc/Dosc.cs +++ b/lib/oscillators/dosc/Dosc.cs @@ -143,11 +143,7 @@ public sealed class Dosc : AbstractBase } source.Pub += Handle; } - - /// public override bool IsHot => _s.Count >= WarmupPeriod; - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -195,8 +191,6 @@ public sealed class Dosc : AbstractBase } return s.LastValidSrc; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public override TValue Update(TValue input, bool isNew = true) { @@ -226,8 +220,6 @@ public sealed class Dosc : AbstractBase PubEvent(Last, isNew); return Last; } - - /// [MethodImpl(MethodImplOptions.AggressiveOptimization)] public override TSeries Update(TSeries source) { @@ -428,8 +420,6 @@ public sealed class Dosc : AbstractBase TSeries results = indicator.Update(source); return (results, indicator); } - - /// public override void Reset() { _s = State.New(); diff --git a/lib/oscillators/dpo/Dpo.cs b/lib/oscillators/dpo/Dpo.cs index 14464fd8..eb83140c 100644 --- a/lib/oscillators/dpo/Dpo.cs +++ b/lib/oscillators/dpo/Dpo.cs @@ -78,8 +78,6 @@ public sealed class Dpo : AbstractBase /// Displacement of the SMA lookback. /// public int Displacement => _displacement; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -141,8 +139,6 @@ public sealed class Dpo : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -164,8 +160,6 @@ public sealed class Dpo : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -173,8 +167,6 @@ public sealed class Dpo : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _smaBuffer.Clear(); diff --git a/lib/oscillators/dymoi/Dymoi.cs b/lib/oscillators/dymoi/Dymoi.cs index 84df96d4..60e81ae3 100644 --- a/lib/oscillators/dymoi/Dymoi.cs +++ b/lib/oscillators/dymoi/Dymoi.cs @@ -143,8 +143,6 @@ public sealed class Dymoi : AbstractBase /// Maximum allowable dynamic period. public int MaxPeriod => _maxPeriod; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -276,8 +274,6 @@ public sealed class Dymoi : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -302,8 +298,6 @@ public sealed class Dymoi : AbstractBase Last = new TValue(tSpan[len - 1], vSpan[len - 1]); return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -311,8 +305,6 @@ public sealed class Dymoi : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, true, double.NaN, double.NaN); diff --git a/lib/oscillators/er/Er.cs b/lib/oscillators/er/Er.cs index 2e7ac00f..00ce5657 100644 --- a/lib/oscillators/er/Er.cs +++ b/lib/oscillators/er/Er.cs @@ -73,8 +73,6 @@ public sealed class Er : AbstractBase /// Period of the indicator. /// public int Period => _period; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -141,8 +139,6 @@ public sealed class Er : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -164,8 +160,6 @@ public sealed class Er : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { TimeSpan interval = step ?? TimeSpan.FromTicks(1); @@ -175,8 +169,6 @@ public sealed class Er : AbstractBase Update(new TValue(baseTime + (interval * i), source[i]), isNew: true); } } - - /// public override void Reset() { _closeBuf.Clear(); diff --git a/lib/oscillators/fisher/Fisher.cs b/lib/oscillators/fisher/Fisher.cs index 714bdc88..7e08668d 100644 --- a/lib/oscillators/fisher/Fisher.cs +++ b/lib/oscillators/fisher/Fisher.cs @@ -90,8 +90,6 @@ public sealed class Fisher : AbstractBase /// Current Signal line value. /// public double Signal => _state.Signal; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -172,8 +170,6 @@ public sealed class Fisher : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -195,8 +191,6 @@ public sealed class Fisher : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { TimeSpan interval = step ?? TimeSpan.FromTicks(1); @@ -206,8 +200,6 @@ public sealed class Fisher : AbstractBase Update(new TValue(baseTime + (interval * i), source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/oscillators/fisher04/Fisher04.cs b/lib/oscillators/fisher04/Fisher04.cs index 3a941c81..e9e08ae7 100644 --- a/lib/oscillators/fisher04/Fisher04.cs +++ b/lib/oscillators/fisher04/Fisher04.cs @@ -88,8 +88,6 @@ public sealed class Fisher04 : AbstractBase /// Current Signal line value. /// public double Signal => _state.Signal; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -168,8 +166,6 @@ public sealed class Fisher04 : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -191,8 +187,6 @@ public sealed class Fisher04 : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { TimeSpan interval = step ?? TimeSpan.FromTicks(1); @@ -202,8 +196,6 @@ public sealed class Fisher04 : AbstractBase Update(new TValue(baseTime + (interval * i), source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/oscillators/gator/Gator.cs b/lib/oscillators/gator/Gator.cs index 3b818158..1ee7383b 100644 --- a/lib/oscillators/gator/Gator.cs +++ b/lib/oscillators/gator/Gator.cs @@ -230,8 +230,6 @@ public sealed class Gator : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { if (source.Count == 0) @@ -257,8 +255,6 @@ public sealed class Gator : AbstractBase Last = new TValue(tSpan[len - 1], vSpan[len - 1]); return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -555,8 +551,6 @@ public sealed class Gator : AbstractBase } } } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void Reset() { diff --git a/lib/oscillators/inertia/Inertia.cs b/lib/oscillators/inertia/Inertia.cs index 8f41d172..f43602e6 100644 --- a/lib/oscillators/inertia/Inertia.cs +++ b/lib/oscillators/inertia/Inertia.cs @@ -83,8 +83,6 @@ public sealed class Inertia : AbstractBase /// Period of the indicator. /// public int Period => _period; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -155,8 +153,6 @@ public sealed class Inertia : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -193,8 +189,6 @@ public sealed class Inertia : AbstractBase _state.SumXY += i * v; } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -202,8 +196,6 @@ public sealed class Inertia : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/oscillators/kri/Kri.cs b/lib/oscillators/kri/Kri.cs index 0962bcd8..1a1ef261 100644 --- a/lib/oscillators/kri/Kri.cs +++ b/lib/oscillators/kri/Kri.cs @@ -59,14 +59,10 @@ public sealed class Kri : AbstractBase [MethodImpl(MethodImplOptions.AggressiveInlining)] private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); - - /// public override bool IsHot => _buffer.IsFull; /// Period of the indicator. public int Period => _period; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -120,8 +116,6 @@ public sealed class Kri : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -140,8 +134,6 @@ public sealed class Kri : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { TimeSpan interval = step ?? TimeSpan.FromTicks(1); @@ -151,8 +143,6 @@ public sealed class Kri : AbstractBase Update(new TValue(baseTime + (interval * i), source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/oscillators/psl/Psl.cs b/lib/oscillators/psl/Psl.cs index f8007061..d8fa2c30 100644 --- a/lib/oscillators/psl/Psl.cs +++ b/lib/oscillators/psl/Psl.cs @@ -62,14 +62,10 @@ public sealed class Psl : AbstractBase [MethodImpl(MethodImplOptions.AggressiveInlining)] private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); - - /// public override bool IsHot => _buffer.IsFull; /// Period of the indicator. public int Period => _period; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -126,8 +122,6 @@ public sealed class Psl : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -146,8 +140,6 @@ public sealed class Psl : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { TimeSpan interval = step ?? TimeSpan.FromTicks(1); @@ -157,8 +149,6 @@ public sealed class Psl : AbstractBase Update(new TValue(baseTime + (interval * i), source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/oscillators/reflex/Reflex.cs b/lib/oscillators/reflex/Reflex.cs index 1f90ace0..bdeab1e1 100644 --- a/lib/oscillators/reflex/Reflex.cs +++ b/lib/oscillators/reflex/Reflex.cs @@ -108,11 +108,7 @@ public sealed class Reflex : AbstractBase } source.Pub += Handle; } - - /// public override bool IsHot => _s.Count >= _period; - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -160,8 +156,6 @@ public sealed class Reflex : AbstractBase } return s.LastValid; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public override TValue Update(TValue input, bool isNew = true) { @@ -183,8 +177,6 @@ public sealed class Reflex : AbstractBase PubEvent(Last, isNew); return Last; } - - /// [MethodImpl(MethodImplOptions.AggressiveOptimization)] public override TSeries Update(TSeries source) { @@ -396,8 +388,6 @@ public sealed class Reflex : AbstractBase TSeries results = indicator.Update(source); return (results, indicator); } - - /// public override void Reset() { _s = State.New(); diff --git a/lib/oscillators/reverseema/ReverseEma.cs b/lib/oscillators/reverseema/ReverseEma.cs index 6e041283..5eafc03e 100644 --- a/lib/oscillators/reverseema/ReverseEma.cs +++ b/lib/oscillators/reverseema/ReverseEma.cs @@ -122,11 +122,7 @@ public sealed class ReverseEma : AbstractBase } source.Pub += Handle; } - - /// public override bool IsHot => _s.IsHot; - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -185,8 +181,6 @@ public sealed class ReverseEma : AbstractBase } return _lastValidValue; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public override TValue Update(TValue input, bool isNew = true) { @@ -213,8 +207,6 @@ public sealed class ReverseEma : AbstractBase PubEvent(Last, isNew); return Last; } - - /// [MethodImpl(MethodImplOptions.AggressiveOptimization)] public override TSeries Update(TSeries source) { @@ -415,8 +407,6 @@ public sealed class ReverseEma : AbstractBase TSeries results = indicator.Update(source); return (results, indicator); } - - /// public override void Reset() { _s = State.New(); diff --git a/lib/oscillators/trendflex/Trendflex.cs b/lib/oscillators/trendflex/Trendflex.cs index 4e79da9d..dc8b0e1c 100644 --- a/lib/oscillators/trendflex/Trendflex.cs +++ b/lib/oscillators/trendflex/Trendflex.cs @@ -99,11 +99,7 @@ public sealed class Trendflex : AbstractBase } source.Pub += Handle; } - - /// public override bool IsHot => _s.Count >= _period; - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -148,8 +144,6 @@ public sealed class Trendflex : AbstractBase } return s.LastValid; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public override TValue Update(TValue input, bool isNew = true) { @@ -171,8 +165,6 @@ public sealed class Trendflex : AbstractBase PubEvent(Last, isNew); return Last; } - - /// [MethodImpl(MethodImplOptions.AggressiveOptimization)] public override TSeries Update(TSeries source) { @@ -337,8 +329,6 @@ public sealed class Trendflex : AbstractBase TSeries results = indicator.Update(source); return (results, indicator); } - - /// public override void Reset() { _s = State.New(); diff --git a/lib/oscillators/trix/Trix.cs b/lib/oscillators/trix/Trix.cs index 2c77cc9f..a69245a7 100644 --- a/lib/oscillators/trix/Trix.cs +++ b/lib/oscillators/trix/Trix.cs @@ -96,8 +96,6 @@ public sealed class Trix : AbstractBase [MethodImpl(MethodImplOptions.AggressiveInlining)] private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew); - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -198,8 +196,6 @@ public sealed class Trix : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -223,8 +219,6 @@ public sealed class Trix : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -232,8 +226,6 @@ public sealed class Trix : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 0); diff --git a/lib/statistics/cointegration/Cointegration.cs b/lib/statistics/cointegration/Cointegration.cs index e6a0d69b..4b4d9f1c 100644 --- a/lib/statistics/cointegration/Cointegration.cs +++ b/lib/statistics/cointegration/Cointegration.cs @@ -114,15 +114,11 @@ public sealed class Cointegration : AbstractBase { return Update(new TValue(DateTime.MinValue, seriesA), new TValue(DateTime.MinValue, seriesB), isNew); } - - /// /// Not supported for bi-input indicator. Use Update(seriesA, seriesB) instead. public override TValue Update(TValue input, bool isNew = true) { throw new NotSupportedException("Cointegration requires two inputs (seriesA and seriesB). Use Update(seriesA, seriesB)."); } - - /// /// Not supported for bi-input indicator. Use Calculate(seriesA, seriesB, period) instead. public override TSeries Update(TSeries source) { @@ -402,8 +398,6 @@ public sealed class Cointegration : AbstractBase _sumDelta2 = FusedMultiplyAdd(delta, delta, _sumDelta2); } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { throw new NotSupportedException("Cointegration requires two inputs."); diff --git a/lib/statistics/correlation/Correlation.cs b/lib/statistics/correlation/Correlation.cs index 2212e521..6896d29a 100644 --- a/lib/statistics/correlation/Correlation.cs +++ b/lib/statistics/correlation/Correlation.cs @@ -113,15 +113,11 @@ public sealed class Correlation : AbstractBase { return Update(new TValue(DateTime.MinValue, seriesX), new TValue(DateTime.MinValue, seriesY), isNew); } - - /// /// Not supported for bi-input indicator. Use Update(seriesX, seriesY) instead. public override TValue Update(TValue input, bool isNew = true) { throw new NotSupportedException("Correlation requires two inputs (seriesX and seriesY). Use Update(seriesX, seriesY)."); } - - /// /// Not supported for bi-input indicator. Use Calculate(seriesX, seriesY, period) instead. public override TSeries Update(TSeries source) { @@ -263,8 +259,6 @@ public sealed class Correlation : AbstractBase _sumXY = FusedMultiplyAdd(x, y, _sumXY); } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { throw new NotSupportedException("Correlation requires two inputs."); diff --git a/lib/statistics/granger/Granger.cs b/lib/statistics/granger/Granger.cs index f68fb180..f1530f53 100644 --- a/lib/statistics/granger/Granger.cs +++ b/lib/statistics/granger/Granger.cs @@ -108,15 +108,11 @@ public sealed class Granger : AbstractBase { return Update(new TValue(DateTime.UtcNow, seriesY), new TValue(DateTime.UtcNow, seriesX), isNew); } - - /// /// Not supported for dual-input indicator. Use Update(seriesY, seriesX) instead. public override TValue Update(TValue input, bool isNew = true) { throw new NotSupportedException("Granger requires two inputs (seriesY and seriesX). Use Update(seriesY, seriesX)."); } - - /// /// Not supported for dual-input indicator. Use Batch(seriesY, seriesX, period) instead. public override TSeries Update(TSeries source) { @@ -370,8 +366,6 @@ public sealed class Granger : AbstractBase _sumYLagXLag = FusedMultiplyAdd(yLag, xLag, _sumYLagXLag); } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { throw new NotSupportedException("Granger requires two inputs."); diff --git a/lib/statistics/kendall/Kendall.cs b/lib/statistics/kendall/Kendall.cs index d656f7fb..3e3ee825 100644 --- a/lib/statistics/kendall/Kendall.cs +++ b/lib/statistics/kendall/Kendall.cs @@ -93,15 +93,11 @@ public sealed class Kendall : AbstractBase { return Update(new TValue(DateTime.UtcNow, seriesX), new TValue(DateTime.UtcNow, seriesY), isNew); } - - /// /// Not supported for dual-input indicator. Use Update(seriesX, seriesY) instead. public override TValue Update(TValue input, bool isNew = true) { throw new NotSupportedException("Kendall requires two inputs (seriesX and seriesY). Use Update(seriesX, seriesY)."); } - - /// /// Not supported for dual-input indicator. Use Batch(seriesX, seriesY, period) instead. public override TSeries Update(TSeries source) { @@ -173,8 +169,6 @@ public sealed class Kendall : AbstractBase return (concordant - discordant) / denominator; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { throw new NotSupportedException("Kendall requires two inputs."); diff --git a/lib/statistics/pacf/Pacf.cs b/lib/statistics/pacf/Pacf.cs index 8073ffe6..678fb54b 100644 --- a/lib/statistics/pacf/Pacf.cs +++ b/lib/statistics/pacf/Pacf.cs @@ -279,7 +279,7 @@ public sealed class Pacf : AbstractBase _sum = 0; for (int i = 0; i < _buffer.Count; i++) { - _sum += _buffer[i]; + _sum += _buffer[i]; } } diff --git a/lib/statistics/spearman/Spearman.cs b/lib/statistics/spearman/Spearman.cs index 08316420..87716d2b 100644 --- a/lib/statistics/spearman/Spearman.cs +++ b/lib/statistics/spearman/Spearman.cs @@ -98,15 +98,11 @@ public sealed class Spearman : AbstractBase { return Update(new TValue(DateTime.UtcNow, seriesX), new TValue(DateTime.UtcNow, seriesY), isNew); } - - /// /// Not supported for dual-input indicator. Use Update(seriesX, seriesY) instead. public override TValue Update(TValue input, bool isNew = true) { throw new NotSupportedException("Spearman requires two inputs (seriesX and seriesY). Use Update(seriesX, seriesY)."); } - - /// /// Not supported for dual-input indicator. Use Batch(seriesX, seriesY, period) instead. public override TSeries Update(TSeries source) { @@ -236,8 +232,6 @@ public sealed class Spearman : AbstractBase ranks[i] = countSmaller + (countEqual - 1) * 0.5 + 1.0; } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { throw new NotSupportedException("Spearman requires two inputs."); diff --git a/lib/trends_FIR/alma/Alma.cs b/lib/trends_FIR/alma/Alma.cs index 8ea14141..d2d263b8 100644 --- a/lib/trends_FIR/alma/Alma.cs +++ b/lib/trends_FIR/alma/Alma.cs @@ -31,7 +31,7 @@ public sealed class Alma : AbstractBase [StructLayout(LayoutKind.Auto)] private record struct State(double LastValidValue, bool IsInitialized); private State _state; - private State _p_state; + private State _pState; public bool IsNew => _isNew; public override bool IsHot => _buffer.IsFull; @@ -139,11 +139,11 @@ public sealed class Alma : AbstractBase { if (isNew) { - _p_state = _state; + _pState = _state; } else { - _state = _p_state; + _state = _pState; } if (double.IsFinite(input.Value)) @@ -213,7 +213,7 @@ public sealed class Alma : AbstractBase // Reset state _buffer.Clear(); _state = default; - _p_state = default; + _pState = default; int warmupLength = Math.Min(source.Length, WarmupPeriod); int startIndex = source.Length - warmupLength; @@ -254,7 +254,7 @@ public sealed class Alma : AbstractBase Update(new TValue(DateTime.MinValue, source[i]), isNew: true, publish: false); } - _p_state = _state; + _pState = _state; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -449,7 +449,7 @@ public sealed class Alma : AbstractBase { _buffer.Clear(); _state = new State(double.NaN, IsInitialized: false); - _p_state = _state; + _pState = _state; Last = default; } -} \ No newline at end of file +} diff --git a/lib/trends_FIR/nlma/Nlma.cs b/lib/trends_FIR/nlma/Nlma.cs index bd31992d..6ad1ad77 100644 --- a/lib/trends_FIR/nlma/Nlma.cs +++ b/lib/trends_FIR/nlma/Nlma.cs @@ -90,8 +90,6 @@ public sealed class Nlma : AbstractBase _isNew = isNew; return UpdateCore(input, isNew, publish: true); } - - /// public override TSeries Update(TSeries source) { if (source.Count == 0) @@ -326,8 +324,6 @@ public sealed class Nlma : AbstractBase } // ── Prime / Batch / Calculate ────────────────────────────────────── - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { foreach (var value in source) @@ -489,8 +485,6 @@ public sealed class Nlma : AbstractBase } // ── Reset / Dispose ──────────────────────────────────────────────── - - /// public override void Reset() { _buffer.Clear(); @@ -498,8 +492,6 @@ public sealed class Nlma : AbstractBase _p_lastValidValue = double.NaN; Last = default; } - - /// protected override void Dispose(bool disposing) { if (!_disposed) diff --git a/lib/trends_FIR/wma/Wma.Coverage.Tests.cs b/lib/trends_FIR/wma/Wma.Coverage.Tests.cs index 465cad16..3bdcab93 100644 --- a/lib/trends_FIR/wma/Wma.Coverage.Tests.cs +++ b/lib/trends_FIR/wma/Wma.Coverage.Tests.cs @@ -1,9 +1,10 @@ using System.Reflection; using System.Runtime.Intrinsics.X86; +using Xunit.Abstractions; namespace QuanTAlib.Tests; -public class WmaCoverageTests +public class WmaCoverageTests(ITestOutputHelper output) { [Fact] public void Cover_Scalar_Fallback_SmallData() @@ -41,7 +42,7 @@ public class WmaCoverageTests source[i] = i; } - double[] output = new double[len]; + double[] result = new double[len]; // Use reflection to invoke private static CalculateSimdCore var method = typeof(Wma).GetMethod("CalculateSimdCore", BindingFlags.NonPublic | BindingFlags.Static); @@ -73,12 +74,12 @@ public class WmaCoverageTests // Maybe I can use `MethodInfo.CreateDelegate`? // Delegates can take Spans if defined correctly. - InvokePrivateStaticMethod_WithSpans("CalculateSimdCore", source, output, period); + InvokePrivateStaticMethod_WithSpans("CalculateSimdCore", source, result, period); } catch (Exception ex) { // If reflection fails, we can't cover it. - Console.WriteLine($"Could not invoke AVX2 core: {ex.Message}"); + output.WriteLine($"Could not invoke AVX2 core: {ex.Message}"); } } diff --git a/lib/trends_IIR/rema/Rema.cs b/lib/trends_IIR/rema/Rema.cs index 1b867ee5..2dc2c038 100644 --- a/lib/trends_IIR/rema/Rema.cs +++ b/lib/trends_IIR/rema/Rema.cs @@ -87,13 +87,9 @@ public sealed class Rema : AbstractBase } source.Pub += Handle; } - - /// public override bool IsHot => _state.IsHot; private const int StackAllocThreshold = 512; - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -162,8 +158,6 @@ public sealed class Rema : AbstractBase } return _lastValidValue; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public override TValue Update(TValue input, bool isNew = true) { @@ -184,8 +178,6 @@ public sealed class Rema : AbstractBase PubEvent(Last, isNew); return Last; } - - /// [MethodImpl(MethodImplOptions.AggressiveOptimization)] public override TSeries Update(TSeries source) { @@ -450,8 +442,6 @@ public sealed class Rema : AbstractBase TSeries results = rema.Update(source); return (results, rema); } - - /// public override void Reset() { _state = State.New(); diff --git a/lib/trends_IIR/rgma/Rgma.cs b/lib/trends_IIR/rgma/Rgma.cs index 1efcf74a..84686bd1 100644 --- a/lib/trends_IIR/rgma/Rgma.cs +++ b/lib/trends_IIR/rgma/Rgma.cs @@ -47,8 +47,6 @@ public sealed class Rgma : AbstractBase private const double COVERAGE_THRESHOLD = 0.05; private const int ResyncInterval = 10000; private const int StackAllocThreshold = 512; - - /// public override bool IsHot => _state.IsHot; /// @@ -112,8 +110,6 @@ public sealed class Rgma : AbstractBase } return _lastValidValue; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { if (source.Length == 0) @@ -190,8 +186,6 @@ public sealed class Rgma : AbstractBase } } } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public override TValue Update(TValue input, bool isNew = true) { @@ -234,8 +228,6 @@ public sealed class Rgma : AbstractBase PubEvent(Last, isNew); return Last; } - - /// [MethodImpl(MethodImplOptions.AggressiveOptimization)] public override TSeries Update(TSeries source) { @@ -463,8 +455,6 @@ public sealed class Rgma : AbstractBase TSeries results = rgma.Update(source); return (results, rgma); } - - /// public override void Reset() { _state = State.New(); @@ -475,8 +465,6 @@ public sealed class Rgma : AbstractBase Array.Fill(_p_filters, double.NaN); Last = default; } - - /// protected override void Dispose(bool disposing) { if (!_disposed) diff --git a/lib/volatility/bbw/Bbw.cs b/lib/volatility/bbw/Bbw.cs index 4d56ec30..557ac5ef 100644 --- a/lib/volatility/bbw/Bbw.cs +++ b/lib/volatility/bbw/Bbw.cs @@ -95,8 +95,6 @@ public sealed class Bbw : AbstractBase /// Standard deviation multiplier. /// public double Multiplier => _multiplier; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -159,8 +157,6 @@ public sealed class Bbw : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -196,8 +192,6 @@ public sealed class Bbw : AbstractBase _state.SumSq += v * v; } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -205,8 +199,6 @@ public sealed class Bbw : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/volatility/bbwn/Bbwn.cs b/lib/volatility/bbwn/Bbwn.cs index 7609d60b..47e9ed48 100644 --- a/lib/volatility/bbwn/Bbwn.cs +++ b/lib/volatility/bbwn/Bbwn.cs @@ -107,8 +107,6 @@ public sealed class Bbwn : AbstractBase /// Historical lookback period for normalization. /// public int Lookback => _lookback; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -212,8 +210,6 @@ public sealed class Bbwn : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -249,8 +245,6 @@ public sealed class Bbwn : AbstractBase _state.SumSq += v * v; } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -258,8 +252,6 @@ public sealed class Bbwn : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/volatility/bbwp/Bbwp.cs b/lib/volatility/bbwp/Bbwp.cs index a5088607..ec2a973a 100644 --- a/lib/volatility/bbwp/Bbwp.cs +++ b/lib/volatility/bbwp/Bbwp.cs @@ -108,8 +108,6 @@ public sealed class Bbwp : AbstractBase /// Historical lookback period for percentile calculation. /// public int Lookback => _lookback; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -205,8 +203,6 @@ public sealed class Bbwp : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -242,8 +238,6 @@ public sealed class Bbwp : AbstractBase _state.SumSq += v * v; } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -251,8 +245,6 @@ public sealed class Bbwp : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _buffer.Clear(); diff --git a/lib/volatility/ccv/Ccv.cs b/lib/volatility/ccv/Ccv.cs index 493a648a..b7a3d78f 100644 --- a/lib/volatility/ccv/Ccv.cs +++ b/lib/volatility/ccv/Ccv.cs @@ -100,8 +100,6 @@ public sealed class Ccv : AbstractBase /// Smoothing method (1=SMA, 2=EMA, 3=WMA). /// public int Method => _method; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -242,8 +240,6 @@ public sealed class Ccv : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -276,8 +272,6 @@ public sealed class Ccv : AbstractBase _state.Sum += _returnBuffer[i]; } } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -285,8 +279,6 @@ public sealed class Ccv : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _returnBuffer.Clear(); diff --git a/lib/volatility/cv/Cv.cs b/lib/volatility/cv/Cv.cs index 82a02bb7..e1a9a2f4 100644 --- a/lib/volatility/cv/Cv.cs +++ b/lib/volatility/cv/Cv.cs @@ -117,8 +117,6 @@ public sealed class Cv : AbstractBase /// Beta coefficient (persistence weight). /// public double Beta => _beta; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -241,8 +239,6 @@ public sealed class Cv : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -265,8 +261,6 @@ public sealed class Cv : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -274,8 +268,6 @@ public sealed class Cv : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0.0, 0.0, 0.0, 0.0, double.NaN, 0.0, 0); diff --git a/lib/volatility/cvi/Cvi.cs b/lib/volatility/cvi/Cvi.cs index 55d619b7..eaa04fc8 100644 --- a/lib/volatility/cvi/Cvi.cs +++ b/lib/volatility/cvi/Cvi.cs @@ -152,8 +152,6 @@ public sealed class Cvi : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -254,8 +252,6 @@ public sealed class Cvi : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -263,8 +259,6 @@ public sealed class Cvi : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _emaBuffer.Clear(); diff --git a/lib/volatility/ewma/Ewma.cs b/lib/volatility/ewma/Ewma.cs index 63001a7e..9c7b845c 100644 --- a/lib/volatility/ewma/Ewma.cs +++ b/lib/volatility/ewma/Ewma.cs @@ -103,8 +103,6 @@ public sealed class Ewma : AbstractBase /// Number of periods per year for annualization. /// public int AnnualPeriods => _annualPeriods; - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override TValue Update(TValue input, bool isNew = true) { @@ -193,8 +191,6 @@ public sealed class Ewma : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -217,8 +213,6 @@ public sealed class Ewma : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -226,8 +220,6 @@ public sealed class Ewma : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0.0, 1.0, double.NaN, 0.0, 0); diff --git a/lib/volatility/gkv/Gkv.cs b/lib/volatility/gkv/Gkv.cs index c545c4b0..deffd52c 100644 --- a/lib/volatility/gkv/Gkv.cs +++ b/lib/volatility/gkv/Gkv.cs @@ -226,8 +226,6 @@ public sealed class Gkv : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -324,8 +322,6 @@ public sealed class Gkv : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -333,8 +329,6 @@ public sealed class Gkv : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 1.0, 0, 0, 0); diff --git a/lib/volatility/hlv/Hlv.cs b/lib/volatility/hlv/Hlv.cs index 6e8b6cf5..e6c60efd 100644 --- a/lib/volatility/hlv/Hlv.cs +++ b/lib/volatility/hlv/Hlv.cs @@ -211,8 +211,6 @@ public sealed class Hlv : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -309,8 +307,6 @@ public sealed class Hlv : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -318,8 +314,6 @@ public sealed class Hlv : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 1.0, 0, 0, 0); diff --git a/lib/volatility/hv/Hv.cs b/lib/volatility/hv/Hv.cs index a413196d..37a8ba60 100644 --- a/lib/volatility/hv/Hv.cs +++ b/lib/volatility/hv/Hv.cs @@ -33,8 +33,6 @@ namespace QuanTAlib; [SkipLocalsInit] public sealed class Hv : AbstractBase { - private const double Epsilon = 1e-10; - private readonly int _period; private readonly bool _annualize; private readonly int _annualPeriods; @@ -182,8 +180,6 @@ public sealed class Hv : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -308,8 +304,6 @@ public sealed class Hv : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -317,8 +311,6 @@ public sealed class Hv : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(double.NaN, 0, 0, 0, 0, 0); diff --git a/lib/volatility/jvoltyn/Jvoltyn.Validation.Tests.cs b/lib/volatility/jvoltyn/Jvoltyn.Validation.Tests.cs index 7c25b26f..e6d37e49 100644 --- a/lib/volatility/jvoltyn/Jvoltyn.Validation.Tests.cs +++ b/lib/volatility/jvoltyn/Jvoltyn.Validation.Tests.cs @@ -92,9 +92,9 @@ public class JvoltynValidationTests // Calculate logParam manually to verify normalization double lengthParam = (DefaultPeriod - 1.0) / 2.0; - double logParam = System.Math.Log(System.Math.Sqrt(lengthParam)) / System.Math.Log(2.0); + double logParam = Math.Log(Math.Sqrt(lengthParam)) / Math.Log(2.0); logParam = (logParam + 2.0) < 0.0 ? 0.0 : (logParam + 2.0); - double normFactor = System.Math.Abs(logParam - 1.0) > 1e-10 ? 100.0 / (logParam - 1.0) : 0.0; + double normFactor = Math.Abs(logParam - 1.0) > 1e-10 ? 100.0 / (logParam - 1.0) : 0.0; for (int i = 0; i < series.Count; i++) { diff --git a/lib/volatility/rsv/Rsv.cs b/lib/volatility/rsv/Rsv.cs index 68325554..6f37e1d2 100644 --- a/lib/volatility/rsv/Rsv.cs +++ b/lib/volatility/rsv/Rsv.cs @@ -229,8 +229,6 @@ public sealed class Rsv : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { if (source.Count == 0) @@ -338,8 +336,6 @@ public sealed class Rsv : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -347,8 +343,6 @@ public sealed class Rsv : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 0, 0, 0, 0); diff --git a/lib/volatility/rv/Rv.cs b/lib/volatility/rv/Rv.cs index 930a205d..ea0b10ad 100644 --- a/lib/volatility/rv/Rv.cs +++ b/lib/volatility/rv/Rv.cs @@ -196,8 +196,6 @@ public sealed class Rv : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -320,8 +318,6 @@ public sealed class Rv : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -329,8 +325,6 @@ public sealed class Rv : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(double.NaN, 0, 0, 0); diff --git a/lib/volatility/rvi/Rvi.cs b/lib/volatility/rvi/Rvi.cs index e00758f9..64be846b 100644 --- a/lib/volatility/rvi/Rvi.cs +++ b/lib/volatility/rvi/Rvi.cs @@ -177,8 +177,6 @@ public sealed class Rvi : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { if (source.Count == 0) @@ -344,8 +342,6 @@ public sealed class Rvi : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -353,8 +349,6 @@ public sealed class Rvi : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(double.NaN, 0, 0, 0, 1.0, 0, 1.0, 50.0, 0); diff --git a/lib/volatility/tr/Tr.Validation.Tests.cs b/lib/volatility/tr/Tr.Validation.Tests.cs index a65ec8f4..dcb6ca12 100644 --- a/lib/volatility/tr/Tr.Validation.Tests.cs +++ b/lib/volatility/tr/Tr.Validation.Tests.cs @@ -683,7 +683,7 @@ public class TrValidationTests Tr.Batch(high, low, close, qOutput); // Use ValidationHelper for correct TALib index mapping - QuanTAlib.Tests.ValidationHelper.VerifyData(qOutput, output, outRange, lookback); + ValidationHelper.VerifyData(qOutput, output, outRange, lookback); } [Fact] diff --git a/lib/volatility/tr/Tr.cs b/lib/volatility/tr/Tr.cs index f3a3dea9..adb4283c 100644 --- a/lib/volatility/tr/Tr.cs +++ b/lib/volatility/tr/Tr.cs @@ -152,8 +152,6 @@ public sealed class Tr : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -258,8 +256,6 @@ public sealed class Tr : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -267,8 +263,6 @@ public sealed class Tr : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(double.NaN, 0, 0, 0, 0, 0); diff --git a/lib/volatility/ui/Ui.cs b/lib/volatility/ui/Ui.cs index a3573bb3..7f3abf03 100644 --- a/lib/volatility/ui/Ui.cs +++ b/lib/volatility/ui/Ui.cs @@ -118,8 +118,6 @@ public sealed class Ui : AbstractBase { return UpdateCore(bar.Time, bar.Close, isNew); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -235,8 +233,6 @@ public sealed class Ui : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -244,8 +240,6 @@ public sealed class Ui : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _closeBuffer.Clear(); diff --git a/lib/volatility/vov/Vov.cs b/lib/volatility/vov/Vov.cs index 91c6e6f3..77c081f5 100644 --- a/lib/volatility/vov/Vov.cs +++ b/lib/volatility/vov/Vov.cs @@ -136,8 +136,6 @@ public sealed class Vov : AbstractBase { return UpdateCore(bar.Time, bar.Close, isNew); } - - /// public override TSeries Update(TSeries source) { int len = source.Count; @@ -279,8 +277,6 @@ public sealed class Vov : AbstractBase PubEvent(Last, isNew); return Last; } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -288,8 +284,6 @@ public sealed class Vov : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _priceBuffer.Clear(); diff --git a/lib/volatility/vr/Vr.cs b/lib/volatility/vr/Vr.cs index 76596d71..f37b5e5f 100644 --- a/lib/volatility/vr/Vr.cs +++ b/lib/volatility/vr/Vr.cs @@ -227,8 +227,6 @@ public sealed class Vr : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { // For TSeries (price-only), create synthetic bars @@ -248,8 +246,6 @@ public sealed class Vr : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -257,8 +253,6 @@ public sealed class Vr : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 1.0, 0, 0, 0, false); diff --git a/lib/volatility/yzv/Yzv.cs b/lib/volatility/yzv/Yzv.cs index 78c14595..24372161 100644 --- a/lib/volatility/yzv/Yzv.cs +++ b/lib/volatility/yzv/Yzv.cs @@ -238,8 +238,6 @@ public sealed class Yzv : AbstractBase return new TSeries(t, v); } - - /// public override TSeries Update(TSeries source) { // For TSeries (price-only), create synthetic bars @@ -259,8 +257,6 @@ public sealed class Yzv : AbstractBase return new TSeries(t, v); } - - /// public override void Prime(ReadOnlySpan source, TimeSpan? step = null) { for (int i = 0; i < source.Length; i++) @@ -268,8 +264,6 @@ public sealed class Yzv : AbstractBase Update(new TValue(DateTime.UtcNow, source[i]), isNew: true); } } - - /// public override void Reset() { _s = new State(0, 1.0, 0, 0, 0, false); diff --git a/lib/volume/twap/Twap.cs b/lib/volume/twap/Twap.cs index 1a1c5ae9..7c006cba 100644 --- a/lib/volume/twap/Twap.cs +++ b/lib/volume/twap/Twap.cs @@ -41,16 +41,10 @@ public sealed class Twap : ITValuePublisher private State _s; private State _ps; - - /// public TValue Last { get; private set; } - /// public bool IsHot { get; private set; } - /// public static int WarmupPeriod => 1; - /// public string Name { get; } - /// public event TValuePublishedHandler? Pub; /// diff --git a/lib/volume/va/Va.cs b/lib/volume/va/Va.cs index a0c5015d..921dcb5a 100644 --- a/lib/volume/va/Va.cs +++ b/lib/volume/va/Va.cs @@ -37,16 +37,10 @@ public sealed class Va : ITValuePublisher private State _s; private State _ps; - - /// public TValue Last { get; private set; } - /// public bool IsHot => _s.Index >= 1; - /// public static int WarmupPeriod => 1; - /// public string Name { get; } - /// public event TValuePublishedHandler? Pub; /// diff --git a/lib/volume/vf/Vf.Validation.Tests.cs b/lib/volume/vf/Vf.Validation.Tests.cs index d63b1c60..8864ec34 100644 --- a/lib/volume/vf/Vf.Validation.Tests.cs +++ b/lib/volume/vf/Vf.Validation.Tests.cs @@ -110,7 +110,7 @@ public class VfValidationTests vfHigh.Update(bar2High, isNew: true); // Higher volume should produce larger absolute VF - Assert.True(System.Math.Abs(vfHigh.Last.Value) > System.Math.Abs(vfLow.Last.Value), + Assert.True(Math.Abs(vfHigh.Last.Value) > Math.Abs(vfLow.Last.Value), $"High volume VF ({vfHigh.Last.Value}) should exceed low volume VF ({vfLow.Last.Value})"); } diff --git a/lib/volume/vf/Vf.cs b/lib/volume/vf/Vf.cs index 72555607..bebe6fb1 100644 --- a/lib/volume/vf/Vf.cs +++ b/lib/volume/vf/Vf.cs @@ -36,16 +36,10 @@ public sealed class Vf : ITValuePublisher private State _ps; private readonly int _period; private readonly double _alpha; - - /// public TValue Last { get; private set; } - /// public bool IsHot => _s.Index >= _period; - /// public int WarmupPeriod => _period; - /// public string Name { get; } - /// public event TValuePublishedHandler? Pub; /// diff --git a/lib/volume/vo/Vo.cs b/lib/volume/vo/Vo.cs index a1daa9bd..e3008ece 100644 --- a/lib/volume/vo/Vo.cs +++ b/lib/volume/vo/Vo.cs @@ -47,18 +47,12 @@ public sealed class Vo : ITValuePublisher private double[]? _pBufferShort; private double[]? _pBufferLong; private double[]? _pBufferSignal; - - /// public TValue Last { get; private set; } /// Gets the current signal line value. public double Signal => _s.SignalValue; - /// public bool IsHot => _s.Index >= _longPeriod; - /// public int WarmupPeriod => _longPeriod; - /// public string Name { get; } - /// public event TValuePublishedHandler? Pub; /// diff --git a/lib/volume/vroc/Vroc.cs b/lib/volume/vroc/Vroc.cs index 76fdb252..5c07e64c 100644 --- a/lib/volume/vroc/Vroc.cs +++ b/lib/volume/vroc/Vroc.cs @@ -34,16 +34,10 @@ public sealed class Vroc : ITValuePublisher private readonly bool _usePercent; private readonly double[] _buffer; private double[]? _pBuffer; - - /// public TValue Last { get; private set; } - /// public bool IsHot => _s.Index > _period; - /// public int WarmupPeriod => _period + 1; - /// public string Name { get; } - /// public event TValuePublishedHandler? Pub; /// diff --git a/ndepend/NDBadge.deps.json b/ndepend/NDBadge.deps.json deleted file mode 100644 index e2c78f8c..00000000 --- a/ndepend/NDBadge.deps.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETCoreApp,Version=v10.0", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETCoreApp,Version=v10.0": { - "NDBadge/1.0.0": { - "dependencies": { - "SkiaSharp": "3.119.1", - "SkiaSharp.NativeAssets.Linux": "3.119.1" - }, - "runtime": { - "NDBadge.dll": {} - } - }, - "SkiaSharp/3.119.1": { - "dependencies": { - "SkiaSharp.NativeAssets.Win32": "3.119.1", - "SkiaSharp.NativeAssets.macOS": "3.119.1" - }, - "runtime": { - "lib/net8.0/SkiaSharp.dll": { - "assemblyVersion": "3.119.0.0", - "fileVersion": "3.119.1.0" - } - } - }, - "SkiaSharp.NativeAssets.Linux/3.119.1": { - "runtimeTargets": { - "runtimes/linux-arm/native/libSkiaSharp.so": { - "rid": "linux-arm", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-arm64/native/libSkiaSharp.so": { - "rid": "linux-arm64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-loongarch64/native/libSkiaSharp.so": { - "rid": "linux-loongarch64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-musl-arm/native/libSkiaSharp.so": { - "rid": "linux-musl-arm", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-musl-arm64/native/libSkiaSharp.so": { - "rid": "linux-musl-arm64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-musl-loongarch64/native/libSkiaSharp.so": { - "rid": "linux-musl-loongarch64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-musl-riscv64/native/libSkiaSharp.so": { - "rid": "linux-musl-riscv64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-musl-x64/native/libSkiaSharp.so": { - "rid": "linux-musl-x64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-riscv64/native/libSkiaSharp.so": { - "rid": "linux-riscv64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-x64/native/libSkiaSharp.so": { - "rid": "linux-x64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/linux-x86/native/libSkiaSharp.so": { - "rid": "linux-x86", - "assetType": "native", - "fileVersion": "0.0.0.0" - } - } - }, - "SkiaSharp.NativeAssets.macOS/3.119.1": { - "runtimeTargets": { - "runtimes/osx/native/libSkiaSharp.dylib": { - "rid": "osx", - "assetType": "native", - "fileVersion": "0.0.0.0" - } - } - }, - "SkiaSharp.NativeAssets.Win32/3.119.1": { - "runtimeTargets": { - "runtimes/win-arm64/native/libSkiaSharp.dll": { - "rid": "win-arm64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/win-x64/native/libSkiaSharp.dll": { - "rid": "win-x64", - "assetType": "native", - "fileVersion": "0.0.0.0" - }, - "runtimes/win-x86/native/libSkiaSharp.dll": { - "rid": "win-x86", - "assetType": "native", - "fileVersion": "0.0.0.0" - } - } - } - } - }, - "libraries": { - "NDBadge/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - }, - "SkiaSharp/3.119.1": { - "type": "package", - "serviceable": true, - "sha512": "sha512-+Ru1BTSZQne3Vp+vbSb50Ke3Nlc3ZnItxx4+751J9WZ8YzLKAV/n+9DAo4zFTyeCI//ueT63c+VybmTTpYBEiw==", - "path": "skiasharp/3.119.1", - "hashPath": "skiasharp.3.119.1.nupkg.sha512" - }, - "SkiaSharp.NativeAssets.Linux/3.119.1": { - "type": "package", - "serviceable": true, - "sha512": "sha512-9YNoc4SeKvQhrwiqwT4ezkNfMywPdPSK+UFvo/CaoXqLixcnYOTsQKm5BF9mc4+q3vKgDtEgMt0d1ygZhJTEHg==", - "path": "skiasharp.nativeassets.linux/3.119.1", - "hashPath": "skiasharp.nativeassets.linux.3.119.1.nupkg.sha512" - }, - "SkiaSharp.NativeAssets.macOS/3.119.1": { - "type": "package", - "serviceable": true, - "sha512": "sha512-6hR3BdLhApjDxR1bFrJ7/lMydPfI01s3K+3WjIXFUlfC0MFCFCwRzv+JtzIkW9bDXs7XUVQS+6EVf0uzCasnGQ==", - "path": "skiasharp.nativeassets.macos/3.119.1", - "hashPath": "skiasharp.nativeassets.macos.3.119.1.nupkg.sha512" - }, - "SkiaSharp.NativeAssets.Win32/3.119.1": { - "type": "package", - "serviceable": true, - "sha512": "sha512-8C4GSXVJqSr0y3Tyyv5jz6MJSTVUyYkMjeKrzK+VyZPGLo89MNoUEclVuYahzOCDdtbfXrd2HtxXfDuvoSXrUw==", - "path": "skiasharp.nativeassets.win32/3.119.1", - "hashPath": "skiasharp.nativeassets.win32.3.119.1.nupkg.sha512" - } - } -} \ No newline at end of file diff --git a/ndepend/NDBadge.dll b/ndepend/NDBadge.dll deleted file mode 100644 index 785038f1..00000000 Binary files a/ndepend/NDBadge.dll and /dev/null differ diff --git a/ndepend/NDBadge.exe b/ndepend/NDBadge.exe deleted file mode 100644 index 6cffcad8..00000000 Binary files a/ndepend/NDBadge.exe and /dev/null differ diff --git a/ndepend/NDBadge.runtimeconfig.json b/ndepend/NDBadge.runtimeconfig.json deleted file mode 100644 index f730443c..00000000 --- a/ndepend/NDBadge.runtimeconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "runtimeOptions": { - "tfm": "net10.0", - "framework": { - "name": "Microsoft.NETCore.App", - "version": "10.0.0" - }, - "configProperties": { - "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, - "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false - } - } -} \ No newline at end of file diff --git a/ndepend/SkiaSharp.dll b/ndepend/SkiaSharp.dll deleted file mode 100644 index 40b5f963..00000000 Binary files a/ndepend/SkiaSharp.dll and /dev/null differ diff --git a/ndepend/coverage-exclusions.runsettings b/ndepend/coverage-exclusions.runsettings deleted file mode 100644 index 0e67e8e5..00000000 --- a/ndepend/coverage-exclusions.runsettings +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - .*::System\.Collections\..*\.GetEnumerator\(\).* - - - - - - - - diff --git a/ndepend/generate-badges.ps1 b/ndepend/generate-badges.ps1 deleted file mode 100644 index f26db07a..00000000 --- a/ndepend/generate-badges.ps1 +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env pwsh -#requires -Version 7.0 - -<# -.SYNOPSIS - Generates NDepend metric badges for QuanTAlib -.DESCRIPTION - Creates SVG badges for key quality metrics that reinforce QuanTAlib's - identity: scale, quality, low complexity, and comprehensive documentation. -#> - -[CmdletBinding()] -param( - [Parameter(Mandatory = $false)] - [string]$NDBadgePath = "$PSScriptRoot\NDBadge.exe", - - [Parameter(Mandatory = $false)] - [string]$XmlPath = ".\ndepend\NDependOut\TrendMetrics\NDependTrendData2026.xml" -) - -$ErrorActionPreference = 'Stop' - -# Validate prerequisites -if (-not (Test-Path $NDBadgePath)) { - Write-Error "NDBadge.exe not found at: $NDBadgePath" - exit 1 -} - -if (-not (Test-Path $XmlPath)) { - Write-Error "NDepend trend data XML not found at: $XmlPath" - Write-Information "Please run ndepend.ps1 first to generate analysis data" - exit 1 -} - -$ScriptDir = $PSScriptRoot -$OutputDir = Join-Path $ScriptDir "badges" - -# Create output directory -if (-not (Test-Path $OutputDir)) { - New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null -} - -Write-Information "=== Generating QuanTAlib Quality Badges ===" -Write-Information "Output directory: $OutputDir`n" - -# Selected badges for QuanTAlib README -Write-Information "Generating QuanTAlib badges..." - -$HighValueBadges = @( - @{ - Metric = "# Lines of Code" - Output = "loc.svg" - Description = "Total lines of code" - }, - @{ - Metric = "# Source Files" - Output = "files.svg" - Description = "Source files" - }, - @{ - Metric = "# Classes" - Output = "classes.svg" - Description = "Classes" - }, - @{ - Metric = "# Methods" - Output = "methods.svg" - Description = "Methods" - }, - @{ - Metric = "# Public Types" - Output = "public-api.svg" - Description = "Public API surface" - }, - @{ - Metric = "Percentage of Comments" - Output = "comments.svg" - Description = "Comment percentage" - }, - @{ - Metric = "Average Cyclomatic Complexity for Methods" - Output = "complexity.svg" - Description = "Average complexity" - } -) - -foreach ($badge in $HighValueBadges) { - $outputPath = Join-Path $OutputDir $badge.Output - Write-Information " [$($badge.Output)] $($badge.Description)" - - & $NDBadgePath --xml $XmlPath --metric $badge.Metric --output $outputPath - - if ($LASTEXITCODE -ne 0) { - Write-Warning "Failed to generate badge: $($badge.Output)" - } -} - - -# Generate summary -Write-Information "`n=== Badge Generation Complete ===" -$generatedBadges = Get-ChildItem -Path $OutputDir -Filter "*.svg" -Write-Information "Generated $($generatedBadges.Count) badges in: $OutputDir" - -Write-Information "`nGenerated badges:" -$HighValueBadges | ForEach-Object { - Write-Information " - $($_.Output.PadRight(20)) : $($_.Description)" -} - -Write-Information "`nMarkdown snippet for README.md:" -Write-Information @" - -## Quality Metrics - -[![LoC](ndepend/badges/loc.svg)]() -[![Files](ndepend/badges/files.svg)]() -[![Classes](ndepend/badges/classes.svg)]() -[![Methods](ndepend/badges/methods.svg)]() -[![Public API](ndepend/badges/public-api.svg)]() -[![Comments](ndepend/badges/comments.svg)]() -[![Complexity](ndepend/badges/complexity.svg)]() - -"@ diff --git a/ndepend/libSkiaSharp.dll b/ndepend/libSkiaSharp.dll deleted file mode 100644 index 036745b3..00000000 Binary files a/ndepend/libSkiaSharp.dll and /dev/null differ diff --git a/ndepend/ndepend.ps1 b/ndepend/ndepend.ps1 deleted file mode 100644 index 03225120..00000000 --- a/ndepend/ndepend.ps1 +++ /dev/null @@ -1,239 +0,0 @@ -#!/usr/bin/env pwsh -#requires -Version 7.0 - -[CmdletBinding()] -param( - [Parameter(Mandatory = $false)] - [string]$NdependLicense = $env:NDEPEND_LICENSE -) - -$ErrorActionPreference = 'Stop' -$ProgressPreference = 'SilentlyContinue' - -# Configuration -# Determine NDepend installation path based on OS -if ($IsWindows -or $env:OS -like "Windows*") { - $NdependDll = "C:\ndepend\net10.0\NDepend.Console.MultiOS.dll" -} else { - $NdependDll = Join-Path $HOME "NDepend/net10.0/NDepend.Console.MultiOS.dll" -} -# Ensure ScriptDir is set correctly even if $PSScriptRoot is empty (e.g., dot-sourced) -$ScriptDir = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $MyInvocation.MyCommand.Path } -$ProjectRoot = Split-Path -Parent $ScriptDir -$CoverageDir = Join-Path $ScriptDir "coverage" -$SarifDir = Join-Path $ProjectRoot ".sarif" -$SolutionFile = Join-Path $ProjectRoot "QuanTAlib.slnx" -$TestProject = Join-Path $ProjectRoot "lib/QuanTAlib.Tests.csproj" -$TestProject2 = Join-Path $ProjectRoot "quantower/Quantower.Tests.csproj" -$RunSettingsFile = Join-Path $ProjectRoot "coverlet.runsettings" -$NdependProject = Join-Path $ScriptDir "quantalib.ndproj" - -# Validate prerequisites -if (-not (Test-Path $NdependDll)) { - Write-Error "NDepend console not found at: $NdependDll" - exit 1 -} - -if ([string]::IsNullOrWhiteSpace($NdependLicense)) { - Write-Warning "NDEPEND_LICENSE environment variable not set. License activation may fail." -} - -if (-not (Test-Path $SolutionFile)) { - Write-Error "Solution file not found: $SolutionFile" - exit 1 -} - -# Helper function for section headers -function Write-Section { - param([string]$Message) - Write-Information "`n=== $Message ===" -} - -# Track analysis failure -$AnalysisFailed = $false - -try { - # Create .sarif directory - Write-Section "Creating .sarif directory for Roslyn analyzer output" - if (-not (Test-Path $SarifDir)) { - New-Item -ItemType Directory -Path $SarifDir -Force | Out-Null - } - Write-Information "SARIF directory: $SarifDir" - - # Restore, clean, and build - Write-Section "Cleaning and building solution (generates SARIF files)" - - Write-Information "Restoring packages..." - dotnet restore $SolutionFile -v q - if ($LASTEXITCODE -ne 0) { throw "Restore failed with exit code $LASTEXITCODE" } - - Write-Information "Cleaning solution..." - dotnet clean $SolutionFile -v q - if ($LASTEXITCODE -ne 0) { throw "Clean failed with exit code $LASTEXITCODE" } - - Write-Information "Removing old coverage data..." - if (Test-Path $CoverageDir) { - Remove-Item -Path $CoverageDir -Recurse -Force - } - - Write-Information "Building solution..." - dotnet build $SolutionFile -c Debug --no-incremental - if ($LASTEXITCODE -ne 0) { throw "Build failed with exit code $LASTEXITCODE" } - - # Run tests with coverage (QuanTAlib.Tests) - Write-Section "Running tests with coverage (QuanTAlib.Tests)" - dotnet test $TestProject ` - -c Debug ` - --no-build ` - --collect:"XPlat Code Coverage" ` - --settings $RunSettingsFile ` - --results-directory:$CoverageDir - - if ($LASTEXITCODE -ne 0) { throw "Tests failed for QuanTAlib.Tests with exit code $LASTEXITCODE" } - - # Run tests with coverage (Quantower.Tests) - Write-Section "Running tests with coverage (Quantower.Tests)" - dotnet test $TestProject2 ` - -c Debug ` - --no-build ` - --collect:"XPlat Code Coverage" ` - --settings $RunSettingsFile ` - --results-directory:$CoverageDir - - if ($LASTEXITCODE -ne 0) { throw "Tests failed for Quantower.Tests with exit code $LASTEXITCODE" } - - # Find coverage files - Write-Information "`nSearching for coverage files..." - $CoverageFiles = Get-ChildItem -Path $CoverageDir -Filter "coverage.opencover.xml" -Recurse -File | - Select-Object -ExpandProperty FullName - - if (-not $CoverageFiles) { - Write-Warning "No coverage files found in $CoverageDir" - } - else { - $CoverageFiles | ForEach-Object { - Write-Information "Coverage file: $_" - } - } - - # Run JetBrains InspectCode - Write-Section "Running JetBrains InspectCode" - $InspectCodeOutput = Join-Path $SarifDir "resharper.sarif.json" - $jbPath = Get-Command "jb" -ErrorAction SilentlyContinue - if ($jbPath) { - Write-Information "Running InspectCode analysis..." - jb inspectcode $SolutionFile --output=$InspectCodeOutput --format=Sarif --no-build - if ($LASTEXITCODE -ne 0) { - Write-Warning "InspectCode completed with exit code $LASTEXITCODE" - } - else { - Write-Information "InspectCode SARIF saved to: $InspectCodeOutput" - } - } - else { - Write-Warning "JetBrains CLI (jb) not found. Skipping InspectCode analysis." - Write-Information " Install with: dotnet tool install -g JetBrains.ReSharper.GlobalTools" - } - - # List SARIF files - Write-Section "SARIF files generated" - $SarifFiles = Get-ChildItem -Path $SarifDir -Filter "*.json" -ErrorAction SilentlyContinue - if ($SarifFiles) { - $SarifFiles | ForEach-Object { - Write-Information " $($_.Name) ($([math]::Round($_.Length / 1KB, 2)) KB)" - } - } - else { - Write-Information "No SARIF files found" - } - - # Activate NDepend license - Write-Section "Activating NDepend license" - if (-not [string]::IsNullOrWhiteSpace($NdependLicense)) { - dotnet $NdependDll --RegLic $NdependLicense - if ($LASTEXITCODE -ne 0) { Write-Warning "License activation returned exit code $LASTEXITCODE" } - } - else { - Write-Warning "Skipping license activation (no license provided)" - } - - # Run NDepend analysis - Write-Section "Running NDepend analysis" - $NdependArgs = @($NdependProject) - if ($CoverageFiles) { - $NdependArgs += "/CoverageFiles" - foreach ($file in $CoverageFiles) { - $NdependArgs += $file - } - } - - dotnet $NdependDll @NdependArgs - if ($LASTEXITCODE -ne 0) { - Write-Warning "NDepend analysis completed with exit code $LASTEXITCODE" - $AnalysisFailed = $true - } - -} -catch { - Write-Error "Script failed: $_" - $AnalysisFailed = $true -} -finally { - # Always deactivate license - Write-Section "Deactivating NDepend license" - if (-not [string]::IsNullOrWhiteSpace($NdependLicense)) { - dotnet $NdependDll --UnregLic - if ($LASTEXITCODE -ne 0) { Write-Warning "License deactivation returned exit code $LASTEXITCODE" } - } - else { - Write-Information "Skipping license deactivation (no license provided)" - } - - # Generate badges from NDepend trend data - Write-Section "Generating quality badges" - $NDBadgePath = Join-Path $ScriptDir "NDBadge.exe" - # Find the most recent trend data file - $TrendMetricsDir = Join-Path $ScriptDir "NDependOut\TrendMetrics" - $TrendXml = if (Test-Path $TrendMetricsDir) { - Get-ChildItem -Path $TrendMetricsDir -Filter "NDependTrendData*.xml" -File | - Sort-Object Name -Descending | - Select-Object -First 1 -ExpandProperty FullName - } - else { $null } - $BadgeDir = Join-Path $ScriptDir "badges" - - if ((Test-Path $NDBadgePath) -and $TrendXml -and (Test-Path $TrendXml)) { - if (-not (Test-Path $BadgeDir)) { - New-Item -ItemType Directory -Path $BadgeDir -Force | Out-Null - } - - $Badges = @( - @{ Metric = "# Lines of Code"; Output = "loc.svg" }, - @{ Metric = "# Source Files"; Output = "files.svg" }, - @{ Metric = "# Classes"; Output = "classes.svg" }, - @{ Metric = "# Methods"; Output = "methods.svg" }, - @{ Metric = "# Public Types"; Output = "public-api.svg" }, - @{ Metric = "Percentage of Comments"; Output = "comments.svg" }, - @{ Metric = "Average Cyclomatic Complexity for Methods"; Output = "complexity.svg" } - ) - - foreach ($badge in $Badges) { - $outputPath = Join-Path $BadgeDir $badge.Output - & $NDBadgePath --xml $TrendXml --metric $badge.Metric --output $outputPath 2>$null - if ($LASTEXITCODE -eq 0) { - Write-Information " Generated: $($badge.Output)" - } - } - Write-Information "Badges saved to: $BadgeDir" - } - else { - Write-Information "Skipping badge generation (NDBadge.exe or trend data not found)" - } - - Write-Section "Done" - - if ($AnalysisFailed) { - Write-Information "Note: Analysis completed with quality gate failures" - exit 1 - } -} \ No newline at end of file diff --git a/ndepend/quantalib.ndproj b/ndepend/quantalib.ndproj deleted file mode 100644 index 9488ae44..00000000 --- a/ndepend/quantalib.ndproj +++ /dev/null @@ -1,565 +0,0 @@ - - - .\NDependOut - - - - . - - - - .NET 10.0 - - - True - True - True - False - - - - - .\coverage\43fa2c87-f47e-4cfd-bc4d-2b640a2a37d6\coverage.opencover.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 1 - 0 - 0 - $ManDay$ - 50 - USD - After - 18 - 240 - 8 - 5 - 10 - 20 - 50 - 1200000000 - 12000000000 - 72000000000 - 360000000000 - - - - - ND1000: Avoid types too big -warnif count > 0 -from t in JustMyCode.Types -where t.NbLinesOfCode > 500 && - !t.IsGeneratedByCompiler -let loc = t.NbLinesOfCode -orderby loc descending -select new { - t, - loc, - t.Methods, - t.Fields -} -// This rule identifies types that are too large and should be split into smaller, more focused types. -// Threshold increased from default 200 to 500 to accommodate complex financial algorithm classes. -// 10 min per issue -]]> - - ND1004: Avoid methods with too many parameters -warnif count > 0 -from m in JustMyCode.Methods -where m.NbParameters > 8 && - !m.IsGeneratedByCompiler -let np = m.NbParameters -orderby np descending -select new { - m, - np, - m.NbLinesOfCode -} -// This rule identifies methods with too many parameters. -// Threshold increased from default 5 to 8 to accommodate OHLCV bar data (6 values + time + flags). -// 5 min per issue -]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/nuget.config b/nuget.config deleted file mode 100644 index 904d6945..00000000 --- a/nuget.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/perf/perf.csproj b/perf/perf.csproj index 175b1921..0beb9a9c 100644 --- a/perf/perf.csproj +++ b/perf/perf.csproj @@ -7,6 +7,7 @@ enable latest true + https://www.myget.org/F/ooplesfinance_stockindicators/api/v3/index.json diff --git a/quantalib.code-workspace b/quantalib.code-workspace deleted file mode 100644 index 65c8568d..00000000 --- a/quantalib.code-workspace +++ /dev/null @@ -1,50 +0,0 @@ -{ - "folders": [ - { - "path": "." - } - ], - "settings": { - "github.copilot.enable": { - "*": true, - "plaintext": false, - "markdown": true, - "scminput": false - }, - "chat.editor.wordWrap": "on", - "git.confirmSync": false, - "git.decorations.enabled": true, - "terminal.integrated.shellIntegration.enabled": true, - "terminal.integrated.suggest.enabled": true, - "omnisharp.enableEditorConfigSupport": true, - "dotnet.defaultSolution": "QuanTAlib.slnx", - "dotnet.unitTests.runSettingsPath": ".config/coverage.runsettings", - "dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true, - "dotnet.server.useOmnisharp": false, - "coderabbit.agentType": "Roo", - "qodana.pathPrefix": "", - "terminal.integrated.defaultProfile.windows": "PowerShell", - "terminal.integrated.profiles.windows": { - "PowerShell": { - "source": "PowerShell", - "path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe", - "icon": "terminal-powershell" - }, - "Git Bash": { - "path": "C:\\Program Files\\Git\\bin\\bash.exe", - "icon": "terminal-bash" - } - }, - "terminal.integrated.automationProfile.windows": { - "path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe" - }, - "qodana.projectId": "KbxmN", - "sarif-viewer.connectToGithubCodeScanning": "on", - "chatgpt.openOnStartup": true, - "chatgpt.commentCodeLensEnabled": false, - "chat.tools.terminal.autoApprove": { - "code": true - }, - "powershell.cwd": "quantalib" - } -} diff --git a/sonar-suppressions.json b/sonar-suppressions.json deleted file mode 100644 index acf418c3..00000000 --- a/sonar-suppressions.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "description": "Single source of truth for Sonar rule suppressions across SonarCloud, Codacy, and local builds", - "rules": [ - { - "id": "S107", - "reason": "Methods should not have too many parameters - high-performance SIMD methods require multiple parameters for zero-allocation patterns" - }, - { - "id": "S1144", - "reason": "Unused private types or members should be removed - false positives on reflection/serialization patterns" - }, - { - "id": "S1244", - "reason": "Floating point numbers should not be tested for equality - intentional exact comparisons in financial calculations" - }, - { - "id": "S1944", - "reason": "Inappropriate casts should not be made - false positives on generic constraint patterns" - }, - { - "id": "S2053", - "reason": "Hashes should include unpredictable salt - not applicable to non-cryptographic hashing" - }, - { - "id": "S2245", - "reason": "Using pseudorandom number generators is security-sensitive - GBM uses deterministic seeds for reproducibility" - }, - { - "id": "S2259", - "reason": "Null pointers should not be dereferenced - false positives with nullable reference types" - }, - { - "id": "S2583", - "reason": "Conditionally executed code should be reachable - false positives on defensive programming patterns" - }, - { - "id": "S2589", - "reason": "Boolean expressions should not be gratuitous - false positives on explicit clarity patterns" - }, - { - "id": "S3236", - "reason": "Caller information arguments should not be provided explicitly - intentional for testing/debugging" - }, - { - "id": "S3329", - "reason": "Cipher Block Chaining IVs should be unpredictable - not applicable to non-cryptographic code" - }, - { - "id": "S3604", - "reason": "Member initializer values should not be redundant - null! is intentional for nullable reference types in Quantower adapters" - }, - { - "id": "S3655", - "reason": "Empty nullable value should not be accessed - false positives with HasValue checks" - }, - { - "id": "S3776", - "reason": "Cognitive Complexity of methods should not be too high - complex algorithms require complex implementations" - }, - { - "id": "S3949", - "reason": "Calculations should not overflow - false positives on checked arithmetic contexts" - }, - { - "id": "S3966", - "reason": "Objects should not be disposed more than once - false positives on defensive dispose patterns" - }, - { - "id": "S4158", - "reason": "Empty collections should not be accessed or iterated - false positives on lazy initialization" - }, - { - "id": "S4347", - "reason": "Secure random number generators should not output predictable values - deterministic seeds for reproducibility" - }, - { - "id": "S5773", - "reason": "Types allowed to be deserialized should be restricted - not applicable to this codebase" - }, - { - "id": "S6781", - "reason": "JWT tokens should not be created using insecure secrets - not applicable to this codebase" - }, - { - "id": "S109", - "reason": "Magic numbers should be replaced with named constants - numeric literals in SIMD/math algorithms are intentional and self-documenting" - }, - { - "id": "S122", - "reason": "Statements should be on separate lines - compact initialization patterns improve readability in coefficient setup" - }, - { - "id": "S134", - "reason": "Control flow statements should not be nested too deeply - complex algorithms require nested loops" - }, - { - "id": "S138", - "reason": "Methods should not have too many lines - SIMD batch calculations are intentionally monolithic for performance" - }, - { - "id": "S1067", - "reason": "Expressions should not be too complex - validation guard clauses benefit from compound conditions" - }, - { - "id": "S1227", - "reason": "Break statements should not be used - early exit patterns improve performance in search loops" - }, - { - "id": "S1309", - "reason": "Track uses of in-source issue suppressions - intentional suppressions are documented" - }, - { - "id": "S1451", - "reason": "File headers should match a defined format - no file header requirement for this project" - }, - { - "id": "S1541", - "reason": "Cyclomatic complexity should not be too high - optimized algorithms require complex control flow" - }, - { - "id": "S1659", - "reason": "Multiple variables should not be declared on the same line - SIMD register declarations benefit from grouping" - }, - { - "id": "S2360", - "reason": "Optional parameters should not be used - optional parameters are idiomatic for indicator constructors" - }, - { - "id": "S3254", - "reason": "Default parameter values should not be passed as arguments - explicit defaults improve clarity" - }, - { - "id": "S3264", - "reason": "Events should be invoked - events may be conditionally invoked or used for chaining" - }, - { - "id": "S3904", - "reason": "Assemblies should have version information - version is set via Directory.Build.props" - }, - { - "id": "S3906", - "reason": "Event handlers should have the correct signature - custom delegates are used for performance" - }, - { - "id": "S3908", - "reason": "Generic event handlers should be used - TValuePublishedHandler is a performance-optimized custom delegate" - }, - { - "id": "S3990", - "reason": "Assemblies should be marked CLSCompliant - CLS compliance not required for internal library" - }, - { - "id": "S3992", - "reason": "Assemblies should have ComVisible attribute - COM interop not required" - }, - { - "id": "S4035", - "reason": "Classes implementing IComparable should also implement IEquatable - performance-optimized value types use custom equality semantics" - } - ] -}