Browse Source

Optimization: restore objective function CreateNew (but keep Fork as well)

pull/391/head
Christoph Ruegg 11 years ago
parent
commit
63100f7eae
  1. 13
      src/Numerics/Optimization/BaseObjectiveFunction.cs
  2. 10
      src/Numerics/Optimization/IObjectiveFunction.cs
  3. 7
      src/Numerics/Optimization/Implementation/CheckedObjectiveFunction.cs
  4. 3
      src/Numerics/Optimization/Implementation/WeakWolfeLineSearch.cs
  5. 2
      src/Numerics/Optimization/NewtonMinimizer.cs
  6. 2
      src/UnitTests/OptimizationTests/TestNewtonMinimizer.cs

13
src/Numerics/Optimization/BaseObjectiveFunction.cs

@ -87,7 +87,18 @@ namespace MathNet.Numerics.Optimization
} }
} }
public abstract IObjectiveFunction Fork(); public abstract IObjectiveFunction CreateNew();
public virtual IObjectiveFunction Fork()
{
BaseObjectiveFunction fork = (BaseObjectiveFunction)CreateNew();
fork.PointRaw = PointRaw;
fork.ValueRaw = ValueRaw;
fork.GradientRaw = GradientRaw;
fork.HessianRaw = HessianRaw;
fork.Status = Status;
return fork;
}
protected abstract void SetValue(); protected abstract void SetValue();
protected abstract void SetGradient(); protected abstract void SetGradient();

10
src/Numerics/Optimization/IObjectiveFunction.cs

@ -2,8 +2,15 @@
namespace MathNet.Numerics.Optimization namespace MathNet.Numerics.Optimization
{ {
/// <summary>
/// Objective function with a frozen evaluation that must not be changed from the outside.
/// </summary>
public interface IObjectiveFunctionEvaluation public interface IObjectiveFunctionEvaluation
{ {
/// <summary>Create a new unevaluated and independent copy of this objective function</summary>
IObjectiveFunction CreateNew();
/// <summary>Create a new independent copy of this objective function, evaluated at the same point.</summary>
IObjectiveFunction Fork(); IObjectiveFunction Fork();
Vector<double> Point { get; } Vector<double> Point { get; }
@ -16,6 +23,9 @@ namespace MathNet.Numerics.Optimization
Matrix<double> Hessian { get; } Matrix<double> Hessian { get; }
} }
/// <summary>
/// Objective function with a mutable evaluation.
/// </summary>
public interface IObjectiveFunction : IObjectiveFunctionEvaluation public interface IObjectiveFunction : IObjectiveFunctionEvaluation
{ {
void EvaluateAt(Vector<double> point); void EvaluateAt(Vector<double> point);

7
src/Numerics/Optimization/Implementation/CheckedObjectiveFunction.cs

@ -103,9 +103,14 @@ namespace MathNet.Numerics.Optimization.Implementation
} }
} }
public IObjectiveFunction CreateNew()
{
return new CheckedObjectiveFunction(InnerObjectiveFunction.CreateNew(), ValueChecker, GradientChecker, HessianChecker);
}
public IObjectiveFunction Fork() public IObjectiveFunction Fork()
{ {
return new CheckedObjectiveFunction(InnerObjectiveFunction, ValueChecker, GradientChecker, HessianChecker); return new CheckedObjectiveFunction(InnerObjectiveFunction.Fork(), ValueChecker, GradientChecker, HessianChecker);
} }
public bool IsGradientSupported public bool IsGradientSupported

3
src/Numerics/Optimization/Implementation/WeakWolfeLineSearch.cs

@ -21,8 +21,6 @@ namespace MathNet.Numerics.Optimization.Implementation
// Implemented following http://www.math.washington.edu/~burke/crs/408/lectures/L9-weak-Wolfe.pdf // Implemented following http://www.math.washington.edu/~burke/crs/408/lectures/L9-weak-Wolfe.pdf
public LineSearchOutput FindConformingStep(IObjectiveFunctionEvaluation startingPoint, Vector<double> searchDirection, double initialStep) public LineSearchOutput FindConformingStep(IObjectiveFunctionEvaluation startingPoint, Vector<double> searchDirection, double initialStep)
{ {
var objective = startingPoint.Fork();
double lowerBound = 0.0; double lowerBound = 0.0;
double upperBound = Double.PositiveInfinity; double upperBound = Double.PositiveInfinity;
double step = initialStep; double step = initialStep;
@ -33,6 +31,7 @@ namespace MathNet.Numerics.Optimization.Implementation
double initialDd = searchDirection * initialGradient; double initialDd = searchDirection * initialGradient;
var objective = startingPoint.CreateNew();
int ii; int ii;
MinimizationOutput.ExitCondition reasonForExit = MinimizationOutput.ExitCondition.None; MinimizationOutput.ExitCondition reasonForExit = MinimizationOutput.ExitCondition.None;
for (ii = 0; ii < _maximumIterations; ++ii) for (ii = 0; ii < _maximumIterations; ++ii)

2
src/Numerics/Optimization/NewtonMinimizer.cs

@ -62,7 +62,7 @@ namespace MathNet.Numerics.Optimization
LineSearchOutput result; LineSearchOutput result;
try try
{ {
result = lineSearcher.FindConformingStep(objective.Fork(), searchDirection, 1.0); result = lineSearcher.FindConformingStep(objective, searchDirection, 1.0);
} }
catch (Exception e) catch (Exception e)
{ {

2
src/UnitTests/OptimizationTests/TestNewtonMinimizer.cs

@ -25,7 +25,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests
HessianRaw = RosenbrockFunction.Hessian(Point); HessianRaw = RosenbrockFunction.Hessian(Point);
} }
public override IObjectiveFunction Fork() public override IObjectiveFunction CreateNew()
{ {
return new RosenbrockObjectiveFunction(); return new RosenbrockObjectiveFunction();
} }

Loading…
Cancel
Save