private void init(NonlinearObjectiveFunction function,
IEnumerable<NonlinearConstraint> constraints, IGradientOptimizationMethod innerSolver)
{
if (function != null)
{
if (function.NumberOfVariables != NumberOfVariables)
{
throw new ArgumentOutOfRangeException("function",
"Incorrect number of variables in the objective function. " +
"The number of variables must match the number of variables set in the solver.");
}
this.Function = function.Function;
this.Gradient = function.Gradient;
}
if (innerSolver == null)
{
innerSolver = new BroydenFletcherGoldfarbShanno(NumberOfVariables)
{
LineSearch = Optimization.LineSearch.BacktrackingArmijo,
Corrections = 10
};
}
List<NonlinearConstraint> equality = new List<NonlinearConstraint>();
List<NonlinearConstraint> lesserThan = new List<NonlinearConstraint>();
List<NonlinearConstraint> greaterThan = new List<NonlinearConstraint>();
foreach (var c in constraints)
{
switch (c.ShouldBe)
{
case ConstraintType.EqualTo:
equality.Add(c); break;
case ConstraintType.GreaterThanOrEqualTo:
greaterThan.Add(c); break;
case ConstraintType.LesserThanOrEqualTo:
lesserThan.Add(c); break;
default:
throw new ArgumentException("Unknown constraint type.", "constraints");
}
}
this.lesserThanConstraints = lesserThan.ToArray();
this.greaterThanConstraints = greaterThan.ToArray();
this.equalityConstraints = equality.ToArray();
this.lambda = new double[equalityConstraints.Length];
this.mu = new double[lesserThanConstraints.Length];
this.nu = new double[greaterThanConstraints.Length];
this.dualSolver = innerSolver;
dualSolver.Function = objectiveFunction;
dualSolver.Gradient = objectiveGradient;
}