6 #ifndef CoinPresolveMatrix_H 7 #define CoinPresolveMatrix_H 21 #if PRESOLVE_DEBUG > 0 36 #define deleteAction(array, type) delete[]((type)array) 38 #define deleteAction(array, type) delete[] array 45 #if PRESOLVE_DEBUG > 0 || PRESOLVE_CONSISTENCY > 0 47 #define PRESOLVE_STMT(s) s 49 #define PRESOLVEASSERT(x) \ 50 ((x) ? 1 : ((std::cerr << "FAILED ASSERTION at line " << __LINE__ << ": " #x "\n"), abort(), 0)) 52 inline void DIE(
const char *s)
68 #define PRESENT_IN_REDUCED '\377' 72 #define PRESOLVEASSERT(x) \ 75 #define PRESOLVE_STMT(s) \ 79 inline void DIE(
const char *) {}
86 #ifndef PRESOLVE_DETAIL 87 #define PRESOLVE_DETAIL_PRINT(s) \ 91 #define PRESOLVE_DETAIL_PRINT(s) s 106 #define PRESOLVE_INF COIN_DBL_MAX 107 #define PRESOLVE_SMALL_INF 1.0e20 109 #define PRESOLVEFINITE(n) (-PRESOLVE_INF < (n) && (n) < PRESOLVE_INF) 173 throw CoinError(error, ps_routine,
"CoinPresolve");
201 virtual const char *
name()
const = 0;
349 unsigned char &st_byte = rowstat_[sequence];
350 st_byte =
static_cast< unsigned char >(st_byte & (~7));
351 st_byte =
static_cast< unsigned char >(st_byte | status);
356 return static_cast< Status >(rowstat_[sequence] & 7);
361 return (static_cast< Status >(rowstat_[sequence] & 7) == basic);
366 unsigned char &st_byte = colstat_[sequence];
367 st_byte =
static_cast< unsigned char >(st_byte & (~7));
368 st_byte =
static_cast< unsigned char >(st_byte | status);
370 #ifdef PRESOLVE_DEBUG 374 std::cout <<
"Bad status: Var " << sequence
375 <<
" isFree, lb = " << clo_[sequence]
376 <<
", ub = " << cup_[sequence] << std::endl;
385 std::cout <<
"Bad status: Var " << sequence
386 <<
" atUpperBound, lb = " << clo_[sequence]
387 <<
", ub = " << cup_[sequence] << std::endl;
393 std::cout <<
"Bad status: Var " << sequence
394 <<
" atLowerBound, lb = " << clo_[sequence]
395 <<
", ub = " << cup_[sequence] << std::endl;
401 std::cout <<
"Bad status: Var " << sequence
402 <<
" superBasic, lb = " << clo_[sequence]
403 <<
", ub = " << cup_[sequence] << std::endl;
417 return static_cast< Status >(colstat_[sequence] & 7);
422 return (static_cast< Status >(colstat_[sequence] & 7) == basic);
427 void setRowStatusUsingValue(
int iRow);
431 void setColumnStatusUsingValue(
int iColumn);
433 void setStructuralStatus(
const char *strucStatus,
int lenParam);
435 void setArtificialStatus(
const char *artifStatus,
int lenParam);
443 const char *columnStatusString(
int j)
const;
447 const char *rowStatusString(
int i)
const;
457 void setObjOffset(
double offset);
465 void setObjSense(
double objSense);
467 void setPrimalTolerance(
double primTol);
469 void setDualTolerance(
double dualTol);
471 void setColLower(
const double *colLower,
int lenParam);
473 void setColUpper(
const double *colUpper,
int lenParam);
475 void setColSolution(
const double *colSol,
int lenParam);
477 void setCost(
const double *cost,
int lenParam);
479 void setReducedCost(
const double *redCost,
int lenParam);
481 void setRowLower(
const double *rowLower,
int lenParam);
483 void setRowUpper(
const double *rowUpper,
int lenParam);
485 void setRowPrice(
const double *rowSol,
int lenParam);
487 void setRowActivity(
const double *rowAct,
int lenParam);
492 inline int getNumCols()
const 576 for (
int i = 0; i < ncols_; i++)
597 if (defaultHandler_ ==
true) {
599 defaultHandler_ =
false;
814 #define NO_LINK -66666666 823 int ipre = link[i].
pre;
824 int isuc = link[i].
suc;
826 link[ipre].
suc = isuc;
829 link[isuc].
pre = ipre;
841 int isuc = link[j].
suc;
863 int ipre = link[i].
pre;
864 int isuc = link[i].
suc;
930 double nonLinearVariable,
934 void update_model(ClpSimplex *si,
950 double nonLinearVariable,
951 const char *prohibited,
952 const char *rowProhibited = NULL);
984 for (
int i = 0; i < nrows_; i++)
997 if (integerType_ == 0)
998 integerType_ =
new unsigned char[ncols0_];
999 integerType_[i] =
static_cast< unsigned char >(variableType);
1007 void setVariableType(
const unsigned char *variableType,
int lenParam);
1014 void setVariableType(
bool allIntegers,
int lenParam);
1019 anyInteger_ = anyInteger;
1050 if (integerType_ == 0) {
1051 return (anyInteger_);
1052 }
else if (integerType_[i] == 1) {
1065 return (anyInteger_);
1070 return presolveOptions_;
1075 presolveOptions_ = value;
1098 dobias_ += change_amount;
1099 #if PRESOLVE_DEBUG > 2 1100 assert(fabs(change_amount) < 1.0e50);
1103 change_amount, dobias_));
1145 return (feasibilityTolerance_);
1150 feasibilityTolerance_ = val;
1167 status_ = (status & 0x3);
1192 maxSubstLevel_ = level;
1314 int recomputeSums(
int whichRow);
1317 void initializeStuff();
1329 void initColsToDo();
1341 return (numberColsToDo_);
1347 return (colChanged_[i] & 1) != 0;
1352 colChanged_[i] =
static_cast< unsigned char >(colChanged_[i] & (~1));
1357 colChanged_[i] =
static_cast< unsigned char >(colChanged_[i] | (1));
1362 if ((colChanged_[i] & 1) == 0) {
1363 colChanged_[i] =
static_cast< unsigned char >(colChanged_[i] | (1));
1364 nextColsToDo_[numberNextColsToDo_++] = i;
1370 return (colChanged_[i] & 2) != 0;
1380 if (!anyProhibited_)
1383 return (colChanged_[i] & 2) != 0;
1388 colChanged_[i] =
static_cast< unsigned char >(colChanged_[i] | (2));
1397 return (colChanged_[i] & 4) != 0;
1402 colChanged_[i] =
static_cast< unsigned char >(colChanged_[i] | (4));
1407 colChanged_[i] =
static_cast< unsigned char >(colChanged_[i] & (~4));
1412 return (colChanged_[i] & 8) != 0;
1417 colChanged_[i] =
static_cast< unsigned char >(colChanged_[i] & (~8));
1422 colChanged_[i] =
static_cast< unsigned char >(colChanged_[i] | (8));
1430 void initRowsToDo();
1442 return (numberRowsToDo_);
1448 return (rowChanged_[i] & 1) != 0;
1453 rowChanged_[i] =
static_cast< unsigned char >(rowChanged_[i] & (~1));
1458 rowChanged_[i] =
static_cast< unsigned char >(rowChanged_[i] | (1));
1463 if ((rowChanged_[i] & 1) == 0) {
1464 rowChanged_[i] =
static_cast< unsigned char >(rowChanged_[i] | (1));
1465 nextRowsToDo_[numberNextRowsToDo_++] = i;
1471 return (rowChanged_[i] & 2) != 0;
1481 if (!anyProhibited_)
1484 return (rowChanged_[i] & 2) != 0;
1489 rowChanged_[i] =
static_cast< unsigned char >(rowChanged_[i] | (2));
1498 return (rowChanged_[i] & 4) != 0;
1503 rowChanged_[i] =
static_cast< unsigned char >(rowChanged_[i] | (4));
1508 rowChanged_[i] =
static_cast< unsigned char >(rowChanged_[i] & (~4));
1514 return anyProhibited_;
1519 anyProhibited_ = val;
1579 unsigned char *colstat,
1580 unsigned char *rowstat);
1598 unsigned char *colstat,
1599 unsigned char *rowstat);
1652 void check_nbasic();
1666 void presolve_make_memlists(
int *lengths,
1676 bool presolve_expand_major(
CoinBigIndex *majstrts,
double *majels,
1677 int *minndxs,
int *majlens,
1686 int *hrow,
int *hincol,
1689 return presolve_expand_major(mcstrt, colels,
1690 hrow, hincol, clink, ncols, colx);
1699 int *hcol,
int *hinrow,
1702 return presolve_expand_major(mrstrt, rowels,
1703 hcol, hinrow, rlink, nrows, rowx);
1719 for (k = ks; k < ke; k++)
1722 if (minndxs[k] == tgt)
1731 if (minndxs[k] == tgt)
1747 return presolve_find_minor(row, kcs, kce, hrow);
1759 return presolve_find_minor(col, krs, kre, hcol);
1771 const int *minndxs);
1782 return presolve_find_minor1(row, kcs, kce, hrow);
1794 return presolve_find_minor1(col, krs, kre, hcol);
1820 return presolve_find_minor2(row, kcs, collen, hrow, clinks);
1846 return presolve_find_minor3(row, kcs, collen, hrow, clinks);
1860 int *majlens,
int *minndxs,
double *els)
1865 const CoinBigIndex kmi = presolve_find_minor(minndx, ks, ke, minndxs);
1867 minndxs[kmi] = minndxs[ke - 1];
1868 els[kmi] = els[ke - 1];
1882 int *majlens,
int *minndxs,
double *els)
1888 int iMinor = minndxs[k];
1889 if (!marked[iMinor]) {
1890 minndxs[put] = iMinor;
1891 els[put++] = els[k];
1896 majlens[majndx] =
static_cast< int >(put - ks);
1912 int *hincol,
int *hrow,
double *colels)
1914 presolve_delete_from_major(col, row, mcstrt, hincol, hrow, colels);
1929 int *hinrow,
int *hcol,
double *rowels)
1931 presolve_delete_from_major(row, col, mrstrt, hinrow, hcol, rowels);
1944 void presolve_delete_from_major2(
int majndx,
int minndx,
1960 int *hincol,
int *hrow,
1963 presolve_delete_from_major2(col, row, mcstrt, hincol, hrow, clinks, free_listp);
unsigned char * rowChanged_
Row change status information.
void setColChanged(int i)
Mark column as changed.
int * originalRow_
Original row numbers.
Error Class thrown by an exception.
void setPass(int pass=0)
Set pass number.
int * colsToDo_
Input list of columns to process.
bool rowIsBasic(int sequence) const
Check if artificial for this row is basic.
void setMessageHandler(CoinMessageHandler *handler)
Set message handler.
virtual void postsolve(CoinPostsolveMatrix *prob) const =0
Apply the postsolve transformation for this particular presolve action.
double ztolzb_
Primal feasibility tolerance.
void PRESOLVE_REMOVE_LINK(presolvehlink *link, int i)
unlink vector i
void setFeasibilityTolerance(double val)
Set feasibility tolerance.
const double * getColSolution() const
Get column solution (primal variable values)
Collects all the information about the problem that is needed in both presolve and postsolve...
int * originalColumn_
Original column numbers.
bool anyInteger_
Flag to say if any variables are integer.
bool rowProhibited(int i) const
Test if row is eligible for preprocessing.
double * sumDown_
Work array for sum of finite contributions to row lhs lower bound.
int nrows0_
Allocated number of rows.
const int * getColLengths() const
Get column length vector for column-major packed matrix.
double * colels_
Coefficients (positional correspondence with hrow_)
CoinMessage messages_
Standard COIN messages.
const double * getElementsByRow() const
Get vector of elements for row-major packed matrix.
bool rowProhibited2(int i) const
Test if row is eligible for preprocessing.
const int * getColIndicesByRow() const
Get vector of column indices for row-major packed matrix.
CoinBigIndex presolve_find_row3(int row, CoinBigIndex kcs, int collen, const int *hrow, const CoinBigIndex *clinks)
Find position of a row in a column in a column-major threaded matrix.
CoinBigIndex nelems0_
Allocated number of coefficients.
int * infiniteUp_
Work array for count of infinite contributions to row lhs upper bound.
double * usefulColumnDouble_
Preallocated scratch work array, ncols_.
unsigned char * rowstat_
Status of constraints.
double * rup_
Row (constraint) upper bounds.
void unsetRowChanged(int i)
Mark row as not changed.
double * randomNumber_
Array of random numbers (max row,column)
int * hcol_
Column indices (positional correspondence with rowels_)
const double ZTOLDP2
Alternate zero tolerance.
int presolveOptions_
Fine control over presolve actions.
double * rcosts_
Vector of reduced costs.
CoinBigIndex nelems_
current number of coefficients
Links to aid in packed matrix modification.
int * nextColsToDo_
Output list of columns to process next.
int ncols0_
Allocated number of columns.
int * rowsToDo_
Input list of rows to process.
bool colInfinite(int i) const
Has column infinite ub (originally)
Abstract base class of all presolve routines.
double maxmin_
Maximization/minimization.
double bulkRatio_
Ratio of bulk0_ to nelems0_; default is 2.
static void throwCoinError(const char *error, const char *ps_routine)
Stub routine to throw exceptions.
CoinBigIndex getNumElems() const
Get current number of non-zero coefficients.
void presolve_delete_from_col(int row, int col, const CoinBigIndex *mcstrt, int *hincol, int *hrow, double *colels)
Delete the entry for row row from column col in a column-major matrix.
int countEmptyCols()
Count empty columns.
int numberNextColsToDo_
Length of nextColsToDo_.
int status()
Returns problem status (0 = feasible, 1 = infeasible, 2 = unbounded)
void unsetColUsed(int i)
Mark column as unused.
const CoinBigIndex * getColStarts() const
Get column start vector for column-major packed matrix.
void setStatus(int status)
Set problem status.
The default COIN simplex (basis-oriented) warm start class.
int numberColsToDo_
Length of colsToDo_.
CoinBigIndex presolve_find_minor(int tgt, CoinBigIndex ks, CoinBigIndex ke, const int *minndxs)
Find position of a minor index in a major vector.
int numberColsToDo()
Return the number of columns on the colsToDo_ list.
void setPresolveOptions(int value)
Sets any special options (see presolveOptions_)
Status
Enum for status of various sorts.
Base class for message handling.
double * cost_
Objective coefficients.
bool anyInteger() const
Check if there are any integer variables.
void presolve_delete_from_major(int majndx, int minndx, const CoinBigIndex *majstrts, int *majlens, int *minndxs, double *els)
Delete the entry for a minor index from a major vector.
Status getRowStatus(int sequence) const
Get row status.
bool anyProhibited_
Flag to say if any rows or columns are marked as prohibited.
bool isInteger(int i) const
Check for integrality of the specified variable.
Abstract Base Class for describing an interface to a solver.
double startTime_
Start time of presolve.
double * presolve_dupmajor(const double *elems, const int *indices, int length, CoinBigIndex offset, int tgt=-1)
Duplicate a major-dimension vector; optionally omit the entry with minor index tgt.
void setVariableType(int i, int variableType)
Set variable type information for a single variable.
void PRESOLVE_MOVE_LINK(presolvehlink *link, int i, int j)
relink vector j in place of vector i
The standard set of Coin messages.
void setNext(const CoinPresolveAction *nextAction)
modify next (when building rather than passing)
void addCol(int i)
Mark column as changed and add to list of columns to process next.
void setRowStatus(int sequence, Status status)
Set row status (i.e., status of artificial for this row)
unsigned char * integerType_
Tracks integrality of columns (1 for integer, 0 for continuous)
void coin_init_random_vec(double *work, int n)
Initialize a vector with random numbers.
bool colProhibited2(int i) const
Test if column is eligible for preprocessing.
int nrows_
current number of rows
bool anyProhibited() const
Check if there are any prohibited rows or columns.
virtual ~CoinPresolveAction()
Virtual destructor.
void setAnyInteger(bool anyInteger=true)
Set a flag for presence (true) or absence (false) of integer variables.
const double * getElementsByCol() const
Get vector of elements for column-major packed matrix.
double * usefulRowDouble_
Preallocated scratch work array, 2*nrows_.
const double * getColLower() const
Get column lower bounds.
double * cup_
Column (primal variable) upper bounds.
void setColumnStatus(int sequence, Status status)
Set column status (i.e., status of primal variable)
int status_
Output status: 0 = feasible, 1 = infeasible, 2 = unbounded.
void setAnyProhibited(bool val=true)
Set a flag for presence of prohibited rows or columns.
int * hincol_
Vector of column lengths.
CoinBigIndex maxlink_
Allocated size of link_.
double * acts_
Vector of constraint left-hand-side values (row activity)
int * hrow_
Row indices (positional correspondence with colels_)
CoinPresolveAction(const CoinPresolveAction *next)
Construct a postsolve object and add it to the transformation list.
const int * getRowIndicesByCol() const
Get vector of row indices for column-major packed matrix.
void presolve_delete_many_from_major(int majndx, char *marked, const CoinBigIndex *majstrts, int *majlens, int *minndxs, double *els)
Delete marked entries.
int numberNextRowsToDo_
Length of nextRowsToDo_.
void setColProhibited(int i)
Mark column as ineligible for preprocessing.
double ztoldj_
Dual feasibility tolerance.
const double ZTOLDP
Zero tolerance.
CoinBigIndex presolve_find_row(int row, CoinBigIndex kcs, CoinBigIndex kce, const int *hrow)
Find position of a row in a column in a column-major matrix.
const CoinPresolveAction * next
The next presolve transformation.
void presolve_delete_from_row(int row, int col, const CoinBigIndex *mrstrt, int *hinrow, int *hcol, double *rowels)
Delete the entry for column col from row row in a row-major matrix.
Augments CoinPrePostsolveMatrix with information about the problem that is only needed during postsol...
void setRowProhibited(int i)
Mark row as ineligible for preprocessing.
CoinBigIndex bulk0_
Allocated size of bulk storage for row indices and coefficients.
bool rowChanged(int i) const
Has row been changed?
void setMaximumSubstitutionLevel(int level)
Set Maximum substitution level (normally 3)
void unsetColInfinite(int i)
Mark column as not infinite ub (originally)
unsigned char * colChanged_
Column change status information.
bool colProhibited(int i) const
Test if column is eligible for preprocessing.
bool defaultHandler_
Indicates if the current handler_ is default (true) or not (false).
int getNumRows() const
Get current number of rows.
Sparse Matrix Base Class.
void setRowChanged(int i)
Mark row as changed.
void change_bias(double change_amount)
Adjust objective function constant offset.
double originalOffset_
Original objective offset.
int countEmptyRows()
Count number of empty rows.
Augments CoinPrePostsolveMatrix with information about the problem that is only needed during presolv...
bool colUsed(int i) const
Test if column is marked as used.
int * hinrow_
Vector of row lengths.
CoinMessages messages() const
Return messages.
void setColInfinite(int i)
Mark column as infinite ub (originally)
int * nextRowsToDo_
Output list of rows to process next.
int numberRowsToDo_
Length of rowsToDo_.
double * sumUp_
Work array for sum of finite contributions to row lhs upper bound.
int ncols_
current number of columns
void addRow(int i)
Mark row as changed and add to list of rows to process next.
double dobias_
Objective function offset introduced during presolve.
bool rowUsed(int i) const
Test if row is marked as used.
const double * getRowLower() const
Get row lower bounds.
void presolve_delete_from_col2(int row, int col, CoinBigIndex *mcstrt, int *hincol, int *hrow, CoinBigIndex *clinks, CoinBigIndex *free_listp)
Delete the entry for row row from column col in a column-major threaded matrix.
const double * getRowActivity() const
Get row activity (constraint lhs values)
void PRESOLVE_INSERT_LINK(presolvehlink *link, int i, int j)
insert vector i after vector j
const double * getCost() const
Get objective coefficients.
double * rowels_
Coefficients (positional correspondence with hcol_)
bool tuning_
Print statistics for tuning.
#define PRESOLVE_INF
The usual finite infinity.
int * infiniteDown_
Work array for count of infinite contributions to row lhs lower bound.
int numberRowsToDo()
Return the number of rows on the rowsToDo_ list.
const double * getReducedCost() const
Get reduced costs.
const CoinBigIndex * getRowStarts() const
Get row start vector for row-major packed matrix.
bool columnIsBasic(int sequence) const
Check if column (structural variable) is basic.
bool colChanged(int i) const
Has column been changed?
int * usefulColumnInt_
Preallocated scratch work array, 2*ncols_.
double feasibilityTolerance()
Return feasibility tolerance.
CoinBigIndex free_list_
First entry in free entries thread.
double * clo_
Column (primal variable) lower bounds.
double feasibilityTolerance_
Bounds can be moved by this to retain feasibility.
void unsetColChanged(int i)
Mark column as not changed.
This file contains the enum for the standard set of Coin messages and a class definition whose sole p...
presolvehlink * rlink_
Linked list for the row-major representation.
CoinBigIndex presolve_find_row1(int row, CoinBigIndex kcs, CoinBigIndex kce, const int *hrow)
Find position of a row in a column in a column-major matrix.
CoinBigIndex presolve_find_col1(int col, CoinBigIndex krs, CoinBigIndex kre, const int *hcol)
Find position of a column in a row in a row-major matrix.
unsigned char * colstat_
Status of primal variables.
double * sol_
Vector of primal variable values.
double * rowduals_
Vector of dual variable values.
int presolveOptions() const
Picks up any special options.
CoinBigIndex * link_
Thread array.
const double * getRowPrice() const
Get row solution (dual variables)
void setColUsed(int i)
Mark column as used.
virtual const char * name() const =0
A name for debug printing.
CoinBigIndex presolve_find_row2(int row, CoinBigIndex kcs, int collen, const int *hrow, const CoinBigIndex *clinks)
Find position of a row in a column in a column-major threaded matrix.
Status getColumnStatus(int sequence) const
Get column (structural variable) status.
const double * getRowUpper() const
Get row upper bounds.
CoinBigIndex presolve_find_col(int col, CoinBigIndex krs, CoinBigIndex kre, const int *hcol)
Find position of a column in a row in a row-major matrix.
void setRowUsed(int i)
Mark row as used.
bool presolve_expand_row(CoinBigIndex *mrstrt, double *rowels, int *hcol, int *hinrow, presolvehlink *rlink, int nrows, int rowx)
Make sure a row (rowx) in a row-major matrix has room for one more coefficient.
int pass_
Presolve pass number.
Class to hold and manipulate an array of massaged messages.
int maxSubstLevel_
Maximum substitution level.
const double * getColUpper() const
Get column upper bounds.
void unsetRowUsed(int i)
Mark row as unused.
double * rlo_
Row (constraint) lower bounds.
bool presolve_expand_col(CoinBigIndex *mcstrt, double *colels, int *hrow, int *hincol, presolvehlink *clink, int ncols, int colx)
Make sure a column (colx) in a column-major matrix has room for one more coefficient.