@ -1,10 +1,10 @@
// <copyright file="ResidualStopCriterium Test.cs" company="Math.NET">
// <copyright file="ResidualStopCriterion Test.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
//
// Copyright (c) 2009-2013 Math.NET
// Copyright (c) 2009-2014 Math.NET
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
@ -34,19 +34,20 @@ using MathNet.Numerics.LinearAlgebra.Complex;
using MathNet.Numerics.LinearAlgebra.Solvers ;
using NUnit.Framework ;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCriterium
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCriterion
{
#if NOSYSNUMERICS
using Complex = Numerics . Complex ;
#else
using Complex = System . Numerics . Complex ;
#endif
/// <summary>
/// Residual stop criterium tests.
/// Residual stop criterion tests.
/// </summary>
[TestFixture, Category("LASolver")]
public sealed class ResidualStopCriterium Test
public sealed class ResidualStopCriterion Test
{
/// <summary>
/// Create with negative maximum throws <c>ArgumentOutOfRangeException</c>.
@ -54,7 +55,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void CreateWithNegativeMaximumThrowsArgumentOutOfRangeException ( )
{
Assert . That ( ( ) = > new ResidualStopCriterium < Complex > ( - 0.1 ) , Throws . TypeOf < ArgumentOutOfRangeException > ( ) ) ;
Assert . That ( ( ) = > new ResidualStopCriterion < Complex > ( - 0.1 ) , Throws . TypeOf < ArgumentOutOfRangeException > ( ) ) ;
}
/// <summary>
@ -63,7 +64,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void CreateWithIllegalMinimumIterationsThrowsArgumentOutOfRangeException ( )
{
Assert . That ( ( ) = > new ResidualStopCriterium < Complex > ( - 1 ) , Throws . TypeOf < ArgumentOutOfRangeException > ( ) ) ;
Assert . That ( ( ) = > new ResidualStopCriterion < Complex > ( - 1 ) , Throws . TypeOf < ArgumentOutOfRangeException > ( ) ) ;
}
/// <summary>
@ -72,10 +73,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void Create ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-8 , 5 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-8 , 5 0 ) ;
Assert . AreEqual ( 1e-8 , criterium . Maximum , "Incorrect maximum" ) ;
Assert . AreEqual ( 5 0 , criterium . MinimumIterationsBelowMaximum , "Incorrect iteration count" ) ;
Assert . AreEqual ( 1e-8 , criterion . Maximum , "Incorrect maximum" ) ;
Assert . AreEqual ( 5 0 , criterion . MinimumIterationsBelowMaximum , "Incorrect iteration count" ) ;
}
/// <summary>
@ -84,9 +85,9 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void DetermineStatusWithIllegalIterationNumberThrowsArgumentOutOfRangeException ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-8 , 5 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-8 , 5 0 ) ;
Assert . That ( ( ) = > criterium . DetermineStatus (
Assert . That ( ( ) = > criterion . DetermineStatus (
- 1 ,
Vector < Complex > . Build . Dense ( 3 , 4 ) ,
Vector < Complex > . Build . Dense ( 3 , 5 ) ,
@ -99,9 +100,9 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void DetermineStatusWithNonMatchingSolutionVectorThrowsArgumentException ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-8 , 5 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-8 , 5 0 ) ;
Assert . That ( ( ) = > criterium . DetermineStatus (
Assert . That ( ( ) = > criterion . DetermineStatus (
1 ,
Vector < Complex > . Build . Dense ( 4 , 4 ) ,
Vector < Complex > . Build . Dense ( 3 , 4 ) ,
@ -114,9 +115,9 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void DetermineStatusWithNonMatchingSourceVectorThrowsArgumentException ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-8 , 5 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-8 , 5 0 ) ;
Assert . That ( ( ) = > criterium . DetermineStatus (
Assert . That ( ( ) = > criterion . DetermineStatus (
1 ,
Vector < Complex > . Build . Dense ( 3 , 4 ) ,
Vector < Complex > . Build . Dense ( 4 , 4 ) ,
@ -129,9 +130,9 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void DetermineStatusWithNonMatchingResidualVectorThrowsArgumentException ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-8 , 5 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-8 , 5 0 ) ;
Assert . That ( ( ) = > criterium . DetermineStatus (
Assert . That ( ( ) = > criterion . DetermineStatus (
1 ,
Vector < Complex > . Build . Dense ( 3 , 4 ) ,
Vector < Complex > . Build . Dense ( 3 , 4 ) ,
@ -144,13 +145,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void DetermineStatusWithSourceNaN ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-3 , 1 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-3 , 1 0 ) ;
var solution = new DenseVector ( new [ ] { new Complex ( 1.0 , 1 ) , new Complex ( 1.0 , 1 ) , new Complex ( 2.0 , 1 ) } ) ;
var source = new DenseVector ( new [ ] { new Complex ( 1.0 , 1 ) , new Complex ( 1.0 , 1 ) , new Complex ( double . NaN , 1 ) } ) ;
var residual = new DenseVector ( new [ ] { new Complex ( 1 0 0 0.0 , 1 ) , new Complex ( 1 0 0 0.0 , 1 ) , new Complex ( 2 0 0 1.0 , 1 ) } ) ;
var solution = new DenseVector ( new [ ] { new Complex ( 1.0 , 1 ) , new Complex ( 1.0 , 1 ) , new Complex ( 2.0 , 1 ) } ) ;
var source = new DenseVector ( new [ ] { new Complex ( 1.0 , 1 ) , new Complex ( 1.0 , 1 ) , new Complex ( double . NaN , 1 ) } ) ;
var residual = new DenseVector ( new [ ] { new Complex ( 1 0 0 0.0 , 1 ) , new Complex ( 1 0 0 0.0 , 1 ) , new Complex ( 2 0 0 1.0 , 1 ) } ) ;
var status = criterium . DetermineStatus ( 5 , solution , source , residual ) ;
var status = criterion . DetermineStatus ( 5 , solution , source , residual ) ;
Assert . AreEqual ( IterationStatus . Diverged , status , "Should be diverged" ) ;
}
@ -160,13 +161,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void DetermineStatusWithResidualNaN ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-3 , 1 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-3 , 1 0 ) ;
var solution = new DenseVector ( new [ ] { new Complex ( 1.0 , 1 ) , new Complex ( 1.0 , 1 ) , new Complex ( 2.0 , 1 ) } ) ;
var source = new DenseVector ( new [ ] { new Complex ( 1.0 , 1 ) , new Complex ( 1.0 , 1 ) , new Complex ( 2.0 , 1 ) } ) ;
var residual = new DenseVector ( new [ ] { new Complex ( 1 0 0 0.0 , 1 ) , new Complex ( double . NaN , 1 ) , new Complex ( 2 0 0 1.0 , 1 ) } ) ;
var solution = new DenseVector ( new [ ] { new Complex ( 1.0 , 1 ) , new Complex ( 1.0 , 1 ) , new Complex ( 2.0 , 1 ) } ) ;
var source = new DenseVector ( new [ ] { new Complex ( 1.0 , 1 ) , new Complex ( 1.0 , 1 ) , new Complex ( 2.0 , 1 ) } ) ;
var residual = new DenseVector ( new [ ] { new Complex ( 1 0 0 0.0 , 1 ) , new Complex ( double . NaN , 1 ) , new Complex ( 2 0 0 1.0 , 1 ) } ) ;
var status = criterium . DetermineStatus ( 5 , solution , source , residual ) ;
var status = criterion . DetermineStatus ( 5 , solution , source , residual ) ;
Assert . AreEqual ( IterationStatus . Diverged , status , "Should be diverged" ) ;
}
@ -175,18 +176,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
/// </summary>
/// <remarks>Bugfix: The unit tests for the BiCgStab solver run with a super simple matrix equation
/// which converges at the first iteration. The default settings for the
/// residual stop criterium should be able to handle this.
/// residual stop criterion should be able to handle this.
/// </remarks>
[Test]
public void DetermineStatusWithConvergenceAtFirstIteration ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-12 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-12 ) ;
var solution = new DenseVector ( new [ ] { Complex . One , Complex . One , Complex . One } ) ;
var source = new DenseVector ( new [ ] { Complex . One , Complex . One , Complex . One } ) ;
var residual = new DenseVector ( new [ ] { Complex . Zero , Complex . Zero , Complex . Zero } ) ;
var solution = new DenseVector ( new [ ] { Complex . One , Complex . One , Complex . One } ) ;
var source = new DenseVector ( new [ ] { Complex . One , Complex . One , Complex . One } ) ;
var residual = new DenseVector ( new [ ] { Complex . Zero , Complex . Zero , Complex . Zero } ) ;
var status = criterium . DetermineStatus ( 0 , solution , source , residual ) ;
var status = criterion . DetermineStatus ( 0 , solution , source , residual ) ;
Assert . AreEqual ( IterationStatus . Converged , status , "Should be done" ) ;
}
@ -196,21 +197,21 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void DetermineStatus ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-3 , 1 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-3 , 1 0 ) ;
// the solution vector isn't actually being used so ...
var solution = new DenseVector ( new [ ] { new Complex ( double . NaN , double . NaN ) , new Complex ( double . NaN , double . NaN ) , new Complex ( double . NaN , double . NaN ) } ) ;
var solution = new DenseVector ( new [ ] { new Complex ( double . NaN , double . NaN ) , new Complex ( double . NaN , double . NaN ) , new Complex ( double . NaN , double . NaN ) } ) ;
// Set the source values
var source = new DenseVector ( new [ ] { new Complex ( 1.000 , 1 ) , new Complex ( 1.000 , 1 ) , new Complex ( 2.001 , 1 ) } ) ;
var source = new DenseVector ( new [ ] { new Complex ( 1.000 , 1 ) , new Complex ( 1.000 , 1 ) , new Complex ( 2.001 , 1 ) } ) ;
// Set the residual values
var residual = new DenseVector ( new [ ] { new Complex ( 0.001 , 0 ) , new Complex ( 0.001 , 0 ) , new Complex ( 0.002 , 0 ) } ) ;
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 ) ;
var status = criterion . DetermineStatus ( 5 , solution , source , residual ) ;
Assert . AreEqual ( IterationStatus . Continue , status , "Should still be running" ) ;
var status2 = criterium . DetermineStatus ( 1 6 , solution , source , residual ) ;
var status2 = criterion . DetermineStatus ( 1 6 , solution , source , residual ) ;
Assert . AreEqual ( IterationStatus . Converged , status2 , "Should be done" ) ;
}
@ -220,36 +221,36 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers.StopCrit
[Test]
public void ResetCalculationState ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-3 , 1 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-3 , 1 0 ) ;
var solution = new DenseVector ( new [ ] { new Complex ( 0.001 , 1 ) , new Complex ( 0.001 , 1 ) , new Complex ( 0.002 , 1 ) } ) ;
var source = new DenseVector ( new [ ] { new Complex ( 0.001 , 1 ) , new Complex ( 0.001 , 1 ) , new Complex ( 0.002 , 1 ) } ) ;
var residual = new DenseVector ( new [ ] { new Complex ( 1.000 , 0 ) , new Complex ( 1.000 , 0 ) , new Complex ( 2.001 , 0 ) } ) ;
var solution = new DenseVector ( new [ ] { new Complex ( 0.001 , 1 ) , new Complex ( 0.001 , 1 ) , new Complex ( 0.002 , 1 ) } ) ;
var source = new DenseVector ( new [ ] { new Complex ( 0.001 , 1 ) , new Complex ( 0.001 , 1 ) , new Complex ( 0.002 , 1 ) } ) ;
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 ) ;
var status = criterion . DetermineStatus ( 5 , solution , source , residual ) ;
Assert . AreEqual ( IterationStatus . Continue , status , "Should be running" ) ;
criterium . Reset ( ) ;
Assert . AreEqual ( IterationStatus . Continue , criterium . Status , "Should not have started" ) ;
criterion . Reset ( ) ;
Assert . AreEqual ( IterationStatus . Continue , criterion . Status , "Should not have started" ) ;
}
/// <summary>
/// Can clone stop criterium .
/// Can clone stop criterion .
/// </summary>
[Test]
public void Clone ( )
{
var criterium = new ResidualStopCriterium < Complex > ( 1e-3 , 1 0 ) ;
var criterion = new ResidualStopCriterion < Complex > ( 1e-3 , 1 0 ) ;
var clone = criterium . Clone ( ) ;
Assert . IsInstanceOf ( typeof ( ResidualStopCriterium < Complex > ) , clone , "Wrong criterium type" ) ;
var clone = criterion . Clone ( ) ;
Assert . IsInstanceOf ( typeof ( ResidualStopCriterion < Complex > ) , clone , "Wrong criterion type" ) ;
var clonedCriterium = clone as ResidualStopCriterium < Complex > ;
Assert . IsNotNull ( clonedCriterium ) ;
var clonedCriterion = clone as ResidualStopCriterion < Complex > ;
Assert . IsNotNull ( clonedCriterion ) ;
// ReSharper disable PossibleNullReferenceException
Assert . AreEqual ( criterium . Maximum , clonedCriterium . Maximum , "Clone failed" ) ;
Assert . AreEqual ( criterium . MinimumIterationsBelowMaximum , clonedCriterium . MinimumIterationsBelowMaximum , "Clone failed" ) ;
Assert . AreEqual ( criterion . Maximum , clonedCriterion . Maximum , "Clone failed" ) ;
Assert . AreEqual ( criterion . MinimumIterationsBelowMaximum , clonedCriterion . MinimumIterationsBelowMaximum , "Clone failed" ) ;
// ReSharper restore PossibleNullReferenceException
}