src/glpios.h
changeset 1 c445c931472f
equal deleted inserted replaced
-1:000000000000 0:f9f05e8ff4f8
       
     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 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 */