Browse Source

Properly dispose all IEnumerator objects after IEnumerable<>.GetEnumerator() calls

la-knuth
nyuriks 15 years ago
committed by Christoph Ruegg
parent
commit
ab489a952a
  1. 91
      src/Numerics/Integration/Algorithms/NewtonCotesTrapeziumRule.cs
  2. 4
      src/Numerics/LinearAlgebra/Complex/Solvers/Iterator.cs
  3. 4
      src/Numerics/LinearAlgebra/Complex32/Solvers/Iterator.cs
  4. 4
      src/Numerics/LinearAlgebra/Double/Solvers/Iterator.cs
  5. 4
      src/Numerics/LinearAlgebra/Single/Solvers/Iterator.cs
  6. 30
      src/Numerics/Statistics/Correlation.cs
  7. 138
      src/Numerics/Statistics/Statistics.cs
  8. 111
      src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs
  9. 111
      src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs
  10. 14
      src/UnitTests/LinearAlgebraTests/Complex/Solvers/IteratorTest.cs
  11. 111
      src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs
  12. 111
      src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs
  13. 14
      src/UnitTests/LinearAlgebraTests/Complex32/Solvers/IteratorTest.cs
  14. 111
      src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs
  15. 111
      src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs
  16. 12
      src/UnitTests/LinearAlgebraTests/Double/Solvers/IteratorTest.cs
  17. 112
      src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs
  18. 111
      src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs
  19. 14
      src/UnitTests/LinearAlgebraTests/Single/Solvers/IteratorTest.cs

91
src/Numerics/Integration/Algorithms/NewtonCotesTrapeziumRule.cs

@ -183,66 +183,67 @@ namespace MathNet.Numerics.Integration.Algorithms
double linearOffset = 0.5 * (intervalEnd + intervalBegin); double linearOffset = 0.5 * (intervalEnd + intervalBegin);
targetRelativeError /= 5 * linearSlope; targetRelativeError /= 5 * linearSlope;
var abcissasIterator = levelAbscissas.GetEnumerator(); using (var abcissasIterator = levelAbscissas.GetEnumerator())
var weightsIterator = levelWeights.GetEnumerator(); using (var weightsIterator = levelWeights.GetEnumerator())
{
double step = levelOneStep;
double step = levelOneStep; // First Level
abcissasIterator.MoveNext();
weightsIterator.MoveNext();
double[] abcissasL1 = abcissasIterator.Current;
double[] weightsL1 = weightsIterator.Current;
// First Level double sum = f(linearOffset) * weightsL1[0];
abcissasIterator.MoveNext(); for (int i = 1; i < abcissasL1.Length; i++)
weightsIterator.MoveNext(); {
double[] abcissasL1 = abcissasIterator.Current; sum += weightsL1[i] * (f((linearSlope * abcissasL1[i]) + linearOffset) + f(-(linearSlope * abcissasL1[i]) + linearOffset));
double[] weightsL1 = weightsIterator.Current; }
double sum = f(linearOffset) * weightsL1[0]; sum *= step;
for (int i = 1; i < abcissasL1.Length; i++)
{
sum += weightsL1[i] * (f((linearSlope * abcissasL1[i]) + linearOffset) + f(-(linearSlope * abcissasL1[i]) + linearOffset));
}
sum *= step; // Additional Levels
double previousDelta = double.MaxValue;
for (int level = 1; abcissasIterator.MoveNext() && weightsIterator.MoveNext(); level++)
{
double[] abcissas = abcissasIterator.Current;
double[] weights = weightsIterator.Current;
// Additional Levels double midpointsum = 0;
double previousDelta = double.MaxValue; for (int i = 0; i < abcissas.Length; i++)
for (int level = 1; abcissasIterator.MoveNext() && weightsIterator.MoveNext(); level++) {
{ midpointsum += weights[i] * (f((linearSlope * abcissas[i]) + linearOffset) + f(-(linearSlope * abcissas[i]) + linearOffset));
double[] abcissas = abcissasIterator.Current; }
double[] weights = weightsIterator.Current;
double midpointsum = 0; midpointsum *= step;
for (int i = 0; i < abcissas.Length; i++) sum = 0.5 * (sum + midpointsum);
{ step *= 0.5;
midpointsum += weights[i] * (f((linearSlope * abcissas[i]) + linearOffset) + f(-(linearSlope * abcissas[i]) + linearOffset));
}
midpointsum *= step; double delta = Math.Abs(sum - midpointsum);
sum = 0.5 * (sum + midpointsum);
step *= 0.5;
double delta = Math.Abs(sum - midpointsum); if (level == 1)
{
previousDelta = delta;
continue;
}
if (level == 1) double r = Math.Log(delta) / Math.Log(previousDelta);
{
previousDelta = delta; previousDelta = delta;
continue;
}
double r = Math.Log(delta) / Math.Log(previousDelta); if (r > 1.9 && r < 2.1)
previousDelta = delta; {
// convergence region
delta = Math.Sqrt(delta);
}
if (r > 1.9 && r < 2.1) if (sum.AlmostEqualWithRelativeError(midpointsum, delta, targetRelativeError))
{ {
// convergence region break;
delta = Math.Sqrt(delta); }
} }
if (sum.AlmostEqualWithRelativeError(midpointsum, delta, targetRelativeError)) return sum * linearSlope;
{
break;
}
} }
return sum * linearSlope;
} }
} }
} }

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

@ -179,11 +179,11 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Solvers
/// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria. /// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria.
/// </summary> /// </summary>
/// <remarks>Used for testing only.</remarks> /// <remarks>Used for testing only.</remarks>
internal IEnumerator<IIterationStopCriterium> StoredStopCriteria internal IEnumerable<IIterationStopCriterium> StoredStopCriteria
{ {
get get
{ {
return _stopCriterias.Select(criterium => criterium.Value).GetEnumerator(); return _stopCriterias.Select(criterium => criterium.Value);
} }
} }

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

@ -179,11 +179,11 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Solvers
/// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria. /// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria.
/// </summary> /// </summary>
/// <remarks>Used for testing only.</remarks> /// <remarks>Used for testing only.</remarks>
internal IEnumerator<IIterationStopCriterium> StoredStopCriteria internal IEnumerable<IIterationStopCriterium> StoredStopCriteria
{ {
get get
{ {
return _stopCriterias.Select(criterium => criterium.Value).GetEnumerator(); return _stopCriterias.Select(criterium => criterium.Value);
} }
} }

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

@ -179,11 +179,11 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Solvers
/// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria. /// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria.
/// </summary> /// </summary>
/// <remarks>Used for testing only.</remarks> /// <remarks>Used for testing only.</remarks>
internal IEnumerator<IIterationStopCriterium> StoredStopCriteria internal IEnumerable<IIterationStopCriterium> StoredStopCriteria
{ {
get get
{ {
return _stopCriterias.Select(criterium => criterium.Value).GetEnumerator(); return _stopCriterias.Select(criterium => criterium.Value);
} }
} }

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

@ -179,11 +179,11 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Solvers
/// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria. /// Gets an <c>IEnumerator</c> that enumerates over all the stored stop criteria.
/// </summary> /// </summary>
/// <remarks>Used for testing only.</remarks> /// <remarks>Used for testing only.</remarks>
internal IEnumerator<IIterationStopCriterium> StoredStopCriteria internal IEnumerable<IIterationStopCriterium> StoredStopCriteria
{ {
get get
{ {
return _stopCriterias.Select(criterium => criterium.Value).GetEnumerator(); return _stopCriterias.Select(criterium => criterium.Value);
} }
} }

30
src/Numerics/Statistics/Correlation.cs

@ -49,27 +49,31 @@ namespace MathNet.Numerics.Statistics
{ {
int n = 0; int n = 0;
double r = 0.0; double r = 0.0;
// BUG: PERFORMANCE degraded due to tripple iteration over both IEnumerables
double meanA = dataA.Mean(); double meanA = dataA.Mean();
double meanB = dataB.Mean(); double meanB = dataB.Mean();
double sdevA = dataA.StandardDeviation(); double sdevA = dataA.StandardDeviation();
double sdevB = dataB.StandardDeviation(); double sdevB = dataB.StandardDeviation();
IEnumerator<double> ieA = dataA.GetEnumerator(); using (IEnumerator<double> ieA = dataA.GetEnumerator())
IEnumerator<double> ieB = dataB.GetEnumerator(); using (IEnumerator<double> ieB = dataB.GetEnumerator())
while (ieA.MoveNext())
{ {
if (ieB.MoveNext() == false) while (ieA.MoveNext())
{ {
throw new ArgumentOutOfRangeException("Datasets dataA and dataB need to have the same length."); if (!ieB.MoveNext())
} {
throw new ArgumentOutOfRangeException("dataB", "Datasets dataA and dataB need to have the same length. dataB is shorter.");
}
n++; n++;
r += (ieA.Current - meanA) * (ieB.Current - meanB) / (sdevA * sdevB); r += (ieA.Current - meanA) * (ieB.Current - meanB) / (sdevA * sdevB);
} }
if (ieB.MoveNext() == true) if (ieB.MoveNext())
{ {
throw new ArgumentOutOfRangeException("Datasets dataA and dataB need to have the same length."); throw new ArgumentOutOfRangeException("dataA", "Datasets dataA and dataB need to have the same length. dataA is shorter.");
}
} }
return r / (n - 1); return r / (n - 1);

138
src/Numerics/Statistics/Statistics.cs

@ -102,20 +102,22 @@ namespace MathNet.Numerics.Statistics
double t = 0; double t = 0;
ulong j = 0; ulong j = 0;
IEnumerator<double> iterator = data.GetEnumerator(); using (IEnumerator<double> iterator = data.GetEnumerator())
if (iterator.MoveNext())
{ {
j++; if (iterator.MoveNext())
t = iterator.Current; {
} j++;
t = iterator.Current;
}
while (iterator.MoveNext()) while (iterator.MoveNext())
{ {
j++; j++;
double xi = iterator.Current; double xi = iterator.Current;
t += xi; t += xi;
double diff = (j * xi) - t; double diff = (j * xi) - t;
variance += (diff * diff) / (j * (j - 1)); variance += (diff * diff) / (j * (j - 1));
}
} }
return variance / (j - 1); return variance / (j - 1);
@ -137,33 +139,34 @@ namespace MathNet.Numerics.Statistics
double t = 0; double t = 0;
ulong j = 0; ulong j = 0;
IEnumerator<double?> iterator = data.GetEnumerator(); using (IEnumerator<double?> iterator = data.GetEnumerator())
while (true)
{ {
bool hasNext = iterator.MoveNext(); while (true)
if (!hasNext)
{ {
break; bool hasNext = iterator.MoveNext();
} if (!hasNext)
{
break;
}
if (iterator.Current.HasValue) if (iterator.Current.HasValue)
{ {
j++; j++;
t = iterator.Current.Value; t = iterator.Current.Value;
break; break;
}
} }
}
while (iterator.MoveNext()) while (iterator.MoveNext())
{
if (iterator.Current.HasValue)
{ {
j++; if (iterator.Current.HasValue)
double xi = iterator.Current.Value; {
t += xi; j++;
double diff = (j * xi) - t; double xi = iterator.Current.Value;
variance += (diff * diff) / (j * (j - 1)); t += xi;
double diff = (j * xi) - t;
variance += (diff * diff) / (j * (j - 1));
}
} }
} }
@ -186,20 +189,22 @@ namespace MathNet.Numerics.Statistics
double t = 0; double t = 0;
ulong j = 0; ulong j = 0;
IEnumerator<double> iterator = data.GetEnumerator(); using (IEnumerator<double> iterator = data.GetEnumerator())
if (iterator.MoveNext())
{ {
j++; if (iterator.MoveNext())
t = iterator.Current; {
} j++;
t = iterator.Current;
}
while (iterator.MoveNext()) while (iterator.MoveNext())
{ {
j++; j++;
double xi = iterator.Current; double xi = iterator.Current;
t += xi; t += xi;
double diff = (j * xi) - t; double diff = (j * xi) - t;
variance += (diff * diff) / (j * (j - 1)); variance += (diff * diff) / (j * (j - 1));
}
} }
return variance / j; return variance / j;
@ -221,33 +226,34 @@ namespace MathNet.Numerics.Statistics
double t = 0; double t = 0;
ulong j = 0; ulong j = 0;
IEnumerator<double?> iterator = data.GetEnumerator(); using (IEnumerator<double?> iterator = data.GetEnumerator())
while (true)
{ {
bool hasNext = iterator.MoveNext(); while (true)
if (!hasNext)
{ {
break; bool hasNext = iterator.MoveNext();
} if (!hasNext)
{
break;
}
if (iterator.Current.HasValue) if (iterator.Current.HasValue)
{ {
j++; j++;
t = iterator.Current.Value; t = iterator.Current.Value;
break; break;
}
} }
}
while (iterator.MoveNext()) while (iterator.MoveNext())
{
if (iterator.Current.HasValue)
{ {
j++; if (iterator.Current.HasValue)
double xi = iterator.Current.Value; {
t += xi; j++;
double diff = (j * xi) - t; double xi = iterator.Current.Value;
variance += (diff * diff) / (j * (j - 1)); t += xi;
double diff = (j * xi) - t;
variance += (diff * diff) / (j * (j - 1));
}
} }
} }

111
src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs

@ -536,61 +536,62 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
public override void CanUseIndexedEnumerator() public override void CanUseIndexedEnumerator()
{ {
var matrix = TestMatrices["Singular3x3"]; var matrix = TestMatrices["Singular3x3"];
var enumerator = matrix.IndexedEnumerator().GetEnumerator(); using (var enumerator = matrix.IndexedEnumerator().GetEnumerator())
{
enumerator.MoveNext(); enumerator.MoveNext();
var item = enumerator.Current; var item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(new Complex(1.0, 1.0), item.Item3); Assert.AreEqual(new Complex(1.0, 1.0), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(Complex.Zero, item.Item3); Assert.AreEqual(Complex.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(Complex.Zero, item.Item3); Assert.AreEqual(Complex.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(Complex.Zero, item.Item3); Assert.AreEqual(Complex.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(Complex.Zero, item.Item3); Assert.AreEqual(Complex.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(Complex.Zero, item.Item3); Assert.AreEqual(Complex.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(Complex.Zero, item.Item3); Assert.AreEqual(Complex.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(Complex.Zero, item.Item3); Assert.AreEqual(Complex.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(new Complex(3.0, 1.0), item.Item3); Assert.AreEqual(new Complex(3.0, 1.0), item.Item3);
}
} }
/// <summary> /// <summary>

111
src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs

@ -1893,61 +1893,62 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
public virtual void CanUseIndexedEnumerator() public virtual void CanUseIndexedEnumerator()
{ {
var matrix = TestMatrices["Singular3x3"]; var matrix = TestMatrices["Singular3x3"];
var enumerator = matrix.IndexedEnumerator().GetEnumerator(); using (var enumerator = matrix.IndexedEnumerator().GetEnumerator())
{
enumerator.MoveNext(); enumerator.MoveNext();
var item = enumerator.Current; var item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(new Complex(1.0, 1.0), item.Item3); Assert.AreEqual(new Complex(1.0, 1.0), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(new Complex(1.0, 1.0), item.Item3); Assert.AreEqual(new Complex(1.0, 1.0), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(new Complex(2.0, 1.0), item.Item3); Assert.AreEqual(new Complex(2.0, 1.0), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(new Complex(1.0, 1.0), item.Item3); Assert.AreEqual(new Complex(1.0, 1.0), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(new Complex(1.0, 1.0), item.Item3); Assert.AreEqual(new Complex(1.0, 1.0), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(new Complex(2.0, 1.0), item.Item3); Assert.AreEqual(new Complex(2.0, 1.0), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(new Complex(1.0, 1.0), item.Item3); Assert.AreEqual(new Complex(1.0, 1.0), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(new Complex(1.0, 1.0), item.Item3); Assert.AreEqual(new Complex(1.0, 1.0), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(new Complex(2.0, 1.0), item.Item3); Assert.AreEqual(new Complex(2.0, 1.0), item.Item3);
}
} }
/// <summary> /// <summary>

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

@ -104,10 +104,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
// Check that we have all the criteria // Check that we have all the criteria
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
var enumerator = iterator.StoredStopCriteria; foreach (var criterium in iterator.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current;
Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing"); Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing");
} }
} }
@ -159,10 +157,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
// Check that we have all the criteria // Check that we have all the criteria
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
var enumerator = iterator.StoredStopCriteria; foreach (var criterium in iterator.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current;
Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing"); Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing");
} }
} }
@ -418,11 +414,9 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Solvers
Assert.AreEqual(iterator.NumberOfCriteria, clone.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(iterator.NumberOfCriteria, clone.NumberOfCriteria, "Incorrect criterium count");
// ReSharper restore PossibleNullReferenceException // ReSharper restore PossibleNullReferenceException
var enumerator = clone.StoredStopCriteria; foreach (var criterium in clone.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current; Assert.IsTrue(criteria.Exists(c => c.GetType() == criterium.GetType()), "Criterium missing");
Assert.IsTrue(criteria.Exists(c => c.GetType().Equals(criterium.GetType())), "Criterium missing");
} }
} }
} }

111
src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs

@ -536,61 +536,62 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
public override void CanUseIndexedEnumerator() public override void CanUseIndexedEnumerator()
{ {
var matrix = TestMatrices["Singular3x3"]; var matrix = TestMatrices["Singular3x3"];
var enumerator = matrix.IndexedEnumerator().GetEnumerator(); using (var enumerator = matrix.IndexedEnumerator().GetEnumerator())
{
enumerator.MoveNext(); enumerator.MoveNext();
var item = enumerator.Current; var item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(Complex32.Zero, item.Item3); Assert.AreEqual(Complex32.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(Complex32.Zero, item.Item3); Assert.AreEqual(Complex32.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(Complex32.Zero, item.Item3); Assert.AreEqual(Complex32.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(Complex32.Zero, item.Item3); Assert.AreEqual(Complex32.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(Complex32.Zero, item.Item3); Assert.AreEqual(Complex32.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(Complex32.Zero, item.Item3); Assert.AreEqual(Complex32.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(Complex32.Zero, item.Item3); Assert.AreEqual(Complex32.Zero, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(new Complex32(3.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(3.0f, 1.0f), item.Item3);
}
} }
/// <summary> /// <summary>

111
src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs

@ -1893,61 +1893,62 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
public virtual void CanUseIndexedEnumerator() public virtual void CanUseIndexedEnumerator()
{ {
var matrix = TestMatrices["Singular3x3"]; var matrix = TestMatrices["Singular3x3"];
var enumerator = matrix.IndexedEnumerator().GetEnumerator(); using (var enumerator = matrix.IndexedEnumerator().GetEnumerator())
{
enumerator.MoveNext(); enumerator.MoveNext();
var item = enumerator.Current; var item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(new Complex32(2.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(2.0f, 1.0f), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(new Complex32(2.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(2.0f, 1.0f), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(1.0f, 1.0f), item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(new Complex32(2.0f, 1.0f), item.Item3); Assert.AreEqual(new Complex32(2.0f, 1.0f), item.Item3);
}
} }
/// <summary> /// <summary>

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

@ -103,10 +103,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
// Check that we have all the criteria // Check that we have all the criteria
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
var enumerator = iterator.StoredStopCriteria; foreach (var criterium in iterator.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current;
Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing"); Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing");
} }
} }
@ -158,10 +156,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
// Check that we have all the criteria // Check that we have all the criteria
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
var enumerator = iterator.StoredStopCriteria; foreach (var criterium in iterator.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current;
Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing"); Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing");
} }
} }
@ -417,11 +413,9 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Solvers
Assert.AreEqual(iterator.NumberOfCriteria, clone.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(iterator.NumberOfCriteria, clone.NumberOfCriteria, "Incorrect criterium count");
// ReSharper restore PossibleNullReferenceException // ReSharper restore PossibleNullReferenceException
var enumerator = clone.StoredStopCriteria; foreach (var criterium in clone.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current; Assert.IsTrue(criteria.Exists(c => c.GetType() == criterium.GetType()), "Criterium missing");
Assert.IsTrue(criteria.Exists(c => c.GetType().Equals(criterium.GetType())), "Criterium missing");
} }
} }
} }

111
src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs

@ -536,61 +536,62 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
public override void CanUseIndexedEnumerator() public override void CanUseIndexedEnumerator()
{ {
var matrix = TestMatrices["Singular3x3"]; var matrix = TestMatrices["Singular3x3"];
var enumerator = matrix.IndexedEnumerator().GetEnumerator(); using (var enumerator = matrix.IndexedEnumerator().GetEnumerator())
{
enumerator.MoveNext(); enumerator.MoveNext();
var item = enumerator.Current; var item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(1.0, item.Item3); Assert.AreEqual(1.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(0.0, item.Item3); Assert.AreEqual(0.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(0.0, item.Item3); Assert.AreEqual(0.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(0.0, item.Item3); Assert.AreEqual(0.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(0.0, item.Item3); Assert.AreEqual(0.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(0.0, item.Item3); Assert.AreEqual(0.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(0.0, item.Item3); Assert.AreEqual(0.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(0.0, item.Item3); Assert.AreEqual(0.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(3.0, item.Item3); Assert.AreEqual(3.0, item.Item3);
}
} }
/// <summary> /// <summary>

111
src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs

@ -1830,61 +1830,62 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
public virtual void CanUseIndexedEnumerator() public virtual void CanUseIndexedEnumerator()
{ {
var matrix = TestMatrices["Singular3x3"]; var matrix = TestMatrices["Singular3x3"];
var enumerator = matrix.IndexedEnumerator().GetEnumerator(); using (var enumerator = matrix.IndexedEnumerator().GetEnumerator())
{
enumerator.MoveNext(); enumerator.MoveNext();
var item = enumerator.Current; var item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(1.0, item.Item3); Assert.AreEqual(1.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(1.0, item.Item3); Assert.AreEqual(1.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(2.0, item.Item3); Assert.AreEqual(2.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(1.0, item.Item3); Assert.AreEqual(1.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(1.0, item.Item3); Assert.AreEqual(1.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(2.0, item.Item3); Assert.AreEqual(2.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(1.0, item.Item3); Assert.AreEqual(1.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(1.0, item.Item3); Assert.AreEqual(1.0, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(2.0, item.Item3); Assert.AreEqual(2.0, item.Item3);
}
} }
/// <summary> /// <summary>

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

@ -104,10 +104,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
// Check that we have all the criteria // Check that we have all the criteria
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
var enumerator = iterator.StoredStopCriteria; foreach (var criterium in iterator.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current;
Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing"); Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing");
} }
} }
@ -159,10 +157,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
// Check that we have all the criteria // Check that we have all the criteria
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
var enumerator = iterator.StoredStopCriteria; foreach (var criterium in iterator.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current;
Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing"); Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing");
} }
} }
@ -418,10 +414,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Solvers
Assert.AreEqual(iterator.NumberOfCriteria, clone.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(iterator.NumberOfCriteria, clone.NumberOfCriteria, "Incorrect criterium count");
// ReSharper restore PossibleNullReferenceException // ReSharper restore PossibleNullReferenceException
var enumerator = clone.StoredStopCriteria; foreach (var criterium in clone.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current;
Assert.IsTrue(criteria.Exists(c => c.GetType().Equals(criterium.GetType())), "Criterium missing"); Assert.IsTrue(criteria.Exists(c => c.GetType().Equals(criterium.GetType())), "Criterium missing");
} }
} }

112
src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs

@ -535,61 +535,63 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
public override void CanUseIndexedEnumerator() public override void CanUseIndexedEnumerator()
{ {
var matrix = TestMatrices["Singular3x3"]; var matrix = TestMatrices["Singular3x3"];
var enumerator = matrix.IndexedEnumerator().GetEnumerator(); using (var enumerator = matrix.IndexedEnumerator().GetEnumerator())
{
enumerator.MoveNext(); enumerator.MoveNext();
var item = enumerator.Current; var item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(1.0f, item.Item3); Assert.AreEqual(1.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(0.0f, item.Item3); Assert.AreEqual(0.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(0.0f, item.Item3); Assert.AreEqual(0.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(0.0f, item.Item3); Assert.AreEqual(0.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(0.0f, item.Item3); Assert.AreEqual(0.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(0.0f, item.Item3); Assert.AreEqual(0.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(0.0f, item.Item3); Assert.AreEqual(0.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(0.0f, item.Item3); Assert.AreEqual(0.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(3.0f, item.Item3); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(3.0f, item.Item3);
}
} }
/// <summary> /// <summary>

111
src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs

@ -1830,61 +1830,62 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
public virtual void CanUseIndexedEnumerator() public virtual void CanUseIndexedEnumerator()
{ {
var matrix = TestMatrices["Singular3x3"]; var matrix = TestMatrices["Singular3x3"];
var enumerator = matrix.IndexedEnumerator().GetEnumerator(); using (var enumerator = matrix.IndexedEnumerator().GetEnumerator())
{
enumerator.MoveNext(); enumerator.MoveNext();
var item = enumerator.Current; var item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(1.0f, item.Item3); Assert.AreEqual(1.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(1.0f, item.Item3); Assert.AreEqual(1.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(0, item.Item1); Assert.AreEqual(0, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(2.0f, item.Item3); Assert.AreEqual(2.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(1.0f, item.Item3); Assert.AreEqual(1.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(1.0f, item.Item3); Assert.AreEqual(1.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(1, item.Item1); Assert.AreEqual(1, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(2.0f, item.Item3); Assert.AreEqual(2.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(0, item.Item2); Assert.AreEqual(0, item.Item2);
Assert.AreEqual(1.0f, item.Item3); Assert.AreEqual(1.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(1, item.Item2); Assert.AreEqual(1, item.Item2);
Assert.AreEqual(1.0f, item.Item3); Assert.AreEqual(1.0f, item.Item3);
enumerator.MoveNext(); enumerator.MoveNext();
item = enumerator.Current; item = enumerator.Current;
Assert.AreEqual(2, item.Item1); Assert.AreEqual(2, item.Item1);
Assert.AreEqual(2, item.Item2); Assert.AreEqual(2, item.Item2);
Assert.AreEqual(2.0f, item.Item3); Assert.AreEqual(2.0f, item.Item3);
}
} }
/// <summary> /// <summary>

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

@ -103,10 +103,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
// Check that we have all the criteria // Check that we have all the criteria
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
var enumerator = iterator.StoredStopCriteria; foreach (var criterium in iterator.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current;
Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing"); Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing");
} }
} }
@ -158,10 +156,8 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
// Check that we have all the criteria // Check that we have all the criteria
Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(criteria.Count, iterator.NumberOfCriteria, "Incorrect criterium count");
var enumerator = iterator.StoredStopCriteria; foreach (var criterium in iterator.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current;
Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing"); Assert.IsTrue(criteria.Exists(c => ReferenceEquals(c, criterium)), "Criterium missing");
} }
} }
@ -417,11 +413,9 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Solvers
Assert.AreEqual(iterator.NumberOfCriteria, clone.NumberOfCriteria, "Incorrect criterium count"); Assert.AreEqual(iterator.NumberOfCriteria, clone.NumberOfCriteria, "Incorrect criterium count");
// ReSharper restore PossibleNullReferenceException // ReSharper restore PossibleNullReferenceException
var enumerator = clone.StoredStopCriteria; foreach (var criterium in clone.StoredStopCriteria)
while (enumerator.MoveNext())
{ {
var criterium = enumerator.Current; Assert.IsTrue(criteria.Exists(c => c.GetType() == criterium.GetType()), "Criterium missing");
Assert.IsTrue(criteria.Exists(c => c.GetType().Equals(criterium.GetType())), "Criterium missing");
} }
} }
} }

Loading…
Cancel
Save