using MathNet.Numerics.LinearAlgebra; namespace MathNet.Numerics.Optimization { public abstract class BaseObjectiveFunction : IObjectiveFunction { public EvaluationStatus Status { get; protected set; } protected Vector PointRaw { get; set; } protected double ValueRaw { get; set; } protected Vector GradientRaw { get; set; } protected Matrix HessianRaw { get; set; } public bool IsGradientSupported { get; private set; } public bool IsHessianSupported { get; private set; } protected BaseObjectiveFunction(bool gradientSupported, bool hessianSupported) { Status = EvaluationStatus.None; IsGradientSupported = gradientSupported; IsHessianSupported = hessianSupported; } public Vector Point { get { return PointRaw; } set { PointRaw = value; Status = EvaluationStatus.None; } } public void EvaluateAt(Vector point) { PointRaw = point; Status = EvaluationStatus.None; } public double Value { get { if (!Status.HasFlag(EvaluationStatus.Value)) { SetValue(); Status |= EvaluationStatus.Value; } return ValueRaw; } } public Vector Gradient { get { if (!Status.HasFlag(EvaluationStatus.Gradient)) { SetGradient(); Status |= EvaluationStatus.Gradient; } return GradientRaw; } } public Matrix Hessian { get { if (!Status.HasFlag(EvaluationStatus.Hessian)) { SetHessian(); Status |= EvaluationStatus.Hessian; } return HessianRaw; } } public abstract IObjectiveFunction Fork(); protected abstract void SetValue(); protected abstract void SetGradient(); protected abstract void SetHessian(); } }