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

4
src/Numerics/Optimization/TrustRegionSubProblem.cs

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

Loading…
Cancel
Save