protected void EvaluateGradient() { if (!ValueEvaluated) { EvaluateValue(); } var tmpPoint = Point.Clone(); var tmpObj = InnerObjectiveFunction.CreateNew(); for (int ii = 0; ii < _gradient.Count; ++ii) { var origPoint = tmpPoint[ii]; var relIncr = origPoint * RelativeIncrement; var h = Math.Max(relIncr, MinimumIncrement); var mult = 1; if (origPoint + h > UpperBound[ii]) { mult = -1; } tmpPoint[ii] = origPoint + mult * h; tmpObj.EvaluateAt(tmpPoint); double bumpedValue = tmpObj.Value; _gradient[ii] = (mult * bumpedValue - mult * InnerObjectiveFunction.Value) / h; tmpPoint[ii] = origPoint; } GradientEvaluated = true; }
public void EvaluateAt(Vector <double> point) { Point = point; ValueEvaluated = false; GradientEvaluated = false; InnerObjectiveFunction.EvaluateAt(point); }
public IObjectiveFunction Fork() { return(new ForwardDifferenceGradientObjectiveFunction(InnerObjectiveFunction.Fork(), LowerBound, UpperBound, RelativeIncrement, MinimumIncrement) { Point = Point?.Clone(), GradientEvaluated = GradientEvaluated, ValueEvaluated = ValueEvaluated, _gradient = _gradient?.Clone() }); }
public IObjectiveFunction CreateNew() { var tmp = new ForwardDifferenceGradientObjectiveFunction(InnerObjectiveFunction.CreateNew(), LowerBound, UpperBound, RelativeIncrement, MinimumIncrement); return(tmp); }