12#ifndef CglMixedIntegerRounding_H
13#define CglMixedIntegerRounding_H
19#include "CoinError.hpp"
89 const std::string mpdDir);
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);
void CglMixedIntegerRoundingUnitTest(const OsiSolverInterface *siP, const std::string mpdDir)
CglMixIntRoundVUB CglMixIntRoundVLB
CglCutGenerator()
Default constructor.
void setVal(const double v)
CglMixIntRoundVUB & operator=(const CglMixIntRoundVUB &rhs)
CglMixIntRoundVUB(const CglMixIntRoundVUB &source)
bool getDoPreproc() const
Get doPreproc.
CglMixedIntegerRounding()
Default constructor.
CglMixedIntegerRounding & operator=(const CglMixedIntegerRounding &rhs)
Assignment operator.
friend void CglMixedIntegerRoundingUnitTest(const OsiSolverInterface *siP, const std::string mpdDir)
bool isLowerSubst(const double inf, const double aj, const double xlp, const double LB, const double UB) const
void gutsOfConstruct(const int maxaggr, const bool multiply, const int criterion, const int preproc)
int UNDEFINED_
There is no variable upper bound or variable lower bound defined.
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 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
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
CglMixedIntegerRounding(const int maxaggr, const bool multiply, const int criterion, const int preproc=-1)
Alternate Constructor.
int doPreproc_
Controls the preprocessing of the matrix to identify rows suitable for cut generation.
void setMULTIPLY_(bool multiply)
Set MULTIPLY_.
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
void setMAXAGGR_(int maxaggr)
Set MAXAGGR_.
void setDoPreproc(int value)
Set doPreproc.
@ ROW_VARUB
After the row is flipped to 'L', the row has exactly two variables: one is negative binary and the ot...
@ ROW_VAREQ
The row sense is 'E', the row has exactly two variables: one is binary and the other is a continous,...
@ ROW_VARLB
After the row is flipped to 'L', the row has exactly two variables: one is positive binary and the ot...
virtual std::string generateCpp(FILE *fp)
Create C++ lines to get to current state.
virtual CglCutGenerator * clone() const
Clone.
bool getMULTIPLY_() const
Get MULTIPLY_.
virtual void refreshSolver(OsiSolverInterface *solver)
This can be used to refresh any inforamtion.
int getMAXAGGR_() const
Get MAXAGGR_.
void gutsOfCopy(const CglMixedIntegerRounding &rhs)
int getCRITERION_() const
Get CRITERION_.
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
double functionG(const double d, const double f) const
void mixIntRoundPreprocess(const OsiSolverInterface &si)
void aggregateRow(const int colSelected, CoinPackedVector &rowToAggregate, double rhs, CoinPackedVector &rowAggregated, double &rhsAggregated) const
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
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
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 setCRITERION_(int criterion)
Set CRITERION_.
CglMixIntRoundVLB * vlbs_
virtual ~CglMixedIntegerRounding()
Destructor.
CglMixIntRoundVUB * vubs_
CglMixedIntegerRounding(const CglMixedIntegerRounding &)
Copy constructor.
RowType determineRowType(const OsiSolverInterface &si, const int rowLen, const int *ind, const double *coef, const char sense, const double rhs) const
Information about where the cut generator is invoked from.