diff --git a/src/Numerics/LinearAlgebra/Builder.cs b/src/Numerics/LinearAlgebra/Builder.cs index c5304b0a..ce59524f 100644 --- a/src/Numerics/LinearAlgebra/Builder.cs +++ b/src/Numerics/LinearAlgebra/Builder.cs @@ -78,7 +78,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double return new IIterationStopCriterium[] { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(maxIterations), new ResidualStopCriterium(1e-12) }; @@ -155,7 +155,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single return new IIterationStopCriterium[] { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(maxIterations), new ResidualStopCriterium(1e-6) }; @@ -238,7 +238,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex return new IIterationStopCriterium[] { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(maxIterations), new ResidualStopCriterium(1e-12) }; @@ -315,7 +315,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 return new IIterationStopCriterium[] { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(maxIterations), new ResidualStopCriterium(1e-6) }; diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/DivergenceStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/DivergenceStopCriterium.cs deleted file mode 100644 index 81090eb1..00000000 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/DivergenceStopCriterium.cs +++ /dev/null @@ -1,309 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -using MathNet.Numerics.LinearAlgebra.Solvers; -using System; -using System.Diagnostics; - -namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers -{ - -#if NOSYSNUMERICS - using Complex = Numerics.Complex; -#else - using Complex = System.Numerics.Complex; -#endif - - /// - /// Monitors an iterative calculation for signs of divergence. - /// - public sealed class DivergenceStopCriterium : IIterationStopCriterium - { - /// - /// Default value for the maximum relative increase that the - /// residual may experience before a divergence warning is issued. - /// - public const double DefaultMaximumRelativeIncrease = 0.08; - - /// - /// Default value for the minimum number of iterations over which - /// the residual must grow before a divergence warning is issued. - /// - public const int DefaultMinimumNumberOfIterations = 10; - - /// - /// Defines the default last iteration number. Set to -1 because iterations normally - /// start at 0. - /// - const int DefaultLastIterationNumber = -1; - - /// - /// The maximum relative increase the residual may experience without triggering a divergence warning. - /// - double _maximumRelativeIncrease; - - /// - /// The number of iterations over which a residual increase should be tracked before issuing a divergence warning. - /// - int _minimumNumberOfIterations; - - /// - /// The status of the calculation - /// - IterationStatus _status = IterationStatus.Continue; - - /// - /// The array that holds the tracking information. - /// - double[] _residualHistory; - - /// - /// The iteration number of the last iteration. - /// - int _lastIteration = DefaultLastIterationNumber; - - /// - /// Initializes a new instance of the class with the specified maximum - /// relative increase and the specified minimum number of tracking iterations. - /// - /// The maximum relative increase that the residual may experience before a divergence warning is issued. - /// The minimum number of iterations over which the residual must grow before a divergence warning is issued. - public DivergenceStopCriterium(double maximumRelativeIncrease = DefaultMaximumRelativeIncrease, int minimumIterations = DefaultMinimumNumberOfIterations) - { - if (maximumRelativeIncrease <= 0) - { - throw new ArgumentOutOfRangeException("maximumRelativeIncrease"); - } - - // There must be at least three iterations otherwise we can't calculate the relative increase - if (minimumIterations < 3) - { - throw new ArgumentOutOfRangeException("minimumIterations"); - } - - _maximumRelativeIncrease = maximumRelativeIncrease; - _minimumNumberOfIterations = minimumIterations; - } - - /// - /// Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. - /// - /// Thrown if the Maximum is set to zero or below. - public double MaximumRelativeIncrease - { - [DebuggerStepThrough] - get - { - return _maximumRelativeIncrease; - } - - [DebuggerStepThrough] - set - { - if (value <= 0) - { - throw new ArgumentOutOfRangeException("value"); - } - - _maximumRelativeIncrease = value; - } - } - - /// - /// Returns the maximum relative increase to the default. - /// - public void ResetMaximumRelativeIncreaseToDefault() - { - _maximumRelativeIncrease = DefaultMaximumRelativeIncrease; - } - - /// - /// Gets or sets the minimum number of iterations over which the residual must grow before - /// issuing a divergence warning. - /// - /// Thrown if the value is set to less than one. - public int MinimumNumberOfIterations - { - [DebuggerStepThrough] - get - { - return _minimumNumberOfIterations; - } - - [DebuggerStepThrough] - set - { - // There must be at least three iterations otherwise we can't calculate - // the relative increase - if (value < 3) - { - throw new ArgumentOutOfRangeException("value"); - } - - _minimumNumberOfIterations = value; - } - } - - /// - /// Returns the minimum number of iterations to the default. - /// - public void ResetNumberOfIterationsToDefault() - { - _minimumNumberOfIterations = DefaultMinimumNumberOfIterations; - } - - /// - /// Determines the status of the iterative calculation based on the stop criteria stored - /// by the current . Result is set into Status field. - /// - /// The number of iterations that have passed so far. - /// The vector containing the current solution values. - /// The right hand side vector. - /// The vector containing the current residual vectors. - /// - /// The individual stop criteria may internally track the progress of the calculation based - /// on the invocation of this method. Therefore this method should only be called if the - /// calculation has moved forwards at least one step. - /// - public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) - { - if (iterationNumber < 0) - { - throw new ArgumentOutOfRangeException("iterationNumber"); - } - - if (_lastIteration >= iterationNumber) - { - // We have already stored the actual last iteration number - // For now do nothing. We only care about the next step. - return _status; - } - - if ((_residualHistory == null) || (_residualHistory.Length != RequiredHistoryLength)) - { - _residualHistory = new double[RequiredHistoryLength]; - } - - // We always track the residual. - // Move the old versions one element up in the array. - for (var i = 1; i < _residualHistory.Length; i++) - { - _residualHistory[i - 1] = _residualHistory[i]; - } - - // Store the infinity norms of both the solution and residual vectors - // These values will be used to calculate the relative drop in residuals later on. - _residualHistory[_residualHistory.Length - 1] = residualVector.InfinityNorm(); - - // Check if we have NaN's. If so we've gone way beyond normal divergence. - // Stop the iteration. - if (double.IsNaN(_residualHistory[_residualHistory.Length - 1])) - { - _status = IterationStatus.Diverged; - return _status; - } - - // Check if we are diverging and if so set the status - _status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue; - - _lastIteration = iterationNumber; - return _status; - } - - /// - /// Detect if solution is diverging - /// - /// true if diverging, otherwise false - bool IsDiverging() - { - // Run for each variable - for (var i = 1; i < _residualHistory.Length; i++) - { - var difference = _residualHistory[i] - _residualHistory[i - 1]; - - // Divergence is occurring if: - // - the last residual is larger than the previous one - // - the relative increase of the residual is larger than the setting allows - if ((difference < 0) || (_residualHistory[i - 1]*(1 + _maximumRelativeIncrease) >= _residualHistory[i])) - { - // No divergence taking place within the required number of iterations - // So reset and stop the iteration. There is no way we can get to the - // required number of iterations anymore. - return false; - } - } - - return true; - } - - /// - /// Gets required history Length - /// - int RequiredHistoryLength - { - [DebuggerStepThrough] - get - { - return _minimumNumberOfIterations + 1; - } - } - - /// - /// Gets the current calculation status. - /// - public IterationStatus Status - { - [DebuggerStepThrough] - get - { - return _status; - } - } - - /// - /// Resets the to the pre-calculation state. - /// - public void Reset() - { - _status = IterationStatus.Continue; - _lastIteration = DefaultLastIterationNumber; - _residualHistory = null; - } - - /// - /// Clones the current and its settings. - /// - /// A new instance of the class. - public IIterationStopCriterium Clone() - { - return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations); - } - } -} diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/DivergenceStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/DivergenceStopCriterium.cs deleted file mode 100644 index aed4a659..00000000 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/DivergenceStopCriterium.cs +++ /dev/null @@ -1,304 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -using MathNet.Numerics.LinearAlgebra.Solvers; -using System; -using System.Diagnostics; - -namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers -{ - using Numerics; - - /// - /// Monitors an iterative calculation for signs of divergence. - /// - public sealed class DivergenceStopCriterium : IIterationStopCriterium - { - /// - /// Default value for the maximum relative increase that the - /// residual may experience before a divergence warning is issued. - /// - public const double DefaultMaximumRelativeIncrease = 0.08; - - /// - /// Default value for the minimum number of iterations over which - /// the residual must grow before a divergence warning is issued. - /// - public const int DefaultMinimumNumberOfIterations = 10; - - /// - /// Defines the default last iteration number. Set to -1 because iterations normally - /// start at 0. - /// - const int DefaultLastIterationNumber = -1; - - /// - /// The maximum relative increase the residual may experience without triggering a divergence warning. - /// - double _maximumRelativeIncrease; - - /// - /// The number of iterations over which a residual increase should be tracked before issuing a divergence warning. - /// - int _minimumNumberOfIterations; - - /// - /// The status of the calculation - /// - IterationStatus _status = IterationStatus.Continue; - - /// - /// The array that holds the tracking information. - /// - double[] _residualHistory; - - /// - /// The iteration number of the last iteration. - /// - int _lastIteration = DefaultLastIterationNumber; - - /// - /// Initializes a new instance of the class with the specified maximum - /// relative increase and the specified minimum number of tracking iterations. - /// - /// The maximum relative increase that the residual may experience before a divergence warning is issued. - /// The minimum number of iterations over which the residual must grow before a divergence warning is issued. - public DivergenceStopCriterium(double maximumRelativeIncrease = DefaultMaximumRelativeIncrease, int minimumIterations = DefaultMinimumNumberOfIterations) - { - if (maximumRelativeIncrease <= 0) - { - throw new ArgumentOutOfRangeException("maximumRelativeIncrease"); - } - - // There must be at least three iterations otherwise we can't calculate the relative increase - if (minimumIterations < 3) - { - throw new ArgumentOutOfRangeException("minimumIterations"); - } - - _maximumRelativeIncrease = maximumRelativeIncrease; - _minimumNumberOfIterations = minimumIterations; - } - - /// - /// Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. - /// - /// Thrown if the Maximum is set to zero or below. - public double MaximumRelativeIncrease - { - [DebuggerStepThrough] - get - { - return _maximumRelativeIncrease; - } - - [DebuggerStepThrough] - set - { - if (value <= 0) - { - throw new ArgumentOutOfRangeException("value"); - } - - _maximumRelativeIncrease = value; - } - } - - /// - /// Returns the maximum relative increase to the default. - /// - public void ResetMaximumRelativeIncreaseToDefault() - { - _maximumRelativeIncrease = DefaultMaximumRelativeIncrease; - } - - /// - /// Gets or sets the minimum number of iterations over which the residual must grow before - /// issuing a divergence warning. - /// - /// Thrown if the value is set to less than one. - public int MinimumNumberOfIterations - { - [DebuggerStepThrough] - get - { - return _minimumNumberOfIterations; - } - - [DebuggerStepThrough] - set - { - // There must be at least three iterations otherwise we can't calculate - // the relative increase - if (value < 3) - { - throw new ArgumentOutOfRangeException("value"); - } - - _minimumNumberOfIterations = value; - } - } - - /// - /// Returns the minimum number of iterations to the default. - /// - public void ResetNumberOfIterationsToDefault() - { - _minimumNumberOfIterations = DefaultMinimumNumberOfIterations; - } - - /// - /// Determines the status of the iterative calculation based on the stop criteria stored - /// by the current . Result is set into Status field. - /// - /// The number of iterations that have passed so far. - /// The vector containing the current solution values. - /// The right hand side vector. - /// The vector containing the current residual vectors. - /// - /// The individual stop criteria may internally track the progress of the calculation based - /// on the invocation of this method. Therefore this method should only be called if the - /// calculation has moved forwards at least one step. - /// - public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) - { - if (iterationNumber < 0) - { - throw new ArgumentOutOfRangeException("iterationNumber"); - } - - if (_lastIteration >= iterationNumber) - { - // We have already stored the actual last iteration number - // For now do nothing. We only care about the next step. - return _status; - } - - if ((_residualHistory == null) || (_residualHistory.Length != RequiredHistoryLength)) - { - _residualHistory = new double[RequiredHistoryLength]; - } - - // We always track the residual. - // Move the old versions one element up in the array. - for (var i = 1; i < _residualHistory.Length; i++) - { - _residualHistory[i - 1] = _residualHistory[i]; - } - - // Store the infinity norms of both the solution and residual vectors - // These values will be used to calculate the relative drop in residuals later on. - _residualHistory[_residualHistory.Length - 1] = residualVector.InfinityNorm(); - - // Check if we have NaN's. If so we've gone way beyond normal divergence. - // Stop the iteration. - if (double.IsNaN(_residualHistory[_residualHistory.Length - 1])) - { - _status = IterationStatus.Diverged; - return _status; - } - - // Check if we are diverging and if so set the status - _status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue; - - _lastIteration = iterationNumber; - return _status; - } - - /// - /// Detect if solution is diverging - /// - /// true if diverging, otherwise false - bool IsDiverging() - { - // Run for each variable - for (var i = 1; i < _residualHistory.Length; i++) - { - var difference = _residualHistory[i] - _residualHistory[i - 1]; - - // Divergence is occurring if: - // - the last residual is larger than the previous one - // - the relative increase of the residual is larger than the setting allows - if ((difference < 0) || (_residualHistory[i - 1]*(1 + _maximumRelativeIncrease) >= _residualHistory[i])) - { - // No divergence taking place within the required number of iterations - // So reset and stop the iteration. There is no way we can get to the - // required number of iterations anymore. - return false; - } - } - - return true; - } - - /// - /// Gets required history Length - /// - int RequiredHistoryLength - { - [DebuggerStepThrough] - get - { - return _minimumNumberOfIterations + 1; - } - } - - /// - /// Gets the current calculation status. - /// - public IterationStatus Status - { - [DebuggerStepThrough] - get - { - return _status; - } - } - - /// - /// Resets the to the pre-calculation state. - /// - public void Reset() - { - _status = IterationStatus.Continue; - _lastIteration = DefaultLastIterationNumber; - _residualHistory = null; - } - - /// - /// Clones the current and its settings. - /// - /// A new instance of the class. - public IIterationStopCriterium Clone() - { - return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations); - } - } -} diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/DivergenceStopCriterium.cs b/src/Numerics/LinearAlgebra/Double/Solvers/DivergenceStopCriterium.cs deleted file mode 100644 index 4502be29..00000000 --- a/src/Numerics/LinearAlgebra/Double/Solvers/DivergenceStopCriterium.cs +++ /dev/null @@ -1,302 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -using MathNet.Numerics.LinearAlgebra.Solvers; -using System; -using System.Diagnostics; - -namespace MathNet.Numerics.LinearAlgebra.Double.Solvers -{ - /// - /// Monitors an iterative calculation for signs of divergence. - /// - public sealed class DivergenceStopCriterium : IIterationStopCriterium - { - /// - /// Default value for the maximum relative increase that the - /// residual may experience before a divergence warning is issued. - /// - public const double DefaultMaximumRelativeIncrease = 0.08; - - /// - /// Default value for the minimum number of iterations over which - /// the residual must grow before a divergence warning is issued. - /// - public const int DefaultMinimumNumberOfIterations = 10; - - /// - /// Defines the default last iteration number. Set to -1 because iterations normally - /// start at 0. - /// - const int DefaultLastIterationNumber = -1; - - /// - /// The maximum relative increase the residual may experience without triggering a divergence warning. - /// - double _maximumRelativeIncrease; - - /// - /// The number of iterations over which a residual increase should be tracked before issuing a divergence warning. - /// - int _minimumNumberOfIterations; - - /// - /// The status of the calculation - /// - IterationStatus _status = IterationStatus.Continue; - - /// - /// The array that holds the tracking information. - /// - double[] _residualHistory; - - /// - /// The iteration number of the last iteration. - /// - int _lastIteration = DefaultLastIterationNumber; - - /// - /// Initializes a new instance of the class with the specified maximum - /// relative increase and the specified minimum number of tracking iterations. - /// - /// The maximum relative increase that the residual may experience before a divergence warning is issued. - /// The minimum number of iterations over which the residual must grow before a divergence warning is issued. - public DivergenceStopCriterium(double maximumRelativeIncrease = DefaultMaximumRelativeIncrease, int minimumIterations = DefaultMinimumNumberOfIterations) - { - if (maximumRelativeIncrease <= 0) - { - throw new ArgumentOutOfRangeException("maximumRelativeIncrease"); - } - - // There must be at least three iterations otherwise we can't calculate the relative increase - if (minimumIterations < 3) - { - throw new ArgumentOutOfRangeException("minimumIterations"); - } - - _maximumRelativeIncrease = maximumRelativeIncrease; - _minimumNumberOfIterations = minimumIterations; - } - - /// - /// Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. - /// - /// Thrown if the Maximum is set to zero or below. - public double MaximumRelativeIncrease - { - [DebuggerStepThrough] - get - { - return _maximumRelativeIncrease; - } - - [DebuggerStepThrough] - set - { - if (value <= 0) - { - throw new ArgumentOutOfRangeException("value"); - } - - _maximumRelativeIncrease = value; - } - } - - /// - /// Returns the maximum relative increase to the default. - /// - public void ResetMaximumRelativeIncreaseToDefault() - { - _maximumRelativeIncrease = DefaultMaximumRelativeIncrease; - } - - /// - /// Gets or sets the minimum number of iterations over which the residual must grow before - /// issuing a divergence warning. - /// - /// Thrown if the value is set to less than one. - public int MinimumNumberOfIterations - { - [DebuggerStepThrough] - get - { - return _minimumNumberOfIterations; - } - - [DebuggerStepThrough] - set - { - // There must be at least three iterations otherwise we can't calculate - // the relative increase - if (value < 3) - { - throw new ArgumentOutOfRangeException("value"); - } - - _minimumNumberOfIterations = value; - } - } - - /// - /// Returns the minimum number of iterations to the default. - /// - public void ResetNumberOfIterationsToDefault() - { - _minimumNumberOfIterations = DefaultMinimumNumberOfIterations; - } - - /// - /// Determines the status of the iterative calculation based on the stop criteria stored - /// by the current . Result is set into Status field. - /// - /// The number of iterations that have passed so far. - /// The vector containing the current solution values. - /// The right hand side vector. - /// The vector containing the current residual vectors. - /// - /// The individual stop criteria may internally track the progress of the calculation based - /// on the invocation of this method. Therefore this method should only be called if the - /// calculation has moved forwards at least one step. - /// - public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) - { - if (iterationNumber < 0) - { - throw new ArgumentOutOfRangeException("iterationNumber"); - } - - if (_lastIteration >= iterationNumber) - { - // We have already stored the actual last iteration number - // For now do nothing. We only care about the next step. - return _status; - } - - if ((_residualHistory == null) || (_residualHistory.Length != RequiredHistoryLength)) - { - _residualHistory = new double[RequiredHistoryLength]; - } - - // We always track the residual. - // Move the old versions one element up in the array. - for (var i = 1; i < _residualHistory.Length; i++) - { - _residualHistory[i - 1] = _residualHistory[i]; - } - - // Store the infinity norms of both the solution and residual vectors - // These values will be used to calculate the relative drop in residuals later on. - _residualHistory[_residualHistory.Length - 1] = residualVector.InfinityNorm(); - - // Check if we have NaN's. If so we've gone way beyond normal divergence. - // Stop the iteration. - if (double.IsNaN(_residualHistory[_residualHistory.Length - 1])) - { - _status = IterationStatus.Diverged; - return _status; - } - - // Check if we are diverging and if so set the status - _status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue; - - _lastIteration = iterationNumber; - return _status; - } - - /// - /// Detect if solution is diverging - /// - /// true if diverging, otherwise false - bool IsDiverging() - { - // Run for each variable - for (var i = 1; i < _residualHistory.Length; i++) - { - var difference = _residualHistory[i] - _residualHistory[i - 1]; - - // Divergence is occurring if: - // - the last residual is larger than the previous one - // - the relative increase of the residual is larger than the setting allows - if ((difference < 0) || (_residualHistory[i - 1]*(1 + _maximumRelativeIncrease) >= _residualHistory[i])) - { - // No divergence taking place within the required number of iterations - // So reset and stop the iteration. There is no way we can get to the - // required number of iterations anymore. - return false; - } - } - - return true; - } - - /// - /// Gets required history Length - /// - int RequiredHistoryLength - { - [DebuggerStepThrough] - get - { - return _minimumNumberOfIterations + 1; - } - } - - /// - /// Gets the current calculation status. - /// - public IterationStatus Status - { - [DebuggerStepThrough] - get - { - return _status; - } - } - - /// - /// Resets the to the pre-calculation state. - /// - public void Reset() - { - _status = IterationStatus.Continue; - _lastIteration = DefaultLastIterationNumber; - _residualHistory = null; - } - - /// - /// Clones the current and its settings. - /// - /// A new instance of the class. - public IIterationStopCriterium Clone() - { - return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations); - } - } -} \ No newline at end of file diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/DivergenceStopCriterium.cs b/src/Numerics/LinearAlgebra/Solvers/DivergenceStopCriterium.cs similarity index 83% rename from src/Numerics/LinearAlgebra/Single/Solvers/DivergenceStopCriterium.cs rename to src/Numerics/LinearAlgebra/Solvers/DivergenceStopCriterium.cs index d4140656..3374d538 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/DivergenceStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Solvers/DivergenceStopCriterium.cs @@ -28,35 +28,16 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using MathNet.Numerics.LinearAlgebra.Solvers; using System; using System.Diagnostics; -namespace MathNet.Numerics.LinearAlgebra.Single.Solvers +namespace MathNet.Numerics.LinearAlgebra.Solvers { /// /// Monitors an iterative calculation for signs of divergence. /// - public sealed class DivergenceStopCriterium : IIterationStopCriterium + public sealed class DivergenceStopCriterium : IIterationStopCriterium where T : struct, IEquatable, IFormattable { - /// - /// Default value for the maximum relative increase that the - /// residual may experience before a divergence warning is issued. - /// - public const double DefaultMaximumRelativeIncrease = 0.08; - - /// - /// Default value for the minimum number of iterations over which - /// the residual must grow before a divergence warning is issued. - /// - public const int DefaultMinimumNumberOfIterations = 10; - - /// - /// Defines the default last iteration number. Set to -1 because iterations normally - /// start at 0. - /// - const int DefaultLastIterationNumber = -1; - /// /// The maximum relative increase the residual may experience without triggering a divergence warning. /// @@ -80,15 +61,15 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// /// The iteration number of the last iteration. /// - int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = -1; /// - /// Initializes a new instance of the class with the specified maximum + /// Initializes a new instance of the class with the specified maximum /// relative increase and the specified minimum number of tracking iterations. /// /// The maximum relative increase that the residual may experience before a divergence warning is issued. /// The minimum number of iterations over which the residual must grow before a divergence warning is issued. - public DivergenceStopCriterium(double maximumRelativeIncrease = DefaultMaximumRelativeIncrease, int minimumIterations = DefaultMinimumNumberOfIterations) + public DivergenceStopCriterium(double maximumRelativeIncrease = 0.08, int minimumIterations = 10) { if (maximumRelativeIncrease <= 0) { @@ -129,14 +110,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers } } - /// - /// Returns the maximum relative increase to the default. - /// - public void ResetMaximumRelativeIncreaseToDefault() - { - _maximumRelativeIncrease = DefaultMaximumRelativeIncrease; - } - /// /// Gets or sets the minimum number of iterations over which the residual must grow before /// issuing a divergence warning. @@ -164,14 +137,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers } } - /// - /// Returns the minimum number of iterations to the default. - /// - public void ResetNumberOfIterationsToDefault() - { - _minimumNumberOfIterations = DefaultMinimumNumberOfIterations; - } - /// /// Determines the status of the iterative calculation based on the stop criteria stored /// by the current . Result is set into Status field. @@ -185,7 +150,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { @@ -286,17 +251,17 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers public void Reset() { _status = IterationStatus.Continue; - _lastIteration = DefaultLastIterationNumber; + _lastIteration = -1; _residualHistory = null; } /// - /// Clones the current and its settings. + /// Clones the current and its settings. /// - /// A new instance of the class. - public IIterationStopCriterium Clone() + /// A new instance of the class. + public IIterationStopCriterium Clone() { - return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations); + return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations); } } } diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj index 589eb72e..af2419d3 100644 --- a/src/Numerics/Numerics.csproj +++ b/src/Numerics/Numerics.csproj @@ -255,7 +255,6 @@ - @@ -278,7 +277,6 @@ - @@ -317,7 +315,7 @@ - + @@ -344,7 +342,6 @@ - diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs index bfba64d0..45d0b1d8 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs @@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); @@ -143,7 +143,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator(new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); @@ -219,7 +219,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator(new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs index 78ff9472..8f0a1bde 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs @@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); @@ -144,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); @@ -221,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs index 8da92d6a..7d82fd8c 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs @@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); @@ -144,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); @@ -221,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs index 1c3caf3d..1d2ac7f4 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs @@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); @@ -144,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); @@ -221,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs index 0a5a041f..2327535c 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs @@ -72,7 +72,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(), new ResidualStopCriterium(1e-12) }; @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(1) }; @@ -126,7 +126,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(1) }; diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs index 6daa33d3..9290acd3 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs @@ -54,7 +54,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void CreateWithNegativeMaximumIncreaseThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new DivergenceStopCriterium(-0.1)); + Assert.Throws(() => new DivergenceStopCriterium(-0.1)); } /// @@ -63,7 +63,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new DivergenceStopCriterium(minimumIterations: 2)); + Assert.Throws(() => new DivergenceStopCriterium(minimumIterations: 2)); } /// @@ -72,50 +72,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void Create() { - var criterium = new DivergenceStopCriterium(0.1, 3); + var criterium = new DivergenceStopCriterium(0.1, 3); Assert.IsNotNull(criterium, "There should be a criterium"); Assert.AreEqual(0.1, criterium.MaximumRelativeIncrease, "Incorrect maximum"); Assert.AreEqual(3, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); } - /// - /// Can reset maximum increase. - /// - [Test] - public void ResetMaximumIncrease() - { - var criterium = new DivergenceStopCriterium(0.5, 3); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.AreEqual(0.5, criterium.MaximumRelativeIncrease, "Incorrect maximum"); - - criterium.ResetMaximumRelativeIncreaseToDefault(); - Assert.AreEqual(DivergenceStopCriterium.DefaultMaximumRelativeIncrease, criterium.MaximumRelativeIncrease, "Incorrect value"); - } - - /// - /// Can reset minimum iterations below maximum. - /// - [Test] - public void ResetMinimumIterationsBelowMaximum() - { - var criterium = new DivergenceStopCriterium(0.5, 15); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.AreEqual(15, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); - - criterium.ResetNumberOfIterationsToDefault(); - Assert.AreEqual(DivergenceStopCriterium.DefaultMinimumNumberOfIterations, criterium.MinimumNumberOfIterations, "Incorrect value"); - } - /// /// Determine status with illegal iteration number throws ArgumentOutOfRangeException. /// [Test] public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException() { - var criterium = new DivergenceStopCriterium(0.5, 15); + var criterium = new DivergenceStopCriterium(0.5, 15); Assert.Throws(() => criterium.DetermineStatus( -1, DenseVector.Create(3, i => 4), @@ -132,7 +102,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have to few iterations for (var i = 0; i < Iterations - 1; i++) @@ -156,7 +126,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we won't have enough increase for (var i = 0; i < Iterations*2; i++) @@ -180,7 +150,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have to few iterations for (var i = 0; i < Iterations - 5; i++) @@ -213,7 +183,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have one to few iterations double previous = 1; @@ -249,7 +219,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. Blow it up instantly var status = criterium.DetermineStatus( @@ -277,13 +247,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); Assert.IsNotNull(criterium, "There should be a criterium"); var clone = criterium.Clone(); - Assert.IsInstanceOf(typeof (DivergenceStopCriterium), clone, "Wrong criterium type"); + Assert.IsInstanceOf(typeof(DivergenceStopCriterium), clone, "Wrong criterium type"); - var clonedCriterium = clone as DivergenceStopCriterium; + var clonedCriterium = clone as DivergenceStopCriterium; Assert.IsNotNull(clonedCriterium); Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum"); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs index 462ed07a..d2680073 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs @@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); @@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); @@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs index e8fc3b8c..bbb25f82 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs @@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); @@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); @@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs index 459858a5..5ecd64d9 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs @@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); @@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); @@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs index c136d409..ab17064a 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs @@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); @@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); @@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs index 084cb085..41558e20 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs @@ -68,7 +68,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(), new ResidualStopCriterium(1e-6) }; @@ -90,7 +90,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(1) }; @@ -122,7 +122,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(1) }; diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs index 6192da34..a84c9098 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs @@ -50,7 +50,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void CreateWithNegativeMaximumIncreaseThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new DivergenceStopCriterium(-0.1)); + Assert.Throws(() => new DivergenceStopCriterium(-0.1)); } /// @@ -59,7 +59,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new DivergenceStopCriterium(minimumIterations: 2)); + Assert.Throws(() => new DivergenceStopCriterium(minimumIterations: 2)); } /// @@ -68,50 +68,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void Create() { - var criterium = new DivergenceStopCriterium(0.1, 3); + var criterium = new DivergenceStopCriterium(0.1, 3); Assert.IsNotNull(criterium, "There should be a criterium"); Assert.AreEqual(0.1, criterium.MaximumRelativeIncrease, "Incorrect maximum"); Assert.AreEqual(3, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); } - /// - /// Can reset maximum increase. - /// - [Test] - public void ResetMaximumIncrease() - { - var criterium = new DivergenceStopCriterium(0.5, 3); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.AreEqual(0.5, criterium.MaximumRelativeIncrease, "Incorrect maximum"); - - criterium.ResetMaximumRelativeIncreaseToDefault(); - Assert.AreEqual(DivergenceStopCriterium.DefaultMaximumRelativeIncrease, criterium.MaximumRelativeIncrease, "Incorrect value"); - } - - /// - /// Can reset minimum iterations below maximum. - /// - [Test] - public void ResetMinimumIterationsBelowMaximum() - { - var criterium = new DivergenceStopCriterium(0.5, 15); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.AreEqual(15, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); - - criterium.ResetNumberOfIterationsToDefault(); - Assert.AreEqual(DivergenceStopCriterium.DefaultMinimumNumberOfIterations, criterium.MinimumNumberOfIterations, "Incorrect value"); - } - /// /// Determine status with illegal iteration number throws ArgumentOutOfRangeException. /// [Test] public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException() { - var criterium = new DivergenceStopCriterium(0.5, 15); + var criterium = new DivergenceStopCriterium(0.5, 15); Assert.Throws(() => criterium.DetermineStatus( -1, DenseVector.Create(3, i => 4), @@ -128,7 +98,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have to few iterations for (var i = 0; i < Iterations - 1; i++) @@ -151,7 +121,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we won't have enough increase for (var i = 0; i < Iterations*2; i++) @@ -175,7 +145,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have to few iterations for (var i = 0; i < Iterations - 5; i++) @@ -208,7 +178,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have one to few iterations float previous = 1; @@ -244,7 +214,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. Blow it up instantly var status = criterium.DetermineStatus( @@ -272,13 +242,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); Assert.IsNotNull(criterium, "There should be a criterium"); var clone = criterium.Clone(); - Assert.IsInstanceOf(typeof (DivergenceStopCriterium), clone, "Wrong criterium type"); + Assert.IsInstanceOf(typeof(DivergenceStopCriterium), clone, "Wrong criterium type"); - var clonedCriterium = clone as DivergenceStopCriterium; + var clonedCriterium = clone as DivergenceStopCriterium; Assert.IsNotNull(clonedCriterium); Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum"); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs index e5138ce5..26083717 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); @@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); @@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs index 86a8ff1a..47ff7ef3 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); @@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); @@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs index c9568bea..c6a9b131 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); @@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); @@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs index 330c6ae2..6483a53c 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); @@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); @@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs index 51903ca0..b5957016 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs @@ -66,7 +66,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(), new ResidualStopCriterium(1e-12) }; @@ -88,7 +88,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(1) }; @@ -120,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(1) }; diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs index 4431f923..9f05e24f 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs @@ -48,7 +48,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void CreateWithNegativeMaximumIncreaseThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new DivergenceStopCriterium(-0.1)); + Assert.Throws(() => new DivergenceStopCriterium(-0.1)); } /// @@ -57,7 +57,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new DivergenceStopCriterium(minimumIterations: 2)); + Assert.Throws(() => new DivergenceStopCriterium(minimumIterations: 2)); } /// @@ -66,50 +66,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void Create() { - var criterium = new DivergenceStopCriterium(0.1, 3); + var criterium = new DivergenceStopCriterium(0.1, 3); Assert.IsNotNull(criterium, "There should be a criterium"); Assert.AreEqual(0.1, criterium.MaximumRelativeIncrease, "Incorrect maximum"); Assert.AreEqual(3, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); } - /// - /// Can reset maximum increase. - /// - [Test] - public void ResetMaximumIncrease() - { - var criterium = new DivergenceStopCriterium(0.5, 3); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.AreEqual(0.5, criterium.MaximumRelativeIncrease, "Incorrect maximum"); - - criterium.ResetMaximumRelativeIncreaseToDefault(); - Assert.AreEqual(DivergenceStopCriterium.DefaultMaximumRelativeIncrease, criterium.MaximumRelativeIncrease, "Incorrect value"); - } - - /// - /// Can reset minimum iterations below maximum. - /// - [Test] - public void ResetMinimumIterationsBelowMaximum() - { - var criterium = new DivergenceStopCriterium(0.5, 15); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.AreEqual(15, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); - - criterium.ResetNumberOfIterationsToDefault(); - Assert.AreEqual(DivergenceStopCriterium.DefaultMinimumNumberOfIterations, criterium.MinimumNumberOfIterations, "Incorrect value"); - } - /// /// Determine status with illegal iteration number throws ArgumentOutOfRangeException. /// [Test] public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException() { - var criterium = new DivergenceStopCriterium(0.5, 15); + var criterium = new DivergenceStopCriterium(0.5, 15); Assert.Throws(() => criterium.DetermineStatus( -1, DenseVector.Create(3, i => 4), @@ -126,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have to few iterations for (var i = 0; i < Iterations - 1; i++) @@ -150,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we won't have enough increase for (var i = 0; i < Iterations*2; i++) @@ -174,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have to few iterations for (var i = 0; i < Iterations - 5; i++) @@ -207,7 +177,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have one to few iterations double previous = 1; @@ -243,7 +213,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. Blow it up instantly var status = criterium.DetermineStatus( @@ -271,13 +241,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); Assert.IsNotNull(criterium, "There should be a criterium"); var clone = criterium.Clone(); - Assert.IsInstanceOf(typeof (DivergenceStopCriterium), clone, "Wrong criterium type"); + Assert.IsInstanceOf(typeof(DivergenceStopCriterium), clone, "Wrong criterium type"); - var clonedCriterium = clone as DivergenceStopCriterium; + var clonedCriterium = clone as DivergenceStopCriterium; Assert.IsNotNull(clonedCriterium); Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum"); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs index c482ce75..01da26e6 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); @@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); @@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new BiCgStab(); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs index 9108d8d4..21761734 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); @@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); @@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new GpBiCg(); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs index 52e60c4c..20862fe7 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs @@ -95,7 +95,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); @@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); @@ -220,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new MlkBiCgStab(); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs index 3d0134d8..b7c7010c 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); @@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); @@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), new ResidualStopCriterium(ConvergenceBoundary), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new FailureStopCriterium()); var solver = new TFQMR(); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs index fe4e0fb3..4261b242 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs @@ -66,7 +66,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(), new ResidualStopCriterium(1e-6) }; @@ -88,7 +88,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(1) }; @@ -120,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers var criteria = new List> { new FailureStopCriterium(), - new DivergenceStopCriterium(), + new DivergenceStopCriterium(), new IterationCountStopCriterium(1) }; diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs index 0b50fd2f..dd9dc046 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs @@ -48,7 +48,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void CreateWithNegativeMaximumIncreaseThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new DivergenceStopCriterium(-0.1)); + Assert.Throws(() => new DivergenceStopCriterium(-0.1)); } /// @@ -57,7 +57,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new DivergenceStopCriterium(minimumIterations: 2)); + Assert.Throws(() => new DivergenceStopCriterium(minimumIterations: 2)); } /// @@ -66,50 +66,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void Create() { - var criterium = new DivergenceStopCriterium(0.1, 3); + var criterium = new DivergenceStopCriterium(0.1, 3); Assert.IsNotNull(criterium, "There should be a criterium"); Assert.AreEqual(0.1, criterium.MaximumRelativeIncrease, "Incorrect maximum"); Assert.AreEqual(3, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); } - /// - /// Can reset maximum increase. - /// - [Test] - public void ResetMaximumIncrease() - { - var criterium = new DivergenceStopCriterium(0.5, 3); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.AreEqual(0.5, criterium.MaximumRelativeIncrease, "Incorrect maximum"); - - criterium.ResetMaximumRelativeIncreaseToDefault(); - Assert.AreEqual(DivergenceStopCriterium.DefaultMaximumRelativeIncrease, criterium.MaximumRelativeIncrease, "Incorrect value"); - } - - /// - /// Can reset minimum iterations below maximum. - /// - [Test] - public void ResetMinimumIterationsBelowMaximum() - { - var criterium = new DivergenceStopCriterium(0.5, 15); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.AreEqual(15, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); - - criterium.ResetNumberOfIterationsToDefault(); - Assert.AreEqual(DivergenceStopCriterium.DefaultMinimumNumberOfIterations, criterium.MinimumNumberOfIterations, "Incorrect value"); - } - /// /// Determine status with illegal iteration number throws ArgumentOutOfRangeException. /// [Test] public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException() { - var criterium = new DivergenceStopCriterium(0.5, 15); + var criterium = new DivergenceStopCriterium(0.5, 15); Assert.Throws(() => criterium.DetermineStatus( -1, DenseVector.Create(3, i => 4), @@ -126,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have to few iterations for (var i = 0; i < Iterations - 1; i++) @@ -150,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we won't have enough increase for (var i = 0; i < Iterations*2; i++) @@ -174,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have to few iterations for (var i = 0; i < Iterations - 5; i++) @@ -207,7 +177,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite const float Increase = 0.5f; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. We should not diverge because we'll have one to few iterations float previous = 1; @@ -243,7 +213,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); // Add residuals. Blow it up instantly var status = criterium.DetermineStatus( @@ -271,13 +241,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite const double Increase = 0.5; const int Iterations = 10; - var criterium = new DivergenceStopCriterium(Increase, Iterations); + var criterium = new DivergenceStopCriterium(Increase, Iterations); Assert.IsNotNull(criterium, "There should be a criterium"); var clone = criterium.Clone(); - Assert.IsInstanceOf(typeof (DivergenceStopCriterium), clone, "Wrong criterium type"); + Assert.IsInstanceOf(typeof(DivergenceStopCriterium), clone, "Wrong criterium type"); - var clonedCriterium = clone as DivergenceStopCriterium; + var clonedCriterium = clone as DivergenceStopCriterium; Assert.IsNotNull(clonedCriterium); Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum");