//! minimize the optimization problem P
public override EndCriteria.Type minimize(Problem P, EndCriteria endCriteria)
{
EndCriteria.Type ecType = EndCriteria.Type.None;
P.reset();
Vector x_ = P.currentValue();
int iterationNumber_ = 0;
int stationaryStateIterationNumber_ = 0;
lineSearch_.searchDirection = new Vector(x_.Count);
bool end;
// function and squared norm of gradient values;
double normdiff;
// classical initial value for line-search step
double t = 1.0;
// Set gold at the size of the optimization problem search direction
Vector gold = new Vector(lineSearch_.searchDirection.Count);
Vector gdiff = new Vector(lineSearch_.searchDirection.Count);
P.setFunctionValue(P.valueAndGradient(gold, x_));
lineSearch_.searchDirection = gold * -1.0;
P.setGradientNormValue(Vector.DotProduct(gold, gold));
normdiff = Math.Sqrt(P.gradientNormValue());
do
{
// Linesearch
t = lineSearch_.value(P, ref ecType, endCriteria, t);
if (!(lineSearch_.succeed()))
{
throw new ApplicationException("line-search failed!");
}
// End criteria
// FIXME: it's never been used! ???
// , normdiff
end = endCriteria.value(iterationNumber_, ref stationaryStateIterationNumber_, true, P.functionValue(), Math.Sqrt(P.gradientNormValue()), lineSearch_.lastFunctionValue(), Math.Sqrt(lineSearch_.lastGradientNorm2()), ref ecType);
// Updates
// New point
x_ = lineSearch_.lastX();
// New function value
P.setFunctionValue(lineSearch_.lastFunctionValue());
// New gradient and search direction vectors
gdiff = gold - lineSearch_.lastGradient();
normdiff = Math.Sqrt(Vector.DotProduct(gdiff, gdiff));
gold = lineSearch_.lastGradient();
lineSearch_.searchDirection = gold * -1.0;
// New gradient squared norm
P.setGradientNormValue(lineSearch_.lastGradientNorm2());
// Increase interation number
++iterationNumber_;
} while (end == false);
P.setCurrentValue(x_);
return(ecType);
}