diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs index 0474e696..fb22c8c2 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/BiCgStab.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers @@ -73,12 +72,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// public sealed class BiCgStab : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -188,9 +181,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -470,7 +463,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/CompositeSolver.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/CompositeSolver.cs index 798ee066..bc8eb73c 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/CompositeSolver.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/CompositeSolver.cs @@ -34,7 +34,6 @@ using System.IO; using System.Linq; using System.Reflection; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers @@ -94,16 +93,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers #endregion - /// - /// The default status used if the solver is not running. - /// - static readonly ICalculationStatus NonRunningStatus = new CalculationIndetermined(); - - /// - /// The default status used if the solver is running. - /// - static readonly ICalculationStatus RunningStatus = new CalculationRunning(); - #if PORTABLE private static readonly Dictionary>> SolverSetups = new Dictionary>>(); #else @@ -348,7 +337,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// /// The status of the calculation. /// - ICalculationStatus _status = NonRunningStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The iterator that is used to control the iteration process. @@ -394,7 +383,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { get { @@ -517,7 +506,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers // Switch to the next preconditioner. // Reset the solution vector to the previous solution input.CopyTo(internalInput); - _status = RunningStatus; + _status = IterationStatus.Running; continue; } diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs index fabf3990..5830d0aa 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/GpBiCg.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers @@ -71,12 +70,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// public sealed class GpBiCg : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to null, in which case the default /// pre-conditioner will be used. @@ -236,9 +229,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -553,7 +546,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs index cd8acfec..72715d7e 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/MlkBiCgStab.cs @@ -34,7 +34,6 @@ using System.Diagnostics; using System.Linq; using MathNet.Numerics.Distributions; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers @@ -77,12 +76,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// const int DefaultNumberOfStartingVectors = 50; - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -257,10 +250,10 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { [DebuggerStepThrough] - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -736,7 +729,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/DivergenceStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/DivergenceStopCriterium.cs index 4f8a5626..6bbfaa9c 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/DivergenceStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/DivergenceStopCriterium.cs @@ -29,7 +29,6 @@ // using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using System; using System.Diagnostics; @@ -52,7 +51,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// residual may experience before a divergence warning is issued. /// public const double DefaultMaximumRelativeIncrease = 0.08; - + /// /// Default value for the minimum number of iterations over which /// the residual must grow before a divergence warning is issued. @@ -63,37 +62,32 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// Defines the default last iteration number. Set to -1 because iterations normally /// start at 0. /// - private const int DefaultLastIterationNumber = -1; + const int DefaultLastIterationNumber = -1; - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The maximum relative increase the residual may experience without triggering a divergence warning. /// - private double _maximumRelativeIncrease; + double _maximumRelativeIncrease; /// /// The number of iterations over which a residual increase should be tracked before issuing a divergence warning. /// - private int _minimumNumberOfIterations; + int _minimumNumberOfIterations; /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The array that holds the tracking information. /// - private double[] _residualHistory; + double[] _residualHistory; /// /// The iteration number of the last iteration. /// - private int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = DefaultLastIterationNumber; /// /// Initializes a new instance of the class with the default maximum @@ -117,7 +111,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// relative increase and the specified minimum number of tracking iterations. /// /// The minimum number of iterations over which the residual must grow before a divergence warning is issued. - public DivergenceStopCriterium(int minimumIterations) : this(DefaultMinimumNumberOfIterations, minimumIterations) + public DivergenceStopCriterium(int minimumIterations) : this(DefaultMinimumNumberOfIterations, minimumIterations) { } @@ -224,18 +218,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { throw new ArgumentOutOfRangeException("iterationNumber"); } - if (residualVector == null) - { - throw new ArgumentNullException("residualVector"); - } - if (_lastIteration >= iterationNumber) { // We have already stored the actual last iteration number @@ -263,19 +252,12 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium // Stop the iteration. if (double.IsNaN(_residualHistory[_residualHistory.Length - 1])) { - SetStatusToDiverged(); + _status = IterationStatus.Diverged; return _status; } // Check if we are diverging and if so set the status - if (IsDiverging()) - { - SetStatusToDiverged(); - } - else - { - SetStatusToRunning(); - } + _status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Running; _lastIteration = iterationNumber; return _status; @@ -285,7 +267,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// Detect if solution is diverging /// /// true if diverging, otherwise false - private bool IsDiverging() + bool IsDiverging() { // Run for each variable for (var i = 1; i < _residualHistory.Length; i++) @@ -295,7 +277,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium // Divergence is occurring if: // - the last residual is larger than the previous one // - the relative increase of the residual is larger than the setting allows - if ((difference < 0) || (_residualHistory[i - 1] * (1 + _maximumRelativeIncrease) >= _residualHistory[i])) + if ((difference < 0) || (_residualHistory[i - 1]*(1 + _maximumRelativeIncrease) >= _residualHistory[i])) { // No divergence taking place within the required number of iterations // So reset and stop the iteration. There is no way we can get to the @@ -310,7 +292,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// /// Gets required history Length /// - private int RequiredHistoryLength + int RequiredHistoryLength { [DebuggerStepThrough] get @@ -319,32 +301,10 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium } } - /// - /// Set status to - /// - private void SetStatusToDiverged() - { - if (!(_status is CalculationDiverged)) - { - _status = new CalculationDiverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } - } - /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -358,7 +318,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _lastIteration = DefaultLastIterationNumber; _residualHistory = null; } diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/FailureStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/FailureStopCriterium.cs index 7351cfa8..fda82649 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/FailureStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/FailureStopCriterium.cs @@ -28,11 +28,10 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; -using MathNet.Numerics.Properties; using System; using System.Diagnostics; +using MathNet.Numerics.LinearAlgebra.Solvers; +using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium { @@ -52,22 +51,17 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// Defines the default last iteration number. Set to -1 because iterations normally /// start at 0. /// - private const int DefaultLastIterationNumber = -1; - - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); + const int DefaultLastIterationNumber = -1; /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The iteration number of the last iteration. /// - private int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = DefaultLastIterationNumber; /// /// Determines the status of the iterative calculation based on the stop criteria stored @@ -82,23 +76,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { throw new ArgumentOutOfRangeException("iterationNumber"); } - if (solutionVector == null) - { - throw new ArgumentNullException("solutionVector"); - } - - if (residualVector == null) - { - throw new ArgumentNullException("residualVector"); - } - if (solutionVector.Count != residualVector.Count) { throw new ArgumentException(Resources.ArgumentArraysSameLength); @@ -115,45 +99,16 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium var residualNorm = residualVector.InfinityNorm(); var solutionNorm = solutionVector.InfinityNorm(); - if (double.IsNaN(solutionNorm.Real) || double.IsNaN(residualNorm.Real)) - { - SetStatusToFailed(); - } - else - { - SetStatusToRunning(); - } + _status = double.IsNaN(solutionNorm.Real) || double.IsNaN(residualNorm.Real) ? IterationStatus.Failure : IterationStatus.Running; _lastIteration = iterationNumber; return _status; } - /// - /// Set status to - /// - private void SetStatusToFailed() - { - if (!(_status is CalculationFailure)) - { - _status = new CalculationFailure(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } - } - /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -167,7 +122,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _lastIteration = DefaultLastIterationNumber; } diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/ResidualStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/ResidualStopCriterium.cs index 2a66ac40..42b867ab 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/ResidualStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/StopCriterium/ResidualStopCriterium.cs @@ -28,11 +28,10 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; -using MathNet.Numerics.Properties; using System; using System.Diagnostics; +using MathNet.Numerics.LinearAlgebra.Solvers; +using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium { @@ -61,38 +60,33 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// /// Defines the default last iteration number. Set to -1 because iterations normally start at 0. /// - private const int DefaultLastIterationNumber = -1; - - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); + const int DefaultLastIterationNumber = -1; /// /// The maximum value for the residual below which the calculation is considered converged. /// - private double _maximum; + double _maximum; /// /// The minimum number of iterations for which the residual has to be below the maximum before /// the calculation is considered converged. /// - private int _minimumIterationsBelowMaximum; + int _minimumIterationsBelowMaximum; /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The number of iterations since the residuals got below the maximum. /// - private int _iterationCount; + int _iterationCount; /// /// The iteration number of the last iteration. /// - private int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = DefaultLastIterationNumber; /// /// Initializes a new instance of the class with the default maximum @@ -229,28 +223,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { 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"); - } - if (solutionVector.Count != sourceVector.Count) { throw new ArgumentException(Resources.ArgumentVectorsSameLength, "sourceVector"); @@ -265,7 +244,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium // These values will be used to calculate the relative drop in residuals // later on. var residualNorm = residualVector.InfinityNorm(); - + // Check the residuals by calculating: // ||r_i|| <= stop_tol * ||b|| var stopCriterium = ComputeStopCriterium(sourceVector.InfinityNorm().Real); @@ -276,7 +255,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium if (double.IsNaN(stopCriterium) || double.IsNaN(residualNorm.Real)) { _iterationCount = 0; - SetStatusToDiverged(); + _status = IterationStatus.Diverged; return _status; } @@ -288,20 +267,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium if (_lastIteration <= iterationNumber) { _iterationCount = iterationNumber - _lastIteration; - if (_iterationCount >= _minimumIterationsBelowMaximum) - { - SetStatusToConverged(); - } - else - { - SetStatusToRunning(); - } + _status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Running; } } else { _iterationCount = 0; - SetStatusToRunning(); + _status = IterationStatus.Running; } _lastIteration = iterationNumber; @@ -313,7 +285,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// /// Solution vector norm /// Criterium value - private double ComputeStopCriterium(double solutionNorm) + double ComputeStopCriterium(double solutionNorm) { // This is criterium 1 from Templates for the solution of linear systems. // The problem with this criterium is that it's not limiting enough. For now @@ -321,46 +293,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium // return mMaximumResidual * (System.Math.Abs(mMatrixNorm) * System.Math.Abs(solutionNorm) + System.Math.Abs(mVectorNorm)); // For now use criterium 2 from Templates for the solution of linear systems. See page 60. - return _maximum * Math.Abs(solutionNorm); - } - - /// - /// Set status to - /// - private void SetStatusToDiverged() - { - if (!(_status is CalculationDiverged)) - { - _status = new CalculationDiverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToConverged() - { - if (!(_status is CalculationConverged)) - { - _status = new CalculationConverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } + return _maximum*Math.Abs(solutionNorm); } /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -374,7 +313,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _iterationCount = 0; _lastIteration = DefaultLastIterationNumber; } diff --git a/src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs b/src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs index f5e467c1..9750802a 100644 --- a/src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs +++ b/src/Numerics/LinearAlgebra/Complex/Solvers/TFQMR.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers @@ -62,12 +61,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// public sealed class TFQMR : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -177,9 +170,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -460,7 +453,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs index dcaff85d..44a9cc7f 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/BiCgStab.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers @@ -66,12 +65,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// public sealed class BiCgStab : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -181,9 +174,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -463,7 +456,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/CompositeSolver.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/CompositeSolver.cs index 07145609..56a675ff 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/CompositeSolver.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/CompositeSolver.cs @@ -34,7 +34,6 @@ using System.IO; using System.Linq; using System.Reflection; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers @@ -86,16 +85,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers #endregion - /// - /// The default status used if the solver is not running. - /// - static readonly ICalculationStatus NonRunningStatus = new CalculationIndetermined(); - - /// - /// The default status used if the solver is running. - /// - static readonly ICalculationStatus RunningStatus = new CalculationRunning(); - #if PORTABLE private static readonly Dictionary>> SolverSetups = new Dictionary>>(); #else @@ -340,7 +329,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// /// The status of the calculation. /// - ICalculationStatus _status = NonRunningStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The iterator that is used to control the iteration process. @@ -386,7 +375,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { get { @@ -509,7 +498,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers // Switch to the next preconditioner. // Reset the solution vector to the previous solution input.CopyTo(internalInput); - _status = RunningStatus; + _status = IterationStatus.Running; continue; } diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs index fdbd57b7..eef09eb2 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/GpBiCg.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers @@ -64,12 +63,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// public sealed class GpBiCg : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to null, in which case the default /// pre-conditioner will be used. @@ -229,9 +222,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -551,7 +544,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs index 9c5b4c3c..18c0ef03 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/MlkBiCgStab.cs @@ -34,7 +34,6 @@ using System.Diagnostics; using System.Linq; using MathNet.Numerics.Distributions; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers @@ -69,12 +68,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// const int DefaultNumberOfStartingVectors = 50; - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -249,10 +242,10 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { [DebuggerStepThrough] - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -733,7 +726,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/DivergenceStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/DivergenceStopCriterium.cs index 97fbac8c..4b548bdd 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/DivergenceStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/DivergenceStopCriterium.cs @@ -29,7 +29,6 @@ // using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using System; using System.Diagnostics; @@ -47,7 +46,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// residual may experience before a divergence warning is issued. /// public const double DefaultMaximumRelativeIncrease = 0.08; - + /// /// Default value for the minimum number of iterations over which /// the residual must grow before a divergence warning is issued. @@ -58,37 +57,32 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// Defines the default last iteration number. Set to -1 because iterations normally /// start at 0. /// - private const int DefaultLastIterationNumber = -1; + const int DefaultLastIterationNumber = -1; - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The maximum relative increase the residual may experience without triggering a divergence warning. /// - private double _maximumRelativeIncrease; + double _maximumRelativeIncrease; /// /// The number of iterations over which a residual increase should be tracked before issuing a divergence warning. /// - private int _minimumNumberOfIterations; + int _minimumNumberOfIterations; /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The array that holds the tracking information. /// - private double[] _residualHistory; + double[] _residualHistory; /// /// The iteration number of the last iteration. /// - private int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = DefaultLastIterationNumber; /// /// Initializes a new instance of the class with the default maximum @@ -112,7 +106,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// relative increase and the specified minimum number of tracking iterations. /// /// The minimum number of iterations over which the residual must grow before a divergence warning is issued. - public DivergenceStopCriterium(int minimumIterations) : this(DefaultMinimumNumberOfIterations, minimumIterations) + public DivergenceStopCriterium(int minimumIterations) : this(DefaultMinimumNumberOfIterations, minimumIterations) { } @@ -219,18 +213,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { throw new ArgumentOutOfRangeException("iterationNumber"); } - if (residualVector == null) - { - throw new ArgumentNullException("residualVector"); - } - if (_lastIteration >= iterationNumber) { // We have already stored the actual last iteration number @@ -258,19 +247,12 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium // Stop the iteration. if (double.IsNaN(_residualHistory[_residualHistory.Length - 1])) { - SetStatusToDiverged(); + _status = IterationStatus.Diverged; return _status; } // Check if we are diverging and if so set the status - if (IsDiverging()) - { - SetStatusToDiverged(); - } - else - { - SetStatusToRunning(); - } + _status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Running; _lastIteration = iterationNumber; return _status; @@ -280,7 +262,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// Detect if solution is diverging /// /// true if diverging, otherwise false - private bool IsDiverging() + bool IsDiverging() { // Run for each variable for (var i = 1; i < _residualHistory.Length; i++) @@ -290,7 +272,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium // Divergence is occurring if: // - the last residual is larger than the previous one // - the relative increase of the residual is larger than the setting allows - if ((difference < 0) || (_residualHistory[i - 1] * (1 + _maximumRelativeIncrease) >= _residualHistory[i])) + if ((difference < 0) || (_residualHistory[i - 1]*(1 + _maximumRelativeIncrease) >= _residualHistory[i])) { // No divergence taking place within the required number of iterations // So reset and stop the iteration. There is no way we can get to the @@ -305,7 +287,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// /// Gets required history Length /// - private int RequiredHistoryLength + int RequiredHistoryLength { [DebuggerStepThrough] get @@ -314,32 +296,10 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium } } - /// - /// Set status to - /// - private void SetStatusToDiverged() - { - if (!(_status is CalculationDiverged)) - { - _status = new CalculationDiverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } - } - /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -353,7 +313,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _lastIteration = DefaultLastIterationNumber; _residualHistory = null; } diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/FailureStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/FailureStopCriterium.cs index a881e558..67e57ef6 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/FailureStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/FailureStopCriterium.cs @@ -28,11 +28,10 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; -using MathNet.Numerics.Properties; using System; using System.Diagnostics; +using MathNet.Numerics.LinearAlgebra.Solvers; +using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium { @@ -47,22 +46,17 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// Defines the default last iteration number. Set to -1 because iterations normally /// start at 0. /// - private const int DefaultLastIterationNumber = -1; - - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); + const int DefaultLastIterationNumber = -1; /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The iteration number of the last iteration. /// - private int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = DefaultLastIterationNumber; /// /// Determines the status of the iterative calculation based on the stop criteria stored @@ -77,23 +71,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { throw new ArgumentOutOfRangeException("iterationNumber"); } - if (solutionVector == null) - { - throw new ArgumentNullException("solutionVector"); - } - - if (residualVector == null) - { - throw new ArgumentNullException("residualVector"); - } - if (solutionVector.Count != residualVector.Count) { throw new ArgumentException(Resources.ArgumentArraysSameLength); @@ -110,45 +94,16 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium var residualNorm = residualVector.InfinityNorm(); var solutionNorm = solutionVector.InfinityNorm(); - if (float.IsNaN(solutionNorm.Real) || float.IsNaN(residualNorm.Real)) - { - SetStatusToFailed(); - } - else - { - SetStatusToRunning(); - } + _status = float.IsNaN(solutionNorm.Real) || float.IsNaN(residualNorm.Real) ? IterationStatus.Failure : IterationStatus.Running; _lastIteration = iterationNumber; return _status; } - /// - /// Set status to - /// - private void SetStatusToFailed() - { - if (!(_status is CalculationFailure)) - { - _status = new CalculationFailure(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } - } - /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -162,7 +117,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _lastIteration = DefaultLastIterationNumber; } diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/ResidualStopCriterium.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/ResidualStopCriterium.cs index 8234ce0a..6e728da3 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/ResidualStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/StopCriterium/ResidualStopCriterium.cs @@ -31,7 +31,6 @@ using System; using System.Diagnostics; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium @@ -56,38 +55,33 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// /// Defines the default last iteration number. Set to -1 because iterations normally start at 0. /// - private const int DefaultLastIterationNumber = -1; - - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); + const int DefaultLastIterationNumber = -1; /// /// The maximum value for the residual below which the calculation is considered converged. /// - private float _maximum; + float _maximum; /// /// The minimum number of iterations for which the residual has to be below the maximum before /// the calculation is considered converged. /// - private int _minimumIterationsBelowMaximum; + int _minimumIterationsBelowMaximum; /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The number of iterations since the residuals got below the maximum. /// - private int _iterationCount; + int _iterationCount; /// /// The iteration number of the last iteration. /// - private int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = DefaultLastIterationNumber; /// /// Initializes a new instance of the class with the default maximum @@ -224,28 +218,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { 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"); - } - if (solutionVector.Count != sourceVector.Count) { throw new ArgumentException(Resources.ArgumentVectorsSameLength, "sourceVector"); @@ -260,7 +239,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium // These values will be used to calculate the relative drop in residuals // later on. var residualNorm = residualVector.InfinityNorm(); - + // Check the residuals by calculating: // ||r_i|| <= stop_tol * ||b|| var stopCriterium = ComputeStopCriterium(sourceVector.InfinityNorm().Real); @@ -271,7 +250,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium if (float.IsNaN(stopCriterium) || float.IsNaN(residualNorm.Real)) { _iterationCount = 0; - SetStatusToDiverged(); + _status = IterationStatus.Diverged; return _status; } @@ -283,20 +262,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium if (_lastIteration <= iterationNumber) { _iterationCount = iterationNumber - _lastIteration; - if (_iterationCount >= _minimumIterationsBelowMaximum) - { - SetStatusToConverged(); - } - else - { - SetStatusToRunning(); - } + _status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Running; } } else { _iterationCount = 0; - SetStatusToRunning(); + _status = IterationStatus.Running; } _lastIteration = iterationNumber; @@ -308,7 +280,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// /// Solution vector norm /// Criterium value - private float ComputeStopCriterium(float solutionNorm) + float ComputeStopCriterium(float solutionNorm) { // This is criterium 1 from Templates for the solution of linear systems. // The problem with this criterium is that it's not limiting enough. For now @@ -316,46 +288,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium // return mMaximumResidual * (System.Math.Abs(mMatrixNorm) * System.Math.Abs(solutionNorm) + System.Math.Abs(mVectorNorm)); // For now use criterium 2 from Templates for the solution of linear systems. See page 60. - return _maximum * Math.Abs(solutionNorm); - } - - /// - /// Set status to - /// - private void SetStatusToDiverged() - { - if (!(_status is CalculationDiverged)) - { - _status = new CalculationDiverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToConverged() - { - if (!(_status is CalculationConverged)) - { - _status = new CalculationConverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } + return _maximum*Math.Abs(solutionNorm); } /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -369,7 +308,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _iterationCount = 0; _lastIteration = DefaultLastIterationNumber; } diff --git a/src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs b/src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs index 2f206bd0..b4cd55a0 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Solvers/TFQMR.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers @@ -54,12 +53,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// public sealed class TFQMR : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -169,9 +162,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -457,7 +450,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs b/src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs index 9f0b1c5b..bade9a6b 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/BiCgStab.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Double.Solvers @@ -66,12 +65,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// public sealed class BiCgStab : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -180,11 +173,11 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { get { - return (_iterator != null) ? _iterator.Status : DefaultStatus; + return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } @@ -465,7 +458,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/CompositeSolver.cs b/src/Numerics/LinearAlgebra/Double/Solvers/CompositeSolver.cs index 525e476a..3f0b4ce3 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/CompositeSolver.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/CompositeSolver.cs @@ -34,7 +34,6 @@ using System.IO; using System.Linq; using System.Reflection; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Double.Solvers @@ -83,16 +82,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers #endregion - /// - /// The default status used if the solver is not running. - /// - static readonly ICalculationStatus NonRunningStatus = new CalculationIndetermined(); - - /// - /// The default status used if the solver is running. - /// - static readonly ICalculationStatus RunningStatus = new CalculationRunning(); - #if PORTABLE private static readonly Dictionary>> SolverSetups = new Dictionary>>(); #else @@ -337,7 +326,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// /// The status of the calculation. /// - ICalculationStatus _status = NonRunningStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The iterator that is used to control the iteration process. @@ -383,7 +372,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { get { @@ -506,7 +495,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers // Switch to the next preconditioner. // Reset the solution vector to the previous solution input.CopyTo(internalInput); - _status = RunningStatus; + _status = IterationStatus.Running; continue; } diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs b/src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs index 9409d225..b4a830cf 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/GpBiCg.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Double.Solvers @@ -64,12 +63,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// public sealed class GpBiCg : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to null, in which case the default /// pre-conditioner will be used. @@ -234,11 +227,11 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { get { - return (_iterator != null) ? _iterator.Status : DefaultStatus; + return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } @@ -559,7 +552,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs b/src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs index c703af30..9161e7e8 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/MlkBiCgStab.cs @@ -34,7 +34,6 @@ using System.Diagnostics; using System.Linq; using MathNet.Numerics.Distributions; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Double.Solvers @@ -69,12 +68,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// const int DefaultNumberOfStartingVectors = 50; - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -254,12 +247,12 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { [DebuggerStepThrough] get { - return (_iterator != null) ? _iterator.Status : DefaultStatus; + return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } @@ -735,7 +728,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/DivergenceStopCriterium.cs b/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/DivergenceStopCriterium.cs index b44cd30f..c5468f47 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/DivergenceStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/DivergenceStopCriterium.cs @@ -29,7 +29,6 @@ // using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using System; using System.Diagnostics; @@ -58,11 +57,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// private const int DefaultLastIterationNumber = -1; - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The maximum relative increase the residual may experience without triggering a divergence warning. /// @@ -76,7 +70,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + private IterationStatus _status = IterationStatus.Indetermined; /// /// The array that holds the tracking information. @@ -217,18 +211,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { throw new ArgumentOutOfRangeException("iterationNumber"); } - if (residualVector == null) - { - throw new ArgumentNullException("residualVector"); - } - if (_lastIteration >= iterationNumber) { // We have already stored the actual last iteration number @@ -256,19 +245,12 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium // Stop the iteration. if (double.IsNaN(_residualHistory[_residualHistory.Length - 1])) { - SetStatusToDiverged(); + _status = IterationStatus.Diverged; return _status; } // Check if we are diverging and if so set the status - if (IsDiverging()) - { - SetStatusToDiverged(); - } - else - { - SetStatusToRunning(); - } + _status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Running; _lastIteration = iterationNumber; return _status; @@ -312,32 +294,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium } } - /// - /// Set status to - /// - private void SetStatusToDiverged() - { - if (!(_status is CalculationDiverged)) - { - _status = new CalculationDiverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } - } - /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -351,7 +311,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _lastIteration = DefaultLastIterationNumber; _residualHistory = null; } diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/FailureStopCriterium.cs b/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/FailureStopCriterium.cs index dd009098..7f561148 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/FailureStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/FailureStopCriterium.cs @@ -28,11 +28,10 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; -using MathNet.Numerics.Properties; using System; using System.Diagnostics; +using MathNet.Numerics.LinearAlgebra.Solvers; +using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium { @@ -45,22 +44,17 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// Defines the default last iteration number. Set to -1 because iterations normally /// start at 0. /// - private const int DefaultLastIterationNumber = -1; - - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); + const int DefaultLastIterationNumber = -1; /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The iteration number of the last iteration. /// - private int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = DefaultLastIterationNumber; /// /// Determines the status of the iterative calculation based on the stop criteria stored @@ -75,23 +69,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { throw new ArgumentOutOfRangeException("iterationNumber"); } - if (solutionVector == null) - { - throw new ArgumentNullException("solutionVector"); - } - - if (residualVector == null) - { - throw new ArgumentNullException("residualVector"); - } - if (solutionVector.Count != residualVector.Count) { throw new ArgumentException(Resources.ArgumentArraysSameLength); @@ -108,45 +92,16 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium var residualNorm = residualVector.InfinityNorm(); var solutionNorm = solutionVector.InfinityNorm(); - if (double.IsNaN(solutionNorm) || double.IsNaN(residualNorm)) - { - SetStatusToFailed(); - } - else - { - SetStatusToRunning(); - } + _status = double.IsNaN(solutionNorm) || double.IsNaN(residualNorm) ? IterationStatus.Failure : IterationStatus.Running; _lastIteration = iterationNumber; return _status; } - /// - /// Set status to - /// - private void SetStatusToFailed() - { - if (!(_status is CalculationFailure)) - { - _status = new CalculationFailure(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } - } - /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -160,7 +115,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _lastIteration = DefaultLastIterationNumber; } diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/ResidualStopCriterium.cs b/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/ResidualStopCriterium.cs index 42d8a68e..f4246483 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/ResidualStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/StopCriterium/ResidualStopCriterium.cs @@ -28,11 +28,10 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; -using MathNet.Numerics.Properties; using System; using System.Diagnostics; +using MathNet.Numerics.LinearAlgebra.Solvers; +using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium { @@ -54,38 +53,33 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// /// Defines the default last iteration number. Set to -1 because iterations normally start at 0. /// - private const int DefaultLastIterationNumber = -1; - - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); + const int DefaultLastIterationNumber = -1; /// /// The maximum value for the residual below which the calculation is considered converged. /// - private double _maximum; + double _maximum; /// /// The minimum number of iterations for which the residual has to be below the maximum before /// the calculation is considered converged. /// - private int _minimumIterationsBelowMaximum; + int _minimumIterationsBelowMaximum; /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The number of iterations since the residuals got below the maximum. /// - private int _iterationCount; + int _iterationCount; /// /// The iteration number of the last iteration. /// - private int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = DefaultLastIterationNumber; /// /// Initializes a new instance of the class with the default maximum @@ -222,28 +216,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { 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"); - } - if (solutionVector.Count != sourceVector.Count) { throw new ArgumentException(Resources.ArgumentVectorsSameLength, "sourceVector"); @@ -258,7 +237,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium // These values will be used to calculate the relative drop in residuals // later on. var residualNorm = residualVector.InfinityNorm(); - + // Check the residuals by calculating: // ||r_i|| <= stop_tol * ||b|| var stopCriterium = ComputeStopCriterium(sourceVector.InfinityNorm()); @@ -269,7 +248,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium if (double.IsNaN(stopCriterium) || double.IsNaN(residualNorm)) { _iterationCount = 0; - SetStatusToDiverged(); + _status = IterationStatus.Diverged; return _status; } @@ -281,20 +260,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium if (_lastIteration <= iterationNumber) { _iterationCount = iterationNumber - _lastIteration; - if (_iterationCount >= _minimumIterationsBelowMaximum) - { - SetStatusToConverged(); - } - else - { - SetStatusToRunning(); - } + _status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Running; } } else { _iterationCount = 0; - SetStatusToRunning(); + _status = IterationStatus.Running; } _lastIteration = iterationNumber; @@ -306,7 +278,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// /// Solution vector norm /// Criterium value - private double ComputeStopCriterium(double solutionNorm) + double ComputeStopCriterium(double solutionNorm) { // This is criterium 1 from Templates for the solution of linear systems. // The problem with this criterium is that it's not limiting enough. For now @@ -314,46 +286,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium // return mMaximumResidual * (System.Math.Abs(mMatrixNorm) * System.Math.Abs(solutionNorm) + System.Math.Abs(mVectorNorm)); // For now use criterium 2 from Templates for the solution of linear systems. See page 60. - return _maximum * Math.Abs(solutionNorm); - } - - /// - /// Set status to - /// - private void SetStatusToDiverged() - { - if (!(_status is CalculationDiverged)) - { - _status = new CalculationDiverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToConverged() - { - if (!(_status is CalculationConverged)) - { - _status = new CalculationConverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } + return _maximum*Math.Abs(solutionNorm); } /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -367,7 +306,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _iterationCount = 0; _lastIteration = DefaultLastIterationNumber; } diff --git a/src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs b/src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs index df93300d..b4f4023d 100644 --- a/src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs +++ b/src/Numerics/LinearAlgebra/Double/Solvers/TFQMR.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Double.Solvers @@ -54,12 +53,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// public sealed class TFQMR : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -168,11 +161,11 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { get { - return (_iterator != null) ? _iterator.Status : DefaultStatus; + return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } @@ -459,7 +452,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs b/src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs index ea9cc357..bb0e7189 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/BiCgStab.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Single.Solvers @@ -66,12 +65,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// public sealed class BiCgStab : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -180,11 +173,11 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { get { - return (_iterator != null) ? _iterator.Status : DefaultStatus; + return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } @@ -465,7 +458,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/CompositeSolver.cs b/src/Numerics/LinearAlgebra/Single/Solvers/CompositeSolver.cs index 3d63e4df..d516faf5 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/CompositeSolver.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/CompositeSolver.cs @@ -34,7 +34,6 @@ using System.IO; using System.Linq; using System.Reflection; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Single.Solvers @@ -86,16 +85,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers #endregion - /// - /// The default status used if the solver is not running. - /// - static readonly ICalculationStatus NonRunningStatus = new CalculationIndetermined(); - - /// - /// The default status used if the solver is running. - /// - static readonly ICalculationStatus RunningStatus = new CalculationRunning(); - #if PORTABLE private static readonly Dictionary>> SolverSetups = new Dictionary>>(); #else @@ -340,7 +329,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// /// The status of the calculation. /// - ICalculationStatus _status = NonRunningStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The iterator that is used to control the iteration process. @@ -386,7 +375,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { get { @@ -509,7 +498,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers // Switch to the next preconditioner. // Reset the solution vector to the previous solution input.CopyTo(internalInput); - _status = RunningStatus; + _status = IterationStatus.Running; continue; } diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs b/src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs index f81a7253..999f1a00 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/GpBiCg.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Single.Solvers @@ -64,12 +63,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// public sealed class GpBiCg : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to null, in which case the default /// pre-conditioner will be used. @@ -229,9 +222,9 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -551,7 +544,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs b/src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs index d61b6ba7..b54f9cd7 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/MlkBiCgStab.cs @@ -33,7 +33,6 @@ using System.Collections.Generic; using System.Diagnostics; using MathNet.Numerics.Distributions; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Single.Solvers @@ -68,12 +67,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// const int DefaultNumberOfStartingVectors = 50; - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -253,12 +246,12 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { [DebuggerStepThrough] get { - return (_iterator != null) ? _iterator.Status : DefaultStatus; + return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } @@ -738,7 +731,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/DivergenceStopCriterium.cs b/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/DivergenceStopCriterium.cs index 7307af6c..77ff444b 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/DivergenceStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/DivergenceStopCriterium.cs @@ -29,7 +29,6 @@ // using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using System; using System.Diagnostics; @@ -58,11 +57,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// private const int DefaultLastIterationNumber = -1; - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The maximum relative increase the residual may experience without triggering a divergence warning. /// @@ -76,7 +70,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + private IterationStatus _status = IterationStatus.Indetermined; /// /// The array that holds the tracking information. @@ -217,18 +211,13 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { throw new ArgumentOutOfRangeException("iterationNumber"); } - if (residualVector == null) - { - throw new ArgumentNullException("residualVector"); - } - if (_lastIteration >= iterationNumber) { // We have already stored the actual last iteration number @@ -256,19 +245,12 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium // Stop the iteration. if (double.IsNaN(_residualHistory[_residualHistory.Length - 1])) { - SetStatusToDiverged(); + _status = IterationStatus.Diverged; return _status; } // Check if we are diverging and if so set the status - if (IsDiverging()) - { - SetStatusToDiverged(); - } - else - { - SetStatusToRunning(); - } + _status = IsDiverging() ? IterationStatus.Diverged : IterationStatus.Running; _lastIteration = iterationNumber; return _status; @@ -312,32 +294,10 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium } } - /// - /// Set status to - /// - private void SetStatusToDiverged() - { - if (!(_status is CalculationDiverged)) - { - _status = new CalculationDiverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } - } - /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -351,7 +311,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _lastIteration = DefaultLastIterationNumber; _residualHistory = null; } diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/FailureStopCriterium.cs b/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/FailureStopCriterium.cs index 10e3ea86..614b7579 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/FailureStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/FailureStopCriterium.cs @@ -28,11 +28,10 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; -using MathNet.Numerics.Properties; using System; using System.Diagnostics; +using MathNet.Numerics.LinearAlgebra.Solvers; +using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium { @@ -47,15 +46,10 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// private const int DefaultLastIterationNumber = -1; - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + private IterationStatus _status = IterationStatus.Indetermined; /// /// The iteration number of the last iteration. @@ -75,23 +69,13 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { throw new ArgumentOutOfRangeException("iterationNumber"); } - if (solutionVector == null) - { - throw new ArgumentNullException("solutionVector"); - } - - if (residualVector == null) - { - throw new ArgumentNullException("residualVector"); - } - if (solutionVector.Count != residualVector.Count) { throw new ArgumentException(Resources.ArgumentArraysSameLength); @@ -108,45 +92,16 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium var residualNorm = residualVector.InfinityNorm(); var solutionNorm = solutionVector.InfinityNorm(); - if (float.IsNaN(solutionNorm) || float.IsNaN(residualNorm)) - { - SetStatusToFailed(); - } - else - { - SetStatusToRunning(); - } + _status = float.IsNaN(solutionNorm) || float.IsNaN(residualNorm) ? IterationStatus.Failure : IterationStatus.Running; _lastIteration = iterationNumber; return _status; } - /// - /// Set status to - /// - private void SetStatusToFailed() - { - if (!(_status is CalculationFailure)) - { - _status = new CalculationFailure(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } - } - /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -160,7 +115,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _lastIteration = DefaultLastIterationNumber; } diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/ResidualStopCriterium.cs b/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/ResidualStopCriterium.cs index 3859a42a..c07e5b23 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/ResidualStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/StopCriterium/ResidualStopCriterium.cs @@ -28,11 +28,10 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; -using MathNet.Numerics.Properties; using System; using System.Diagnostics; +using MathNet.Numerics.LinearAlgebra.Solvers; +using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium { @@ -54,38 +53,33 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// /// Defines the default last iteration number. Set to -1 because iterations normally start at 0. /// - private const int DefaultLastIterationNumber = -1; - - /// - /// The default status. - /// - private static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); + const int DefaultLastIterationNumber = -1; /// /// The maximum value for the residual below which the calculation is considered converged. /// - private float _maximum; + float _maximum; /// /// The minimum number of iterations for which the residual has to be below the maximum before /// the calculation is considered converged. /// - private int _minimumIterationsBelowMaximum; + int _minimumIterationsBelowMaximum; /// /// The status of the calculation /// - private ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// The number of iterations since the residuals got below the maximum. /// - private int _iterationCount; + int _iterationCount; /// /// The iteration number of the last iteration. /// - private int _lastIteration = DefaultLastIterationNumber; + int _lastIteration = DefaultLastIterationNumber; /// /// Initializes a new instance of the class with the default maximum @@ -222,28 +216,13 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { 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"); - } - if (solutionVector.Count != sourceVector.Count) { throw new ArgumentException(Resources.ArgumentVectorsSameLength, "sourceVector"); @@ -258,7 +237,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium // These values will be used to calculate the relative drop in residuals // later on. var residualNorm = residualVector.InfinityNorm(); - + // Check the residuals by calculating: // ||r_i|| <= stop_tol * ||b|| var stopCriterium = ComputeStopCriterium(sourceVector.InfinityNorm()); @@ -269,7 +248,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium if (float.IsNaN(stopCriterium) || float.IsNaN(residualNorm)) { _iterationCount = 0; - SetStatusToDiverged(); + _status = IterationStatus.Diverged; return _status; } @@ -281,20 +260,13 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium if (_lastIteration <= iterationNumber) { _iterationCount = iterationNumber - _lastIteration; - if (_iterationCount >= _minimumIterationsBelowMaximum) - { - SetStatusToConverged(); - } - else - { - SetStatusToRunning(); - } + _status = _iterationCount >= _minimumIterationsBelowMaximum ? IterationStatus.Converged : IterationStatus.Running; } } else { _iterationCount = 0; - SetStatusToRunning(); + _status = IterationStatus.Running; } _lastIteration = iterationNumber; @@ -306,7 +278,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// /// Solution vector norm /// Criterium value - private float ComputeStopCriterium(float solutionNorm) + float ComputeStopCriterium(float solutionNorm) { // This is criterium 1 from Templates for the solution of linear systems. // The problem with this criterium is that it's not limiting enough. For now @@ -314,46 +286,13 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium // return mMaximumResidual * (System.Math.Abs(mMatrixNorm) * System.Math.Abs(solutionNorm) + System.Math.Abs(mVectorNorm)); // For now use criterium 2 from Templates for the solution of linear systems. See page 60. - return _maximum * Math.Abs(solutionNorm); - } - - /// - /// Set status to - /// - private void SetStatusToDiverged() - { - if (!(_status is CalculationDiverged)) - { - _status = new CalculationDiverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToConverged() - { - if (!(_status is CalculationConverged)) - { - _status = new CalculationConverged(); - } - } - - /// - /// Set status to - /// - private void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } + return _maximum*Math.Abs(solutionNorm); } /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] get @@ -367,7 +306,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; _iterationCount = 0; _lastIteration = DefaultLastIterationNumber; } diff --git a/src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs b/src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs index aa54e494..4b45737f 100644 --- a/src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs +++ b/src/Numerics/LinearAlgebra/Single/Solvers/TFQMR.cs @@ -30,7 +30,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Single.Solvers @@ -54,12 +53,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// public sealed class TFQMR : IIterativeSolver { - /// - /// The status used if there is no status, i.e. the solver hasn't run yet and there is no - /// iterator. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The preconditioner that will be used. Can be set to , in which case the default /// pre-conditioner will be used. @@ -169,9 +162,9 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - public ICalculationStatus IterationResult + public IterationStatus IterationResult { - get { return (_iterator != null) ? _iterator.Status : DefaultStatus; } + get { return (_iterator != null) ? _iterator.Status : IterationStatus.Indetermined; } } /// @@ -457,7 +450,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers return true; } - return !_iterator.DetermineStatus(iterationNumber, result, source, residuals).TerminatesCalculation; + var status = _iterator.DetermineStatus(iterationNumber, result, source, residuals); + return status == IterationStatus.Running || status == IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Solvers/IIterationStopCriterium.cs b/src/Numerics/LinearAlgebra/Solvers/IIterationStopCriterium.cs index 24495194..d216220c 100644 --- a/src/Numerics/LinearAlgebra/Solvers/IIterationStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Solvers/IIterationStopCriterium.cs @@ -50,13 +50,13 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector); + IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector); /// /// Gets the current calculation status. /// /// is not a legal value. Status should be set in implementation. - ICalculationStatus Status { get; } + IterationStatus Status { get; } /// /// Resets the IIterationStopCriterium to the pre-calculation state. diff --git a/src/Numerics/LinearAlgebra/Solvers/IIterativeSolver.cs b/src/Numerics/LinearAlgebra/Solvers/IIterativeSolver.cs index 147f53f0..4dab99a8 100644 --- a/src/Numerics/LinearAlgebra/Solvers/IIterativeSolver.cs +++ b/src/Numerics/LinearAlgebra/Solvers/IIterativeSolver.cs @@ -55,7 +55,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// /// Gets the status of the iteration once the calculation is finished. /// - ICalculationStatus IterationResult { get; } + IterationStatus IterationResult { get; } /// /// Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the diff --git a/src/Numerics/LinearAlgebra/Solvers/IterationCountStopCriterium.cs b/src/Numerics/LinearAlgebra/Solvers/IterationCountStopCriterium.cs index e7a5c781..de7bad30 100644 --- a/src/Numerics/LinearAlgebra/Solvers/IterationCountStopCriterium.cs +++ b/src/Numerics/LinearAlgebra/Solvers/IterationCountStopCriterium.cs @@ -30,7 +30,6 @@ using System; using System.Diagnostics; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; namespace MathNet.Numerics.LinearAlgebra.Solvers { @@ -46,11 +45,6 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// public const int DefaultMaximumNumberOfIterations = 1000; - /// - /// The default status. - /// - static readonly ICalculationStatus DefaultStatus = new CalculationIndetermined(); - /// /// The maximum number of iterations the calculation is allowed to perform. /// @@ -59,7 +53,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// /// The status of the calculation /// - ICalculationStatus _status = DefaultStatus; + IterationStatus _status = IterationStatus.Indetermined; /// /// Initializes a new instance of the class with the default maximum @@ -91,7 +85,10 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers public int MaximumNumberOfIterations { [DebuggerStepThrough] - get { return _maximumNumberOfIterations; } + get + { + return _maximumNumberOfIterations; + } [DebuggerStepThrough] set @@ -126,53 +123,28 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (iterationNumber < 0) { throw new ArgumentOutOfRangeException("iterationNumber"); } - if (iterationNumber >= _maximumNumberOfIterations) - { - SetStatusToFinished(); - } - else - { - SetStatusToRunning(); - } - return _status; - } - - /// - /// Set status to - /// - void SetStatusToFinished() - { - if (!(_status is CalculationStoppedWithoutConvergence)) - { - _status = new CalculationStoppedWithoutConvergence(); - } - } + _status = iterationNumber >= _maximumNumberOfIterations ? IterationStatus.StoppedWithoutConvergence : IterationStatus.Running; - /// - /// Set status to - /// - void SetStatusToRunning() - { - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } + return _status; } /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { [DebuggerStepThrough] - get { return _status; } + get + { + return _status; + } } /// @@ -180,7 +152,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// public void ResetToPrecalculationState() { - _status = DefaultStatus; + _status = IterationStatus.Indetermined; } /// diff --git a/src/Numerics/LinearAlgebra/Solvers/ICalculationStatus.cs b/src/Numerics/LinearAlgebra/Solvers/IterationStatus.cs similarity index 80% rename from src/Numerics/LinearAlgebra/Solvers/ICalculationStatus.cs rename to src/Numerics/LinearAlgebra/Solvers/IterationStatus.cs index 4b103fb9..274b98f2 100644 --- a/src/Numerics/LinearAlgebra/Solvers/ICalculationStatus.cs +++ b/src/Numerics/LinearAlgebra/Solvers/IterationStatus.cs @@ -1,4 +1,4 @@ -// +// // Math.NET Numerics, part of the Math.NET Project // http://numerics.mathdotnet.com // http://github.com/mathnet/mathnet-numerics @@ -31,13 +31,16 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers { /// - /// Defines the base interface for calculation status objects. + /// Iterative Calculation Status /// - public interface ICalculationStatus + public enum IterationStatus { - /// - /// Gets a value indicating whether current status warrants stopping the calculation. - /// - bool TerminatesCalculation { get; } + Indetermined = 0, + Running, + Converged, + Diverged, + StoppedWithoutConvergence, + Cancelled, + Failure } } diff --git a/src/Numerics/LinearAlgebra/Solvers/Iterator.cs b/src/Numerics/LinearAlgebra/Solvers/Iterator.cs index 726109b2..1504dba7 100644 --- a/src/Numerics/LinearAlgebra/Solvers/Iterator.cs +++ b/src/Numerics/LinearAlgebra/Solvers/Iterator.cs @@ -31,7 +31,6 @@ using System; using System.Collections.Generic; using System.Linq; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Solvers @@ -50,7 +49,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// /// The status of the iterator. /// - ICalculationStatus _status = new CalculationIndetermined(); + IterationStatus _status = IterationStatus.Indetermined; /// /// Initializes a new instance of the class with the specified stop criteria. @@ -79,7 +78,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// /// Gets the current calculation status. /// - public ICalculationStatus Status + public IterationStatus Status { get { return _status; } } @@ -89,7 +88,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// public bool HasConverged { - get { return _status is CalculationConverged; } + get { return _status == IterationStatus.Converged; } } /// @@ -97,7 +96,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// public bool HasStoppedWithoutConvergence { - get { return _status is CalculationStoppedWithoutConvergence; } + get { return _status == IterationStatus.StoppedWithoutConvergence; } } /// @@ -113,7 +112,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// on the invocation of this method. Therefore this method should only be called if the /// calculation has moved forwards at least one step. /// - public ICalculationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) + public IterationStatus DetermineStatus(int iterationNumber, Vector solutionVector, Vector sourceVector, Vector residualVector) { if (_stopCriteria.Count == 0) { @@ -126,7 +125,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers } // While we're cancelled we don't call on the stop-criteria. - if (_status is CalculationCancelled) + if (_status == IterationStatus.Cancelled) { return _status; } @@ -140,7 +139,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers // - Indetermined --> keep going // Anything else: // Stop looping and set that status - if ((status is CalculationRunning) || (status is CalculationIndetermined)) + if ((status == IterationStatus.Running) || (status == IterationStatus.Indetermined)) { continue; } @@ -151,10 +150,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers // Got all the way through // So we're running because we had vectors passed to us. - if (!(_status is CalculationRunning)) - { - _status = new CalculationRunning(); - } + _status = IterationStatus.Running; return _status; } @@ -167,7 +163,7 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// public void Cancel() { - _status = new CalculationCancelled(); + _status = IterationStatus.Cancelled; } /// @@ -175,10 +171,8 @@ namespace MathNet.Numerics.LinearAlgebra.Solvers /// public void Reset() { - // Reset the status. - _status = new CalculationIndetermined(); + _status = IterationStatus.Indetermined; - // Reset the stop-criteria foreach (var stopCriterium in _stopCriteria) { stopCriterium.ResetToPrecalculationState(); diff --git a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationCancelled.cs b/src/Numerics/LinearAlgebra/Solvers/Status/CalculationCancelled.cs deleted file mode 100644 index 13a9df33..00000000 --- a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationCancelled.cs +++ /dev/null @@ -1,49 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -namespace MathNet.Numerics.LinearAlgebra.Solvers.Status -{ - /// - /// Indicates that a calculation was cancelled by the user. - /// - public struct CalculationCancelled : ICalculationStatus - { - /// - /// Gets a value indicating whether current status warrants stopping the calculation. - /// - public bool TerminatesCalculation - { - get - { - return true; - } - } - } -} diff --git a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationConverged.cs b/src/Numerics/LinearAlgebra/Solvers/Status/CalculationConverged.cs deleted file mode 100644 index 0a2e9f6b..00000000 --- a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationConverged.cs +++ /dev/null @@ -1,51 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -namespace MathNet.Numerics.LinearAlgebra.Solvers.Status -{ - /// - /// Indicates that a calculation has converged to the desired convergence levels. - /// - public struct CalculationConverged : ICalculationStatus - { - /// - /// Gets a value indicating whether current status warrants stopping the calculation. - /// - public bool TerminatesCalculation - { - get - { - return true; - } - } - - // TODO: CalculationConverged: Should we put the achieved residuals and convergence levels on here? - } -} diff --git a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationDiverged.cs b/src/Numerics/LinearAlgebra/Solvers/Status/CalculationDiverged.cs deleted file mode 100644 index ff9f22d7..00000000 --- a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationDiverged.cs +++ /dev/null @@ -1,51 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -namespace MathNet.Numerics.LinearAlgebra.Solvers.Status -{ - /// - /// Indicates that the calculation diverged. - /// - public struct CalculationDiverged : ICalculationStatus - { - /// - /// Gets a value indicating whether current status warrants stopping the calculation. - /// - public bool TerminatesCalculation - { - get - { - return true; - } - } - - // TODO: CalculationDiverged - Should we put the residuals on here? - } -} diff --git a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationFailure.cs b/src/Numerics/LinearAlgebra/Solvers/Status/CalculationFailure.cs deleted file mode 100644 index 7d85b420..00000000 --- a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationFailure.cs +++ /dev/null @@ -1,51 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -namespace MathNet.Numerics.LinearAlgebra.Solvers.Status -{ - /// - /// Indicates that a calculation has failed for some reason. - /// - public struct CalculationFailure : ICalculationStatus - { - /// - /// Gets a value indicating whether current status warrants stopping the calculation. - /// - public bool TerminatesCalculation - { - get - { - return true; - } - } - - // TODO: CalcuationFailure - Indicate why the calculation has failed? - } -} diff --git a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationIndetermined.cs b/src/Numerics/LinearAlgebra/Solvers/Status/CalculationIndetermined.cs deleted file mode 100644 index 9d98c671..00000000 --- a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationIndetermined.cs +++ /dev/null @@ -1,49 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -namespace MathNet.Numerics.LinearAlgebra.Solvers.Status -{ - /// - /// Indicates that the state of the calculation is indetermined, not started or stopped. - /// - public struct CalculationIndetermined : ICalculationStatus - { - /// - /// Gets a value indicating whether current status warrants stopping the calculation. - /// - public bool TerminatesCalculation - { - get - { - return false; - } - } - } -} diff --git a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationRunning.cs b/src/Numerics/LinearAlgebra/Solvers/Status/CalculationRunning.cs deleted file mode 100644 index bb431efe..00000000 --- a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationRunning.cs +++ /dev/null @@ -1,51 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -namespace MathNet.Numerics.LinearAlgebra.Solvers.Status -{ - /// - /// Indicates that the calculation is running and no results are yet known. - /// - public struct CalculationRunning : ICalculationStatus - { - /// - /// Gets a value indicating whether current status warrants stopping the calculation. - /// - public bool TerminatesCalculation - { - get - { - return false; - } - } - - // TODO: CalculationRunning - Get current residuals? - } -} diff --git a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationStoppedWithoutConvergence.cs b/src/Numerics/LinearAlgebra/Solvers/Status/CalculationStoppedWithoutConvergence.cs deleted file mode 100644 index 72029810..00000000 --- a/src/Numerics/LinearAlgebra/Solvers/Status/CalculationStoppedWithoutConvergence.cs +++ /dev/null @@ -1,52 +0,0 @@ -// -// Math.NET Numerics, part of the Math.NET Project -// http://numerics.mathdotnet.com -// http://github.com/mathnet/mathnet-numerics -// http://mathnetnumerics.codeplex.com -// -// Copyright (c) 2009-2010 Math.NET -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -namespace MathNet.Numerics.LinearAlgebra.Solvers.Status -{ - /// - /// Indicates that the calculation has been stopped due to reaching the stopping - /// limits, but that convergence was not achieved. - /// - public struct CalculationStoppedWithoutConvergence : ICalculationStatus - { - /// - /// Gets a value indicating whether current status warrants stopping the calculation. - /// - public bool TerminatesCalculation - { - get - { - return true; - } - } - - // TODO: Indicate which stopping limit was reached? - } -} diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj index 741235e7..4088295d 100644 --- a/src/Numerics/Numerics.csproj +++ b/src/Numerics/Numerics.csproj @@ -123,6 +123,7 @@ + @@ -345,14 +346,6 @@ Code - - - - - - - - diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs index 576064b6..ae7e5358 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs @@ -33,7 +33,6 @@ using System.Collections.Generic; using MathNet.Numerics.LinearAlgebra.Complex; using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers @@ -82,72 +81,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - null, - DenseVector.Create(3, i => 5), - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null source vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSourceVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - DenseVector.Create(3, i => 5), - null, - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Can determine status. /// @@ -169,7 +102,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationRunning), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status"); // Second step, should run out of iterations. iterator.DetermineStatus( @@ -177,7 +110,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationStoppedWithoutConvergence), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, iterator.Status, "Incorrect status"); } /// @@ -201,13 +134,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationRunning), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status"); iterator.Reset(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), iterator.Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[0].Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[1].Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[2].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[0].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[1].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[2].Status, "Incorrect status"); } } } diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs index 5b81b2d0..85d95ca6 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs @@ -28,11 +28,11 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra.Complex; using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; -using System; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCriterium { @@ -119,20 +119,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new DivergenceStopCriterium(0.5, 15); - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Can determine status with too few iterations. /// @@ -153,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit new DenseVector(new[] {new Complex(1.0, 0)}), new DenseVector(new[] {new Complex((i + 1)*(Increase + 0.1), 0)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } } @@ -177,7 +163,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit new DenseVector(new[] {new Complex(1.0, 0)}), new DenseVector(new[] {new Complex((i + 1)*(Increase - 0.01), 0)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } } @@ -201,7 +187,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit new DenseVector(new[] {new Complex(1.0, 0)}), new DenseVector(new[] {new Complex((i + 1)*(Increase - 0.01), 0)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } // Now make it fail by throwing in a NaN @@ -211,7 +197,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit new DenseVector(new[] {new Complex(1.0, 0)}), new DenseVector(new[] {new Complex(double.NaN, 0)})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status2, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail."); } /// @@ -236,7 +222,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit new DenseVector(new[] {new Complex(1.0, 0)}), new DenseVector(new[] {new Complex(previous, 0)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } // Add the final residual. Now we should have divergence @@ -247,7 +233,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit new DenseVector(new[] {new Complex(1.0, 0)}), new DenseVector(new[] {new Complex(previous, 0)})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status2, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail."); } /// @@ -268,14 +254,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit new DenseVector(new[] {new Complex(1.0, 0)}), new DenseVector(new[] {new Complex(double.NaN, 0)})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status, "Status check fail."); // Reset the state criterium.ResetToPrecalculationState(); Assert.AreEqual(Increase, criterium.MaximumRelativeIncrease, "Incorrect maximum"); Assert.AreEqual(Iterations, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Status check fail."); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Status check fail."); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/FailureStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/FailureStopCriteriumTest.cs index 0b200356..e0639912 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/FailureStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/FailureStopCriteriumTest.cs @@ -28,10 +28,10 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using System; using MathNet.Numerics.LinearAlgebra.Complex; using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCriterium @@ -66,30 +66,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit Assert.Throws(() => criterium.DetermineStatus(-1, DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 5), DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criterium = new FailureStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus(1, null, DenseVector.Create(3, i => 6), DenseVector.Create(4, i => 4))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new FailureStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus(1, DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 6), null)); - } - /// /// Determine status with non-matching vectors throws ArgumentException. /// @@ -116,7 +92,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit var residual = new DenseVector(new[] {new Complex(1000, 0), new Complex(double.NaN, 0), new Complex(2001, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationFailure), status, "Should be failed"); + Assert.AreEqual(IterationStatus.Failure, status, "Should be failed"); } /// @@ -133,7 +109,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit var residual = new DenseVector(new[] {new Complex(1000, 0), new Complex(1000, 0), new Complex(2001, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationFailure), status, "Should be failed"); + Assert.AreEqual(IterationStatus.Failure, status, "Should be failed"); } /// @@ -150,7 +126,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit var residual = new DenseVector(new[] {new Complex(1.0, 0), new Complex(2.0, 0), new Complex(3, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); } /// @@ -167,10 +143,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit var residual = new DenseVector(new[] {new Complex(1000, 0), new Complex(1000, 0), new Complex(2001, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs index bd7dd0f7..39fcc962 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs @@ -31,7 +31,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Complex; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCriterium @@ -100,10 +99,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit Assert.IsNotNull(criterium, "A criterium should have been created"); var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); var status2 = criterium.DetermineStatus(10, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationStoppedWithoutConvergence), status2, "Should be finished"); + Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, status2, "Should be finished"); } /// @@ -116,10 +115,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit Assert.IsNotNull(criterium, "A criterium should have been created"); var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs index fef7fd3e..bff3d30e 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/Solvers/StopCriterium/ResidualStopCriteriumTest.cs @@ -28,11 +28,11 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra.Complex; using MathNet.Numerics.LinearAlgebra.Complex.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; -using System; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCriterium { @@ -117,54 +117,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - null, - DenseVector.Create(3, i => 5), - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null source vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSourceVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - null, - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Determine status with non-matching solution vector throws ArgumentException. /// @@ -227,7 +179,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit var residual = new DenseVector(new[] {new Complex(1000.0, 1), new Complex(1000.0, 1), new Complex(2001.0, 1)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Should be diverged"); + Assert.AreEqual(IterationStatus.Diverged, status, "Should be diverged"); } /// @@ -244,7 +196,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit var residual = new DenseVector(new[] {new Complex(1000.0, 1), new Complex(double.NaN, 1), new Complex(2001.0, 1)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Should be diverged"); + Assert.AreEqual(IterationStatus.Diverged, status, "Should be diverged"); } /// @@ -265,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit var residual = new DenseVector(new[] {Complex.Zero, Complex.Zero, Complex.Zero}); var status = criterium.DetermineStatus(0, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationConverged), status, "Should be done"); + Assert.AreEqual(IterationStatus.Converged, status, "Should be done"); } /// @@ -287,10 +239,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit var residual = new DenseVector(new[] {new Complex(0.001, 0), new Complex(0.001, 0), new Complex(0.002, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should still be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should still be running"); var status2 = criterium.DetermineStatus(16, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationConverged), status2, "Should be done"); + Assert.AreEqual(IterationStatus.Converged, status2, "Should be done"); } /// @@ -307,10 +259,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit var residual = new DenseVector(new[] {new Complex(1.000, 0), new Complex(1.000, 0), new Complex(2.001, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs index 9dfaecfd..331d9b48 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs @@ -33,7 +33,6 @@ using System.Collections.Generic; using MathNet.Numerics.LinearAlgebra.Complex32; using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers @@ -82,72 +81,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - null, - DenseVector.Create(3, i => 5), - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null source vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSourceVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - DenseVector.Create(3, i => 5), - null, - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Can determine status. /// @@ -169,7 +102,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationRunning), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status"); // Second step, should run out of iterations. iterator.DetermineStatus( @@ -177,7 +110,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationStoppedWithoutConvergence), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, iterator.Status, "Incorrect status"); } /// @@ -201,13 +134,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationRunning), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status"); iterator.Reset(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), iterator.Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[0].Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[1].Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[2].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[0].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[1].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[2].Status, "Incorrect status"); } } } diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs index fd1a09f9..44c68367 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs @@ -28,11 +28,11 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra.Complex32; using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; -using System; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCriterium { @@ -119,20 +119,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new DivergenceStopCriterium(0.5, 15); - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Can determine status with too few iterations. /// @@ -152,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr new DenseVector(new[] {new Complex32(1.0f, 0)}), new DenseVector(new[] {new Complex32(1.0f, 0)}), new DenseVector(new[] {new Complex32((i + 1)*(Increase + 0.1f), 0)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } } @@ -176,7 +162,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr new DenseVector(new[] {new Complex32(1.0f, 0)}), new DenseVector(new[] {new Complex32((i + 1)*(Increase - 0.01f), 0)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } } @@ -200,7 +186,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr new DenseVector(new[] {new Complex32(1.0f, 0)}), new DenseVector(new[] {new Complex32((i + 1)*(Increase - 0.01f), 0)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } // Now make it fail by throwing in a NaN @@ -210,7 +196,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr new DenseVector(new[] {new Complex32(1.0f, 0)}), new DenseVector(new[] {new Complex32(float.NaN, 0)})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status2, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail."); } /// @@ -235,7 +221,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr new DenseVector(new[] {new Complex32(1.0f, 0)}), new DenseVector(new[] {new Complex32(previous, 0)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } // Add the final residual. Now we should have divergence @@ -246,7 +232,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr new DenseVector(new[] {new Complex32(1.0f, 0)}), new DenseVector(new[] {new Complex32(previous, 0)})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status2, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail."); } /// @@ -267,14 +253,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr new DenseVector(new[] {new Complex32(1.0f, 0)}), new DenseVector(new[] {new Complex32(float.NaN, 0)})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status, "Status check fail."); // Reset the state criterium.ResetToPrecalculationState(); Assert.AreEqual(Increase, criterium.MaximumRelativeIncrease, "Incorrect maximum"); Assert.AreEqual(Iterations, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Status check fail."); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Status check fail."); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/FailureStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/FailureStopCriteriumTest.cs index 98bf9722..ce1fc772 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/FailureStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/FailureStopCriteriumTest.cs @@ -28,11 +28,11 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra.Complex32; using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; -using System; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCriterium { @@ -66,30 +66,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr Assert.Throws(() => criterium.DetermineStatus(-1, DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 5), DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criterium = new FailureStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus(1, null, DenseVector.Create(3, i => 6), DenseVector.Create(4, i => 4))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new FailureStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus(1, DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 6), null)); - } - /// /// Determine status with non-matching vectors throws ArgumentException. /// @@ -116,7 +92,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr var residual = new DenseVector(new[] {new Complex32(1000, 0), new Complex32(float.NaN, 0), new Complex32(2001, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationFailure), status, "Should be failed"); + Assert.AreEqual(IterationStatus.Failure, status, "Should be failed"); } /// @@ -133,7 +109,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr var residual = new DenseVector(new[] {new Complex32(1000, 0), new Complex32(1000, 0), new Complex32(2001, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationFailure), status, "Should be failed"); + Assert.AreEqual(IterationStatus.Failure, status, "Should be failed"); } /// @@ -150,7 +126,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr var residual = new DenseVector(new[] {new Complex32(1.0f, 0), new Complex32(2.0f, 0), new Complex32(3, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); } /// @@ -167,10 +143,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr var residual = new DenseVector(new[] {new Complex32(1000, 0), new Complex32(1000, 0), new Complex32(2001, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs index a6cfa27e..8fa01ba5 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs @@ -31,7 +31,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Complex32; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCriterium @@ -100,10 +99,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr Assert.IsNotNull(criterium, "A criterium should have been created"); var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); var status2 = criterium.DetermineStatus(10, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationStoppedWithoutConvergence), status2, "Should be finished"); + Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, status2, "Should be finished"); } /// @@ -116,10 +115,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr Assert.IsNotNull(criterium, "A criterium should have been created"); var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs index 19f6cce4..34170a44 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/Solvers/StopCriterium/ResidualStopCriteriumTest.cs @@ -28,11 +28,11 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra.Complex32; using MathNet.Numerics.LinearAlgebra.Complex32.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; -using System; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCriterium { @@ -117,54 +117,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - null, - DenseVector.Create(3, i => 5), - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null source vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSourceVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - null, - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Determine status with non-matching solution vector throws ArgumentException. /// @@ -227,7 +179,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr var residual = new DenseVector(new[] {new Complex32(1000.0f, 1), new Complex32(1000.0f, 1), new Complex32(2001.0f, 1)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Should be diverged"); + Assert.AreEqual(IterationStatus.Diverged, status, "Should be diverged"); } /// @@ -244,7 +196,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr var residual = new DenseVector(new[] {new Complex32(1000.0f, 1), new Complex32(float.NaN, 1), new Complex32(2001.0f, 1)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Should be diverged"); + Assert.AreEqual(IterationStatus.Diverged, status, "Should be diverged"); } /// @@ -265,7 +217,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr var residual = new DenseVector(new[] {Complex32.Zero, Complex32.Zero, Complex32.Zero}); var status = criterium.DetermineStatus(0, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationConverged), status, "Should be done"); + Assert.AreEqual(IterationStatus.Converged, status, "Should be done"); } /// @@ -287,10 +239,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr var residual = new DenseVector(new[] {new Complex32(0.001f, 0), new Complex32(0.001f, 0), new Complex32(0.002f, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should still be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should still be running"); var status2 = criterium.DetermineStatus(16, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationConverged), status2, "Should be done"); + Assert.AreEqual(IterationStatus.Converged, status2, "Should be done"); } /// @@ -307,10 +259,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers.StopCr var residual = new DenseVector(new[] {new Complex32(1.000f, 0), new Complex32(1.000f, 0), new Complex32(2.001f, 0)}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs index 8b8fbc8e..67e79eb1 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs @@ -33,7 +33,6 @@ using System.Collections.Generic; using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers @@ -80,72 +79,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - null, - DenseVector.Create(3, i => 5), - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null source vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSourceVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - DenseVector.Create(3, i => 5), - null, - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Can determine status. /// @@ -167,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationRunning), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status"); // Second step, should run out of iterations. iterator.DetermineStatus( @@ -175,7 +108,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationStoppedWithoutConvergence), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, iterator.Status, "Incorrect status"); } /// @@ -199,13 +132,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationRunning), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status"); iterator.Reset(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), iterator.Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[0].Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[1].Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[2].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[0].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[1].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[2].Status, "Incorrect status"); } } } diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs index f29581ca..b2b94922 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs @@ -28,11 +28,11 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; -using System; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCriterium { @@ -117,20 +117,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new DivergenceStopCriterium(0.5, 15); - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Can determine status with too few iterations. /// @@ -151,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite new DenseVector(new[] {1.0}), new DenseVector(new[] {(i + 1)*(Increase + 0.1)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } } @@ -175,7 +161,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite new DenseVector(new[] {1.0}), new DenseVector(new[] {(i + 1)*(Increase - 0.01)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } } @@ -199,7 +185,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite new DenseVector(new[] {1.0}), new DenseVector(new[] {(i + 1)*(Increase - 0.01)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } // Now make it fail by throwing in a NaN @@ -209,7 +195,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite new DenseVector(new[] {1.0}), new DenseVector(new[] {double.NaN})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status2, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail."); } /// @@ -234,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite new DenseVector(new[] {1.0}), new DenseVector(new[] {previous})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } // Add the final residual. Now we should have divergence @@ -245,7 +231,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite new DenseVector(new[] {1.0}), new DenseVector(new[] {previous})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status2, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail."); } /// @@ -266,14 +252,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite new DenseVector(new[] {1.0}), new DenseVector(new[] {double.NaN})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status, "Status check fail."); // Reset the state criterium.ResetToPrecalculationState(); Assert.AreEqual(Increase, criterium.MaximumRelativeIncrease, "Incorrect maximum"); Assert.AreEqual(Iterations, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Status check fail."); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Status check fail."); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/FailureStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/FailureStopCriteriumTest.cs index dbd14365..97a9710c 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/FailureStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/FailureStopCriteriumTest.cs @@ -30,7 +30,7 @@ using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; using System; @@ -64,30 +64,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite Assert.Throws(() => criterium.DetermineStatus(-1, DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 5), DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criterium = new FailureStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus(1, null, DenseVector.Create(3, i => 6), DenseVector.Create(4, i => 4))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new FailureStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus(1, DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 6), null)); - } - /// /// Determine status with non-matching vectors throws ArgumentException. /// @@ -114,7 +90,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite var residual = new DenseVector(new[] { 1000, double.NaN, 2001 }); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof(CalculationFailure), status, "Should be failed"); + Assert.AreEqual(IterationStatus.Failure, status, "Should be failed"); } /// @@ -131,7 +107,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite var residual = new DenseVector(new[] { 1000.0, 1000.0, 2001.0 }); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof(CalculationFailure), status, "Should be failed"); + Assert.AreEqual(IterationStatus.Failure, status, "Should be failed"); } /// @@ -148,7 +124,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite var residual = new DenseVector(new[] { 1.0, 2.0, 3.0 }); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof(CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); } /// @@ -165,10 +141,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite var residual = new DenseVector(new[] { 1000.0, 1000.0, 2001.0 }); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof(CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof(CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs index 22b579aa..f133235e 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs @@ -31,7 +31,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCriterium @@ -98,10 +97,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite Assert.IsNotNull(criterium, "A criterium should have been created"); var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); var status2 = criterium.DetermineStatus(10, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationStoppedWithoutConvergence), status2, "Should be finished"); + Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, status2, "Should be finished"); } /// @@ -114,10 +113,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite Assert.IsNotNull(criterium, "A criterium should have been created"); var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs index e9faa742..5ae0bc1b 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/Solvers/StopCriterium/ResidualStopCriteriumTest.cs @@ -28,11 +28,11 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Double.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; -using System; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCriterium { @@ -115,54 +115,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - null, - DenseVector.Create(3, i => 5), - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null source vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSourceVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - null, - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-8, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Determine status with non-matching solution vector throws ArgumentException. /// @@ -225,7 +177,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite var residual = new DenseVector(new[] {1000.0, 1000.0, 2001.0}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Should be diverged"); + Assert.AreEqual(IterationStatus.Diverged, status, "Should be diverged"); } /// @@ -242,7 +194,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite var residual = new DenseVector(new[] {1000.0, double.NaN, 2001.0}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Should be diverged"); + Assert.AreEqual(IterationStatus.Diverged, status, "Should be diverged"); } /// @@ -259,7 +211,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite var residual = new DenseVector(new[] {0.0, 0.0, 0.0}); var status = criterium.DetermineStatus(0, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationConverged), status, "Should be done"); + Assert.AreEqual(IterationStatus.Converged, status, "Should be done"); } /// @@ -281,10 +233,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite var residual = new DenseVector(new[] {0.001, 0.001, 0.002}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should still be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should still be running"); var status2 = criterium.DetermineStatus(16, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationConverged), status2, "Should be done"); + Assert.AreEqual(IterationStatus.Converged, status2, "Should be done"); } /// @@ -301,10 +253,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers.StopCrite var residual = new DenseVector(new[] {1.000, 1.000, 2.001}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs index 81948de5..41fd2e70 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs @@ -33,7 +33,6 @@ using System.Collections.Generic; using MathNet.Numerics.LinearAlgebra.Single; using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers @@ -80,72 +79,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - null, - DenseVector.Create(3, i => 5), - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null source vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSourceVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - DenseVector.Create(3, i => 5), - null, - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criteria = new List> - { - new FailureStopCriterium(), - new DivergenceStopCriterium(), - new IterationCountStopCriterium(), - new ResidualStopCriterium() - }; - var iterator = new Iterator(criteria); - - Assert.Throws(() => iterator.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Can determine status. /// @@ -167,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationRunning), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status"); // Second step, should run out of iterations. iterator.DetermineStatus( @@ -175,7 +108,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationStoppedWithoutConvergence), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, iterator.Status, "Incorrect status"); } /// @@ -199,13 +132,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 4)); - Assert.IsInstanceOf(typeof (CalculationRunning), iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Running, iterator.Status, "Incorrect status"); iterator.Reset(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), iterator.Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[0].Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[1].Status, "Incorrect status"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criteria[2].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, iterator.Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[0].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[1].Status, "Incorrect status"); + Assert.AreEqual(IterationStatus.Indetermined, criteria[2].Status, "Incorrect status"); } } } diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs index fecd30c4..dfc24463 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/DivergenceStopCriteriumTest.cs @@ -28,11 +28,11 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra.Single; using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; -using System; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCriterium { @@ -117,20 +117,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new DivergenceStopCriterium(0.5, 15); - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Can determine status with too few iterations. /// @@ -151,7 +137,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite new DenseVector(new[] {1.0f}), new DenseVector(new[] {(i + 1)*(Increase + 0.1f)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } } @@ -175,7 +161,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite new DenseVector(new[] {1.0f}), new DenseVector(new[] {(i + 1)*(Increase - 0.01f)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } } @@ -199,7 +185,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite new DenseVector(new[] {1.0f}), new DenseVector(new[] {(i + 1)*(Increase - 0.01f)})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } // Now make it fail by throwing in a NaN @@ -209,7 +195,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite new DenseVector(new[] {1.0f}), new DenseVector(new[] {float.NaN})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status2, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail."); } /// @@ -234,7 +220,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite new DenseVector(new[] {1.0f}), new DenseVector(new[] {previous})); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Running, status, "Status check fail."); } // Add the final residual. Now we should have divergence @@ -245,7 +231,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite new DenseVector(new[] {1.0f}), new DenseVector(new[] {previous})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status2, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status2, "Status check fail."); } /// @@ -266,14 +252,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite new DenseVector(new[] {1.0f}), new DenseVector(new[] {float.NaN})); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Status check fail."); + Assert.AreEqual(IterationStatus.Diverged, status, "Status check fail."); // Reset the state criterium.ResetToPrecalculationState(); Assert.AreEqual(Increase, criterium.MaximumRelativeIncrease, "Incorrect maximum"); Assert.AreEqual(Iterations, criterium.MinimumNumberOfIterations, "Incorrect iteration count"); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Status check fail."); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Status check fail."); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/FailureStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/FailureStopCriteriumTest.cs index 58609468..7289b48f 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/FailureStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/FailureStopCriteriumTest.cs @@ -30,7 +30,7 @@ using MathNet.Numerics.LinearAlgebra.Single; using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; using System; @@ -64,30 +64,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite Assert.Throws(() => criterium.DetermineStatus(-1, DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 5), DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criterium = new FailureStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus(1, null, DenseVector.Create(3, i => 6), DenseVector.Create(4, i => 4))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new FailureStopCriterium(); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus(1, DenseVector.Create(3, i => 4), DenseVector.Create(3, i => 6), null)); - } - /// /// Determine status with non-matching vectors throws ArgumentException. /// @@ -114,7 +90,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite var residual = new DenseVector(new[] {1000, float.NaN, 2001}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationFailure), status, "Should be failed"); + Assert.AreEqual(IterationStatus.Failure, status, "Should be failed"); } /// @@ -131,7 +107,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite var residual = new DenseVector(new[] {1000.0f, 1000.0f, 2001.0f}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationFailure), status, "Should be failed"); + Assert.AreEqual(IterationStatus.Failure, status, "Should be failed"); } /// @@ -148,7 +124,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite var residual = new DenseVector(new[] {1.0f, 2.0f, 3.0f}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); } /// @@ -165,10 +141,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite var residual = new DenseVector(new[] {1000.0f, 1000.0f, 2001.0f}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs index 3abff679..51924ff8 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/IterationCountStopCriteriumTest.cs @@ -31,7 +31,6 @@ using System; using MathNet.Numerics.LinearAlgebra.Single; using MathNet.Numerics.LinearAlgebra.Solvers; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCriterium @@ -98,10 +97,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite Assert.IsNotNull(criterium, "A criterium should have been created"); var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); var status2 = criterium.DetermineStatus(10, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationStoppedWithoutConvergence), status2, "Should be finished"); + Assert.AreEqual(IterationStatus.StoppedWithoutConvergence, status2, "Should be finished"); } /// @@ -114,10 +113,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite Assert.IsNotNull(criterium, "A criterium should have been created"); var status = criterium.DetermineStatus(5, DenseVector.Create(3, i => 1), DenseVector.Create(3, i => 2), DenseVector.Create(3, i => 3)); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } /// diff --git a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs index 00cf9771..f3955bee 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/Solvers/StopCriterium/ResidualStopCriteriumTest.cs @@ -28,11 +28,11 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System; using MathNet.Numerics.LinearAlgebra.Single; using MathNet.Numerics.LinearAlgebra.Single.Solvers.StopCriterium; -using MathNet.Numerics.LinearAlgebra.Solvers.Status; +using MathNet.Numerics.LinearAlgebra.Solvers; using NUnit.Framework; -using System; namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCriterium { @@ -115,54 +115,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite DenseVector.Create(3, i => 6))); } - /// - /// Determine status with null solution vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSolutionVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - null, - DenseVector.Create(3, i => 5), - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null source vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullSourceVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - null, - DenseVector.Create(3, i => 6))); - } - - /// - /// Determine status with null residual vector throws ArgumentNullException. - /// - [Test] - public void DetermineStatusWithNullResidualVectorThrowsArgumentNullException() - { - var criterium = new ResidualStopCriterium(1e-6f, 50); - Assert.IsNotNull(criterium, "There should be a criterium"); - - Assert.Throws(() => criterium.DetermineStatus( - 1, - DenseVector.Create(3, i => 4), - DenseVector.Create(3, i => 5), - null)); - } - /// /// Determine status with non-matching solution vector throws ArgumentException. /// @@ -225,7 +177,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite var residual = new DenseVector(new[] {1000.0f, 1000.0f, 2001.0f}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Should be diverged"); + Assert.AreEqual(IterationStatus.Diverged, status, "Should be diverged"); } /// @@ -242,7 +194,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite var residual = new DenseVector(new[] {1000.0f, float.NaN, 2001.0f}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationDiverged), status, "Should be diverged"); + Assert.AreEqual(IterationStatus.Diverged, status, "Should be diverged"); } /// @@ -259,7 +211,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite var residual = new DenseVector(new[] {0.0f, 0.0f, 0.0f}); var status = criterium.DetermineStatus(0, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationConverged), status, "Should be done"); + Assert.AreEqual(IterationStatus.Converged, status, "Should be done"); } /// @@ -281,10 +233,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite var residual = new DenseVector(new[] {0.001f, 0.001f, 0.002f}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should still be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should still be running"); var status2 = criterium.DetermineStatus(16, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationConverged), status2, "Should be done"); + Assert.AreEqual(IterationStatus.Converged, status2, "Should be done"); } /// @@ -301,10 +253,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers.StopCrite var residual = new DenseVector(new[] {1.000f, 1.000f, 2.001f}); var status = criterium.DetermineStatus(5, solution, source, residual); - Assert.IsInstanceOf(typeof (CalculationRunning), status, "Should be running"); + Assert.AreEqual(IterationStatus.Running, status, "Should be running"); criterium.ResetToPrecalculationState(); - Assert.IsInstanceOf(typeof (CalculationIndetermined), criterium.Status, "Should not have started"); + Assert.AreEqual(IterationStatus.Indetermined, criterium.Status, "Should not have started"); } ///