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)
===================================
Copyright (c) 2002-2018 Math.NET
Copyright (c) 2002-2019 Math.NET
Permission is hereby granted, free of charge, to any person
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.Double;
using MathNet.Numerics.Optimization;
using MathNet.Numerics.Optimization.TrustRegion;
using NUnit.Framework;
using System;
@ -441,7 +442,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
#region Thurber
// 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:
// df/db1 = 1/(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);
}
}
[Test]
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;
namespace MathNet.Numerics.Optimization
namespace MathNet.Numerics.Optimization.TrustRegion
{
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;
namespace MathNet.Numerics.Optimization.Subproblems
namespace MathNet.Numerics.Optimization.TrustRegion.Subproblems
{
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
{

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
{
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 = α*Psd + β*(Pgn - α*Psd)
// Pstep = α*Psd + β*(Pgn - α*Psd)
// 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
//
// 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
{

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.Linq;
using MathNet.Numerics.LinearAlgebra;
namespace MathNet.Numerics.Optimization
namespace MathNet.Numerics.Optimization.TrustRegion
{
public abstract class TrustRegionMinimizerBase : NonlinearMinimizerBase
{
/// <summary>
/// The trust region subproblem.
/// The trust region subproblem.
/// </summary>
public static ITrustRegionSubproblem Subproblem;
@ -51,7 +51,7 @@ namespace MathNet.Numerics.Optimization
/// Non-linear least square fitting by the trust-region algorithm.
/// </summary>
/// <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="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>
@ -112,7 +112,7 @@ namespace MathNet.Numerics.Optimization
// First, calculate function values and setup variables
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
if (maximumIterations < 0)
@ -127,7 +127,7 @@ namespace MathNet.Numerics.Optimization
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)
{
exitCondition = ExitCondition.ManuallyStopped;
@ -142,7 +142,7 @@ namespace MathNet.Numerics.Optimization
// evaluate projected gradient and Hessian
var jac = EvaluateJacobian(objective, P);
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 (Gradient.InfinityNorm() <= gradientTolerance)
@ -182,7 +182,7 @@ namespace MathNet.Numerics.Optimization
var Pnew = P + Pstep; // parameters to test
// evaluate function at Pnew
var RSSnew = EvaluateFunction(objective, Pnew);
// if RSS == NaN, stop
if (double.IsNaN(RSSnew))
{
@ -204,7 +204,7 @@ namespace MathNet.Numerics.Optimization
delta = delta * 0.25;
if (delta <= radiusTolerance * (radiusTolerance + P.DotProduct(P)))
{
exitCondition = ExitCondition.LackOfProgress;
exitCondition = ExitCondition.LackOfProgress;
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
{
@ -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
{
Loading…
Cancel
Save