Browse Source

LA: Iterative solvers: make residual stop criterium generic/shared

pull/163/merge
Christoph Ruegg 13 years ago
parent
commit
db8a7a030c
  1. 2
      src/Examples/LinearAlgebra/IterativeSolvers/BiCgStabSolver.cs
  2. 2
      src/Examples/LinearAlgebra/IterativeSolvers/CompositeSolverExample.cs
  3. 2
      src/Examples/LinearAlgebra/IterativeSolvers/GpBiCgSolver.cs
  4. 2
      src/Examples/LinearAlgebra/IterativeSolvers/MlkBiCgStabSolver.cs
  5. 2
      src/Examples/LinearAlgebra/IterativeSolvers/TFQMRSolver.cs
  6. 8
      src/Numerics/LinearAlgebra/Builder.cs
  7. 294
      src/Numerics/LinearAlgebra/Complex/Solvers/ResidualStopCriterium.cs
  8. 289
      src/Numerics/LinearAlgebra/Complex32/Solvers/ResidualStopCriterium.cs
  9. 287
      src/Numerics/LinearAlgebra/Single/Solvers/ResidualStopCriterium.cs
  10. 54
      src/Numerics/LinearAlgebra/Solvers/ResidualStopCriterium.cs
  11. 5
      src/Numerics/Numerics.csproj
  12. 10
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs
  13. 10
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs
  14. 10
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs
  15. 10
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs
  16. 2
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs
  17. 67
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs
  18. 10
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs
  19. 8
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs
  20. 10
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs
  21. 10
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs
  22. 2
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs
  23. 70
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs
  24. 10
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs
  25. 10
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs
  26. 10
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs
  27. 10
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs
  28. 2
      src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs
  29. 70
      src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs
  30. 10
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs
  31. 10
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs
  32. 10
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs
  33. 10
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs
  34. 2
      src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs
  35. 67
      src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs

2
src/Examples/LinearAlgebra/IterativeSolvers/BiCgStabSolver.cs

@ -101,7 +101,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var iterationCountStopCriterium = new IterationCountStopCriterium<double>(1000);
// Stop calculation if residuals are below 1E-10 --> the calculation is considered converged
var residualStopCriterium = new ResidualStopCriterium(1e-10);
var residualStopCriterium = new ResidualStopCriterium<double>(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator<double>(iterationCountStopCriterium, residualStopCriterium);

2
src/Examples/LinearAlgebra/IterativeSolvers/CompositeSolverExample.cs

@ -100,7 +100,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var iterationCountStopCriterium = new IterationCountStopCriterium<double>(1000);
// Stop calculation if residuals are below 1E-10 --> the calculation is considered converged
var residualStopCriterium = new ResidualStopCriterium(1e-10);
var residualStopCriterium = new ResidualStopCriterium<double>(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator<double>(iterationCountStopCriterium, residualStopCriterium);

2
src/Examples/LinearAlgebra/IterativeSolvers/GpBiCgSolver.cs

@ -99,7 +99,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var iterationCountStopCriterium = new IterationCountStopCriterium<double>(1000);
// Stop calculation if residuals are below 1E-10 --> the calculation is considered converged
var residualStopCriterium = new ResidualStopCriterium(1e-10);
var residualStopCriterium = new ResidualStopCriterium<double>(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator<double>(iterationCountStopCriterium, residualStopCriterium);

2
src/Examples/LinearAlgebra/IterativeSolvers/MlkBiCgStabSolver.cs

@ -100,7 +100,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var iterationCountStopCriterium = new IterationCountStopCriterium<double>(1000);
// Stop calculation if residuals are below 1E-10 --> the calculation is considered converged
var residualStopCriterium = new ResidualStopCriterium(1e-10);
var residualStopCriterium = new ResidualStopCriterium<double>(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator<double>(iterationCountStopCriterium, residualStopCriterium);

2
src/Examples/LinearAlgebra/IterativeSolvers/TFQMRSolver.cs

@ -100,7 +100,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var iterationCountStopCriterium = new IterationCountStopCriterium<double>(1000);
// Stop calculation if residuals are below 1E-10 --> the calculation is considered converged
var residualStopCriterium = new ResidualStopCriterium(1e-10);
var residualStopCriterium = new ResidualStopCriterium<double>(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator<double>(iterationCountStopCriterium, residualStopCriterium);

8
src/Numerics/LinearAlgebra/Builder.cs

@ -80,7 +80,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new IterationCountStopCriterium<double>(maxIterations),
new ResidualStopCriterium()
new ResidualStopCriterium<double>(1e-12)
};
}
}
@ -157,7 +157,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new IterationCountStopCriterium<float>(maxIterations),
new ResidualStopCriterium()
new ResidualStopCriterium<float>(1e-6)
};
}
}
@ -240,7 +240,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new IterationCountStopCriterium<Complex>(maxIterations),
new ResidualStopCriterium()
new ResidualStopCriterium<Complex>(1e-12)
};
}
}
@ -317,7 +317,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new IterationCountStopCriterium<Numerics.Complex32>(maxIterations),
new ResidualStopCriterium()
new ResidualStopCriterium<Numerics.Complex32>(1e-6)
};
}
}

294
src/Numerics/LinearAlgebra/Complex/Solvers/ResidualStopCriterium.cs

@ -1,294 +0,0 @@
// <copyright file="ResidualStopCriterium.cs" company="Math.NET">
// 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.
// </copyright>
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
/// <summary>
/// Defines an <see cref="IIterationStopCriterium{T}"/> that monitors residuals as stop criterium.
/// </summary>
public sealed class ResidualStopCriterium : IIterationStopCriterium<Complex>
{
/// <summary>
/// The default value for the maximum value of the residual.
/// </summary>
public const double DefaultMaximumResidual = 1e-12;
/// <summary>
/// The default value for the minimum number of iterations.
/// </summary>
public const int DefaultMinimumIterationsBelowMaximum = 0;
/// <summary>
/// Defines the default last iteration number. Set to -1 because iterations normally start at 0.
/// </summary>
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum value for the residual below which the calculation is considered converged.
/// </summary>
double _maximum;
/// <summary>
/// The minimum number of iterations for which the residual has to be below the maximum before
/// the calculation is considered converged.
/// </summary>
int _minimumIterationsBelowMaximum;
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The number of iterations since the residuals got below the maximum.
/// </summary>
int _iterationCount;
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
int _lastIteration = DefaultLastIterationNumber;
/// <summary>
/// Initializes a new instance of the <see cref="ResidualStopCriterium"/> class with the specified
/// maximum residual and minimum number of iterations.
/// </summary>
/// <param name="maximum">
/// The maximum value for the residual below which the calculation is considered converged.
/// </param>
/// <param name="minimumIterationsBelowMaximum">
/// The minimum number of iterations for which the residual has to be below the maximum before
/// the calculation is considered converged.
/// </param>
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;
}
/// <summary>
/// Gets or sets the maximum value for the residual below which the calculation is considered
/// converged.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>Maximum</c> is set to a negative value.</exception>
public double Maximum
{
[DebuggerStepThrough]
get
{
return _maximum;
}
[DebuggerStepThrough]
set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException("value");
}
_maximum = value;
}
}
/// <summary>
/// Returns the maximum residual to the default.
/// </summary>
public void ResetMaximumResidualToDefault()
{
_maximum = DefaultMaximumResidual;
}
/// <summary>
/// Gets or sets the minimum number of iterations for which the residual has to be
/// below the maximum before the calculation is considered converged.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>BelowMaximumFor</c> is set to a value less than 1.</exception>
public int MinimumIterationsBelowMaximum
{
[DebuggerStepThrough]
get
{
return _minimumIterationsBelowMaximum;
}
[DebuggerStepThrough]
set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException("value");
}
_minimumIterationsBelowMaximum = value;
}
}
/// <summary>
/// Returns the minimum number of iterations to the default.
/// </summary>
public void ResetMinimumIterationsBelowMaximumToDefault()
{
_minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum;
}
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
/// by the current <see cref="IIterationStopCriterium{T}"/>. Result is set into <c>Status</c> field.
/// </summary>
/// <param name="iterationNumber">The number of iterations that have passed so far.</param>
/// <param name="solutionVector">The vector containing the current solution values.</param>
/// <param name="sourceVector">The right hand side vector.</param>
/// <param name="residualVector">The vector containing the current residual vectors.</param>
/// <remarks>
/// 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.
/// </remarks>
public IterationStatus DetermineStatus(int iterationNumber, Vector<Complex> solutionVector, Vector<Complex> sourceVector, Vector<Complex> 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;
}
/// <summary>
/// Gets the current calculation status.
/// </summary>
public IterationStatus Status
{
[DebuggerStepThrough]
get
{
return _status;
}
}
/// <summary>
/// Resets the <see cref="IIterationStopCriterium{T}"/> to the pre-calculation state.
/// </summary>
public void Reset()
{
_status = IterationStatus.Continue;
_iterationCount = 0;
_lastIteration = DefaultLastIterationNumber;
}
/// <summary>
/// Clones the current <see cref="ResidualStopCriterium"/> and its settings.
/// </summary>
/// <returns>A new instance of the <see cref="ResidualStopCriterium"/> class.</returns>
public IIterationStopCriterium<Complex> Clone()
{
return new ResidualStopCriterium(_maximum, _minimumIterationsBelowMaximum);
}
}
}

289
src/Numerics/LinearAlgebra/Complex32/Solvers/ResidualStopCriterium.cs

@ -1,289 +0,0 @@
// <copyright file="ResidualStopCriterium.cs" company="Math.NET">
// 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.
// </copyright>
using System;
using System.Diagnostics;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
{
using Numerics;
/// <summary>
/// Defines an <see cref="IIterationStopCriterium{T}"/> that monitors residuals as stop criterium.
/// </summary>
public sealed class ResidualStopCriterium : IIterationStopCriterium<Complex32>
{
/// <summary>
/// The default value for the maximum value of the residual.
/// </summary>
public const float DefaultMaximumResidual = 1e-6f;
/// <summary>
/// The default value for the minimum number of iterations.
/// </summary>
public const int DefaultMinimumIterationsBelowMaximum = 0;
/// <summary>
/// Defines the default last iteration number. Set to -1 because iterations normally start at 0.
/// </summary>
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum value for the residual below which the calculation is considered converged.
/// </summary>
float _maximum;
/// <summary>
/// The minimum number of iterations for which the residual has to be below the maximum before
/// the calculation is considered converged.
/// </summary>
int _minimumIterationsBelowMaximum;
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The number of iterations since the residuals got below the maximum.
/// </summary>
int _iterationCount;
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
int _lastIteration = DefaultLastIterationNumber;
/// <summary>
/// Initializes a new instance of the <see cref="ResidualStopCriterium"/> class with the specified
/// maximum residual and minimum number of iterations.
/// </summary>
/// <param name="maximum">
/// The maximum value for the residual below which the calculation is considered converged.
/// </param>
/// <param name="minimumIterationsBelowMaximum">
/// The minimum number of iterations for which the residual has to be below the maximum before
/// the calculation is considered converged.
/// </param>
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;
}
/// <summary>
/// Gets or sets the maximum value for the residual below which the calculation is considered
/// converged.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>Maximum</c> is set to a negative value.</exception>
public float Maximum
{
[DebuggerStepThrough]
get
{
return _maximum;
}
[DebuggerStepThrough]
set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException("value");
}
_maximum = value;
}
}
/// <summary>
/// Returns the maximum residual to the default.
/// </summary>
public void ResetMaximumResidualToDefault()
{
_maximum = DefaultMaximumResidual;
}
/// <summary>
/// Gets or sets the minimum number of iterations for which the residual has to be
/// below the maximum before the calculation is considered converged.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>BelowMaximumFor</c> is set to a value less than 1.</exception>
public int MinimumIterationsBelowMaximum
{
[DebuggerStepThrough]
get
{
return _minimumIterationsBelowMaximum;
}
[DebuggerStepThrough]
set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException("value");
}
_minimumIterationsBelowMaximum = value;
}
}
/// <summary>
/// Returns the minimum number of iterations to the default.
/// </summary>
public void ResetMinimumIterationsBelowMaximumToDefault()
{
_minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum;
}
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
/// by the current <see cref="IIterationStopCriterium{T}"/>. Result is set into <c>Status</c> field.
/// </summary>
/// <param name="iterationNumber">The number of iterations that have passed so far.</param>
/// <param name="solutionVector">The vector containing the current solution values.</param>
/// <param name="sourceVector">The right hand side vector.</param>
/// <param name="residualVector">The vector containing the current residual vectors.</param>
/// <remarks>
/// 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.
/// </remarks>
public IterationStatus DetermineStatus(int iterationNumber, Vector<Complex32> solutionVector, Vector<Complex32> sourceVector, Vector<Complex32> 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;
}
/// <summary>
/// Gets the current calculation status.
/// </summary>
public IterationStatus Status
{
[DebuggerStepThrough]
get
{
return _status;
}
}
/// <summary>
/// Resets the <see cref="IIterationStopCriterium{T}"/> to the pre-calculation state.
/// </summary>
public void Reset()
{
_status = IterationStatus.Continue;
_iterationCount = 0;
_lastIteration = DefaultLastIterationNumber;
}
/// <summary>
/// Clones the current <see cref="ResidualStopCriterium"/> and its settings.
/// </summary>
/// <returns>A new instance of the <see cref="ResidualStopCriterium"/> class.</returns>
public IIterationStopCriterium<Complex32> Clone()
{
return new ResidualStopCriterium(_maximum, _minimumIterationsBelowMaximum);
}
}
}

287
src/Numerics/LinearAlgebra/Single/Solvers/ResidualStopCriterium.cs

@ -1,287 +0,0 @@
// <copyright file="ResidualStopCriterium.cs" company="Math.NET">
// 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.
// </copyright>
using System;
using System.Diagnostics;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
{
/// <summary>
/// Defines an <see cref="IIterationStopCriterium{T}"/> that monitors residuals as stop criterium.
/// </summary>
public sealed class ResidualStopCriterium : IIterationStopCriterium<float>
{
/// <summary>
/// The default value for the maximum value of the residual.
/// </summary>
public const float DefaultMaximumResidual = 1e-6f;
/// <summary>
/// The default value for the minimum number of iterations.
/// </summary>
public const int DefaultMinimumIterationsBelowMaximum = 0;
/// <summary>
/// Defines the default last iteration number. Set to -1 because iterations normally start at 0.
/// </summary>
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum value for the residual below which the calculation is considered converged.
/// </summary>
float _maximum;
/// <summary>
/// The minimum number of iterations for which the residual has to be below the maximum before
/// the calculation is considered converged.
/// </summary>
int _minimumIterationsBelowMaximum;
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The number of iterations since the residuals got below the maximum.
/// </summary>
int _iterationCount;
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
int _lastIteration = DefaultLastIterationNumber;
/// <summary>
/// Initializes a new instance of the <see cref="ResidualStopCriterium"/> class with the specified
/// maximum residual and minimum number of iterations.
/// </summary>
/// <param name="maximum">
/// The maximum value for the residual below which the calculation is considered converged.
/// </param>
/// <param name="minimumIterationsBelowMaximum">
/// The minimum number of iterations for which the residual has to be below the maximum before
/// the calculation is considered converged.
/// </param>
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;
}
/// <summary>
/// Gets or sets the maximum value for the residual below which the calculation is considered
/// converged.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>Maximum</c> is set to a negative value.</exception>
public float Maximum
{
[DebuggerStepThrough]
get
{
return _maximum;
}
[DebuggerStepThrough]
set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException("value");
}
_maximum = value;
}
}
/// <summary>
/// Returns the maximum residual to the default.
/// </summary>
public void ResetMaximumResidualToDefault()
{
_maximum = DefaultMaximumResidual;
}
/// <summary>
/// Gets or sets the minimum number of iterations for which the residual has to be
/// below the maximum before the calculation is considered converged.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>BelowMaximumFor</c> is set to a value less than 1.</exception>
public int MinimumIterationsBelowMaximum
{
[DebuggerStepThrough]
get
{
return _minimumIterationsBelowMaximum;
}
[DebuggerStepThrough]
set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException("value");
}
_minimumIterationsBelowMaximum = value;
}
}
/// <summary>
/// Returns the minimum number of iterations to the default.
/// </summary>
public void ResetMinimumIterationsBelowMaximumToDefault()
{
_minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum;
}
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
/// by the current <see cref="IIterationStopCriterium{T}"/>. Result is set into <c>Status</c> field.
/// </summary>
/// <param name="iterationNumber">The number of iterations that have passed so far.</param>
/// <param name="solutionVector">The vector containing the current solution values.</param>
/// <param name="sourceVector">The right hand side vector.</param>
/// <param name="residualVector">The vector containing the current residual vectors.</param>
/// <remarks>
/// 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.
/// </remarks>
public IterationStatus DetermineStatus(int iterationNumber, Vector<float> solutionVector, Vector<float> sourceVector, Vector<float> 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;
}
/// <summary>
/// Gets the current calculation status.
/// </summary>
public IterationStatus Status
{
[DebuggerStepThrough]
get
{
return _status;
}
}
/// <summary>
/// Resets the <see cref="IIterationStopCriterium{T}"/> to the pre-calculation state.
/// </summary>
public void Reset()
{
_status = IterationStatus.Continue;
_iterationCount = 0;
_lastIteration = DefaultLastIterationNumber;
}
/// <summary>
/// Clones the current <see cref="ResidualStopCriterium"/> and its settings.
/// </summary>
/// <returns>A new instance of the <see cref="ResidualStopCriterium"/> class.</returns>
public IIterationStopCriterium<float> Clone()
{
return new ResidualStopCriterium(_maximum, _minimumIterationsBelowMaximum);
}
}
}

54
src/Numerics/LinearAlgebra/Double/Solvers/ResidualStopCriterium.cs → 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
{
/// <summary>
/// Defines an <see cref="IIterationStopCriterium{T}"/> that monitors residuals as stop criterium.
/// </summary>
public sealed class ResidualStopCriterium : IIterationStopCriterium<double>
public sealed class ResidualStopCriterium<T> : IIterationStopCriterium<T> where T : struct, IEquatable<T>, IFormattable
{
/// <summary>
/// The default value for the maximum value of the residual.
/// </summary>
public const double DefaultMaximumResidual = 1e-12;
/// <summary>
/// The default value for the minimum number of iterations.
/// </summary>
public const int DefaultMinimumIterationsBelowMaximum = 0;
/// <summary>
/// Defines the default last iteration number. Set to -1 because iterations normally start at 0.
/// </summary>
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum value for the residual below which the calculation is considered converged.
/// </summary>
@ -79,10 +63,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
int _lastIteration = DefaultLastIterationNumber;
int _lastIteration = -1;
/// <summary>
/// Initializes a new instance of the <see cref="ResidualStopCriterium"/> class with the specified
/// Initializes a new instance of the <see cref="ResidualStopCriterium{T}"/> class with the specified
/// maximum residual and minimum number of iterations.
/// </summary>
/// <param name="maximum">
@ -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.
/// </param>
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
}
}
/// <summary>
/// Returns the maximum residual to the default.
/// </summary>
public void ResetMaximumResidualToDefault()
{
_maximum = DefaultMaximumResidual;
}
/// <summary>
/// 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
}
}
/// <summary>
/// Returns the minimum number of iterations to the default.
/// </summary>
public void ResetMinimumIterationsBelowMaximumToDefault()
{
_minimumIterationsBelowMaximum = DefaultMinimumIterationsBelowMaximum;
}
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
/// by the current <see cref="IIterationStopCriterium{T}"/>. Result is set into <c>Status</c> 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.
/// </remarks>
public IterationStatus DetermineStatus(int iterationNumber, Vector<double> solutionVector, Vector<double> sourceVector, Vector<double> residualVector)
public IterationStatus DetermineStatus(int iterationNumber, Vector<T> solutionVector, Vector<T> sourceVector, Vector<T> residualVector)
{
if (iterationNumber < 0)
{
@ -272,16 +240,16 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
{
_status = IterationStatus.Continue;
_iterationCount = 0;
_lastIteration = DefaultLastIterationNumber;
_lastIteration = -1;
}
/// <summary>
/// Clones the current <see cref="ResidualStopCriterium"/> and its settings.
/// Clones the current <see cref="ResidualStopCriterium{T}"/> and its settings.
/// </summary>
/// <returns>A new instance of the <see cref="ResidualStopCriterium"/> class.</returns>
public IIterationStopCriterium<double> Clone()
/// <returns>A new instance of the <see cref="ResidualStopCriterium{T}"/> class.</returns>
public IIterationStopCriterium<T> Clone()
{
return new ResidualStopCriterium(_maximum, _minimumIterationsBelowMaximum);
return new ResidualStopCriterium<T>(_maximum, _minimumIterationsBelowMaximum);
}
}
}

5
src/Numerics/Numerics.csproj

@ -257,7 +257,6 @@
<Compile Include="LinearAlgebra\Complex32\Solvers\ILU0Preconditioner.cs" />
<Compile Include="LinearAlgebra\Complex32\Solvers\DivergenceStopCriterium.cs" />
<Compile Include="LinearAlgebra\Complex32\Solvers\FailureStopCriterium.cs" />
<Compile Include="LinearAlgebra\Complex32\Solvers\ResidualStopCriterium.cs" />
<Compile Include="LinearAlgebra\Complex32\SparseVector.cs" />
<Compile Include="LinearAlgebra\Complex\Factorization\DenseGramSchmidt.cs" />
<Compile Include="LinearAlgebra\Complex\Factorization\DenseEvd.cs" />
@ -281,7 +280,6 @@
<Compile Include="LinearAlgebra\Complex\Solvers\ILU0Preconditioner.cs" />
<Compile Include="LinearAlgebra\Complex\Solvers\DivergenceStopCriterium.cs" />
<Compile Include="LinearAlgebra\Complex\Solvers\FailureStopCriterium.cs" />
<Compile Include="LinearAlgebra\Complex\Solvers\ResidualStopCriterium.cs" />
<Compile Include="LinearAlgebra\Complex\SparseVector.cs" />
<Compile Include="LinearAlgebra\Double\DenseVector.cs" />
<Compile Include="LinearAlgebra\Double\Factorization\DenseGramSchmidt.cs" />
@ -321,7 +319,6 @@
<Compile Include="LinearAlgebra\Single\Solvers\ILU0Preconditioner.cs" />
<Compile Include="LinearAlgebra\Single\Solvers\DivergenceStopCriterium.cs" />
<Compile Include="LinearAlgebra\Single\Solvers\FailureStopCriterium.cs" />
<Compile Include="LinearAlgebra\Single\Solvers\ResidualStopCriterium.cs" />
<Compile Include="LinearAlgebra\Single\SparseMatrix.cs" />
<Compile Include="LinearAlgebra\Single\SparseVector.cs" />
<Compile Include="LinearAlgebra\Factorization\Cholesky.cs" />
@ -349,7 +346,7 @@
<Compile Include="LinearAlgebra\Solvers\UnitPreconditioner.cs" />
<Compile Include="LinearAlgebra\Double\Solvers\DivergenceStopCriterium.cs" />
<Compile Include="LinearAlgebra\Double\Solvers\FailureStopCriterium.cs" />
<Compile Include="LinearAlgebra\Double\Solvers\ResidualStopCriterium.cs" />
<Compile Include="LinearAlgebra\Solvers\ResidualStopCriterium.cs" />
<Compile Include="LinearAlgebra\Double\SparseVector.cs" />
<Compile Include="LinearAlgebra\Matrix.Arithmetic.cs" />
<Compile Include="LinearAlgebra\Matrix.cs" />

10
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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(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<Complex>(new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(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<Complex>(new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -258,7 +258,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<Complex>(1e-10));
var solver = new BiCgStab();
@ -289,7 +289,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<Complex>(1e-10));
var solver = new BiCgStab();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -260,7 +260,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<Complex>(1e-10));
var solver = new GpBiCg();
@ -291,7 +291,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<Complex>(1e-10));
var solver = new GpBiCg();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -260,7 +260,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<Complex>(1e-10));
var solver = new MlkBiCgStab();
@ -291,7 +291,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<Complex>(1e-10));
var solver = new MlkBiCgStab();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(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<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -260,7 +260,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<Complex>(1e-10));
var solver = new TFQMR();
@ -291,7 +291,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<Complex>(1e-10));
var solver = new TFQMR();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

2
src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs

@ -74,7 +74,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium()
new ResidualStopCriterium<Complex>(1e-12)
};
var iterator = new Iterator<Complex>(criteria);

67
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<ArgumentOutOfRangeException>(() => new ResidualStopCriterium(-0.1));
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium<Complex>(-0.1));
}
/// <summary>
@ -63,7 +63,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium(-1));
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium<Complex>(-1));
}
/// <summary>
@ -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<Complex>(1e-8, 50);
Assert.AreEqual(1e-8, criterium.Maximum, "Incorrect maximum");
Assert.AreEqual(50, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count");
}
/// <summary>
/// Can reset maximum.
/// </summary>
[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");
}
/// <summary>
/// Can reset minimum iterations below maximum.
/// </summary>
[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");
}
/// <summary>
/// Determine status with illegal iteration number throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException()
{
var criterium = new ResidualStopCriterium(1e-8, 50);
Assert.IsNotNull(criterium, "There should be a criterium");
var criterium = new ResidualStopCriterium<Complex>(1e-8, 50);
Assert.Throws<ArgumentOutOfRangeException>(() => 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<Complex>(1e-8, 50);
Assert.Throws<ArgumentException>(() => 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<Complex>(1e-8, 50);
Assert.Throws<ArgumentException>(() => 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<Complex>(1e-8, 50);
Assert.Throws<ArgumentException>(() => 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<Complex>(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<Complex>(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<Complex>(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<Complex>(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<Complex>(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<Complex>(1e-3, 10);
var clone = criterium.Clone();
Assert.IsInstanceOf(typeof (ResidualStopCriterium), clone, "Wrong criterium type");
Assert.IsInstanceOf(typeof(ResidualStopCriterium<Complex>), clone, "Wrong criterium type");
var clonedCriterium = clone as ResidualStopCriterium;
var clonedCriterium = clone as ResidualStopCriterium<Complex>;
Assert.IsNotNull(clonedCriterium);
// ReSharper disable PossibleNullReferenceException

10
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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<Complex32>(Math.Pow(1.0 / 10.0, iteration)));
var solver = new BiCgStab();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

8
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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<Complex32>(Math.Pow(1.0 / 10.0, iteration)));
var solver = new GpBiCg();

10
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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<Complex32>(Math.Pow(1.0 / 10.0, iteration)));
var solver = new MlkBiCgStab();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<Complex32>(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<Complex32>(
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<Complex32>(Math.Pow(1.0 / 10.0, iteration)));
var solver = new TFQMR();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

2
src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs

@ -70,7 +70,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium()
new ResidualStopCriterium<Complex32>(1e-6)
};
var iterator = new Iterator<Complex32>(criteria);

70
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<ArgumentOutOfRangeException>(() => new ResidualStopCriterium(-0.1f));
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium<Complex32>(-0.1f));
}
/// <summary>
@ -59,7 +59,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
[Test]
public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium(-1));
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium<Complex32>(-1));
}
/// <summary>
@ -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<Complex32>(1e-6f, 50);
Assert.AreEqual(1e-6f, criterium.Maximum, "Incorrect maximum");
Assert.AreEqual(50, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count");
}
/// <summary>
/// Can reset maximum.
/// </summary>
[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");
}
/// <summary>
/// Can reset minimum iterations below maximum.
/// </summary>
[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");
}
/// <summary>
/// Determine status with illegal iteration number throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException()
{
var criterium = new ResidualStopCriterium(1e-6f, 50);
Assert.IsNotNull(criterium, "There should be a criterium");
var criterium = new ResidualStopCriterium<Complex32>(1e-6f, 50);
Assert.Throws<ArgumentOutOfRangeException>(() => 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<Complex32>(1e-6f, 50);
Assert.Throws<ArgumentException>(() => 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<Complex32>(1e-6f, 50);
Assert.Throws<ArgumentException>(() => 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<Complex32>(1e-6f, 50);
Assert.Throws<ArgumentException>(() => 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<Complex32>(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<Complex32>(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<Complex32>(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<Complex32>(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<Complex32>(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<Complex32>(1e-3f, 10);
var clone = criterium.Clone();
Assert.IsInstanceOf(typeof (ResidualStopCriterium), clone, "Wrong criterium type");
Assert.IsInstanceOf(typeof(ResidualStopCriterium<Complex32>), clone, "Wrong criterium type");
var clonedCriterium = clone as ResidualStopCriterium;
var clonedCriterium = clone as ResidualStopCriterium<Complex32>;
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
}
}
}

10
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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -254,7 +254,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<double>(1e-10));
var solver = new BiCgStab();
@ -284,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<double>(1e-10));
var solver = new BiCgStab();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -254,7 +254,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<double>(1e-10));
var solver = new GpBiCg();
@ -284,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<double>(1e-10));
var solver = new GpBiCg();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -254,7 +254,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<double>(1e-10));
var solver = new MlkBiCgStab();
@ -284,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<double>(1e-10));
var solver = new MlkBiCgStab();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(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<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -254,7 +254,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<double>(1e-10));
var solver = new TFQMR();
@ -284,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10));
new ResidualStopCriterium<double>(1e-10));
var solver = new TFQMR();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

2
src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs

@ -68,7 +68,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium()
new ResidualStopCriterium<double>(1e-12)
};
var iterator = new Iterator<double>(criteria);

70
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<ArgumentOutOfRangeException>(() => new ResidualStopCriterium(-0.1));
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium<double>(-0.1));
}
/// <summary>
@ -57,7 +57,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
[Test]
public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium(-1));
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium<double>(-1));
}
/// <summary>
@ -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<double>(1e-8, 50);
Assert.AreEqual(1e-8, criterium.Maximum, "Incorrect maximum");
Assert.AreEqual(50, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count");
}
/// <summary>
/// Can reset maximum.
/// </summary>
[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");
}
/// <summary>
/// Can reset minimum iterations below maximum.
/// </summary>
[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");
}
/// <summary>
/// Determine status with illegal iteration number throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException()
{
var criterium = new ResidualStopCriterium(1e-8, 50);
Assert.IsNotNull(criterium, "There should be a criterium");
var criterium = new ResidualStopCriterium<double>(1e-8, 50);
Assert.Throws<ArgumentOutOfRangeException>(() => 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<double>(1e-8, 50);
Assert.Throws<ArgumentException>(() => 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<double>(1e-8, 50);
Assert.Throws<ArgumentException>(() => 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<double>(1e-8, 50);
Assert.Throws<ArgumentException>(() => 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<double>(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<double>(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<double>(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<double>(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<double>(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<double>(1e-3, 10);
var clone = criterium.Clone();
Assert.IsInstanceOf(typeof (ResidualStopCriterium), clone, "Wrong criterium type");
Assert.IsInstanceOf(typeof(ResidualStopCriterium<double>), clone, "Wrong criterium type");
var clonedCriterium = clone as ResidualStopCriterium;
var clonedCriterium = clone as ResidualStopCriterium<double>;
Assert.IsNotNull(clonedCriterium);
// ReSharper disable PossibleNullReferenceException

10
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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<float>(Math.Pow(1.0 / 10.0, iteration)));
var solver = new BiCgStab();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<float>(Math.Pow(1.0 / 10.0, iteration)));
var solver = new GpBiCg();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -274,7 +274,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<float>(Math.Pow(1.0 / 10.0, iteration)));
var solver = new MlkBiCgStab();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

10
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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new FailureStopCriterium());
@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<float>(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<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)));
new ResidualStopCriterium<float>(Math.Pow(1.0 / 10.0, iteration)));
var solver = new TFQMR();
var matrixX = matrixA.SolveIterative(matrixB, solver, monitor);

2
src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs

@ -68,7 +68,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium()
new ResidualStopCriterium<float>(1e-6)
};
var iterator = new Iterator<float>(criteria);

67
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<ArgumentOutOfRangeException>(() => new ResidualStopCriterium(-0.1f));
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium<float>(-0.1f));
}
/// <summary>
@ -57,7 +57,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
[Test]
public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium(-1));
Assert.Throws<ArgumentOutOfRangeException>(() => new ResidualStopCriterium<float>(-1));
}
/// <summary>
@ -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<float>(1e-6f, 50);
Assert.AreEqual(1e-6f, criterium.Maximum, "Incorrect maximum");
Assert.AreEqual(50, criterium.MinimumIterationsBelowMaximum, "Incorrect iteration count");
}
/// <summary>
/// Can reset maximum.
/// </summary>
[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");
}
/// <summary>
/// Can reset minimum iterations below maximum.
/// </summary>
[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");
}
/// <summary>
/// Determine status with illegal iteration number throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException()
{
var criterium = new ResidualStopCriterium(1e-6f, 50);
Assert.IsNotNull(criterium, "There should be a criterium");
var criterium = new ResidualStopCriterium<float>(1e-6f, 50);
Assert.Throws<ArgumentOutOfRangeException>(() => 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<float>(1e-6f, 50);
Assert.Throws<ArgumentException>(() => 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<float>(1e-6f, 50);
Assert.Throws<ArgumentException>(() => 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<float>(1e-6f, 50);
Assert.Throws<ArgumentException>(() => 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<float>(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<float>(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<float>(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<float>(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<float>(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<float>(1e-3f, 10);
var clone = criterium.Clone();
Assert.IsInstanceOf(typeof (ResidualStopCriterium), clone, "Wrong criterium type");
Assert.IsInstanceOf(typeof(ResidualStopCriterium<float>), clone, "Wrong criterium type");
var clonedCriterium = clone as ResidualStopCriterium;
var clonedCriterium = clone as ResidualStopCriterium<float>;
Assert.IsNotNull(clonedCriterium);
// ReSharper disable PossibleNullReferenceException

Loading…
Cancel
Save