dees/include/lp_presolve.h
Yann Esposito (Yogsototh) 919d4a1006 Initial git init
in the future I may add the SVN history
2011-05-17 22:24:18 +02:00

127 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 */