rev |
line source |
alpar@9
|
1 /* glpapi.h (application program interface) */
|
alpar@9
|
2
|
alpar@9
|
3 /***********************************************************************
|
alpar@9
|
4 * This code is part of GLPK (GNU Linear Programming Kit).
|
alpar@9
|
5 *
|
alpar@9
|
6 * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
alpar@9
|
7 * 2009, 2010, 2011 Andrew Makhorin, Department for Applied Informatics,
|
alpar@9
|
8 * Moscow Aviation Institute, Moscow, Russia. All rights reserved.
|
alpar@9
|
9 * E-mail: <mao@gnu.org>.
|
alpar@9
|
10 *
|
alpar@9
|
11 * GLPK is free software: you can redistribute it and/or modify it
|
alpar@9
|
12 * under the terms of the GNU General Public License as published by
|
alpar@9
|
13 * the Free Software Foundation, either version 3 of the License, or
|
alpar@9
|
14 * (at your option) any later version.
|
alpar@9
|
15 *
|
alpar@9
|
16 * GLPK is distributed in the hope that it will be useful, but WITHOUT
|
alpar@9
|
17 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
alpar@9
|
18 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
alpar@9
|
19 * License for more details.
|
alpar@9
|
20 *
|
alpar@9
|
21 * You should have received a copy of the GNU General Public License
|
alpar@9
|
22 * along with GLPK. If not, see <http://www.gnu.org/licenses/>.
|
alpar@9
|
23 ***********************************************************************/
|
alpar@9
|
24
|
alpar@9
|
25 #ifndef GLPAPI_H
|
alpar@9
|
26 #define GLPAPI_H
|
alpar@9
|
27
|
alpar@9
|
28 #define GLP_PROB_DEFINED
|
alpar@9
|
29 typedef struct glp_prob glp_prob;
|
alpar@9
|
30
|
alpar@9
|
31 #include "glpk.h"
|
alpar@9
|
32 #include "glpavl.h"
|
alpar@9
|
33 #include "glpbfd.h"
|
alpar@9
|
34
|
alpar@9
|
35 typedef struct GLPROW GLPROW;
|
alpar@9
|
36 typedef struct GLPCOL GLPCOL;
|
alpar@9
|
37 typedef struct GLPAIJ GLPAIJ;
|
alpar@9
|
38
|
alpar@9
|
39 #define GLP_PROB_MAGIC 0xD7D9D6C2
|
alpar@9
|
40
|
alpar@9
|
41 struct glp_prob
|
alpar@9
|
42 { /* LP/MIP problem object */
|
alpar@9
|
43 unsigned magic;
|
alpar@9
|
44 /* magic value used for debugging */
|
alpar@9
|
45 DMP *pool;
|
alpar@9
|
46 /* memory pool to store problem object components */
|
alpar@9
|
47 glp_tree *tree;
|
alpar@9
|
48 /* pointer to the search tree; set by the MIP solver when this
|
alpar@9
|
49 object is used in the tree as a core MIP object */
|
alpar@9
|
50 void *parms;
|
alpar@9
|
51 /* reserved for backward compatibility */
|
alpar@9
|
52 /*--------------------------------------------------------------*/
|
alpar@9
|
53 /* LP/MIP data */
|
alpar@9
|
54 char *name;
|
alpar@9
|
55 /* problem name (1 to 255 chars); NULL means no name is assigned
|
alpar@9
|
56 to the problem */
|
alpar@9
|
57 char *obj;
|
alpar@9
|
58 /* objective function name (1 to 255 chars); NULL means no name
|
alpar@9
|
59 is assigned to the objective function */
|
alpar@9
|
60 int dir;
|
alpar@9
|
61 /* optimization direction flag (objective "sense"):
|
alpar@9
|
62 GLP_MIN - minimization
|
alpar@9
|
63 GLP_MAX - maximization */
|
alpar@9
|
64 double c0;
|
alpar@9
|
65 /* constant term of the objective function ("shift") */
|
alpar@9
|
66 int m_max;
|
alpar@9
|
67 /* length of the array of rows (enlarged automatically) */
|
alpar@9
|
68 int n_max;
|
alpar@9
|
69 /* length of the array of columns (enlarged automatically) */
|
alpar@9
|
70 int m;
|
alpar@9
|
71 /* number of rows, 0 <= m <= m_max */
|
alpar@9
|
72 int n;
|
alpar@9
|
73 /* number of columns, 0 <= n <= n_max */
|
alpar@9
|
74 int nnz;
|
alpar@9
|
75 /* number of non-zero constraint coefficients, nnz >= 0 */
|
alpar@9
|
76 GLPROW **row; /* GLPROW *row[1+m_max]; */
|
alpar@9
|
77 /* row[i], 1 <= i <= m, is a pointer to i-th row */
|
alpar@9
|
78 GLPCOL **col; /* GLPCOL *col[1+n_max]; */
|
alpar@9
|
79 /* col[j], 1 <= j <= n, is a pointer to j-th column */
|
alpar@9
|
80 AVL *r_tree;
|
alpar@9
|
81 /* row index to find rows by their names; NULL means this index
|
alpar@9
|
82 does not exist */
|
alpar@9
|
83 AVL *c_tree;
|
alpar@9
|
84 /* column index to find columns by their names; NULL means this
|
alpar@9
|
85 index does not exist */
|
alpar@9
|
86 /*--------------------------------------------------------------*/
|
alpar@9
|
87 /* basis factorization (LP) */
|
alpar@9
|
88 int valid;
|
alpar@9
|
89 /* the factorization is valid only if this flag is set */
|
alpar@9
|
90 int *head; /* int head[1+m_max]; */
|
alpar@9
|
91 /* basis header (valid only if the factorization is valid);
|
alpar@9
|
92 head[i] = k is the ordinal number of auxiliary (1 <= k <= m)
|
alpar@9
|
93 or structural (m+1 <= k <= m+n) variable which corresponds to
|
alpar@9
|
94 i-th basic variable xB[i], 1 <= i <= m */
|
alpar@9
|
95 glp_bfcp *bfcp;
|
alpar@9
|
96 /* basis factorization control parameters; may be NULL */
|
alpar@9
|
97 BFD *bfd; /* BFD bfd[1:m,1:m]; */
|
alpar@9
|
98 /* basis factorization driver; may be NULL */
|
alpar@9
|
99 /*--------------------------------------------------------------*/
|
alpar@9
|
100 /* basic solution (LP) */
|
alpar@9
|
101 int pbs_stat;
|
alpar@9
|
102 /* primal basic solution status:
|
alpar@9
|
103 GLP_UNDEF - primal solution is undefined
|
alpar@9
|
104 GLP_FEAS - primal solution is feasible
|
alpar@9
|
105 GLP_INFEAS - primal solution is infeasible
|
alpar@9
|
106 GLP_NOFEAS - no primal feasible solution exists */
|
alpar@9
|
107 int dbs_stat;
|
alpar@9
|
108 /* dual basic solution status:
|
alpar@9
|
109 GLP_UNDEF - dual solution is undefined
|
alpar@9
|
110 GLP_FEAS - dual solution is feasible
|
alpar@9
|
111 GLP_INFEAS - dual solution is infeasible
|
alpar@9
|
112 GLP_NOFEAS - no dual feasible solution exists */
|
alpar@9
|
113 double obj_val;
|
alpar@9
|
114 /* objective function value */
|
alpar@9
|
115 int it_cnt;
|
alpar@9
|
116 /* simplex method iteration count; increased by one on performing
|
alpar@9
|
117 one simplex iteration */
|
alpar@9
|
118 int some;
|
alpar@9
|
119 /* ordinal number of some auxiliary or structural variable having
|
alpar@9
|
120 certain property, 0 <= some <= m+n */
|
alpar@9
|
121 /*--------------------------------------------------------------*/
|
alpar@9
|
122 /* interior-point solution (LP) */
|
alpar@9
|
123 int ipt_stat;
|
alpar@9
|
124 /* interior-point solution status:
|
alpar@9
|
125 GLP_UNDEF - interior solution is undefined
|
alpar@9
|
126 GLP_OPT - interior solution is optimal
|
alpar@9
|
127 GLP_INFEAS - interior solution is infeasible
|
alpar@9
|
128 GLP_NOFEAS - no feasible solution exists */
|
alpar@9
|
129 double ipt_obj;
|
alpar@9
|
130 /* objective function value */
|
alpar@9
|
131 /*--------------------------------------------------------------*/
|
alpar@9
|
132 /* integer solution (MIP) */
|
alpar@9
|
133 int mip_stat;
|
alpar@9
|
134 /* integer solution status:
|
alpar@9
|
135 GLP_UNDEF - integer solution is undefined
|
alpar@9
|
136 GLP_OPT - integer solution is optimal
|
alpar@9
|
137 GLP_FEAS - integer solution is feasible
|
alpar@9
|
138 GLP_NOFEAS - no integer solution exists */
|
alpar@9
|
139 double mip_obj;
|
alpar@9
|
140 /* objective function value */
|
alpar@9
|
141 };
|
alpar@9
|
142
|
alpar@9
|
143 struct GLPROW
|
alpar@9
|
144 { /* LP/MIP row (auxiliary variable) */
|
alpar@9
|
145 int i;
|
alpar@9
|
146 /* ordinal number (1 to m) assigned to this row */
|
alpar@9
|
147 char *name;
|
alpar@9
|
148 /* row name (1 to 255 chars); NULL means no name is assigned to
|
alpar@9
|
149 this row */
|
alpar@9
|
150 AVLNODE *node;
|
alpar@9
|
151 /* pointer to corresponding node in the row index; NULL means
|
alpar@9
|
152 that either the row index does not exist or this row has no
|
alpar@9
|
153 name assigned */
|
alpar@9
|
154 #if 1 /* 20/IX-2008 */
|
alpar@9
|
155 int level;
|
alpar@9
|
156 unsigned char origin;
|
alpar@9
|
157 unsigned char klass;
|
alpar@9
|
158 #endif
|
alpar@9
|
159 int type;
|
alpar@9
|
160 /* type of the auxiliary variable:
|
alpar@9
|
161 GLP_FR - free variable
|
alpar@9
|
162 GLP_LO - variable with lower bound
|
alpar@9
|
163 GLP_UP - variable with upper bound
|
alpar@9
|
164 GLP_DB - double-bounded variable
|
alpar@9
|
165 GLP_FX - fixed variable */
|
alpar@9
|
166 double lb; /* non-scaled */
|
alpar@9
|
167 /* lower bound; if the row has no lower bound, lb is zero */
|
alpar@9
|
168 double ub; /* non-scaled */
|
alpar@9
|
169 /* upper bound; if the row has no upper bound, ub is zero */
|
alpar@9
|
170 /* if the row type is GLP_FX, ub is equal to lb */
|
alpar@9
|
171 GLPAIJ *ptr; /* non-scaled */
|
alpar@9
|
172 /* pointer to doubly linked list of constraint coefficients which
|
alpar@9
|
173 are placed in this row */
|
alpar@9
|
174 double rii;
|
alpar@9
|
175 /* diagonal element r[i,i] of scaling matrix R for this row;
|
alpar@9
|
176 if the scaling is not used, r[i,i] is 1 */
|
alpar@9
|
177 int stat;
|
alpar@9
|
178 /* status of the auxiliary variable:
|
alpar@9
|
179 GLP_BS - basic variable
|
alpar@9
|
180 GLP_NL - non-basic variable on lower bound
|
alpar@9
|
181 GLP_NU - non-basic variable on upper bound
|
alpar@9
|
182 GLP_NF - non-basic free variable
|
alpar@9
|
183 GLP_NS - non-basic fixed variable */
|
alpar@9
|
184 int bind;
|
alpar@9
|
185 /* if the auxiliary variable is basic, head[bind] refers to this
|
alpar@9
|
186 row, otherwise, bind is 0; this attribute is valid only if the
|
alpar@9
|
187 basis factorization is valid */
|
alpar@9
|
188 double prim; /* non-scaled */
|
alpar@9
|
189 /* primal value of the auxiliary variable in basic solution */
|
alpar@9
|
190 double dual; /* non-scaled */
|
alpar@9
|
191 /* dual value of the auxiliary variable in basic solution */
|
alpar@9
|
192 double pval; /* non-scaled */
|
alpar@9
|
193 /* primal value of the auxiliary variable in interior solution */
|
alpar@9
|
194 double dval; /* non-scaled */
|
alpar@9
|
195 /* dual value of the auxiliary variable in interior solution */
|
alpar@9
|
196 double mipx; /* non-scaled */
|
alpar@9
|
197 /* primal value of the auxiliary variable in integer solution */
|
alpar@9
|
198 };
|
alpar@9
|
199
|
alpar@9
|
200 struct GLPCOL
|
alpar@9
|
201 { /* LP/MIP column (structural variable) */
|
alpar@9
|
202 int j;
|
alpar@9
|
203 /* ordinal number (1 to n) assigned to this column */
|
alpar@9
|
204 char *name;
|
alpar@9
|
205 /* column name (1 to 255 chars); NULL means no name is assigned
|
alpar@9
|
206 to this column */
|
alpar@9
|
207 AVLNODE *node;
|
alpar@9
|
208 /* pointer to corresponding node in the column index; NULL means
|
alpar@9
|
209 that either the column index does not exist or the column has
|
alpar@9
|
210 no name assigned */
|
alpar@9
|
211 int kind;
|
alpar@9
|
212 /* kind of the structural variable:
|
alpar@9
|
213 GLP_CV - continuous variable
|
alpar@9
|
214 GLP_IV - integer or binary variable */
|
alpar@9
|
215 int type;
|
alpar@9
|
216 /* type of the structural variable:
|
alpar@9
|
217 GLP_FR - free variable
|
alpar@9
|
218 GLP_LO - variable with lower bound
|
alpar@9
|
219 GLP_UP - variable with upper bound
|
alpar@9
|
220 GLP_DB - double-bounded variable
|
alpar@9
|
221 GLP_FX - fixed variable */
|
alpar@9
|
222 double lb; /* non-scaled */
|
alpar@9
|
223 /* lower bound; if the column has no lower bound, lb is zero */
|
alpar@9
|
224 double ub; /* non-scaled */
|
alpar@9
|
225 /* upper bound; if the column has no upper bound, ub is zero */
|
alpar@9
|
226 /* if the column type is GLP_FX, ub is equal to lb */
|
alpar@9
|
227 double coef; /* non-scaled */
|
alpar@9
|
228 /* objective coefficient at the structural variable */
|
alpar@9
|
229 GLPAIJ *ptr; /* non-scaled */
|
alpar@9
|
230 /* pointer to doubly linked list of constraint coefficients which
|
alpar@9
|
231 are placed in this column */
|
alpar@9
|
232 double sjj;
|
alpar@9
|
233 /* diagonal element s[j,j] of scaling matrix S for this column;
|
alpar@9
|
234 if the scaling is not used, s[j,j] is 1 */
|
alpar@9
|
235 int stat;
|
alpar@9
|
236 /* status of the structural variable:
|
alpar@9
|
237 GLP_BS - basic variable
|
alpar@9
|
238 GLP_NL - non-basic variable on lower bound
|
alpar@9
|
239 GLP_NU - non-basic variable on upper bound
|
alpar@9
|
240 GLP_NF - non-basic free variable
|
alpar@9
|
241 GLP_NS - non-basic fixed variable */
|
alpar@9
|
242 int bind;
|
alpar@9
|
243 /* if the structural variable is basic, head[bind] refers to
|
alpar@9
|
244 this column; otherwise, bind is 0; this attribute is valid only
|
alpar@9
|
245 if the basis factorization is valid */
|
alpar@9
|
246 double prim; /* non-scaled */
|
alpar@9
|
247 /* primal value of the structural variable in basic solution */
|
alpar@9
|
248 double dual; /* non-scaled */
|
alpar@9
|
249 /* dual value of the structural variable in basic solution */
|
alpar@9
|
250 double pval; /* non-scaled */
|
alpar@9
|
251 /* primal value of the structural variable in interior solution */
|
alpar@9
|
252 double dval; /* non-scaled */
|
alpar@9
|
253 /* dual value of the structural variable in interior solution */
|
alpar@9
|
254 double mipx; /* non-scaled */
|
alpar@9
|
255 /* primal value of the structural variable in integer solution */
|
alpar@9
|
256 };
|
alpar@9
|
257
|
alpar@9
|
258 struct GLPAIJ
|
alpar@9
|
259 { /* constraint coefficient a[i,j] */
|
alpar@9
|
260 GLPROW *row;
|
alpar@9
|
261 /* pointer to row, where this coefficient is placed */
|
alpar@9
|
262 GLPCOL *col;
|
alpar@9
|
263 /* pointer to column, where this coefficient is placed */
|
alpar@9
|
264 double val;
|
alpar@9
|
265 /* numeric (non-zero) value of this coefficient */
|
alpar@9
|
266 GLPAIJ *r_prev;
|
alpar@9
|
267 /* pointer to previous coefficient in the same row */
|
alpar@9
|
268 GLPAIJ *r_next;
|
alpar@9
|
269 /* pointer to next coefficient in the same row */
|
alpar@9
|
270 GLPAIJ *c_prev;
|
alpar@9
|
271 /* pointer to previous coefficient in the same column */
|
alpar@9
|
272 GLPAIJ *c_next;
|
alpar@9
|
273 /* pointer to next coefficient in the same column */
|
alpar@9
|
274 };
|
alpar@9
|
275
|
alpar@9
|
276 void _glp_check_kkt(glp_prob *P, int sol, int cond, double *ae_max,
|
alpar@9
|
277 int *ae_ind, double *re_max, int *re_ind);
|
alpar@9
|
278 /* check feasibility and optimality conditions */
|
alpar@9
|
279
|
alpar@9
|
280 #define lpx_put_solution _glp_put_solution
|
alpar@9
|
281 void lpx_put_solution(glp_prob *lp, int inval, const int *p_stat,
|
alpar@9
|
282 const int *d_stat, const double *obj_val, const int r_stat[],
|
alpar@9
|
283 const double r_prim[], const double r_dual[], const int c_stat[],
|
alpar@9
|
284 const double c_prim[], const double c_dual[]);
|
alpar@9
|
285 /* store basic solution components */
|
alpar@9
|
286
|
alpar@9
|
287 #define lpx_put_mip_soln _glp_put_mip_soln
|
alpar@9
|
288 void lpx_put_mip_soln(LPX *lp, int i_stat, double row_mipx[],
|
alpar@9
|
289 double col_mipx[]);
|
alpar@9
|
290 /* store mixed integer solution components */
|
alpar@9
|
291
|
alpar@9
|
292 #if 1 /* 28/XI-2009 */
|
alpar@9
|
293 int _glp_analyze_row(glp_prob *P, int len, const int ind[],
|
alpar@9
|
294 const double val[], int type, double rhs, double eps, int *_piv,
|
alpar@9
|
295 double *_x, double *_dx, double *_y, double *_dy, double *_dz);
|
alpar@9
|
296 /* simulate one iteration of dual simplex method */
|
alpar@9
|
297 #endif
|
alpar@9
|
298
|
alpar@9
|
299 #if 1 /* 08/XII-2009 */
|
alpar@9
|
300 void _glp_mpl_init_rand(glp_tran *tran, int seed);
|
alpar@9
|
301 #endif
|
alpar@9
|
302
|
alpar@9
|
303 #define glp_skpgen _glp_skpgen
|
alpar@9
|
304 void glp_skpgen(int n, int r, int type, int v, int s, int a[],
|
alpar@9
|
305 int *b, int c[]);
|
alpar@9
|
306 /* Pisinger's 0-1 single knapsack problem generator */
|
alpar@9
|
307
|
alpar@9
|
308 #if 1 /* 28/V-2010 */
|
alpar@9
|
309 int _glp_intopt1(glp_prob *P, const glp_iocp *parm);
|
alpar@9
|
310 #endif
|
alpar@9
|
311
|
alpar@9
|
312 #endif
|
alpar@9
|
313
|
alpar@9
|
314 /* eof */
|