| 519 | Int LPWrapper::solve(SolverParam& /*solver_param*/, const Size verbose_level) |
| 520 | #else |
| 521 | Int LPWrapper::solve(SolverParam& solver_param, const Size /*verbose_level*/) |
| 522 | #endif |
| 523 | { |
| 524 | OPENMS_LOG_INFO << "Using solver '" << (solver_ == LPWrapper::SOLVER_GLPK ? "glpk" : "coinor") << "' ...\n"; |
| 525 | #if COINOR_SOLVER == 1 |
| 526 | //Removed ifdef and OsiOslSolverInterface because Windows couldn't find it/both flags failed. For linux on the other hand the flags worked. But as far as I know we prefer CLP as solver anyway so no need to look for different solvers. |
| 527 | //#ifdef COIN_HAS_CLP |
| 528 | OsiClpSolverInterface solver; |
| 529 | //#elif COIN_HAS_OSL |
| 530 | // OsiOslSolverInterface solver; |
| 531 | //#endif |
| 532 | solver.loadFromCoinModel(*model_); |
| 533 | /* Now let MIP calculate a solution */ |
| 534 | // Pass to solver |
| 535 | CbcModel model(solver); |
| 536 | model.setObjSense(model_->optimizationDirection()); // -1 = maximize, 1=minimize |
| 537 | model.solver()->setHintParam(OsiDoReducePrint, true, OsiHintTry); |
| 538 | |
| 539 | // Output details |
| 540 | model.messageHandler()->setLogLevel(verbose_level > 1 ? 2 : 0); |
| 541 | model.solver()->messageHandler()->setLogLevel(verbose_level > 1 ? 1 : 0); |
| 542 | |
| 543 | //CglProbing generator1; |
| 544 | //generator1.setUsingObjective(true); |
| 545 | CglGomory generator2; |
| 546 | generator2.setLimit(300); |
| 547 | CglKnapsackCover generator3; |
| 548 | CglOddHole generator4; |
| 549 | generator4.setMinimumViolation(0.005); |
| 550 | generator4.setMinimumViolationPer(0.00002); |
| 551 | generator4.setMaximumEntries(200); |
| 552 | CglClique generator5; |
| 553 | generator5.setStarCliqueReport(false); |
| 554 | generator5.setRowCliqueReport(false); |
| 555 | //CglFlowCover flowGen; |
| 556 | CglMixedIntegerRounding mixedGen; |
| 557 | |
| 558 | // Add in generators (you should prefer the ones used often and disable the others as they increase solution time) |
| 559 | //model.addCutGenerator(&generator1,-1,"Probing"); |
| 560 | model.addCutGenerator(&generator2, -1, "Gomory"); |
| 561 | model.addCutGenerator(&generator3, -1, "Knapsack"); |
| 562 | //model.addCutGenerator(&generator4,-1,"OddHole"); // segfaults |
| 563 | model.addCutGenerator(&generator5, -10, "Clique"); |
| 564 | //model.addCutGenerator(&flowGen,-1,"FlowCover"); |
| 565 | model.addCutGenerator(&mixedGen, -1, "MixedIntegerRounding"); |
| 566 | |
| 567 | // Heuristics |
| 568 | CbcRounding heuristic1(model); |
| 569 | model.addHeuristic(&heuristic1); |
| 570 | CbcHeuristicLocal heuristic2(model); |
| 571 | model.addHeuristic(&heuristic2); |
| 572 | |
| 573 | // set maximum allowed CPU time before forced stop (dangerous!) |
| 574 | //model.setDblParam(CbcModel::CbcMaximumSeconds,60.0*1); |
| 575 | |
| 576 | // Do initial solve to continuous |
| 577 | model.initialSolve(); |
| 578 |
nothing calls this directly
no test coverage detected