int BonminInterface::solve(void* mem) const { auto m = static_cast<BonminMemory*>(mem); // Reset statistics m->inf_pr.clear(); m->inf_du.clear(); m->mu.clear(); m->d_norm.clear(); m->regularization_size.clear(); m->alpha_pr.clear(); m->alpha_du.clear(); m->obj.clear(); m->ls_trials.clear(); // Reset number of iterations m->n_iter = 0; // MINLP instance SmartPtr<BonminUserClass> tminlp = new BonminUserClass(*this, m); BonMinMessageHandler mh; // Start an BONMIN application BonminSetup bonmin(&mh); SmartPtr<OptionsList> options = new OptionsList(); SmartPtr<Journalist> journalist= new Journalist(); SmartPtr<Bonmin::RegisteredOptions> roptions = new Bonmin::RegisteredOptions(); { // Direct output through casadi::uout() StreamJournal* jrnl_raw = new StreamJournal("console", J_ITERSUMMARY); jrnl_raw->SetOutputStream(&casadi::uout()); jrnl_raw->SetPrintLevel(J_DBG, J_NONE); SmartPtr<Journal> jrnl = jrnl_raw; journalist->AddJournal(jrnl); } options->SetJournalist(journalist); options->SetRegisteredOptions(roptions); bonmin.setOptionsAndJournalist(roptions, options, journalist); bonmin.registerOptions(); // Get all options available in BONMIN auto regops = bonmin.roptions()->RegisteredOptionsList(); // Pass all the options to BONMIN for (auto&& op : opts_) { // Find the option auto regops_it = regops.find(op.first); if (regops_it==regops.end()) { casadi_error("No such BONMIN option: " + op.first); } // Get the type Ipopt::RegisteredOptionType ipopt_type = regops_it->second->Type(); // Pass to BONMIN bool ret; switch (ipopt_type) { case Ipopt::OT_Number: ret = bonmin.options()->SetNumericValue(op.first, op.second.to_double(), false); break; case Ipopt::OT_Integer: ret = bonmin.options()->SetIntegerValue(op.first, op.second.to_int(), false); break; case Ipopt::OT_String: ret = bonmin.options()->SetStringValue(op.first, op.second.to_string(), false); break; case Ipopt::OT_Unknown: default: casadi_warning("Cannot handle option \"" + op.first + "\", ignored"); continue; } if (!ret) casadi_error("Invalid options were detected by BONMIN."); } // Initialize bonmin.initialize(GetRawPtr(tminlp)); if (true) { // Branch-and-bound try { Bab bb; bb(bonmin); } catch (CoinError& e) { casadi_error("CoinError occured: " + to_str(e)); } } // Save results to outputs casadi_copy(m->gk, ng_, m->g); return 0; }
void BonminInterface::solve(void* mem) const { auto m = static_cast<BonminMemory*>(mem); // Check the provided inputs checkInputs(mem); // Reset statistics m->inf_pr.clear(); m->inf_du.clear(); m->mu.clear(); m->d_norm.clear(); m->regularization_size.clear(); m->alpha_pr.clear(); m->alpha_du.clear(); m->obj.clear(); m->ls_trials.clear(); // Reset number of iterations m->n_iter = 0; // Statistics for (auto&& s : m->fstats) s.second.reset(); // MINLP instance SmartPtr<BonminUserClass> tminlp = new BonminUserClass(*this, m); BonMinMessageHandler mh; // Start an BONMIN application BonminSetup bonmin(&mh); SmartPtr<OptionsList> options = new OptionsList(); SmartPtr<Journalist> journalist= new Journalist(); SmartPtr<Bonmin::RegisteredOptions> roptions = new Bonmin::RegisteredOptions(); { // Direct output through casadi::userOut() StreamJournal* jrnl_raw = new StreamJournal("console", J_ITERSUMMARY); jrnl_raw->SetOutputStream(&casadi::userOut()); jrnl_raw->SetPrintLevel(J_DBG, J_NONE); SmartPtr<Journal> jrnl = jrnl_raw; journalist->AddJournal(jrnl); } options->SetJournalist(journalist); options->SetRegisteredOptions(roptions); bonmin.setOptionsAndJournalist(roptions, options, journalist); bonmin.registerOptions(); // Initialize bonmin.initialize(GetRawPtr(tminlp)); m->fstats.at("mainloop").tic(); if (true) { // Branch-and-bound Bab bb; bb(bonmin); } //m->return_status = return_status_string(status); m->fstats.at("mainloop").toc(); // Save results to outputs casadi_copy(&m->fk, 1, m->f); casadi_copy(m->xk, nx_, m->x); casadi_copy(m->lam_gk, ng_, m->lam_g); casadi_copy(m->lam_xk, nx_, m->lam_x); casadi_copy(m->gk, ng_, m->g); }