Browse Source

Trust Region Methods: move to separate namespace

arrays
Christoph Ruegg 7 years ago
parent
commit
a0fe120f70
  1. 2
      LICENSE.md
  2. 5
      src/Numerics.Tests/OptimizationTests/NonLinearCurveFittingTests.cs
  3. 2
      src/Numerics/Optimization/TrustRegion/ITrustRegionSubProblem.cs
  4. 2
      src/Numerics/Optimization/TrustRegion/Subproblems/DogLegSubproblem.cs
  5. 6
      src/Numerics/Optimization/TrustRegion/Subproblems/NewtonCGSubproblem.cs
  6. 10
      src/Numerics/Optimization/TrustRegion/Subproblems/Util.cs
  7. 2
      src/Numerics/Optimization/TrustRegion/TrustRegionDogLegMinimizer.cs
  8. 20
      src/Numerics/Optimization/TrustRegion/TrustRegionMinimizerBase.cs
  9. 3
      src/Numerics/Optimization/TrustRegion/TrustRegionNewtonCGMinimizer.cs
  10. 4
      src/Numerics/Optimization/TrustRegion/TrustRegionSubProblem.cs

2
LICENSE.md

@ -1,7 +1,7 @@
Math.NET Numerics License (MIT/X11) Math.NET Numerics License (MIT/X11)
=================================== ===================================
Copyright (c) 2002-2018 Math.NET Copyright (c) 2002-2019 Math.NET
Permission is hereby granted, free of charge, to any person Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation obtaining a copy of this software and associated documentation

5
src/Numerics.Tests/OptimizationTests/NonLinearCurveFittingTests.cs

@ -1,6 +1,7 @@
using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.Optimization; using MathNet.Numerics.Optimization;
using MathNet.Numerics.Optimization.TrustRegion;
using NUnit.Framework; using NUnit.Framework;
using System; using System;
@ -441,7 +442,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
#region Thurber #region Thurber
// model : Thurber (https://www.itl.nist.gov/div898/strd/nls/data/thurber.shtml) // model : Thurber (https://www.itl.nist.gov/div898/strd/nls/data/thurber.shtml)
// f(x; b1 ... b7) = (b1 + b2*x + b3*x^2 + b4*x^3) / (1 + b5*x + b6*x^2 + b7*x^3) // f(x; b1 ... b7) = (b1 + b2*x + b3*x^2 + b4*x^3) / (1 + b5*x + b6*x^2 + b7*x^3)
// derivatives: // derivatives:
// df/db1 = 1/(b5*x + b6*x^2 + b7*x^3 + 1) // df/db1 = 1/(b5*x + b6*x^2 + b7*x^3 + 1)
// df/db2 = x/(b5*x + b6*x^2 + b7*x^3 + 1) // df/db2 = x/(b5*x + b6*x^2 + b7*x^3 + 1)
@ -548,7 +549,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
AssertHelpers.AlmostEqualRelative(ThurberPstd[i], result.StandardErrors[i], 6); AssertHelpers.AlmostEqualRelative(ThurberPstd[i], result.StandardErrors[i], 6);
} }
} }
[Test] [Test]
public void Thurber_TRDL_Dif() public void Thurber_TRDL_Dif()
{ {

2
src/Numerics/Optimization/ITrustRegionSubProblem.cs → src/Numerics/Optimization/TrustRegion/ITrustRegionSubProblem.cs

@ -1,6 +1,6 @@
using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra;
namespace MathNet.Numerics.Optimization namespace MathNet.Numerics.Optimization.TrustRegion
{ {
public interface ITrustRegionSubproblem public interface ITrustRegionSubproblem
{ {

2
src/Numerics/Optimization/Subproblems/DogLegSubproblem.cs → src/Numerics/Optimization/TrustRegion/Subproblems/DogLegSubproblem.cs

@ -1,6 +1,6 @@
using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra;
namespace MathNet.Numerics.Optimization.Subproblems namespace MathNet.Numerics.Optimization.TrustRegion.Subproblems
{ {
internal class DogLegSubproblem : ITrustRegionSubproblem internal class DogLegSubproblem : ITrustRegionSubproblem
{ {

6
src/Numerics/Optimization/Subproblems/NewtonCGSubproblem.cs → src/Numerics/Optimization/TrustRegion/Subproblems/NewtonCGSubproblem.cs

@ -1,7 +1,7 @@
using MathNet.Numerics.LinearAlgebra; using System;
using System; using MathNet.Numerics.LinearAlgebra;
namespace MathNet.Numerics.Optimization.Subproblems namespace MathNet.Numerics.Optimization.TrustRegion.Subproblems
{ {
internal class NewtonCGSubproblem : ITrustRegionSubproblem internal class NewtonCGSubproblem : ITrustRegionSubproblem
{ {

10
src/Numerics/Optimization/Subproblems/Util.cs → src/Numerics/Optimization/TrustRegion/Subproblems/Util.cs

@ -1,16 +1,16 @@
using MathNet.Numerics.LinearAlgebra; using System;
using System; using MathNet.Numerics.LinearAlgebra;
namespace MathNet.Numerics.Optimization.Subproblems namespace MathNet.Numerics.Optimization.TrustRegion.Subproblems
{ {
internal static class Util internal static class Util
{ {
public static Tuple<double, double> FindBeta(double alpha, Vector<double> sd, Vector<double> gn, double delta) public static Tuple<double, double> FindBeta(double alpha, Vector<double> sd, Vector<double> gn, double delta)
{ {
// Pstep is intersection of the trust region boundary // Pstep is intersection of the trust region boundary
// Pstep = α*Psd + β*(Pgn - α*Psd) // Pstep = α*Psd + β*(Pgn - α*Psd)
// find r so that ||Pstep|| = Δ // find r so that ||Pstep|| = Δ
// z = α*Psd, d = (Pgn - z) // z = α*Psd, d = (Pgn - z)
// (d^2)β^2 + (2*z*d)β + (z^2 - Δ^2) = 0 // (d^2)β^2 + (2*z*d)β + (z^2 - Δ^2) = 0
// //
// positive β is used for the quadratic formula // positive β is used for the quadratic formula

2
src/Numerics/Optimization/TrustRegionDogLegMinimizer.cs → src/Numerics/Optimization/TrustRegion/TrustRegionDogLegMinimizer.cs

@ -1,4 +1,4 @@
namespace MathNet.Numerics.Optimization namespace MathNet.Numerics.Optimization.TrustRegion
{ {
public sealed class TrustRegionDogLegMinimizer : TrustRegionMinimizerBase public sealed class TrustRegionDogLegMinimizer : TrustRegionMinimizerBase
{ {

20
src/Numerics/Optimization/TrustRegionMinimizerBase.cs → src/Numerics/Optimization/TrustRegion/TrustRegionMinimizerBase.cs

@ -1,14 +1,14 @@
using MathNet.Numerics.LinearAlgebra; using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MathNet.Numerics.LinearAlgebra;
namespace MathNet.Numerics.Optimization namespace MathNet.Numerics.Optimization.TrustRegion
{ {
public abstract class TrustRegionMinimizerBase : NonlinearMinimizerBase public abstract class TrustRegionMinimizerBase : NonlinearMinimizerBase
{ {
/// <summary> /// <summary>
/// The trust region subproblem. /// The trust region subproblem.
/// </summary> /// </summary>
public static ITrustRegionSubproblem Subproblem; public static ITrustRegionSubproblem Subproblem;
@ -51,7 +51,7 @@ namespace MathNet.Numerics.Optimization
/// Non-linear least square fitting by the trust-region algorithm. /// Non-linear least square fitting by the trust-region algorithm.
/// </summary> /// </summary>
/// <param name="objective">The objective model, including function, jacobian, observations, and parameter bounds.</param> /// <param name="objective">The objective model, including function, jacobian, observations, and parameter bounds.</param>
/// <param name="subproblem">The subproblem</param> /// <param name="subproblem">The subproblem</param>
/// <param name="initialGuess">The initial guess values.</param> /// <param name="initialGuess">The initial guess values.</param>
/// <param name="functionTolerance">The stopping threshold for L2 norm of the residuals.</param> /// <param name="functionTolerance">The stopping threshold for L2 norm of the residuals.</param>
/// <param name="gradientTolerance">The stopping threshold for infinity norm of the gradient vector.</param> /// <param name="gradientTolerance">The stopping threshold for infinity norm of the gradient vector.</param>
@ -112,7 +112,7 @@ namespace MathNet.Numerics.Optimization
// First, calculate function values and setup variables // First, calculate function values and setup variables
var P = ProjectToInternalParameters(initialGuess); // current internal parameters var P = ProjectToInternalParameters(initialGuess); // current internal parameters
var Pstep = Vector<double>.Build.Dense(P.Count); // the change of parameters var Pstep = Vector<double>.Build.Dense(P.Count); // the change of parameters
var RSS = EvaluateFunction(objective, initialGuess); // Residual Sum of Squares var RSS = EvaluateFunction(objective, initialGuess); // Residual Sum of Squares
if (maximumIterations < 0) if (maximumIterations < 0)
@ -127,7 +127,7 @@ namespace MathNet.Numerics.Optimization
return new NonlinearMinimizationResult(objective, -1, exitCondition); return new NonlinearMinimizationResult(objective, -1, exitCondition);
} }
// When only function evaluation is needed, set maximumIterations to zero, // When only function evaluation is needed, set maximumIterations to zero,
if (maximumIterations == 0) if (maximumIterations == 0)
{ {
exitCondition = ExitCondition.ManuallyStopped; exitCondition = ExitCondition.ManuallyStopped;
@ -142,7 +142,7 @@ namespace MathNet.Numerics.Optimization
// evaluate projected gradient and Hessian // evaluate projected gradient and Hessian
var jac = EvaluateJacobian(objective, P); var jac = EvaluateJacobian(objective, P);
var Gradient = jac.Item1; // objective.Gradient; var Gradient = jac.Item1; // objective.Gradient;
var Hessian = jac.Item2; // objective.Hessian; var Hessian = jac.Item2; // objective.Hessian;
// if ||g||_oo <= gtol, found and stop // if ||g||_oo <= gtol, found and stop
if (Gradient.InfinityNorm() <= gradientTolerance) if (Gradient.InfinityNorm() <= gradientTolerance)
@ -182,7 +182,7 @@ namespace MathNet.Numerics.Optimization
var Pnew = P + Pstep; // parameters to test var Pnew = P + Pstep; // parameters to test
// evaluate function at Pnew // evaluate function at Pnew
var RSSnew = EvaluateFunction(objective, Pnew); var RSSnew = EvaluateFunction(objective, Pnew);
// if RSS == NaN, stop // if RSS == NaN, stop
if (double.IsNaN(RSSnew)) if (double.IsNaN(RSSnew))
{ {
@ -204,7 +204,7 @@ namespace MathNet.Numerics.Optimization
delta = delta * 0.25; delta = delta * 0.25;
if (delta <= radiusTolerance * (radiusTolerance + P.DotProduct(P))) if (delta <= radiusTolerance * (radiusTolerance + P.DotProduct(P)))
{ {
exitCondition = ExitCondition.LackOfProgress; exitCondition = ExitCondition.LackOfProgress;
break; break;
} }
} }

3
src/Numerics/Optimization/TrustRegionNewtonCGMinimizer.cs → src/Numerics/Optimization/TrustRegion/TrustRegionNewtonCGMinimizer.cs

@ -1,4 +1,4 @@
namespace MathNet.Numerics.Optimization namespace MathNet.Numerics.Optimization.TrustRegion
{ {
public sealed class TrustRegionNewtonCGMinimizer : TrustRegionMinimizerBase public sealed class TrustRegionNewtonCGMinimizer : TrustRegionMinimizerBase
{ {
@ -10,4 +10,3 @@
{ } { }
} }
} }

4
src/Numerics/Optimization/TrustRegionSubProblem.cs → src/Numerics/Optimization/TrustRegion/TrustRegionSubProblem.cs

@ -1,6 +1,6 @@
using MathNet.Numerics.Optimization.Subproblems; using MathNet.Numerics.Optimization.TrustRegion.Subproblems;
namespace MathNet.Numerics.Optimization namespace MathNet.Numerics.Optimization.TrustRegion
{ {
public static class TrustRegionSubproblem public static class TrustRegionSubproblem
{ {
Loading…
Cancel
Save