#include #include #include #include #include #include int main(void) { OsiCpxSolverInterface solver; // OsiSpxSolverInterface solver; solver.readMps("mas74","mps"); solver.messageHandler()->setLogLevel(100); solver.initialSolve(); std::cout << "LP objective value prior to cuts=" << solver.getObjValue() << std::endl; // unnecessary - for my entertainment. const double * solution = solver.getColSolution(); int num_vars = solver.getNumCols(); std::cout << "Fractional variables:" << std::endl; for (int i = 0; i < num_vars; ++i) { if ((fabs(solution[i] - rint(solution[i])) > 0.00001) && (solver.isBinary(i) || solver.isInteger(i))) { std::cout << "Fraction variable idx=" << i << " val=" << solution[i] << std::endl; } } std::cout << std::endl; CglTwomir cutgen; OsiCuts cuts; cutgen.generateCuts(solver, cuts); std::cout << "Number of two-mir cuts generated=" << cuts.sizeCuts() << std::endl; std::cout << std::endl; std::cout << "Applying cuts and re-solving" << std::endl; OsiSolverInterface::ApplyCutsReturnCode rc; rc = solver.applyCuts(cuts); std::cout << "Number of inconsistent cuts=" << rc.getNumInconsistent() << std::endl; std::cout << "Number of infeasible cuts=" << rc.getNumInfeasible() << std::endl; std::cout << "Number of ineffective cuts=" << rc.getNumIneffective() << std::endl; std::cout << "Number of applied cuts=" << rc.getNumApplied() << std::endl; std::cout << std::endl; solver.resolve(); std::cout << "LP objective value after cuts are applied=" << solver.getObjValue() << std::endl; return 0; }