Go to the documentation of this file.
12 #ifndef CglMixedIntegerRounding_H
13 #define CglMixedIntegerRounding_H
19 #include "CoinError.hpp"
89 const std::string mpdDir);
129 virtual void generateCuts(
const OsiSolverInterface & si, OsiCuts & cs,
143 const int preproc = -1);
175 throw CoinError(
"Unallowable value. maxaggr must be > 0",
176 "gutsOfConstruct",
"CglMixedIntegerRounding");
191 if ((criterion >= 1) && (criterion <= 3)) {
195 throw CoinError(
"Unallowable value. criterion must be 1, 2 or 3",
196 "gutsOfConstruct",
"CglMixedIntegerRounding");
235 const int rowLen,
const int* ind,
236 const double* coef,
const char sense,
237 const double rhs)
const;
242 const double* colUpperBound,
243 const double* colLowerBound,
244 const CoinPackedMatrix& matrixByRow,
246 const double* coefByRow,
248 const CoinBigIndex* rowStarts,
249 const int* rowLengths,
251 const double* coefByCol,
253 const CoinBigIndex* colStarts,
254 const int* colLengths,
259 const int rowSelected,
260 std::set<int>& setRowsAggregated,
261 int* listRowsAggregated,
266 const CoinPackedMatrix& matrixByRow,
267 CoinPackedVector& rowToAggregate,
268 double& rhsToAggregate)
const;
272 const CoinPackedVector& rowAggregated,
273 const double* colUpperBound,
274 const double* colLowerBound,
275 const std::set<int>& setRowsAggregated,
276 const double* xlp,
const double* coefByCol,
277 const int* rowInds,
const CoinBigIndex* colStarts,
278 const int* colLengths,
280 int& colSelected )
const;
285 CoinPackedVector& rowToAggregate,
double rhs,
286 CoinPackedVector& rowAggregated,
287 double& rhsAggregated )
const;
294 const double UB)
const;
298 const CoinPackedVector& rowAggregated,
300 const double* xlpExtra,
301 const double* colUpperBound,
302 const double* colLowerBound,
303 CoinPackedVector& mixedKnapsack,
304 double& rhsMixedKnapsack,
double& sStar,
305 CoinPackedVector& contVariablesInS )
const;
309 const CoinPackedMatrix& matrixByRow,
310 const CoinPackedVector& rowAggregated,
311 const int* listRowsAggregated,
312 const char* sense,
const double* RHS,
316 const double* xlp,
const double sStar,
317 const double* colUpperBound,
318 const double* colLowerBound,
319 const CoinPackedVector& mixedKnapsack,
320 const double& rhsMixedKnapsack,
321 const CoinPackedVector& contVariablesInS,
322 OsiRowCut& flowCut )
const;
327 const double numeratorBeta,
328 const int *knapsackIndices,
329 const double* knapsackElements,
332 const double* colUpperBound,
333 const std::set<int>& setC,
334 CoinPackedVector& cMIR,
337 double& violation)
const;
340 inline double functionG(
const double d,
const double f )
const;
344 std::ofstream & fout,
346 const OsiSolverInterface& si,
347 const CoinPackedVector& rowAggregated,
348 const double& rhsAggregated,
const double* xlp,
349 const double* xlpExtra,
350 const int* listRowsAggregated,
351 const int* listColsSelected,
353 const double* colUpperBound,
354 const double* colLowerBound )
const;
427 const std::string mpdDir);
Mixed Integer Rounding Cut Generator Class.
@ ROW_VAREQ
The row sense is 'E', the row has exactly two variables: one is binary and the other is a continous,...
void mixIntRoundPreprocess(const OsiSolverInterface &si)
int getMAXAGGR_() const
Get MAXAGGR_.
virtual ~CglMixedIntegerRounding()
Destructor.
Information about where the cut generator is invoked from.
CglMixIntRoundVUB CglMixIntRoundVLB
void setDoPreproc(int value)
Set doPreproc.
int UNDEFINED_
There is no variable upper bound or variable lower bound defined.
void copyRowSelected(const int iAggregate, const int rowSelected, std::set< int > &setRowsAggregated, int *listRowsAggregated, double *xlpExtra, const char sen, const double rhs, const double lhs, const CoinPackedMatrix &matrixByRow, CoinPackedVector &rowToAggregate, double &rhsToAggregate) const
bool cMirSeparation(const OsiSolverInterface &si, const CoinPackedMatrix &matrixByRow, const CoinPackedVector &rowAggregated, const int *listRowsAggregated, const char *sense, const double *RHS, const double *xlp, const double sStar, const double *colUpperBound, const double *colLowerBound, const CoinPackedVector &mixedKnapsack, const double &rhsMixedKnapsack, const CoinPackedVector &contVariablesInS, OsiRowCut &flowCut) const
int getCRITERION_() const
Get CRITERION_.
void setCRITERION_(int criterion)
Set CRITERION_.
virtual void refreshSolver(OsiSolverInterface *solver)
This can be used to refresh any inforamtion.
CglMixIntRoundVUB * vubs_
@ ROW_VARUB
After the row is flipped to 'L', the row has exactly two variables: one is negative binary and the ot...
CglMixedIntegerRounding & operator=(const CglMixedIntegerRounding &rhs)
Assignment operator.
void aggregateRow(const int colSelected, CoinPackedVector &rowToAggregate, double rhs, CoinPackedVector &rowAggregated, double &rhsAggregated) const
bool getMULTIPLY_() const
Get MULTIPLY_.
void setVal(const double v)
void gutsOfCopy(const CglMixedIntegerRounding &rhs)
void setMAXAGGR_(int maxaggr)
Set MAXAGGR_.
RowType determineRowType(const OsiSolverInterface &si, const int rowLen, const int *ind, const double *coef, const char sense, const double rhs) const
void generateMirCuts(const OsiSolverInterface &si, const double *xlp, const double *colUpperBound, const double *colLowerBound, const CoinPackedMatrix &matrixByRow, const double *LHS, const double *coefByRow, const int *colInds, const CoinBigIndex *rowStarts, const int *rowLengths, const double *coefByCol, const int *rowInds, const CoinBigIndex *colStarts, const int *colLengths, OsiCuts &cs) const
void cMirInequality(const int numInt, const double delta, const double numeratorBeta, const int *knapsackIndices, const double *knapsackElements, const double *xlp, const double sStar, const double *colUpperBound, const std::set< int > &setC, CoinPackedVector &cMIR, double &rhscMIR, double &sCoef, double &violation) const
CglMixIntRoundVUB & operator=(const CglMixIntRoundVUB &rhs)
Cut Generator Base Class.
double functionG(const double d, const double f) const
friend void CglMixedIntegerRoundingUnitTest(const OsiSolverInterface *siP, const std::string mpdDir)
bool boundSubstitution(const OsiSolverInterface &si, const CoinPackedVector &rowAggregated, const double *xlp, const double *xlpExtra, const double *colUpperBound, const double *colLowerBound, CoinPackedVector &mixedKnapsack, double &rhsMixedKnapsack, double &sStar, CoinPackedVector &contVariablesInS) const
bool getDoPreproc() const
Get doPreproc.
void CglMixedIntegerRoundingUnitTest(const OsiSolverInterface *siP, const std::string mpdDir)
void printStats(std::ofstream &fout, const bool hasCut, const OsiSolverInterface &si, const CoinPackedVector &rowAggregated, const double &rhsAggregated, const double *xlp, const double *xlpExtra, const int *listRowsAggregated, const int *listColsSelected, const int level, const double *colUpperBound, const double *colLowerBound) const
virtual std::string generateCpp(FILE *fp)
Create C++ lines to get to current state.
virtual CglCutGenerator * clone() const
Clone.
CglMixIntRoundVUB(const CglMixIntRoundVUB &source)
@ ROW_VARLB
After the row is flipped to 'L', the row has exactly two variables: one is positive binary and the ot...
int doPreproc_
Controls the preprocessing of the matrix to identify rows suitable for cut generation.
bool selectRowToAggregate(const OsiSolverInterface &si, const CoinPackedVector &rowAggregated, const double *colUpperBound, const double *colLowerBound, const std::set< int > &setRowsAggregated, const double *xlp, const double *coefByCol, const int *rowInds, const CoinBigIndex *colStarts, const int *colLengths, int &rowSelected, int &colSelected) const
bool isLowerSubst(const double inf, const double aj, const double xlp, const double LB, const double UB) const
CglMixedIntegerRounding()
Default constructor.
CglMixIntRoundVLB * vlbs_
virtual void generateCuts(const OsiSolverInterface &si, OsiCuts &cs, const CglTreeInfo info=CglTreeInfo())
Generate Mixed Integer Rounding cuts for the model data contained in si.
void gutsOfConstruct(const int maxaggr, const bool multiply, const int criterion, const int preproc)
void setMULTIPLY_(bool multiply)
Set MULTIPLY_.