919d4a1006
in the future I may add the SVN history
126 lines
4.1 KiB
C
126 lines
4.1 KiB
C
#ifndef HEADER_lp_presolve
|
|
#define HEADER_lp_presolve
|
|
|
|
#include "lp_types.h"
|
|
#include "lp_matrix.h"
|
|
|
|
/* -------------------------------------------------------------------------------------------- */
|
|
/* Defines for various presolve options */
|
|
/* -------------------------------------------------------------------------------------------- */
|
|
|
|
#define MAX_PSMERGELOOPS 2 /* Max loops to merge compatible constraints */
|
|
#define MAX_PSLINDEPLOOPS 1 /* Max loops to detect linearly dependendent constraints */
|
|
#define MAX_PSBOUNDTIGHTENLOOPS 5 /* Maximumn number of loops to allow bound tightenings */
|
|
#define MIN_SOS1LENGTH 4 /* Minimum length of a constraint for conversion to SOS1 */
|
|
#if 1
|
|
#define PRESOLVE_EPSVALUE (0.1*lp->epsprimal)
|
|
#else
|
|
#define PRESOLVE_EPSVALUE lp->epsvalue
|
|
#endif
|
|
#define PRESOLVE_EPSPIVOT 1.0e-3 /* Looses robustness at values smaller than ~1.0e-3 */
|
|
#define PRESOLVE_BOUNDSLACK 10 /* Extra error recovery/tolerance margin */
|
|
|
|
#define DoPresolveRounding /* Use absolute and directed rounding (disable at own risk) */
|
|
/*#define DoPresolveRelativeTest*/
|
|
|
|
/*#define PresolveForceUpdateMax*/
|
|
|
|
/*#define DualFeasibilityLogicEQ2*/ /* Add low-order feasibility/accuracy logic to elimEQ2 */
|
|
#define DivisorIntegralityLogicEQ2 /* Always prefer integer divisors */
|
|
#define FindImpliedEqualities /* Detect equalities (default is enabled) */
|
|
#define Eq2Reldiff
|
|
|
|
/*#define SavePresolveEliminated */ /* Enable to activate storage of eliminated matrix data */
|
|
/*#define UseDualPresolve */ /* Enable to use full dual information for presolve */
|
|
|
|
|
|
typedef struct _psrec
|
|
{
|
|
LLrec *varmap;
|
|
int **next;
|
|
int *empty;
|
|
int *plucount;
|
|
int *negcount;
|
|
int *pluneg;
|
|
int *infcount;
|
|
REAL *plulower;
|
|
REAL *neglower;
|
|
REAL *pluupper;
|
|
REAL *negupper;
|
|
int allocsize;
|
|
} psrec;
|
|
|
|
typedef struct _presolverec
|
|
{
|
|
psrec *rows;
|
|
psrec *cols;
|
|
LLrec *EQmap;
|
|
LLrec *LTmap;
|
|
LLrec *INTmap;
|
|
REAL *pv_upbo;
|
|
REAL *pv_lobo;
|
|
REAL *dv_upbo;
|
|
REAL *dv_lobo;
|
|
lprec *lp;
|
|
REAL epsvalue;
|
|
REAL epspivot;
|
|
int innerloops;
|
|
int middleloops;
|
|
int outerloops;
|
|
int nzdeleted;
|
|
MYBOOL forceupdate;
|
|
} presolverec;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Put function headers here */
|
|
|
|
STATIC MYBOOL presolve_createUndo(lprec *lp);
|
|
STATIC MYBOOL presolve_rebuildUndo(lprec *lp, MYBOOL isprimal);
|
|
STATIC MYBOOL inc_presolve_space(lprec *lp, int delta, MYBOOL isrows);
|
|
STATIC MYBOOL presolve_setOrig(lprec *lp, int orig_rows, int orig_cols);
|
|
STATIC MYBOOL presolve_colfix(presolverec *psdata, int colnr, REAL newvalue, MYBOOL remove, int *tally);
|
|
STATIC MYBOOL presolve_fillUndo(lprec *lp, int orig_rows, int orig_cols, MYBOOL setOrig);
|
|
STATIC MYBOOL presolve_freeUndo(lprec *lp);
|
|
|
|
STATIC MYBOOL presolve_updatesums(presolverec *psdata);
|
|
|
|
INLINE int presolve_nextrow(presolverec *psdata, int colnr, int *previtem);
|
|
INLINE int presolve_nextcol(presolverec *psdata, int rownr, int *previtem);
|
|
|
|
STATIC presolverec *presolve_init(lprec *lp);
|
|
STATIC void presolve_free(presolverec **psdata);
|
|
STATIC int presolve_shrink(presolverec *psdata, int *nConRemove, int *nVarRemove);
|
|
STATIC void presolve_rowremove(presolverec *psdata, int rownr, MYBOOL allowcoldelete);
|
|
STATIC int presolve_colremove(presolverec *psdata, int colnr, MYBOOL allowrowdelete);
|
|
|
|
STATIC MYBOOL presolve_colfixdual(presolverec *psdata, int colnr, REAL *fixValue, int *status);
|
|
|
|
INLINE int presolve_rowlength(presolverec *psdata, int rownr)
|
|
{
|
|
int *items = psdata->rows->next[rownr];
|
|
|
|
if(items == NULL)
|
|
return( 0 );
|
|
else
|
|
return( items[0] );
|
|
}
|
|
INLINE int presolve_collength(presolverec *psdata, int colnr)
|
|
{
|
|
int *items = psdata->cols->next[colnr];
|
|
if(items == NULL)
|
|
return( 0 );
|
|
else
|
|
return( items[0] );
|
|
}
|
|
|
|
STATIC int presolve(lprec *lp);
|
|
STATIC MYBOOL postsolve(lprec *lp, int status);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* HEADER_lp_presolve */
|