[9] | 1 | /* glpios.h (integer optimization suite) */ |
---|
| 2 | |
---|
| 3 | /*********************************************************************** |
---|
| 4 | * This code is part of GLPK (GNU Linear Programming Kit). |
---|
| 5 | * |
---|
| 6 | * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, |
---|
| 7 | * 2009, 2010, 2011 Andrew Makhorin, Department for Applied Informatics, |
---|
| 8 | * Moscow Aviation Institute, Moscow, Russia. All rights reserved. |
---|
| 9 | * E-mail: <mao@gnu.org>. |
---|
| 10 | * |
---|
| 11 | * GLPK is free software: you can redistribute it and/or modify it |
---|
| 12 | * under the terms of the GNU General Public License as published by |
---|
| 13 | * the Free Software Foundation, either version 3 of the License, or |
---|
| 14 | * (at your option) any later version. |
---|
| 15 | * |
---|
| 16 | * GLPK is distributed in the hope that it will be useful, but WITHOUT |
---|
| 17 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
---|
| 18 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
---|
| 19 | * License for more details. |
---|
| 20 | * |
---|
| 21 | * You should have received a copy of the GNU General Public License |
---|
| 22 | * along with GLPK. If not, see <http://www.gnu.org/licenses/>. |
---|
| 23 | ***********************************************************************/ |
---|
| 24 | |
---|
| 25 | #ifndef GLPIOS_H |
---|
| 26 | #define GLPIOS_H |
---|
| 27 | |
---|
| 28 | #define GLP_TREE_DEFINED |
---|
| 29 | typedef struct glp_tree glp_tree; |
---|
| 30 | |
---|
| 31 | #include "glpapi.h" |
---|
| 32 | |
---|
| 33 | typedef struct IOSLOT IOSLOT; |
---|
| 34 | typedef struct IOSNPD IOSNPD; |
---|
| 35 | typedef struct IOSBND IOSBND; |
---|
| 36 | typedef struct IOSTAT IOSTAT; |
---|
| 37 | typedef struct IOSROW IOSROW; |
---|
| 38 | typedef struct IOSAIJ IOSAIJ; |
---|
| 39 | typedef struct IOSPOOL IOSPOOL; |
---|
| 40 | typedef struct IOSCUT IOSCUT; |
---|
| 41 | |
---|
| 42 | struct glp_tree |
---|
| 43 | { /* branch-and-bound tree */ |
---|
| 44 | int magic; |
---|
| 45 | /* magic value used for debugging */ |
---|
| 46 | DMP *pool; |
---|
| 47 | /* memory pool to store all IOS components */ |
---|
| 48 | int n; |
---|
| 49 | /* number of columns (variables) */ |
---|
| 50 | /*--------------------------------------------------------------*/ |
---|
| 51 | /* problem components corresponding to the original MIP and its |
---|
| 52 | LP relaxation (used to restore the original problem object on |
---|
| 53 | exit from the solver) */ |
---|
| 54 | int orig_m; |
---|
| 55 | /* number of rows */ |
---|
| 56 | unsigned char *orig_type; /* uchar orig_type[1+orig_m+n]; */ |
---|
| 57 | /* types of all variables */ |
---|
| 58 | double *orig_lb; /* double orig_lb[1+orig_m+n]; */ |
---|
| 59 | /* lower bounds of all variables */ |
---|
| 60 | double *orig_ub; /* double orig_ub[1+orig_m+n]; */ |
---|
| 61 | /* upper bounds of all variables */ |
---|
| 62 | unsigned char *orig_stat; /* uchar orig_stat[1+orig_m+n]; */ |
---|
| 63 | /* statuses of all variables */ |
---|
| 64 | double *orig_prim; /* double orig_prim[1+orig_m+n]; */ |
---|
| 65 | /* primal values of all variables */ |
---|
| 66 | double *orig_dual; /* double orig_dual[1+orig_m+n]; */ |
---|
| 67 | /* dual values of all variables */ |
---|
| 68 | double orig_obj; |
---|
| 69 | /* optimal objective value for LP relaxation */ |
---|
| 70 | /*--------------------------------------------------------------*/ |
---|
| 71 | /* branch-and-bound tree */ |
---|
| 72 | int nslots; |
---|
| 73 | /* length of the array of slots (enlarged automatically) */ |
---|
| 74 | int avail; |
---|
| 75 | /* index of the first free slot; 0 means all slots are in use */ |
---|
| 76 | IOSLOT *slot; /* IOSLOT slot[1+nslots]; */ |
---|
| 77 | /* array of slots: |
---|
| 78 | slot[0] is not used; |
---|
| 79 | slot[p], 1 <= p <= nslots, either contains a pointer to some |
---|
| 80 | node of the branch-and-bound tree, in which case p is used on |
---|
| 81 | API level as the reference number of corresponding subproblem, |
---|
| 82 | or is free; all free slots are linked into single linked list; |
---|
| 83 | slot[1] always contains a pointer to the root node (it is free |
---|
| 84 | only if the tree is empty) */ |
---|
| 85 | IOSNPD *head; |
---|
| 86 | /* pointer to the head of the active list */ |
---|
| 87 | IOSNPD *tail; |
---|
| 88 | /* pointer to the tail of the active list */ |
---|
| 89 | /* the active list is a doubly linked list of active subproblems |
---|
| 90 | which correspond to leaves of the tree; all subproblems in the |
---|
| 91 | active list are ordered chronologically (each a new subproblem |
---|
| 92 | is always added to the tail of the list) */ |
---|
| 93 | int a_cnt; |
---|
| 94 | /* current number of active nodes (including the current one) */ |
---|
| 95 | int n_cnt; |
---|
| 96 | /* current number of all (active and inactive) nodes */ |
---|
| 97 | int t_cnt; |
---|
| 98 | /* total number of nodes including those which have been already |
---|
| 99 | removed from the tree; this count is increased by one whenever |
---|
| 100 | a new node is created and never decreased */ |
---|
| 101 | /*--------------------------------------------------------------*/ |
---|
| 102 | /* problem components corresponding to the root subproblem */ |
---|
| 103 | int root_m; |
---|
| 104 | /* number of rows */ |
---|
| 105 | unsigned char *root_type; /* uchar root_type[1+root_m+n]; */ |
---|
| 106 | /* types of all variables */ |
---|
| 107 | double *root_lb; /* double root_lb[1+root_m+n]; */ |
---|
| 108 | /* lower bounds of all variables */ |
---|
| 109 | double *root_ub; /* double root_ub[1+root_m+n]; */ |
---|
| 110 | /* upper bounds of all variables */ |
---|
| 111 | unsigned char *root_stat; /* uchar root_stat[1+root_m+n]; */ |
---|
| 112 | /* statuses of all variables */ |
---|
| 113 | /*--------------------------------------------------------------*/ |
---|
| 114 | /* current subproblem and its LP relaxation */ |
---|
| 115 | IOSNPD *curr; |
---|
| 116 | /* pointer to the current subproblem (which can be only active); |
---|
| 117 | NULL means the current subproblem does not exist */ |
---|
| 118 | glp_prob *mip; |
---|
| 119 | /* original problem object passed to the solver; if the current |
---|
| 120 | subproblem exists, its LP segment corresponds to LP relaxation |
---|
| 121 | of the current subproblem; if the current subproblem does not |
---|
| 122 | exist, its LP segment corresponds to LP relaxation of the root |
---|
| 123 | subproblem (note that the root subproblem may differ from the |
---|
| 124 | original MIP, because it may be preprocessed and/or may have |
---|
| 125 | additional rows) */ |
---|
| 126 | unsigned char *non_int; /* uchar non_int[1+n]; */ |
---|
| 127 | /* these column flags are set each time when LP relaxation of the |
---|
| 128 | current subproblem has been solved; |
---|
| 129 | non_int[0] is not used; |
---|
| 130 | non_int[j], 1 <= j <= n, is j-th column flag; if this flag is |
---|
| 131 | set, corresponding variable is required to be integer, but its |
---|
| 132 | value in basic solution is fractional */ |
---|
| 133 | /*--------------------------------------------------------------*/ |
---|
| 134 | /* problem components corresponding to the parent (predecessor) |
---|
| 135 | subproblem for the current subproblem; used to inspect changes |
---|
| 136 | on freezing the current subproblem */ |
---|
| 137 | int pred_m; |
---|
| 138 | /* number of rows */ |
---|
| 139 | int pred_max; |
---|
| 140 | /* length of the following four arrays (enlarged automatically), |
---|
| 141 | pred_max >= pred_m + n */ |
---|
| 142 | unsigned char *pred_type; /* uchar pred_type[1+pred_m+n]; */ |
---|
| 143 | /* types of all variables */ |
---|
| 144 | double *pred_lb; /* double pred_lb[1+pred_m+n]; */ |
---|
| 145 | /* lower bounds of all variables */ |
---|
| 146 | double *pred_ub; /* double pred_ub[1+pred_m+n]; */ |
---|
| 147 | /* upper bounds of all variables */ |
---|
| 148 | unsigned char *pred_stat; /* uchar pred_stat[1+pred_m+n]; */ |
---|
| 149 | /* statuses of all variables */ |
---|
| 150 | /****************************************************************/ |
---|
| 151 | /* built-in cut generators segment */ |
---|
| 152 | IOSPOOL *local; |
---|
| 153 | /* local cut pool */ |
---|
| 154 | void *mir_gen; |
---|
| 155 | /* pointer to working area used by the MIR cut generator */ |
---|
| 156 | void *clq_gen; |
---|
| 157 | /* pointer to working area used by the clique cut generator */ |
---|
| 158 | /*--------------------------------------------------------------*/ |
---|
| 159 | void *pcost; |
---|
| 160 | /* pointer to working area used on pseudocost branching */ |
---|
| 161 | int *iwrk; /* int iwrk[1+n]; */ |
---|
| 162 | /* working array */ |
---|
| 163 | double *dwrk; /* double dwrk[1+n]; */ |
---|
| 164 | /* working array */ |
---|
| 165 | /*--------------------------------------------------------------*/ |
---|
| 166 | /* control parameters and statistics */ |
---|
| 167 | const glp_iocp *parm; |
---|
| 168 | /* copy of control parameters passed to the solver */ |
---|
| 169 | glp_long tm_beg; |
---|
| 170 | /* starting time of the search, in seconds; the total time of the |
---|
| 171 | search is the difference between xtime() and tm_beg */ |
---|
| 172 | glp_long tm_lag; |
---|
| 173 | /* the most recent time, in seconds, at which the progress of the |
---|
| 174 | the search was displayed */ |
---|
| 175 | int sol_cnt; |
---|
| 176 | /* number of integer feasible solutions found */ |
---|
| 177 | /*--------------------------------------------------------------*/ |
---|
| 178 | /* advanced solver interface */ |
---|
| 179 | int reason; |
---|
| 180 | /* flag indicating the reason why the callback routine is being |
---|
| 181 | called (see glpk.h) */ |
---|
| 182 | int stop; |
---|
| 183 | /* flag indicating that the callback routine requires premature |
---|
| 184 | termination of the search */ |
---|
| 185 | int next_p; |
---|
| 186 | /* reference number of active subproblem selected to continue |
---|
| 187 | the search; 0 means no subproblem has been selected */ |
---|
| 188 | int reopt; |
---|
| 189 | /* flag indicating that the current LP relaxation needs to be |
---|
| 190 | re-optimized */ |
---|
| 191 | int reinv; |
---|
| 192 | /* flag indicating that some (non-active) rows were removed from |
---|
| 193 | the current LP relaxation, so if there no new rows appear, the |
---|
| 194 | basis must be re-factorized */ |
---|
| 195 | int br_var; |
---|
| 196 | /* the number of variable chosen to branch on */ |
---|
| 197 | int br_sel; |
---|
| 198 | /* flag indicating which branch (subproblem) is suggested to be |
---|
| 199 | selected to continue the search: |
---|
| 200 | GLP_DN_BRNCH - select down-branch |
---|
| 201 | GLP_UP_BRNCH - select up-branch |
---|
| 202 | GLP_NO_BRNCH - use general selection technique */ |
---|
| 203 | int child; |
---|
| 204 | /* subproblem reference number corresponding to br_sel */ |
---|
| 205 | }; |
---|
| 206 | |
---|
| 207 | struct IOSLOT |
---|
| 208 | { /* node subproblem slot */ |
---|
| 209 | IOSNPD *node; |
---|
| 210 | /* pointer to subproblem descriptor; NULL means free slot */ |
---|
| 211 | int next; |
---|
| 212 | /* index of another free slot (only if this slot is free) */ |
---|
| 213 | }; |
---|
| 214 | |
---|
| 215 | struct IOSNPD |
---|
| 216 | { /* node subproblem descriptor */ |
---|
| 217 | int p; |
---|
| 218 | /* subproblem reference number (it is the index to corresponding |
---|
| 219 | slot, i.e. slot[p] points to this descriptor) */ |
---|
| 220 | IOSNPD *up; |
---|
| 221 | /* pointer to the parent subproblem; NULL means this node is the |
---|
| 222 | root of the tree, in which case p = 1 */ |
---|
| 223 | int level; |
---|
| 224 | /* node level (the root node has level 0) */ |
---|
| 225 | int count; |
---|
| 226 | /* if count = 0, this subproblem is active; if count > 0, this |
---|
| 227 | subproblem is inactive, in which case count is the number of |
---|
| 228 | its child subproblems */ |
---|
| 229 | /* the following three linked lists are destroyed on reviving and |
---|
| 230 | built anew on freezing the subproblem: */ |
---|
| 231 | IOSBND *b_ptr; |
---|
| 232 | /* linked list of rows and columns of the parent subproblem whose |
---|
| 233 | types and bounds were changed */ |
---|
| 234 | IOSTAT *s_ptr; |
---|
| 235 | /* linked list of rows and columns of the parent subproblem whose |
---|
| 236 | statuses were changed */ |
---|
| 237 | IOSROW *r_ptr; |
---|
| 238 | /* linked list of rows (cuts) added to the parent subproblem */ |
---|
| 239 | int solved; |
---|
| 240 | /* how many times LP relaxation of this subproblem was solved; |
---|
| 241 | for inactive subproblem this count is always non-zero; |
---|
| 242 | for active subproblem, which is not current, this count may be |
---|
| 243 | non-zero, if the subproblem was temporarily suspended */ |
---|
| 244 | double lp_obj; |
---|
| 245 | /* optimal objective value to LP relaxation of this subproblem; |
---|
| 246 | on creating a subproblem this value is inherited from its |
---|
| 247 | parent; for the root subproblem, which has no parent, this |
---|
| 248 | value is initially set to -DBL_MAX (minimization) or +DBL_MAX |
---|
| 249 | (maximization); each time the subproblem is re-optimized, this |
---|
| 250 | value is appropriately changed */ |
---|
| 251 | double bound; |
---|
| 252 | /* local lower (minimization) or upper (maximization) bound for |
---|
| 253 | integer optimal solution to *this* subproblem; this bound is |
---|
| 254 | local in the sense that only subproblems in the subtree rooted |
---|
| 255 | at this node cannot have better integer feasible solutions; |
---|
| 256 | on creating a subproblem its local bound is inherited from its |
---|
| 257 | parent and then can be made stronger (never weaker); for the |
---|
| 258 | root subproblem its local bound is initially set to -DBL_MAX |
---|
| 259 | (minimization) or +DBL_MAX (maximization) and then improved as |
---|
| 260 | the root LP relaxation has been solved */ |
---|
| 261 | /* the following two quantities are defined only if LP relaxation |
---|
| 262 | of this subproblem was solved at least once (solved > 0): */ |
---|
| 263 | int ii_cnt; |
---|
| 264 | /* number of integer variables whose value in optimal solution to |
---|
| 265 | LP relaxation of this subproblem is fractional */ |
---|
| 266 | double ii_sum; |
---|
| 267 | /* sum of integer infeasibilities */ |
---|
| 268 | #if 1 /* 30/XI-2009 */ |
---|
| 269 | int changed; |
---|
| 270 | /* how many times this subproblem was re-formulated (by adding |
---|
| 271 | cutting plane constraints) */ |
---|
| 272 | #endif |
---|
| 273 | int br_var; |
---|
| 274 | /* ordinal number of branching variable, 1 <= br_var <= n, used |
---|
| 275 | to split this subproblem; 0 means that either this subproblem |
---|
| 276 | is active or branching was made on a constraint */ |
---|
| 277 | double br_val; |
---|
| 278 | /* (fractional) value of branching variable in optimal solution |
---|
| 279 | to final LP relaxation of this subproblem */ |
---|
| 280 | void *data; /* char data[tree->cb_size]; */ |
---|
| 281 | /* pointer to the application-specific data */ |
---|
| 282 | IOSNPD *temp; |
---|
| 283 | /* working pointer used by some routines */ |
---|
| 284 | IOSNPD *prev; |
---|
| 285 | /* pointer to previous subproblem in the active list */ |
---|
| 286 | IOSNPD *next; |
---|
| 287 | /* pointer to next subproblem in the active list */ |
---|
| 288 | }; |
---|
| 289 | |
---|
| 290 | struct IOSBND |
---|
| 291 | { /* bounds change entry */ |
---|
| 292 | int k; |
---|
| 293 | /* ordinal number of corresponding row (1 <= k <= m) or column |
---|
| 294 | (m+1 <= k <= m+n), where m and n are the number of rows and |
---|
| 295 | columns, resp., in the parent subproblem */ |
---|
| 296 | unsigned char type; |
---|
| 297 | /* new type */ |
---|
| 298 | double lb; |
---|
| 299 | /* new lower bound */ |
---|
| 300 | double ub; |
---|
| 301 | /* new upper bound */ |
---|
| 302 | IOSBND *next; |
---|
| 303 | /* pointer to next entry for the same subproblem */ |
---|
| 304 | }; |
---|
| 305 | |
---|
| 306 | struct IOSTAT |
---|
| 307 | { /* status change entry */ |
---|
| 308 | int k; |
---|
| 309 | /* ordinal number of corresponding row (1 <= k <= m) or column |
---|
| 310 | (m+1 <= k <= m+n), where m and n are the number of rows and |
---|
| 311 | columns, resp., in the parent subproblem */ |
---|
| 312 | unsigned char stat; |
---|
| 313 | /* new status */ |
---|
| 314 | IOSTAT *next; |
---|
| 315 | /* pointer to next entry for the same subproblem */ |
---|
| 316 | }; |
---|
| 317 | |
---|
| 318 | struct IOSROW |
---|
| 319 | { /* row (constraint) addition entry */ |
---|
| 320 | char *name; |
---|
| 321 | /* row name or NULL */ |
---|
| 322 | unsigned char origin; |
---|
| 323 | /* row origin flag (see glp_attr.origin) */ |
---|
| 324 | unsigned char klass; |
---|
| 325 | /* row class descriptor (see glp_attr.klass) */ |
---|
| 326 | unsigned char type; |
---|
| 327 | /* row type (GLP_LO, GLP_UP, etc.) */ |
---|
| 328 | double lb; |
---|
| 329 | /* row lower bound */ |
---|
| 330 | double ub; |
---|
| 331 | /* row upper bound */ |
---|
| 332 | IOSAIJ *ptr; |
---|
| 333 | /* pointer to the row coefficient list */ |
---|
| 334 | double rii; |
---|
| 335 | /* row scale factor */ |
---|
| 336 | unsigned char stat; |
---|
| 337 | /* row status (GLP_BS, GLP_NL, etc.) */ |
---|
| 338 | IOSROW *next; |
---|
| 339 | /* pointer to next entry for the same subproblem */ |
---|
| 340 | }; |
---|
| 341 | |
---|
| 342 | struct IOSAIJ |
---|
| 343 | { /* constraint coefficient */ |
---|
| 344 | int j; |
---|
| 345 | /* variable (column) number, 1 <= j <= n */ |
---|
| 346 | double val; |
---|
| 347 | /* non-zero coefficient value */ |
---|
| 348 | IOSAIJ *next; |
---|
| 349 | /* pointer to next coefficient for the same row */ |
---|
| 350 | }; |
---|
| 351 | |
---|
| 352 | struct IOSPOOL |
---|
| 353 | { /* cut pool */ |
---|
| 354 | int size; |
---|
| 355 | /* pool size = number of cuts in the pool */ |
---|
| 356 | IOSCUT *head; |
---|
| 357 | /* pointer to the first cut */ |
---|
| 358 | IOSCUT *tail; |
---|
| 359 | /* pointer to the last cut */ |
---|
| 360 | int ord; |
---|
| 361 | /* ordinal number of the current cut, 1 <= ord <= size */ |
---|
| 362 | IOSCUT *curr; |
---|
| 363 | /* pointer to the current cut */ |
---|
| 364 | }; |
---|
| 365 | |
---|
| 366 | struct IOSCUT |
---|
| 367 | { /* cut (cutting plane constraint) */ |
---|
| 368 | char *name; |
---|
| 369 | /* cut name or NULL */ |
---|
| 370 | unsigned char klass; |
---|
| 371 | /* cut class descriptor (see glp_attr.klass) */ |
---|
| 372 | IOSAIJ *ptr; |
---|
| 373 | /* pointer to the cut coefficient list */ |
---|
| 374 | unsigned char type; |
---|
| 375 | /* cut type: |
---|
| 376 | GLP_LO: sum a[j] * x[j] >= b |
---|
| 377 | GLP_UP: sum a[j] * x[j] <= b |
---|
| 378 | GLP_FX: sum a[j] * x[j] = b */ |
---|
| 379 | double rhs; |
---|
| 380 | /* cut right-hand side */ |
---|
| 381 | IOSCUT *prev; |
---|
| 382 | /* pointer to previous cut */ |
---|
| 383 | IOSCUT *next; |
---|
| 384 | /* pointer to next cut */ |
---|
| 385 | }; |
---|
| 386 | |
---|
| 387 | #define ios_create_tree _glp_ios_create_tree |
---|
| 388 | glp_tree *ios_create_tree(glp_prob *mip, const glp_iocp *parm); |
---|
| 389 | /* create branch-and-bound tree */ |
---|
| 390 | |
---|
| 391 | #define ios_revive_node _glp_ios_revive_node |
---|
| 392 | void ios_revive_node(glp_tree *tree, int p); |
---|
| 393 | /* revive specified subproblem */ |
---|
| 394 | |
---|
| 395 | #define ios_freeze_node _glp_ios_freeze_node |
---|
| 396 | void ios_freeze_node(glp_tree *tree); |
---|
| 397 | /* freeze current subproblem */ |
---|
| 398 | |
---|
| 399 | #define ios_clone_node _glp_ios_clone_node |
---|
| 400 | void ios_clone_node(glp_tree *tree, int p, int nnn, int ref[]); |
---|
| 401 | /* clone specified subproblem */ |
---|
| 402 | |
---|
| 403 | #define ios_delete_node _glp_ios_delete_node |
---|
| 404 | void ios_delete_node(glp_tree *tree, int p); |
---|
| 405 | /* delete specified subproblem */ |
---|
| 406 | |
---|
| 407 | #define ios_delete_tree _glp_ios_delete_tree |
---|
| 408 | void ios_delete_tree(glp_tree *tree); |
---|
| 409 | /* delete branch-and-bound tree */ |
---|
| 410 | |
---|
| 411 | #define ios_eval_degrad _glp_ios_eval_degrad |
---|
| 412 | void ios_eval_degrad(glp_tree *tree, int j, double *dn, double *up); |
---|
| 413 | /* estimate obj. degrad. for down- and up-branches */ |
---|
| 414 | |
---|
| 415 | #define ios_round_bound _glp_ios_round_bound |
---|
| 416 | double ios_round_bound(glp_tree *tree, double bound); |
---|
| 417 | /* improve local bound by rounding */ |
---|
| 418 | |
---|
| 419 | #define ios_is_hopeful _glp_ios_is_hopeful |
---|
| 420 | int ios_is_hopeful(glp_tree *tree, double bound); |
---|
| 421 | /* check if subproblem is hopeful */ |
---|
| 422 | |
---|
| 423 | #define ios_best_node _glp_ios_best_node |
---|
| 424 | int ios_best_node(glp_tree *tree); |
---|
| 425 | /* find active node with best local bound */ |
---|
| 426 | |
---|
| 427 | #define ios_relative_gap _glp_ios_relative_gap |
---|
| 428 | double ios_relative_gap(glp_tree *tree); |
---|
| 429 | /* compute relative mip gap */ |
---|
| 430 | |
---|
| 431 | #define ios_solve_node _glp_ios_solve_node |
---|
| 432 | int ios_solve_node(glp_tree *tree); |
---|
| 433 | /* solve LP relaxation of current subproblem */ |
---|
| 434 | |
---|
| 435 | #define ios_create_pool _glp_ios_create_pool |
---|
| 436 | IOSPOOL *ios_create_pool(glp_tree *tree); |
---|
| 437 | /* create cut pool */ |
---|
| 438 | |
---|
| 439 | #define ios_add_row _glp_ios_add_row |
---|
| 440 | int ios_add_row(glp_tree *tree, IOSPOOL *pool, |
---|
| 441 | const char *name, int klass, int flags, int len, const int ind[], |
---|
| 442 | const double val[], int type, double rhs); |
---|
| 443 | /* add row (constraint) to the cut pool */ |
---|
| 444 | |
---|
| 445 | #define ios_find_row _glp_ios_find_row |
---|
| 446 | IOSCUT *ios_find_row(IOSPOOL *pool, int i); |
---|
| 447 | /* find row (constraint) in the cut pool */ |
---|
| 448 | |
---|
| 449 | #define ios_del_row _glp_ios_del_row |
---|
| 450 | void ios_del_row(glp_tree *tree, IOSPOOL *pool, int i); |
---|
| 451 | /* remove row (constraint) from the cut pool */ |
---|
| 452 | |
---|
| 453 | #define ios_clear_pool _glp_ios_clear_pool |
---|
| 454 | void ios_clear_pool(glp_tree *tree, IOSPOOL *pool); |
---|
| 455 | /* remove all rows (constraints) from the cut pool */ |
---|
| 456 | |
---|
| 457 | #define ios_delete_pool _glp_ios_delete_pool |
---|
| 458 | void ios_delete_pool(glp_tree *tree, IOSPOOL *pool); |
---|
| 459 | /* delete cut pool */ |
---|
| 460 | |
---|
| 461 | #define ios_preprocess_node _glp_ios_preprocess_node |
---|
| 462 | int ios_preprocess_node(glp_tree *tree, int max_pass); |
---|
| 463 | /* preprocess current subproblem */ |
---|
| 464 | |
---|
| 465 | #define ios_driver _glp_ios_driver |
---|
| 466 | int ios_driver(glp_tree *tree); |
---|
| 467 | /* branch-and-bound driver */ |
---|
| 468 | |
---|
| 469 | /**********************************************************************/ |
---|
| 470 | |
---|
| 471 | typedef struct IOSVEC IOSVEC; |
---|
| 472 | |
---|
| 473 | struct IOSVEC |
---|
| 474 | { /* sparse vector v = (v[j]) */ |
---|
| 475 | int n; |
---|
| 476 | /* dimension, n >= 0 */ |
---|
| 477 | int nnz; |
---|
| 478 | /* number of non-zero components, 0 <= nnz <= n */ |
---|
| 479 | int *pos; /* int pos[1+n]; */ |
---|
| 480 | /* pos[j] = k, 1 <= j <= n, is position of (non-zero) v[j] in the |
---|
| 481 | arrays ind and val, where 1 <= k <= nnz; pos[j] = 0 means that |
---|
| 482 | v[j] is structural zero */ |
---|
| 483 | int *ind; /* int ind[1+n]; */ |
---|
| 484 | /* ind[k] = j, 1 <= k <= nnz, is index of v[j] */ |
---|
| 485 | double *val; /* double val[1+n]; */ |
---|
| 486 | /* val[k], 1 <= k <= nnz, is a numeric value of v[j] */ |
---|
| 487 | }; |
---|
| 488 | |
---|
| 489 | #define ios_create_vec _glp_ios_create_vec |
---|
| 490 | IOSVEC *ios_create_vec(int n); |
---|
| 491 | /* create sparse vector */ |
---|
| 492 | |
---|
| 493 | #define ios_check_vec _glp_ios_check_vec |
---|
| 494 | void ios_check_vec(IOSVEC *v); |
---|
| 495 | /* check that sparse vector has correct representation */ |
---|
| 496 | |
---|
| 497 | #define ios_get_vj _glp_ios_get_vj |
---|
| 498 | double ios_get_vj(IOSVEC *v, int j); |
---|
| 499 | /* retrieve component of sparse vector */ |
---|
| 500 | |
---|
| 501 | #define ios_set_vj _glp_ios_set_vj |
---|
| 502 | void ios_set_vj(IOSVEC *v, int j, double val); |
---|
| 503 | /* set/change component of sparse vector */ |
---|
| 504 | |
---|
| 505 | #define ios_clear_vec _glp_ios_clear_vec |
---|
| 506 | void ios_clear_vec(IOSVEC *v); |
---|
| 507 | /* set all components of sparse vector to zero */ |
---|
| 508 | |
---|
| 509 | #define ios_clean_vec _glp_ios_clean_vec |
---|
| 510 | void ios_clean_vec(IOSVEC *v, double eps); |
---|
| 511 | /* remove zero or small components from sparse vector */ |
---|
| 512 | |
---|
| 513 | #define ios_copy_vec _glp_ios_copy_vec |
---|
| 514 | void ios_copy_vec(IOSVEC *x, IOSVEC *y); |
---|
| 515 | /* copy sparse vector (x := y) */ |
---|
| 516 | |
---|
| 517 | #define ios_linear_comb _glp_ios_linear_comb |
---|
| 518 | void ios_linear_comb(IOSVEC *x, double a, IOSVEC *y); |
---|
| 519 | /* compute linear combination (x := x + a * y) */ |
---|
| 520 | |
---|
| 521 | #define ios_delete_vec _glp_ios_delete_vec |
---|
| 522 | void ios_delete_vec(IOSVEC *v); |
---|
| 523 | /* delete sparse vector */ |
---|
| 524 | |
---|
| 525 | /**********************************************************************/ |
---|
| 526 | |
---|
| 527 | #define ios_gmi_gen _glp_ios_gmi_gen |
---|
| 528 | void ios_gmi_gen(glp_tree *tree); |
---|
| 529 | /* generate Gomory's mixed integer cuts */ |
---|
| 530 | |
---|
| 531 | #define ios_mir_init _glp_ios_mir_init |
---|
| 532 | void *ios_mir_init(glp_tree *tree); |
---|
| 533 | /* initialize MIR cut generator */ |
---|
| 534 | |
---|
| 535 | #define ios_mir_gen _glp_ios_mir_gen |
---|
| 536 | void ios_mir_gen(glp_tree *tree, void *gen); |
---|
| 537 | /* generate MIR cuts */ |
---|
| 538 | |
---|
| 539 | #define ios_mir_term _glp_ios_mir_term |
---|
| 540 | void ios_mir_term(void *gen); |
---|
| 541 | /* terminate MIR cut generator */ |
---|
| 542 | |
---|
| 543 | #define ios_cov_gen _glp_ios_cov_gen |
---|
| 544 | void ios_cov_gen(glp_tree *tree); |
---|
| 545 | /* generate mixed cover cuts */ |
---|
| 546 | |
---|
| 547 | #define ios_clq_init _glp_ios_clq_init |
---|
| 548 | void *ios_clq_init(glp_tree *tree); |
---|
| 549 | /* initialize clique cut generator */ |
---|
| 550 | |
---|
| 551 | #define ios_clq_gen _glp_ios_clq_gen |
---|
| 552 | void ios_clq_gen(glp_tree *tree, void *gen); |
---|
| 553 | /* generate clique cuts */ |
---|
| 554 | |
---|
| 555 | #define ios_clq_term _glp_ios_clq_term |
---|
| 556 | void ios_clq_term(void *gen); |
---|
| 557 | /* terminate clique cut generator */ |
---|
| 558 | |
---|
| 559 | #define ios_pcost_init _glp_ios_pcost_init |
---|
| 560 | void *ios_pcost_init(glp_tree *tree); |
---|
| 561 | /* initialize working data used on pseudocost branching */ |
---|
| 562 | |
---|
| 563 | #define ios_pcost_branch _glp_ios_pcost_branch |
---|
| 564 | int ios_pcost_branch(glp_tree *T, int *next); |
---|
| 565 | /* choose branching variable with pseudocost branching */ |
---|
| 566 | |
---|
| 567 | #define ios_pcost_update _glp_ios_pcost_update |
---|
| 568 | void ios_pcost_update(glp_tree *tree); |
---|
| 569 | /* update history information for pseudocost branching */ |
---|
| 570 | |
---|
| 571 | #define ios_pcost_free _glp_ios_pcost_free |
---|
| 572 | void ios_pcost_free(glp_tree *tree); |
---|
| 573 | /* free working area used on pseudocost branching */ |
---|
| 574 | |
---|
| 575 | #define ios_feas_pump _glp_ios_feas_pump |
---|
| 576 | void ios_feas_pump(glp_tree *T); |
---|
| 577 | /* feasibility pump heuristic */ |
---|
| 578 | |
---|
| 579 | #define ios_process_cuts _glp_ios_process_cuts |
---|
| 580 | void ios_process_cuts(glp_tree *T); |
---|
| 581 | /* process cuts stored in the local cut pool */ |
---|
| 582 | |
---|
| 583 | #define ios_choose_node _glp_ios_choose_node |
---|
| 584 | int ios_choose_node(glp_tree *T); |
---|
| 585 | /* select subproblem to continue the search */ |
---|
| 586 | |
---|
| 587 | #define ios_choose_var _glp_ios_choose_var |
---|
| 588 | int ios_choose_var(glp_tree *T, int *next); |
---|
| 589 | /* select variable to branch on */ |
---|
| 590 | |
---|
| 591 | #endif |
---|
| 592 | |
---|
| 593 | /* eof */ |
---|