Browse Source

Optimization: fix portable builds: covariance and type inferrence

v3
Christoph Ruegg 10 years ago
parent
commit
7d61334282
  1. 119
      src/UnitTests/OptimizationTests/BfgsBMinimizerTests.cs
  2. 50
      src/UnitTests/OptimizationTests/BfgsMinimizerTests.cs
  3. 2
      src/UnitTests/OptimizationTests/ConjugateGradientMinimizerTests.cs
  4. 2
      src/UnitTests/OptimizationTests/NelderMeadSimplexTests.cs
  5. 4
      src/UnitTests/OptimizationTests/NewtonMinimizerTests.cs

119
src/UnitTests/OptimizationTests/BfgsBMinimizerTests.cs

@ -42,86 +42,86 @@ using NUnit.Framework.Interfaces;
namespace MathNet.Numerics.UnitTests.OptimizationTests namespace MathNet.Numerics.UnitTests.OptimizationTests
{ {
[TestFixture] [TestFixture]
public class BfgsBMinimizerTests public class BfgsBMinimizerTests
{ {
[Test] [Test]
public void FindMinimum_Rosenbrock_Easy() public void FindMinimum_Rosenbrock_Easy()
{ {
var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); 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 lowerBound = new DenseVector(new[]{ -5.0, -5.0 });
var upperBound = 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 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[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[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3));
} }
[Test] [Test]
public void FindMinimum_Rosenbrock_Hard() public void FindMinimum_Rosenbrock_Hard()
{ {
var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); 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 lowerBound = new DenseVector(new[]{ -5.0, -5.0 });
var upperBound = 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[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[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3));
} }
[Test] [Test]
public void FindMinimum_Rosenbrock_Overton() public void FindMinimum_Rosenbrock_Overton()
{ {
var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); 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 lowerBound = new DenseVector(new[]{ -5.0, -5.0 });
var upperBound = 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 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[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[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3));
} }
[Test] [Test]
public void FindMinimum_Rosenbrock_Easy_OneBoundary() public void FindMinimum_Rosenbrock_Easy_OneBoundary()
{ {
var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); 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[]{ 1.0, -5.0 }); var lowerBound = new DenseVector(new[]{ 1.0, -5.0 });
var upperBound = 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 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[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[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3));
} }
[Test] [Test]
public void FindMinimum_Rosenbrock_Easy_TwoBoundaries() public void FindMinimum_Rosenbrock_Easy_TwoBoundaries()
{ {
var obj = ObjectiveFunction.Gradient(RosenbrockFunction.Value, RosenbrockFunction.Gradient); 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[]{ 1.0, 1.0 }); var lowerBound = new DenseVector(new[]{ 1.0, 1.0 });
var upperBound = 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 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[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[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3));
} }
[Test] [Test]
public void FindMinimum_Rosenbrock_MinimumGreateerOrEqualToLowerBoundary() public void FindMinimum_Rosenbrock_MinimumGreateerOrEqualToLowerBoundary()
@ -227,7 +227,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
.Concat(WoodFunction.TestCases) .Concat(WoodFunction.TestCases)
.Concat(BrownAndDennisFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases)
.Where(x => x.IsBounded) .Where(x => x.IsBounded)
.Select(x => new TestCaseData(x) .Select<TestCase, ITestCaseData>(x => new TestCaseData(x)
.SetName(_prefix + x.FullName) .SetName(_prefix + x.FullName)
) )
.GetEnumerator(); .GetEnumerator();
@ -250,4 +250,3 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
} }
} }
} }

50
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)); Assert.That(Math.Abs(result.MinimizingPoint[1] - RosenbrockFunction.Minimum[1]), Is.LessThan(1e-3));
} }
[Test] [Test]
public void FindMinimum_BigRosenbrock_Easy() public void FindMinimum_BigRosenbrock_Easy()
{ {
var obj = ObjectiveFunction.Gradient(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient); var obj = ObjectiveFunction.Gradient(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient);
var solver = new BfgsMinimizer(1e-10, 1e-5, 1e-5, 1000); 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 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[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[1] - BigRosenbrockFunction.Minimum[1]), Is.LessThan(1e-3));
} }
[Test] [Test]
public void FindMinimum_BigRosenbrock_Hard() public void FindMinimum_BigRosenbrock_Hard()
{ {
var obj = ObjectiveFunction.Gradient(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient); var obj = ObjectiveFunction.Gradient(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient);
var solver = new BfgsMinimizer(1e-5, 1e-5, 1e-5, 1000); 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 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[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[1] - BigRosenbrockFunction.Minimum[1]), Is.LessThan(1e-3));
} }
[Test] [Test]
public void FindMinimum_BigRosenbrock_Overton() public void FindMinimum_BigRosenbrock_Overton()
{ {
var obj = ObjectiveFunction.Gradient(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient); var obj = ObjectiveFunction.Gradient(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient);
var solver = new BfgsMinimizer(1e-5, 1e-5, 1e-5, 1000); 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 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[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[1] - BigRosenbrockFunction.Minimum[1]), Is.LessThan(1e-3));
} }
private class MghTestCaseEnumerator : IEnumerable<ITestCaseData> private class MghTestCaseEnumerator : IEnumerable<ITestCaseData>
{ {
@ -93,7 +93,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
.Concat(WoodFunction.TestCases) .Concat(WoodFunction.TestCases)
.Concat(BrownAndDennisFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases)
.Where(x => x.IsUnbounded) .Where(x => x.IsUnbounded)
.Select(x => new TestCaseData(x) .Select<TestCase, ITestCaseData>(x => new TestCaseData(x)
.SetName(x.FullName) .SetName(x.FullName)
) )
.GetEnumerator(); .GetEnumerator();

2
src/UnitTests/OptimizationTests/ConjugateGradientMinimizerTests.cs

@ -62,7 +62,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
.Concat(WoodFunction.TestCases) .Concat(WoodFunction.TestCases)
.Concat(BrownAndDennisFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases)
.Where(x => x.IsUnbounded) .Where(x => x.IsUnbounded)
.Select(x => new TestCaseData(x) .Select<TestCase, ITestCaseData>(x => new TestCaseData(x)
.SetName(x.FullName) .SetName(x.FullName)
.IgnoreIf(in_ignore_list(x.FullName),"Algo error, not implementation error.") .IgnoreIf(in_ignore_list(x.FullName),"Algo error, not implementation error.")
) )

2
src/UnitTests/OptimizationTests/NelderMeadSimplexTests.cs

@ -94,7 +94,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
.Concat(WoodFunction.TestCases) .Concat(WoodFunction.TestCases)
.Concat(BrownAndDennisFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases)
.Where(x => x.IsUnbounded) .Where(x => x.IsUnbounded)
.Select(x => new TestCaseData(x) .Select<TestCase, ITestCaseData>(x => new TestCaseData(x)
.SetName(x.FullName) .SetName(x.FullName)
.IgnoreIf(in_ignore_list(x.FullName), "Algo error, not implementation error") .IgnoreIf(in_ignore_list(x.FullName), "Algo error, not implementation error")
) )

4
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)); Assert.That(Math.Abs(result.MinimizingPoint[1] - 1.0), Is.LessThan(1e-3));
} }
#if !NET35
[Test] [Test]
public void FindMinimum_Rosenbrock_Hard() 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[0] - 1.0), Is.LessThan(1e-3));
Assert.That(Math.Abs(result.MinimizingPoint[1] - 1.0), Is.LessThan(1e-3)); Assert.That(Math.Abs(result.MinimizingPoint[1] - 1.0), Is.LessThan(1e-3));
} }
#endif
[Test] [Test]
public void FindMinimum_Rosenbrock_Overton() public void FindMinimum_Rosenbrock_Overton()
@ -149,7 +151,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
.Concat(WoodFunction.TestCases) .Concat(WoodFunction.TestCases)
.Concat(BrownAndDennisFunction.TestCases) .Concat(BrownAndDennisFunction.TestCases)
.Where(x => x.IsUnbounded) .Where(x => x.IsUnbounded)
.Select(x => new TestCaseData(x) .Select<TestCase,ITestCaseData>(x => new TestCaseData(x)
.SetName(x.FullName) .SetName(x.FullName)
.IgnoreIf(in_ignore_list(x.FullName),"Algo error, not implementation error") .IgnoreIf(in_ignore_list(x.FullName),"Algo error, not implementation error")
) )

Loading…
Cancel
Save