void WorhpInternal::passOptions() { for (int i=0;i<WorhpGetParamCount();++i) { WorhpType type = WorhpGetParamType(i+1); const char* name = WorhpGetParamName(i+1); if (strcmp(name,"Ares")==0) continue; switch(type) { case WORHP_BOOL_T: if (hasSetOption(name)) WorhpSetBoolParam(&worhp_p_, name, getOption(name)); break; case WORHP_DOUBLE_T: if (hasSetOption(name)) WorhpSetDoubleParam(&worhp_p_, name, getOption(name)); break; case WORHP_INT_T: if (hasSetOption(name)) WorhpSetIntParam(&worhp_p_, name, getOption(name)); break; default: break;// do nothing } } if (hasSetOption("qp_ipBarrier")) worhp_p_.qp.ipBarrier = getOption("qp_ipBarrier"); if (hasSetOption("qp_ipComTol")) worhp_p_.qp.ipComTol = getOption("qp_ipComTol"); if (hasSetOption("qp_ipFracBound")) worhp_p_.qp.ipFracBound = getOption("qp_ipFracBound"); if (hasSetOption("qp_ipLsMethod")) worhp_p_.qp.ipLsMethod = getOptionEnumValue("qp_ipLsMethod"); if (hasSetOption("qp_ipMinAlpha")) worhp_p_.qp.ipMinAlpha = getOption("qp_ipMinAlpha"); if (hasSetOption("qp_ipTryRelax")) worhp_p_.qp.ipTryRelax = getOption("qp_ipTryRelax"); if (hasSetOption("qp_ipRelaxDiv")) worhp_p_.qp.ipRelaxDiv = getOption("qp_ipRelaxDiv"); if (hasSetOption("qp_ipRelaxMult")) worhp_p_.qp.ipRelaxMult = getOption("qp_ipRelaxMult"); if (hasSetOption("qp_ipRelaxMax")) worhp_p_.qp.ipRelaxMax = getOption("qp_ipRelaxMax"); if (hasSetOption("qp_ipRelaxMin")) worhp_p_.qp.ipRelaxMin = getOption("qp_ipRelaxMin"); if (hasSetOption("qp_ipResTol")) worhp_p_.qp.ipResTol = getOption("qp_ipResTol"); if (hasSetOption("qp_lsItMaxIter")) worhp_p_.qp.lsItMaxIter = getOption("qp_lsItMaxIter"); if (hasSetOption("qp_lsItMethod")) worhp_p_.qp.lsItMethod = getOptionEnumValue("qp_lsItMethod"); if (hasSetOption("qp_lsItPrecondMethod")) worhp_p_.qp.lsItPrecondMethod = getOptionEnumValue("qp_lsItPrecondMethod"); if (hasSetOption("qp_lsRefineMaxIter")) worhp_p_.qp.lsRefineMaxIter = getOption("qp_lsRefineMaxIter"); if (hasSetOption("qp_lsScale")) worhp_p_.qp.lsScale = getOption("qp_lsScale"); if (hasSetOption("qp_lsTrySimple")) worhp_p_.qp.lsTrySimple = getOption("qp_lsTrySimple"); if (hasSetOption("qp_lsTol")) worhp_p_.qp.lsTol = getOption("qp_lsTol"); if (hasSetOption("qp_maxIter")) worhp_p_.qp.maxIter = getOption("qp_maxIter"); if (hasSetOption("qp_method")) worhp_p_.qp.method = getOptionEnumValue("qp_method"); if (hasSetOption("qp_nsnBeta")) worhp_p_.qp.nsnBeta = getOption("qp_nsnBeta"); if (hasSetOption("qp_nsnGradStep")) worhp_p_.qp.nsnGradStep = getOption("qp_nsnGradStep"); if (hasSetOption("qp_nsnKKT")) worhp_p_.qp.nsnKKT = getOption("qp_nsnKKT"); if (hasSetOption("qp_nsnLsMethod")) worhp_p_.qp.nsnLsMethod = getOptionEnumValue("qp_nsnLsMethod"); if (hasSetOption("qp_nsnMinAlpha")) worhp_p_.qp.nsnMinAlpha = getOption("qp_nsnMinAlpha"); if (hasSetOption("qp_nsnSigma")) worhp_p_.qp.nsnSigma = getOption("qp_nsnSigma"); if (hasSetOption("qp_printLevel")) worhp_p_.qp.printLevel = getOptionEnumValue("qp_printLevel"); if (hasSetOption("qp_scaleIntern")) worhp_p_.qp.scaleIntern = getOption("qp_scaleIntern"); if (hasSetOption("qp_strict")) worhp_p_.qp.strict = getOption("qp_strict"); // Mark the parameters as set worhp_p_.initialised = true; }
void WorhpInterface::init(const Dict& opts) { // Call the init method of the base class Nlpsol::init(opts); if (CheckWorhpVersion(WORHP_MAJOR, WORHP_MINOR, WORHP_PATCH)) { casadi_warning("Worhp incompatibility. Interface was compiled for Worhp " + str(WORHP_MAJOR) + "." + str(WORHP_MINOR) + "." + std::string(WORHP_PATCH)); } // Default options Dict worhp_opts; // Read user options for (auto&& op : opts) { if (op.first=="worhp") { worhp_opts = op.second; } } // Sort Worhp options casadi_int nopts = WorhpGetParamCount(); for (auto&& op : worhp_opts) { if (op.first.compare("qp")==0) { qp_opts_ = op.second; continue; } // Get corresponding index using a linear search casadi_int ind; for (ind=1; ind<=nopts; ++ind) { // Get name in WORHP const char* name = WorhpGetParamName(ind); // Break if matching name if (op.first.compare(name)==0) break; } if (ind>nopts) casadi_error("No such Worhp option: " + op.first); // Add to the corresponding list switch (WorhpGetParamType(ind)) { case WORHP_BOOL_T: bool_opts_[op.first] = op.second; break; case WORHP_DOUBLE_T: double_opts_[op.first] = op.second; break; case WORHP_INT_T: int_opts_[op.first] = op.second; break; default: casadi_error("Cannot handle WORHP option \"" + op.first + "\": Unknown type " + str(WorhpGetParamType(ind)) + "."); break; } } // Setup NLP functions f_fcn_ = create_function("nlp_f", {"x", "p"}, {"f"}); g_fcn_ = create_function("nlp_g", {"x", "p"}, {"g"}); grad_f_fcn_ = create_function("nlp_grad_f", {"x", "p"}, {"f", "grad:f:x"}); jac_g_fcn_ = create_function("nlp_jac_g", {"x", "p"}, {"g", "jac:g:x"}); jacg_sp_ = jac_g_fcn_.sparsity_out(1); hess_l_fcn_ = create_function("nlp_hess_l", {"x", "p", "lam:f", "lam:g"}, {"transpose:hess:gamma:x:x"}, {{"gamma", {"f", "g"}}}); hesslag_sp_ = hess_l_fcn_.sparsity_out(0); // Temporary vectors alloc_w(nx_); // for fetching diagonal entries form Hessian }
void WorhpInternal::setOptionsFromFile(const std::string & file) { int status; char *cpy = new char[file.size()+1] ; strcpy(cpy, file.c_str()); worhp_p_.initialised = true; ReadParamsNoInit(&status, cpy, &worhp_p_); delete cpy; for (int i=0;i<WorhpGetParamCount();++i) { WorhpType type = WorhpGetParamType(i+1); const char* name = WorhpGetParamName(i+1); if (strcmp(name,"Ares")==0) continue; switch(type) { case WORHP_BOOL_T: bool default_bool; WorhpGetBoolParam(&worhp_p_, name, &default_bool); setOption(WorhpGetParamName(i+1),default_bool); break; case WORHP_DOUBLE_T: double default_double; WorhpGetDoubleParam(&worhp_p_, name, &default_double); setOption(WorhpGetParamName(i+1),default_double); break; case WORHP_INT_T: int default_int; WorhpGetIntParam(&worhp_p_, name, &default_int); setOption(WorhpGetParamName(i+1),default_int); break; default: break; // do nothing } } setOption("qp_ipBarrier",worhp_p_.qp.ipBarrier); setOption("qp_ipComTol",worhp_p_.qp.ipComTol); setOption("qp_ipFracBound",worhp_p_.qp.ipFracBound); setOptionByEnumValue("qp_ipLsMethod",worhp_p_.qp.ipLsMethod ); setOption("qp_ipMinAlpha",worhp_p_.qp.ipMinAlpha); setOption("qp_ipTryRelax",worhp_p_.qp.ipTryRelax); setOption("qp_ipRelaxDiv",worhp_p_.qp.ipRelaxDiv); setOption("qp_ipRelaxMult",worhp_p_.qp.ipRelaxMult); setOption("qp_ipRelaxMax",worhp_p_.qp.ipRelaxMax); setOption("qp_ipRelaxMin",worhp_p_.qp.ipRelaxMin); setOption("qp_ipResTol",worhp_p_.qp.ipResTol); setOption("qp_lsItMaxIter",worhp_p_.qp.lsItMaxIter); setOptionByEnumValue("qp_lsItMethod",worhp_p_.qp.lsItMethod ); setOptionByEnumValue("qp_lsItPrecondMethod",worhp_p_.qp.lsItPrecondMethod ); setOption("qp_lsRefineMaxIter",worhp_p_.qp.lsRefineMaxIter); setOption("qp_lsScale",worhp_p_.qp.lsScale); setOption("qp_lsTrySimple",worhp_p_.qp.lsTrySimple); setOption("qp_lsTol",worhp_p_.qp.lsTol); setOption("qp_maxIter",worhp_p_.qp.maxIter); setOptionByEnumValue("qp_method",worhp_p_.qp.method ); setOption("qp_nsnBeta",worhp_p_.qp.nsnBeta); setOption("qp_nsnGradStep",worhp_p_.qp.nsnGradStep); setOption("qp_nsnKKT",worhp_p_.qp.nsnKKT); setOptionByEnumValue("qp_nsnLsMethod",worhp_p_.qp.nsnLsMethod ); setOption("qp_nsnMinAlpha",worhp_p_.qp.nsnMinAlpha); setOption("qp_nsnSigma",worhp_p_.qp.nsnSigma); setOptionByEnumValue("qp_printLevel",worhp_p_.qp.printLevel ); setOption("qp_scaleIntern",worhp_p_.qp.scaleIntern); setOption("qp_strict",worhp_p_.qp.strict); std::cout << "readparams status: " << status << std::endl; }
WorhpInternal::WorhpInternal(const Function& nlp) : NLPSolverInternal(nlp){ // Monitors addOption("monitor", OT_STRINGVECTOR, GenericType(), "Monitor functions", "eval_f|eval_g|eval_jac_g|eval_grad_f|eval_h", true); addOption("print_time", OT_BOOLEAN, true, "Print information about execution time"); int status; InitParams(&status, &worhp_p_); std::stringstream ss; ss << "Armijo recovery strategies. Vector of size " << NAres; std::vector<int> ares(NAres); std::copy(worhp_p_.Ares,worhp_p_.Ares+NAres,ares.begin()); addOption("Ares",OT_INTEGERVECTOR,ares,ss.str()); for (int i=0;i<WorhpGetParamCount();++i) { WorhpType type = WorhpGetParamType(i+1); const char* name = WorhpGetParamName(i+1); if (strcmp(name,"Ares")==0) continue; switch(type) { case WORHP_BOOL_T: bool default_bool; WorhpGetBoolParam(&worhp_p_, name, &default_bool); addOption(WorhpGetParamName(i+1),OT_BOOLEAN,default_bool,WorhpGetParamDescription(i+1)); break; case WORHP_DOUBLE_T: double default_double; WorhpGetDoubleParam(&worhp_p_, name, &default_double); addOption(WorhpGetParamName(i+1),OT_REAL,default_double,WorhpGetParamDescription(i+1)); break; case WORHP_INT_T: int default_int; WorhpGetIntParam(&worhp_p_, name, &default_int); addOption(WorhpGetParamName(i+1),OT_INTEGER,default_int,WorhpGetParamDescription(i+1)); break; default: break;// do nothing } } addOption("qp_ipBarrier",OT_REAL,worhp_p_.qp.ipBarrier,"IP barrier parameter."); addOption("qp_ipComTol",OT_REAL,worhp_p_.qp.ipComTol,"IP complementarity tolerance."); addOption("qp_ipFracBound",OT_REAL,worhp_p_.qp.ipFracBound,"IP fraction-to-the-boundary parameter."); addOption("qp_ipLsMethod",OT_STRING,GenericType(),"Select the direct linear solver used by the IP method.","LAPACK::0|MA57: only available if provided by the user:1|SuperLU::2|PARDISO: only available if provided by the user, subject to license availability:3|MUMPS: currently Linux platforms only:5|WSMP: subject to license availability:6|MA86: experimental, only available if provided by the user:7|MA97:experimental, only available if provided by the user:8"); setOptionByEnumValue("qp_ipLsMethod",worhp_p_.qp.ipLsMethod); addOption("qp_ipMinAlpha",OT_REAL,worhp_p_.qp.ipMinAlpha,"IP line search minimum step size."); addOption("qp_ipTryRelax",OT_BOOLEAN,worhp_p_.qp.ipTryRelax,"Enable relaxation strategy when encountering an error."); addOption("qp_ipRelaxDiv",OT_REAL,worhp_p_.qp.ipRelaxDiv,"The relaxation term is divided by this value if successful."); addOption("qp_ipRelaxMult",OT_REAL,worhp_p_.qp.ipRelaxMult,"The relaxation term is multiplied by this value if unsuccessful."); addOption("qp_ipRelaxMax",OT_REAL,worhp_p_.qp.ipRelaxMax,"Maximum relaxation value."); addOption("qp_ipRelaxMin",OT_REAL,worhp_p_.qp.ipRelaxMin,"Mimimum relaxation value."); addOption("qp_ipResTol",OT_REAL,worhp_p_.qp.ipResTol,"IP residuals tolerance."); addOption("qp_lsItMaxIter",OT_INTEGER,worhp_p_.qp.lsItMaxIter,"Maximum number of iterations of the iterative linear solvers."); addOption("qp_lsItMethod",OT_STRING,GenericType(),"Select the iterative linear solver.","none:Deactivate; use a direct linear solver.:0|CGNR::1|CGNE::2|CGS::3|BiCGSTAB::4"); setOptionByEnumValue("qp_lsItMethod",worhp_p_.qp.lsItMethod); addOption("qp_lsItPrecondMethod",OT_STRING,GenericType(),"Select preconditioner for the iterative linear solver.","none:No preconditioner.:0|static:Static preconditioner (KKT-matrix with constant lower-right block).:1|full:Full KKT-matrix.:2"); setOptionByEnumValue("qp_lsItPrecondMethod",worhp_p_.qp.lsItPrecondMethod); addOption("qp_lsRefineMaxIter",OT_INTEGER,worhp_p_.qp.lsRefineMaxIter,"Maximum number of iterative refinement steps of the direct linear solvers."); addOption("qp_lsScale",OT_BOOLEAN,worhp_p_.qp.lsScale,"Enables scaling on linear solver level."); addOption("qp_lsTrySimple",OT_BOOLEAN,worhp_p_.qp.lsTrySimple,"Some matrices can be solved without calling a linear equation solver.Currently only diagonal matrices are supported. Non-diagonal matrices will besolved with the chosen linear equation solver."); addOption("qp_lsTol",OT_REAL,worhp_p_.qp.lsTol,"Tolerance for the linear solver."); addOption("qp_maxIter",OT_INTEGER,worhp_p_.qp.maxIter,"Imposes an upper limit on the number of minor solver iterations, i.e. for thequadratic subproblem solver. If the limit is reached before convergence,WORHP will activate QP recovery strategies to prevent a solver breakdown."); addOption("qp_method",OT_STRING,GenericType(),"Select the solution method used by the QP solver.","ip:Interior-Point method.:1|nsn:Nonsmooth-Newton method.:2|automatic: Prefer IP and fall back to NSN on error.:12"); setOptionByEnumValue("qp_method",worhp_p_.qp.method); addOption("qp_nsnBeta",OT_REAL,worhp_p_.qp.nsnBeta,"NSN stepsize decrease factor."); addOption("qp_nsnGradStep",OT_BOOLEAN,worhp_p_.qp.nsnGradStep,"Enable gradient steps in the NSN method."); addOption("qp_nsnKKT",OT_REAL,worhp_p_.qp.nsnKKT,"NSN KKT tolerance."); addOption("qp_nsnLsMethod",OT_STRING,GenericType(),"Select the direct linear solver used by the NSN method.","SuperLU::2|MA48: only available if provided by the user:4"); setOptionByEnumValue("qp_nsnLsMethod",worhp_p_.qp.nsnLsMethod); addOption("qp_nsnMinAlpha",OT_REAL,worhp_p_.qp.nsnMinAlpha,"NSN line search minimum step size."); addOption("qp_nsnSigma",OT_REAL,worhp_p_.qp.nsnSigma,"NSN line search slope parameter."); addOption("qp_printLevel",OT_STRING,GenericType(),"Controls the amount of QP solver output.","none:No output.:0|warn:Print warnings and errors.:1|iterations:Print iterations.:2"); setOptionByEnumValue("qp_printLevel",worhp_p_.qp.printLevel); addOption("qp_scaleIntern",OT_BOOLEAN,worhp_p_.qp.scaleIntern,"Enable scaling on QP level."); addOption("qp_strict",OT_BOOLEAN,worhp_p_.qp.strict,"Use strict termination criteria in IP method."); worhp_o_.initialised = false; worhp_w_.initialised = false; worhp_p_.initialised = false; worhp_c_.initialised = false; // WORKAROUND: Bug in scaling, set to false by default // FIXME setOption("ScaledObj",false); // WORKAROUND: Why is this needed? // FIXME setOption("ScaleConIter",true); }