15 #include "OsiSolverInterface.hpp"
16 #include "OsiBranchingObject.hpp"
17 #include "OsiCuts.hpp"
18 #include "CoinWarmStartBasis.hpp"
22 double integer_tolerance,
23 OsiObject ** objects,
int nObjects)
27 for (
int i = 0 ; i < nObjects ; i++) {
28 double infeasibility = objects[i]->infeasibility(&info, dummy);
29 if (infeasibility > 1000*integer_tolerance)
return false;
33 const double * sol = info.solution_;
34 int numcols = si.getNumCols();
35 for (
int i = 0 ; i < numcols ; i++) {
36 if (si.isInteger(i)) {
37 if (fabs(sol[i] - floor(sol[i] + 0.5)) >
50 const OsiBranchingInformation &
info,
51 double integer_tolerance,
52 OsiObject ** objects,
int nObjects)
55 for (
int i = 0 ; i < nObjects ; i++) {
56 objects[i]->feasibleRegion(&si, &info);
60 const double * colsol = info.solution_;
61 for (
int i = 0; i < info.numberColumns_; i++) {
62 if (si.isInteger(i)) {
63 double value = colsol[i];
65 if (fabs(value - floor(value+0.5)) > integer_tolerance) {
66 std::stringstream stream;
67 stream<<
"Error not integer valued solution"<<std::endl;
68 stream<<
"---------------- x["<<i<<
"] = "<<value<<std::endl;
69 throw CoinError(stream.str(),
"fixIntegers",
"OaDecompositionBase::solverManip");
72 value = floor(value+0.5);
73 if (fabs(value) > 1e10) {
74 std::stringstream stream;
75 stream<<
"Can not fix variable in nlp because it has too big a value ("<<value
76 <<
") at optimium of LP relaxation. You should try running the problem with B-BB"<<std::endl;
77 throw CoinError(stream.str(),
78 "fixIntegers",
"OaDecompositionBase::solverManip") ;
83 std::cout<<(
int)value;
85 si.setColLower(i,value);
86 si.setColUpper(i,value);
98 const OsiBranchingInformation &
info,
99 double integer_tolerance,
100 OsiObject ** objects,
int nObjects)
103 for (
int i = 0 ; i < nObjects ; i++) {
104 OsiSimpleInteger * obj =
dynamic_cast<OsiSimpleInteger *
>(objects[i]);
105 int colNumber = obj->columnNumber();
106 si.setColLower(colNumber, si.getColLower()[colNumber] - integer_tolerance);
107 si.setColUpper(colNumber, si.getColUpper()[colNumber] + integer_tolerance);
111 for (
int i = 0; i < info.numberColumns_; i++) {
112 if (si.isInteger(i)) {
113 const int &colNumber = i;
114 si.setColLower(colNumber, si.getColLower()[colNumber] - integer_tolerance);
115 si.setColUpper(colNumber, si.getColUpper()[colNumber] + integer_tolerance);
122 const OsiBranchingInformation &
info,
123 double integer_tolerance,
124 OsiObject ** objects,
int nObjects)
126 if(!si.isProvenOptimal())
return false;
128 for (
int i = 0 ; i < nObjects ; i++) {
129 OsiSimpleInteger * obj =
dynamic_cast<OsiSimpleInteger *
>(objects[i]);
130 int colNumber = obj->columnNumber();
131 si.setColLower(colNumber, si.getColLower()[colNumber] - integer_tolerance);
132 si.setColUpper(colNumber, si.getColUpper()[colNumber] + integer_tolerance);
136 for (
int i = 0; i < info.numberColumns_; i++) {
137 if (si.isInteger(i)) {
138 const int &colNumber = i;
139 si.setColLower(colNumber, si.getColLower()[colNumber] - integer_tolerance);
140 si.setColUpper(colNumber, si.getColUpper()[colNumber] + integer_tolerance);
149 const OsiCuts& cs,
int numberCuts){
150 int numberCutsBefore = cs.sizeRowCuts() - numberCuts;
152 CoinWarmStartBasis * basis
153 =
dynamic_cast<CoinWarmStartBasis*
>(si.getWarmStart()) ;
154 assert(basis != NULL);
155 int numrows = si.getNumRows();
156 basis->resize(numrows + numberCuts,si.getNumCols());
157 for (
int i = 0 ; i < numberCuts ; i++) {
158 basis->setArtifStatus(numrows + i,
159 CoinWarmStartBasis::basic) ;
162 const OsiRowCut ** addCuts =
new const OsiRowCut * [numberCuts] ;
163 for (
int i = 0 ; i < numberCuts ; i++) {
164 addCuts[i] = &cs.rowCut(i + numberCutsBefore) ;
166 si.applyRowCuts(numberCuts,addCuts) ;
168 if (si.setWarmStart(basis) ==
false) {
170 throw CoinError(
"Fail setWarmStart() after cut installation.",
171 "generateCuts",
"OACutGenerator2") ;
179 OsiObject ** objects,
int nObjects,
180 double integer_tolerance,
181 const double * colsol,
const double *otherSol)
184 for (
int i = 0 ; i < nObjects ; i++) {
185 OsiObject * obj = objects[i];
186 int colnum = obj->columnNumber();
188 if (fabs(otherSol[colnum] - colsol[colnum]) > integer_tolerance) {
193 OsiSOS * sos =
dynamic_cast<OsiSOS *
>(obj);
195 const int * members = sos->members();
196 int end = sos->numberMembers();
197 for (
int k = 0 ;
k <
end ;
k++) {
198 if (fabs(otherSol[members[
k]] - colsol[members[
k]]) > integer_tolerance) {
206 int numcols = si.getNumCols();
207 for (
int i = 0; i < numcols ; i++) {
208 if (si.isInteger(i) && fabs(otherSol[i] - colsol[i])>integer_tolerance)
void fint fint fint real fint real real real real real real real real real fint real fint fint fint real fint fint fint fint * info
void installCuts(OsiSolverInterface &si, const OsiCuts &cs, int numberCuts)
Install cuts in solver.
bool isDifferentOnIntegers(OsiSolverInterface &si, OsiObject **objects, int nObjects, double integer_tolerance, const double *colsol, const double *otherSol)
Check if two solutions are the same on integer variables.
bool refixIntegers(OsiSolverInterface &si, const OsiBranchingInformation &info, double integer_tolerance, OsiObject **objects, int nObjects)
void fixIntegers(OsiSolverInterface &si, const OsiBranchingInformation &info, double integer_tolerance, OsiObject **objects, int nObjects)
Fix integer variables in si to their values in colsol.
void relaxIntegers(OsiSolverInterface &si, const OsiBranchingInformation &info, double integer_tolerance, OsiObject **objects, int nObjects)
Slightly relax integer variables in si.
bool integerFeasible(OsiSolverInterface &si, const OsiBranchingInformation &info, double integer_tolerance, OsiObject **objects, int nObjects)
Check for integer feasibility of a solution return 1 if it is.