From 7d613342820eebe14dd8fca4987b84ec9cc612e2 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sat, 29 Apr 2017 15:11:36 +0200 Subject: [PATCH] Optimization: fix portable builds: covariance and type inferrence --- .../OptimizationTests/BfgsBMinimizerTests.cs | 119 +++++++++--------- .../OptimizationTests/BfgsMinimizerTests.cs | 50 ++++---- .../ConjugateGradientMinimizerTests.cs | 2 +- .../NelderMeadSimplexTests.cs | 2 +- .../OptimizationTests/NewtonMinimizerTests.cs | 4 +- 5 files changed, 89 insertions(+), 88 deletions(-) diff --git a/src/UnitTests/OptimizationTests/BfgsBMinimizerTests.cs b/src/UnitTests/OptimizationTests/BfgsBMinimizerTests.cs index 19ff2773..cb4c5547 100644 --- a/src/UnitTests/OptimizationTests/BfgsBMinimizerTests.cs +++ b/src/UnitTests/OptimizationTests/BfgsBMinimizerTests.cs @@ -42,86 +42,86 @@ using NUnit.Framework.Interfaces; namespace MathNet.Numerics.UnitTests.OptimizationTests { - [TestFixture] - public class BfgsBMinimizerTests - { - [Test] - public void FindMinimum_Rosenbrock_Easy() - { + [TestFixture] + public class BfgsBMinimizerTests + { + [Test] + public void FindMinimum_Rosenbrock_Easy() + { var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); - var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); - var lowerBound = new DenseVector(new[]{ -5.0, -5.0 }); - var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); - var initialGuess = new DenseVector(new[] { 1.2, 1.2 }); + var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); + var lowerBound = new DenseVector(new[]{ -5.0, -5.0 }); + var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); + var initialGuess = new DenseVector(new[] { 1.2, 1.2 }); - var result = solver.FindMinimum(obj, lowerBound, upperBound, initialGuess); + var result = solver.FindMinimum(obj, lowerBound, upperBound, initialGuess); - Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); - Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); - } + Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); + } - [Test] - public void FindMinimum_Rosenbrock_Hard() - { + [Test] + public void FindMinimum_Rosenbrock_Hard() + { var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); - var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); + var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); - var lowerBound = new DenseVector(new[]{ -5.0, -5.0 }); - var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); + var lowerBound = new DenseVector(new[]{ -5.0, -5.0 }); + var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); - var initialGuess = new DenseVector (new[]{ -1.2, 1.0 }); + var initialGuess = new DenseVector (new[]{ -1.2, 1.0 }); - var result = solver.FindMinimum(obj, lowerBound, upperBound, initialGuess); + var result = solver.FindMinimum(obj, lowerBound, upperBound, initialGuess); - Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); - Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); - } + Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); + } - [Test] - public void FindMinimum_Rosenbrock_Overton() - { + [Test] + public void FindMinimum_Rosenbrock_Overton() + { var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); - var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); + var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); - var lowerBound = new DenseVector(new[]{ -5.0, -5.0 }); - var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); - var initialGuess = new DenseVector (new[]{ -0.9, -0.5 }); + var lowerBound = new DenseVector(new[]{ -5.0, -5.0 }); + var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); + var initialGuess = new DenseVector (new[]{ -0.9, -0.5 }); - var result = solver.FindMinimum (obj, lowerBound, upperBound, initialGuess); + var result = solver.FindMinimum (obj, lowerBound, upperBound, initialGuess); - Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); - Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); - } + Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); + } - [Test] - public void FindMinimum_Rosenbrock_Easy_OneBoundary() - { + [Test] + public void FindMinimum_Rosenbrock_Easy_OneBoundary() + { var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); - var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); - var lowerBound = new DenseVector(new[]{ 1.0, -5.0 }); - var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); - var initialGuess = new DenseVector(new[] { 1.2, 1.2 }); + var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); + var lowerBound = new DenseVector(new[]{ 1.0, -5.0 }); + var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); + var initialGuess = new DenseVector(new[] { 1.2, 1.2 }); - var result = solver.FindMinimum(obj, lowerBound, upperBound, initialGuess); + var result = solver.FindMinimum(obj, lowerBound, upperBound, initialGuess); - Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); - Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); - } + Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); + } - [Test] - public void FindMinimum_Rosenbrock_Easy_TwoBoundaries() - { + [Test] + public void FindMinimum_Rosenbrock_Easy_TwoBoundaries() + { var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); - var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); - var lowerBound = new DenseVector(new[]{ 1.0, 1.0 }); - var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); - var initialGuess = new DenseVector(new[] { 1.2, 1.2 }); + var solver = new BfgsBMinimizer (1e-5, 1e-5, 1e-5, maximumIterations: 1000); + var lowerBound = new DenseVector(new[]{ 1.0, 1.0 }); + var upperBound = new DenseVector(new[]{ 5.0, 5.0 }); + var initialGuess = new DenseVector(new[] { 1.2, 1.2 }); - var result = solver.FindMinimum(obj, lowerBound, upperBound, initialGuess); + var result = solver.FindMinimum(obj, lowerBound, upperBound, initialGuess); - Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); - Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); - } + Assert.That(Math.Abs(result.MinimizingPoint[0] - RosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); + } [Test] public void FindMinimum_Rosenbrock_MinimumGreateerOrEqualToLowerBoundary() @@ -227,7 +227,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests .Concat(WoodFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases) .Where(x => x.IsBounded) - .Select(x => new TestCaseData(x) + .Select(x => new TestCaseData(x) .SetName(_prefix + x.FullName) ) .GetEnumerator(); @@ -250,4 +250,3 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests } } } - diff --git a/src/UnitTests/OptimizationTests/BfgsMinimizerTests.cs b/src/UnitTests/OptimizationTests/BfgsMinimizerTests.cs index 8622886f..bedad77a 100644 --- a/src/UnitTests/OptimizationTests/BfgsMinimizerTests.cs +++ b/src/UnitTests/OptimizationTests/BfgsMinimizerTests.cs @@ -47,38 +47,38 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); } - [Test] - public void FindMinimum_BigRosenbrock_Easy() - { + [Test] + public void FindMinimum_BigRosenbrock_Easy() + { var obj = ObjectiveFunction.Gradient(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient); - var solver = new BfgsMinimizer(1e-10, 1e-5, 1e-5, 1000); - var result = solver.FindMinimum(obj, new DenseVector(new[] { 1.2*100.0, 1.2*100.0 })); + var solver = new BfgsMinimizer(1e-10, 1e-5, 1e-5, 1000); + var result = solver.FindMinimum(obj, new DenseVector(new[] { 1.2*100.0, 1.2*100.0 })); - Assert.That(Math.Abs(result.MinimizingPoint[0] - BigRosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); - Assert.That(Math.Abs(result.MinimizingPoint[1] - BigRosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); - } + Assert.That(Math.Abs(result.MinimizingPoint[0] - BigRosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - BigRosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); + } - [Test] - public void FindMinimum_BigRosenbrock_Hard() - { + [Test] + public void FindMinimum_BigRosenbrock_Hard() + { var obj = ObjectiveFunction.Gradient(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient); - var solver = new BfgsMinimizer(1e-5, 1e-5, 1e-5, 1000); - var result = solver.FindMinimum(obj, new DenseVector(new[] { -1.2*100.0, 1.0*100.0 })); + var solver = new BfgsMinimizer(1e-5, 1e-5, 1e-5, 1000); + var result = solver.FindMinimum(obj, new DenseVector(new[] { -1.2*100.0, 1.0*100.0 })); - Assert.That(Math.Abs(result.MinimizingPoint[0] - BigRosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); - Assert.That(Math.Abs(result.MinimizingPoint[1] - BigRosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); - } + Assert.That(Math.Abs(result.MinimizingPoint[0] - BigRosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - BigRosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); + } - [Test] - public void FindMinimum_BigRosenbrock_Overton() - { + [Test] + public void FindMinimum_BigRosenbrock_Overton() + { var obj = ObjectiveFunction.Gradient(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient); - var solver = new BfgsMinimizer(1e-5, 1e-5, 1e-5, 1000); - var result = solver.FindMinimum(obj, new DenseVector(new[] { -0.9*100.0, -0.5*100.0 })); + var solver = new BfgsMinimizer(1e-5, 1e-5, 1e-5, 1000); + var result = solver.FindMinimum(obj, new DenseVector(new[] { -0.9*100.0, -0.5*100.0 })); - Assert.That(Math.Abs(result.MinimizingPoint[0] - BigRosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); - Assert.That(Math.Abs(result.MinimizingPoint[1] - BigRosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); - } + Assert.That(Math.Abs(result.MinimizingPoint[0] - BigRosenbrockFunction.Minimum[0]), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - BigRosenbrockFunction.Minimum[1]), Is.LessThan(1e-3)); + } private class MghTestCaseEnumerator : IEnumerable { @@ -93,7 +93,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests .Concat(WoodFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases) .Where(x => x.IsUnbounded) - .Select(x => new TestCaseData(x) + .Select(x => new TestCaseData(x) .SetName(x.FullName) ) .GetEnumerator(); diff --git a/src/UnitTests/OptimizationTests/ConjugateGradientMinimizerTests.cs b/src/UnitTests/OptimizationTests/ConjugateGradientMinimizerTests.cs index 254a1db7..0b05a067 100644 --- a/src/UnitTests/OptimizationTests/ConjugateGradientMinimizerTests.cs +++ b/src/UnitTests/OptimizationTests/ConjugateGradientMinimizerTests.cs @@ -62,7 +62,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests .Concat(WoodFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases) .Where(x => x.IsUnbounded) - .Select(x => new TestCaseData(x) + .Select(x => new TestCaseData(x) .SetName(x.FullName) .IgnoreIf(in_ignore_list(x.FullName),"Algo error, not implementation error.") ) diff --git a/src/UnitTests/OptimizationTests/NelderMeadSimplexTests.cs b/src/UnitTests/OptimizationTests/NelderMeadSimplexTests.cs index ef16d76f..4473a8df 100644 --- a/src/UnitTests/OptimizationTests/NelderMeadSimplexTests.cs +++ b/src/UnitTests/OptimizationTests/NelderMeadSimplexTests.cs @@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests .Concat(WoodFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases) .Where(x => x.IsUnbounded) - .Select(x => new TestCaseData(x) + .Select(x => new TestCaseData(x) .SetName(x.FullName) .IgnoreIf(in_ignore_list(x.FullName), "Algo error, not implementation error") ) diff --git a/src/UnitTests/OptimizationTests/NewtonMinimizerTests.cs b/src/UnitTests/OptimizationTests/NewtonMinimizerTests.cs index 6f66c2c7..6941f7db 100644 --- a/src/UnitTests/OptimizationTests/NewtonMinimizerTests.cs +++ b/src/UnitTests/OptimizationTests/NewtonMinimizerTests.cs @@ -69,6 +69,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests Assert.That(Math.Abs(result.MinimizingPoint[1] - 1.0), Is.LessThan(1e-3)); } +#if !NET35 [Test] public void FindMinimum_Rosenbrock_Hard() { @@ -79,6 +80,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests Assert.That(Math.Abs(result.MinimizingPoint[0] - 1.0), Is.LessThan(1e-3)); Assert.That(Math.Abs(result.MinimizingPoint[1] - 1.0), Is.LessThan(1e-3)); } +#endif [Test] public void FindMinimum_Rosenbrock_Overton() @@ -149,7 +151,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests .Concat(WoodFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases) .Where(x => x.IsUnbounded) - .Select(x => new TestCaseData(x) + .Select(x => new TestCaseData(x) .SetName(x.FullName) .IgnoreIf(in_ignore_list(x.FullName),"Algo error, not implementation error") )