Browse Source

LA: simplify iterative solver stop criteria by merging Indeterminate+Running into Continue state

optimization-1
Christoph Ruegg 13 years ago
parent
commit
ec7101b0d3
  1. 22
      src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs
  2. 18
      src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs
  3. 22
      src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs
  4. 6
      src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/DivergenceStopCriterium.cs
  5. 6
      src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/FailureStopCriterium.cs
  6. 8
      src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/ResidualStopCriterium.cs
  7. 20
      src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs
  8. 23
      src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs
  9. 18
      src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs
  10. 22
      src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs
  11. 6
      src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/DivergenceStopCriterium.cs
  12. 6
      src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/FailureStopCriterium.cs
  13. 8
      src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/ResidualStopCriterium.cs
  14. 20
      src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs
  15. 22
      src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs
  16. 18
      src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs
  17. 22
      src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs
  18. 28
      src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/DivergenceStopCriterium.cs
  19. 6
      src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/FailureStopCriterium.cs
  20. 8
      src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/ResidualStopCriterium.cs
  21. 20
      src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs
  22. 22
      src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs
  23. 18
      src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs
  24. 22
      src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs
  25. 26
      src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/DivergenceStopCriterium.cs
  26. 10
      src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/FailureStopCriterium.cs
  27. 8
      src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/ResidualStopCriterium.cs
  28. 20
      src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs
  29. 4
      src/Numerics/LinearAlgebra/Solvers/CancellationStopCriterium.cs
  30. 6
      src/Numerics/LinearAlgebra/Solvers/IterationCountStopCriterium.cs
  31. 3
      src/Numerics/LinearAlgebra/Solvers/IterationStatus.cs
  32. 14
      src/Numerics/LinearAlgebra/Solvers/Iterator.cs
  33. 12
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs
  34. 13
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs
  35. 6
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/FailureStopCriteriumTest.cs
  36. 6
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs
  37. 6
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs
  38. 12
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs
  39. 13
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs
  40. 6
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/FailureStopCriteriumTest.cs
  41. 6
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs
  42. 6
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs
  43. 12
      src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs
  44. 13
      src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs
  45. 6
      src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/FailureStopCriteriumTest.cs
  46. 6
      src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs
  47. 6
      src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs
  48. 12
      src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs
  49. 13
      src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs
  50. 6
      src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/FailureStopCriteriumTest.cs
  51. 6
      src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs
  52. 6
      src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs

22
src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs

@ -91,20 +91,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<Complex> iterator, int iterationNumber, Vector<Complex> result, Vector<Complex> source, Vector<Complex> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the
/// solution vector and x is the unknown vector.
@ -170,7 +156,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
Complex omega = 0;
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, result, input, residuals))
while (iterator.DetermineStatus(iterationNumber, result, input, residuals) == IterationStatus.Continue)
{
// rho_(i-1) = r~^T r_(i-1) // dotproduct r~ and r_(i-1)
var oldRho = currentRho;
@ -229,7 +215,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
temp2.CopyTo(temp);
// Check convergence and stop if we are converged.
if (!ShouldContinue(iterator, iterationNumber, temp, input, vecS))
if (iterator.DetermineStatus(iterationNumber, temp, input, vecS) != IterationStatus.Continue)
{
temp.CopyTo(result);
@ -237,7 +223,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
CalculateTrueResidual(matrix, residuals, result, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// We're all good now.
return;
@ -278,7 +264,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
throw new Exception("Iterative solver experience a numerical break down");
}
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

18
src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs

@ -137,20 +137,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<Complex> iterator, int iterationNumber, Vector<Complex> result, Vector<Complex> source, Vector<Complex> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Decide if to do steps with BiCgStab
/// </summary>
@ -238,7 +224,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
// for (k = 0, 1, .... )
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
while (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) == IterationStatus.Continue)
{
// p_k = r_k + beta_(k-1) * (p_(k-1) - u_(k-1))
p.Subtract(u, temp);
@ -379,7 +365,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
preconditioner.Approximate(xtemp, result);
// Now check for convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

22
src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs

@ -240,20 +240,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<Complex> iterator, int iterationNumber, Vector<Complex> result, Vector<Complex> source, Vector<Complex> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the
/// solution vector and x is the unknown vector.
@ -347,7 +333,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
// FOR (j = 0, 1, 2 ....)
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
while (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) == IterationStatus.Continue)
{
// SOLVE M g~_((j-1)k+k) = g_((j-1)k+k)
preconditioner.Approximate(g[k - 1], gtemp);
@ -405,13 +391,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
temp2.CopyTo(xtemp);
// Check convergence and stop if we are converged.
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// Calculate the true residual
CalculateTrueResidual(matrix, residuals, xtemp, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// We're all good now.
// Exit from the while loop.
@ -540,7 +526,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
temp2.CopyTo(residuals);
// We can check the residuals here if they're close
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

6
src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/DivergenceStopCriterium.cs

@ -77,7 +77,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The array that holds the tracking information.
@ -257,7 +257,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium
}
// Check if we are diverging and if so set the status
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Running;
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
@ -318,7 +318,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_lastIteration = DefaultLastIterationNumber;
_residualHistory = null;
}

6
src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/FailureStopCriterium.cs

@ -56,7 +56,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The iteration number of the last iteration.
@ -99,7 +99,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium
var residualNorm = residualVector.InfinityNorm();
var solutionNorm = solutionVector.InfinityNorm();
_status = double.IsNaN(solutionNorm.Real) || double.IsNaN(residualNorm.Real) ? IterationStatus.Failure : IterationStatus.Running;
_status = double.IsNaN(solutionNorm.Real) || double.IsNaN(residualNorm.Real) ? IterationStatus.Failure : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
@ -122,7 +122,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_lastIteration = DefaultLastIterationNumber;
}

8
src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/ResidualStopCriterium.cs

@ -76,7 +76,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The number of iterations since the residuals got below the maximum.
@ -267,13 +267,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium
if (_lastIteration <= iterationNumber)
{
_iterationCount = iterationNumber - _lastIteration;
_status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Running;
_status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Continue;
}
}
else
{
_iterationCount = 0;
_status = IterationStatus.Running;
_status = IterationStatus.Continue;
}
_lastIteration = iterationNumber;
@ -313,7 +313,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_iterationCount = 0;
_lastIteration = DefaultLastIterationNumber;
}

20
src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs

@ -78,20 +78,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<Complex> iterator, int iterationNumber, Vector<Complex> result, Vector<Complex> source, Vector<Complex> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Is <paramref name="number"/> even?
/// </summary>
@ -174,7 +160,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
// Start the iteration
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, result, input, pseudoResiduals))
while (iterator.DetermineStatus(iterationNumber, result, input, pseudoResiduals) == IterationStatus.Continue)
{
// First part of the step, the even bit
if (IsEven(iterationNumber))
@ -233,7 +219,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
temp2.CopyTo(x);
// Check convergence and see if we can bail
if (!ShouldContinue(iterator, iterationNumber, result, input, pseudoResiduals))
if (iterator.DetermineStatus(iterationNumber, result, input, pseudoResiduals) != IterationStatus.Continue)
{
// Calculate the real values
preconditioner.Approximate(x, result);
@ -244,7 +230,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
CalculateTrueResidual(matrix, temp, result, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, temp))
if (iterator.DetermineStatus(iterationNumber, result, input, temp) != IterationStatus.Continue)
{
// We're all good now.
return;

23
src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs

@ -29,7 +29,6 @@
// </copyright>
using System;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Preconditioners;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.Properties;
@ -85,20 +84,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<Numerics.Complex32> iterator, int iterationNumber, Vector<Numerics.Complex32> result, Vector<Numerics.Complex32> source, Vector<Numerics.Complex32> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the
/// solution vector and x is the unknown vector.
@ -164,7 +149,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
Numerics.Complex32 omega = 0;
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, result, input, residuals))
while (iterator.DetermineStatus(iterationNumber, result, input, residuals) == IterationStatus.Continue)
{
// rho_(i-1) = r~^T r_(i-1) // dotproduct r~ and r_(i-1)
var oldRho = currentRho;
@ -223,7 +208,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
temp2.CopyTo(temp);
// Check convergence and stop if we are converged.
if (!ShouldContinue(iterator, iterationNumber, temp, input, vecS))
if (iterator.DetermineStatus(iterationNumber, temp, input, vecS) != IterationStatus.Continue)
{
temp.CopyTo(result);
@ -231,7 +216,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
CalculateTrueResidual(matrix, residuals, result, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// We're all good now.
return;
@ -272,7 +257,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
throw new Exception("Iterative solver experience a numerical break down");
}
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

18
src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs

@ -130,20 +130,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<Numerics.Complex32> iterator, int iterationNumber, Vector<Numerics.Complex32> result, Vector<Numerics.Complex32> source, Vector<Numerics.Complex32> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Decide if to do steps with BiCgStab
/// </summary>
@ -236,7 +222,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
// for (k = 0, 1, .... )
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
while (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) == IterationStatus.Continue)
{
// p_k = r_k + beta_(k-1) * (p_(k-1) - u_(k-1))
p.Subtract(u, temp);
@ -377,7 +363,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
preconditioner.Approximate(xtemp, result);
// Now check for convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

22
src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs

@ -233,20 +233,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<Numerics.Complex32> iterator, int iterationNumber, Vector<Numerics.Complex32> result, Vector<Numerics.Complex32> source, Vector<Numerics.Complex32> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the
/// solution vector and x is the unknown vector.
@ -345,7 +331,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
// FOR (j = 0, 1, 2 ....)
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
while (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) == IterationStatus.Continue)
{
// SOLVE M g~_((j-1)k+k) = g_((j-1)k+k)
preconditioner.Approximate(g[k - 1], gtemp);
@ -403,13 +389,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
temp2.CopyTo(xtemp);
// Check convergence and stop if we are converged.
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// Calculate the true residual
CalculateTrueResidual(matrix, residuals, xtemp, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// We're all good now.
// Exit from the while loop.
@ -538,7 +524,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
temp2.CopyTo(residuals);
// We can check the residuals here if they're close
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

6
src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/DivergenceStopCriterium.cs

@ -72,7 +72,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The array that holds the tracking information.
@ -252,7 +252,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium
}
// Check if we are diverging and if so set the status
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Running;
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
@ -313,7 +313,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_lastIteration = DefaultLastIterationNumber;
_residualHistory = null;
}

6
src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/FailureStopCriterium.cs

@ -51,7 +51,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The iteration number of the last iteration.
@ -94,7 +94,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium
var residualNorm = residualVector.InfinityNorm();
var solutionNorm = solutionVector.InfinityNorm();
_status = float.IsNaN(solutionNorm.Real) || float.IsNaN(residualNorm.Real) ? IterationStatus.Failure : IterationStatus.Running;
_status = float.IsNaN(solutionNorm.Real) || float.IsNaN(residualNorm.Real) ? IterationStatus.Failure : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
@ -117,7 +117,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_lastIteration = DefaultLastIterationNumber;
}

8
src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/ResidualStopCriterium.cs

@ -71,7 +71,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The number of iterations since the residuals got below the maximum.
@ -262,13 +262,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium
if (_lastIteration <= iterationNumber)
{
_iterationCount = iterationNumber - _lastIteration;
_status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Running;
_status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Continue;
}
}
else
{
_iterationCount = 0;
_status = IterationStatus.Running;
_status = IterationStatus.Continue;
}
_lastIteration = iterationNumber;
@ -308,7 +308,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_iterationCount = 0;
_lastIteration = DefaultLastIterationNumber;
}

20
src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs

@ -70,20 +70,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<Numerics.Complex32> iterator, int iterationNumber, Vector<Numerics.Complex32> result, Vector<Numerics.Complex32> source, Vector<Numerics.Complex32> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Is <paramref name="number"/> even?
/// </summary>
@ -171,7 +157,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
// Start the iteration
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, result, input, pseudoResiduals))
while (iterator.DetermineStatus(iterationNumber, result, input, pseudoResiduals) == IterationStatus.Continue)
{
// First part of the step, the even bit
if (IsEven(iterationNumber))
@ -230,7 +216,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
temp2.CopyTo(x);
// Check convergence and see if we can bail
if (!ShouldContinue(iterator, iterationNumber, result, input, pseudoResiduals))
if (iterator.DetermineStatus(iterationNumber, result, input, pseudoResiduals) != IterationStatus.Continue)
{
// Calculate the real values
preconditioner.Approximate(x, result);
@ -241,7 +227,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
CalculateTrueResidual(matrix, temp, result, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, temp))
if (iterator.DetermineStatus(iterationNumber, result, input, temp) != IterationStatus.Continue)
{
// We're all good now.
return;

22
src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs

@ -84,20 +84,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<double> iterator, int iterationNumber, Vector<double> result, Vector<double> source, Vector<double> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the
/// solution vector and x is the unknown vector.
@ -163,7 +149,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
double omega = 0;
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, result, input, residuals))
while (iterator.DetermineStatus(iterationNumber, result, input, residuals) == IterationStatus.Continue)
{
// rho_(i-1) = r~^T r_(i-1) // dotproduct r~ and r_(i-1)
var oldRho = currentRho;
@ -222,7 +208,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
temp2.CopyTo(temp);
// Check convergence and stop if we are converged.
if (!ShouldContinue(iterator, iterationNumber, temp, input, vecS))
if (iterator.DetermineStatus(iterationNumber, temp, input, vecS) != IterationStatus.Continue)
{
temp.CopyTo(result);
@ -230,7 +216,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
CalculateTrueResidual(matrix, residuals, result, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// We're all good now.
return;
@ -271,7 +257,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
throw new Exception("Iterative solver experience a numerical break down");
}
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

18
src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs

@ -136,20 +136,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<double> iterator, int iterationNumber, Vector<double> result, Vector<double> source, Vector<double> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Decide if to do steps with BiCgStab
/// </summary>
@ -242,7 +228,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
// for (k = 0, 1, .... )
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
while (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) == IterationStatus.Continue)
{
// p_k = r_k + beta_(k-1) * (p_(k-1) - u_(k-1))
p.Subtract(u, temp);
@ -383,7 +369,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
preconditioner.Approximate(xtemp, result);
// Now check for convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

22
src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs

@ -233,20 +233,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<double> iterator, int iterationNumber, Vector<double> result, Vector<double> source, Vector<double> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the
/// solution vector and x is the unknown vector.
@ -345,7 +331,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
// FOR (j = 0, 1, 2 ....)
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
while (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) == IterationStatus.Continue)
{
// SOLVE M g~_((j-1)k+k) = g_((j-1)k+k)
preconditioner.Approximate(g[k - 1], gtemp);
@ -403,13 +389,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
temp2.CopyTo(xtemp);
// Check convergence and stop if we are converged.
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// Calculate the true residual
CalculateTrueResidual(matrix, residuals, xtemp, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// We're all good now.
// Exit from the while loop.
@ -538,7 +524,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
temp2.CopyTo(residuals);
// We can check the residuals here if they're close
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

28
src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/DivergenceStopCriterium.cs

@ -44,7 +44,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// 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.
@ -55,32 +55,32 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// Defines the default last iteration number. Set to -1 because iterations normally
/// start at 0.
/// </summary>
private const int DefaultLastIterationNumber = -1;
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum relative increase the residual may experience without triggering a divergence warning.
/// </summary>
private double _maximumRelativeIncrease;
double _maximumRelativeIncrease;
/// <summary>
/// The number of iterations over which a residual increase should be tracked before issuing a divergence warning.
/// </summary>
private int _minimumNumberOfIterations;
int _minimumNumberOfIterations;
/// <summary>
/// The status of the calculation
/// </summary>
private IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The array that holds the tracking information.
/// </summary>
private double[] _residualHistory;
double[] _residualHistory;
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
private int _lastIteration = DefaultLastIterationNumber;
int _lastIteration = DefaultLastIterationNumber;
/// <summary>
/// Initializes a new instance of the <see cref="DivergenceStopCriterium"/> class with the default maximum
@ -104,7 +104,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// relative increase and the specified minimum number of tracking iterations.
/// </summary>
/// <param name="minimumIterations">The minimum number of iterations over which the residual must grow before a divergence warning is issued. </param>
public DivergenceStopCriterium(int minimumIterations) : this(DefaultMinimumNumberOfIterations, minimumIterations)
public DivergenceStopCriterium(int minimumIterations) : this(DefaultMinimumNumberOfIterations, minimumIterations)
{
}
@ -250,7 +250,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
}
// Check if we are diverging and if so set the status
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Running;
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
@ -260,7 +260,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// Detect if solution is diverging
/// </summary>
/// <returns><c>true</c> if diverging, otherwise <c>false</c></returns>
private bool IsDiverging()
bool IsDiverging()
{
// Run for each variable
for (var i = 1; i < _residualHistory.Length; i++)
@ -270,7 +270,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
// 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]))
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
@ -285,7 +285,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// <summary>
/// Gets required history Length
/// </summary>
private int RequiredHistoryLength
int RequiredHistoryLength
{
[DebuggerStepThrough]
get
@ -311,7 +311,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_lastIteration = DefaultLastIterationNumber;
_residualHistory = null;
}
@ -325,4 +325,4 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
return new DivergenceStopCriterium(_maximumRelativeIncrease, _minimumNumberOfIterations);
}
}
}
}

6
src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/FailureStopCriterium.cs

@ -49,7 +49,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The iteration number of the last iteration.
@ -92,7 +92,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
var residualNorm = residualVector.InfinityNorm();
var solutionNorm = solutionVector.InfinityNorm();
_status = double.IsNaN(solutionNorm) || double.IsNaN(residualNorm) ? IterationStatus.Failure : IterationStatus.Running;
_status = double.IsNaN(solutionNorm) || double.IsNaN(residualNorm) ? IterationStatus.Failure : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
@ -115,7 +115,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_lastIteration = DefaultLastIterationNumber;
}

8
src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/ResidualStopCriterium.cs

@ -69,7 +69,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The number of iterations since the residuals got below the maximum.
@ -260,13 +260,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
if (_lastIteration <= iterationNumber)
{
_iterationCount = iterationNumber - _lastIteration;
_status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Running;
_status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Continue;
}
}
else
{
_iterationCount = 0;
_status = IterationStatus.Running;
_status = IterationStatus.Continue;
}
_lastIteration = iterationNumber;
@ -306,7 +306,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_iterationCount = 0;
_lastIteration = DefaultLastIterationNumber;
}

20
src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs

@ -70,20 +70,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<double> iterator, int iterationNumber, Vector<double> result, Vector<double> source, Vector<double> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Is <paramref name="number"/> even?
/// </summary>
@ -171,7 +157,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
// Start the iteration
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, result, input, pseudoResiduals))
while (iterator.DetermineStatus(iterationNumber, result, input, pseudoResiduals) == IterationStatus.Continue)
{
// First part of the step, the even bit
if (IsEven(iterationNumber))
@ -230,7 +216,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
temp2.CopyTo(x);
// Check convergence and see if we can bail
if (!ShouldContinue(iterator, iterationNumber, result, input, pseudoResiduals))
if (iterator.DetermineStatus(iterationNumber, result, input, pseudoResiduals) != IterationStatus.Continue)
{
// Calculate the real values
preconditioner.Approximate(x, result);
@ -241,7 +227,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
CalculateTrueResidual(matrix, temp, result, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, temp))
if (iterator.DetermineStatus(iterationNumber, result, input, temp) != IterationStatus.Continue)
{
// We're all good now.
return;

22
src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs

@ -84,20 +84,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<float> iterator, int iterationNumber, Vector<float> result, Vector<float> source, Vector<float> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the
/// solution vector and x is the unknown vector.
@ -163,7 +149,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
float omega = 0;
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, result, input, residuals))
while (iterator.DetermineStatus(iterationNumber, result, input, residuals) == IterationStatus.Continue)
{
// rho_(i-1) = r~^T r_(i-1) // dotproduct r~ and r_(i-1)
var oldRho = currentRho;
@ -222,7 +208,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
temp2.CopyTo(temp);
// Check convergence and stop if we are converged.
if (!ShouldContinue(iterator, iterationNumber, temp, input, vecS))
if (iterator.DetermineStatus(iterationNumber, temp, input, vecS) != IterationStatus.Continue)
{
temp.CopyTo(result);
@ -230,7 +216,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
CalculateTrueResidual(matrix, residuals, result, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// We're all good now.
return;
@ -271,7 +257,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
throw new Exception("Iterative solver experience a numerical break down");
}
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

18
src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs

@ -130,20 +130,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<float> iterator, int iterationNumber, Vector<float> result, Vector<float> source, Vector<float> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Decide if to do steps with BiCgStab
/// </summary>
@ -236,7 +222,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
// for (k = 0, 1, .... )
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
while (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) == IterationStatus.Continue)
{
// p_k = r_k + beta_(k-1) * (p_(k-1) - u_(k-1))
p.Subtract(u, temp);
@ -377,7 +363,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
preconditioner.Approximate(xtemp, result);
// Now check for convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, residuals))
if (iterator.DetermineStatus(iterationNumber, result, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

22
src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs

@ -236,20 +236,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<float> iterator, int iterationNumber, Vector<float> result, Vector<float> source, Vector<float> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the
/// solution vector and x is the unknown vector.
@ -348,7 +334,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
// FOR (j = 0, 1, 2 ....)
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
while (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) == IterationStatus.Continue)
{
// SOLVE M g~_((j-1)k+k) = g_((j-1)k+k)
preconditioner.Approximate(g[k - 1], gtemp);
@ -406,13 +392,13 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
temp2.CopyTo(xtemp);
// Check convergence and stop if we are converged.
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// Calculate the true residual
CalculateTrueResidual(matrix, residuals, xtemp, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// We're all good now.
// Exit from the while loop.
@ -541,7 +527,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
temp2.CopyTo(residuals);
// We can check the residuals here if they're close
if (!ShouldContinue(iterator, iterationNumber, xtemp, input, residuals))
if (iterator.DetermineStatus(iterationNumber, xtemp, input, residuals) != IterationStatus.Continue)
{
// Recalculate the residuals and go round again. This is done to ensure that
// we have the proper residuals.

26
src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/DivergenceStopCriterium.cs

@ -44,7 +44,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// 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.
@ -55,32 +55,32 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// Defines the default last iteration number. Set to -1 because iterations normally
/// start at 0.
/// </summary>
private const int DefaultLastIterationNumber = -1;
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The maximum relative increase the residual may experience without triggering a divergence warning.
/// </summary>
private double _maximumRelativeIncrease;
double _maximumRelativeIncrease;
/// <summary>
/// The number of iterations over which a residual increase should be tracked before issuing a divergence warning.
/// </summary>
private int _minimumNumberOfIterations;
int _minimumNumberOfIterations;
/// <summary>
/// The status of the calculation
/// </summary>
private IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The array that holds the tracking information.
/// </summary>
private double[] _residualHistory;
double[] _residualHistory;
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
private int _lastIteration = DefaultLastIterationNumber;
int _lastIteration = DefaultLastIterationNumber;
/// <summary>
/// Initializes a new instance of the <see cref="DivergenceStopCriterium"/> class with the default maximum
@ -104,7 +104,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// relative increase and the specified minimum number of tracking iterations.
/// </summary>
/// <param name="minimumIterations">The minimum number of iterations over which the residual must grow before a divergence warning is issued. </param>
public DivergenceStopCriterium(int minimumIterations) : this(DefaultMinimumNumberOfIterations, minimumIterations)
public DivergenceStopCriterium(int minimumIterations) : this(DefaultMinimumNumberOfIterations, minimumIterations)
{
}
@ -250,7 +250,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
}
// Check if we are diverging and if so set the status
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Running;
_status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
@ -260,7 +260,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// Detect if solution is diverging
/// </summary>
/// <returns><c>true</c> if diverging, otherwise <c>false</c></returns>
private bool IsDiverging()
bool IsDiverging()
{
// Run for each variable
for (var i = 1; i < _residualHistory.Length; i++)
@ -270,7 +270,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
// 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]))
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
@ -285,7 +285,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// <summary>
/// Gets required history Length
/// </summary>
private int RequiredHistoryLength
int RequiredHistoryLength
{
[DebuggerStepThrough]
get
@ -311,7 +311,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_lastIteration = DefaultLastIterationNumber;
_residualHistory = null;
}

10
src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/FailureStopCriterium.cs

@ -44,17 +44,17 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// Defines the default last iteration number. Set to -1 because iterations normally
/// start at 0.
/// </summary>
private const int DefaultLastIterationNumber = -1;
const int DefaultLastIterationNumber = -1;
/// <summary>
/// The status of the calculation
/// </summary>
private IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The iteration number of the last iteration.
/// </summary>
private int _lastIteration = DefaultLastIterationNumber;
int _lastIteration = DefaultLastIterationNumber;
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
@ -92,7 +92,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
var residualNorm = residualVector.InfinityNorm();
var solutionNorm = solutionVector.InfinityNorm();
_status = float.IsNaN(solutionNorm) || float.IsNaN(residualNorm) ? IterationStatus.Failure : IterationStatus.Running;
_status = float.IsNaN(solutionNorm) || float.IsNaN(residualNorm) ? IterationStatus.Failure : IterationStatus.Continue;
_lastIteration = iterationNumber;
return _status;
@ -115,7 +115,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_lastIteration = DefaultLastIterationNumber;
}

8
src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/ResidualStopCriterium.cs

@ -69,7 +69,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// The number of iterations since the residuals got below the maximum.
@ -260,13 +260,13 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
if (_lastIteration <= iterationNumber)
{
_iterationCount = iterationNumber - _lastIteration;
_status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Running;
_status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Continue;
}
}
else
{
_iterationCount = 0;
_status = IterationStatus.Running;
_status = IterationStatus.Continue;
}
_lastIteration = iterationNumber;
@ -306,7 +306,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
_iterationCount = 0;
_lastIteration = DefaultLastIterationNumber;
}

20
src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs

@ -70,20 +70,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
residual.Add(b, residual);
}
/// <summary>
/// Determine if calculation should continue
/// </summary>
/// <param name="iterationNumber">Number of iterations passed</param>
/// <param name="result">Result <see cref="Vector"/>.</param>
/// <param name="source">Source <see cref="Vector"/>.</param>
/// <param name="residuals">Residual <see cref="Vector"/>.</param>
/// <returns><c>true</c> if continue, otherwise <c>false</c></returns>
static bool ShouldContinue(Iterator<float> iterator, int iterationNumber, Vector<float> result, Vector<float> source, Vector<float> residuals)
{
var status = iterator.DetermineStatus(iterationNumber, result, source, residuals);
return status == IterationStatus.Running || status == IterationStatus.Indetermined;
}
/// <summary>
/// Is <paramref name="number"/> even?
/// </summary>
@ -171,7 +157,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
// Start the iteration
var iterationNumber = 0;
while (ShouldContinue(iterator, iterationNumber, result, input, pseudoResiduals))
while (iterator.DetermineStatus(iterationNumber, result, input, pseudoResiduals) == IterationStatus.Continue)
{
// First part of the step, the even bit
if (IsEven(iterationNumber))
@ -230,7 +216,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
temp2.CopyTo(x);
// Check convergence and see if we can bail
if (!ShouldContinue(iterator, iterationNumber, result, input, pseudoResiduals))
if (iterator.DetermineStatus(iterationNumber, result, input, pseudoResiduals) != IterationStatus.Continue)
{
// Calculate the real values
preconditioner.Approximate(x, result);
@ -241,7 +227,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
CalculateTrueResidual(matrix, temp, result, input);
// Now recheck the convergence
if (!ShouldContinue(iterator, iterationNumber, result, input, temp))
if (iterator.DetermineStatus(iterationNumber, result, input, temp) != IterationStatus.Continue)
{
// We're all good now.
return;

4
src/Numerics/LinearAlgebra/Solvers/CancellationStopCriterium.cs

@ -75,7 +75,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
/// </remarks>
public IterationStatus DetermineStatus(int iterationNumber, Vector<T> solutionVector, Vector<T> sourceVector, Vector<T> residualVector)
{
return _currentTcs.Token.IsCancellationRequested ? IterationStatus.Cancelled : IterationStatus.Running;
return _currentTcs.Token.IsCancellationRequested ? IterationStatus.Cancelled : IterationStatus.Continue;
}
/// <summary>
@ -86,7 +86,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
[DebuggerStepThrough]
get
{
return _currentTcs.Token.IsCancellationRequested ? IterationStatus.Cancelled : IterationStatus.Running;
return _currentTcs.Token.IsCancellationRequested ? IterationStatus.Cancelled : IterationStatus.Continue;
}
}

6
src/Numerics/LinearAlgebra/Solvers/IterationCountStopCriterium.cs

@ -53,7 +53,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
/// <summary>
/// The status of the calculation
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// Initializes a new instance of the <see cref="IterationCountStopCriterium{T}"/> class with the default maximum
@ -130,7 +130,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
throw new ArgumentOutOfRangeException("iterationNumber");
}
_status = iterationNumber >= _maximumNumberOfIterations ? IterationStatus.StoppedWithoutConvergence : IterationStatus.Running;
_status = iterationNumber >= _maximumNumberOfIterations ? IterationStatus.StoppedWithoutConvergence : IterationStatus.Continue;
return _status;
}
@ -152,7 +152,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
}
/// <summary>

3
src/Numerics/LinearAlgebra/Solvers/IterationStatus.cs

@ -35,8 +35,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
/// </summary>
public enum IterationStatus
{
Indetermined = 0,
Running,
Continue = 0,
Converged,
Diverged,
StoppedWithoutConvergence,

14
src/Numerics/LinearAlgebra/Solvers/Iterator.cs

@ -49,7 +49,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
/// <summary>
/// The status of the iterator.
/// </summary>
IterationStatus _status = IterationStatus.Indetermined;
IterationStatus _status = IterationStatus.Continue;
/// <summary>
/// Initializes a new instance of the <see cref="Iterator{T}"/> class with the specified stop criteria.
@ -133,13 +133,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
foreach (var stopCriterium in _stopCriteria)
{
var status = stopCriterium.DetermineStatus(iterationNumber, solutionVector, sourceVector, residualVector);
// Check if the status is:
// - Running --> keep going
// - Indetermined --> keep going
// Anything else:
// Stop looping and set that status
if ((status == IterationStatus.Running) || (status == IterationStatus.Indetermined))
if (status == IterationStatus.Continue)
{
continue;
}
@ -150,7 +144,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
// Got all the way through
// So we're running because we had vectors passed to us.
_status = IterationStatus.Running;
_status = IterationStatus.Continue;
return _status;
}
@ -171,7 +165,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers
/// </summary>
public void Reset()
{
_status = IterationStatus.Indetermined;
_status = IterationStatus.Continue;
foreach (var stopCriterium in _stopCriteria)
{

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

@ -102,7 +102,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4));
Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
// Second step, should run out of iterations.
iterator.DetermineStatus(
@ -134,13 +134,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4));
Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
iterator.Reset();
Assert.AreEqual(IterationStatus.Indetermined, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[0].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[1].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[2].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[0].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[1].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[2].Status, "Incorrect status");
}
}
}

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

@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
new DenseVector(new[] {new Complex(1.0, 0)}),
new DenseVector(new[] {new Complex((i + 1)*(Increase + 0.1), 0)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
}
@ -163,7 +163,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
new DenseVector(new[] {new Complex(1.0, 0)}),
new DenseVector(new[] {new Complex((i + 1)*(Increase - 0.01), 0)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
}
@ -187,7 +187,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
new DenseVector(new[] {new Complex(1.0, 0)}),
new DenseVector(new[] {new Complex((i + 1)*(Increase - 0.01), 0)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
// Now make it fail by throwing in a NaN
@ -222,7 +222,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
new DenseVector(new[] {new Complex(1.0, 0)}),
new DenseVector(new[] {new Complex(previous, 0)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
// Add the final residual. Now we should have divergence
@ -261,7 +261,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
Assert.AreEqual(Increase, criterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(Iterations, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Status check fail.");
}
/// <summary>
@ -282,11 +282,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
var clonedCriterium = clone as DivergenceStopCriterium;
Assert.IsNotNull(clonedCriterium);
// ReSharper disable PossibleNullReferenceException
Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(criterium.MinimumNumberOfIterations, clonedCriterium.MinimumNumberOfIterations, "Incorrect iteration count");
// ReSharper restore PossibleNullReferenceException
}
}
}

6
src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/FailureStopCriteriumTest.cs

@ -126,7 +126,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
var residual = new DenseVector(new[] {new Complex(1.0, 0), new Complex(2.0, 0), new Complex(3, 0)});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
}
/// <summary>
@ -143,10 +143,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
var residual = new DenseVector(new[] {new Complex(1000, 0), new Complex(1000, 0), new Complex(2001, 0)});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

6
src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs

@ -99,7 +99,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
Assert.IsNotNull(criterium, "A criterium should have been created");
var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
var status2 = criterium.DetermineStatus(10, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, status2, "Should be finished");
@ -115,10 +115,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
Assert.IsNotNull(criterium, "A criterium should have been created");
var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

6
src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs

@ -239,7 +239,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
var residual = new DenseVector(new[] {new Complex(0.001, 0), new Complex(0.001, 0), new Complex(0.002, 0)});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should still be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should still be running");
var status2 = criterium.DetermineStatus(16, solution, source, residual);
Assert.AreEqual(IterationStatus.Converged, status2, "Should be done");
@ -259,10 +259,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
var residual = new DenseVector(new[] {new Complex(1.000, 0), new Complex(1.000, 0), new Complex(2.001, 0)});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

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

@ -102,7 +102,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4));
Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
// Second step, should run out of iterations.
iterator.DetermineStatus(
@ -134,13 +134,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4));
Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
iterator.Reset();
Assert.AreEqual(IterationStatus.Indetermined, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[0].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[1].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[2].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[0].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[1].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[2].Status, "Incorrect status");
}
}
}

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

@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
new DenseVector(new[] {new Complex32(1.0f, 0)}),
new DenseVector(new[] {new Complex32(1.0f, 0)}),
new DenseVector(new[] {new Complex32((i + 1)*(Increase + 0.1f), 0)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
}
@ -162,7 +162,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
new DenseVector(new[] {new Complex32(1.0f, 0)}),
new DenseVector(new[] {new Complex32((i + 1)*(Increase - 0.01f), 0)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
}
@ -186,7 +186,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
new DenseVector(new[] {new Complex32(1.0f, 0)}),
new DenseVector(new[] {new Complex32((i + 1)*(Increase - 0.01f), 0)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
// Now make it fail by throwing in a NaN
@ -221,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
new DenseVector(new[] {new Complex32(1.0f, 0)}),
new DenseVector(new[] {new Complex32(previous, 0)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
// Add the final residual. Now we should have divergence
@ -260,7 +260,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
Assert.AreEqual(Increase, criterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(Iterations, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Status check fail.");
}
/// <summary>
@ -281,11 +281,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
var clonedCriterium = clone as DivergenceStopCriterium;
Assert.IsNotNull(clonedCriterium);
// ReSharper disable PossibleNullReferenceException
Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(criterium.MinimumNumberOfIterations, clonedCriterium.MinimumNumberOfIterations, "Incorrect iteration count");
// ReSharper restore PossibleNullReferenceException
}
}
}

6
src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/FailureStopCriteriumTest.cs

@ -126,7 +126,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
var residual = new DenseVector(new[] {new Complex32(1.0f, 0), new Complex32(2.0f, 0), new Complex32(3, 0)});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
}
/// <summary>
@ -143,10 +143,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
var residual = new DenseVector(new[] {new Complex32(1000, 0), new Complex32(1000, 0), new Complex32(2001, 0)});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

6
src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs

@ -99,7 +99,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
Assert.IsNotNull(criterium, "A criterium should have been created");
var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
var status2 = criterium.DetermineStatus(10, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, status2, "Should be finished");
@ -115,10 +115,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
Assert.IsNotNull(criterium, "A criterium should have been created");
var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

6
src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs

@ -239,7 +239,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
var residual = new DenseVector(new[] {new Complex32(0.001f, 0), new Complex32(0.001f, 0), new Complex32(0.002f, 0)});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should still be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should still be running");
var status2 = criterium.DetermineStatus(16, solution, source, residual);
Assert.AreEqual(IterationStatus.Converged, status2, "Should be done");
@ -259,10 +259,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr
var residual = new DenseVector(new[] {new Complex32(1.000f, 0), new Complex32(1.000f, 0), new Complex32(2.001f, 0)});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

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

@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4));
Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
// Second step, should run out of iterations.
iterator.DetermineStatus(
@ -132,13 +132,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4));
Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
iterator.Reset();
Assert.AreEqual(IterationStatus.Indetermined, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[0].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[1].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[2].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[0].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[1].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[2].Status, "Incorrect status");
}
}
}

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

@ -137,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
new DenseVector(new[] {1.0}),
new DenseVector(new[] {(i + 1)*(Increase + 0.1)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
}
@ -161,7 +161,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
new DenseVector(new[] {1.0}),
new DenseVector(new[] {(i + 1)*(Increase - 0.01)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
}
@ -185,7 +185,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
new DenseVector(new[] {1.0}),
new DenseVector(new[] {(i + 1)*(Increase - 0.01)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
// Now make it fail by throwing in a NaN
@ -220,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
new DenseVector(new[] {1.0}),
new DenseVector(new[] {previous}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
// Add the final residual. Now we should have divergence
@ -259,7 +259,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
Assert.AreEqual(Increase, criterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(Iterations, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Status check fail.");
}
/// <summary>
@ -280,11 +280,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
var clonedCriterium = clone as DivergenceStopCriterium;
Assert.IsNotNull(clonedCriterium);
// ReSharper disable PossibleNullReferenceException
Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(criterium.MinimumNumberOfIterations, clonedCriterium.MinimumNumberOfIterations, "Incorrect iteration count");
// ReSharper restore PossibleNullReferenceException
}
}
}

6
src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/FailureStopCriteriumTest.cs

@ -124,7 +124,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
var residual = new DenseVector(new[] { 1.0, 2.0, 3.0 });
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
}
/// <summary>
@ -141,10 +141,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
var residual = new DenseVector(new[] { 1000.0, 1000.0, 2001.0 });
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

6
src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs

@ -97,7 +97,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
Assert.IsNotNull(criterium, "A criterium should have been created");
var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
var status2 = criterium.DetermineStatus(10, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, status2, "Should be finished");
@ -113,10 +113,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
Assert.IsNotNull(criterium, "A criterium should have been created");
var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

6
src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs

@ -233,7 +233,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
var residual = new DenseVector(new[] {0.001, 0.001, 0.002});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should still be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should still be running");
var status2 = criterium.DetermineStatus(16, solution, source, residual);
Assert.AreEqual(IterationStatus.Converged, status2, "Should be done");
@ -253,10 +253,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite
var residual = new DenseVector(new[] {1.000, 1.000, 2.001});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

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

@ -100,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4));
Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
// Second step, should run out of iterations.
iterator.DetermineStatus(
@ -132,13 +132,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4),
DenseVector.Create(3, i => 4));
Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
iterator.Reset();
Assert.AreEqual(IterationStatus.Indetermined, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[0].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[1].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Indetermined, criteria[2].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, iterator.Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[0].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[1].Status, "Incorrect status");
Assert.AreEqual(IterationStatus.Continue, criteria[2].Status, "Incorrect status");
}
}
}

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

@ -137,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
new DenseVector(new[] {1.0f}),
new DenseVector(new[] {(i + 1)*(Increase + 0.1f)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
}
@ -161,7 +161,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
new DenseVector(new[] {1.0f}),
new DenseVector(new[] {(i + 1)*(Increase - 0.01f)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
}
@ -185,7 +185,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
new DenseVector(new[] {1.0f}),
new DenseVector(new[] {(i + 1)*(Increase - 0.01f)}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
// Now make it fail by throwing in a NaN
@ -220,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
new DenseVector(new[] {1.0f}),
new DenseVector(new[] {previous}));
Assert.AreEqual(IterationStatus.Running, status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, status, "Status check fail.");
}
// Add the final residual. Now we should have divergence
@ -259,7 +259,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
Assert.AreEqual(Increase, criterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(Iterations, criterium.MinimumNumberOfIterations, "Incorrect iteration count");
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Status check fail.");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Status check fail.");
}
/// <summary>
@ -280,11 +280,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
var clonedCriterium = clone as DivergenceStopCriterium;
Assert.IsNotNull(clonedCriterium);
// ReSharper disable PossibleNullReferenceException
Assert.AreEqual(criterium.MaximumRelativeIncrease, clonedCriterium.MaximumRelativeIncrease, "Incorrect maximum");
Assert.AreEqual(criterium.MinimumNumberOfIterations, clonedCriterium.MinimumNumberOfIterations, "Incorrect iteration count");
// ReSharper restore PossibleNullReferenceException
}
}
}

6
src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/FailureStopCriteriumTest.cs

@ -124,7 +124,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
var residual = new DenseVector(new[] {1.0f, 2.0f, 3.0f});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
}
/// <summary>
@ -141,10 +141,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
var residual = new DenseVector(new[] {1000.0f, 1000.0f, 2001.0f});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

6
src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs

@ -97,7 +97,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
Assert.IsNotNull(criterium, "A criterium should have been created");
var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
var status2 = criterium.DetermineStatus(10, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, status2, "Should be finished");
@ -113,10 +113,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
Assert.IsNotNull(criterium, "A criterium should have been created");
var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3));
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

6
src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs

@ -233,7 +233,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
var residual = new DenseVector(new[] {0.001f, 0.001f, 0.002f});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should still be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should still be running");
var status2 = criterium.DetermineStatus(16, solution, source, residual);
Assert.AreEqual(IterationStatus.Converged, status2, "Should be done");
@ -253,10 +253,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite
var residual = new DenseVector(new[] {1.000f, 1.000f, 2.001f});
var status = criterium.DetermineStatus(5, solution, source, residual);
Assert.AreEqual(IterationStatus.Running, status, "Should be running");
Assert.AreEqual(IterationStatus.Continue, status, "Should be running");
criterium.Reset();
Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started");
Assert.AreEqual(IterationStatus.Continue, criterium.Status, "Should not have started");
}
/// <summary>

Loading…
Cancel
Save