Browse Source

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

pull/163/merge
Christoph Ruegg 13 years ago
parent
commit
77e60dd62a
  1. 8
      src/Numerics/LinearAlgebra/Builder.cs
  2. 309
      src/Numerics/LinearAlgebra/Complex/Solvers/DivergenceStopCriterium.cs
  3. 304
      src/Numerics/LinearAlgebra/Complex32/Solvers/DivergenceStopCriterium.cs
  4. 302
      src/Numerics/LinearAlgebra/Double/Solvers/DivergenceStopCriterium.cs
  5. 57
      src/Numerics/LinearAlgebra/Solvers/DivergenceStopCriterium.cs
  6. 5
      src/Numerics/Numerics.csproj
  7. 6
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs
  8. 6
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs
  9. 6
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs
  10. 6
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs
  11. 6
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs
  12. 54
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs
  13. 6
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs
  14. 6
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs
  15. 6
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs
  16. 6
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs
  17. 6
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs
  18. 54
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs
  19. 6
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs
  20. 6
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs
  21. 6
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs
  22. 6
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs
  23. 6
      src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs
  24. 54
      src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs
  25. 6
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs
  26. 6
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs
  27. 6
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs
  28. 6
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs
  29. 6
      src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs
  30. 54
      src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs

8
src/Numerics/LinearAlgebra/Builder.cs

@ -78,7 +78,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
return new IIterationStopCriterium<double>[]
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new IterationCountStopCriterium<double>(maxIterations),
new ResidualStopCriterium<double>(1e-12)
};
@ -155,7 +155,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
return new IIterationStopCriterium<float>[]
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new IterationCountStopCriterium<float>(maxIterations),
new ResidualStopCriterium<float>(1e-6)
};
@ -238,7 +238,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
return new IIterationStopCriterium<Complex>[]
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new IterationCountStopCriterium<Complex>(maxIterations),
new ResidualStopCriterium<Complex>(1e-12)
};
@ -315,7 +315,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
return new IIterationStopCriterium<Numerics.Complex32>[]
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Numerics.Complex32>(),
new IterationCountStopCriterium<Numerics.Complex32>(maxIterations),
new ResidualStopCriterium<Numerics.Complex32>(1e-6)
};

309
src/Numerics/LinearAlgebra/Complex/Solvers/DivergenceStopCriterium.cs

@ -1,309 +0,0 @@
// <copyright file="DivergenceStopCriterium.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 MathNet.Numerics.LinearAlgebra.Solvers;
using System;
using System.Diagnostics;
namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
{
#if NOSYSNUMERICS
using Complex = Numerics.Complex;
#else
using Complex = System.Numerics.Complex;
#endif
/// <summary>
/// Monitors an iterative calculation for signs of divergence.
/// </summary>
public sealed class DivergenceStopCriterium : IIterationStopCriterium<Complex>
{
/// <summary>
/// Default value for the maximum relative increase that the
/// residual may experience before a divergence warning is issued.
/// </summary>
public const double DefaultMaximumRelativeIncrease = 0.08;
/// <summary>
/// Default value for the minimum number of iterations over which
/// the residual must grow before a divergence warning is issued.
/// </summary>
public const int DefaultMinimumNumberOfIterations = 10;
/// <summary>
/// Defines the default last iteration number. Set to -1 because iterations normally
/// start at 0.
/// </summary>
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum relative increase the residual may experience without triggering a divergence warning.
/// </summary>
double _maximumRelativeIncrease;
/// <summary>
/// The number of iterations over which a residual increase should be tracked before issuing a divergence warning.
/// </summary>
int _minimumNumberOfIterations;
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The array that holds the tracking information.
/// </summary>
double[] _residualHistory;
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
int _lastIteration = DefaultLastIterationNumber;
/// <summary>
/// Initializes a new instance of the <see cref="DivergenceStopCriterium"/> class with the specified maximum
/// relative increase and the specified minimum number of tracking iterations.
/// </summary>
/// <param name="maximumRelativeIncrease">The maximum relative increase that the residual may experience before a divergence warning is issued. </param>
/// <param name="minimumIterations">The minimum number of iterations over which the residual must grow before a divergence warning is issued.</param>
public DivergenceStopCriterium(double maximumRelativeIncrease = DefaultMaximumRelativeIncrease, int minimumIterations = DefaultMinimumNumberOfIterations)
{
if (maximumRelativeIncrease <= 0)
{
throw new ArgumentOutOfRangeException("maximumRelativeIncrease");
}
// There must be at least three iterations otherwise we can't calculate the relative increase
if (minimumIterations < 3)
{
throw new ArgumentOutOfRangeException("minimumIterations");
}
_maximumRelativeIncrease = maximumRelativeIncrease;
_minimumNumberOfIterations = minimumIterations;
}
/// <summary>
/// Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>Maximum</c> is set to zero or below.</exception>
public double MaximumRelativeIncrease
{
[DebuggerStepThrough]
get
{
return _maximumRelativeIncrease;
}
[DebuggerStepThrough]
set
{
if (value <= 0)
{
throw new ArgumentOutOfRangeException("value");
}
_maximumRelativeIncrease = value;
}
}
/// <summary>
/// Returns the maximum relative increase to the default.
/// </summary>
public void ResetMaximumRelativeIncreaseToDefault()
{
_maximumRelativeIncrease = DefaultMaximumRelativeIncrease;
}
/// <summary>
/// Gets or sets the minimum number of iterations over which the residual must grow before
/// issuing a divergence warning.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>value</c> is set to less than one.</exception>
public int MinimumNumberOfIterations
{
[DebuggerStepThrough]
get
{
return _minimumNumberOfIterations;
}
[DebuggerStepThrough]
set
{
// There must be at least three iterations otherwise we can't calculate
// the relative increase
if (value < 3)
{
throw new ArgumentOutOfRangeException("value");
}
_minimumNumberOfIterations = value;
}
}
/// <summary>
/// Returns the minimum number of iterations to the default.
/// </summary>
public void ResetNumberOfIterationsToDefault()
{
_minimumNumberOfIterations = DefaultMinimumNumberOfIterations;
}
/// <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 (_lastIteration >= iterationNumber)
{
// We have already stored the actual last iteration number
// For now do nothing. We only care about the next step.
return _status;
}
if ((_residualHistory == null) || (_residualHistory.Length != RequiredHistoryLength))
{
_residualHistory = new double[RequiredHistoryLength];
}
// We always track the residual.
// Move the old versions one element up in the array.
for (var i = 1; i < _residualHistory.Length; i++)
{
_residualHistory[i - 1] = _residualHistory[i];
}
// Store the infinity norms of both the solution and residual vectors
// These values will be used to calculate the relative drop in residuals later on.
_residualHistory[_residualHistory.Length - 1] = residualVector.InfinityNorm();
// Check if we have NaN's. If so we've gone way beyond normal divergence.
// Stop the iteration.
if (double.IsNaN(_residualHistory[_residualHistory.Length - 1]))
{
_status = IterationStatus.Diverged;
return _status;
}
// Check if we are diverging and if so set the status
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
}
/// <summary>
/// Detect if solution is diverging
/// </summary>
/// <returns><c>true</c> if diverging, otherwise <c>false</c></returns>
bool IsDiverging()
{
// Run for each variable
for (var i = 1; i < _residualHistory.Length; i++)
{
var difference = _residualHistory[i] - _residualHistory[i - 1];
// Divergence is occurring if:
// - the last residual is larger than the previous one
// - the relative increase of the residual is larger than the setting allows
if ((difference < 0) || (_residualHistory[i - 1]*(1 + _maximumRelativeIncrease) >= _residualHistory[i]))
{
// No divergence taking place within the required number of iterations
// So reset and stop the iteration. There is no way we can get to the
// required number of iterations anymore.
return false;
}
}
return true;
}
/// <summary>
/// Gets required history Length
/// </summary>
int RequiredHistoryLength
{
[DebuggerStepThrough]
get
{
return _minimumNumberOfIterations + 1;
}
}
/// <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;
_lastIteration = DefaultLastIterationNumber;
_residualHistory = null;
}
/// <summary>
/// Clones the current <see cref="DivergenceStopCriterium"/> and its settings.
/// </summary>
/// <returns>A new instance of the <see cref="DivergenceStopCriterium"/> class.</returns>
public IIterationStopCriterium<Complex> Clone()
{
return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations);
}
}
}

304
src/Numerics/LinearAlgebra/Complex32/Solvers/DivergenceStopCriterium.cs

@ -1,304 +0,0 @@
// <copyright file="DivergenceStopCriterium.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 MathNet.Numerics.LinearAlgebra.Solvers;
using System;
using System.Diagnostics;
namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
{
using Numerics;
/// <summary>
/// Monitors an iterative calculation for signs of divergence.
/// </summary>
public sealed class DivergenceStopCriterium : IIterationStopCriterium<Complex32>
{
/// <summary>
/// Default value for the maximum relative increase that the
/// residual may experience before a divergence warning is issued.
/// </summary>
public const double DefaultMaximumRelativeIncrease = 0.08;
/// <summary>
/// Default value for the minimum number of iterations over which
/// the residual must grow before a divergence warning is issued.
/// </summary>
public const int DefaultMinimumNumberOfIterations = 10;
/// <summary>
/// Defines the default last iteration number. Set to -1 because iterations normally
/// start at 0.
/// </summary>
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum relative increase the residual may experience without triggering a divergence warning.
/// </summary>
double _maximumRelativeIncrease;
/// <summary>
/// The number of iterations over which a residual increase should be tracked before issuing a divergence warning.
/// </summary>
int _minimumNumberOfIterations;
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The array that holds the tracking information.
/// </summary>
double[] _residualHistory;
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
int _lastIteration = DefaultLastIterationNumber;
/// <summary>
/// Initializes a new instance of the <see cref="DivergenceStopCriterium"/> class with the specified maximum
/// relative increase and the specified minimum number of tracking iterations.
/// </summary>
/// <param name="maximumRelativeIncrease">The maximum relative increase that the residual may experience before a divergence warning is issued. </param>
/// <param name="minimumIterations">The minimum number of iterations over which the residual must grow before a divergence warning is issued.</param>
public DivergenceStopCriterium(double maximumRelativeIncrease = DefaultMaximumRelativeIncrease, int minimumIterations = DefaultMinimumNumberOfIterations)
{
if (maximumRelativeIncrease <= 0)
{
throw new ArgumentOutOfRangeException("maximumRelativeIncrease");
}
// There must be at least three iterations otherwise we can't calculate the relative increase
if (minimumIterations < 3)
{
throw new ArgumentOutOfRangeException("minimumIterations");
}
_maximumRelativeIncrease = maximumRelativeIncrease;
_minimumNumberOfIterations = minimumIterations;
}
/// <summary>
/// Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>Maximum</c> is set to zero or below.</exception>
public double MaximumRelativeIncrease
{
[DebuggerStepThrough]
get
{
return _maximumRelativeIncrease;
}
[DebuggerStepThrough]
set
{
if (value <= 0)
{
throw new ArgumentOutOfRangeException("value");
}
_maximumRelativeIncrease = value;
}
}
/// <summary>
/// Returns the maximum relative increase to the default.
/// </summary>
public void ResetMaximumRelativeIncreaseToDefault()
{
_maximumRelativeIncrease = DefaultMaximumRelativeIncrease;
}
/// <summary>
/// Gets or sets the minimum number of iterations over which the residual must grow before
/// issuing a divergence warning.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>value</c> is set to less than one.</exception>
public int MinimumNumberOfIterations
{
[DebuggerStepThrough]
get
{
return _minimumNumberOfIterations;
}
[DebuggerStepThrough]
set
{
// There must be at least three iterations otherwise we can't calculate
// the relative increase
if (value < 3)
{
throw new ArgumentOutOfRangeException("value");
}
_minimumNumberOfIterations = value;
}
}
/// <summary>
/// Returns the minimum number of iterations to the default.
/// </summary>
public void ResetNumberOfIterationsToDefault()
{
_minimumNumberOfIterations = DefaultMinimumNumberOfIterations;
}
/// <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 (_lastIteration >= iterationNumber)
{
// We have already stored the actual last iteration number
// For now do nothing. We only care about the next step.
return _status;
}
if ((_residualHistory == null) || (_residualHistory.Length != RequiredHistoryLength))
{
_residualHistory = new double[RequiredHistoryLength];
}
// We always track the residual.
// Move the old versions one element up in the array.
for (var i = 1; i < _residualHistory.Length; i++)
{
_residualHistory[i - 1] = _residualHistory[i];
}
// Store the infinity norms of both the solution and residual vectors
// These values will be used to calculate the relative drop in residuals later on.
_residualHistory[_residualHistory.Length - 1] = residualVector.InfinityNorm();
// Check if we have NaN's. If so we've gone way beyond normal divergence.
// Stop the iteration.
if (double.IsNaN(_residualHistory[_residualHistory.Length - 1]))
{
_status = IterationStatus.Diverged;
return _status;
}
// Check if we are diverging and if so set the status
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
}
/// <summary>
/// Detect if solution is diverging
/// </summary>
/// <returns><c>true</c> if diverging, otherwise <c>false</c></returns>
bool IsDiverging()
{
// Run for each variable
for (var i = 1; i < _residualHistory.Length; i++)
{
var difference = _residualHistory[i] - _residualHistory[i - 1];
// Divergence is occurring if:
// - the last residual is larger than the previous one
// - the relative increase of the residual is larger than the setting allows
if ((difference < 0) || (_residualHistory[i - 1]*(1 + _maximumRelativeIncrease) >= _residualHistory[i]))
{
// No divergence taking place within the required number of iterations
// So reset and stop the iteration. There is no way we can get to the
// required number of iterations anymore.
return false;
}
}
return true;
}
/// <summary>
/// Gets required history Length
/// </summary>
int RequiredHistoryLength
{
[DebuggerStepThrough]
get
{
return _minimumNumberOfIterations + 1;
}
}
/// <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;
_lastIteration = DefaultLastIterationNumber;
_residualHistory = null;
}
/// <summary>
/// Clones the current <see cref="DivergenceStopCriterium"/> and its settings.
/// </summary>
/// <returns>A new instance of the <see cref="DivergenceStopCriterium"/> class.</returns>
public IIterationStopCriterium<Complex32> Clone()
{
return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations);
}
}
}

302
src/Numerics/LinearAlgebra/Double/Solvers/DivergenceStopCriterium.cs

@ -1,302 +0,0 @@
// <copyright file="DivergenceStopCriterium.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 MathNet.Numerics.LinearAlgebra.Solvers;
using System;
using System.Diagnostics;
namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
{
/// <summary>
/// Monitors an iterative calculation for signs of divergence.
/// </summary>
public sealed class DivergenceStopCriterium : IIterationStopCriterium<double>
{
/// <summary>
/// Default value for the maximum relative increase that the
/// residual may experience before a divergence warning is issued.
/// </summary>
public const double DefaultMaximumRelativeIncrease = 0.08;
/// <summary>
/// Default value for the minimum number of iterations over which
/// the residual must grow before a divergence warning is issued.
/// </summary>
public const int DefaultMinimumNumberOfIterations = 10;
/// <summary>
/// Defines the default last iteration number. Set to -1 because iterations normally
/// start at 0.
/// </summary>
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum relative increase the residual may experience without triggering a divergence warning.
/// </summary>
double _maximumRelativeIncrease;
/// <summary>
/// The number of iterations over which a residual increase should be tracked before issuing a divergence warning.
/// </summary>
int _minimumNumberOfIterations;
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The array that holds the tracking information.
/// </summary>
double[] _residualHistory;
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
int _lastIteration = DefaultLastIterationNumber;
/// <summary>
/// Initializes a new instance of the <see cref="DivergenceStopCriterium"/> class with the specified maximum
/// relative increase and the specified minimum number of tracking iterations.
/// </summary>
/// <param name="maximumRelativeIncrease">The maximum relative increase that the residual may experience before a divergence warning is issued. </param>
/// <param name="minimumIterations">The minimum number of iterations over which the residual must grow before a divergence warning is issued.</param>
public DivergenceStopCriterium(double maximumRelativeIncrease = DefaultMaximumRelativeIncrease, int minimumIterations = DefaultMinimumNumberOfIterations)
{
if (maximumRelativeIncrease <= 0)
{
throw new ArgumentOutOfRangeException("maximumRelativeIncrease");
}
// There must be at least three iterations otherwise we can't calculate the relative increase
if (minimumIterations < 3)
{
throw new ArgumentOutOfRangeException("minimumIterations");
}
_maximumRelativeIncrease = maximumRelativeIncrease;
_minimumNumberOfIterations = minimumIterations;
}
/// <summary>
/// Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>Maximum</c> is set to zero or below.</exception>
public double MaximumRelativeIncrease
{
[DebuggerStepThrough]
get
{
return _maximumRelativeIncrease;
}
[DebuggerStepThrough]
set
{
if (value <= 0)
{
throw new ArgumentOutOfRangeException("value");
}
_maximumRelativeIncrease = value;
}
}
/// <summary>
/// Returns the maximum relative increase to the default.
/// </summary>
public void ResetMaximumRelativeIncreaseToDefault()
{
_maximumRelativeIncrease = DefaultMaximumRelativeIncrease;
}
/// <summary>
/// Gets or sets the minimum number of iterations over which the residual must grow before
/// issuing a divergence warning.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown if the <c>value</c> is set to less than one.</exception>
public int MinimumNumberOfIterations
{
[DebuggerStepThrough]
get
{
return _minimumNumberOfIterations;
}
[DebuggerStepThrough]
set
{
// There must be at least three iterations otherwise we can't calculate
// the relative increase
if (value < 3)
{
throw new ArgumentOutOfRangeException("value");
}
_minimumNumberOfIterations = value;
}
}
/// <summary>
/// Returns the minimum number of iterations to the default.
/// </summary>
public void ResetNumberOfIterationsToDefault()
{
_minimumNumberOfIterations = DefaultMinimumNumberOfIterations;
}
/// <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<double> solutionVector, Vector<double> sourceVector, Vector<double> residualVector)
{
if (iterationNumber < 0)
{
throw new ArgumentOutOfRangeException("iterationNumber");
}
if (_lastIteration >= iterationNumber)
{
// We have already stored the actual last iteration number
// For now do nothing. We only care about the next step.
return _status;
}
if ((_residualHistory == null) || (_residualHistory.Length != RequiredHistoryLength))
{
_residualHistory = new double[RequiredHistoryLength];
}
// We always track the residual.
// Move the old versions one element up in the array.
for (var i = 1; i < _residualHistory.Length; i++)
{
_residualHistory[i - 1] = _residualHistory[i];
}
// Store the infinity norms of both the solution and residual vectors
// These values will be used to calculate the relative drop in residuals later on.
_residualHistory[_residualHistory.Length - 1] = residualVector.InfinityNorm();
// Check if we have NaN's. If so we've gone way beyond normal divergence.
// Stop the iteration.
if (double.IsNaN(_residualHistory[_residualHistory.Length - 1]))
{
_status = IterationStatus.Diverged;
return _status;
}
// Check if we are diverging and if so set the status
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
}
/// <summary>
/// Detect if solution is diverging
/// </summary>
/// <returns><c>true</c> if diverging, otherwise <c>false</c></returns>
bool IsDiverging()
{
// Run for each variable
for (var i = 1; i < _residualHistory.Length; i++)
{
var difference = _residualHistory[i] - _residualHistory[i - 1];
// Divergence is occurring if:
// - the last residual is larger than the previous one
// - the relative increase of the residual is larger than the setting allows
if ((difference < 0) || (_residualHistory[i - 1]*(1 + _maximumRelativeIncrease) >= _residualHistory[i]))
{
// No divergence taking place within the required number of iterations
// So reset and stop the iteration. There is no way we can get to the
// required number of iterations anymore.
return false;
}
}
return true;
}
/// <summary>
/// Gets required history Length
/// </summary>
int RequiredHistoryLength
{
[DebuggerStepThrough]
get
{
return _minimumNumberOfIterations + 1;
}
}
/// <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;
_lastIteration = DefaultLastIterationNumber;
_residualHistory = null;
}
/// <summary>
/// Clones the current <see cref="DivergenceStopCriterium"/> and its settings.
/// </summary>
/// <returns>A new instance of the <see cref="DivergenceStopCriterium"/> class.</returns>
public IIterationStopCriterium<double> Clone()
{
return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations);
}
}
}

57
src/Numerics/LinearAlgebra/Single/Solvers/DivergenceStopCriterium.cs → src/Numerics/LinearAlgebra/Solvers/DivergenceStopCriterium.cs

@ -28,35 +28,16 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using MathNet.Numerics.LinearAlgebra.Solvers;
using System;
using System.Diagnostics;
namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
namespace MathNet.Numerics.LinearAlgebra.Solvers
{
/// <summary>
/// Monitors an iterative calculation for signs of divergence.
/// </summary>
public sealed class DivergenceStopCriterium : IIterationStopCriterium<float>
public sealed class DivergenceStopCriterium<T> : IIterationStopCriterium<T> where T : struct, IEquatable<T>, IFormattable
{
/// <summary>
/// Default value for the maximum relative increase that the
/// residual may experience before a divergence warning is issued.
/// </summary>
public const double DefaultMaximumRelativeIncrease = 0.08;
/// <summary>
/// Default value for the minimum number of iterations over which
/// the residual must grow before a divergence warning is issued.
/// </summary>
public const int DefaultMinimumNumberOfIterations = 10;
/// <summary>
/// Defines the default last iteration number. Set to -1 because iterations normally
/// start at 0.
/// </summary>
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum relative increase the residual may experience without triggering a divergence warning.
/// </summary>
@ -80,15 +61,15 @@ namespace MathNet.Numerics.LinearAlgebra.Single.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="DivergenceStopCriterium"/> class with the specified maximum
/// Initializes a new instance of the <see cref="DivergenceStopCriterium{T}"/> class with the specified maximum
/// relative increase and the specified minimum number of tracking iterations.
/// </summary>
/// <param name="maximumRelativeIncrease">The maximum relative increase that the residual may experience before a divergence warning is issued. </param>
/// <param name="minimumIterations">The minimum number of iterations over which the residual must grow before a divergence warning is issued.</param>
public DivergenceStopCriterium(double maximumRelativeIncrease = DefaultMaximumRelativeIncrease, int minimumIterations = DefaultMinimumNumberOfIterations)
public DivergenceStopCriterium(double maximumRelativeIncrease = 0.08, int minimumIterations = 10)
{
if (maximumRelativeIncrease <= 0)
{
@ -129,14 +110,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
}
}
/// <summary>
/// Returns the maximum relative increase to the default.
/// </summary>
public void ResetMaximumRelativeIncreaseToDefault()
{
_maximumRelativeIncrease = DefaultMaximumRelativeIncrease;
}
/// <summary>
/// Gets or sets the minimum number of iterations over which the residual must grow before
/// issuing a divergence warning.
@ -164,14 +137,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
}
}
/// <summary>
/// Returns the minimum number of iterations to the default.
/// </summary>
public void ResetNumberOfIterationsToDefault()
{
_minimumNumberOfIterations = DefaultMinimumNumberOfIterations;
}
/// <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.
@ -185,7 +150,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
/// on the invocation of this method. Therefore this method should only be called if the
/// calculation has moved forwards at least one step.
/// </remarks>
public IterationStatus DetermineStatus(int iterationNumber, Vector<float> solutionVector, Vector<float> sourceVector, Vector<float> residualVector)
public IterationStatus DetermineStatus(int iterationNumber, Vector<T> solutionVector, Vector<T> sourceVector, Vector<T> residualVector)
{
if (iterationNumber < 0)
{
@ -286,17 +251,17 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
public void Reset()
{
_status = IterationStatus.Continue;
_lastIteration = DefaultLastIterationNumber;
_lastIteration = -1;
_residualHistory = null;
}
/// <summary>
/// Clones the current <see cref="DivergenceStopCriterium"/> and its settings.
/// Clones the current <see cref="DivergenceStopCriterium{T}"/> and its settings.
/// </summary>
/// <returns>A new instance of the <see cref="DivergenceStopCriterium"/> class.</returns>
public IIterationStopCriterium<float> Clone()
/// <returns>A new instance of the <see cref="DivergenceStopCriterium{T}"/> class.</returns>
public IIterationStopCriterium<T> Clone()
{
return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations);
return new DivergenceStopCriterium<T>(_maximumRelativeIncrease, _minimumNumberOfIterations);
}
}
}

5
src/Numerics/Numerics.csproj

@ -255,7 +255,6 @@
<Compile Include="LinearAlgebra\Complex32\Solvers\DiagonalPreconditioner.cs" />
<Compile Include="LinearAlgebra\Complex32\Solvers\ILUTPPreconditioner.cs" />
<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\SparseVector.cs" />
<Compile Include="LinearAlgebra\Complex\Factorization\DenseGramSchmidt.cs" />
@ -278,7 +277,6 @@
<Compile Include="LinearAlgebra\Complex\Solvers\DiagonalPreconditioner.cs" />
<Compile Include="LinearAlgebra\Complex\Solvers\ILUTPPreconditioner.cs" />
<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\SparseVector.cs" />
<Compile Include="LinearAlgebra\Double\DenseVector.cs" />
@ -317,7 +315,7 @@
<Compile Include="LinearAlgebra\Single\Solvers\DiagonalPreconditioner.cs" />
<Compile Include="LinearAlgebra\Single\Solvers\ILUTPPreconditioner.cs" />
<Compile Include="LinearAlgebra\Single\Solvers\ILU0Preconditioner.cs" />
<Compile Include="LinearAlgebra\Single\Solvers\DivergenceStopCriterium.cs" />
<Compile Include="LinearAlgebra\Solvers\DivergenceStopCriterium.cs" />
<Compile Include="LinearAlgebra\Single\Solvers\FailureStopCriterium.cs" />
<Compile Include="LinearAlgebra\Single\SparseMatrix.cs" />
<Compile Include="LinearAlgebra\Single\SparseVector.cs" />
@ -344,7 +342,6 @@
<Compile Include="LinearAlgebra\Double\Solvers\ILUTPPreconditioner.cs" />
<Compile Include="LinearAlgebra\Double\Solvers\ILU0Preconditioner.cs" />
<Compile Include="LinearAlgebra\Solvers\UnitPreconditioner.cs" />
<Compile Include="LinearAlgebra\Double\Solvers\DivergenceStopCriterium.cs" />
<Compile Include="LinearAlgebra\Double\Solvers\FailureStopCriterium.cs" />
<Compile Include="LinearAlgebra\Solvers\ResidualStopCriterium.cs" />
<Compile Include="LinearAlgebra\Double\SparseVector.cs" />

6
src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs

@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new BiCgStab();
@ -143,7 +143,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator<Complex>(new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new BiCgStab();
@ -219,7 +219,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator<Complex>(new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new BiCgStab();

6
src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs

@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new GpBiCg();
@ -144,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new GpBiCg();
@ -221,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new GpBiCg();

6
src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs

@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();
@ -144,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();
@ -221,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();

6
src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs

@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new TFQMR();
@ -144,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new TFQMR();
@ -221,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var monitor = new Iterator<Complex>(
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium<Complex>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new FailureStopCriterium());
var solver = new TFQMR();

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

@ -72,7 +72,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
var criteria = new List<IIterationStopCriterium<Complex>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium<Complex>(1e-12)
};
@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
var criteria = new List<IIterationStopCriterium<Complex>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new IterationCountStopCriterium<Complex>(1)
};
@ -126,7 +126,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
var criteria = new List<IIterationStopCriterium<Complex>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex>(),
new IterationCountStopCriterium<Complex>(1)
};

54
src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs

@ -54,7 +54,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void CreateWithNegativeMaximumIncreaseThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium(-0.1));
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium<Complex>(-0.1));
}
/// <summary>
@ -63,7 +63,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium(minimumIterations: 2));
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium<Complex>(minimumIterations: 2));
}
/// <summary>
@ -72,50 +72,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void Create()
{
var criterium = new DivergenceStopCriterium(0.1, 3);
var criterium = new DivergenceStopCriterium<Complex>(0.1, 3);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(0.1, criterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(3, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
}
/// <summary>
/// Can reset maximum increase.
/// </summary>
[Test]
public void ResetMaximumIncrease()
{
var criterium = new DivergenceStopCriterium(0.5, 3);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(0.5, criterium.MaximumRelativeIncrease, "Incorrect maximum");
criterium.ResetMaximumRelativeIncreaseToDefault();
Assert.AreEqual(DivergenceStopCriterium.DefaultMaximumRelativeIncrease, criterium.MaximumRelativeIncrease, "Incorrect value");
}
/// <summary>
/// Can reset minimum iterations below maximum.
/// </summary>
[Test]
public void ResetMinimumIterationsBelowMaximum()
{
var criterium = new DivergenceStopCriterium(0.5, 15);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(15, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
criterium.ResetNumberOfIterationsToDefault();
Assert.AreEqual(DivergenceStopCriterium.DefaultMinimumNumberOfIterations, criterium.MinimumNumberOfIterations, "Incorrect value");
}
/// <summary>
/// Determine status with illegal iteration number throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException()
{
var criterium = new DivergenceStopCriterium(0.5, 15);
var criterium = new DivergenceStopCriterium<Complex>(0.5, 15);
Assert.Throws<ArgumentOutOfRangeException>(() => criterium.DetermineStatus(
-1,
DenseVector.Create(3, i => 4),
@ -132,7 +102,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have to few iterations
for (var i = 0; i < Iterations - 1; i++)
@ -156,7 +126,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex>(Increase, Iterations);
// Add residuals. We should not diverge because we won't have enough increase
for (var i = 0; i < Iterations*2; i++)
@ -180,7 +150,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have to few iterations
for (var i = 0; i < Iterations - 5; i++)
@ -213,7 +183,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have one to few iterations
double previous = 1;
@ -249,7 +219,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex>(Increase, Iterations);
// Add residuals. Blow it up instantly
var status = criterium.DetermineStatus(
@ -277,13 +247,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex>(Increase, Iterations);
Assert.IsNotNull(criterium, "There should be a criterium");
var clone = criterium.Clone();
Assert.IsInstanceOf(typeof (DivergenceStopCriterium), clone, "Wrong criterium type");
Assert.IsInstanceOf(typeof(DivergenceStopCriterium<Complex>), clone, "Wrong criterium type");
var clonedCriterium = clone as DivergenceStopCriterium;
var clonedCriterium = clone as DivergenceStopCriterium<Complex>;
Assert.IsNotNull(clonedCriterium);
Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum");

6
src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs

@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new BiCgStab();
@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new BiCgStab();
@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new BiCgStab();

6
src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs

@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new GpBiCg();
@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new GpBiCg();
@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new GpBiCg();

6
src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs

@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();
@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();
@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();

6
src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs

@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new TFQMR();
@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new TFQMR();
@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var monitor = new Iterator<Complex32>(
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium<Complex32>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new FailureStopCriterium());
var solver = new TFQMR();

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

@ -68,7 +68,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
var criteria = new List<IIterationStopCriterium<Complex32>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium<Complex32>(1e-6)
};
@ -90,7 +90,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
var criteria = new List<IIterationStopCriterium<Complex32>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new IterationCountStopCriterium<Complex32>(1)
};
@ -122,7 +122,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
var criteria = new List<IIterationStopCriterium<Complex32>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<Complex32>(),
new IterationCountStopCriterium<Complex32>(1)
};

54
src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs

@ -50,7 +50,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
[Test]
public void CreateWithNegativeMaximumIncreaseThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium(-0.1));
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium<Complex32>(-0.1));
}
/// <summary>
@ -59,7 +59,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
[Test]
public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium(minimumIterations: 2));
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium<Complex32>(minimumIterations: 2));
}
/// <summary>
@ -68,50 +68,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
[Test]
public void Create()
{
var criterium = new DivergenceStopCriterium(0.1, 3);
var criterium = new DivergenceStopCriterium<Complex32>(0.1, 3);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(0.1, criterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(3, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
}
/// <summary>
/// Can reset maximum increase.
/// </summary>
[Test]
public void ResetMaximumIncrease()
{
var criterium = new DivergenceStopCriterium(0.5, 3);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(0.5, criterium.MaximumRelativeIncrease, "Incorrect maximum");
criterium.ResetMaximumRelativeIncreaseToDefault();
Assert.AreEqual(DivergenceStopCriterium.DefaultMaximumRelativeIncrease, criterium.MaximumRelativeIncrease, "Incorrect value");
}
/// <summary>
/// Can reset minimum iterations below maximum.
/// </summary>
[Test]
public void ResetMinimumIterationsBelowMaximum()
{
var criterium = new DivergenceStopCriterium(0.5, 15);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(15, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
criterium.ResetNumberOfIterationsToDefault();
Assert.AreEqual(DivergenceStopCriterium.DefaultMinimumNumberOfIterations, criterium.MinimumNumberOfIterations, "Incorrect value");
}
/// <summary>
/// Determine status with illegal iteration number throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException()
{
var criterium = new DivergenceStopCriterium(0.5, 15);
var criterium = new DivergenceStopCriterium<Complex32>(0.5, 15);
Assert.Throws<ArgumentOutOfRangeException>(() => criterium.DetermineStatus(
-1,
DenseVector.Create(3, i => 4),
@ -128,7 +98,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex32>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have to few iterations
for (var i = 0; i < Iterations - 1; i++)
@ -151,7 +121,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex32>(Increase, Iterations);
// Add residuals. We should not diverge because we won't have enough increase
for (var i = 0; i < Iterations*2; i++)
@ -175,7 +145,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex32>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have to few iterations
for (var i = 0; i < Iterations - 5; i++)
@ -208,7 +178,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex32>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have one to few iterations
float previous = 1;
@ -244,7 +214,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex32>(Increase, Iterations);
// Add residuals. Blow it up instantly
var status = criterium.DetermineStatus(
@ -272,13 +242,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<Complex32>(Increase, Iterations);
Assert.IsNotNull(criterium, "There should be a criterium");
var clone = criterium.Clone();
Assert.IsInstanceOf(typeof (DivergenceStopCriterium), clone, "Wrong criterium type");
Assert.IsInstanceOf(typeof(DivergenceStopCriterium<Complex32>), clone, "Wrong criterium type");
var clonedCriterium = clone as DivergenceStopCriterium;
var clonedCriterium = clone as DivergenceStopCriterium<Complex32>;
Assert.IsNotNull(clonedCriterium);
Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum");

6
src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs

@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new BiCgStab();
@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new BiCgStab();
@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new BiCgStab();

6
src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs

@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new GpBiCg();
@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new GpBiCg();
@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new GpBiCg();

6
src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs

@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();
@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();
@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();

6
src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs

@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new TFQMR();
@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new TFQMR();
@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var monitor = new Iterator<double>(
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium<double>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new FailureStopCriterium());
var solver = new TFQMR();

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

@ -66,7 +66,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
var criteria = new List<IIterationStopCriterium<double>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium<double>(1e-12)
};
@ -88,7 +88,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
var criteria = new List<IIterationStopCriterium<double>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new IterationCountStopCriterium<double>(1)
};
@ -120,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
var criteria = new List<IIterationStopCriterium<double>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<double>(),
new IterationCountStopCriterium<double>(1)
};

54
src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs

@ -48,7 +48,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
[Test]
public void CreateWithNegativeMaximumIncreaseThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium(-0.1));
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium<double>(-0.1));
}
/// <summary>
@ -57,7 +57,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
[Test]
public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium(minimumIterations: 2));
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium<double>(minimumIterations: 2));
}
/// <summary>
@ -66,50 +66,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
[Test]
public void Create()
{
var criterium = new DivergenceStopCriterium(0.1, 3);
var criterium = new DivergenceStopCriterium<double>(0.1, 3);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(0.1, criterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(3, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
}
/// <summary>
/// Can reset maximum increase.
/// </summary>
[Test]
public void ResetMaximumIncrease()
{
var criterium = new DivergenceStopCriterium(0.5, 3);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(0.5, criterium.MaximumRelativeIncrease, "Incorrect maximum");
criterium.ResetMaximumRelativeIncreaseToDefault();
Assert.AreEqual(DivergenceStopCriterium.DefaultMaximumRelativeIncrease, criterium.MaximumRelativeIncrease, "Incorrect value");
}
/// <summary>
/// Can reset minimum iterations below maximum.
/// </summary>
[Test]
public void ResetMinimumIterationsBelowMaximum()
{
var criterium = new DivergenceStopCriterium(0.5, 15);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(15, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
criterium.ResetNumberOfIterationsToDefault();
Assert.AreEqual(DivergenceStopCriterium.DefaultMinimumNumberOfIterations, criterium.MinimumNumberOfIterations, "Incorrect value");
}
/// <summary>
/// Determine status with illegal iteration number throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException()
{
var criterium = new DivergenceStopCriterium(0.5, 15);
var criterium = new DivergenceStopCriterium<double>(0.5, 15);
Assert.Throws<ArgumentOutOfRangeException>(() => criterium.DetermineStatus(
-1,
DenseVector.Create(3, i => 4),
@ -126,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<double>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have to few iterations
for (var i = 0; i < Iterations - 1; i++)
@ -150,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<double>(Increase, Iterations);
// Add residuals. We should not diverge because we won't have enough increase
for (var i = 0; i < Iterations*2; i++)
@ -174,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<double>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have to few iterations
for (var i = 0; i < Iterations - 5; i++)
@ -207,7 +177,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<double>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have one to few iterations
double previous = 1;
@ -243,7 +213,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<double>(Increase, Iterations);
// Add residuals. Blow it up instantly
var status = criterium.DetermineStatus(
@ -271,13 +241,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<double>(Increase, Iterations);
Assert.IsNotNull(criterium, "There should be a criterium");
var clone = criterium.Clone();
Assert.IsInstanceOf(typeof (DivergenceStopCriterium), clone, "Wrong criterium type");
Assert.IsInstanceOf(typeof(DivergenceStopCriterium<double>), clone, "Wrong criterium type");
var clonedCriterium = clone as DivergenceStopCriterium;
var clonedCriterium = clone as DivergenceStopCriterium<double>;
Assert.IsNotNull(clonedCriterium);
Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum");

6
src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs

@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new BiCgStab();
@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new BiCgStab();
@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new BiCgStab();

6
src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs

@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new GpBiCg();
@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new GpBiCg();
@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new GpBiCg();

6
src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs

@ -95,7 +95,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();
@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();
@ -220,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new MlkBiCgStab();

6
src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs

@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new TFQMR();
@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new TFQMR();
@ -215,7 +215,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var monitor = new Iterator<float>(
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium<float>(ConvergenceBoundary),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new FailureStopCriterium());
var solver = new TFQMR();

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

@ -66,7 +66,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
var criteria = new List<IIterationStopCriterium<float>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium<float>(1e-6)
};
@ -88,7 +88,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
var criteria = new List<IIterationStopCriterium<float>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new IterationCountStopCriterium<float>(1)
};
@ -120,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
var criteria = new List<IIterationStopCriterium<float>>
{
new FailureStopCriterium(),
new DivergenceStopCriterium(),
new DivergenceStopCriterium<float>(),
new IterationCountStopCriterium<float>(1)
};

54
src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs

@ -48,7 +48,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
[Test]
public void CreateWithNegativeMaximumIncreaseThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium(-0.1));
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium<float>(-0.1));
}
/// <summary>
@ -57,7 +57,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
[Test]
public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium(minimumIterations: 2));
Assert.Throws<ArgumentOutOfRangeException>(() => new DivergenceStopCriterium<float>(minimumIterations: 2));
}
/// <summary>
@ -66,50 +66,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
[Test]
public void Create()
{
var criterium = new DivergenceStopCriterium(0.1, 3);
var criterium = new DivergenceStopCriterium<float>(0.1, 3);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(0.1, criterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(3, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
}
/// <summary>
/// Can reset maximum increase.
/// </summary>
[Test]
public void ResetMaximumIncrease()
{
var criterium = new DivergenceStopCriterium(0.5, 3);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(0.5, criterium.MaximumRelativeIncrease, "Incorrect maximum");
criterium.ResetMaximumRelativeIncreaseToDefault();
Assert.AreEqual(DivergenceStopCriterium.DefaultMaximumRelativeIncrease, criterium.MaximumRelativeIncrease, "Incorrect value");
}
/// <summary>
/// Can reset minimum iterations below maximum.
/// </summary>
[Test]
public void ResetMinimumIterationsBelowMaximum()
{
var criterium = new DivergenceStopCriterium(0.5, 15);
Assert.IsNotNull(criterium, "There should be a criterium");
Assert.AreEqual(15, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
criterium.ResetNumberOfIterationsToDefault();
Assert.AreEqual(DivergenceStopCriterium.DefaultMinimumNumberOfIterations, criterium.MinimumNumberOfIterations, "Incorrect value");
}
/// <summary>
/// Determine status with illegal iteration number throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException()
{
var criterium = new DivergenceStopCriterium(0.5, 15);
var criterium = new DivergenceStopCriterium<float>(0.5, 15);
Assert.Throws<ArgumentOutOfRangeException>(() => criterium.DetermineStatus(
-1,
DenseVector.Create(3, i => 4),
@ -126,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<float>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have to few iterations
for (var i = 0; i < Iterations - 1; i++)
@ -150,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<float>(Increase, Iterations);
// Add residuals. We should not diverge because we won't have enough increase
for (var i = 0; i < Iterations*2; i++)
@ -174,7 +144,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<float>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have to few iterations
for (var i = 0; i < Iterations - 5; i++)
@ -207,7 +177,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
const float Increase = 0.5f;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<float>(Increase, Iterations);
// Add residuals. We should not diverge because we'll have one to few iterations
float previous = 1;
@ -243,7 +213,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<float>(Increase, Iterations);
// Add residuals. Blow it up instantly
var status = criterium.DetermineStatus(
@ -271,13 +241,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
const double Increase = 0.5;
const int Iterations = 10;
var criterium = new DivergenceStopCriterium(Increase, Iterations);
var criterium = new DivergenceStopCriterium<float>(Increase, Iterations);
Assert.IsNotNull(criterium, "There should be a criterium");
var clone = criterium.Clone();
Assert.IsInstanceOf(typeof (DivergenceStopCriterium), clone, "Wrong criterium type");
Assert.IsInstanceOf(typeof(DivergenceStopCriterium<float>), clone, "Wrong criterium type");
var clonedCriterium = clone as DivergenceStopCriterium;
var clonedCriterium = clone as DivergenceStopCriterium<float>;
Assert.IsNotNull(clonedCriterium);
Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum");

Loading…
Cancel
Save