alpar@1
|
1 |
/* glpnpp.h (LP/MIP preprocessor) */
|
alpar@1
|
2 |
|
alpar@1
|
3 |
/***********************************************************************
|
alpar@1
|
4 |
* This code is part of GLPK (GNU Linear Programming Kit).
|
alpar@1
|
5 |
*
|
alpar@1
|
6 |
* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
alpar@1
|
7 |
* 2009, 2010 Andrew Makhorin, Department for Applied Informatics,
|
alpar@1
|
8 |
* Moscow Aviation Institute, Moscow, Russia. All rights reserved.
|
alpar@1
|
9 |
* E-mail: <mao@gnu.org>.
|
alpar@1
|
10 |
*
|
alpar@1
|
11 |
* GLPK is free software: you can redistribute it and/or modify it
|
alpar@1
|
12 |
* under the terms of the GNU General Public License as published by
|
alpar@1
|
13 |
* the Free Software Foundation, either version 3 of the License, or
|
alpar@1
|
14 |
* (at your option) any later version.
|
alpar@1
|
15 |
*
|
alpar@1
|
16 |
* GLPK is distributed in the hope that it will be useful, but WITHOUT
|
alpar@1
|
17 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
alpar@1
|
18 |
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
alpar@1
|
19 |
* License for more details.
|
alpar@1
|
20 |
*
|
alpar@1
|
21 |
* You should have received a copy of the GNU General Public License
|
alpar@1
|
22 |
* along with GLPK. If not, see <http://www.gnu.org/licenses/>.
|
alpar@1
|
23 |
***********************************************************************/
|
alpar@1
|
24 |
|
alpar@1
|
25 |
#ifndef GLPNPP_H
|
alpar@1
|
26 |
#define GLPNPP_H
|
alpar@1
|
27 |
|
alpar@1
|
28 |
#include "glpapi.h"
|
alpar@1
|
29 |
|
alpar@1
|
30 |
typedef struct NPP NPP;
|
alpar@1
|
31 |
typedef struct NPPROW NPPROW;
|
alpar@1
|
32 |
typedef struct NPPCOL NPPCOL;
|
alpar@1
|
33 |
typedef struct NPPAIJ NPPAIJ;
|
alpar@1
|
34 |
typedef struct NPPTSE NPPTSE;
|
alpar@1
|
35 |
typedef struct NPPLFE NPPLFE;
|
alpar@1
|
36 |
|
alpar@1
|
37 |
struct NPP
|
alpar@1
|
38 |
{ /* LP/MIP preprocessor workspace */
|
alpar@1
|
39 |
/*--------------------------------------------------------------*/
|
alpar@1
|
40 |
/* original problem segment */
|
alpar@1
|
41 |
int orig_dir;
|
alpar@1
|
42 |
/* optimization direction flag:
|
alpar@1
|
43 |
GLP_MIN - minimization
|
alpar@1
|
44 |
GLP_MAX - maximization */
|
alpar@1
|
45 |
int orig_m;
|
alpar@1
|
46 |
/* number of rows */
|
alpar@1
|
47 |
int orig_n;
|
alpar@1
|
48 |
/* number of columns */
|
alpar@1
|
49 |
int orig_nnz;
|
alpar@1
|
50 |
/* number of non-zero constraint coefficients */
|
alpar@1
|
51 |
/*--------------------------------------------------------------*/
|
alpar@1
|
52 |
/* transformed problem segment (always minimization) */
|
alpar@1
|
53 |
DMP *pool;
|
alpar@1
|
54 |
/* memory pool to store problem components */
|
alpar@1
|
55 |
char *name;
|
alpar@1
|
56 |
/* problem name (1 to 255 chars); NULL means no name is assigned
|
alpar@1
|
57 |
to the problem */
|
alpar@1
|
58 |
char *obj;
|
alpar@1
|
59 |
/* objective function name (1 to 255 chars); NULL means no name
|
alpar@1
|
60 |
is assigned to the objective function */
|
alpar@1
|
61 |
double c0;
|
alpar@1
|
62 |
/* constant term of the objective function */
|
alpar@1
|
63 |
int nrows;
|
alpar@1
|
64 |
/* number of rows introduced into the problem; this count
|
alpar@1
|
65 |
increases by one every time a new row is added and never
|
alpar@1
|
66 |
decreases; thus, actual number of rows may be less than nrows
|
alpar@1
|
67 |
due to row deletions */
|
alpar@1
|
68 |
int ncols;
|
alpar@1
|
69 |
/* number of columns introduced into the problem; this count
|
alpar@1
|
70 |
increases by one every time a new column is added and never
|
alpar@1
|
71 |
decreases; thus, actual number of column may be less than
|
alpar@1
|
72 |
ncols due to column deletions */
|
alpar@1
|
73 |
NPPROW *r_head;
|
alpar@1
|
74 |
/* pointer to the beginning of the row list */
|
alpar@1
|
75 |
NPPROW *r_tail;
|
alpar@1
|
76 |
/* pointer to the end of the row list */
|
alpar@1
|
77 |
NPPCOL *c_head;
|
alpar@1
|
78 |
/* pointer to the beginning of the column list */
|
alpar@1
|
79 |
NPPCOL *c_tail;
|
alpar@1
|
80 |
/* pointer to the end of the column list */
|
alpar@1
|
81 |
/*--------------------------------------------------------------*/
|
alpar@1
|
82 |
/* transformation history */
|
alpar@1
|
83 |
DMP *stack;
|
alpar@1
|
84 |
/* memory pool to store transformation entries */
|
alpar@1
|
85 |
NPPTSE *top;
|
alpar@1
|
86 |
/* pointer to most recent transformation entry */
|
alpar@1
|
87 |
#if 0 /* 16/XII-2009 */
|
alpar@1
|
88 |
int count[1+25];
|
alpar@1
|
89 |
/* transformation statistics */
|
alpar@1
|
90 |
#endif
|
alpar@1
|
91 |
/*--------------------------------------------------------------*/
|
alpar@1
|
92 |
/* resultant (preprocessed) problem segment */
|
alpar@1
|
93 |
int m;
|
alpar@1
|
94 |
/* number of rows */
|
alpar@1
|
95 |
int n;
|
alpar@1
|
96 |
/* number of columns */
|
alpar@1
|
97 |
int nnz;
|
alpar@1
|
98 |
/* number of non-zero constraint coefficients */
|
alpar@1
|
99 |
int *row_ref; /* int row_ref[1+m]; */
|
alpar@1
|
100 |
/* row_ref[i], 1 <= i <= m, is the reference number assigned to
|
alpar@1
|
101 |
a row, which is i-th row of the resultant problem */
|
alpar@1
|
102 |
int *col_ref; /* int col_ref[1+n]; */
|
alpar@1
|
103 |
/* col_ref[j], 1 <= j <= n, is the reference number assigned to
|
alpar@1
|
104 |
a column, which is j-th column of the resultant problem */
|
alpar@1
|
105 |
/*--------------------------------------------------------------*/
|
alpar@1
|
106 |
/* recovered solution segment */
|
alpar@1
|
107 |
int sol;
|
alpar@1
|
108 |
/* solution indicator:
|
alpar@1
|
109 |
GLP_SOL - basic solution
|
alpar@1
|
110 |
GLP_IPT - interior-point solution
|
alpar@1
|
111 |
GLP_MIP - mixed integer solution */
|
alpar@1
|
112 |
int scaling;
|
alpar@1
|
113 |
/* scaling option:
|
alpar@1
|
114 |
GLP_OFF - scaling is disabled
|
alpar@1
|
115 |
GLP_ON - scaling is enabled */
|
alpar@1
|
116 |
int p_stat;
|
alpar@1
|
117 |
/* status of primal basic solution:
|
alpar@1
|
118 |
GLP_UNDEF - primal solution is undefined
|
alpar@1
|
119 |
GLP_FEAS - primal solution is feasible
|
alpar@1
|
120 |
GLP_INFEAS - primal solution is infeasible
|
alpar@1
|
121 |
GLP_NOFEAS - no primal feasible solution exists */
|
alpar@1
|
122 |
int d_stat;
|
alpar@1
|
123 |
/* status of dual basic solution:
|
alpar@1
|
124 |
GLP_UNDEF - dual solution is undefined
|
alpar@1
|
125 |
GLP_FEAS - dual solution is feasible
|
alpar@1
|
126 |
GLP_INFEAS - dual solution is infeasible
|
alpar@1
|
127 |
GLP_NOFEAS - no dual feasible solution exists */
|
alpar@1
|
128 |
int t_stat;
|
alpar@1
|
129 |
/* status of interior-point solution:
|
alpar@1
|
130 |
GLP_UNDEF - interior solution is undefined
|
alpar@1
|
131 |
GLP_OPT - interior solution is optimal */
|
alpar@1
|
132 |
int i_stat;
|
alpar@1
|
133 |
/* status of mixed integer solution:
|
alpar@1
|
134 |
GLP_UNDEF - integer solution is undefined
|
alpar@1
|
135 |
GLP_OPT - integer solution is optimal
|
alpar@1
|
136 |
GLP_FEAS - integer solution is feasible
|
alpar@1
|
137 |
GLP_NOFEAS - no integer solution exists */
|
alpar@1
|
138 |
char *r_stat; /* char r_stat[1+nrows]; */
|
alpar@1
|
139 |
/* r_stat[i], 1 <= i <= nrows, is status of i-th row:
|
alpar@1
|
140 |
GLP_BS - inactive constraint
|
alpar@1
|
141 |
GLP_NL - active constraint on lower bound
|
alpar@1
|
142 |
GLP_NU - active constraint on upper bound
|
alpar@1
|
143 |
GLP_NF - active free row
|
alpar@1
|
144 |
GLP_NS - active equality constraint */
|
alpar@1
|
145 |
char *c_stat; /* char c_stat[1+nrows]; */
|
alpar@1
|
146 |
/* c_stat[j], 1 <= j <= nrows, is status of j-th column:
|
alpar@1
|
147 |
GLP_BS - basic variable
|
alpar@1
|
148 |
GLP_NL - non-basic variable on lower bound
|
alpar@1
|
149 |
GLP_NU - non-basic variable on upper bound
|
alpar@1
|
150 |
GLP_NF - non-basic free variable
|
alpar@1
|
151 |
GLP_NS - non-basic fixed variable */
|
alpar@1
|
152 |
double *r_pi; /* double r_pi[1+nrows]; */
|
alpar@1
|
153 |
/* r_pi[i], 1 <= i <= nrows, is Lagrange multiplier (dual value)
|
alpar@1
|
154 |
for i-th row (constraint) */
|
alpar@1
|
155 |
double *c_value; /* double c_value[1+ncols]; */
|
alpar@1
|
156 |
/* c_value[j], 1 <= j <= ncols, is primal value of j-th column
|
alpar@1
|
157 |
(structural variable) */
|
alpar@1
|
158 |
};
|
alpar@1
|
159 |
|
alpar@1
|
160 |
struct NPPROW
|
alpar@1
|
161 |
{ /* row (constraint) */
|
alpar@1
|
162 |
int i;
|
alpar@1
|
163 |
/* reference number assigned to the row, 1 <= i <= nrows */
|
alpar@1
|
164 |
char *name;
|
alpar@1
|
165 |
/* row name (1 to 255 chars); NULL means no name is assigned to
|
alpar@1
|
166 |
the row */
|
alpar@1
|
167 |
double lb;
|
alpar@1
|
168 |
/* lower bound; -DBL_MAX means the row has no lower bound */
|
alpar@1
|
169 |
double ub;
|
alpar@1
|
170 |
/* upper bound; +DBL_MAX means the row has no upper bound */
|
alpar@1
|
171 |
NPPAIJ *ptr;
|
alpar@1
|
172 |
/* pointer to the linked list of constraint coefficients */
|
alpar@1
|
173 |
int temp;
|
alpar@1
|
174 |
/* working field used by preprocessor routines */
|
alpar@1
|
175 |
NPPROW *prev;
|
alpar@1
|
176 |
/* pointer to previous row in the row list */
|
alpar@1
|
177 |
NPPROW *next;
|
alpar@1
|
178 |
/* pointer to next row in the row list */
|
alpar@1
|
179 |
};
|
alpar@1
|
180 |
|
alpar@1
|
181 |
struct NPPCOL
|
alpar@1
|
182 |
{ /* column (variable) */
|
alpar@1
|
183 |
int j;
|
alpar@1
|
184 |
/* reference number assigned to the column, 1 <= j <= ncols */
|
alpar@1
|
185 |
char *name;
|
alpar@1
|
186 |
/* column name (1 to 255 chars); NULL means no name is assigned
|
alpar@1
|
187 |
to the column */
|
alpar@1
|
188 |
char is_int;
|
alpar@1
|
189 |
/* 0 means continuous variable; 1 means integer variable */
|
alpar@1
|
190 |
double lb;
|
alpar@1
|
191 |
/* lower bound; -DBL_MAX means the column has no lower bound */
|
alpar@1
|
192 |
double ub;
|
alpar@1
|
193 |
/* upper bound; +DBL_MAX means the column has no upper bound */
|
alpar@1
|
194 |
double coef;
|
alpar@1
|
195 |
/* objective coefficient */
|
alpar@1
|
196 |
NPPAIJ *ptr;
|
alpar@1
|
197 |
/* pointer to the linked list of constraint coefficients */
|
alpar@1
|
198 |
int temp;
|
alpar@1
|
199 |
/* working field used by preprocessor routines */
|
alpar@1
|
200 |
#if 1 /* 28/XII-2009 */
|
alpar@1
|
201 |
union
|
alpar@1
|
202 |
{ double ll;
|
alpar@1
|
203 |
/* implied column lower bound */
|
alpar@1
|
204 |
int pos;
|
alpar@1
|
205 |
/* vertex ordinal number corresponding to this binary column
|
alpar@1
|
206 |
in the conflict graph (0, if the vertex does not exist) */
|
alpar@1
|
207 |
} ll;
|
alpar@1
|
208 |
union
|
alpar@1
|
209 |
{ double uu;
|
alpar@1
|
210 |
/* implied column upper bound */
|
alpar@1
|
211 |
int neg;
|
alpar@1
|
212 |
/* vertex ordinal number corresponding to complement of this
|
alpar@1
|
213 |
binary column in the conflict graph (0, if the vertex does
|
alpar@1
|
214 |
not exist) */
|
alpar@1
|
215 |
} uu;
|
alpar@1
|
216 |
#endif
|
alpar@1
|
217 |
NPPCOL *prev;
|
alpar@1
|
218 |
/* pointer to previous column in the column list */
|
alpar@1
|
219 |
NPPCOL *next;
|
alpar@1
|
220 |
/* pointer to next column in the column list */
|
alpar@1
|
221 |
};
|
alpar@1
|
222 |
|
alpar@1
|
223 |
struct NPPAIJ
|
alpar@1
|
224 |
{ /* constraint coefficient */
|
alpar@1
|
225 |
NPPROW *row;
|
alpar@1
|
226 |
/* pointer to corresponding row */
|
alpar@1
|
227 |
NPPCOL *col;
|
alpar@1
|
228 |
/* pointer to corresponding column */
|
alpar@1
|
229 |
double val;
|
alpar@1
|
230 |
/* (non-zero) coefficient value */
|
alpar@1
|
231 |
NPPAIJ *r_prev;
|
alpar@1
|
232 |
/* pointer to previous coefficient in the same row */
|
alpar@1
|
233 |
NPPAIJ *r_next;
|
alpar@1
|
234 |
/* pointer to next coefficient in the same row */
|
alpar@1
|
235 |
NPPAIJ *c_prev;
|
alpar@1
|
236 |
/* pointer to previous coefficient in the same column */
|
alpar@1
|
237 |
NPPAIJ *c_next;
|
alpar@1
|
238 |
/* pointer to next coefficient in the same column */
|
alpar@1
|
239 |
};
|
alpar@1
|
240 |
|
alpar@1
|
241 |
struct NPPTSE
|
alpar@1
|
242 |
{ /* transformation stack entry */
|
alpar@1
|
243 |
int (*func)(NPP *npp, void *info);
|
alpar@1
|
244 |
/* pointer to routine performing back transformation */
|
alpar@1
|
245 |
void *info;
|
alpar@1
|
246 |
/* pointer to specific info (depends on the transformation) */
|
alpar@1
|
247 |
NPPTSE *link;
|
alpar@1
|
248 |
/* pointer to another entry created *before* this entry */
|
alpar@1
|
249 |
};
|
alpar@1
|
250 |
|
alpar@1
|
251 |
struct NPPLFE
|
alpar@1
|
252 |
{ /* linear form element */
|
alpar@1
|
253 |
int ref;
|
alpar@1
|
254 |
/* row/column reference number */
|
alpar@1
|
255 |
double val;
|
alpar@1
|
256 |
/* (non-zero) coefficient value */
|
alpar@1
|
257 |
NPPLFE *next;
|
alpar@1
|
258 |
/* pointer to another element */
|
alpar@1
|
259 |
};
|
alpar@1
|
260 |
|
alpar@1
|
261 |
#define npp_create_wksp _glp_npp_create_wksp
|
alpar@1
|
262 |
NPP *npp_create_wksp(void);
|
alpar@1
|
263 |
/* create LP/MIP preprocessor workspace */
|
alpar@1
|
264 |
|
alpar@1
|
265 |
#define npp_insert_row _glp_npp_insert_row
|
alpar@1
|
266 |
void npp_insert_row(NPP *npp, NPPROW *row, int where);
|
alpar@1
|
267 |
/* insert row to the row list */
|
alpar@1
|
268 |
|
alpar@1
|
269 |
#define npp_remove_row _glp_npp_remove_row
|
alpar@1
|
270 |
void npp_remove_row(NPP *npp, NPPROW *row);
|
alpar@1
|
271 |
/* remove row from the row list */
|
alpar@1
|
272 |
|
alpar@1
|
273 |
#define npp_activate_row _glp_npp_activate_row
|
alpar@1
|
274 |
void npp_activate_row(NPP *npp, NPPROW *row);
|
alpar@1
|
275 |
/* make row active */
|
alpar@1
|
276 |
|
alpar@1
|
277 |
#define npp_deactivate_row _glp_npp_deactivate_row
|
alpar@1
|
278 |
void npp_deactivate_row(NPP *npp, NPPROW *row);
|
alpar@1
|
279 |
/* make row inactive */
|
alpar@1
|
280 |
|
alpar@1
|
281 |
#define npp_insert_col _glp_npp_insert_col
|
alpar@1
|
282 |
void npp_insert_col(NPP *npp, NPPCOL *col, int where);
|
alpar@1
|
283 |
/* insert column to the column list */
|
alpar@1
|
284 |
|
alpar@1
|
285 |
#define npp_remove_col _glp_npp_remove_col
|
alpar@1
|
286 |
void npp_remove_col(NPP *npp, NPPCOL *col);
|
alpar@1
|
287 |
/* remove column from the column list */
|
alpar@1
|
288 |
|
alpar@1
|
289 |
#define npp_activate_col _glp_npp_activate_col
|
alpar@1
|
290 |
void npp_activate_col(NPP *npp, NPPCOL *col);
|
alpar@1
|
291 |
/* make column active */
|
alpar@1
|
292 |
|
alpar@1
|
293 |
#define npp_deactivate_col _glp_npp_deactivate_col
|
alpar@1
|
294 |
void npp_deactivate_col(NPP *npp, NPPCOL *col);
|
alpar@1
|
295 |
/* make column inactive */
|
alpar@1
|
296 |
|
alpar@1
|
297 |
#define npp_add_row _glp_npp_add_row
|
alpar@1
|
298 |
NPPROW *npp_add_row(NPP *npp);
|
alpar@1
|
299 |
/* add new row to the current problem */
|
alpar@1
|
300 |
|
alpar@1
|
301 |
#define npp_add_col _glp_npp_add_col
|
alpar@1
|
302 |
NPPCOL *npp_add_col(NPP *npp);
|
alpar@1
|
303 |
/* add new column to the current problem */
|
alpar@1
|
304 |
|
alpar@1
|
305 |
#define npp_add_aij _glp_npp_add_aij
|
alpar@1
|
306 |
NPPAIJ *npp_add_aij(NPP *npp, NPPROW *row, NPPCOL *col, double val);
|
alpar@1
|
307 |
/* add new element to the constraint matrix */
|
alpar@1
|
308 |
|
alpar@1
|
309 |
#define npp_row_nnz _glp_npp_row_nnz
|
alpar@1
|
310 |
int npp_row_nnz(NPP *npp, NPPROW *row);
|
alpar@1
|
311 |
/* count number of non-zero coefficients in row */
|
alpar@1
|
312 |
|
alpar@1
|
313 |
#define npp_col_nnz _glp_npp_col_nnz
|
alpar@1
|
314 |
int npp_col_nnz(NPP *npp, NPPCOL *col);
|
alpar@1
|
315 |
/* count number of non-zero coefficients in column */
|
alpar@1
|
316 |
|
alpar@1
|
317 |
#define npp_push_tse _glp_npp_push_tse
|
alpar@1
|
318 |
void *npp_push_tse(NPP *npp, int (*func)(NPP *npp, void *info),
|
alpar@1
|
319 |
int size);
|
alpar@1
|
320 |
/* push new entry to the transformation stack */
|
alpar@1
|
321 |
|
alpar@1
|
322 |
#define npp_erase_row _glp_npp_erase_row
|
alpar@1
|
323 |
void npp_erase_row(NPP *npp, NPPROW *row);
|
alpar@1
|
324 |
/* erase row content to make it empty */
|
alpar@1
|
325 |
|
alpar@1
|
326 |
#define npp_del_row _glp_npp_del_row
|
alpar@1
|
327 |
void npp_del_row(NPP *npp, NPPROW *row);
|
alpar@1
|
328 |
/* remove row from the current problem */
|
alpar@1
|
329 |
|
alpar@1
|
330 |
#define npp_del_col _glp_npp_del_col
|
alpar@1
|
331 |
void npp_del_col(NPP *npp, NPPCOL *col);
|
alpar@1
|
332 |
/* remove column from the current problem */
|
alpar@1
|
333 |
|
alpar@1
|
334 |
#define npp_del_aij _glp_npp_del_aij
|
alpar@1
|
335 |
void npp_del_aij(NPP *npp, NPPAIJ *aij);
|
alpar@1
|
336 |
/* remove element from the constraint matrix */
|
alpar@1
|
337 |
|
alpar@1
|
338 |
#define npp_load_prob _glp_npp_load_prob
|
alpar@1
|
339 |
void npp_load_prob(NPP *npp, glp_prob *orig, int names, int sol,
|
alpar@1
|
340 |
int scaling);
|
alpar@1
|
341 |
/* load original problem into the preprocessor workspace */
|
alpar@1
|
342 |
|
alpar@1
|
343 |
#define npp_build_prob _glp_npp_build_prob
|
alpar@1
|
344 |
void npp_build_prob(NPP *npp, glp_prob *prob);
|
alpar@1
|
345 |
/* build resultant (preprocessed) problem */
|
alpar@1
|
346 |
|
alpar@1
|
347 |
#define npp_postprocess _glp_npp_postprocess
|
alpar@1
|
348 |
void npp_postprocess(NPP *npp, glp_prob *prob);
|
alpar@1
|
349 |
/* postprocess solution from the resultant problem */
|
alpar@1
|
350 |
|
alpar@1
|
351 |
#define npp_unload_sol _glp_npp_unload_sol
|
alpar@1
|
352 |
void npp_unload_sol(NPP *npp, glp_prob *orig);
|
alpar@1
|
353 |
/* store solution to the original problem */
|
alpar@1
|
354 |
|
alpar@1
|
355 |
#define npp_delete_wksp _glp_npp_delete_wksp
|
alpar@1
|
356 |
void npp_delete_wksp(NPP *npp);
|
alpar@1
|
357 |
/* delete LP/MIP preprocessor workspace */
|
alpar@1
|
358 |
|
alpar@1
|
359 |
#define npp_error()
|
alpar@1
|
360 |
|
alpar@1
|
361 |
#define npp_free_row _glp_npp_free_row
|
alpar@1
|
362 |
void npp_free_row(NPP *npp, NPPROW *p);
|
alpar@1
|
363 |
/* process free (unbounded) row */
|
alpar@1
|
364 |
|
alpar@1
|
365 |
#define npp_geq_row _glp_npp_geq_row
|
alpar@1
|
366 |
void npp_geq_row(NPP *npp, NPPROW *p);
|
alpar@1
|
367 |
/* process row of 'not less than' type */
|
alpar@1
|
368 |
|
alpar@1
|
369 |
#define npp_leq_row _glp_npp_leq_row
|
alpar@1
|
370 |
void npp_leq_row(NPP *npp, NPPROW *p);
|
alpar@1
|
371 |
/* process row of 'not greater than' type */
|
alpar@1
|
372 |
|
alpar@1
|
373 |
#define npp_free_col _glp_npp_free_col
|
alpar@1
|
374 |
void npp_free_col(NPP *npp, NPPCOL *q);
|
alpar@1
|
375 |
/* process free (unbounded) column */
|
alpar@1
|
376 |
|
alpar@1
|
377 |
#define npp_lbnd_col _glp_npp_lbnd_col
|
alpar@1
|
378 |
void npp_lbnd_col(NPP *npp, NPPCOL *q);
|
alpar@1
|
379 |
/* process column with (non-zero) lower bound */
|
alpar@1
|
380 |
|
alpar@1
|
381 |
#define npp_ubnd_col _glp_npp_ubnd_col
|
alpar@1
|
382 |
void npp_ubnd_col(NPP *npp, NPPCOL *q);
|
alpar@1
|
383 |
/* process column with upper bound */
|
alpar@1
|
384 |
|
alpar@1
|
385 |
#define npp_dbnd_col _glp_npp_dbnd_col
|
alpar@1
|
386 |
void npp_dbnd_col(NPP *npp, NPPCOL *q);
|
alpar@1
|
387 |
/* process non-negative column with upper bound */
|
alpar@1
|
388 |
|
alpar@1
|
389 |
#define npp_fixed_col _glp_npp_fixed_col
|
alpar@1
|
390 |
void npp_fixed_col(NPP *npp, NPPCOL *q);
|
alpar@1
|
391 |
/* process fixed column */
|
alpar@1
|
392 |
|
alpar@1
|
393 |
#define npp_make_equality _glp_npp_make_equality
|
alpar@1
|
394 |
int npp_make_equality(NPP *npp, NPPROW *p);
|
alpar@1
|
395 |
/* process row with almost identical bounds */
|
alpar@1
|
396 |
|
alpar@1
|
397 |
#define npp_make_fixed _glp_npp_make_fixed
|
alpar@1
|
398 |
int npp_make_fixed(NPP *npp, NPPCOL *q);
|
alpar@1
|
399 |
/* process column with almost identical bounds */
|
alpar@1
|
400 |
|
alpar@1
|
401 |
#define npp_empty_row _glp_npp_empty_row
|
alpar@1
|
402 |
int npp_empty_row(NPP *npp, NPPROW *p);
|
alpar@1
|
403 |
/* process empty row */
|
alpar@1
|
404 |
|
alpar@1
|
405 |
#define npp_empty_col _glp_npp_empty_col
|
alpar@1
|
406 |
int npp_empty_col(NPP *npp, NPPCOL *q);
|
alpar@1
|
407 |
/* process empty column */
|
alpar@1
|
408 |
|
alpar@1
|
409 |
#define npp_implied_value _glp_npp_implied_value
|
alpar@1
|
410 |
int npp_implied_value(NPP *npp, NPPCOL *q, double s);
|
alpar@1
|
411 |
/* process implied column value */
|
alpar@1
|
412 |
|
alpar@1
|
413 |
#define npp_eq_singlet _glp_npp_eq_singlet
|
alpar@1
|
414 |
int npp_eq_singlet(NPP *npp, NPPROW *p);
|
alpar@1
|
415 |
/* process row singleton (equality constraint) */
|
alpar@1
|
416 |
|
alpar@1
|
417 |
#define npp_implied_lower _glp_npp_implied_lower
|
alpar@1
|
418 |
int npp_implied_lower(NPP *npp, NPPCOL *q, double l);
|
alpar@1
|
419 |
/* process implied column lower bound */
|
alpar@1
|
420 |
|
alpar@1
|
421 |
#define npp_implied_upper _glp_npp_implied_upper
|
alpar@1
|
422 |
int npp_implied_upper(NPP *npp, NPPCOL *q, double u);
|
alpar@1
|
423 |
/* process implied upper bound of column */
|
alpar@1
|
424 |
|
alpar@1
|
425 |
#define npp_ineq_singlet _glp_npp_ineq_singlet
|
alpar@1
|
426 |
int npp_ineq_singlet(NPP *npp, NPPROW *p);
|
alpar@1
|
427 |
/* process row singleton (inequality constraint) */
|
alpar@1
|
428 |
|
alpar@1
|
429 |
#define npp_implied_slack _glp_npp_implied_slack
|
alpar@1
|
430 |
void npp_implied_slack(NPP *npp, NPPCOL *q);
|
alpar@1
|
431 |
/* process column singleton (implied slack variable) */
|
alpar@1
|
432 |
|
alpar@1
|
433 |
#define npp_implied_free _glp_npp_implied_free
|
alpar@1
|
434 |
int npp_implied_free(NPP *npp, NPPCOL *q);
|
alpar@1
|
435 |
/* process column singleton (implied free variable) */
|
alpar@1
|
436 |
|
alpar@1
|
437 |
#define npp_eq_doublet _glp_npp_eq_doublet
|
alpar@1
|
438 |
NPPCOL *npp_eq_doublet(NPP *npp, NPPROW *p);
|
alpar@1
|
439 |
/* process row doubleton (equality constraint) */
|
alpar@1
|
440 |
|
alpar@1
|
441 |
#define npp_forcing_row _glp_npp_forcing_row
|
alpar@1
|
442 |
int npp_forcing_row(NPP *npp, NPPROW *p, int at);
|
alpar@1
|
443 |
/* process forcing row */
|
alpar@1
|
444 |
|
alpar@1
|
445 |
#define npp_analyze_row _glp_npp_analyze_row
|
alpar@1
|
446 |
int npp_analyze_row(NPP *npp, NPPROW *p);
|
alpar@1
|
447 |
/* perform general row analysis */
|
alpar@1
|
448 |
|
alpar@1
|
449 |
#define npp_inactive_bound _glp_npp_inactive_bound
|
alpar@1
|
450 |
void npp_inactive_bound(NPP *npp, NPPROW *p, int which);
|
alpar@1
|
451 |
/* remove row lower/upper inactive bound */
|
alpar@1
|
452 |
|
alpar@1
|
453 |
#define npp_implied_bounds _glp_npp_implied_bounds
|
alpar@1
|
454 |
void npp_implied_bounds(NPP *npp, NPPROW *p);
|
alpar@1
|
455 |
/* determine implied column bounds */
|
alpar@1
|
456 |
|
alpar@1
|
457 |
#define npp_binarize_prob _glp_npp_binarize_prob
|
alpar@1
|
458 |
int npp_binarize_prob(NPP *npp);
|
alpar@1
|
459 |
/* binarize MIP problem */
|
alpar@1
|
460 |
|
alpar@1
|
461 |
#define npp_is_packing _glp_npp_is_packing
|
alpar@1
|
462 |
int npp_is_packing(NPP *npp, NPPROW *row);
|
alpar@1
|
463 |
/* test if constraint is packing inequality */
|
alpar@1
|
464 |
|
alpar@1
|
465 |
#define npp_hidden_packing _glp_npp_hidden_packing
|
alpar@1
|
466 |
int npp_hidden_packing(NPP *npp, NPPROW *row);
|
alpar@1
|
467 |
/* identify hidden packing inequality */
|
alpar@1
|
468 |
|
alpar@1
|
469 |
#define npp_implied_packing _glp_npp_implied_packing
|
alpar@1
|
470 |
int npp_implied_packing(NPP *npp, NPPROW *row, int which,
|
alpar@1
|
471 |
NPPCOL *var[], char set[]);
|
alpar@1
|
472 |
/* identify implied packing inequality */
|
alpar@1
|
473 |
|
alpar@1
|
474 |
#define npp_is_covering _glp_npp_is_covering
|
alpar@1
|
475 |
int npp_is_covering(NPP *npp, NPPROW *row);
|
alpar@1
|
476 |
/* test if constraint is covering inequality */
|
alpar@1
|
477 |
|
alpar@1
|
478 |
#define npp_hidden_covering _glp_npp_hidden_covering
|
alpar@1
|
479 |
int npp_hidden_covering(NPP *npp, NPPROW *row);
|
alpar@1
|
480 |
/* identify hidden covering inequality */
|
alpar@1
|
481 |
|
alpar@1
|
482 |
#define npp_is_partitioning _glp_npp_is_partitioning
|
alpar@1
|
483 |
int npp_is_partitioning(NPP *npp, NPPROW *row);
|
alpar@1
|
484 |
/* test if constraint is partitioning equality */
|
alpar@1
|
485 |
|
alpar@1
|
486 |
#define npp_reduce_ineq_coef _glp_npp_reduce_ineq_coef
|
alpar@1
|
487 |
int npp_reduce_ineq_coef(NPP *npp, NPPROW *row);
|
alpar@1
|
488 |
/* reduce inequality constraint coefficients */
|
alpar@1
|
489 |
|
alpar@1
|
490 |
#define npp_clean_prob _glp_npp_clean_prob
|
alpar@1
|
491 |
void npp_clean_prob(NPP *npp);
|
alpar@1
|
492 |
/* perform initial LP/MIP processing */
|
alpar@1
|
493 |
|
alpar@1
|
494 |
#define npp_process_row _glp_npp_process_row
|
alpar@1
|
495 |
int npp_process_row(NPP *npp, NPPROW *row, int hard);
|
alpar@1
|
496 |
/* perform basic row processing */
|
alpar@1
|
497 |
|
alpar@1
|
498 |
#define npp_improve_bounds _glp_npp_improve_bounds
|
alpar@1
|
499 |
int npp_improve_bounds(NPP *npp, NPPROW *row, int flag);
|
alpar@1
|
500 |
/* improve current column bounds */
|
alpar@1
|
501 |
|
alpar@1
|
502 |
#define npp_process_col _glp_npp_process_col
|
alpar@1
|
503 |
int npp_process_col(NPP *npp, NPPCOL *col);
|
alpar@1
|
504 |
/* perform basic column processing */
|
alpar@1
|
505 |
|
alpar@1
|
506 |
#define npp_process_prob _glp_npp_process_prob
|
alpar@1
|
507 |
int npp_process_prob(NPP *npp, int hard);
|
alpar@1
|
508 |
/* perform basic LP/MIP processing */
|
alpar@1
|
509 |
|
alpar@1
|
510 |
#define npp_simplex _glp_npp_simplex
|
alpar@1
|
511 |
int npp_simplex(NPP *npp, const glp_smcp *parm);
|
alpar@1
|
512 |
/* process LP prior to applying primal/dual simplex method */
|
alpar@1
|
513 |
|
alpar@1
|
514 |
#define npp_integer _glp_npp_integer
|
alpar@1
|
515 |
int npp_integer(NPP *npp, const glp_iocp *parm);
|
alpar@1
|
516 |
/* process MIP prior to applying branch-and-bound method */
|
alpar@1
|
517 |
|
alpar@1
|
518 |
#endif
|
alpar@1
|
519 |
|
alpar@1
|
520 |
/* eof */
|