glpios.h 22 KB

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