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 SetGradient();

10
src/Numerics/Optimization/IObjectiveFunction.cs

@ -2,8 +2,15 @@
namespace MathNet.Numerics.Optimization
{
/// <summary>
/// Objective function with a frozen evaluation that must not be changed from the outside.
/// </summary>
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();
Vector<double> Point { get; }
@ -16,6 +23,9 @@ namespace MathNet.Numerics.Optimization
Matrix<double> Hessian { get; }
}
/// <summary>
/// Objective function with a mutable evaluation.
/// </summary>
public interface IObjectiveFunction : IObjectiveFunctionEvaluation
{
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()
{
return new CheckedObjectiveFunction(InnerObjectiveFunction, ValueChecker, GradientChecker, HessianChecker);
return new CheckedObjectiveFunction(InnerObjectiveFunction.Fork(), ValueChecker, GradientChecker, HessianChecker);
}
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
public LineSearchOutput FindConformingStep(IObjectiveFunctionEvaluation startingPoint, Vector<double> searchDirection, double initialStep)
{
var objective = startingPoint.Fork();
double lowerBound = 0.0;
double upperBound = Double.PositiveInfinity;
double step = initialStep;
@ -33,6 +31,7 @@ namespace MathNet.Numerics.Optimization.Implementation
double initialDd = searchDirection * initialGradient;
var objective = startingPoint.CreateNew();
int ii;
MinimizationOutput.ExitCondition reasonForExit = MinimizationOutput.ExitCondition.None;
for (ii = 0; ii < _maximumIterations; ++ii)

2
src/Numerics/Optimization/NewtonMinimizer.cs

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

2
src/UnitTests/OptimizationTests/TestNewtonMinimizer.cs

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

Loading…
Cancel
Save