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