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);
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;
422 return (static_cast< Status >(
colstat_[sequence] & 7) ==
basic);
471 void setColLower(
const double *colLower,
int lenParam);
473 void setColUpper(
const double *colUpper,
int lenParam);
477 void setCost(
const double *cost,
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);
576 for (
int i = 0; i <
ncols_; i++)
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,
950 double nonLinearVariable,
951 const char *prohibited,
984 for (
int i = 0; i <
nrows_; i++)
1099 #if PRESOLVE_DEBUG > 2
1100 assert(fabs(change_amount) < 1.0e50);
1579 unsigned char *colstat,
1580 unsigned char *rowstat);
1598 unsigned char *colstat,
1599 unsigned char *rowstat);
1677 int *minndxs,
int *majlens,
1686 int *hrow,
int *hincol,
1690 hrow, hincol, clink, ncols, colx);
1699 int *hcol,
int *hinrow,
1703 hcol, hinrow, rlink, nrows, rowx);
1719 for (k = ks; k < ke; k++)
1722 if (minndxs[k] == tgt)
1731 if (minndxs[k] == tgt)
1771 const int *minndxs);
1860 int *majlens,
int *minndxs,
double *els)
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)
1929 int *hinrow,
int *hcol,
double *rowels)
1960 int *hincol,
int *hrow,
int status()
Returns problem status (0 = feasible, 1 = infeasible, 2 = unbounded)
bool defaultHandler_
Indicates if the current handler_ is default (true) or not (false).
void setRowStatus(int sequence, Status status)
Set row status (i.e., status of artificial for this row)
bool tuning_
Print statistics for tuning.
~CoinPostsolveMatrix()
Destructor.
void coin_init_random_vec(double *work, int n)
Initialize a vector with random numbers.
bool colInfinite(int i) const
Has column infinite ub (originally)
bool colChanged(int i) const
Has column been changed?
void setReducedCost(const double *redCost, int lenParam)
Set reduced costs.
const char * rowStatusString(int i) const
Return a print string for status of a row (artificial variable)
double startTime_
Start time of presolve.
const char * statusName(CoinPrePostsolveMatrix::Status status)
Generate a print string for a status code.
void update_model(ClpSimplex *si, int nrows0, int ncols0, CoinBigIndex nelems0)
Update the model held by a Clp OSI.
double dobias_
Objective function offset introduced during presolve.
void setStructuralStatus(const char *strucStatus, int lenParam)
Set column (structural variable) status vector.
int status_
Output status: 0 = feasible, 1 = infeasible, 2 = unbounded.
int * hcol_
Column indices (positional correspondence with rowels_)
void change_bias(double change_amount)
Adjust objective function constant offset.
CoinPresolveMatrix(int ncols_alloc, int nrows_alloc, CoinBigIndex nelems_alloc)
`Native' constructor
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 getNumRows() const
Get current number of rows.
void setColInfinite(int i)
Mark column as infinite ub (originally)
void setAnyInteger(bool anyInteger=true)
Set a flag for presence (true) or absence (false) of integer variables.
void PRESOLVE_REMOVE_LINK(presolvehlink *link, int i)
unlink vector i
bool anyInteger_
Flag to say if any variables are integer.
const double * getRowPrice() const
Get row solution (dual variables)
const char * columnStatusString(int j) const
Return a print string for status of a column (structural variable)
const double * getColSolution() const
Get column solution (primal variable values)
double * sumDown_
Work array for sum of finite contributions to row lhs lower bound.
void setObjSense(double objSense)
Set the objective sense (max/min)
const double * getElementsByCol() const
Get vector of elements for column-major packed matrix.
int numberColsToDo_
Length of colsToDo_.
void setRowLower(const double *rowLower, int lenParam)
Set row lower bounds.
void setNext(const CoinPresolveAction *nextAction)
modify next (when building rather than passing)
Base class for message handling.
int * hrow_
Row indices (positional correspondence with colels_)
int * rowsToDo_
Input list of rows to process.
void addRow(int i)
Mark row as changed and add to list of rows to process next.
variableType
Enumeration for indicating variable type.
void setStatus(const CoinWarmStartBasis *basis)
Set the status of all variables from a basis.
const double * getRowUpper() const
Get row upper bounds.
const double * getReducedCost() const
Get reduced costs.
Collects all the information about the problem that is needed in both presolve and postsolve...
void setColSolution(const double *colSol, int lenParam)
Set column solution.
int * originalColumn_
Original column numbers.
CoinBigIndex presolve_find_minor3(int tgt, CoinBigIndex ks, int majlen, const int *minndxs, const CoinBigIndex *majlinks)
Find position of a minor index in a major vector in a threaded matrix.
Status
Enum for status of various sorts.
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.
int numberRowsToDo()
Return the number of rows on the rowsToDo_ list.
CoinMessageHandler * messageHandler() const
Return message handler.
Augments CoinPrePostsolveMatrix with information about the problem that is only needed during postsol...
CoinBigIndex presolve_find_minor1(int tgt, CoinBigIndex ks, CoinBigIndex ke, const int *minndxs)
Find position of a minor index in a major vector.
Augments CoinPrePostsolveMatrix with information about the problem that is only needed during presolv...
void addCol(int i)
Mark column as changed and add to list of columns to process next.
double * sumUp_
Work array for sum of finite contributions to row lhs upper bound.
const double * getCost() const
Get objective coefficients.
CoinBigIndex * mcstrt_
Vector of column start positions in hrow_, colels_.
void assignPresolveToPostsolve(CoinPresolveMatrix *&preObj)
Load an empty CoinPostsolveMatrix from a CoinPresolveMatrix.
const double ZTOLDP
Zero tolerance.
int numberNextColsToDo_
Length of nextColsToDo_.
virtual void postsolve(CoinPostsolveMatrix *prob) const =0
Apply the postsolve transformation for this particular presolve action.
unsigned char * rowChanged_
Row change status information.
CoinMessageHandler * handler_
Message handler.
double * cost_
Objective coefficients.
const int * getColIndicesByRow() const
Get vector of column indices for row-major packed matrix.
void setRowActivity(const double *rowAct, int lenParam)
Set row activity.
Links to aid in packed matrix modification.
int * hincol_
Vector of column lengths.
void setDualTolerance(double dualTol)
Set the dual feasibility tolerance.
double * usefulRowDouble_
Preallocated scratch work array, 2*nrows_.
~CoinPrePostsolveMatrix()
Destructor.
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.
int ncols_
current number of columns
void setPresolveOptions(int value)
Sets any special options (see presolveOptions_)
int pass_
Presolve pass number.
int * originalRow_
Original row numbers.
const CoinBigIndex * getColStarts() const
Get column start vector for column-major packed matrix.
CoinPostsolveMatrix(int ncols_alloc, int nrows_alloc, CoinBigIndex nelems_alloc)
`Native' constructor
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.
CoinBigIndex nelems0_
Allocated number of coefficients.
int nrows0_
Allocated number of rows.
int nrows_
current number of rows
void setRowPrice(const double *rowSol, int lenParam)
Set row solution.
double * rowduals_
Vector of dual variable values.
bool presolve_expand_major(CoinBigIndex *majstrts, double *majels, int *minndxs, int *majlens, presolvehlink *majlinks, int nmaj, int k)
Make sure a major-dimension vector k has room for one more coefficient.
double * usefulColumnDouble_
Preallocated scratch work array, ncols_.
void presolve_delete_from_major2(int majndx, int minndx, CoinBigIndex *majstrts, int *majlens, int *minndxs, CoinBigIndex *majlinks, CoinBigIndex *free_listp)
Delete the entry for a minor index from a major vector in a threaded matrix.
double maxmin_
Maximization/minimization.
presolvehlink * clink_
Linked list for the column-major representation.
Sparse Matrix Base Class.
#define PRESOLVE_INF
The usual finite infinity.
Status getColumnStatus(int sequence) const
Get column (structural variable) status.
int numberNextRowsToDo_
Length of nextRowsToDo_.
Status getRowStatus(int sequence) const
Get row status.
const double * getRowLower() const
Get row lower bounds.
CoinWarmStartBasis * getStatus()
Get status in the form of a CoinWarmStartBasis.
void presolve_delete_many_from_major(int majndx, char *marked, const CoinBigIndex *majstrts, int *majlens, int *minndxs, double *els)
Delete marked entries.
void setColUpper(const double *colUpper, int lenParam)
Set column upper bounds.
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.
CoinBigIndex free_list_
First entry in free entries thread.
void PRESOLVE_MOVE_LINK(presolvehlink *link, int i, int j)
relink vector j in place of vector i
void setRowUsed(int i)
Mark row as used.
void setColUsed(int i)
Mark column as used.
int * infiniteUp_
Work array for count of infinite contributions to row lhs upper bound.
int recomputeSums(int whichRow)
Recompute row lhs bounds.
double bulkRatio_
Ratio of bulk0_ to nelems0_; default is 2.
void unsetColInfinite(int i)
Mark column as not infinite ub (originally)
CoinMessage messages_
Standard COIN messages.
void setRowStatusUsingValue(int iRow)
Set status of row (artificial variable) to the correct nonbasic status given bounds and current value...
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.
int * usefulRowInt_
Preallocated scratch work array, 3*nrows_.
void setVariableType(int i, int variableType)
Set variable type information for a single variable.
unsigned char * integerType_
Tracks integrality of columns (1 for integer, 0 for continuous)
bool colUsed(int i) const
Test if column is marked as used.
void setRowChanged(int i)
Mark row as changed.
void setMessageHandler(CoinMessageHandler *handler)
Set message handler.
CoinMessages messages() const
Return messages.
double * rlo_
Row (constraint) lower bounds.
void unsetRowUsed(int i)
Mark row as unused.
void setColProhibited(int i)
Mark column as ineligible for preprocessing.
void setArtificialStatus(const char *artifStatus, int lenParam)
Set row (artificial variable) status vector.
void setColLower(const double *colLower, int lenParam)
Set column lower bounds.
CoinPresolveAction(const CoinPresolveAction *next)
Construct a postsolve object and add it to the transformation list.
void setAnyProhibited(bool val=true)
Set a flag for presence of prohibited rows or columns.
unsigned char * colChanged_
Column change status information.
int countEmptyCols()
Count empty columns.
void initRowsToDo()
Initialise the row ToDo lists.
void setFeasibilityTolerance(double val)
Set feasibility tolerance.
void setColumnStatus(int sequence, Status status)
Set column status (i.e., status of primal variable)
void setColChanged(int i)
Mark column as changed.
const CoinBigIndex * getRowStarts() const
Get row start vector for row-major packed matrix.
double * acts_
Vector of constraint left-hand-side values (row activity)
bool rowIsBasic(int sequence) const
Check if artificial for this row is basic.
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.
int * usefulColumnInt_
Preallocated scratch work array, 2*ncols_.
const double * getColLower() const
Get column lower bounds.
unsigned char * rowstat_
Status of constraints.
void setMaximumSubstitutionLevel(int level)
Set Maximum substitution level (normally 3)
void setRowProhibited(int i)
Mark row as ineligible for preprocessing.
double * cup_
Column (primal variable) upper bounds.
Abstract base class of all presolve routines.
bool colProhibited2(int i) const
Test if column is eligible for preprocessing.
void setPrimalTolerance(double primTol)
Set the primal feasibility tolerance.
bool anyProhibited() const
Check if there are any prohibited rows or columns.
int numberColsToDo()
Return the number of columns on the colsToDo_ list.
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.
Abstract Base Class for describing an interface to a solver.
This solves LPs using the simplex method.
const double * getRowActivity() const
Get row activity (constraint lhs values)
CoinBigIndex presolve_find_minor(int tgt, CoinBigIndex ks, CoinBigIndex ke, const int *minndxs)
Find position of a minor index in a major vector.
void setMatrix(const CoinPackedMatrix *mtx)
Load the cofficient matrix.
int * hinrow_
Vector of row lengths.
int presolveOptions() const
Picks up any special options.
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 unsetColChanged(int i)
Mark column as not changed.
bool columnIsBasic(int sequence) const
Check if column (structural variable) is basic.
int presolveOptions_
Fine control over presolve actions.
void initializeStuff()
Allocate scratch arrays.
CoinBigIndex getNumElems() const
Get current number of non-zero coefficients.
double * rcosts_
Vector of reduced costs.
int ncols0_
Allocated number of columns.
const double * getColUpper() const
Get column upper bounds.
CoinBigIndex maxlink_
Allocated size of link_.
Class to hold and manipulate an array of massaged messages.
double ztolzb_
Primal feasibility tolerance.
double * clo_
Column (primal variable) lower bounds.
void setObjOffset(double offset)
Set the objective function offset for the original system.
int stepRowsToDo()
Step row ToDo lists.
double * colels_
Coefficients (positional correspondence with hrow_)
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.
int getNumCols() const
Get current number of columns.
Error Class thrown by an exception.
void PRESOLVE_INSERT_LINK(presolvehlink *link, int i, int j)
insert vector i after vector j
double ztoldj_
Dual feasibility tolerance.
void unsetColUsed(int i)
Mark column as unused.
bool rowChanged(int i) const
Has row been changed?
CoinBigIndex bulk0_
Allocated size of bulk storage for row indices and coefficients.
CoinBigIndex presolve_find_minor2(int tgt, CoinBigIndex ks, int majlen, const int *minndxs, const CoinBigIndex *majlinks)
Find position of a minor index in a major vector in a threaded matrix.
void initColsToDo()
Initialise the column ToDo lists.
virtual ~CoinPresolveAction()
Virtual destructor.
unsigned char * colstat_
Status of primal variables.
virtual const char * name() const =0
A name for debug printing.
presolvehlink * rlink_
Linked list for the row-major representation.
void setRowUpper(const double *rowUpper, int lenParam)
Set row upper bounds.
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.
friend void assignPresolveToPostsolve(CoinPresolveMatrix *&preObj)
Initialize a CoinPostsolveMatrix object, destroying the CoinPresolveMatrix object.
double originalOffset_
Original objective offset.
bool rowProhibited(int i) const
Test if row is eligible for preprocessing.
const int * getColLengths() const
Get column length vector for column-major packed matrix.
void unsetRowChanged(int i)
Mark row as not changed.
~CoinPresolveMatrix()
Destructor.
void presolve_make_memlists(int *lengths, presolvehlink *link, int n)
Initialise linked list for major vector order in bulk storage.
void setColumnStatusUsingValue(int iColumn)
Set status of column (structural variable) to the correct nonbasic status given bounds and current va...
CoinBigIndex nelems_
current number of coefficients
static void throwCoinError(const char *error, const char *ps_routine)
Stub routine to throw exceptions.
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.
CoinPrePostsolveMatrix(int ncols_alloc, int nrows_alloc, CoinBigIndex nelems_alloc)
`Native' constructor
bool anyInteger() const
Check if there are any integer variables.
bool rowProhibited2(int i) const
Test if row is eligible for preprocessing.
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.
double * randomNumber_
Array of random numbers (max row,column)
CoinBigIndex * mrstrt_
Vector of row start positions in #hcol, rowels_.
void setPass(int pass=0)
Set pass number.
int * infiniteDown_
Work array for count of infinite contributions to row lhs lower bound.
bool colProhibited(int i) const
Test if column is eligible for preprocessing.
CoinBigIndex * link_
Thread array.
int countEmptyRows()
Count number of empty rows.
double feasibilityTolerance()
Return feasibility tolerance.
void deleteStuff()
Free scratch arrays.
void statistics()
Say we want statistics - also set time.
bool rowUsed(int i) const
Test if row is marked as used.
bool isInteger(int i) const
Check for integrality of the specified variable.
double * sol_
Vector of primal variable values.
The standard set of Coin messages.
int numberRowsToDo_
Length of rowsToDo_.
const double * getElementsByRow() const
Get vector of elements for row-major packed matrix.
int maxSubstLevel_
Maximum substitution level.
int * nextColsToDo_
Output list of columns to process next.
double * rowels_
Coefficients (positional correspondence with hcol_)
const double ZTOLDP2
Alternate zero tolerance.
The default COIN simplex (basis-oriented) warm start class.
int * colsToDo_
Input list of columns to process.
double feasibilityTolerance_
Bounds can be moved by this to retain feasibility.
int * nextRowsToDo_
Output list of rows to process next.
double * rup_
Row (constraint) upper bounds.
void setCost(const double *cost, int lenParam)
Set objective coefficients.
int stepColsToDo()
Step column ToDo lists.
const CoinPresolveAction * next
The next presolve transformation.
void setStatus(int status)
Set problem status.
const int * getRowIndicesByCol() const
Get vector of row indices for column-major packed matrix.