20 #include "OSParameters.h"
22 #include "CoinFinite.hpp"
28 using std::ostringstream;
29 using namespace Ipopt;
36 "inside IpoptSolver constructor\n");
42 ipoptErrorMsg =
new std::string(
"");
49 "inside IpoptSolver destructor\n");
51 if(m_osilreader != NULL)
delete m_osilreader;
53 if(m_osolreader != NULL)
delete m_osolreader;
64 "Leaving IpoptSolver destructor\n");
70 Index& nnz_h_lag, IndexStyleEnum& index_style)
72 std::ostringstream outStr;
77 throw ErrorClass(
"Ipopt does not solve integer programs -- please try Bonmin or Couenne");
85 outStr <<
"number variables !!!!!!!!!!!!!!!!!!!!!!!!!!!" << n << endl;
86 outStr <<
"number constraints !!!!!!!!!!!!!!!!!!!!!!!!!!!" << m << endl;
97 outStr <<
"error in OSIpoptSolver, AD initialization failed:\n" << eclass.
errormsg << endl;
113 outStr <<
"error in OSIpoptSolver, Jacobian sparsity:\n" << eclass.
errormsg << endl;
118 if (sparseJacobian != NULL)
130 outStr <<
"nnz_jac_g !!!!!!!!!!!!!!!!!!!!!!!!!!!" << nnz_jac_g << endl;
146 if(sparseHessian != NULL)
158 outStr <<
"print nnz_h_lag (OSIpoptSolver.cpp)" << endl;
159 outStr <<
"nnz_h_lag !!!!!!!!!!!!!!!!!!!!!!!!!!!" << nnz_h_lag << endl;
160 outStr <<
"set index_style (OSIpoptSolver.cpp)" << endl;
164 index_style = TNLP::C_STYLE;
168 outStr <<
"return from get_nlp_info (OSIpoptSolver.cpp)" << nnz_h_lag << endl;
186 Index
m, Number* g_l, Number* g_u)
193 for(i = 0; i <
n; i++)
195 x_l[ i] = mdVarLB[ i];
196 x_u[ i] = mdVarUB[ i];
208 for(
int i = 0; i <
m; i++)
210 g_l[ i] = mdConLB[ i];
211 g_u[ i] = mdConUB[ i];
219 bool init_z, Number* z_L, Number* z_U, Index
m,
bool init_lambda,
222 std::ostringstream outStr;
227 assert(init_x ==
true);
228 assert(init_z ==
false);
229 assert(init_lambda ==
false);
248 outStr <<
"number of variables initialed: " << m1 << endl;
254 initialed =
new bool[n1];
258 outStr <<
"number of variables in total: " << n1 << endl;
262 for(k = 0; k < n1; k++)
263 initialed[k] =
false;
269 "get initial values\n");
279 for(k = 0; k <
m1; k++)
281 i = initVarVector[
k]->
idx;
282 if (initVarVector[k]->idx > n1)
283 throw ErrorClass (
"Illegal index value in variable initialization");
285 initval = initVarVector[
k]->
value;
289 throw ErrorClass (
"Initial value outside of bounds");
294 throw ErrorClass (
"Initial value outside of bounds");
300 throw ErrorClass (
"Initial value outside of bounds");
303 x[initVarVector[
k]->
idx] = initval;
304 initialed[initVarVector[
k]->idx] =
true;
310 "Error in IpoptProblem::get_starting_point (see OSIpoptSolver.cpp)\n"+eclass.
errormsg+
"\n\n");
314 double default_initval;
315 default_initval = 1.7171;
318 for(k = 0; k < n1; k++)
324 x[
k] = default_initval;
329 x[
k] = default_initval;
334 x[
k] = default_initval;
345 for(i = 0; i < n1; i++)
347 outStr <<
"INITIAL VALUE !!!!!!!!!!!!!!!!!!!! " << x[ i] << std::endl;
386 std::ostringstream outStr;
388 double *objGrad = NULL;
401 outStr <<
"error in IpoptProblem::eval_grad_f (see OSIpoptSolver.cpp)\n" << eclass.
errormsg << endl;
407 for(i = 0; i <
n; i++)
409 grad_f[ i] = objGrad[ i];
418 std::ostringstream outStr;
423 for(i = 0; i <
m; i++)
425 if( CoinIsnan( (
double)conVals[ i] ) )
return false;
435 outStr <<
"error in IpoptProblem::eval_grad_g (see OSIpoptSolver.cpp)\n" << eclass.
errormsg << endl;
446 Index
m, Index nele_jac, Index* iRow, Index *jCol,
449 std::ostringstream outStr;
463 outStr <<
"error in IpoptProblem::eval_jac_g (see OSIpoptSolver.cpp)\n" << eclass.
errormsg << endl;
471 for(idx = 0; idx <
m; idx++)
473 for(k = *(sparseJacobian->
starts + idx); k < *(sparseJacobian->
starts + idx + 1); k++)
476 jCol[i] = *(sparseJacobian->
indexes +
k);
492 outStr <<
"error in IpoptProblem::eval_jac_g (see OSIpoptSolver.cpp)\n" << eclass.
errormsg << endl;
499 for(
int i = 0; i < nele_jac; i++)
501 values[ i] = sparseJacobian->
values[i];
509 Number obj_factor, Index
m,
const Number* lambda,
510 bool new_lambda, Index nele_hess, Index* iRow,
511 Index* jCol, Number*
values)
513 std::ostringstream outStr;
532 for(i = 0; i < nele_hess; i++)
541 double* objMultipliers =
new double[1];
542 objMultipliers[0] = obj_factor;
546 delete[] objMultipliers;
553 outStr <<
"error in OSIpoptSolver, line 444:\n" << eclass.
errormsg << endl;
557 delete[] objMultipliers;
560 for(i = 0; i < nele_hess; i++)
562 values[ i] = *(sparseHessian->
hessValues + i);
570 bool& use_x_scaling, Index
n,
572 bool& use_g_scaling, Index
m,
579 else obj_scaling = 1;
580 use_x_scaling =
false;
581 use_g_scaling =
false;
586 Index
n,
const Number*
x,
const Number* z_L,
const Number* z_U,
587 Index
m,
const Number*
g,
const Number* lambda, Number obj_value,
588 const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq)
597 ostringstream outStr;
600 outStr << std::endl << std::endl <<
"Solution of the primal variables, x" << std::endl;
601 for (Index i=0; i<
n; i++)
603 outStr <<
"x[" << i <<
"] = " << x[i] << std::endl;
606 outStr << std::endl << std::endl <<
"Solution of the bound multipliers, z_L and z_U" << std::endl;
607 for (Index i=0; i<
n; i++)
609 outStr <<
"z_L[" << i <<
"] = " << z_L[i] << std::endl;
611 for (Index i=0; i<
n; i++)
613 outStr <<
"z_U[" << i <<
"] = " << z_U[i] << std::endl;
621 outStr << std::endl <<
"Objective value f(x*) = " <<
os_dtoa_format(obj_value) << std::endl;
625 int numberOfOtherVariableResults;
630 double *dualValue = NULL;
631 std::string *rcost = NULL;
633 double* mdObjValues = NULL;
636 mdObjValues =
new double[1];
639 std::string message =
"Ipopt solver finishes to the end.";
640 std::string solutionDescription =
"";
646 throw ErrorClass(
"OSResult error: setSolverInvoked");
648 throw ErrorClass(
"OSResult error: setServiceName");
650 throw ErrorClass(
"OSResult error: setInstanceName");
657 throw ErrorClass(
"OSResult error: setVariableNumer");
659 throw ErrorClass(
"OSResult error: setObjectiveNumber");
661 throw ErrorClass(
"OSResult error: setConstraintNumber");
663 throw ErrorClass(
"OSResult error: setSolutionNumer");
665 throw ErrorClass(
"OSResult error: setGeneralMessage");
670 solutionDescription =
"SUCCESS[IPOPT]: Algorithm terminated normally at a locally optimal point, satisfying the convergence tolerances.";
677 dualValue =
new double[ numCon];
678 for (Index i=0; i < numCon; i++)
680 dualValue[ i] = -lambda[ i];
688 mdObjValues[0] = obj_value ;
695 numberOfOtherVariableResults = 1;
699 for (Index i = 0; i <
n; i++)
730 case MAXITER_EXCEEDED:
731 solutionDescription =
"MAXITER_EXCEEDED[IPOPT]: Maximum number of iterations exceeded.";
737 mdObjValues[0] = obj_value ;
742 case STOP_AT_TINY_STEP:
743 solutionDescription =
"STOP_AT_TINY_STEP[IPOPT]: Algorithm proceeds with very little progress.";
749 mdObjValues[0] = obj_value ;
754 case STOP_AT_ACCEPTABLE_POINT:
755 solutionDescription =
"STOP_AT_ACCEPTABLE_POINT[IPOPT]: Algorithm stopped at a point that was converged, not to _desired_ tolerances, but to _acceptable_ tolerances";
761 mdObjValues[0] = obj_value ;
766 case LOCAL_INFEASIBILITY:
767 solutionDescription =
"LOCAL_INFEASIBILITY[IPOPT]: Algorithm converged to a point of local infeasibility. Problem may be infeasible.";
773 case USER_REQUESTED_STOP:
774 solutionDescription =
"USER_REQUESTED_STOP[IPOPT]: The user call-back function intermediate_callback returned false, i.e., the user code requested a premature termination of the optimization.";
780 case DIVERGING_ITERATES:
781 solutionDescription =
"DIVERGING_ITERATES[IPOPT]: It seems that the iterates diverge.";
787 case RESTORATION_FAILURE:
788 solutionDescription =
"RESTORATION_FAILURE[IPOPT]: Restoration phase failed, algorithm doesn't know how to proceed.";
794 case ERROR_IN_STEP_COMPUTATION:
795 solutionDescription =
"ERROR_IN_STEP_COMPUTATION[IPOPT]: An unrecoverable error occurred while IPOPT tried to compute the search direction.";
801 case INVALID_NUMBER_DETECTED:
802 solutionDescription =
"INVALID_NUMBER_DETECTED[IPOPT]: Algorithm received an invalid number (such as NaN or Inf) from the NLP; see also option check_derivatives_for_naninf.";
809 solutionDescription =
"INTERNAL_ERROR[IPOPT]: An unknown internal error occurred. Please contact the IPOPT authors through the mailing list.";
816 solutionDescription =
"OTHER[IPOPT]: other unknown solution status from Ipopt solver";
827 delete[] mdObjValues;
837 outStr <<
"error trap in OSIpoptSolver:\n" << eclass.
errormsg << endl;
847 delete[] mdObjValues;
858 std::ostringstream outStr;
861 if(osil.length() == 0 &&
osinstance == NULL)
throw ErrorClass(
"there is no instance");
870 throw ErrorClass(
"Solver cannot handle multiple objectives --- please delete all but one");
874 app =
new IpoptApplication();
876 this->bCallbuildSolverInstance =
true;
879 catch(
const ErrorClass& eclass)
884 outStr <<
"error in OSIpoptSolver, line 722:\n" << eclass.
errormsg << endl;
889 osrl = osrlwriter->writeOSrL(
osresult);
890 throw ErrorClass( osrl) ;
897 std::ostringstream outStr;
901 throw ErrorClass(
"Ipopt NEEDS AN OBJECTIVE FUNCTION\n(For pure feasibility problems, use zero function.)");
902 this->bSetSolverOptions =
true;
905 app->Options()->SetIntegerValue(
"print_level", 0);
906 app->Options()->SetIntegerValue(
"max_iter", 20000);
907 app->Options()->SetNumericValue(
"bound_relax_factor", 0,
true,
true);
908 app->Options()->SetStringValue(
"mu_strategy",
"adaptive",
true,
true);
910 app->Options()->SetStringValue(
"check_derivatives_for_naninf",
"yes");
915 app->Options()->SetStringValue(
"hessian_constant",
"yes",
true,
true);
921 app->Options()->SetStringValue(
"nlp_scaling_method",
"user-scaling");
927 if(
osoption == NULL && osol.length() > 0)
930 osoption = m_osolreader->readOSoL( osol);
938 outStr <<
"number of solver options ";
943 std::vector<SolverOption*> optionsVector;
947 int num_ipopt_options = optionsVector.size();
948 for(i = 0; i < num_ipopt_options; i++)
953 outStr <<
"ipopt solver option ";
954 outStr << optionsVector[ i]->name;
958 if(optionsVector[ i]->type ==
"numeric" )
963 outStr <<
"FOUND A NUMERIC OPTION ";
964 outStr <<
os_strtod( optionsVector[ i]->value.c_str(), &pEnd );
968 app->Options()->SetNumericValue(optionsVector[ i]->name,
os_strtod( optionsVector[ i]->value.c_str(), &pEnd ) );
970 else if(optionsVector[ i]->type ==
"integer" )
975 outStr <<
"FOUND AN INTEGER OPTION ";
976 outStr << atoi( optionsVector[ i]->value.c_str() );
980 app->Options()->SetIntegerValue(optionsVector[ i]->name, atoi( optionsVector[ i]->value.c_str() ) );
982 else if(optionsVector[ i]->type ==
"string" )
987 outStr <<
"FOUND A STRING OPTION ";
988 outStr << optionsVector[ i]->value.c_str();
992 app->Options()->SetStringValue(optionsVector[ i]->name, optionsVector[ i]->value);
998 catch(
const ErrorClass& eclass)
1003 osrl = osrlwriter->writeOSrL(
osresult);
1004 throw ErrorClass( osrl) ;
1012 std::ostringstream outStr;
1014 if( this->bCallbuildSolverInstance ==
false) buildSolverInstance();
1015 if( this->bSetSolverOptions ==
false) setSolverOptions();
1019 ApplicationReturnStatus status = app->OptimizeTNLP( nlp);
1020 osrl = osrlwriter->writeOSrL(
osresult);
1023 throw ErrorClass(
"Ipopt FAILED TO SOLVE THE PROBLEM: " + *ipoptErrorMsg);
1027 catch(
const ErrorClass& eclass)
1031 outStr <<
"error in OSIpoptSolver routine solve():\n" << eclass.
errormsg << endl;
1036 osrl = osrlwriter->writeOSrL(
osresult);
1037 throw ErrorClass( osrl) ;
1045 ostringstream outStr;
1074 outStr <<
"problem is a minimization" << endl;
1076 outStr <<
"problem is a maximization" << endl;
1101 outStr <<
"Start Value = "
1107 outStr <<
"Index Value = "
1109 outStr <<
"Nonzero Value = "
1133 ipoptErrorMsg = ipoptErrorMsg_;
double * getConstraintLowerBounds()
Get constraint lower bounds.
double * getVariableLowerBounds()
Get variable lower bounds.
double * getConstraintUpperBounds()
Get constraint upper bounds.
std::string OSgetVersionInfo()
double os_strtod(const char *s00, char **se)
int getNumberOfInitVarValues()
Get the number of initial variable values.
int getNumberOfIntegerVariables()
getNumberOfIntegerVariables
char * getVariableTypes()
Get variable initial values.
bool setSolutionStatus(int solIdx, std::string type, std::string description)
Set the [i]th optimization solution status, where i equals the given solution index.
bool setPrimalVariableValuesDense(int solIdx, double *x)
Set the [i]th optimization solution's primal variable values, where i equals the given solution index...
SparseHessianMatrix * calculateLagrangianHessian(double *x, double *objLambda, double *conLambda, bool new_x, int highestOrder)
Calculate the Hessian of the Lagrangian Expression Tree This method will build the CppAD expression t...
const OSSmartPtr< OSOutput > osoutput
double * values
values holds a double array of nonzero partial derivatives
bool bUseExpTreeForFunEval
bUseExpTreeForFunEval is set to true if you wish to use the OS Expression Tree for function evaluatio...
int getVariableNumber()
Get number of variables.
virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number *grad_f)
Method to return the gradient of the objective.
~IpoptSolver()
the IpoptSolver class destructor
virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number *x_l, Ipopt::Number *x_u, Ipopt::Index m, Ipopt::Number *g_l, Ipopt::Number *g_u)
Method to return the bounds for my problem.
bool setServiceName(std::string serviceName)
Set service name.
bool setVariableNumber(int variableNumber)
Set the variable number.
std::string errormsg
errormsg is the error that is causing the exception to be thrown
int getLinearConstraintCoefficientNumber()
Get number of specified (usually nonzero) linear constraint coefficient values.
std::string maxOrMin
declare the objective function to be a max or a min
std::vector< SolverOption * > getSolverOptions(std::string solver_name)
Get the options associated with a given solver.
bool setSolverInvoked(std::string solverInvoked)
Set solver invoked.
SparseJacobianMatrix * calculateAllConstraintFunctionGradients(double *x, double *objLambda, double *conLambda, bool new_x, int highestOrder)
Calculate the gradient of all constraint functions.
bool setAnOtherVariableResultSparse(int solIdx, int otherIdx, std::string name, std::string value, std::string description, int *idx, std::string *s, int n)
Set the [i]th optimization solution's other (non-standard/solver specific)variable-related results...
Take an OSResult object and write a string that validates against OSrL.
bool setDualVariableValuesDense(int solIdx, double *y)
Set the [i]th optimization solution's dual variable values, where i equals the given solution index...
int * hessColIdx
hessColIdx is an integer array of column indices in the range 0, ..., n - 1.
int getObjectiveNumber()
Get number of objectives.
bool setObjectiveNumber(int objectiveNumber)
Set the objective number.
bool setInstanceName(std::string instanceName)
Set instance name.
virtual void solve()
solve results in an instance being read into the Ipopt data structures and optimize ...
bool setSolutionMessage(int solIdx, std::string msg)
Set the [i]th optimization solution's message, where i equals the given solution index.
std::string * getVariableNames()
Get variable names.
int * hessRowIdx
hessRowIdx is an integer array of row indices in the range 0, ..., n - 1.
int getNumberOfNonlinearExpressions()
Get number of nonlinear expressions.
virtual bool eval_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Number *g)
Method to return the constraint residuals.
std::string writeOSrL(OSResult *theosresult)
create an osrl string from an OSResult object
int numberOfObjectives
numberOfObjectives is the number of objective functions in the instance
virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number *x, bool init_z, Ipopt::Number *z_L, Ipopt::Number *z_U, Ipopt::Index m, bool init_lambda, Ipopt::Number *lambda)
Method to return the starting point for the algorithm.
int * indexes
indexes holds an integer array of rowIdx (or colIdx) elements in coefMatrix (AMatrix).
bool setSolutionNumber(int number)
set the number of solutions.
double ** getDenseObjectiveCoefficients()
getDenseObjectiveCoefficients.
SparseJacobianMatrix * getJacobianSparsityPattern()
int valueSize
valueSize is the dimension of the values array
Used to read an OSiL string.
bool setNumberOfOtherVariableResults(int solIdx, int numberOfOtherVariableResults)
Set the [i]th optimization solution's other (non-standard/solver specific) variable-related results...
IpoptSolver()
the IpoptSolver class constructor
int * indexes
indexes holds an integer array of variable indices.
double * calculateAllConstraintFunctionValues(double *x, double *objLambda, double *conLambda, bool new_x, int highestOrder)
Calculate all of the constraint function values.
double lb
lb corresponds to the optional attribute that holds the variable lower bound.
virtual void setSolverOptions()
The implementation of the virtual functions.
Variable ** var
Here we define a pointer to an array of var pointers.
virtual bool eval_h(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number *lambda, bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index *iRow, Ipopt::Index *jCol, Ipopt::Number *values)
Method to return: 1) The structure of the hessian of the lagrangian (if "values" is NULL) 2) The valu...
int hessDimension
hessDimension is the number of nonzeros in each array.
int * varOneIndexes
varOneIndexes holds an integer array of the first variable indexes of all the quadratic terms...
double value
initial value
SparseHessianMatrix * getLagrangianHessianSparsityPattern()
std::string * getObjectiveMaxOrMins()
Get objective maxOrMins.
double ub
ub corresponds to the optional attribute that holds the variable upper bound.
double * hessValues
hessValues is a double array of the Hessian values.
Variables * variables
variables is a pointer to a Variables object
SparseMatrix * getLinearConstraintCoefficientsInColumnMajor()
Get linear constraint coefficients in column major.
bool setGeneralMessage(std::string message)
Set the general message.
double * values
values holds a double array of value elements in coefMatrix (AMatrix), which contains nonzero element...
bool setGeneralStatusType(std::string type)
Set the general status type, which can be: success, error, warning.
a sparse Jacobian matrix data structure
std::string getInstanceName()
Get instance name.
void dataEchoCheck()
use this for debugging, print out the instance that the solver thinks it has and compare this with th...
InstanceData * instanceData
A pointer to an InstanceData object.
int * starts
starts holds an integer array of start elements, each start element points to the start of partials f...
int getConstraintNumber()
Get number of constraints.
Objective ** obj
coef is pointer to an array of ObjCoef object pointers
bool setConstraintNumber(int constraintNumber)
Set the constraint number.
int getNumberOfSolverOptions()
Get the number of solver options.
int getNumberOfQuadraticTerms()
Get the number of specified (usually nonzero) qTerms in the quadratic coefficients.
virtual bool get_scaling_parameters(Ipopt::Number &obj_scaling, bool &use_x_scaling, Ipopt::Index n, Ipopt::Number *x_scaling, bool &use_g_scaling, Ipopt::Index m, Ipopt::Number *g_scaling)
Used to read an OSoL string.
Objectives * objectives
objectives is a pointer to a Objectives object
std::string getInstanceSource()
Get instance source.
virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index *iRow, Ipopt::Index *jCol, Ipopt::Number *values)
Method to return: 1) The structure of the jacobian (if "values" is NULL) 2) The values of the jacobia...
InitVarValue ** getInitVarValuesSparse()
Get the initial values associated with the variables in sparse form.
bool initForAlgDiff()
This should be called by nonlinear solvers using callback functions.
int * rowIndexes
rowIndexes holds an integer array of row indexes of all the quadratic terms.
std::string os_dtoa_format(double x)
int * starts
starts holds an integer array of start elements in coefMatrix (AMatrix), which points to the start of...
double * calculateAllObjectiveFunctionValues(double *x, double *objLambda, double *conLambda, bool new_x, int highestOrder)
Calculate all of the objective function values.
QuadraticTerms * getQuadraticTerms()
Get all the quadratic terms in the instance.
double * getVariableUpperBounds()
Get variable upper bounds.
void fint fint fint real fint real real real real real real * g
IpoptProblem(OSInstance *osinstance_, OSOption *osoption_, OSResult *osresult_, std::string *ipoptErrorMsg_)
the IpoptProblemclass constructor
bool setObjectiveValuesDense(int solIdx, double *objectiveValues)
Set the [i]th optimization solution's objective values, where i equals the given solution index...
The in-memory representation of an OSiL instance..
virtual bool get_nlp_info(Ipopt::Index &n, Ipopt::Index &m, Ipopt::Index &nnz_jac_g, Ipopt::Index &nnz_h_lag, IndexStyleEnum &index_style)
IPOpt specific methods for defining the nlp problem.
virtual void finalize_solution(Ipopt::SolverReturn status, Ipopt::Index n, const Ipopt::Number *x, const Ipopt::Number *z_L, const Ipopt::Number *z_U, Ipopt::Index m, const Ipopt::Number *g, const Ipopt::Number *lambda, Ipopt::Number obj_value, const Ipopt::IpoptData *ip_data, Ipopt::IpoptCalculatedQuantities *ip_cq)
This method is called when the algorithm is complete so the TNLP can store/write the solution...
double * coefficients
coefficients holds a double array all the quadratic term coefficients.
int * varTwoIndexes
varTwoIndexes holds an integer array of the second variable indexes of all the quadratic terms...
The in-memory representation of a SparseHessianMatrix..
std::string * getConstraintNames()
Get constraint names.
virtual ~IpoptProblem()
the IpoptProblem class destructor
used for throwing exceptions.
virtual bool eval_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number &obj_value)
Method to return the objective value.
int getNumberOfBinaryVariables()
getNumberOfBinaryVariables
std::string getInstanceDescription()
Get instance description.
virtual void buildSolverInstance()
The implementation of the virtual functions.
double * calculateObjectiveFunctionGradient(double *x, double *objLambda, double *conLambda, int objIdx, bool new_x, int highestOrder)
Calculate the gradient of the objective function indexed by objIdx.
void fint fint fint real fint real * x