|
|
|
@ -4,12 +4,17 @@ using System.Linq; |
|
|
|
using System.Text; |
|
|
|
|
|
|
|
using MathNet.Numerics.LinearAlgebra; |
|
|
|
using MathNet.Numerics.LinearAlgebra.Double; |
|
|
|
|
|
|
|
namespace MathNet.Numerics.Optimization |
|
|
|
{ |
|
|
|
[Flags] |
|
|
|
public enum EvaluationStatus { None = 0, Value = 1, Gradient = 2, Hessian = 4 } |
|
|
|
|
|
|
|
public interface IEvaluation |
|
|
|
{ |
|
|
|
Vector<double> Point { get; } |
|
|
|
Vector<double> Point { get; } |
|
|
|
EvaluationStatus Status { get; } |
|
|
|
double Value { get; } |
|
|
|
Vector<double> Gradient { get; } |
|
|
|
Matrix<double> Hessian { get; } |
|
|
|
@ -24,18 +29,30 @@ namespace MathNet.Numerics.Optimization |
|
|
|
|
|
|
|
public abstract class BaseEvaluation : IEvaluation |
|
|
|
{ |
|
|
|
protected EvaluationStatus _status; |
|
|
|
protected double? _value; |
|
|
|
protected Vector<double> _gradient; |
|
|
|
protected Matrix<double> _hessian; |
|
|
|
protected Vector<double> _point; |
|
|
|
|
|
|
|
public Vector<double> Point { get { return _point; } } |
|
|
|
|
|
|
|
protected BaseEvaluation() |
|
|
|
{ |
|
|
|
_status = EvaluationStatus.None; |
|
|
|
} |
|
|
|
|
|
|
|
public EvaluationStatus Status { get { return _status; } } |
|
|
|
|
|
|
|
public double Value |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
if (!_value.HasValue) |
|
|
|
{ |
|
|
|
setValue(); |
|
|
|
_status |= EvaluationStatus.Value; |
|
|
|
} |
|
|
|
return _value.Value; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -44,7 +61,10 @@ namespace MathNet.Numerics.Optimization |
|
|
|
get |
|
|
|
{ |
|
|
|
if (_gradient == null) |
|
|
|
{ |
|
|
|
setGradient(); |
|
|
|
_status |= EvaluationStatus.Gradient; |
|
|
|
} |
|
|
|
return _gradient; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -53,7 +73,10 @@ namespace MathNet.Numerics.Optimization |
|
|
|
get |
|
|
|
{ |
|
|
|
if (_hessian == null) |
|
|
|
{ |
|
|
|
setHessian(); |
|
|
|
_status |= EvaluationStatus.Hessian; |
|
|
|
} |
|
|
|
return _hessian; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -64,40 +87,96 @@ namespace MathNet.Numerics.Optimization |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public class CachedEvaluation : IEvaluation |
|
|
|
public class NullEvaluation : BaseEvaluation |
|
|
|
{ |
|
|
|
|
|
|
|
public NullEvaluation(Vector<double> point) |
|
|
|
{ |
|
|
|
_point = point; |
|
|
|
_status = EvaluationStatus.None; |
|
|
|
} |
|
|
|
|
|
|
|
public NullEvaluation(double point) |
|
|
|
{ |
|
|
|
_point = DenseVector.Create(1, point); |
|
|
|
_status = EvaluationStatus.None; |
|
|
|
} |
|
|
|
|
|
|
|
protected override void setValue() |
|
|
|
{ |
|
|
|
throw new NotImplementedException(); |
|
|
|
} |
|
|
|
|
|
|
|
protected override void setGradient() |
|
|
|
{ |
|
|
|
throw new NotImplementedException(); |
|
|
|
} |
|
|
|
|
|
|
|
protected override void setHessian() |
|
|
|
{ |
|
|
|
throw new NotImplementedException(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class OneDEvaluationExpander : IEvaluation |
|
|
|
{ |
|
|
|
public IEvaluation1D InnerEval { get; private set; } |
|
|
|
public OneDEvaluationExpander(IEvaluation1D eval) |
|
|
|
{ |
|
|
|
this.InnerEval = eval; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public Vector<double> Point |
|
|
|
{ |
|
|
|
get { return DenseVector.Create(1,this.InnerEval.Point); } |
|
|
|
} |
|
|
|
|
|
|
|
public EvaluationStatus Status |
|
|
|
{ |
|
|
|
get { return this.InnerEval.Status; } |
|
|
|
} |
|
|
|
|
|
|
|
public double Value |
|
|
|
{ |
|
|
|
get { return this.InnerEval.Value; } |
|
|
|
} |
|
|
|
|
|
|
|
public Vector<double> Gradient |
|
|
|
{ |
|
|
|
get { return DenseVector.Create(1,this.InnerEval.Derivative) ; } |
|
|
|
} |
|
|
|
|
|
|
|
public Matrix<double> Hessian |
|
|
|
{ |
|
|
|
get { return DenseMatrix.Create(1,1,this.InnerEval.SecondDerivative); } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class CachedEvaluation : BaseEvaluation |
|
|
|
{ |
|
|
|
private double? _value; |
|
|
|
private Vector<double> _gradient; |
|
|
|
private Matrix<double> _hessian; |
|
|
|
private SimpleObjectiveFunction _objective_object; |
|
|
|
private Vector<double> _point; |
|
|
|
|
|
|
|
public CachedEvaluation(SimpleObjectiveFunction f, Vector<double> point) |
|
|
|
{ |
|
|
|
_objective_object = f; |
|
|
|
_point = point; |
|
|
|
} |
|
|
|
private double setValue() |
|
|
|
|
|
|
|
protected override void setValue() |
|
|
|
{ |
|
|
|
_value = _objective_object.Objective(_point); |
|
|
|
return _value.Value; |
|
|
|
} |
|
|
|
private Vector<double> setGradient() |
|
|
|
|
|
|
|
protected override void setGradient() |
|
|
|
{ |
|
|
|
_gradient = _objective_object.Gradient(_point); |
|
|
|
return _gradient; |
|
|
|
} |
|
|
|
private Matrix<double> setHessian() |
|
|
|
|
|
|
|
protected override void setHessian() |
|
|
|
{ |
|
|
|
_hessian = _objective_object.Hessian(_point); |
|
|
|
return _hessian; |
|
|
|
} |
|
|
|
|
|
|
|
public Vector<double> Point { get { return _point; } } |
|
|
|
public double Value { get { return _value ?? setValue(); } } |
|
|
|
public Vector<double> Gradient { get { return _gradient ?? setGradient(); } } |
|
|
|
public Matrix<double> Hessian { get { return _hessian ?? setHessian(); } } |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
public class SimpleObjectiveFunction : IObjectiveFunction |
|
|
|
|