Browse Source

LA: make Iterator generic & shared

pull/163/head
Christoph Ruegg 13 years ago
parent
commit
d1cffeb4c1
  1. 4
      src/Examples/LinearAlgebra/IterativeSolvers/BiCgStabSolver.cs
  2. 3
      src/Examples/LinearAlgebra/IterativeSolvers/CompositeSolverExample.cs
  3. 4
      src/Examples/LinearAlgebra/IterativeSolvers/GpBiCgSolver.cs
  4. 4
      src/Examples/LinearAlgebra/IterativeSolvers/MlkBiCgStabSolver.cs
  5. 4
      src/Examples/LinearAlgebra/IterativeSolvers/TFQMRSolver.cs
  6. 263
      src/Numerics/LinearAlgebra/Complex/Solvers/Iterator.cs
  7. 263
      src/Numerics/LinearAlgebra/Complex32/Solvers/Iterator.cs
  8. 263
      src/Numerics/LinearAlgebra/Double/Solvers/Iterator.cs
  9. 263
      src/Numerics/LinearAlgebra/Single/Solvers/Iterator.cs
  10. 299
      src/Numerics/LinearAlgebra/Solvers/Iterator.cs
  11. 1
      src/Numerics/Numerics.csproj
  12. 11
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/BiCgStabTest.cs
  13. 11
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/GpBiCgTest.cs
  14. 11
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/MlkBiCgStabTest.cs
  15. 11
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/Iterative/TFQMRTest.cs
  16. 43
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs
  17. 12
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/BiCgStabTest.cs
  18. 10
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/GpBiCgTest.cs
  19. 12
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/MlkBiCgStabTest.cs
  20. 12
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/Iterative/TFQMRTest.cs
  21. 43
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs
  22. 12
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/BiCgStabTest.cs
  23. 14
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/GpBiCgTest.cs
  24. 12
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/MlkBiCgStabTest.cs
  25. 12
      src/UnitTests/LinearAlgebraTests/Double/Solvers/Iterative/TFQMRTest.cs
  26. 44
      src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs
  27. 12
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/BiCgStabTest.cs
  28. 12
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/GpBiCgTest.cs
  29. 12
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/MlkBiCgStabTest.cs
  30. 12
      src/UnitTests/LinearAlgebraTests/Single/Solvers/Iterative/TFQMRTest.cs
  31. 44
      src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs

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

@ -27,9 +27,9 @@
using System;
using System.Globalization;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
namespace Examples.LinearAlgebra.IterativeSolversExamples
@ -102,7 +102,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var residualStopCriterium = new ResidualStopCriterium(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
// Create Bi-Conjugate Gradient Stabilized solver
var solver = new BiCgStab(monitor);

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

@ -28,7 +28,6 @@ using System;
using System.Globalization;
using System.Reflection;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
@ -102,7 +101,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var residualStopCriterium = new ResidualStopCriterium(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
// Load all suitable solvers from current assembly. Below in this example, there is user-defined solver
// "class UserBiCgStab : IIterativeSolverSetup<double>" which uses regular BiCgStab solver. But user may create any other solver

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

@ -27,9 +27,9 @@
using System;
using System.Globalization;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
namespace Examples.LinearAlgebra.IterativeSolversExamples
@ -100,7 +100,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var residualStopCriterium = new ResidualStopCriterium(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
// Create Generalized Product Bi-Conjugate Gradient solver
var solver = new GpBiCg(monitor);

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

@ -27,9 +27,9 @@
using System;
using System.Globalization;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
namespace Examples.LinearAlgebra.IterativeSolversExamples
@ -101,7 +101,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var residualStopCriterium = new ResidualStopCriterium(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
// Create Multiple-Lanczos Bi-Conjugate Gradient Stabilized solver
var solver = new MlkBiCgStab(monitor);

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

@ -27,9 +27,9 @@
using System;
using System.Globalization;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
namespace Examples.LinearAlgebra.IterativeSolversExamples
@ -101,7 +101,7 @@ namespace Examples.LinearAlgebra.IterativeSolversExamples
var residualStopCriterium = new ResidualStopCriterium(1e-10);
// Create monitor with defined stop criteriums
var monitor = new Iterator(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[] { iterationCountStopCriterium, residualStopCriterium });
// Create Transpose Free Quasi-Minimal Residual solver
var solver = new TFQMR(monitor);

263
src/Numerics/LinearAlgebra/Complex/Solvers/Iterator.cs

@ -28,14 +28,9 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
{
@ -49,20 +44,15 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
/// <summary>
/// An iterator that is used to check if an iterative calculation should continue or stop.
/// </summary>
public sealed class Iterator : IIterator<Complex>
public static class Iterator
{
/// <summary>
/// The default status for the iterator.
/// </summary>
private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined();
/// <summary>
/// Creates a default iterator with all the <see cref="IIterationStopCriterium{T}"/> objects.
/// </summary>
/// <returns>A new <see cref="IIterator{T}"/> object.</returns>
public static IIterator<Complex> CreateDefault()
{
var iterator = new Iterator();
var iterator = new Iterator<Complex>();
iterator.Add(new FailureStopCriterium());
iterator.Add(new DivergenceStopCriterium());
iterator.Add(new IterationCountStopCriterium<Complex>());
@ -70,254 +60,5 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
return iterator;
}
/// <summary>
/// The collection that holds all the stop criteria and the flag indicating if they should be added
/// to the child iterators.
/// </summary>
private readonly Dictionary<Type, IIterationStopCriterium<Complex>> _stopCriterias = new Dictionary<Type, IIterationStopCriterium<Complex>>();
/// <summary>
/// The status of the iterator.
/// </summary>
private ICalculationStatus _status = DefaultStatus;
/// <summary>
/// Indicates if the iteration was cancelled.
/// </summary>
private bool _wasIterationCancelled;
/// <summary>
/// Initializes a new instance of the <see cref="Iterator"/> class.
/// </summary>
public Iterator() : this(null)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="Iterator"/> class with the specified stop criteria.
/// </summary>
/// <param name="stopCriteria">
/// The specified stop criteria. Only one stop criterium of each type can be passed in. None
/// of the stop criteria will be passed on to child iterators.
/// </param>
/// <exception cref="ArgumentException">Thrown if <paramref name="stopCriteria"/> contains multiple stop criteria of the same type.</exception>
public Iterator(IEnumerable<IIterationStopCriterium<Complex>> stopCriteria)
{
// Add the stop criteria
if (stopCriteria == null)
{
return;
}
foreach (var stopCriterium in stopCriteria.Where(stopCriterium => stopCriterium != null))
{
Add(stopCriterium);
}
}
/// <summary>
/// Adds an <see cref="IIterationStopCriterium{T}"/> to the internal collection of stop-criteria. Only a
/// single stop criterium of each type can be stored.
/// </summary>
/// <param name="stopCriterium">The stop criterium to add.</param>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="stopCriterium"/> is <see langword="null" />.</exception>
/// <exception cref="ArgumentException">
/// Thrown if <paramref name="stopCriterium"/> is of the same type as an already
/// stored criterium.
/// </exception>
public void Add(IIterationStopCriterium<Complex> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
throw new ArgumentException(Resources.StopCriteriumDuplicate);
}
// Store the stop criterium.
_stopCriterias.Add(stopCriterium.GetType(), stopCriterium);
}
/// <summary>
/// Removes the <see cref="IIterationStopCriterium{T}"/> from the internal collection.
/// </summary>
/// <param name="stopCriterium">The stop criterium that must be removed.</param>
public void Remove(IIterationStopCriterium<Complex> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (!_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
return;
}
// Remove from the collection
_stopCriterias.Remove(stopCriterium.GetType());
}
/// <summary>
/// Indicates if the specific stop criterium is stored by the <see cref="IIterator{T}"/>.
/// </summary>
/// <param name="stopCriterium">The stop criterium.</param>
/// <returns><c>true</c> if the <see cref="IIterator{T}"/> contains the stop criterium; otherwise <c>false</c>.</returns>
public bool Contains(IIterationStopCriterium<Complex> stopCriterium)
{
return stopCriterium != null && _stopCriterias.ContainsKey(stopCriterium.GetType());
}
/// <summary>
/// Gets the number of stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal int NumberOfCriteria
{
get
{
return _stopCriterias.Count;
}
}
/// <summary>
/// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal IEnumerable<IIterationStopCriterium<Complex>> StoredStopCriteria
{
get
{
return _stopCriterias.Select(criterium => criterium.Value);
}
}
/// <summary>
/// Indicates to the iterator that the iterative process has been cancelled.
/// </summary>
/// <remarks>
/// Does not reset the stop-criteria.
/// </remarks>
public void IterationCancelled()
{
_wasIterationCancelled = true;
_status = new CalculationCancelled();
}
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
/// by the current <c>IIterator</c>. Result is set into <c>Status</c> field.
/// </summary>
/// <param name="iterationNumber">The number of iterations that have passed so far.</param>
/// <param name="solutionVector">The vector containing the current solution values.</param>
/// <param name="sourceVector">The right hand side vector.</param>
/// <param name="residualVector">The vector containing the current residual vectors.</param>
/// <remarks>
/// The individual iterators may internally track the progress of the calculation based
/// on the invocation of this method. Therefore this method should only be called if the
/// calculation has moved forwards at least one step.
/// </remarks>
public void DetermineStatus(int iterationNumber, Vector<Complex> solutionVector, Vector<Complex> sourceVector, Vector<Complex> residualVector)
{
if (_stopCriterias.Count == 0)
{
throw new ArgumentException(Resources.StopCriteriumMissing);
}
if (iterationNumber < 0)
{
throw new ArgumentOutOfRangeException("iterationNumber");
}
if (solutionVector == null)
{
throw new ArgumentNullException("solutionVector");
}
if (sourceVector == null)
{
throw new ArgumentNullException("sourceVector");
}
if (residualVector == null)
{
throw new ArgumentNullException("residualVector");
}
// While we're cancelled we don't call on the stop-criteria.
if (_wasIterationCancelled)
{
return;
}
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.DetermineStatus(iterationNumber, solutionVector, sourceVector, residualVector);
var status = stopCriterium.Status;
// Check if the status is:
// - Running --> keep going
// - Indetermined --> keep going
// Anything else:
// Stop looping and set that status
if ((status is CalculationRunning) || (status is CalculationIndetermined))
{
continue;
}
_status = status;
return;
}
// Got all the way through
// So we're running because we had vectors passed to us.
if (!(_status is CalculationRunning))
{
_status = new CalculationRunning();
}
}
/// <summary>
/// Gets the current calculation status.
/// </summary>
public ICalculationStatus Status
{
get
{
return _status;
}
}
/// <summary>
/// Resets the <see cref="IIterator{T}"/> to the pre-calculation state.
/// </summary>
public void ResetToPrecalculationState()
{
// Indicate that we're no longer cancelled.
_wasIterationCancelled = false;
// Reset the status.
_status = DefaultStatus;
// Reset the stop-criteria
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.ResetToPrecalculationState();
}
}
/// <summary>
/// Creates a deep clone of the current iterator.
/// </summary>
/// <returns>The deep clone of the current iterator.</returns>
public IIterator<Complex> Clone()
{
var stopCriteria = _stopCriterias.Select(pair => pair.Value).Select(stopCriterium => stopCriterium.Clone()).ToList();
return new Iterator(stopCriteria);
}
}
}

263
src/Numerics/LinearAlgebra/Complex32/Solvers/Iterator.cs

@ -28,14 +28,9 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
{
@ -44,20 +39,15 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
/// <summary>
/// An iterator that is used to check if an iterative calculation should continue or stop.
/// </summary>
public sealed class Iterator : IIterator<Complex32>
public static class Iterator
{
/// <summary>
/// The default status for the iterator.
/// </summary>
private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined();
/// <summary>
/// Creates a default iterator with all the <see cref="IIterationStopCriterium{T}"/> objects.
/// </summary>
/// <returns>A new <see cref="IIterator{T}"/> object.</returns>
public static IIterator<Complex32> CreateDefault()
{
var iterator = new Iterator();
var iterator = new Iterator<Complex32>();
iterator.Add(new FailureStopCriterium());
iterator.Add(new DivergenceStopCriterium());
iterator.Add(new IterationCountStopCriterium<Complex32>());
@ -65,254 +55,5 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
return iterator;
}
/// <summary>
/// The collection that holds all the stop criteria and the flag indicating if they should be added
/// to the child iterators.
/// </summary>
private readonly Dictionary<Type, IIterationStopCriterium<Complex32>> _stopCriterias = new Dictionary<Type, IIterationStopCriterium<Complex32>>();
/// <summary>
/// The status of the iterator.
/// </summary>
private ICalculationStatus _status = DefaultStatus;
/// <summary>
/// Indicates if the iteration was cancelled.
/// </summary>
private bool _wasIterationCancelled;
/// <summary>
/// Initializes a new instance of the <see cref="Iterator"/> class.
/// </summary>
public Iterator() : this(null)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="Iterator"/> class with the specified stop criteria.
/// </summary>
/// <param name="stopCriteria">
/// The specified stop criteria. Only one stop criterium of each type can be passed in. None
/// of the stop criteria will be passed on to child iterators.
/// </param>
/// <exception cref="ArgumentException">Thrown if <paramref name="stopCriteria"/> contains multiple stop criteria of the same type.</exception>
public Iterator(IEnumerable<IIterationStopCriterium<Complex32>> stopCriteria)
{
// Add the stop criteria
if (stopCriteria == null)
{
return;
}
foreach (var stopCriterium in stopCriteria.Where(stopCriterium => stopCriterium != null))
{
Add(stopCriterium);
}
}
/// <summary>
/// Adds an <see cref="IIterationStopCriterium{T}"/> to the internal collection of stop-criteria. Only a
/// single stop criterium of each type can be stored.
/// </summary>
/// <param name="stopCriterium">The stop criterium to add.</param>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="stopCriterium"/> is <see langword="null" />.</exception>
/// <exception cref="ArgumentException">
/// Thrown if <paramref name="stopCriterium"/> is of the same type as an already
/// stored criterium.
/// </exception>
public void Add(IIterationStopCriterium<Complex32> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
throw new ArgumentException(Resources.StopCriteriumDuplicate);
}
// Store the stop criterium.
_stopCriterias.Add(stopCriterium.GetType(), stopCriterium);
}
/// <summary>
/// Removes the <see cref="IIterationStopCriterium{T}"/> from the internal collection.
/// </summary>
/// <param name="stopCriterium">The stop criterium that must be removed.</param>
public void Remove(IIterationStopCriterium<Complex32> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (!_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
return;
}
// Remove from the collection
_stopCriterias.Remove(stopCriterium.GetType());
}
/// <summary>
/// Indicates if the specific stop criterium is stored by the <see cref="IIterator{T}"/>.
/// </summary>
/// <param name="stopCriterium">The stop criterium.</param>
/// <returns><c>true</c> if the <see cref="IIterator{T}"/> contains the stop criterium; otherwise <c>false</c>.</returns>
public bool Contains(IIterationStopCriterium<Complex32> stopCriterium)
{
return stopCriterium != null && _stopCriterias.ContainsKey(stopCriterium.GetType());
}
/// <summary>
/// Gets the number of stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal int NumberOfCriteria
{
get
{
return _stopCriterias.Count;
}
}
/// <summary>
/// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal IEnumerable<IIterationStopCriterium<Complex32>> StoredStopCriteria
{
get
{
return _stopCriterias.Select(criterium => criterium.Value);
}
}
/// <summary>
/// Indicates to the iterator that the iterative process has been cancelled.
/// </summary>
/// <remarks>
/// Does not reset the stop-criteria.
/// </remarks>
public void IterationCancelled()
{
_wasIterationCancelled = true;
_status = new CalculationCancelled();
}
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
/// by the current <c>IIterator</c>. Result is set into <c>Status</c> field.
/// </summary>
/// <param name="iterationNumber">The number of iterations that have passed so far.</param>
/// <param name="solutionVector">The vector containing the current solution values.</param>
/// <param name="sourceVector">The right hand side vector.</param>
/// <param name="residualVector">The vector containing the current residual vectors.</param>
/// <remarks>
/// The individual iterators may internally track the progress of the calculation based
/// on the invocation of this method. Therefore this method should only be called if the
/// calculation has moved forwards at least one step.
/// </remarks>
public void DetermineStatus(int iterationNumber, Vector<Complex32> solutionVector, Vector<Complex32> sourceVector, Vector<Complex32> residualVector)
{
if (_stopCriterias.Count == 0)
{
throw new ArgumentException(Resources.StopCriteriumMissing);
}
if (iterationNumber < 0)
{
throw new ArgumentOutOfRangeException("iterationNumber");
}
if (solutionVector == null)
{
throw new ArgumentNullException("solutionVector");
}
if (sourceVector == null)
{
throw new ArgumentNullException("sourceVector");
}
if (residualVector == null)
{
throw new ArgumentNullException("residualVector");
}
// While we're cancelled we don't call on the stop-criteria.
if (_wasIterationCancelled)
{
return;
}
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.DetermineStatus(iterationNumber, solutionVector, sourceVector, residualVector);
var status = stopCriterium.Status;
// Check if the status is:
// - Running --> keep going
// - Indetermined --> keep going
// Anything else:
// Stop looping and set that status
if ((status is CalculationRunning) || (status is CalculationIndetermined))
{
continue;
}
_status = status;
return;
}
// Got all the way through
// So we're running because we had vectors passed to us.
if (!(_status is CalculationRunning))
{
_status = new CalculationRunning();
}
}
/// <summary>
/// Gets the current calculation status.
/// </summary>
public ICalculationStatus Status
{
get
{
return _status;
}
}
/// <summary>
/// Resets the <see cref="IIterator{T}"/> to the pre-calculation state.
/// </summary>
public void ResetToPrecalculationState()
{
// Indicate that we're no longer cancelled.
_wasIterationCancelled = false;
// Reset the status.
_status = DefaultStatus;
// Reset the stop-criteria
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.ResetToPrecalculationState();
}
}
/// <summary>
/// Creates a deep clone of the current iterator.
/// </summary>
/// <returns>The deep clone of the current iterator.</returns>
public IIterator<Complex32> Clone()
{
var stopCriteria = _stopCriterias.Select(pair => pair.Value).Select(stopCriterium => stopCriterium.Clone()).ToList();
return new Iterator(stopCriteria);
}
}
}

263
src/Numerics/LinearAlgebra/Double/Solvers/Iterator.cs

@ -28,34 +28,24 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
{
/// <summary>
/// An iterator that is used to check if an iterative calculation should continue or stop.
/// </summary>
public sealed class Iterator : IIterator<double>
public static class Iterator
{
/// <summary>
/// The default status for the iterator.
/// </summary>
private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined();
/// <summary>
/// Creates a default iterator with all the <see cref="IIterationStopCriterium{T}"/> objects.
/// </summary>
/// <returns>A new <see cref="IIterator{T}"/> object.</returns>
public static IIterator<double> CreateDefault()
{
var iterator = new Iterator();
var iterator = new Iterator<double>();
iterator.Add(new FailureStopCriterium());
iterator.Add(new DivergenceStopCriterium());
iterator.Add(new IterationCountStopCriterium<double>());
@ -63,254 +53,5 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
return iterator;
}
/// <summary>
/// The collection that holds all the stop criteria and the flag indicating if they should be added
/// to the child iterators.
/// </summary>
private readonly Dictionary<Type, IIterationStopCriterium<double>> _stopCriterias = new Dictionary<Type, IIterationStopCriterium<double>>();
/// <summary>
/// The status of the iterator.
/// </summary>
private ICalculationStatus _status = DefaultStatus;
/// <summary>
/// Indicates if the iteration was canceled.
/// </summary>
private bool _wasIterationCancelled;
/// <summary>
/// Initializes a new instance of the <see cref="Iterator"/> class.
/// </summary>
public Iterator() : this(null)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="Iterator"/> class with the specified stop criteria.
/// </summary>
/// <param name="stopCriteria">
/// The specified stop criteria. Only one stop criterium of each type can be passed in. None
/// of the stop criteria will be passed on to child iterators.
/// </param>
/// <exception cref="ArgumentException">Thrown if <paramref name="stopCriteria"/> contains multiple stop criteria of the same type.</exception>
public Iterator(IEnumerable<IIterationStopCriterium<double>> stopCriteria)
{
// Add the stop criteria
if (stopCriteria == null)
{
return;
}
foreach (var stopCriterium in stopCriteria.Where(stopCriterium => stopCriterium != null))
{
Add(stopCriterium);
}
}
/// <summary>
/// Adds an <see cref="IIterationStopCriterium{T}"/> to the internal collection of stop-criteria. Only a
/// single stop criterium of each type can be stored.
/// </summary>
/// <param name="stopCriterium">The stop criterium to add.</param>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="stopCriterium"/> is <see langword="null" />.</exception>
/// <exception cref="ArgumentException">
/// Thrown if <paramref name="stopCriterium"/> is of the same type as an already
/// stored criterium.
/// </exception>
public void Add(IIterationStopCriterium<double> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
throw new ArgumentException(Resources.StopCriteriumDuplicate);
}
// Store the stop criterium.
_stopCriterias.Add(stopCriterium.GetType(), stopCriterium);
}
/// <summary>
/// Removes the <see cref="IIterationStopCriterium{T}"/> from the internal collection.
/// </summary>
/// <param name="stopCriterium">The stop criterium that must be removed.</param>
public void Remove(IIterationStopCriterium<double> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (!_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
return;
}
// Remove from the collection
_stopCriterias.Remove(stopCriterium.GetType());
}
/// <summary>
/// Indicates if the specific stop criterium is stored by the <see cref="IIterator{T}"/>.
/// </summary>
/// <param name="stopCriterium">The stop criterium.</param>
/// <returns><c>true</c> if the <see cref="IIterator{T}"/> contains the stop criterium; otherwise <c>false</c>.</returns>
public bool Contains(IIterationStopCriterium<double> stopCriterium)
{
return stopCriterium != null && _stopCriterias.ContainsKey(stopCriterium.GetType());
}
/// <summary>
/// Gets the number of stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal int NumberOfCriteria
{
get
{
return _stopCriterias.Count;
}
}
/// <summary>
/// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal IEnumerable<IIterationStopCriterium<double>> StoredStopCriteria
{
get
{
return _stopCriterias.Select(criterium => criterium.Value);
}
}
/// <summary>
/// Indicates to the iterator that the iterative process has been cancelled.
/// </summary>
/// <remarks>
/// Does not reset the stop-criteria.
/// </remarks>
public void IterationCancelled()
{
_wasIterationCancelled = true;
_status = new CalculationCancelled();
}
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
/// by the current <see cref="IIterator{T}"/>. Result is set into <c>Status</c> field.
/// </summary>
/// <param name="iterationNumber">The number of iterations that have passed so far.</param>
/// <param name="solutionVector">The vector containing the current solution values.</param>
/// <param name="sourceVector">The right hand side vector.</param>
/// <param name="residualVector">The vector containing the current residual vectors.</param>
/// <remarks>
/// The individual iterators may internally track the progress of the calculation based
/// on the invocation of this method. Therefore this method should only be called if the
/// calculation has moved forwards at least one step.
/// </remarks>
public void DetermineStatus(int iterationNumber, Vector<double> solutionVector, Vector<double> sourceVector, Vector<double> residualVector)
{
if (_stopCriterias.Count == 0)
{
throw new ArgumentException(Resources.StopCriteriumMissing);
}
if (iterationNumber < 0)
{
throw new ArgumentOutOfRangeException("iterationNumber");
}
if (solutionVector == null)
{
throw new ArgumentNullException("solutionVector");
}
if (sourceVector == null)
{
throw new ArgumentNullException("sourceVector");
}
if (residualVector == null)
{
throw new ArgumentNullException("residualVector");
}
// While we're cancelled we don't call on the stop-criteria.
if (_wasIterationCancelled)
{
return;
}
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.DetermineStatus(iterationNumber, solutionVector, sourceVector, residualVector);
var status = stopCriterium.Status;
// Check if the status is:
// - Running --> keep going
// - Indetermined --> keep going
// Anything else:
// Stop looping and set that status
if ((status is CalculationRunning) || (status is CalculationIndetermined))
{
continue;
}
_status = status;
return;
}
// Got all the way through
// So we're running because we had vectors passed to us.
if (!(_status is CalculationRunning))
{
_status = new CalculationRunning();
}
}
/// <summary>
/// Gets the current calculation status.
/// </summary>
public ICalculationStatus Status
{
get
{
return _status;
}
}
/// <summary>
/// Resets the <see cref="IIterator{T}"/> to the pre-calculation state.
/// </summary>
public void ResetToPrecalculationState()
{
// Indicate that we're no longer cancelled.
_wasIterationCancelled = false;
// Reset the status.
_status = DefaultStatus;
// Reset the stop-criteria
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.ResetToPrecalculationState();
}
}
/// <summary>
/// Creates a deep clone of the current iterator.
/// </summary>
/// <returns>The deep clone of the current iterator.</returns>
public IIterator<double> Clone()
{
var stopCriteria = _stopCriterias.Select(pair => pair.Value).Select(stopCriterium => stopCriterium.Clone()).ToList();
return new Iterator(stopCriteria);
}
}
}

263
src/Numerics/LinearAlgebra/Single/Solvers/Iterator.cs

@ -28,34 +28,24 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
{
/// <summary>
/// An iterator that is used to check if an iterative calculation should continue or stop.
/// </summary>
public sealed class Iterator : IIterator<float>
public static class Iterator
{
/// <summary>
/// The default status for the iterator.
/// </summary>
private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined();
/// <summary>
/// Creates a default iterator with all the <see cref="IIterationStopCriterium{T}"/> objects.
/// </summary>
/// <returns>A new <see cref="IIterator{T}"/> object.</returns>
public static IIterator<float> CreateDefault()
{
var iterator = new Iterator();
var iterator = new Iterator<float>();
iterator.Add(new FailureStopCriterium());
iterator.Add(new DivergenceStopCriterium());
iterator.Add(new IterationCountStopCriterium<float>());
@ -63,254 +53,5 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
return iterator;
}
/// <summary>
/// The collection that holds all the stop criteria and the flag indicating if they should be added
/// to the child iterators.
/// </summary>
private readonly Dictionary<Type, IIterationStopCriterium<float>> _stopCriterias = new Dictionary<Type, IIterationStopCriterium<float>>();
/// <summary>
/// The status of the iterator.
/// </summary>
private ICalculationStatus _status = DefaultStatus;
/// <summary>
/// Indicates if the iteration was cancelled.
/// </summary>
private bool _wasIterationCancelled;
/// <summary>
/// Initializes a new instance of the <see cref="Iterator"/> class.
/// </summary>
public Iterator() : this(null)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="Iterator"/> class with the specified stop criteria.
/// </summary>
/// <param name="stopCriteria">
/// The specified stop criteria. Only one stop criterium of each type can be passed in. None
/// of the stop criteria will be passed on to child iterators.
/// </param>
/// <exception cref="ArgumentException">Thrown if <paramref name="stopCriteria"/> contains multiple stop criteria of the same type.</exception>
public Iterator(IEnumerable<IIterationStopCriterium<float>> stopCriteria)
{
// Add the stop criteria
if (stopCriteria == null)
{
return;
}
foreach (var stopCriterium in stopCriteria.Where(stopCriterium => stopCriterium != null))
{
Add(stopCriterium);
}
}
/// <summary>
/// Adds an <see cref="IIterationStopCriterium{T}"/> to the internal collection of stop-criteria. Only a
/// single stop criterium of each type can be stored.
/// </summary>
/// <param name="stopCriterium">The stop criterium to add.</param>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="stopCriterium"/> is <see langword="null" />.</exception>
/// <exception cref="ArgumentException">
/// Thrown if <paramref name="stopCriterium"/> is of the same type as an already
/// stored criterium.
/// </exception>
public void Add(IIterationStopCriterium<float> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
throw new ArgumentException(Resources.StopCriteriumDuplicate);
}
// Store the stop criterium.
_stopCriterias.Add(stopCriterium.GetType(), stopCriterium);
}
/// <summary>
/// Removes the <see cref="IIterationStopCriterium{T}"/> from the internal collection.
/// </summary>
/// <param name="stopCriterium">The stop criterium that must be removed.</param>
public void Remove(IIterationStopCriterium<float> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (!_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
return;
}
// Remove from the collection
_stopCriterias.Remove(stopCriterium.GetType());
}
/// <summary>
/// Indicates if the specific stop criterium is stored by the <see cref="IIterator{T}"/>.
/// </summary>
/// <param name="stopCriterium">The stop criterium.</param>
/// <returns><c>true</c> if the <see cref="IIterator{T}"/> contains the stop criterium; otherwise <c>false</c>.</returns>
public bool Contains(IIterationStopCriterium<float> stopCriterium)
{
return stopCriterium != null && _stopCriterias.ContainsKey(stopCriterium.GetType());
}
/// <summary>
/// Gets the number of stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal int NumberOfCriteria
{
get
{
return _stopCriterias.Count;
}
}
/// <summary>
/// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal IEnumerable<IIterationStopCriterium<float>> StoredStopCriteria
{
get
{
return _stopCriterias.Select(criterium => criterium.Value);
}
}
/// <summary>
/// Indicates to the iterator that the iterative process has been cancelled.
/// </summary>
/// <remarks>
/// Does not reset the stop-criteria.
/// </remarks>
public void IterationCancelled()
{
_wasIterationCancelled = true;
_status = new CalculationCancelled();
}
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
/// by the current <see cref="IIterator{T}"/>. Result is set into <c>Status</c> field.
/// </summary>
/// <param name="iterationNumber">The number of iterations that have passed so far.</param>
/// <param name="solutionVector">The vector containing the current solution values.</param>
/// <param name="sourceVector">The right hand side vector.</param>
/// <param name="residualVector">The vector containing the current residual vectors.</param>
/// <remarks>
/// The individual iterators may internally track the progress of the calculation based
/// on the invocation of this method. Therefore this method should only be called if the
/// calculation has moved forwards at least one step.
/// </remarks>
public void DetermineStatus(int iterationNumber, Vector<float> solutionVector, Vector<float> sourceVector, Vector<float> residualVector)
{
if (_stopCriterias.Count == 0)
{
throw new ArgumentException(Resources.StopCriteriumMissing);
}
if (iterationNumber < 0)
{
throw new ArgumentOutOfRangeException("iterationNumber");
}
if (solutionVector == null)
{
throw new ArgumentNullException("solutionVector");
}
if (sourceVector == null)
{
throw new ArgumentNullException("sourceVector");
}
if (residualVector == null)
{
throw new ArgumentNullException("residualVector");
}
// While we're cancelled we don't call on the stop-criteria.
if (_wasIterationCancelled)
{
return;
}
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.DetermineStatus(iterationNumber, solutionVector, sourceVector, residualVector);
var status = stopCriterium.Status;
// Check if the status is:
// - Running --> keep going
// - Indetermined --> keep going
// Anything else:
// Stop looping and set that status
if ((status is CalculationRunning) || (status is CalculationIndetermined))
{
continue;
}
_status = status;
return;
}
// Got all the way through
// So we're running because we had vectors passed to us.
if (!(_status is CalculationRunning))
{
_status = new CalculationRunning();
}
}
/// <summary>
/// Gets the current calculation status.
/// </summary>
public ICalculationStatus Status
{
get
{
return _status;
}
}
/// <summary>
/// Resets the <see cref="IIterator{T}"/> to the pre-calculation state.
/// </summary>
public void ResetToPrecalculationState()
{
// Indicate that we're no longer cancelled.
_wasIterationCancelled = false;
// Reset the status.
_status = DefaultStatus;
// Reset the stop-criteria
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.ResetToPrecalculationState();
}
}
/// <summary>
/// Creates a deep clone of the current iterator.
/// </summary>
/// <returns>The deep clone of the current iterator.</returns>
public IIterator<float> Clone()
{
var stopCriteria = _stopCriterias.Select(pair => pair.Value).Select(stopCriterium => stopCriterium.Clone()).ToList();
return new Iterator(stopCriteria);
}
}
}

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

@ -0,0 +1,299 @@
// <copyright file="Iterator.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
//
// Copyright (c) 2009-2010 Math.NET
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Solvers
{
/// <summary>
/// An iterator that is used to check if an iterative calculation should continue or stop.
/// </summary>
public sealed class Iterator<T> : IIterator<T> where T : struct, IEquatable<T>, IFormattable
{
/// <summary>
/// The default status for the iterator.
/// </summary>
private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined();
/// <summary>
/// The collection that holds all the stop criteria and the flag indicating if they should be added
/// to the child iterators.
/// </summary>
private readonly Dictionary<Type, IIterationStopCriterium<T>> _stopCriterias = new Dictionary<Type, IIterationStopCriterium<T>>();
/// <summary>
/// The status of the iterator.
/// </summary>
private ICalculationStatus _status = DefaultStatus;
/// <summary>
/// Indicates if the iteration was canceled.
/// </summary>
private bool _wasIterationCancelled;
/// <summary>
/// Initializes a new instance of the <see cref="Iterator{T}"/> class.
/// </summary>
public Iterator() : this(null)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="Iterator{T}"/> class with the specified stop criteria.
/// </summary>
/// <param name="stopCriteria">
/// The specified stop criteria. Only one stop criterium of each type can be passed in. None
/// of the stop criteria will be passed on to child iterators.
/// </param>
/// <exception cref="ArgumentException">Thrown if <paramref name="stopCriteria"/> contains multiple stop criteria of the same type.</exception>
public Iterator(IEnumerable<IIterationStopCriterium<T>> stopCriteria)
{
// Add the stop criteria
if (stopCriteria == null)
{
return;
}
foreach (var stopCriterium in stopCriteria.Where(stopCriterium => stopCriterium != null))
{
Add(stopCriterium);
}
}
/// <summary>
/// Adds an <see cref="IIterationStopCriterium{T}"/> to the internal collection of stop-criteria. Only a
/// single stop criterium of each type can be stored.
/// </summary>
/// <param name="stopCriterium">The stop criterium to add.</param>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="stopCriterium"/> is <see langword="null" />.</exception>
/// <exception cref="ArgumentException">
/// Thrown if <paramref name="stopCriterium"/> is of the same type as an already
/// stored criterium.
/// </exception>
public void Add(IIterationStopCriterium<T> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
throw new ArgumentException(Resources.StopCriteriumDuplicate);
}
// Store the stop criterium.
_stopCriterias.Add(stopCriterium.GetType(), stopCriterium);
}
/// <summary>
/// Removes the <see cref="IIterationStopCriterium{T}"/> from the internal collection.
/// </summary>
/// <param name="stopCriterium">The stop criterium that must be removed.</param>
public void Remove(IIterationStopCriterium<T> stopCriterium)
{
if (stopCriterium == null)
{
throw new ArgumentNullException("stopCriterium");
}
if (!_stopCriterias.ContainsKey(stopCriterium.GetType()))
{
return;
}
// Remove from the collection
_stopCriterias.Remove(stopCriterium.GetType());
}
/// <summary>
/// Indicates if the specific stop criterium is stored by the <see cref="IIterator{T}"/>.
/// </summary>
/// <param name="stopCriterium">The stop criterium.</param>
/// <returns><c>true</c> if the <see cref="IIterator{T}"/> contains the stop criterium; otherwise <c>false</c>.</returns>
public bool Contains(IIterationStopCriterium<T> stopCriterium)
{
return stopCriterium != null && _stopCriterias.ContainsKey(stopCriterium.GetType());
}
/// <summary>
/// Gets the number of stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal int NumberOfCriteria
{
get
{
return _stopCriterias.Count;
}
}
/// <summary>
/// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria.
/// </summary>
/// <remarks>Used for testing only.</remarks>
internal IEnumerable<IIterationStopCriterium<T>> StoredStopCriteria
{
get
{
return _stopCriterias.Select(criterium => criterium.Value);
}
}
/// <summary>
/// Indicates to the iterator that the iterative process has been cancelled.
/// </summary>
/// <remarks>
/// Does not reset the stop-criteria.
/// </remarks>
public void IterationCancelled()
{
_wasIterationCancelled = true;
_status = new CalculationCancelled();
}
/// <summary>
/// Determines the status of the iterative calculation based on the stop criteria stored
/// by the current <see cref="IIterator{T}"/>. Result is set into <c>Status</c> field.
/// </summary>
/// <param name="iterationNumber">The number of iterations that have passed so far.</param>
/// <param name="solutionVector">The vector containing the current solution values.</param>
/// <param name="sourceVector">The right hand side vector.</param>
/// <param name="residualVector">The vector containing the current residual vectors.</param>
/// <remarks>
/// The individual iterators may internally track the progress of the calculation based
/// on the invocation of this method. Therefore this method should only be called if the
/// calculation has moved forwards at least one step.
/// </remarks>
public void DetermineStatus(int iterationNumber, Vector<T> solutionVector, Vector<T> sourceVector, Vector<T> residualVector)
{
if (_stopCriterias.Count == 0)
{
throw new ArgumentException(Resources.StopCriteriumMissing);
}
if (iterationNumber < 0)
{
throw new ArgumentOutOfRangeException("iterationNumber");
}
if (solutionVector == null)
{
throw new ArgumentNullException("solutionVector");
}
if (sourceVector == null)
{
throw new ArgumentNullException("sourceVector");
}
if (residualVector == null)
{
throw new ArgumentNullException("residualVector");
}
// While we're cancelled we don't call on the stop-criteria.
if (_wasIterationCancelled)
{
return;
}
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.DetermineStatus(iterationNumber, solutionVector, sourceVector, residualVector);
var status = stopCriterium.Status;
// Check if the status is:
// - Running --> keep going
// - Indetermined --> keep going
// Anything else:
// Stop looping and set that status
if ((status is CalculationRunning) || (status is CalculationIndetermined))
{
continue;
}
_status = status;
return;
}
// Got all the way through
// So we're running because we had vectors passed to us.
if (!(_status is CalculationRunning))
{
_status = new CalculationRunning();
}
}
/// <summary>
/// Gets the current calculation status.
/// </summary>
public ICalculationStatus Status
{
get
{
return _status;
}
}
/// <summary>
/// Resets the <see cref="IIterator{T}"/> to the pre-calculation state.
/// </summary>
public void ResetToPrecalculationState()
{
// Indicate that we're no longer cancelled.
_wasIterationCancelled = false;
// Reset the status.
_status = DefaultStatus;
// Reset the stop-criteria
foreach (var stopCriterium in _stopCriterias.Select(pair => pair.Value))
{
stopCriterium.ResetToPrecalculationState();
}
}
/// <summary>
/// Creates a deep clone of the current iterator.
/// </summary>
/// <returns>The deep clone of the current iterator.</returns>
public IIterator<T> Clone()
{
var stopCriteria = _stopCriterias.Select(pair => pair.Value).Select(stopCriterium => stopCriterium.Clone()).ToList();
return new Iterator<T>(stopCriteria);
}
}
}

1
src/Numerics/Numerics.csproj

@ -122,6 +122,7 @@
<Compile Include="Distributions\Wishart.cs" />
<Compile Include="Distributions\Zipf.cs" />
<Compile Include="LinearAlgebra\Builder.cs" />
<Compile Include="LinearAlgebra\Solvers\Iterator.cs" />
<Compile Include="LinearAlgebra\Solvers\StopCriterium\IterationCountStopCriterium.cs" />
<Compile Include="Providers\LinearAlgebra\Acml\AcmlLinearAlgebraProvider.Complex.cs" />
<Compile Include="Providers\LinearAlgebra\Acml\AcmlLinearAlgebraProvider.Complex32.cs" />

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

@ -33,6 +33,7 @@ using MathNet.Numerics.LinearAlgebra.Complex;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -96,7 +97,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => Complex.One);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -141,7 +142,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => Complex.One);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -219,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => Complex.One);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -260,7 +261,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10),
@ -292,7 +293,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10),

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

@ -33,6 +33,7 @@ using MathNet.Numerics.LinearAlgebra.Complex;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -96,7 +97,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -141,7 +142,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -220,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -262,7 +263,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10),
@ -294,7 +295,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10),

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

@ -33,6 +33,7 @@ using MathNet.Numerics.LinearAlgebra.Complex;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -96,7 +97,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -142,7 +143,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -220,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -261,7 +262,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10),
@ -293,7 +294,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10),

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

@ -33,6 +33,7 @@ using MathNet.Numerics.LinearAlgebra.Complex;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -96,7 +97,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -142,7 +143,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -220,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -261,7 +262,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10),
@ -293,7 +294,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.Iterativ
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<Complex>[]
var monitor = new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new IterationCountStopCriterium<Complex>(1000),
new ResidualStopCriterium(1e-10),

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

@ -33,6 +33,7 @@ using System.Collections.Generic;
using MathNet.Numerics.LinearAlgebra.Complex;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -53,7 +54,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
[Test]
public void CreateWithNullCollection()
{
var iterator = new Iterator(null);
var iterator = new Iterator<Complex>(null);
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -64,7 +65,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
[Test]
public void CreateWithEmptyCollection()
{
var iterator = new Iterator(new IIterationStopCriterium<Complex>[] { });
var iterator = new Iterator<Complex>(new IIterationStopCriterium<Complex>[] { });
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -75,7 +76,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
[Test]
public void CreateWithCollectionWithNulls()
{
var iterator = new Iterator(new IIterationStopCriterium<Complex>[] { null, null });
var iterator = new Iterator<Complex>(new IIterationStopCriterium<Complex>[] { null, null });
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -86,7 +87,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
[Test]
public void CreateWithDuplicatesThrowsArgumentException()
{
Assert.Throws<ArgumentException>(() => new Iterator(new IIterationStopCriterium<Complex>[]
Assert.Throws<ArgumentException>(() => new Iterator<Complex>(new IIterationStopCriterium<Complex>[]
{
new FailureStopCriterium(),
new FailureStopCriterium()
@ -106,7 +107,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
Assert.IsNotNull(iterator, "Should have an iterator");
// Check that we have all the criteria
@ -123,7 +124,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
[Test]
public void AddWithNullStopCriteriumThrowsArgumentNullException()
{
var iterator = new Iterator();
var iterator = new Iterator<Complex>();
Assert.Throws<ArgumentNullException>(() => iterator.Add(null));
}
@ -133,7 +134,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
[Test]
public void AddWithExistingStopCriteriumThrowsArgumentException()
{
var iterator = new Iterator();
var iterator = new Iterator<Complex>();
iterator.Add(new FailureStopCriterium());
Assert.AreEqual(1, iterator.NumberOfCriteria, "Incorrect criterium count");
@ -153,7 +154,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium()
};
var iterator = new Iterator();
var iterator = new Iterator<Complex>();
Assert.AreEqual(0, iterator.NumberOfCriteria, "Incorrect criterium count");
foreach (var criterium in criteria)
@ -183,7 +184,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
Assert.Throws<ArgumentNullException>(() => iterator.Remove(null));
@ -201,7 +202,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new DivergenceStopCriterium(),
new IterationCountStopCriterium<Complex>(),
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
iterator.Remove(new ResidualStopCriterium());
@ -221,7 +222,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
foreach (var criterium in criteria)
@ -237,7 +238,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
[Test]
public void DetermineStatusWithoutStopCriteriaThrowsArgumentException()
{
var iterator = new Iterator();
var iterator = new Iterator<Complex>();
Assert.Throws<ArgumentException>(() => iterator.DetermineStatus(
0,
DenseVector.Create(3, i => 4),
@ -258,7 +259,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
Assert.Throws<ArgumentOutOfRangeException>(() => iterator.DetermineStatus(
-1,
@ -280,7 +281,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -302,7 +303,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -324,7 +325,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -346,7 +347,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(1)
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
// First step, nothing should happen.
iterator.DetermineStatus(
@ -378,7 +379,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new IterationCountStopCriterium<Complex>(1)
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
// First step, nothing should happen.
iterator.DetermineStatus(
@ -409,12 +410,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex>(criteria);
var clonedIterator = iterator.Clone();
Assert.IsInstanceOf(typeof (Iterator), clonedIterator, "Incorrect type");
Assert.IsInstanceOf(typeof(Iterator<Complex>), clonedIterator, "Incorrect type");
var clone = clonedIterator as Iterator;
var clone = clonedIterator as Iterator<Complex>;
Assert.IsNotNull(clone);
// ReSharper disable PossibleNullReferenceException

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Complex32;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => Complex32.One);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -141,7 +141,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => Complex32.One);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -219,7 +219,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => Complex32.One);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -264,7 +264,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)),
@ -307,7 +307,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Complex32;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -141,7 +141,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -220,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -262,7 +262,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)),

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Complex32;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -142,7 +142,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -220,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -261,7 +261,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)),
@ -304,7 +304,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Complex32;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -96,7 +96,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -142,7 +142,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -220,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -261,7 +261,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)),
@ -304,7 +304,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.Iterat
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<Complex32>[]
var monitor = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new IterationCountStopCriterium<Complex32>(1000),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))

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

@ -33,6 +33,7 @@ using System.Collections.Generic;
using MathNet.Numerics.LinearAlgebra.Complex32;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers;
using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -53,7 +54,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
[Test]
public void CreateWithNullCollection()
{
var iterator = new Iterator(null);
var iterator = new Iterator<Complex32>(null);
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -64,7 +65,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
[Test]
public void CreateWithEmptyCollection()
{
var iterator = new Iterator(new IIterationStopCriterium<Complex32>[] { });
var iterator = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[] { });
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -75,7 +76,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
[Test]
public void CreateWithCollectionWithNulls()
{
var iterator = new Iterator(new IIterationStopCriterium<Complex32>[] { null, null });
var iterator = new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[] { null, null });
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -86,7 +87,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
[Test]
public void CreateWithDuplicatesThrowsArgumentException()
{
Assert.Throws<ArgumentException>(() => new Iterator(new IIterationStopCriterium<Complex32>[]
Assert.Throws<ArgumentException>(() => new Iterator<Complex32>(new IIterationStopCriterium<Complex32>[]
{
new FailureStopCriterium(),
new FailureStopCriterium()
@ -106,7 +107,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
Assert.IsNotNull(iterator, "Should have an iterator");
// Check that we have all the criteria
@ -123,7 +124,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
[Test]
public void AddWithNullStopCriteriumThrowsArgumentNullException()
{
var iterator = new Iterator();
var iterator = new Iterator<Complex32>();
Assert.Throws<ArgumentNullException>(() => iterator.Add(null));
}
@ -133,7 +134,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
[Test]
public void AddWithExistingStopCriteriumThrowsArgumentException()
{
var iterator = new Iterator();
var iterator = new Iterator<Complex32>();
iterator.Add(new FailureStopCriterium());
Assert.AreEqual(1, iterator.NumberOfCriteria, "Incorrect criterium count");
@ -153,7 +154,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium()
};
var iterator = new Iterator();
var iterator = new Iterator<Complex32>();
Assert.AreEqual(0, iterator.NumberOfCriteria, "Incorrect criterium count");
foreach (var criterium in criteria)
@ -183,7 +184,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
Assert.Throws<ArgumentNullException>(() => iterator.Remove(null));
@ -201,7 +202,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new DivergenceStopCriterium(),
new IterationCountStopCriterium<Complex32>(),
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
iterator.Remove(new ResidualStopCriterium());
@ -221,7 +222,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
foreach (var criterium in criteria)
@ -237,7 +238,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
[Test]
public void DetermineStatusWithoutStopCriteriaThrowsArgumentException()
{
var iterator = new Iterator();
var iterator = new Iterator<Complex32>();
Assert.Throws<ArgumentException>(() => iterator.DetermineStatus(
0,
DenseVector.Create(3, i => 4),
@ -258,7 +259,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
Assert.Throws<ArgumentOutOfRangeException>(() => iterator.DetermineStatus(
-1,
@ -280,7 +281,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -302,7 +303,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -324,7 +325,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -346,7 +347,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(1)
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
// First step, nothing should happen.
iterator.DetermineStatus(
@ -378,7 +379,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new IterationCountStopCriterium<Complex32>(1)
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
// First step, nothing should happen.
iterator.DetermineStatus(
@ -409,12 +410,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<Complex32>(criteria);
var clonedIterator = iterator.Clone();
Assert.IsInstanceOf(typeof (Iterator), clonedIterator, "Incorrect type");
Assert.IsInstanceOf(typeof(Iterator<Complex32>), clonedIterator, "Incorrect type");
var clone = clonedIterator as Iterator;
var clone = clonedIterator as Iterator<Complex32>;
Assert.IsNotNull(clone);
// ReSharper disable PossibleNullReferenceException

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -262,7 +262,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10),
@ -293,7 +293,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10)

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

@ -28,14 +28,14 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
using System;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
{
@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -218,7 +218,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -264,7 +264,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10),
@ -295,7 +295,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10)

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -218,7 +218,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -263,7 +263,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10),
@ -294,7 +294,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10)

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -218,7 +218,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -259,7 +259,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10),
@ -290,7 +290,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<double>[]
var monitor = new Iterator<double>(new IIterationStopCriterium<double>[]
{
new IterationCountStopCriterium<double>(1000),
new ResidualStopCriterium(1e-10)

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

@ -31,8 +31,8 @@
using System;
using System.Collections.Generic;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;
using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -51,7 +51,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
[Test]
public void CreateWithNullCollection()
{
var iterator = new Iterator(null);
var iterator = new Iterator<double>(null);
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -62,7 +62,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
[Test]
public void CreateWithEmptyCollection()
{
var iterator = new Iterator(new IIterationStopCriterium<double>[] { });
var iterator = new Iterator<double>(new IIterationStopCriterium<double>[] { });
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -73,7 +73,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
[Test]
public void CreateWithCollectionWithNulls()
{
var iterator = new Iterator(new IIterationStopCriterium<double>[] { null, null });
var iterator = new Iterator<double>(new IIterationStopCriterium<double>[] { null, null });
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -84,7 +84,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
[Test]
public void CreateWithDuplicatesThrowsArgumentException()
{
Assert.Throws<ArgumentException>(() => new Iterator(new IIterationStopCriterium<double>[]
Assert.Throws<ArgumentException>(() => new Iterator<double>(new IIterationStopCriterium<double>[]
{
new FailureStopCriterium(),
new FailureStopCriterium()
@ -104,7 +104,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
Assert.IsNotNull(iterator, "Should have an iterator");
// Check that we have all the criteria
@ -121,7 +121,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
[Test]
public void AddWithNullStopCriteriumThrowsArgumentNullException()
{
var iterator = new Iterator();
var iterator = new Iterator<double>();
Assert.Throws<ArgumentNullException>(() => iterator.Add(null));
}
@ -131,7 +131,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
[Test]
public void AddWithExistingStopCriteriumThrowsArgumentException()
{
var iterator = new Iterator();
var iterator = new Iterator<double>();
iterator.Add(new FailureStopCriterium());
Assert.AreEqual(1, iterator.NumberOfCriteria, "Incorrect criterium count");
@ -151,7 +151,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium()
};
var iterator = new Iterator();
var iterator = new Iterator<double>();
Assert.AreEqual(0, iterator.NumberOfCriteria, "Incorrect criterium count");
foreach (var criterium in criteria)
@ -181,7 +181,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
Assert.Throws<ArgumentNullException>(() => iterator.Remove(null));
@ -199,7 +199,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new DivergenceStopCriterium(),
new IterationCountStopCriterium<double>(),
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
iterator.Remove(new ResidualStopCriterium());
@ -219,7 +219,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
foreach (var criterium in criteria)
@ -235,7 +235,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
[Test]
public void DetermineStatusWithoutStopCriteriaThrowsArgumentException()
{
var iterator = new Iterator();
var iterator = new Iterator<double>();
Assert.Throws<ArgumentException>(() => iterator.DetermineStatus(
0,
DenseVector.Create(3, i => 4),
@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
Assert.Throws<ArgumentOutOfRangeException>(() => iterator.DetermineStatus(
-1,
@ -278,7 +278,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -300,7 +300,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -322,7 +322,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -344,7 +344,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(1)
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
// First step, nothing should happen.
iterator.DetermineStatus(
@ -376,7 +376,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new IterationCountStopCriterium<double>(1)
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
// First step, nothing should happen.
iterator.DetermineStatus(
@ -407,12 +407,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<double>(criteria);
var clonedIterator = iterator.Clone();
Assert.IsInstanceOf(typeof (Iterator), clonedIterator, "Incorrect type");
Assert.IsInstanceOf(typeof(Iterator<double>), clonedIterator, "Incorrect type");
var clone = clonedIterator as Iterator;
var clone = clonedIterator as Iterator<double>;
Assert.IsNotNull(clone);
// ReSharper disable PossibleNullReferenceException

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Single;
using MathNet.Numerics.LinearAlgebra.Single.Solvers;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -217,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -260,7 +260,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)),
@ -301,7 +301,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Single;
using MathNet.Numerics.LinearAlgebra.Single.Solvers;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -139,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -218,7 +218,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -262,7 +262,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)),
@ -303,7 +303,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))

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

@ -31,9 +31,9 @@
using System;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Single;
using MathNet.Numerics.LinearAlgebra.Single.Solvers;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -95,7 +95,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -141,7 +141,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -223,7 +223,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
for (var iteration = 0; iteration <= 3; iteration++)
{
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -279,7 +279,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)),
@ -322,7 +322,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))

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

@ -30,9 +30,9 @@
using System;
using MathNet.Numerics.LinearAlgebra.Single;
using MathNet.Numerics.LinearAlgebra.Single.Solvers;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.Iterative;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -140,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -218,7 +218,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var y = DenseVector.Create(matrix.RowCount, i => 1);
// Create an iteration monitor which will keep track of iterative convergence
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium(ConvergenceBoundary),
@ -261,7 +261,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var vectorb = MatrixLoader.GenerateRandomDenseVector(order);
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration)),
@ -302,7 +302,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.Iterative
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var monitor = new Iterator(new IIterationStopCriterium<float>[]
var monitor = new Iterator<float>(new IIterationStopCriterium<float>[]
{
new IterationCountStopCriterium<float>(MaximumIterations),
new ResidualStopCriterium((float) Math.Pow(1.0/10.0, iteration))

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

@ -31,8 +31,8 @@
using System;
using System.Collections.Generic;
using MathNet.Numerics.LinearAlgebra.Single;
using MathNet.Numerics.LinearAlgebra.Single.Solvers;
using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium;
using MathNet.Numerics.LinearAlgebra.Solvers;
using MathNet.Numerics.LinearAlgebra.Solvers.Status;
using MathNet.Numerics.LinearAlgebra.Solvers.StopCriterium;
using NUnit.Framework;
@ -51,7 +51,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
[Test]
public void CreateWithNullCollection()
{
var iterator = new Iterator(null);
var iterator = new Iterator<float>(null);
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -62,7 +62,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
[Test]
public void CreateWithEmptyCollection()
{
var iterator = new Iterator(new IIterationStopCriterium<float>[] { });
var iterator = new Iterator<float>(new IIterationStopCriterium<float>[] { });
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -73,7 +73,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
[Test]
public void CreateWithCollectionWithNulls()
{
var iterator = new Iterator(new IIterationStopCriterium<float>[] { null, null });
var iterator = new Iterator<float>(new IIterationStopCriterium<float>[] { null, null });
Assert.IsNotNull(iterator, "Should have an iterator");
Assert.AreEqual(0, iterator.NumberOfCriteria, "There shouldn't be any criteria");
}
@ -84,7 +84,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
[Test]
public void CreateWithDuplicatesThrowsArgumentException()
{
Assert.Throws<ArgumentException>(() => new Iterator(new IIterationStopCriterium<float>[]
Assert.Throws<ArgumentException>(() => new Iterator<float>(new IIterationStopCriterium<float>[]
{
new FailureStopCriterium(),
new FailureStopCriterium()
@ -104,7 +104,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
Assert.IsNotNull(iterator, "Should have an iterator");
// Check that we have all the criteria
@ -121,7 +121,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
[Test]
public void AddWithNullStopCriteriumThrowsArgumentNullException()
{
var iterator = new Iterator();
var iterator = new Iterator<float>();
Assert.Throws<ArgumentNullException>(() => iterator.Add(null));
}
@ -131,7 +131,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
[Test]
public void AddWithExistingStopCriteriumThrowsArgumentException()
{
var iterator = new Iterator();
var iterator = new Iterator<float>();
iterator.Add(new FailureStopCriterium());
Assert.AreEqual(1, iterator.NumberOfCriteria, "Incorrect criterium count");
@ -151,7 +151,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium()
};
var iterator = new Iterator();
var iterator = new Iterator<float>();
Assert.AreEqual(0, iterator.NumberOfCriteria, "Incorrect criterium count");
foreach (var criterium in criteria)
@ -181,7 +181,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
Assert.Throws<ArgumentNullException>(() => iterator.Remove(null));
@ -199,7 +199,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new DivergenceStopCriterium(),
new IterationCountStopCriterium<float>(),
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
iterator.Remove(new ResidualStopCriterium());
@ -219,7 +219,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
foreach (var criterium in criteria)
@ -235,7 +235,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
[Test]
public void DetermineStatusWithoutStopCriteriaThrowsArgumentException()
{
var iterator = new Iterator();
var iterator = new Iterator<float>();
Assert.Throws<ArgumentException>(() => iterator.DetermineStatus(
0,
DenseVector.Create(3, i => 4),
@ -256,7 +256,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
Assert.Throws<ArgumentOutOfRangeException>(() => iterator.DetermineStatus(
-1,
@ -278,7 +278,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -300,7 +300,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -322,7 +322,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(),
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
Assert.Throws<ArgumentNullException>(() => iterator.DetermineStatus(
1,
@ -344,7 +344,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(1)
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
// First step, nothing should happen.
iterator.DetermineStatus(
@ -376,7 +376,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new IterationCountStopCriterium<float>(1)
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
// First step, nothing should happen.
iterator.DetermineStatus(
@ -407,12 +407,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
new ResidualStopCriterium()
};
var iterator = new Iterator(criteria);
var iterator = new Iterator<float>(criteria);
var clonedIterator = iterator.Clone();
Assert.IsInstanceOf(typeof (Iterator), clonedIterator, "Incorrect type");
Assert.IsInstanceOf(typeof(Iterator<float>), clonedIterator, "Incorrect type");
var clone = clonedIterator as Iterator;
var clone = clonedIterator as Iterator<float>;
Assert.IsNotNull(clone);
// ReSharper disable PossibleNullReferenceException

Loading…
Cancel
Save