Browse Source

Renamed QuadraticSubproblem to DogLegSubproblem.

pull/614/head
diluculo 8 years ago
parent
commit
04b8b78dba
  1. 1
      src/Numerics/Optimization/ITrustRegionSubProblem.cs
  2. 7
      src/Numerics/Optimization/Subproblems/DogLegSubproblem.cs
  3. 5
      src/Numerics/Optimization/Subproblems/Util.cs
  4. 2
      src/Numerics/Optimization/TrustRegionDogLegMinimizer.cs
  5. 3
      src/Numerics/Optimization/TrustRegionMinimizerBase.cs
  6. 4
      src/Numerics/Optimization/TrustRegionSubProblem.cs

1
src/Numerics/Optimization/ITrustRegionSubProblem.cs

@ -5,7 +5,6 @@ namespace MathNet.Numerics.Optimization
public interface ITrustRegionSubproblem public interface ITrustRegionSubproblem
{ {
Vector<double> Pstep { get; } Vector<double> Pstep { get; }
double PredictedReduction { get; }
bool HitBoundary { get; } bool HitBoundary { get; }
void Solve(IObjectiveModel objective, double radius); void Solve(IObjectiveModel objective, double radius);

7
src/Numerics/Optimization/Subproblems/QuadraticSubproblem.cs → src/Numerics/Optimization/Subproblems/DogLegSubproblem.cs

@ -2,12 +2,10 @@
namespace MathNet.Numerics.Optimization.Subproblems namespace MathNet.Numerics.Optimization.Subproblems
{ {
internal class QuadraticSubproblem : ITrustRegionSubproblem internal class DogLegSubproblem : ITrustRegionSubproblem
{ {
public Vector<double> Pstep { get; private set; } public Vector<double> Pstep { get; private set; }
public double PredictedReduction { get; private set; }
public bool HitBoundary { get; private set; } public bool HitBoundary { get; private set; }
public void Solve(IObjectiveModel objective, double delta) public void Solve(IObjectiveModel objective, double delta)
@ -32,14 +30,12 @@ namespace MathNet.Numerics.Optimization.Subproblems
// Pgn is inside trust region radius // Pgn is inside trust region radius
HitBoundary = false; HitBoundary = false;
Pstep = Pgn; Pstep = Pgn;
PredictedReduction = RSS;
} }
else if (alpha * Psd.L2Norm() >= delta) else if (alpha * Psd.L2Norm() >= delta)
{ {
// Psd is outside trust region radius // Psd is outside trust region radius
HitBoundary = true; HitBoundary = true;
Pstep = delta / Psd.L2Norm() * Psd; Pstep = delta / Psd.L2Norm() * Psd;
PredictedReduction = delta * (2.0 * (alpha * Gradient).L2Norm() - delta) / 2.0 / alpha;
} }
else else
{ {
@ -47,7 +43,6 @@ namespace MathNet.Numerics.Optimization.Subproblems
HitBoundary = true; HitBoundary = true;
var beta = Util.FindBeta(alpha, Psd, Pgn, delta).Item2; var beta = Util.FindBeta(alpha, Psd, Pgn, delta).Item2;
Pstep = alpha * Psd + beta * (Pgn - alpha * Psd); Pstep = alpha * Psd + beta * (Pgn - alpha * Psd);
PredictedReduction = 0.5 * alpha * (1 - beta) * (1 - beta) * Gradient.DotProduct(Gradient) + beta * (2 - beta) * RSS;
} }
} }
} }

5
src/Numerics/Optimization/Subproblems/Util.cs

@ -26,7 +26,10 @@ namespace MathNet.Numerics.Optimization.Subproblems
var beta1 = -aux / 2.0 / a; var beta1 = -aux / 2.0 / a;
var beta2 = -2.0 * c / aux; var beta2 = -2.0 * c / aux;
return new Tuple<double, double>(beta1, beta2); // return sorted beta
return (beta1 < beta2)
? new Tuple<double, double>(beta1, beta2)
: new Tuple<double, double>(beta2, beta1);
} }
} }
} }

2
src/Numerics/Optimization/TrustRegionDogLegMinimizer.cs

@ -6,7 +6,7 @@ namespace MathNet.Numerics.Optimization
public sealed class TrustRegionDogLegMinimizer : TrustRegionMinimizerBase public sealed class TrustRegionDogLegMinimizer : TrustRegionMinimizerBase
{ {
public TrustRegionDogLegMinimizer(double gradientTolerance = 1E-8, double stepTolerance = 1E-8, double functionTolerance = 1E-8, double radiusTolerance = 1E-8, int maximumIterations = -1) public TrustRegionDogLegMinimizer(double gradientTolerance = 1E-8, double stepTolerance = 1E-8, double functionTolerance = 1E-8, double radiusTolerance = 1E-8, int maximumIterations = -1)
: base(TrustRegionSubproblem.Quadratic(), gradientTolerance, stepTolerance, functionTolerance, radiusTolerance, maximumIterations) : base(TrustRegionSubproblem.DogLeg(), gradientTolerance, stepTolerance, functionTolerance, radiusTolerance, maximumIterations)
{ } { }
} }
} }

3
src/Numerics/Optimization/TrustRegionMinimizerBase.cs

@ -189,8 +189,9 @@ namespace MathNet.Numerics.Optimization
// solve the subproblem // solve the subproblem
subproblem.Solve(objective, delta); subproblem.Solve(objective, delta);
var Pstep = subproblem.Pstep; var Pstep = subproblem.Pstep;
var predictedReduction = subproblem.PredictedReduction;
var hitBoundary = subproblem.HitBoundary; var hitBoundary = subproblem.HitBoundary;
// predicted reduction = L(0) - L(Δp) = Δp'g - 1/2 * Δp'HΔp
var predictedReduction = objective.Gradient.DotProduct(Pstep) - 0.5 * Pstep.DotProduct(objective.Hessian * Pstep);
if (Pstep.L2Norm() <= stepTolerance * (stepTolerance + P.L2Norm())) if (Pstep.L2Norm() <= stepTolerance * (stepTolerance + P.L2Norm()))
{ {

4
src/Numerics/Optimization/TrustRegionSubProblem.cs

@ -4,9 +4,9 @@ namespace MathNet.Numerics.Optimization
{ {
public static class TrustRegionSubproblem public static class TrustRegionSubproblem
{ {
public static ITrustRegionSubproblem Quadratic() public static ITrustRegionSubproblem DogLeg()
{ {
return new QuadraticSubproblem(); return new DogLegSubproblem();
} }
} }
} }

Loading…
Cancel
Save