From db8a7a030c1e964f9d33cb9d07f2e2fda8244793 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sun, 20 Oct 2013 14:12:15 +0200 Subject: [PATCH] LA: Iterative solvers: make residual stop criterium generic/shared --- .../IterativeSolvers/BiCgStabSolver.cs | 2 +- .../CompositeSolverExample.cs | 2 +- .../IterativeSolvers/GpBiCgSolver.cs | 2 +- .../IterativeSolvers/MlkBiCgStabSolver.cs | 2 +- .../IterativeSolvers/TFQMRSolver.cs | 2 +- src/Numerics/LinearAlgebra/Builder.cs | 8 +- .../Complex/Solvers/ResidualStopCriterium.cs | 294 ------------------ .../Solvers/ResidualStopCriterium.cs | 289 ----------------- .../Single/Solvers/ResidualStopCriterium.cs | 287 ----------------- .../Solvers/ResidualStopCriterium.cs | 54 +--- src/Numerics/Numerics.csproj | 5 +- .../Complex/Solvers/Iterative/BiCgStabTest.cs | 10 +- .../Complex/Solvers/Iterative/GpBiCgTest.cs | 10 +- .../Solvers/Iterative/MlkBiCgStabTest.cs | 10 +- .../Complex/Solvers/Iterative/TFQMRTest.cs | 10 +- .../Complex/Solvers/IteratorTest.cs | 2 +- .../ResidualStopCriteriumTest.cs | 67 +--- .../Solvers/Iterative/BiCgStabTest.cs | 10 +- .../Complex32/Solvers/Iterative/GpBiCgTest.cs | 8 +- .../Solvers/Iterative/MlkBiCgStabTest.cs | 10 +- .../Complex32/Solvers/Iterative/TFQMRTest.cs | 10 +- .../Complex32/Solvers/IteratorTest.cs | 2 +- .../ResidualStopCriteriumTest.cs | 70 +---- .../Double/Solvers/Iterative/BiCgStabTest.cs | 10 +- .../Double/Solvers/Iterative/GpBiCgTest.cs | 10 +- .../Solvers/Iterative/MlkBiCgStabTest.cs | 10 +- .../Double/Solvers/Iterative/TFQMRTest.cs | 10 +- .../Double/Solvers/IteratorTest.cs | 2 +- .../ResidualStopCriteriumTest.cs | 70 +---- .../Single/Solvers/Iterative/BiCgStabTest.cs | 10 +- .../Single/Solvers/Iterative/GpBiCgTest.cs | 10 +- .../Solvers/Iterative/MlkBiCgStabTest.cs | 10 +- .../Single/Solvers/Iterative/TFQMRTest.cs | 10 +- .../Single/Solvers/IteratorTest.cs | 2 +- .../ResidualStopCriteriumTest.cs | 67 +--- 35 files changed, 164 insertions(+), 1223 deletions(-) delete mode 100644 src/Numerics/LinearAlgebra/Complex/Solvers/ResidualStopCriterium.cs delete mode 100644 src/Numerics/LinearAlgebra/Complex32/Solvers/ResidualStopCriterium.cs delete mode 100644 src/Numerics/LinearAlgebra/Single/Solvers/ResidualStopCriterium.cs rename src/Numerics/LinearAlgebra/{Double => }/Solvers/ResidualStopCriterium.cs (82%) diff --git a/src/Examples/LinearAlgebra/IterativeSolvers/BiCgStabSolver.cs b/src/Examples/LinearAlgebra/IterativeSolvers/BiCgStabSolver.cs index b0536dc6..2cac2457 100644 --- a/src/Examples/LinearAlgebra/IterativeSolvers/BiCgStabSolver.cs +++ b/src/Examples/LinearAlgebra/IterativeSolvers/BiCgStabSolver.cs @@ -101,7 +101,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples var iterationCountStopCriterium = new IterationCountStopCriterium(1000); // Stop calculation if residuals are below 1E-10 --> the calculation is considered converged - var residualStopCriterium = new ResidualStopCriterium(1e-10); + var residualStopCriterium = new ResidualStopCriterium(1e-10); // Create monitor with defined stop criteriums var monitor = new Iterator(iterationCountStopCriterium, residualStopCriterium); diff --git a/src/Examples/LinearAlgebra/IterativeSolvers/CompositeSolverExample.cs b/src/Examples/LinearAlgebra/IterativeSolvers/CompositeSolverExample.cs index 9c6ed264..2f72fda7 100644 --- a/src/Examples/LinearAlgebra/IterativeSolvers/CompositeSolverExample.cs +++ b/src/Examples/LinearAlgebra/IterativeSolvers/CompositeSolverExample.cs @@ -100,7 +100,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples var iterationCountStopCriterium = new IterationCountStopCriterium(1000); // Stop calculation if residuals are below 1E-10 --> the calculation is considered converged - var residualStopCriterium = new ResidualStopCriterium(1e-10); + var residualStopCriterium = new ResidualStopCriterium(1e-10); // Create monitor with defined stop criteriums var monitor = new Iterator(iterationCountStopCriterium, residualStopCriterium); diff --git a/src/Examples/LinearAlgebra/IterativeSolvers/GpBiCgSolver.cs b/src/Examples/LinearAlgebra/IterativeSolvers/GpBiCgSolver.cs index 3d22b198..891610cc 100644 --- a/src/Examples/LinearAlgebra/IterativeSolvers/GpBiCgSolver.cs +++ b/src/Examples/LinearAlgebra/IterativeSolvers/GpBiCgSolver.cs @@ -99,7 +99,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples var iterationCountStopCriterium = new IterationCountStopCriterium(1000); // Stop calculation if residuals are below 1E-10 --> the calculation is considered converged - var residualStopCriterium = new ResidualStopCriterium(1e-10); + var residualStopCriterium = new ResidualStopCriterium(1e-10); // Create monitor with defined stop criteriums var monitor = new Iterator(iterationCountStopCriterium, residualStopCriterium); diff --git a/src/Examples/LinearAlgebra/IterativeSolvers/MlkBiCgStabSolver.cs b/src/Examples/LinearAlgebra/IterativeSolvers/MlkBiCgStabSolver.cs index 97832be3..a9313f67 100644 --- a/src/Examples/LinearAlgebra/IterativeSolvers/MlkBiCgStabSolver.cs +++ b/src/Examples/LinearAlgebra/IterativeSolvers/MlkBiCgStabSolver.cs @@ -100,7 +100,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples var iterationCountStopCriterium = new IterationCountStopCriterium(1000); // Stop calculation if residuals are below 1E-10 --> the calculation is considered converged - var residualStopCriterium = new ResidualStopCriterium(1e-10); + var residualStopCriterium = new ResidualStopCriterium(1e-10); // Create monitor with defined stop criteriums var monitor = new Iterator(iterationCountStopCriterium, residualStopCriterium); diff --git a/src/Examples/LinearAlgebra/IterativeSolvers/TFQMRSolver.cs b/src/Examples/LinearAlgebra/IterativeSolvers/TFQMRSolver.cs index e091e4cc..f4465896 100644 --- a/src/Examples/LinearAlgebra/IterativeSolvers/TFQMRSolver.cs +++ b/src/Examples/LinearAlgebra/IterativeSolvers/TFQMRSolver.cs @@ -100,7 +100,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples var iterationCountStopCriterium = new IterationCountStopCriterium(1000); // Stop calculation if residuals are below 1E-10 --> the calculation is considered converged - var residualStopCriterium = new ResidualStopCriterium(1e-10); + var residualStopCriterium = new ResidualStopCriterium(1e-10); // Create monitor with defined stop criteriums var monitor = new Iterator(iterationCountStopCriterium, residualStopCriterium); diff --git a/src/Numerics/LinearAlgebra/Builder.cs b/src/Numerics/LinearAlgebra/Builder.cs index 832daf57..c5304b0a 100644 --- a/src/Numerics/LinearAlgebra/Builder.cs +++ b/src/Numerics/LinearAlgebra/Builder.cs @@ -80,7 +80,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double new FailureStopCriterium(), new DivergenceStopCriterium(), new IterationCountStopCriterium(maxIterations), - new ResidualStopCriterium() + new ResidualStopCriterium(1e-12) }; } } @@ -157,7 +157,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single new FailureStopCriterium(), new DivergenceStopCriterium(), new IterationCountStopCriterium(maxIterations), - new ResidualStopCriterium() + new ResidualStopCriterium(1e-6) }; } } @@ -240,7 +240,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex new FailureStopCriterium(), new DivergenceStopCriterium(), new IterationCountStopCriterium(maxIterations), - new ResidualStopCriterium() + new ResidualStopCriterium(1e-12) }; } } @@ -317,7 +317,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 new FailureStopCriterium(), new DivergenceStopCriterium(), new IterationCountStopCriterium(maxIterations), - new ResidualStopCriterium() + new ResidualStopCriterium(1e-6) }; } } diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/ResidualStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/ResidualStopCriterium.cs deleted file mode 100644 index 9b706210..00000000 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/ResidualStopCriterium.cs +++ /dev/null @@ -1,294 +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 System; -using System.Diagnostics; -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.Properties; - -namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers -{ - -#if NOSYSNUMERICS - using Complex = Numerics.Complex; -#else - using Complex = System.Numerics.Complex; -#endif - - /// - /// Defines an that monitors residuals as stop criterium. - /// - public sealed class ResidualStopCriterium : IIterationStopCriterium - { - /// - /// The default value for the maximum value of the residual. - /// - public const double DefaultMaximumResidual = 1e-12; - - /// - /// The default value for the minimum number of iterations. - /// - public const int DefaultMinimumIterationsBelowMaximum = 0; - - /// - /// Defines the default last iteration number. Set to -1 because iterations normally start at 0. - /// - const int DefaultLastIterationNumber = -1; - - /// - /// The maximum value for the residual below which the calculation is considered converged. - /// - double _maximum; - - /// - /// The minimum number of iterations for which the residual has to be below the maximum before - /// the calculation is considered converged. - /// - int _minimumIterationsBelowMaximum; - - /// - /// The status of the calculation - /// - IterationStatus _status = IterationStatus.Continue; - - /// - /// The number of iterations since the residuals got below the maximum. - /// - int _iterationCount; - - /// - /// The iteration number of the last iteration. - /// - int _lastIteration = DefaultLastIterationNumber; - - /// - /// Initializes a new instance of the class with the specified - /// maximum residual and minimum number of iterations. - /// - /// - /// The maximum value for the residual below which the calculation is considered converged. - /// - /// - /// The minimum number of iterations for which the residual has to be below the maximum before - /// the calculation is considered converged. - /// - public ResidualStopCriterium(double maximum = DefaultMaximumResidual, int minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum) - { - if (maximum < 0) - { - throw new ArgumentOutOfRangeException("maximum"); - } - - if (minimumIterationsBelowMaximum < 0) - { - throw new ArgumentOutOfRangeException("minimumIterationsBelowMaximum"); - } - - _maximum = maximum; - _minimumIterationsBelowMaximum = minimumIterationsBelowMaximum; - } - - /// - /// Gets or sets the maximum value for the residual below which the calculation is considered - /// converged. - /// - /// Thrown if the Maximum is set to a negative value. - public double Maximum - { - [DebuggerStepThrough] - get - { - return _maximum; - } - - [DebuggerStepThrough] - set - { - if (value < 0) - { - throw new ArgumentOutOfRangeException("value"); - } - - _maximum = value; - } - } - - /// - /// Returns the maximum residual to the default. - /// - public void ResetMaximumResidualToDefault() - { - _maximum = DefaultMaximumResidual; - } - - /// - /// Gets or sets the minimum number of iterations for which the residual has to be - /// below the maximum before the calculation is considered converged. - /// - /// Thrown if the BelowMaximumFor is set to a value less than 1. - public int MinimumIterationsBelowMaximum - { - [DebuggerStepThrough] - get - { - return _minimumIterationsBelowMaximum; - } - - [DebuggerStepThrough] - set - { - if (value < 0) - { - throw new ArgumentOutOfRangeException("value"); - } - - _minimumIterationsBelowMaximum = value; - } - } - - /// - /// Returns the minimum number of iterations to the default. - /// - public void ResetMinimumIterationsBelowMaximumToDefault() - { - _minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum; - } - - /// - /// 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 (solutionVector.Count != sourceVector.Count) - { - throw new ArgumentException(Resources.ArgumentVectorsSameLength, "sourceVector"); - } - - if (solutionVector.Count != residualVector.Count) - { - throw new ArgumentException(Resources.ArgumentVectorsSameLength, "residualVector"); - } - - - // 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. - var residualNorm = residualVector.InfinityNorm(); - - - // This is criterium 1 from Templates for the solution of linear systems. - // The problem with this criterium is that it's not limiting enough. For now - // we won't use it. Later on we might get back to it. - // return mMaximumResidual * (System.Math.Abs(mMatrixNorm) * System.Math.Abs(solutionNorm) + System.Math.Abs(mVectorNorm)); - - // For now use criterium 2 from Templates for the solution of linear systems. See page 60. - - // Check the residuals by calculating: - // ||r_i|| <= stop_tol * ||b|| - var stopCriterium = _maximum * sourceVector.InfinityNorm(); - - - // First check that we have real numbers not NaN's. - // NaN's can occur when the iterative process diverges so we - // stop if that is the case. - if (double.IsNaN(stopCriterium) || double.IsNaN(residualNorm)) - { - _iterationCount = 0; - _status = IterationStatus.Diverged; - return _status; - } - - // ||r_i|| <= stop_tol * ||b|| - // Stop the calculation if it's clearly smaller than the tolerance - if (residualNorm < stopCriterium) - { - if (_lastIteration <= iterationNumber) - { - _iterationCount = iterationNumber - _lastIteration; - _status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Continue; - } - } - else - { - _iterationCount = 0; - _status = IterationStatus.Continue; - } - - _lastIteration = iterationNumber; - return _status; - } - - /// - /// 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; - _iterationCount = 0; - _lastIteration = DefaultLastIterationNumber; - } - - /// - /// Clones the current and its settings. - /// - /// A new instance of the class. - public IIterationStopCriterium Clone() - { - return new ResidualStopCriterium(_maximum, _minimumIterationsBelowMaximum); - } - } -} diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/ResidualStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/ResidualStopCriterium.cs deleted file mode 100644 index 91535fde..00000000 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/ResidualStopCriterium.cs +++ /dev/null @@ -1,289 +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 System; -using System.Diagnostics; -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.Properties; - -namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers -{ - using Numerics; - - /// - /// Defines an that monitors residuals as stop criterium. - /// - public sealed class ResidualStopCriterium : IIterationStopCriterium - { - /// - /// The default value for the maximum value of the residual. - /// - public const float DefaultMaximumResidual = 1e-6f; - - /// - /// The default value for the minimum number of iterations. - /// - public const int DefaultMinimumIterationsBelowMaximum = 0; - - /// - /// Defines the default last iteration number. Set to -1 because iterations normally start at 0. - /// - const int DefaultLastIterationNumber = -1; - - /// - /// The maximum value for the residual below which the calculation is considered converged. - /// - float _maximum; - - /// - /// The minimum number of iterations for which the residual has to be below the maximum before - /// the calculation is considered converged. - /// - int _minimumIterationsBelowMaximum; - - /// - /// The status of the calculation - /// - IterationStatus _status = IterationStatus.Continue; - - /// - /// The number of iterations since the residuals got below the maximum. - /// - int _iterationCount; - - /// - /// The iteration number of the last iteration. - /// - int _lastIteration = DefaultLastIterationNumber; - - /// - /// Initializes a new instance of the class with the specified - /// maximum residual and minimum number of iterations. - /// - /// - /// The maximum value for the residual below which the calculation is considered converged. - /// - /// - /// The minimum number of iterations for which the residual has to be below the maximum before - /// the calculation is considered converged. - /// - public ResidualStopCriterium(float maximum = DefaultMaximumResidual, int minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum) - { - if (maximum < 0) - { - throw new ArgumentOutOfRangeException("maximum"); - } - - if (minimumIterationsBelowMaximum < 0) - { - throw new ArgumentOutOfRangeException("minimumIterationsBelowMaximum"); - } - - _maximum = maximum; - _minimumIterationsBelowMaximum = minimumIterationsBelowMaximum; - } - - /// - /// Gets or sets the maximum value for the residual below which the calculation is considered - /// converged. - /// - /// Thrown if the Maximum is set to a negative value. - public float Maximum - { - [DebuggerStepThrough] - get - { - return _maximum; - } - - [DebuggerStepThrough] - set - { - if (value < 0) - { - throw new ArgumentOutOfRangeException("value"); - } - - _maximum = value; - } - } - - /// - /// Returns the maximum residual to the default. - /// - public void ResetMaximumResidualToDefault() - { - _maximum = DefaultMaximumResidual; - } - - /// - /// Gets or sets the minimum number of iterations for which the residual has to be - /// below the maximum before the calculation is considered converged. - /// - /// Thrown if the BelowMaximumFor is set to a value less than 1. - public int MinimumIterationsBelowMaximum - { - [DebuggerStepThrough] - get - { - return _minimumIterationsBelowMaximum; - } - - [DebuggerStepThrough] - set - { - if (value < 0) - { - throw new ArgumentOutOfRangeException("value"); - } - - _minimumIterationsBelowMaximum = value; - } - } - - /// - /// Returns the minimum number of iterations to the default. - /// - public void ResetMinimumIterationsBelowMaximumToDefault() - { - _minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum; - } - - /// - /// 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 (solutionVector.Count != sourceVector.Count) - { - throw new ArgumentException(Resources.ArgumentVectorsSameLength, "sourceVector"); - } - - if (solutionVector.Count != residualVector.Count) - { - throw new ArgumentException(Resources.ArgumentVectorsSameLength, "residualVector"); - } - - - // 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. - var residualNorm = residualVector.InfinityNorm(); - - - // This is criterium 1 from Templates for the solution of linear systems. - // The problem with this criterium is that it's not limiting enough. For now - // we won't use it. Later on we might get back to it. - // return mMaximumResidual * (System.Math.Abs(mMatrixNorm) * System.Math.Abs(solutionNorm) + System.Math.Abs(mVectorNorm)); - - // For now use criterium 2 from Templates for the solution of linear systems. See page 60. - - // Check the residuals by calculating: - // ||r_i|| <= stop_tol * ||b|| - var stopCriterium = _maximum * sourceVector.InfinityNorm(); - - - // First check that we have real numbers not NaN's. - // NaN's can occur when the iterative process diverges so we - // stop if that is the case. - if (double.IsNaN(stopCriterium) || double.IsNaN(residualNorm)) - { - _iterationCount = 0; - _status = IterationStatus.Diverged; - return _status; - } - - // ||r_i|| <= stop_tol * ||b|| - // Stop the calculation if it's clearly smaller than the tolerance - if (residualNorm < stopCriterium) - { - if (_lastIteration <= iterationNumber) - { - _iterationCount = iterationNumber - _lastIteration; - _status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Continue; - } - } - else - { - _iterationCount = 0; - _status = IterationStatus.Continue; - } - - _lastIteration = iterationNumber; - return _status; - } - - /// - /// 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; - _iterationCount = 0; - _lastIteration = DefaultLastIterationNumber; - } - - /// - /// Clones the current and its settings. - /// - /// A new instance of the class. - public IIterationStopCriterium Clone() - { - return new ResidualStopCriterium(_maximum, _minimumIterationsBelowMaximum); - } - } -} diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/ResidualStopCriterium.cs b/src/Numerics/LinearAlgebra/Single/Solvers/ResidualStopCriterium.cs deleted file mode 100644 index a6f5b042..00000000 --- a/src/Numerics/LinearAlgebra/Single/Solvers/ResidualStopCriterium.cs +++ /dev/null @@ -1,287 +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 System; -using System.Diagnostics; -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.Properties; - -namespace MathNet.Numerics.LinearAlgebra.Single.Solvers -{ - /// - /// Defines an that monitors residuals as stop criterium. - /// - public sealed class ResidualStopCriterium : IIterationStopCriterium - { - /// - /// The default value for the maximum value of the residual. - /// - public const float DefaultMaximumResidual = 1e-6f; - - /// - /// The default value for the minimum number of iterations. - /// - public const int DefaultMinimumIterationsBelowMaximum = 0; - - /// - /// Defines the default last iteration number. Set to -1 because iterations normally start at 0. - /// - const int DefaultLastIterationNumber = -1; - - /// - /// The maximum value for the residual below which the calculation is considered converged. - /// - float _maximum; - - /// - /// The minimum number of iterations for which the residual has to be below the maximum before - /// the calculation is considered converged. - /// - int _minimumIterationsBelowMaximum; - - /// - /// The status of the calculation - /// - IterationStatus _status = IterationStatus.Continue; - - /// - /// The number of iterations since the residuals got below the maximum. - /// - int _iterationCount; - - /// - /// The iteration number of the last iteration. - /// - int _lastIteration = DefaultLastIterationNumber; - - /// - /// Initializes a new instance of the class with the specified - /// maximum residual and minimum number of iterations. - /// - /// - /// The maximum value for the residual below which the calculation is considered converged. - /// - /// - /// The minimum number of iterations for which the residual has to be below the maximum before - /// the calculation is considered converged. - /// - public ResidualStopCriterium(float maximum = DefaultMaximumResidual, int minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum) - { - if (maximum < 0) - { - throw new ArgumentOutOfRangeException("maximum"); - } - - if (minimumIterationsBelowMaximum < 0) - { - throw new ArgumentOutOfRangeException("minimumIterationsBelowMaximum"); - } - - _maximum = maximum; - _minimumIterationsBelowMaximum = minimumIterationsBelowMaximum; - } - - /// - /// Gets or sets the maximum value for the residual below which the calculation is considered - /// converged. - /// - /// Thrown if the Maximum is set to a negative value. - public float Maximum - { - [DebuggerStepThrough] - get - { - return _maximum; - } - - [DebuggerStepThrough] - set - { - if (value < 0) - { - throw new ArgumentOutOfRangeException("value"); - } - - _maximum = value; - } - } - - /// - /// Returns the maximum residual to the default. - /// - public void ResetMaximumResidualToDefault() - { - _maximum = DefaultMaximumResidual; - } - - /// - /// Gets or sets the minimum number of iterations for which the residual has to be - /// below the maximum before the calculation is considered converged. - /// - /// Thrown if the BelowMaximumFor is set to a value less than 1. - public int MinimumIterationsBelowMaximum - { - [DebuggerStepThrough] - get - { - return _minimumIterationsBelowMaximum; - } - - [DebuggerStepThrough] - set - { - if (value < 0) - { - throw new ArgumentOutOfRangeException("value"); - } - - _minimumIterationsBelowMaximum = value; - } - } - - /// - /// Returns the minimum number of iterations to the default. - /// - public void ResetMinimumIterationsBelowMaximumToDefault() - { - _minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum; - } - - /// - /// 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 (solutionVector.Count != sourceVector.Count) - { - throw new ArgumentException(Resources.ArgumentVectorsSameLength, "sourceVector"); - } - - if (solutionVector.Count != residualVector.Count) - { - throw new ArgumentException(Resources.ArgumentVectorsSameLength, "residualVector"); - } - - - // 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. - var residualNorm = residualVector.InfinityNorm(); - - - // This is criterium 1 from Templates for the solution of linear systems. - // The problem with this criterium is that it's not limiting enough. For now - // we won't use it. Later on we might get back to it. - // return mMaximumResidual * (System.Math.Abs(mMatrixNorm) * System.Math.Abs(solutionNorm) + System.Math.Abs(mVectorNorm)); - - // For now use criterium 2 from Templates for the solution of linear systems. See page 60. - - // Check the residuals by calculating: - // ||r_i|| <= stop_tol * ||b|| - var stopCriterium = _maximum*sourceVector.InfinityNorm(); - - - // First check that we have real numbers not NaN's. - // NaN's can occur when the iterative process diverges so we - // stop if that is the case. - if (double.IsNaN(stopCriterium) || double.IsNaN(residualNorm)) - { - _iterationCount = 0; - _status = IterationStatus.Diverged; - return _status; - } - - // ||r_i|| <= stop_tol * ||b|| - // Stop the calculation if it's clearly smaller than the tolerance - if (residualNorm < stopCriterium) - { - if (_lastIteration <= iterationNumber) - { - _iterationCount = iterationNumber - _lastIteration; - _status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Continue; - } - } - else - { - _iterationCount = 0; - _status = IterationStatus.Continue; - } - - _lastIteration = iterationNumber; - return _status; - } - - /// - /// 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; - _iterationCount = 0; - _lastIteration = DefaultLastIterationNumber; - } - - /// - /// Clones the current and its settings. - /// - /// A new instance of the class. - public IIterationStopCriterium Clone() - { - return new ResidualStopCriterium(_maximum, _minimumIterationsBelowMaximum); - } - } -} diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/ResidualStopCriterium.cs b/src/Numerics/LinearAlgebra/Solvers/ResidualStopCriterium.cs similarity index 82% rename from src/Numerics/LinearAlgebra/Double/Solvers/ResidualStopCriterium.cs rename to src/Numerics/LinearAlgebra/Solvers/ResidualStopCriterium.cs index 4093f4ac..85cc5e18 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/ResidualStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Solvers/ResidualStopCriterium.cs @@ -30,31 +30,15 @@ using System; using System.Diagnostics; -using MathNet.Numerics.LinearAlgebra.Solvers; using MathNet.Numerics.Properties; -namespace MathNet.Numerics.LinearAlgebra.Double.Solvers +namespace MathNet.Numerics.LinearAlgebra.Solvers { /// /// Defines an that monitors residuals as stop criterium. /// - public sealed class ResidualStopCriterium : IIterationStopCriterium + public sealed class ResidualStopCriterium : IIterationStopCriterium where T : struct, IEquatable, IFormattable { - /// - /// The default value for the maximum value of the residual. - /// - public const double DefaultMaximumResidual = 1e-12; - - /// - /// The default value for the minimum number of iterations. - /// - public const int DefaultMinimumIterationsBelowMaximum = 0; - - /// - /// Defines the default last iteration number. Set to -1 because iterations normally start at 0. - /// - const int DefaultLastIterationNumber = -1; - /// /// The maximum value for the residual below which the calculation is considered converged. /// @@ -79,10 +63,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// /// The iteration number of the last iteration. /// - int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = -1; /// - /// Initializes a new instance of the class with the specified + /// Initializes a new instance of the class with the specified /// maximum residual and minimum number of iterations. /// /// @@ -92,7 +76,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// The minimum number of iterations for which the residual has to be below the maximum before /// the calculation is considered converged. /// - public ResidualStopCriterium(double maximum = DefaultMaximumResidual, int minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum) + public ResidualStopCriterium(double maximum, int minimumIterationsBelowMaximum = 0) { if (maximum < 0) { @@ -133,14 +117,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers } } - /// - /// Returns the maximum residual to the default. - /// - public void ResetMaximumResidualToDefault() - { - _maximum = DefaultMaximumResidual; - } - /// /// Gets or sets the minimum number of iterations for which the residual has to be /// below the maximum before the calculation is considered converged. @@ -166,14 +142,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers } } - /// - /// Returns the minimum number of iterations to the default. - /// - public void ResetMinimumIterationsBelowMaximumToDefault() - { - _minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum; - } - /// /// Determines the status of the iterative calculation based on the stop criteria stored /// by the current . Result is set into Status field. @@ -187,7 +155,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.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) { @@ -272,16 +240,16 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers { _status = IterationStatus.Continue; _iterationCount = 0; - _lastIteration = DefaultLastIterationNumber; + _lastIteration = -1; } /// - /// 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 ResidualStopCriterium(_maximum, _minimumIterationsBelowMaximum); + return new ResidualStopCriterium(_maximum, _minimumIterationsBelowMaximum); } } } diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj index d5ef82b2..589eb72e 100644 --- a/src/Numerics/Numerics.csproj +++ b/src/Numerics/Numerics.csproj @@ -257,7 +257,6 @@ - @@ -281,7 +280,6 @@ - @@ -321,7 +319,6 @@ - @@ -349,7 +346,7 @@ - + diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs index 4c56dcc1..bfba64d0 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs @@ -99,7 +99,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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -142,7 +142,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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -218,7 +218,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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -258,7 +258,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new BiCgStab(); @@ -289,7 +289,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new BiCgStab(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs index d42cfb59..78ff9472 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs @@ -99,7 +99,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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -220,7 +220,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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -260,7 +260,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new GpBiCg(); @@ -291,7 +291,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new GpBiCg(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs index aebdb20b..8da92d6a 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs @@ -99,7 +99,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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -220,7 +220,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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -260,7 +260,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new MlkBiCgStab(); @@ -291,7 +291,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new MlkBiCgStab(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs index 76e99531..1c3caf3d 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs @@ -99,7 +99,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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -220,7 +220,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 ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -260,7 +260,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new TFQMR(); @@ -291,7 +291,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new TFQMR(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs index 93453a57..0a5a041f 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs @@ -74,7 +74,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers new FailureStopCriterium(), new DivergenceStopCriterium(), new IterationCountStopCriterium(), - new ResidualStopCriterium() + new ResidualStopCriterium(1e-12) }; var iterator = new Iterator(criteria); diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs index 5888bad8..0a00e631 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs @@ -54,7 +54,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void CreateWithNegativeMaximumThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new ResidualStopCriterium(-0.1)); + Assert.Throws(() => new ResidualStopCriterium(-0.1)); } /// @@ -63,7 +63,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new ResidualStopCriterium(-1)); + Assert.Throws(() => new ResidualStopCriterium(-1)); } /// @@ -72,47 +72,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void Create() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.AreEqual(1e-8, criterium.Maximum, "Incorrect maximum"); Assert.AreEqual(50, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count"); } - /// - /// Can reset maximum. - /// - [Test] - public void ResetMaximum() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - criterium.ResetMaximumResidualToDefault(); - Assert.AreEqual(ResidualStopCriterium.DefaultMaximumResidual, criterium.Maximum, "Incorrect maximum"); - } - - /// - /// Can reset minimum iterations below maximum. - /// - [Test] - public void ResetMinimumIterationsBelowMaximum() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - criterium.ResetMinimumIterationsBelowMaximumToDefault(); - Assert.AreEqual(ResidualStopCriterium.DefaultMinimumIterationsBelowMaximum, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count"); - } - /// /// Determine status with illegal iteration number throws ArgumentOutOfRangeException. /// [Test] public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.Throws(() => criterium.DetermineStatus( -1, @@ -127,8 +99,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void DetermineStatusWithNonMatchingSolutionVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -143,8 +114,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void DetermineStatusWithNonMatchingSourceVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -159,8 +129,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void DetermineStatusWithNonMatchingResidualVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -175,8 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void DetermineStatusWithSourceNaN() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3, 10); var solution = new DenseVector(new[] {new Complex(1.0, 1), new Complex(1.0, 1), new Complex(2.0, 1)}); var source = new DenseVector(new[] {new Complex(1.0, 1), new Complex(1.0, 1), new Complex(double.NaN, 1)}); @@ -192,8 +160,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void DetermineStatusWithResidualNaN() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3, 10); var solution = new DenseVector(new[] {new Complex(1.0, 1), new Complex(1.0, 1), new Complex(2.0, 1)}); var source = new DenseVector(new[] {new Complex(1.0, 1), new Complex(1.0, 1), new Complex(2.0, 1)}); @@ -213,8 +180,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void DetermineStatusWithConvergenceAtFirstIteration() { - var criterium = new ResidualStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-12); var solution = new DenseVector(new[] {Complex.One, Complex.One, Complex.One}); var source = new DenseVector(new[] {Complex.One, Complex.One, Complex.One}); @@ -230,8 +196,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void DetermineStatus() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3, 10); // the solution vector isn't actually being used so ... var solution = new DenseVector(new[] {new Complex(double.NaN, double.NaN), new Complex(double.NaN, double.NaN), new Complex(double.NaN, double.NaN)}); @@ -255,8 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void ResetCalculationState() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3, 10); var solution = new DenseVector(new[] {new Complex(0.001, 1), new Complex(0.001, 1), new Complex(0.002, 1)}); var source = new DenseVector(new[] {new Complex(0.001, 1), new Complex(0.001, 1), new Complex(0.002, 1)}); @@ -275,13 +239,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit [Test] public void Clone() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3, 10); var clone = criterium.Clone(); - Assert.IsInstanceOf(typeof (ResidualStopCriterium), clone, "Wrong criterium type"); + Assert.IsInstanceOf(typeof(ResidualStopCriterium), clone, "Wrong criterium type"); - var clonedCriterium = clone as ResidualStopCriterium; + var clonedCriterium = clone as ResidualStopCriterium; Assert.IsNotNull(clonedCriterium); // ReSharper disable PossibleNullReferenceException diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs index 02b5af58..462ed07a 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs @@ -95,7 +95,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -216,7 +216,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new BiCgStab(); @@ -298,7 +298,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new BiCgStab(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs index 60dc5ed8..e8fc3b8c 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs @@ -95,7 +95,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -216,7 +216,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); 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 0f862bbb..459858a5 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs @@ -95,7 +95,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -216,7 +216,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new MlkBiCgStab(); @@ -298,7 +298,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new MlkBiCgStab(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs index 1d61041c..c136d409 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs @@ -95,7 +95,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -216,7 +216,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new TFQMR(); @@ -298,7 +298,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new TFQMR(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs index cd3e33c7..084cb085 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs @@ -70,7 +70,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers new FailureStopCriterium(), new DivergenceStopCriterium(), new IterationCountStopCriterium(), - new ResidualStopCriterium() + new ResidualStopCriterium(1e-6) }; var iterator = new Iterator(criteria); diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs index bd1600f5..5317452f 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs @@ -50,7 +50,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void CreateWithNegativeMaximumThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new ResidualStopCriterium(-0.1f)); + Assert.Throws(() => new ResidualStopCriterium(-0.1f)); } /// @@ -59,7 +59,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new ResidualStopCriterium(-1)); + Assert.Throws(() => new ResidualStopCriterium(-1)); } /// @@ -68,47 +68,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void Create() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.AreEqual(1e-6f, criterium.Maximum, "Incorrect maximum"); Assert.AreEqual(50, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count"); } - /// - /// Can reset maximum. - /// - [Test] - public void ResetMaximum() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - criterium.ResetMaximumResidualToDefault(); - Assert.AreEqual(ResidualStopCriterium.DefaultMaximumResidual, criterium.Maximum, "Incorrect maximum"); - } - - /// - /// Can reset minimum iterations below maximum. - /// - [Test] - public void ResetMinimumIterationsBelowMaximum() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - criterium.ResetMinimumIterationsBelowMaximumToDefault(); - Assert.AreEqual(ResidualStopCriterium.DefaultMinimumIterationsBelowMaximum, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count"); - } - /// /// Determine status with illegal iteration number throws ArgumentOutOfRangeException. /// [Test] public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.Throws(() => criterium.DetermineStatus( -1, @@ -123,8 +95,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void DetermineStatusWithNonMatchingSolutionVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -139,8 +110,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void DetermineStatusWithNonMatchingSourceVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -155,8 +125,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void DetermineStatusWithNonMatchingResidualVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -171,8 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void DetermineStatusWithSourceNaN() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); var solution = new DenseVector(new[] {new Complex32(1.0f, 1), new Complex32(1.0f, 1), new Complex32(2.0f, 1)}); var source = new DenseVector(new[] {new Complex32(1.0f, 1), new Complex32(1.0f, 1), new Complex32(float.NaN, 1)}); @@ -188,8 +156,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void DetermineStatusWithResidualNaN() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); var solution = new DenseVector(new[] {new Complex32(1.0f, 1), new Complex32(1.0f, 1), new Complex32(2.0f, 1)}); var source = new DenseVector(new[] {new Complex32(1.0f, 1), new Complex32(1.0f, 1), new Complex32(2.0f, 1)}); @@ -209,8 +176,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void DetermineStatusWithConvergenceAtFirstIteration() { - var criterium = new ResidualStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6); var solution = new DenseVector(new[] {Complex32.One, Complex32.One, Complex32.One}); var source = new DenseVector(new[] {Complex32.One, Complex32.One, Complex32.One}); @@ -226,8 +192,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void DetermineStatus() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); // the solution vector isn't actually being used so ... var solution = new DenseVector(new[] {new Complex32(float.NaN, float.NaN), new Complex32(float.NaN, float.NaN), new Complex32(float.NaN, float.NaN)}); @@ -251,8 +216,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void ResetCalculationState() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); var solution = new DenseVector(new[] {new Complex32(0.001f, 1), new Complex32(0.001f, 1), new Complex32(0.002f, 1)}); var source = new DenseVector(new[] {new Complex32(0.001f, 1), new Complex32(0.001f, 1), new Complex32(0.002f, 1)}); @@ -271,20 +235,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr [Test] public void Clone() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); var clone = criterium.Clone(); - Assert.IsInstanceOf(typeof (ResidualStopCriterium), clone, "Wrong criterium type"); + Assert.IsInstanceOf(typeof(ResidualStopCriterium), clone, "Wrong criterium type"); - var clonedCriterium = clone as ResidualStopCriterium; + var clonedCriterium = clone as ResidualStopCriterium; Assert.IsNotNull(clonedCriterium); - // ReSharper disable PossibleNullReferenceException Assert.AreEqual(criterium.Maximum, clonedCriterium.Maximum, "Clone failed"); Assert.AreEqual(criterium.MinimumIterationsBelowMaximum, clonedCriterium.MinimumIterationsBelowMaximum, "Clone failed"); - - // ReSharper restore PossibleNullReferenceException } } } diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs index 4148ffda..e5138ce5 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs @@ -93,7 +93,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -137,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -214,7 +214,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -254,7 +254,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new BiCgStab(); @@ -284,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new BiCgStab(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs index 4a09ac00..86a8ff1a 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs @@ -93,7 +93,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -137,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -214,7 +214,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -254,7 +254,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new GpBiCg(); @@ -284,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new GpBiCg(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs index b6873103..c9568bea 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs @@ -93,7 +93,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -137,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -214,7 +214,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -254,7 +254,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new MlkBiCgStab(); @@ -284,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new MlkBiCgStab(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs index ef3b247a..330c6ae2 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs @@ -93,7 +93,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -137,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -214,7 +214,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -254,7 +254,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new TFQMR(); @@ -284,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(1000), - new ResidualStopCriterium(1e-10)); + new ResidualStopCriterium(1e-10)); var solver = new TFQMR(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs index 68b4679f..51903ca0 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs @@ -68,7 +68,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers new FailureStopCriterium(), new DivergenceStopCriterium(), new IterationCountStopCriterium(), - new ResidualStopCriterium() + new ResidualStopCriterium(1e-12) }; var iterator = new Iterator(criteria); diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs index 3fe3e527..53f0451d 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs @@ -48,7 +48,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void CreateWithNegativeMaximumThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new ResidualStopCriterium(-0.1)); + Assert.Throws(() => new ResidualStopCriterium(-0.1)); } /// @@ -57,7 +57,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new ResidualStopCriterium(-1)); + Assert.Throws(() => new ResidualStopCriterium(-1)); } /// @@ -66,47 +66,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void Create() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.AreEqual(1e-8, criterium.Maximum, "Incorrect maximum"); Assert.AreEqual(50, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count"); } - /// - /// Can reset maximum. - /// - [Test] - public void ResetMaximum() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - criterium.ResetMaximumResidualToDefault(); - Assert.AreEqual(ResidualStopCriterium.DefaultMaximumResidual, criterium.Maximum, "Incorrect maximum"); - } - - /// - /// Can reset minimum iterations below maximum. - /// - [Test] - public void ResetMinimumIterationsBelowMaximum() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - criterium.ResetMinimumIterationsBelowMaximumToDefault(); - Assert.AreEqual(ResidualStopCriterium.DefaultMinimumIterationsBelowMaximum, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count"); - } - /// /// Determine status with illegal iteration number throws ArgumentOutOfRangeException. /// [Test] public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.Throws(() => criterium.DetermineStatus( -1, @@ -121,8 +93,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void DetermineStatusWithNonMatchingSolutionVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -137,8 +108,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void DetermineStatusWithNonMatchingSourceVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -153,8 +123,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void DetermineStatusWithNonMatchingResidualVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-8, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -169,9 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void DetermineStatusWithSourceNaN() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); - + var criterium = new ResidualStopCriterium(1e-3, 10); var solution = new DenseVector(new[] {1.0, 1.0, 2.0}); var source = new DenseVector(new[] {1.0, 1.0, double.NaN}); var residual = new DenseVector(new[] {1000.0, 1000.0, 2001.0}); @@ -186,9 +153,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void DetermineStatusWithResidualNaN() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); - + var criterium = new ResidualStopCriterium(1e-3, 10); var solution = new DenseVector(new[] {1.0, 1.0, 2.0}); var source = new DenseVector(new[] {1.0, 1.0, 2.0}); var residual = new DenseVector(new[] {1000.0, double.NaN, 2001.0}); @@ -203,9 +168,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void DetermineStatusWithConvergenceAtFirstIteration() { - var criterium = new ResidualStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); - + var criterium = new ResidualStopCriterium(1e-12); var solution = new DenseVector(new[] {1.0, 1.0, 1.0}); var source = new DenseVector(new[] {1.0, 1.0, 1.0}); var residual = new DenseVector(new[] {0.0, 0.0, 0.0}); @@ -220,8 +183,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void DetermineStatus() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3, 10); // the solution vector isn't actually being used so ... var solution = new DenseVector(new[] {double.NaN, double.NaN, double.NaN}); @@ -245,8 +207,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void ResetCalculationState() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3, 10); var solution = new DenseVector(new[] {0.001, 0.001, 0.002}); var source = new DenseVector(new[] {0.001, 0.001, 0.002}); @@ -265,13 +226,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite [Test] public void Clone() { - var criterium = new ResidualStopCriterium(1e-3, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3, 10); var clone = criterium.Clone(); - Assert.IsInstanceOf(typeof (ResidualStopCriterium), clone, "Wrong criterium type"); + Assert.IsInstanceOf(typeof(ResidualStopCriterium), clone, "Wrong criterium type"); - var clonedCriterium = clone as ResidualStopCriterium; + var clonedCriterium = clone as ResidualStopCriterium; Assert.IsNotNull(clonedCriterium); // ReSharper disable PossibleNullReferenceException diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs index 10e62832..c482ce75 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs @@ -93,7 +93,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -137,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -214,7 +214,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new BiCgStab(); var resultx = matrixA.SolveIterative(vectorb, solver, monitor); @@ -296,7 +296,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new BiCgStab(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs index b1f44dcf..9108d8d4 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs @@ -93,7 +93,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -137,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -214,7 +214,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new GpBiCg(); var resultx = matrixA.SolveIterative(vectorb, solver, monitor); @@ -296,7 +296,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new GpBiCg(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs index 7d2952e1..52e60c4c 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -219,7 +219,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -274,7 +274,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new MlkBiCgStab(); var resultx = matrixA.SolveIterative(vectorb, solver, monitor); @@ -316,7 +316,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new MlkBiCgStab(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs index 2606c7b2..3d0134d8 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs @@ -93,7 +93,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -137,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -214,7 +214,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative // Create an iteration monitor which will keep track of iterative convergence var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium(ConvergenceBoundary), + new ResidualStopCriterium(ConvergenceBoundary), new DivergenceStopCriterium(), new FailureStopCriterium()); @@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new TFQMR(); var resultx = matrixA.SolveIterative(vectorb, solver, monitor); @@ -296,7 +296,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative var monitor = new Iterator( new IterationCountStopCriterium(MaximumIterations), - new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))); + new ResidualStopCriterium(Math.Pow(1.0 / 10.0, iteration))); var solver = new TFQMR(); var matrixX = matrixA.SolveIterative(matrixB, solver, monitor); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs index ea176e98..fe4e0fb3 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs @@ -68,7 +68,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers new FailureStopCriterium(), new DivergenceStopCriterium(), new IterationCountStopCriterium(), - new ResidualStopCriterium() + new ResidualStopCriterium(1e-6) }; var iterator = new Iterator(criteria); diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs index e64ec33e..d9e3c22c 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs @@ -48,7 +48,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void CreateWithNegativeMaximumThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new ResidualStopCriterium(-0.1f)); + Assert.Throws(() => new ResidualStopCriterium(-0.1f)); } /// @@ -57,7 +57,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException() { - Assert.Throws(() => new ResidualStopCriterium(-1)); + Assert.Throws(() => new ResidualStopCriterium(-1)); } /// @@ -66,47 +66,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void Create() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.AreEqual(1e-6f, criterium.Maximum, "Incorrect maximum"); Assert.AreEqual(50, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count"); } - /// - /// Can reset maximum. - /// - [Test] - public void ResetMaximum() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - criterium.ResetMaximumResidualToDefault(); - Assert.AreEqual(ResidualStopCriterium.DefaultMaximumResidual, criterium.Maximum, "Incorrect maximum"); - } - - /// - /// Can reset minimum iterations below maximum. - /// - [Test] - public void ResetMinimumIterationsBelowMaximum() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - criterium.ResetMinimumIterationsBelowMaximumToDefault(); - Assert.AreEqual(ResidualStopCriterium.DefaultMinimumIterationsBelowMaximum, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count"); - } - /// /// Determine status with illegal iteration number throws ArgumentOutOfRangeException. /// [Test] public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.Throws(() => criterium.DetermineStatus( -1, @@ -121,8 +93,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void DetermineStatusWithNonMatchingSolutionVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -137,8 +108,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void DetermineStatusWithNonMatchingSourceVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -153,8 +123,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void DetermineStatusWithNonMatchingResidualVectorThrowsArgumentException() { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6f, 50); Assert.Throws(() => criterium.DetermineStatus( 1, @@ -169,8 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void DetermineStatusWithSourceNaN() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); var solution = new DenseVector(new[] {1.0f, 1.0f, 2.0f}); var source = new DenseVector(new[] {1.0f, 1.0f, float.NaN}); @@ -186,8 +154,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void DetermineStatusWithResidualNaN() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); var solution = new DenseVector(new[] {1.0f, 1.0f, 2.0f}); var source = new DenseVector(new[] {1.0f, 1.0f, 2.0f}); @@ -203,8 +170,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void DetermineStatusWithConvergenceAtFirstIteration() { - var criterium = new ResidualStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-6); var solution = new DenseVector(new[] {1.0f, 1.0f, 1.0f}); var source = new DenseVector(new[] {1.0f, 1.0f, 1.0f}); @@ -220,8 +186,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void DetermineStatus() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); // the solution vector isn't actually being used so ... var solution = new DenseVector(new[] {float.NaN, float.NaN, float.NaN}); @@ -245,8 +210,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void ResetCalculationState() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); var solution = new DenseVector(new[] {0.001f, 0.001f, 0.002f}); var source = new DenseVector(new[] {0.001f, 0.001f, 0.002f}); @@ -265,13 +229,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite [Test] public void Clone() { - var criterium = new ResidualStopCriterium(1e-3f, 10); - Assert.IsNotNull(criterium, "There should be a criterium"); + var criterium = new ResidualStopCriterium(1e-3f, 10); var clone = criterium.Clone(); - Assert.IsInstanceOf(typeof (ResidualStopCriterium), clone, "Wrong criterium type"); + Assert.IsInstanceOf(typeof(ResidualStopCriterium), clone, "Wrong criterium type"); - var clonedCriterium = clone as ResidualStopCriterium; + var clonedCriterium = clone as ResidualStopCriterium; Assert.IsNotNull(clonedCriterium); // ReSharper disable PossibleNullReferenceException