1 #ifndef HEADER_lp_price 2 #define HEADER_lp_price 3 4 /* Local defines */ 5 /* ------------------------------------------------------------------------- */ 6 #define UseSortOnBound_Improve 7 /*#define UseSortOnBound_Substitute*/ 8 9 #if 0 /* Stricter feasibility-preserving tolerance; use w/ *_UseRejectionList */ 10 #define UseRelativeFeasibility /* Use machine-precision and A-scale data */ 11 #endif 12 #if 0 /* Stricter pivot-selection criteria; use w/ *UseRejectionList */ 13 #define UseRelativePivot_Primal /* In rowprim based on A-scale data */ 14 #define UseRelativePivot_Dual /* In coldual based on A-scale data */ 15 #endif 16 17 18 /* Include required library headers */ 19 /* ------------------------------------------------------------------------- */ 20 #include "lp_types.h" 21 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 /* Comparison and validity routines */ 28 int CMP_CALLMODEL compareImprovementVar(const pricerec *current, const pricerec *candidate); 29 int CMP_CALLMODEL compareSubstitutionVar(const pricerec *current, const pricerec *candidate); 30 int CMP_CALLMODEL compareBoundFlipVar(const pricerec *current, const pricerec *candidate); 31 STATIC int addCandidateVar(pricerec *candidate, multirec *multi, findCompare_func findCompare, MYBOOL allowSortedExpand); 32 STATIC MYBOOL collectMinorVar(pricerec *candidate, multirec *longsteps, MYBOOL isphase2, MYBOOL isbatch); 33 STATIC MYBOOL validImprovementVar(pricerec *candidate); 34 STATIC MYBOOL validSubstitutionVar(pricerec *candidate); 35 36 /* Row+column selection routines */ 37 STATIC MYBOOL findImprovementVar(pricerec *current, pricerec *candidate, MYBOOL collectMP, int *candidatecount); 38 STATIC MYBOOL findSubstitutionVar(pricerec *current, pricerec *candidate, int *candidatecount); 39 /* 40 INLINE REAL normalizeEdge(lprec *lp, int item, REAL edge, MYBOOL isdual); 41 */ 42 STATIC void makePriceLoop(lprec *lp, int *start, int *end, int *delta); 43 44 /* Computation of reduced costs */ 45 STATIC void update_reducedcosts(lprec *lp, MYBOOL isdual, int leave_nr, int enter_nr, REAL *prow, REAL *drow); 46 STATIC void compute_reducedcosts(lprec *lp, MYBOOL isdual, int row_nr, int *coltarget, MYBOOL dosolve, 47 REAL *prow, int *nzprow, 48 REAL *drow, int *nzdrow, 49 int roundmode); 50 51 /* Leaving variable selection and entering column pricing loops */ 52 STATIC int find_rowReplacement(lprec *lp, int rownr, REAL *prow, int *nzprow); 53 STATIC int colprim(lprec *lp, REAL *drow, int *nzdrow, 54 MYBOOL skipupdate, int partialloop, int *candidatecount, MYBOOL updateinfeas, REAL *xviol); 55 STATIC int rowprim(lprec *lp, int colnr, LREAL *theta, REAL *pcol, int *nzpcol, MYBOOL forceoutEQ, REAL *xviol); 56 STATIC int rowdual(lprec *lp, REAL *rhvec, MYBOOL forceoutEQ, MYBOOL updateinfeas, REAL *xviol); 57 STATIC int coldual(lprec *lp, int row_nr, 58 REAL *prow, int *nzprow, REAL *drow, int *nzdrow, 59 MYBOOL dualphase1, MYBOOL skipupdate, 60 int *candidatecount, REAL *xviol); 61 62 /* Partial pricing management routines */ 63 STATIC partialrec *partial_createBlocks(lprec *lp, MYBOOL isrow); 64 STATIC int partial_countBlocks(lprec *lp, MYBOOL isrow); 65 STATIC int partial_activeBlocks(lprec *lp, MYBOOL isrow); 66 STATIC void partial_freeBlocks(partialrec **blockdata); 67 68 /* Partial pricing utility routines */ 69 STATIC int partial_findBlocks(lprec *lp, MYBOOL autodefine, MYBOOL isrow); 70 STATIC int partial_blockStart(lprec *lp, MYBOOL isrow); 71 STATIC int partial_blockEnd(lprec *lp, MYBOOL isrow); 72 STATIC int partial_blockNextPos(lprec *lp, int block, MYBOOL isrow); 73 74 STATIC MYBOOL partial_blockStep(lprec *lp, MYBOOL isrow); 75 STATIC MYBOOL partial_isVarActive(lprec *lp, int varno, MYBOOL isrow); 76 77 /* Multiple pricing / dual long step management routines */ 78 STATIC multirec *multi_create(lprec *lp, MYBOOL truncinf); 79 STATIC MYBOOL multi_resize(multirec *multi, int blocksize, int blockdiv, MYBOOL doVlist, MYBOOL doIset); 80 STATIC int multi_restart(multirec *multi); 81 STATIC int multi_size(multirec *multi); 82 STATIC int multi_used(multirec *multi); 83 STATIC MYBOOL multi_truncatingvar(multirec *multi, int varnr); 84 STATIC MYBOOL multi_mustupdate(multirec *multi); 85 STATIC void multi_valueInit(multirec *multi, REAL step_base, REAL obj_base); 86 STATIC REAL *multi_valueList(multirec *multi); 87 STATIC int *multi_indexSet(multirec *multi, MYBOOL regenerate); 88 STATIC int multi_getvar(multirec *multi, int item); 89 STATIC MYBOOL multi_recompute(multirec *multi, int index, MYBOOL isphase2, MYBOOL fullupdate); 90 STATIC MYBOOL multi_removevar(multirec *multi, int varnr); 91 STATIC int multi_enteringvar(multirec *multi, pricerec *current, int priority); 92 STATIC REAL multi_enteringtheta(multirec *multi); 93 STATIC void multi_free(multirec **multi); 94 STATIC int multi_populateSet(multirec *multi, int **list, int excludenr); 95 96 #ifdef __cplusplus 97 } 98 #endif 99 100 #endif /* HEADER_lp_price */ 101 102