include/glpk.h
author Alpar Juttner <alpar@cs.elte.hu>
Sun, 05 Dec 2010 17:35:23 +0100
changeset 2 4c8956a7bdf4
permissions -rw-r--r--
Set up CMAKE build environment
alpar@1
     1
/* glpk.h */
alpar@1
     2
alpar@1
     3
/***********************************************************************
alpar@1
     4
*  This code is part of GLPK (GNU Linear Programming Kit).
alpar@1
     5
*
alpar@1
     6
*  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
alpar@1
     7
*  2009, 2010 Andrew Makhorin, Department for Applied Informatics,
alpar@1
     8
*  Moscow Aviation Institute, Moscow, Russia. All rights reserved.
alpar@1
     9
*  E-mail: <mao@gnu.org>.
alpar@1
    10
*
alpar@1
    11
*  GLPK is free software: you can redistribute it and/or modify it
alpar@1
    12
*  under the terms of the GNU General Public License as published by
alpar@1
    13
*  the Free Software Foundation, either version 3 of the License, or
alpar@1
    14
*  (at your option) any later version.
alpar@1
    15
*
alpar@1
    16
*  GLPK is distributed in the hope that it will be useful, but WITHOUT
alpar@1
    17
*  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
alpar@1
    18
*  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
alpar@1
    19
*  License for more details.
alpar@1
    20
*
alpar@1
    21
*  You should have received a copy of the GNU General Public License
alpar@1
    22
*  along with GLPK. If not, see <http://www.gnu.org/licenses/>.
alpar@1
    23
***********************************************************************/
alpar@1
    24
alpar@1
    25
#ifndef GLPK_H
alpar@1
    26
#define GLPK_H
alpar@1
    27
alpar@1
    28
#include <stdarg.h>
alpar@1
    29
#include <stddef.h>
alpar@1
    30
alpar@1
    31
#ifdef __cplusplus
alpar@1
    32
extern "C" {
alpar@1
    33
#endif
alpar@1
    34
alpar@1
    35
/* library version numbers: */
alpar@1
    36
#define GLP_MAJOR_VERSION  4
alpar@1
    37
#define GLP_MINOR_VERSION  45
alpar@1
    38
alpar@1
    39
#ifndef GLP_PROB_DEFINED
alpar@1
    40
#define GLP_PROB_DEFINED
alpar@1
    41
typedef struct { double _opaque_prob[100]; } glp_prob;
alpar@1
    42
/* LP/MIP problem object */
alpar@1
    43
#endif
alpar@1
    44
alpar@1
    45
/* optimization direction flag: */
alpar@1
    46
#define GLP_MIN            1  /* minimization */
alpar@1
    47
#define GLP_MAX            2  /* maximization */
alpar@1
    48
alpar@1
    49
/* kind of structural variable: */
alpar@1
    50
#define GLP_CV             1  /* continuous variable */
alpar@1
    51
#define GLP_IV             2  /* integer variable */
alpar@1
    52
#define GLP_BV             3  /* binary variable */
alpar@1
    53
alpar@1
    54
/* type of auxiliary/structural variable: */
alpar@1
    55
#define GLP_FR             1  /* free variable */
alpar@1
    56
#define GLP_LO             2  /* variable with lower bound */
alpar@1
    57
#define GLP_UP             3  /* variable with upper bound */
alpar@1
    58
#define GLP_DB             4  /* double-bounded variable */
alpar@1
    59
#define GLP_FX             5  /* fixed variable */
alpar@1
    60
alpar@1
    61
/* status of auxiliary/structural variable: */
alpar@1
    62
#define GLP_BS             1  /* basic variable */
alpar@1
    63
#define GLP_NL             2  /* non-basic variable on lower bound */
alpar@1
    64
#define GLP_NU             3  /* non-basic variable on upper bound */
alpar@1
    65
#define GLP_NF             4  /* non-basic free variable */
alpar@1
    66
#define GLP_NS             5  /* non-basic fixed variable */
alpar@1
    67
alpar@1
    68
/* scaling options: */
alpar@1
    69
#define GLP_SF_GM       0x01  /* perform geometric mean scaling */
alpar@1
    70
#define GLP_SF_EQ       0x10  /* perform equilibration scaling */
alpar@1
    71
#define GLP_SF_2N       0x20  /* round scale factors to power of two */
alpar@1
    72
#define GLP_SF_SKIP     0x40  /* skip if problem is well scaled */
alpar@1
    73
#define GLP_SF_AUTO     0x80  /* choose scaling options automatically */
alpar@1
    74
alpar@1
    75
/* solution indicator: */
alpar@1
    76
#define GLP_SOL            1  /* basic solution */
alpar@1
    77
#define GLP_IPT            2  /* interior-point solution */
alpar@1
    78
#define GLP_MIP            3  /* mixed integer solution */
alpar@1
    79
alpar@1
    80
/* solution status: */
alpar@1
    81
#define GLP_UNDEF          1  /* solution is undefined */
alpar@1
    82
#define GLP_FEAS           2  /* solution is feasible */
alpar@1
    83
#define GLP_INFEAS         3  /* solution is infeasible */
alpar@1
    84
#define GLP_NOFEAS         4  /* no feasible solution exists */
alpar@1
    85
#define GLP_OPT            5  /* solution is optimal */
alpar@1
    86
#define GLP_UNBND          6  /* solution is unbounded */
alpar@1
    87
alpar@1
    88
typedef struct
alpar@1
    89
{     /* basis factorization control parameters */
alpar@1
    90
      int msg_lev;            /* (reserved) */
alpar@1
    91
      int type;               /* factorization type: */
alpar@1
    92
#define GLP_BF_FT          1  /* LUF + Forrest-Tomlin */
alpar@1
    93
#define GLP_BF_BG          2  /* LUF + Schur compl. + Bartels-Golub */
alpar@1
    94
#define GLP_BF_GR          3  /* LUF + Schur compl. + Givens rotation */
alpar@1
    95
      int lu_size;            /* luf.sv_size */
alpar@1
    96
      double piv_tol;         /* luf.piv_tol */
alpar@1
    97
      int piv_lim;            /* luf.piv_lim */
alpar@1
    98
      int suhl;               /* luf.suhl */
alpar@1
    99
      double eps_tol;         /* luf.eps_tol */
alpar@1
   100
      double max_gro;         /* luf.max_gro */
alpar@1
   101
      int nfs_max;            /* fhv.hh_max */
alpar@1
   102
      double upd_tol;         /* fhv.upd_tol */
alpar@1
   103
      int nrs_max;            /* lpf.n_max */
alpar@1
   104
      int rs_size;            /* lpf.v_size */
alpar@1
   105
      double foo_bar[38];     /* (reserved) */
alpar@1
   106
} glp_bfcp;
alpar@1
   107
alpar@1
   108
typedef struct
alpar@1
   109
{     /* simplex method control parameters */
alpar@1
   110
      int msg_lev;            /* message level: */
alpar@1
   111
#define GLP_MSG_OFF        0  /* no output */
alpar@1
   112
#define GLP_MSG_ERR        1  /* warning and error messages only */
alpar@1
   113
#define GLP_MSG_ON         2  /* normal output */
alpar@1
   114
#define GLP_MSG_ALL        3  /* full output */
alpar@1
   115
#define GLP_MSG_DBG        4  /* debug output */
alpar@1
   116
      int meth;               /* simplex method option: */
alpar@1
   117
#define GLP_PRIMAL         1  /* use primal simplex */
alpar@1
   118
#define GLP_DUALP          2  /* use dual; if it fails, use primal */
alpar@1
   119
#define GLP_DUAL           3  /* use dual simplex */
alpar@1
   120
      int pricing;            /* pricing technique: */
alpar@1
   121
#define GLP_PT_STD      0x11  /* standard (Dantzig rule) */
alpar@1
   122
#define GLP_PT_PSE      0x22  /* projected steepest edge */
alpar@1
   123
      int r_test;             /* ratio test technique: */
alpar@1
   124
#define GLP_RT_STD      0x11  /* standard (textbook) */
alpar@1
   125
#define GLP_RT_HAR      0x22  /* two-pass Harris' ratio test */
alpar@1
   126
      double tol_bnd;         /* spx.tol_bnd */
alpar@1
   127
      double tol_dj;          /* spx.tol_dj */
alpar@1
   128
      double tol_piv;         /* spx.tol_piv */
alpar@1
   129
      double obj_ll;          /* spx.obj_ll */
alpar@1
   130
      double obj_ul;          /* spx.obj_ul */
alpar@1
   131
      int it_lim;             /* spx.it_lim */
alpar@1
   132
      int tm_lim;             /* spx.tm_lim (milliseconds) */
alpar@1
   133
      int out_frq;            /* spx.out_frq */
alpar@1
   134
      int out_dly;            /* spx.out_dly (milliseconds) */
alpar@1
   135
      int presolve;           /* enable/disable using LP presolver */
alpar@1
   136
      double foo_bar[36];     /* (reserved) */
alpar@1
   137
} glp_smcp;
alpar@1
   138
alpar@1
   139
typedef struct
alpar@1
   140
{     /* interior-point solver control parameters */
alpar@1
   141
      int msg_lev;            /* message level (see glp_smcp) */
alpar@1
   142
      int ord_alg;            /* ordering algorithm: */
alpar@1
   143
#define GLP_ORD_NONE       0  /* natural (original) ordering */
alpar@1
   144
#define GLP_ORD_QMD        1  /* quotient minimum degree (QMD) */
alpar@1
   145
#define GLP_ORD_AMD        2  /* approx. minimum degree (AMD) */
alpar@1
   146
#define GLP_ORD_SYMAMD     3  /* approx. minimum degree (SYMAMD) */
alpar@1
   147
      double foo_bar[48];     /* (reserved) */
alpar@1
   148
} glp_iptcp;
alpar@1
   149
alpar@1
   150
#ifndef GLP_TREE_DEFINED
alpar@1
   151
#define GLP_TREE_DEFINED
alpar@1
   152
typedef struct { double _opaque_tree[100]; } glp_tree;
alpar@1
   153
/* branch-and-bound tree */
alpar@1
   154
#endif
alpar@1
   155
alpar@1
   156
typedef struct
alpar@1
   157
{     /* integer optimizer control parameters */
alpar@1
   158
      int msg_lev;            /* message level (see glp_smcp) */
alpar@1
   159
      int br_tech;            /* branching technique: */
alpar@1
   160
#define GLP_BR_FFV         1  /* first fractional variable */
alpar@1
   161
#define GLP_BR_LFV         2  /* last fractional variable */
alpar@1
   162
#define GLP_BR_MFV         3  /* most fractional variable */
alpar@1
   163
#define GLP_BR_DTH         4  /* heuristic by Driebeck and Tomlin */
alpar@1
   164
#define GLP_BR_PCH         5  /* hybrid pseudocost heuristic */
alpar@1
   165
      int bt_tech;            /* backtracking technique: */
alpar@1
   166
#define GLP_BT_DFS         1  /* depth first search */
alpar@1
   167
#define GLP_BT_BFS         2  /* breadth first search */
alpar@1
   168
#define GLP_BT_BLB         3  /* best local bound */
alpar@1
   169
#define GLP_BT_BPH         4  /* best projection heuristic */
alpar@1
   170
      double tol_int;         /* mip.tol_int */
alpar@1
   171
      double tol_obj;         /* mip.tol_obj */
alpar@1
   172
      int tm_lim;             /* mip.tm_lim (milliseconds) */
alpar@1
   173
      int out_frq;            /* mip.out_frq (milliseconds) */
alpar@1
   174
      int out_dly;            /* mip.out_dly (milliseconds) */
alpar@1
   175
      void (*cb_func)(glp_tree *T, void *info);
alpar@1
   176
                              /* mip.cb_func */
alpar@1
   177
      void *cb_info;          /* mip.cb_info */
alpar@1
   178
      int cb_size;            /* mip.cb_size */
alpar@1
   179
      int pp_tech;            /* preprocessing technique: */
alpar@1
   180
#define GLP_PP_NONE        0  /* disable preprocessing */
alpar@1
   181
#define GLP_PP_ROOT        1  /* preprocessing only on root level */
alpar@1
   182
#define GLP_PP_ALL         2  /* preprocessing on all levels */
alpar@1
   183
      double mip_gap;         /* relative MIP gap tolerance */
alpar@1
   184
      int mir_cuts;           /* MIR cuts       (GLP_ON/GLP_OFF) */
alpar@1
   185
      int gmi_cuts;           /* Gomory's cuts  (GLP_ON/GLP_OFF) */
alpar@1
   186
      int cov_cuts;           /* cover cuts     (GLP_ON/GLP_OFF) */
alpar@1
   187
      int clq_cuts;           /* clique cuts    (GLP_ON/GLP_OFF) */
alpar@1
   188
      int presolve;           /* enable/disable using MIP presolver */
alpar@1
   189
      int binarize;           /* try to binarize integer variables */
alpar@1
   190
      int fp_heur;            /* feasibility pump heuristic */
alpar@1
   191
#if 1 /* 28/V-2010 */
alpar@1
   192
      int alien;              /* use alien solver */
alpar@1
   193
#endif
alpar@1
   194
      double foo_bar[29];     /* (reserved) */
alpar@1
   195
} glp_iocp;
alpar@1
   196
alpar@1
   197
typedef struct
alpar@1
   198
{     /* additional row attributes */
alpar@1
   199
      int level;
alpar@1
   200
      /* subproblem level at which the row was added */
alpar@1
   201
      int origin;
alpar@1
   202
      /* row origin flag: */
alpar@1
   203
#define GLP_RF_REG         0  /* regular constraint */
alpar@1
   204
#define GLP_RF_LAZY        1  /* "lazy" constraint */
alpar@1
   205
#define GLP_RF_CUT         2  /* cutting plane constraint */
alpar@1
   206
      int klass;
alpar@1
   207
      /* row class descriptor: */
alpar@1
   208
#define GLP_RF_GMI         1  /* Gomory's mixed integer cut */
alpar@1
   209
#define GLP_RF_MIR         2  /* mixed integer rounding cut */
alpar@1
   210
#define GLP_RF_COV         3  /* mixed cover cut */
alpar@1
   211
#define GLP_RF_CLQ         4  /* clique cut */
alpar@1
   212
      double foo_bar[7];
alpar@1
   213
      /* (reserved) */
alpar@1
   214
} glp_attr;
alpar@1
   215
alpar@1
   216
/* enable/disable flag: */
alpar@1
   217
#define GLP_ON             1  /* enable something */
alpar@1
   218
#define GLP_OFF            0  /* disable something */
alpar@1
   219
alpar@1
   220
/* reason codes: */
alpar@1
   221
#define GLP_IROWGEN     0x01  /* request for row generation */
alpar@1
   222
#define GLP_IBINGO      0x02  /* better integer solution found */
alpar@1
   223
#define GLP_IHEUR       0x03  /* request for heuristic solution */
alpar@1
   224
#define GLP_ICUTGEN     0x04  /* request for cut generation */
alpar@1
   225
#define GLP_IBRANCH     0x05  /* request for branching */
alpar@1
   226
#define GLP_ISELECT     0x06  /* request for subproblem selection */
alpar@1
   227
#define GLP_IPREPRO     0x07  /* request for preprocessing */
alpar@1
   228
alpar@1
   229
/* branch selection indicator: */
alpar@1
   230
#define GLP_NO_BRNCH       0  /* select no branch */
alpar@1
   231
#define GLP_DN_BRNCH       1  /* select down-branch */
alpar@1
   232
#define GLP_UP_BRNCH       2  /* select up-branch */
alpar@1
   233
alpar@1
   234
/* return codes: */
alpar@1
   235
#define GLP_EBADB       0x01  /* invalid basis */
alpar@1
   236
#define GLP_ESING       0x02  /* singular matrix */
alpar@1
   237
#define GLP_ECOND       0x03  /* ill-conditioned matrix */
alpar@1
   238
#define GLP_EBOUND      0x04  /* invalid bounds */
alpar@1
   239
#define GLP_EFAIL       0x05  /* solver failed */
alpar@1
   240
#define GLP_EOBJLL      0x06  /* objective lower limit reached */
alpar@1
   241
#define GLP_EOBJUL      0x07  /* objective upper limit reached */
alpar@1
   242
#define GLP_EITLIM      0x08  /* iteration limit exceeded */
alpar@1
   243
#define GLP_ETMLIM      0x09  /* time limit exceeded */
alpar@1
   244
#define GLP_ENOPFS      0x0A  /* no primal feasible solution */
alpar@1
   245
#define GLP_ENODFS      0x0B  /* no dual feasible solution */
alpar@1
   246
#define GLP_EROOT       0x0C  /* root LP optimum not provided */
alpar@1
   247
#define GLP_ESTOP       0x0D  /* search terminated by application */
alpar@1
   248
#define GLP_EMIPGAP     0x0E  /* relative mip gap tolerance reached */
alpar@1
   249
#define GLP_ENOFEAS     0x0F  /* no primal/dual feasible solution */
alpar@1
   250
#define GLP_ENOCVG      0x10  /* no convergence */
alpar@1
   251
#define GLP_EINSTAB     0x11  /* numerical instability */
alpar@1
   252
#define GLP_EDATA       0x12  /* invalid data */
alpar@1
   253
#define GLP_ERANGE      0x13  /* result out of range */
alpar@1
   254
alpar@1
   255
/* condition indicator: */
alpar@1
   256
#define GLP_KKT_PE         1  /* primal equalities */
alpar@1
   257
#define GLP_KKT_PB         2  /* primal bounds */
alpar@1
   258
#define GLP_KKT_DE         3  /* dual equalities */
alpar@1
   259
#define GLP_KKT_DB         4  /* dual bounds */
alpar@1
   260
#define GLP_KKT_CS         5  /* complementary slackness */
alpar@1
   261
alpar@1
   262
/* MPS file format: */
alpar@1
   263
#define GLP_MPS_DECK       1  /* fixed (ancient) */
alpar@1
   264
#define GLP_MPS_FILE       2  /* free (modern) */
alpar@1
   265
alpar@1
   266
typedef struct
alpar@1
   267
{     /* MPS format control parameters */
alpar@1
   268
      int blank;
alpar@1
   269
      /* character code to replace blanks in symbolic names */
alpar@1
   270
      char *obj_name;
alpar@1
   271
      /* objective row name */
alpar@1
   272
      double tol_mps;
alpar@1
   273
      /* zero tolerance for MPS data */
alpar@1
   274
      double foo_bar[17];
alpar@1
   275
      /* (reserved for use in the future) */
alpar@1
   276
} glp_mpscp;
alpar@1
   277
alpar@1
   278
typedef struct
alpar@1
   279
{     /* CPLEX LP format control parameters */
alpar@1
   280
      double foo_bar[20];
alpar@1
   281
      /* (reserved for use in the future) */
alpar@1
   282
} glp_cpxcp;
alpar@1
   283
alpar@1
   284
#ifndef GLP_TRAN_DEFINED
alpar@1
   285
#define GLP_TRAN_DEFINED
alpar@1
   286
typedef struct { double _opaque_tran[100]; } glp_tran;
alpar@1
   287
/* MathProg translator workspace */
alpar@1
   288
#endif
alpar@1
   289
alpar@1
   290
glp_prob *glp_create_prob(void);
alpar@1
   291
/* create problem object */
alpar@1
   292
alpar@1
   293
void glp_set_prob_name(glp_prob *P, const char *name);
alpar@1
   294
/* assign (change) problem name */
alpar@1
   295
alpar@1
   296
void glp_set_obj_name(glp_prob *P, const char *name);
alpar@1
   297
/* assign (change) objective function name */
alpar@1
   298
alpar@1
   299
void glp_set_obj_dir(glp_prob *P, int dir);
alpar@1
   300
/* set (change) optimization direction flag */
alpar@1
   301
alpar@1
   302
int glp_add_rows(glp_prob *P, int nrs);
alpar@1
   303
/* add new rows to problem object */
alpar@1
   304
alpar@1
   305
int glp_add_cols(glp_prob *P, int ncs);
alpar@1
   306
/* add new columns to problem object */
alpar@1
   307
alpar@1
   308
void glp_set_row_name(glp_prob *P, int i, const char *name);
alpar@1
   309
/* assign (change) row name */
alpar@1
   310
alpar@1
   311
void glp_set_col_name(glp_prob *P, int j, const char *name);
alpar@1
   312
/* assign (change) column name */
alpar@1
   313
alpar@1
   314
void glp_set_row_bnds(glp_prob *P, int i, int type, double lb,
alpar@1
   315
      double ub);
alpar@1
   316
/* set (change) row bounds */
alpar@1
   317
alpar@1
   318
void glp_set_col_bnds(glp_prob *P, int j, int type, double lb,
alpar@1
   319
      double ub);
alpar@1
   320
/* set (change) column bounds */
alpar@1
   321
alpar@1
   322
void glp_set_obj_coef(glp_prob *P, int j, double coef);
alpar@1
   323
/* set (change) obj. coefficient or constant term */
alpar@1
   324
alpar@1
   325
void glp_set_mat_row(glp_prob *P, int i, int len, const int ind[],
alpar@1
   326
      const double val[]);
alpar@1
   327
/* set (replace) row of the constraint matrix */
alpar@1
   328
alpar@1
   329
void glp_set_mat_col(glp_prob *P, int j, int len, const int ind[],
alpar@1
   330
      const double val[]);
alpar@1
   331
/* set (replace) column of the constraint matrix */
alpar@1
   332
alpar@1
   333
void glp_load_matrix(glp_prob *P, int ne, const int ia[],
alpar@1
   334
      const int ja[], const double ar[]);
alpar@1
   335
/* load (replace) the whole constraint matrix */
alpar@1
   336
alpar@1
   337
int glp_check_dup(int m, int n, int ne, const int ia[], const int ja[]);
alpar@1
   338
/* check for duplicate elements in sparse matrix */
alpar@1
   339
alpar@1
   340
void glp_sort_matrix(glp_prob *P);
alpar@1
   341
/* sort elements of the constraint matrix */
alpar@1
   342
alpar@1
   343
void glp_del_rows(glp_prob *P, int nrs, const int num[]);
alpar@1
   344
/* delete specified rows from problem object */
alpar@1
   345
alpar@1
   346
void glp_del_cols(glp_prob *P, int ncs, const int num[]);
alpar@1
   347
/* delete specified columns from problem object */
alpar@1
   348
alpar@1
   349
void glp_copy_prob(glp_prob *dest, glp_prob *prob, int names);
alpar@1
   350
/* copy problem object content */
alpar@1
   351
alpar@1
   352
void glp_erase_prob(glp_prob *P);
alpar@1
   353
/* erase problem object content */
alpar@1
   354
alpar@1
   355
void glp_delete_prob(glp_prob *P);
alpar@1
   356
/* delete problem object */
alpar@1
   357
alpar@1
   358
const char *glp_get_prob_name(glp_prob *P);
alpar@1
   359
/* retrieve problem name */
alpar@1
   360
alpar@1
   361
const char *glp_get_obj_name(glp_prob *P);
alpar@1
   362
/* retrieve objective function name */
alpar@1
   363
alpar@1
   364
int glp_get_obj_dir(glp_prob *P);
alpar@1
   365
/* retrieve optimization direction flag */
alpar@1
   366
alpar@1
   367
int glp_get_num_rows(glp_prob *P);
alpar@1
   368
/* retrieve number of rows */
alpar@1
   369
alpar@1
   370
int glp_get_num_cols(glp_prob *P);
alpar@1
   371
/* retrieve number of columns */
alpar@1
   372
alpar@1
   373
const char *glp_get_row_name(glp_prob *P, int i);
alpar@1
   374
/* retrieve row name */
alpar@1
   375
alpar@1
   376
const char *glp_get_col_name(glp_prob *P, int j);
alpar@1
   377
/* retrieve column name */
alpar@1
   378
alpar@1
   379
int glp_get_row_type(glp_prob *P, int i);
alpar@1
   380
/* retrieve row type */
alpar@1
   381
alpar@1
   382
double glp_get_row_lb(glp_prob *P, int i);
alpar@1
   383
/* retrieve row lower bound */
alpar@1
   384
alpar@1
   385
double glp_get_row_ub(glp_prob *P, int i);
alpar@1
   386
/* retrieve row upper bound */
alpar@1
   387
alpar@1
   388
int glp_get_col_type(glp_prob *P, int j);
alpar@1
   389
/* retrieve column type */
alpar@1
   390
alpar@1
   391
double glp_get_col_lb(glp_prob *P, int j);
alpar@1
   392
/* retrieve column lower bound */
alpar@1
   393
alpar@1
   394
double glp_get_col_ub(glp_prob *P, int j);
alpar@1
   395
/* retrieve column upper bound */
alpar@1
   396
alpar@1
   397
double glp_get_obj_coef(glp_prob *P, int j);
alpar@1
   398
/* retrieve obj. coefficient or constant term */
alpar@1
   399
alpar@1
   400
int glp_get_num_nz(glp_prob *P);
alpar@1
   401
/* retrieve number of constraint coefficients */
alpar@1
   402
alpar@1
   403
int glp_get_mat_row(glp_prob *P, int i, int ind[], double val[]);
alpar@1
   404
/* retrieve row of the constraint matrix */
alpar@1
   405
alpar@1
   406
int glp_get_mat_col(glp_prob *P, int j, int ind[], double val[]);
alpar@1
   407
/* retrieve column of the constraint matrix */
alpar@1
   408
alpar@1
   409
void glp_create_index(glp_prob *P);
alpar@1
   410
/* create the name index */
alpar@1
   411
alpar@1
   412
int glp_find_row(glp_prob *P, const char *name);
alpar@1
   413
/* find row by its name */
alpar@1
   414
alpar@1
   415
int glp_find_col(glp_prob *P, const char *name);
alpar@1
   416
/* find column by its name */
alpar@1
   417
alpar@1
   418
void glp_delete_index(glp_prob *P);
alpar@1
   419
/* delete the name index */
alpar@1
   420
alpar@1
   421
void glp_set_rii(glp_prob *P, int i, double rii);
alpar@1
   422
/* set (change) row scale factor */
alpar@1
   423
alpar@1
   424
void glp_set_sjj(glp_prob *P, int j, double sjj);
alpar@1
   425
/* set (change) column scale factor */
alpar@1
   426
alpar@1
   427
double glp_get_rii(glp_prob *P, int i);
alpar@1
   428
/* retrieve row scale factor */
alpar@1
   429
alpar@1
   430
double glp_get_sjj(glp_prob *P, int j);
alpar@1
   431
/* retrieve column scale factor */
alpar@1
   432
alpar@1
   433
void glp_scale_prob(glp_prob *P, int flags);
alpar@1
   434
/* scale problem data */
alpar@1
   435
alpar@1
   436
void glp_unscale_prob(glp_prob *P);
alpar@1
   437
/* unscale problem data */
alpar@1
   438
alpar@1
   439
void glp_set_row_stat(glp_prob *P, int i, int stat);
alpar@1
   440
/* set (change) row status */
alpar@1
   441
alpar@1
   442
void glp_set_col_stat(glp_prob *P, int j, int stat);
alpar@1
   443
/* set (change) column status */
alpar@1
   444
alpar@1
   445
void glp_std_basis(glp_prob *P);
alpar@1
   446
/* construct standard initial LP basis */
alpar@1
   447
alpar@1
   448
void glp_adv_basis(glp_prob *P, int flags);
alpar@1
   449
/* construct advanced initial LP basis */
alpar@1
   450
alpar@1
   451
void glp_cpx_basis(glp_prob *P);
alpar@1
   452
/* construct Bixby's initial LP basis */
alpar@1
   453
alpar@1
   454
int glp_simplex(glp_prob *P, const glp_smcp *parm);
alpar@1
   455
/* solve LP problem with the simplex method */
alpar@1
   456
alpar@1
   457
int glp_exact(glp_prob *P, const glp_smcp *parm);
alpar@1
   458
/* solve LP problem in exact arithmetic */
alpar@1
   459
alpar@1
   460
void glp_init_smcp(glp_smcp *parm);
alpar@1
   461
/* initialize simplex method control parameters */
alpar@1
   462
alpar@1
   463
int glp_get_status(glp_prob *P);
alpar@1
   464
/* retrieve generic status of basic solution */
alpar@1
   465
alpar@1
   466
int glp_get_prim_stat(glp_prob *P);
alpar@1
   467
/* retrieve status of primal basic solution */
alpar@1
   468
alpar@1
   469
int glp_get_dual_stat(glp_prob *P);
alpar@1
   470
/* retrieve status of dual basic solution */
alpar@1
   471
alpar@1
   472
double glp_get_obj_val(glp_prob *P);
alpar@1
   473
/* retrieve objective value (basic solution) */
alpar@1
   474
alpar@1
   475
int glp_get_row_stat(glp_prob *P, int i);
alpar@1
   476
/* retrieve row status */
alpar@1
   477
alpar@1
   478
double glp_get_row_prim(glp_prob *P, int i);
alpar@1
   479
/* retrieve row primal value (basic solution) */
alpar@1
   480
alpar@1
   481
double glp_get_row_dual(glp_prob *P, int i);
alpar@1
   482
/* retrieve row dual value (basic solution) */
alpar@1
   483
alpar@1
   484
int glp_get_col_stat(glp_prob *P, int j);
alpar@1
   485
/* retrieve column status */
alpar@1
   486
alpar@1
   487
double glp_get_col_prim(glp_prob *P, int j);
alpar@1
   488
/* retrieve column primal value (basic solution) */
alpar@1
   489
alpar@1
   490
double glp_get_col_dual(glp_prob *P, int j);
alpar@1
   491
/* retrieve column dual value (basic solution) */
alpar@1
   492
alpar@1
   493
int glp_get_unbnd_ray(glp_prob *P);
alpar@1
   494
/* determine variable causing unboundedness */
alpar@1
   495
alpar@1
   496
int glp_interior(glp_prob *P, const glp_iptcp *parm);
alpar@1
   497
/* solve LP problem with the interior-point method */
alpar@1
   498
alpar@1
   499
void glp_init_iptcp(glp_iptcp *parm);
alpar@1
   500
/* initialize interior-point solver control parameters */
alpar@1
   501
alpar@1
   502
int glp_ipt_status(glp_prob *P);
alpar@1
   503
/* retrieve status of interior-point solution */
alpar@1
   504
alpar@1
   505
double glp_ipt_obj_val(glp_prob *P);
alpar@1
   506
/* retrieve objective value (interior point) */
alpar@1
   507
alpar@1
   508
double glp_ipt_row_prim(glp_prob *P, int i);
alpar@1
   509
/* retrieve row primal value (interior point) */
alpar@1
   510
alpar@1
   511
double glp_ipt_row_dual(glp_prob *P, int i);
alpar@1
   512
/* retrieve row dual value (interior point) */
alpar@1
   513
alpar@1
   514
double glp_ipt_col_prim(glp_prob *P, int j);
alpar@1
   515
/* retrieve column primal value (interior point) */
alpar@1
   516
alpar@1
   517
double glp_ipt_col_dual(glp_prob *P, int j);
alpar@1
   518
/* retrieve column dual value (interior point) */
alpar@1
   519
alpar@1
   520
void glp_set_col_kind(glp_prob *P, int j, int kind);
alpar@1
   521
/* set (change) column kind */
alpar@1
   522
alpar@1
   523
int glp_get_col_kind(glp_prob *P, int j);
alpar@1
   524
/* retrieve column kind */
alpar@1
   525
alpar@1
   526
int glp_get_num_int(glp_prob *P);
alpar@1
   527
/* retrieve number of integer columns */
alpar@1
   528
alpar@1
   529
int glp_get_num_bin(glp_prob *P);
alpar@1
   530
/* retrieve number of binary columns */
alpar@1
   531
alpar@1
   532
int glp_intopt(glp_prob *P, const glp_iocp *parm);
alpar@1
   533
/* solve MIP problem with the branch-and-bound method */
alpar@1
   534
alpar@1
   535
void glp_init_iocp(glp_iocp *parm);
alpar@1
   536
/* initialize integer optimizer control parameters */
alpar@1
   537
alpar@1
   538
int glp_mip_status(glp_prob *P);
alpar@1
   539
/* retrieve status of MIP solution */
alpar@1
   540
alpar@1
   541
double glp_mip_obj_val(glp_prob *P);
alpar@1
   542
/* retrieve objective value (MIP solution) */
alpar@1
   543
alpar@1
   544
double glp_mip_row_val(glp_prob *P, int i);
alpar@1
   545
/* retrieve row value (MIP solution) */
alpar@1
   546
alpar@1
   547
double glp_mip_col_val(glp_prob *P, int j);
alpar@1
   548
/* retrieve column value (MIP solution) */
alpar@1
   549
alpar@1
   550
int glp_print_sol(glp_prob *P, const char *fname);
alpar@1
   551
/* write basic solution in printable format */
alpar@1
   552
alpar@1
   553
int glp_read_sol(glp_prob *P, const char *fname);
alpar@1
   554
/* read basic solution from text file */
alpar@1
   555
alpar@1
   556
int glp_write_sol(glp_prob *P, const char *fname);
alpar@1
   557
/* write basic solution to text file */
alpar@1
   558
alpar@1
   559
int glp_print_ranges(glp_prob *P, int len, const int list[],
alpar@1
   560
      int flags, const char *fname);
alpar@1
   561
/* print sensitivity analysis report */
alpar@1
   562
alpar@1
   563
int glp_print_ipt(glp_prob *P, const char *fname);
alpar@1
   564
/* write interior-point solution in printable format */
alpar@1
   565
alpar@1
   566
int glp_read_ipt(glp_prob *P, const char *fname);
alpar@1
   567
/* read interior-point solution from text file */
alpar@1
   568
alpar@1
   569
int glp_write_ipt(glp_prob *P, const char *fname);
alpar@1
   570
/* write interior-point solution to text file */
alpar@1
   571
alpar@1
   572
int glp_print_mip(glp_prob *P, const char *fname);
alpar@1
   573
/* write MIP solution in printable format */
alpar@1
   574
alpar@1
   575
int glp_read_mip(glp_prob *P, const char *fname);
alpar@1
   576
/* read MIP solution from text file */
alpar@1
   577
alpar@1
   578
int glp_write_mip(glp_prob *P, const char *fname);
alpar@1
   579
/* write MIP solution to text file */
alpar@1
   580
alpar@1
   581
int glp_bf_exists(glp_prob *P);
alpar@1
   582
/* check if the basis factorization exists */
alpar@1
   583
alpar@1
   584
int glp_factorize(glp_prob *P);
alpar@1
   585
/* compute the basis factorization */
alpar@1
   586
alpar@1
   587
int glp_bf_updated(glp_prob *P);
alpar@1
   588
/* check if the basis factorization has been updated */
alpar@1
   589
alpar@1
   590
void glp_get_bfcp(glp_prob *P, glp_bfcp *parm);
alpar@1
   591
/* retrieve basis factorization control parameters */
alpar@1
   592
alpar@1
   593
void glp_set_bfcp(glp_prob *P, const glp_bfcp *parm);
alpar@1
   594
/* change basis factorization control parameters */
alpar@1
   595
alpar@1
   596
int glp_get_bhead(glp_prob *P, int k);
alpar@1
   597
/* retrieve the basis header information */
alpar@1
   598
alpar@1
   599
int glp_get_row_bind(glp_prob *P, int i);
alpar@1
   600
/* retrieve row index in the basis header */
alpar@1
   601
alpar@1
   602
int glp_get_col_bind(glp_prob *P, int j);
alpar@1
   603
/* retrieve column index in the basis header */
alpar@1
   604
alpar@1
   605
void glp_ftran(glp_prob *P, double x[]);
alpar@1
   606
/* perform forward transformation (solve system B*x = b) */
alpar@1
   607
alpar@1
   608
void glp_btran(glp_prob *P, double x[]);
alpar@1
   609
/* perform backward transformation (solve system B'*x = b) */
alpar@1
   610
alpar@1
   611
int glp_warm_up(glp_prob *P);
alpar@1
   612
/* "warm up" LP basis */
alpar@1
   613
alpar@1
   614
int glp_eval_tab_row(glp_prob *P, int k, int ind[], double val[]);
alpar@1
   615
/* compute row of the simplex tableau */
alpar@1
   616
alpar@1
   617
int glp_eval_tab_col(glp_prob *P, int k, int ind[], double val[]);
alpar@1
   618
/* compute column of the simplex tableau */
alpar@1
   619
alpar@1
   620
int glp_transform_row(glp_prob *P, int len, int ind[], double val[]);
alpar@1
   621
/* transform explicitly specified row */
alpar@1
   622
alpar@1
   623
int glp_transform_col(glp_prob *P, int len, int ind[], double val[]);
alpar@1
   624
/* transform explicitly specified column */
alpar@1
   625
alpar@1
   626
int glp_prim_rtest(glp_prob *P, int len, const int ind[],
alpar@1
   627
      const double val[], int dir, double eps);
alpar@1
   628
/* perform primal ratio test */
alpar@1
   629
alpar@1
   630
int glp_dual_rtest(glp_prob *P, int len, const int ind[],
alpar@1
   631
      const double val[], int dir, double eps);
alpar@1
   632
/* perform dual ratio test */
alpar@1
   633
alpar@1
   634
void glp_analyze_bound(glp_prob *P, int k, double *value1, int *var1,
alpar@1
   635
      double *value2, int *var2);
alpar@1
   636
/* analyze active bound of non-basic variable */
alpar@1
   637
alpar@1
   638
void glp_analyze_coef(glp_prob *P, int k, double *coef1, int *var1,
alpar@1
   639
      double *value1, double *coef2, int *var2, double *value2);
alpar@1
   640
/* analyze objective coefficient at basic variable */
alpar@1
   641
alpar@1
   642
int glp_ios_reason(glp_tree *T);
alpar@1
   643
/* determine reason for calling the callback routine */
alpar@1
   644
alpar@1
   645
glp_prob *glp_ios_get_prob(glp_tree *T);
alpar@1
   646
/* access the problem object */
alpar@1
   647
alpar@1
   648
void glp_ios_tree_size(glp_tree *T, int *a_cnt, int *n_cnt,
alpar@1
   649
      int *t_cnt);
alpar@1
   650
/* determine size of the branch-and-bound tree */
alpar@1
   651
alpar@1
   652
int glp_ios_curr_node(glp_tree *T);
alpar@1
   653
/* determine current active subproblem */
alpar@1
   654
alpar@1
   655
int glp_ios_next_node(glp_tree *T, int p);
alpar@1
   656
/* determine next active subproblem */
alpar@1
   657
alpar@1
   658
int glp_ios_prev_node(glp_tree *T, int p);
alpar@1
   659
/* determine previous active subproblem */
alpar@1
   660
alpar@1
   661
int glp_ios_up_node(glp_tree *T, int p);
alpar@1
   662
/* determine parent subproblem */
alpar@1
   663
alpar@1
   664
int glp_ios_node_level(glp_tree *T, int p);
alpar@1
   665
/* determine subproblem level */
alpar@1
   666
alpar@1
   667
double glp_ios_node_bound(glp_tree *T, int p);
alpar@1
   668
/* determine subproblem local bound */
alpar@1
   669
alpar@1
   670
int glp_ios_best_node(glp_tree *T);
alpar@1
   671
/* find active subproblem with best local bound */
alpar@1
   672
alpar@1
   673
double glp_ios_mip_gap(glp_tree *T);
alpar@1
   674
/* compute relative MIP gap */
alpar@1
   675
alpar@1
   676
void *glp_ios_node_data(glp_tree *T, int p);
alpar@1
   677
/* access subproblem application-specific data */
alpar@1
   678
alpar@1
   679
void glp_ios_row_attr(glp_tree *T, int i, glp_attr *attr);
alpar@1
   680
/* retrieve additional row attributes */
alpar@1
   681
alpar@1
   682
int glp_ios_pool_size(glp_tree *T);
alpar@1
   683
/* determine current size of the cut pool */
alpar@1
   684
alpar@1
   685
int glp_ios_add_row(glp_tree *T,
alpar@1
   686
      const char *name, int klass, int flags, int len, const int ind[],
alpar@1
   687
      const double val[], int type, double rhs);
alpar@1
   688
/* add row (constraint) to the cut pool */
alpar@1
   689
alpar@1
   690
void glp_ios_del_row(glp_tree *T, int i);
alpar@1
   691
/* remove row (constraint) from the cut pool */
alpar@1
   692
alpar@1
   693
void glp_ios_clear_pool(glp_tree *T);
alpar@1
   694
/* remove all rows (constraints) from the cut pool */
alpar@1
   695
alpar@1
   696
int glp_ios_can_branch(glp_tree *T, int j);
alpar@1
   697
/* check if can branch upon specified variable */
alpar@1
   698
alpar@1
   699
void glp_ios_branch_upon(glp_tree *T, int j, int sel);
alpar@1
   700
/* choose variable to branch upon */
alpar@1
   701
alpar@1
   702
void glp_ios_select_node(glp_tree *T, int p);
alpar@1
   703
/* select subproblem to continue the search */
alpar@1
   704
alpar@1
   705
int glp_ios_heur_sol(glp_tree *T, const double x[]);
alpar@1
   706
/* provide solution found by heuristic */
alpar@1
   707
alpar@1
   708
void glp_ios_terminate(glp_tree *T);
alpar@1
   709
/* terminate the solution process */
alpar@1
   710
alpar@1
   711
void glp_init_mpscp(glp_mpscp *parm);
alpar@1
   712
/* initialize MPS format control parameters */
alpar@1
   713
alpar@1
   714
int glp_read_mps(glp_prob *P, int fmt, const glp_mpscp *parm,
alpar@1
   715
      const char *fname);
alpar@1
   716
/* read problem data in MPS format */
alpar@1
   717
alpar@1
   718
int glp_write_mps(glp_prob *P, int fmt, const glp_mpscp *parm,
alpar@1
   719
      const char *fname);
alpar@1
   720
/* write problem data in MPS format */
alpar@1
   721
alpar@1
   722
void glp_init_cpxcp(glp_cpxcp *parm);
alpar@1
   723
/* initialize CPLEX LP format control parameters */
alpar@1
   724
alpar@1
   725
int glp_read_lp(glp_prob *P, const glp_cpxcp *parm, const char *fname);
alpar@1
   726
/* read problem data in CPLEX LP format */
alpar@1
   727
alpar@1
   728
int glp_write_lp(glp_prob *P, const glp_cpxcp *parm, const char *fname);
alpar@1
   729
/* write problem data in CPLEX LP format */
alpar@1
   730
alpar@1
   731
int glp_read_prob(glp_prob *P, int flags, const char *fname);
alpar@1
   732
/* read problem data in GLPK format */
alpar@1
   733
alpar@1
   734
int glp_write_prob(glp_prob *P, int flags, const char *fname);
alpar@1
   735
/* write problem data in GLPK format */
alpar@1
   736
alpar@1
   737
glp_tran *glp_mpl_alloc_wksp(void);
alpar@1
   738
/* allocate the MathProg translator workspace */
alpar@1
   739
alpar@1
   740
int glp_mpl_read_model(glp_tran *tran, const char *fname, int skip);
alpar@1
   741
/* read and translate model section */
alpar@1
   742
alpar@1
   743
int glp_mpl_read_data(glp_tran *tran, const char *fname);
alpar@1
   744
/* read and translate data section */
alpar@1
   745
alpar@1
   746
int glp_mpl_generate(glp_tran *tran, const char *fname);
alpar@1
   747
/* generate the model */
alpar@1
   748
alpar@1
   749
void glp_mpl_build_prob(glp_tran *tran, glp_prob *prob);
alpar@1
   750
/* build LP/MIP problem instance from the model */
alpar@1
   751
alpar@1
   752
int glp_mpl_postsolve(glp_tran *tran, glp_prob *prob, int sol);
alpar@1
   753
/* postsolve the model */
alpar@1
   754
alpar@1
   755
void glp_mpl_free_wksp(glp_tran *tran);
alpar@1
   756
/* free the MathProg translator workspace */
alpar@1
   757
alpar@1
   758
int glp_main(int argc, const char *argv[]);
alpar@1
   759
/* stand-alone LP/MIP solver */
alpar@1
   760
alpar@1
   761
/**********************************************************************/
alpar@1
   762
alpar@1
   763
#ifndef GLP_LONG_DEFINED
alpar@1
   764
#define GLP_LONG_DEFINED
alpar@1
   765
typedef struct { int lo, hi; } glp_long;
alpar@1
   766
/* long integer data type */
alpar@1
   767
#endif
alpar@1
   768
alpar@1
   769
int glp_init_env(void);
alpar@1
   770
/* initialize GLPK environment */
alpar@1
   771
alpar@1
   772
const char *glp_version(void);
alpar@1
   773
/* determine library version */
alpar@1
   774
alpar@1
   775
int glp_free_env(void);
alpar@1
   776
/* free GLPK environment */
alpar@1
   777
alpar@1
   778
void glp_printf(const char *fmt, ...);
alpar@1
   779
/* write formatted output to terminal */
alpar@1
   780
alpar@1
   781
void glp_vprintf(const char *fmt, va_list arg);
alpar@1
   782
/* write formatted output to terminal */
alpar@1
   783
alpar@1
   784
int glp_term_out(int flag);
alpar@1
   785
/* enable/disable terminal output */
alpar@1
   786
alpar@1
   787
void glp_term_hook(int (*func)(void *info, const char *s), void *info);
alpar@1
   788
/* install hook to intercept terminal output */
alpar@1
   789
alpar@1
   790
int glp_open_tee(const char *fname);
alpar@1
   791
/* start copying terminal output to text file */
alpar@1
   792
alpar@1
   793
int glp_close_tee(void);
alpar@1
   794
/* stop copying terminal output to text file */
alpar@1
   795
alpar@1
   796
#ifndef GLP_ERROR_DEFINED
alpar@1
   797
#define GLP_ERROR_DEFINED
alpar@1
   798
typedef void (*_glp_error)(const char *fmt, ...);
alpar@1
   799
#endif
alpar@1
   800
alpar@1
   801
#define glp_error glp_error_(__FILE__, __LINE__)
alpar@1
   802
_glp_error glp_error_(const char *file, int line);
alpar@1
   803
/* display error message and terminate execution */
alpar@1
   804
alpar@1
   805
#define glp_assert(expr) \
alpar@1
   806
      ((void)((expr) || (glp_assert_(#expr, __FILE__, __LINE__), 1)))
alpar@1
   807
void glp_assert_(const char *expr, const char *file, int line);
alpar@1
   808
/* check for logical condition */
alpar@1
   809
alpar@1
   810
void glp_error_hook(void (*func)(void *info), void *info);
alpar@1
   811
/* install hook to intercept abnormal termination */
alpar@1
   812
alpar@1
   813
void *glp_malloc(int size);
alpar@1
   814
/* allocate memory block */
alpar@1
   815
alpar@1
   816
void *glp_calloc(int n, int size);
alpar@1
   817
/* allocate memory block */
alpar@1
   818
alpar@1
   819
void glp_free(void *ptr);
alpar@1
   820
/* free memory block */
alpar@1
   821
alpar@1
   822
void glp_mem_limit(int limit);
alpar@1
   823
/* set memory usage limit */
alpar@1
   824
alpar@1
   825
void glp_mem_usage(int *count, int *cpeak, glp_long *total,
alpar@1
   826
      glp_long *tpeak);
alpar@1
   827
/* get memory usage information */
alpar@1
   828
alpar@1
   829
glp_long glp_time(void);
alpar@1
   830
/* determine current universal time */
alpar@1
   831
alpar@1
   832
double glp_difftime(glp_long t1, glp_long t0);
alpar@1
   833
/* compute difference between two time values */
alpar@1
   834
alpar@1
   835
/**********************************************************************/
alpar@1
   836
alpar@1
   837
#ifndef GLP_DATA_DEFINED
alpar@1
   838
#define GLP_DATA_DEFINED
alpar@1
   839
typedef struct { double _opaque_data[100]; } glp_data;
alpar@1
   840
/* plain data file */
alpar@1
   841
#endif
alpar@1
   842
alpar@1
   843
glp_data *glp_sdf_open_file(const char *fname);
alpar@1
   844
/* open plain data file */
alpar@1
   845
alpar@1
   846
void glp_sdf_set_jump(glp_data *data, void *jump);
alpar@1
   847
/* set up error handling */
alpar@1
   848
alpar@1
   849
void glp_sdf_error(glp_data *data, const char *fmt, ...);
alpar@1
   850
/* print error message */
alpar@1
   851
alpar@1
   852
void glp_sdf_warning(glp_data *data, const char *fmt, ...);
alpar@1
   853
/* print warning message */
alpar@1
   854
alpar@1
   855
int glp_sdf_read_int(glp_data *data);
alpar@1
   856
/* read integer number */
alpar@1
   857
alpar@1
   858
double glp_sdf_read_num(glp_data *data);
alpar@1
   859
/* read floating-point number */
alpar@1
   860
alpar@1
   861
const char *glp_sdf_read_item(glp_data *data);
alpar@1
   862
/* read data item */
alpar@1
   863
alpar@1
   864
const char *glp_sdf_read_text(glp_data *data);
alpar@1
   865
/* read text until end of line */
alpar@1
   866
alpar@1
   867
int glp_sdf_line(glp_data *data);
alpar@1
   868
/* determine current line number */
alpar@1
   869
alpar@1
   870
void glp_sdf_close_file(glp_data *data);
alpar@1
   871
/* close plain data file */
alpar@1
   872
alpar@1
   873
/**********************************************************************/
alpar@1
   874
alpar@1
   875
typedef struct _glp_graph glp_graph;
alpar@1
   876
typedef struct _glp_vertex glp_vertex;
alpar@1
   877
typedef struct _glp_arc glp_arc;
alpar@1
   878
alpar@1
   879
struct _glp_graph
alpar@1
   880
{     /* graph descriptor */
alpar@1
   881
      void *pool; /* DMP *pool; */
alpar@1
   882
      /* memory pool to store graph components */
alpar@1
   883
      char *name;
alpar@1
   884
      /* graph name (1 to 255 chars); NULL means no name is assigned
alpar@1
   885
         to the graph */
alpar@1
   886
      int nv_max;
alpar@1
   887
      /* length of the vertex list (enlarged automatically) */
alpar@1
   888
      int nv;
alpar@1
   889
      /* number of vertices in the graph, 0 <= nv <= nv_max */
alpar@1
   890
      int na;
alpar@1
   891
      /* number of arcs in the graph, na >= 0 */
alpar@1
   892
      glp_vertex **v; /* glp_vertex *v[1+nv_max]; */
alpar@1
   893
      /* v[i], 1 <= i <= nv, is a pointer to i-th vertex */
alpar@1
   894
      void *index; /* AVL *index; */
alpar@1
   895
      /* vertex index to find vertices by their names; NULL means the
alpar@1
   896
         index does not exist */
alpar@1
   897
      int v_size;
alpar@1
   898
      /* size of data associated with each vertex (0 to 256 bytes) */
alpar@1
   899
      int a_size;
alpar@1
   900
      /* size of data associated with each arc (0 to 256 bytes) */
alpar@1
   901
};
alpar@1
   902
alpar@1
   903
struct _glp_vertex
alpar@1
   904
{     /* vertex descriptor */
alpar@1
   905
      int i;
alpar@1
   906
      /* vertex ordinal number, 1 <= i <= nv */
alpar@1
   907
      char *name;
alpar@1
   908
      /* vertex name (1 to 255 chars); NULL means no name is assigned
alpar@1
   909
         to the vertex */
alpar@1
   910
      void *entry; /* AVLNODE *entry; */
alpar@1
   911
      /* pointer to corresponding entry in the vertex index; NULL means
alpar@1
   912
         that either the index does not exist or the vertex has no name
alpar@1
   913
         assigned */
alpar@1
   914
      void *data;
alpar@1
   915
      /* pointer to data associated with the vertex */
alpar@1
   916
      void *temp;
alpar@1
   917
      /* working pointer */
alpar@1
   918
      glp_arc *in;
alpar@1
   919
      /* pointer to the (unordered) list of incoming arcs */
alpar@1
   920
      glp_arc *out;
alpar@1
   921
      /* pointer to the (unordered) list of outgoing arcs */
alpar@1
   922
};
alpar@1
   923
alpar@1
   924
struct _glp_arc
alpar@1
   925
{     /* arc descriptor */
alpar@1
   926
      glp_vertex *tail;
alpar@1
   927
      /* pointer to the tail endpoint */
alpar@1
   928
      glp_vertex *head;
alpar@1
   929
      /* pointer to the head endpoint */
alpar@1
   930
      void *data;
alpar@1
   931
      /* pointer to data associated with the arc */
alpar@1
   932
      void *temp;
alpar@1
   933
      /* working pointer */
alpar@1
   934
      glp_arc *t_prev;
alpar@1
   935
      /* pointer to previous arc having the same tail endpoint */
alpar@1
   936
      glp_arc *t_next;
alpar@1
   937
      /* pointer to next arc having the same tail endpoint */
alpar@1
   938
      glp_arc *h_prev;
alpar@1
   939
      /* pointer to previous arc having the same head endpoint */
alpar@1
   940
      glp_arc *h_next;
alpar@1
   941
      /* pointer to next arc having the same head endpoint */
alpar@1
   942
};
alpar@1
   943
alpar@1
   944
glp_graph *glp_create_graph(int v_size, int a_size);
alpar@1
   945
/* create graph */
alpar@1
   946
alpar@1
   947
void glp_set_graph_name(glp_graph *G, const char *name);
alpar@1
   948
/* assign (change) graph name */
alpar@1
   949
alpar@1
   950
int glp_add_vertices(glp_graph *G, int nadd);
alpar@1
   951
/* add new vertices to graph */
alpar@1
   952
alpar@1
   953
void glp_set_vertex_name(glp_graph *G, int i, const char *name);
alpar@1
   954
/* assign (change) vertex name */
alpar@1
   955
alpar@1
   956
glp_arc *glp_add_arc(glp_graph *G, int i, int j);
alpar@1
   957
/* add new arc to graph */
alpar@1
   958
alpar@1
   959
void glp_del_vertices(glp_graph *G, int ndel, const int num[]);
alpar@1
   960
/* delete vertices from graph */
alpar@1
   961
alpar@1
   962
void glp_del_arc(glp_graph *G, glp_arc *a);
alpar@1
   963
/* delete arc from graph */
alpar@1
   964
alpar@1
   965
void glp_erase_graph(glp_graph *G, int v_size, int a_size);
alpar@1
   966
/* erase graph content */
alpar@1
   967
alpar@1
   968
void glp_delete_graph(glp_graph *G);
alpar@1
   969
/* delete graph */
alpar@1
   970
alpar@1
   971
void glp_create_v_index(glp_graph *G);
alpar@1
   972
/* create vertex name index */
alpar@1
   973
alpar@1
   974
int glp_find_vertex(glp_graph *G, const char *name);
alpar@1
   975
/* find vertex by its name */
alpar@1
   976
alpar@1
   977
void glp_delete_v_index(glp_graph *G);
alpar@1
   978
/* delete vertex name index */
alpar@1
   979
alpar@1
   980
int glp_read_graph(glp_graph *G, const char *fname);
alpar@1
   981
/* read graph from plain text file */
alpar@1
   982
alpar@1
   983
int glp_write_graph(glp_graph *G, const char *fname);
alpar@1
   984
/* write graph to plain text file */
alpar@1
   985
alpar@1
   986
void glp_mincost_lp(glp_prob *P, glp_graph *G, int names, int v_rhs,
alpar@1
   987
      int a_low, int a_cap, int a_cost);
alpar@1
   988
/* convert minimum cost flow problem to LP */
alpar@1
   989
alpar@1
   990
int glp_mincost_okalg(glp_graph *G, int v_rhs, int a_low, int a_cap,
alpar@1
   991
      int a_cost, double *sol, int a_x, int v_pi);
alpar@1
   992
/* find minimum-cost flow with out-of-kilter algorithm */
alpar@1
   993
alpar@1
   994
void glp_maxflow_lp(glp_prob *P, glp_graph *G, int names, int s,
alpar@1
   995
      int t, int a_cap);
alpar@1
   996
/* convert maximum flow problem to LP */
alpar@1
   997
alpar@1
   998
int glp_maxflow_ffalg(glp_graph *G, int s, int t, int a_cap,
alpar@1
   999
      double *sol, int a_x, int v_cut);
alpar@1
  1000
/* find maximal flow with Ford-Fulkerson algorithm */
alpar@1
  1001
alpar@1
  1002
int glp_check_asnprob(glp_graph *G, int v_set);
alpar@1
  1003
/* check correctness of assignment problem data */
alpar@1
  1004
alpar@1
  1005
/* assignment problem formulation: */
alpar@1
  1006
#define GLP_ASN_MIN        1  /* perfect matching (minimization) */
alpar@1
  1007
#define GLP_ASN_MAX        2  /* perfect matching (maximization) */
alpar@1
  1008
#define GLP_ASN_MMP        3  /* maximum matching */
alpar@1
  1009
alpar@1
  1010
int glp_asnprob_lp(glp_prob *P, int form, glp_graph *G, int names,
alpar@1
  1011
      int v_set, int a_cost);
alpar@1
  1012
/* convert assignment problem to LP */
alpar@1
  1013
alpar@1
  1014
int glp_asnprob_okalg(int form, glp_graph *G, int v_set, int a_cost,
alpar@1
  1015
      double *sol, int a_x);
alpar@1
  1016
/* solve assignment problem with out-of-kilter algorithm */
alpar@1
  1017
alpar@1
  1018
int glp_asnprob_hall(glp_graph *G, int v_set, int a_x);
alpar@1
  1019
/* find bipartite matching of maximum cardinality */
alpar@1
  1020
alpar@1
  1021
double glp_cpp(glp_graph *G, int v_t, int v_es, int v_ls);
alpar@1
  1022
/* solve critical path problem */
alpar@1
  1023
alpar@1
  1024
int glp_read_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap,
alpar@1
  1025
      int a_cost, const char *fname);
alpar@1
  1026
/* read min-cost flow problem data in DIMACS format */
alpar@1
  1027
alpar@1
  1028
int glp_write_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap,
alpar@1
  1029
      int a_cost, const char *fname);
alpar@1
  1030
/* write min-cost flow problem data in DIMACS format */
alpar@1
  1031
alpar@1
  1032
int glp_read_maxflow(glp_graph *G, int *s, int *t, int a_cap,
alpar@1
  1033
      const char *fname);
alpar@1
  1034
/* read maximum flow problem data in DIMACS format */
alpar@1
  1035
alpar@1
  1036
int glp_write_maxflow(glp_graph *G, int s, int t, int a_cap,
alpar@1
  1037
      const char *fname);
alpar@1
  1038
/* write maximum flow problem data in DIMACS format */
alpar@1
  1039
alpar@1
  1040
int glp_read_asnprob(glp_graph *G, int v_set, int a_cost, const char
alpar@1
  1041
      *fname);
alpar@1
  1042
/* read assignment problem data in DIMACS format */
alpar@1
  1043
alpar@1
  1044
int glp_write_asnprob(glp_graph *G, int v_set, int a_cost, const char
alpar@1
  1045
      *fname);
alpar@1
  1046
/* write assignment problem data in DIMACS format */
alpar@1
  1047
alpar@1
  1048
int glp_read_ccdata(glp_graph *G, int v_wgt, const char *fname);
alpar@1
  1049
/* read graph in DIMACS clique/coloring format */
alpar@1
  1050
alpar@1
  1051
int glp_write_ccdata(glp_graph *G, int v_wgt, const char *fname);
alpar@1
  1052
/* write graph in DIMACS clique/coloring format */
alpar@1
  1053
alpar@1
  1054
int glp_netgen(glp_graph *G, int v_rhs, int a_cap, int a_cost,
alpar@1
  1055
      const int parm[1+15]);
alpar@1
  1056
/* Klingman's network problem generator */
alpar@1
  1057
alpar@1
  1058
int glp_gridgen(glp_graph *G, int v_rhs, int a_cap, int a_cost,
alpar@1
  1059
      const int parm[1+14]);
alpar@1
  1060
/* grid-like network problem generator */
alpar@1
  1061
alpar@1
  1062
int glp_rmfgen(glp_graph *G, int *s, int *t, int a_cap,
alpar@1
  1063
      const int parm[1+5]);
alpar@1
  1064
/* Goldfarb's maximum flow problem generator */
alpar@1
  1065
alpar@1
  1066
int glp_weak_comp(glp_graph *G, int v_num);
alpar@1
  1067
/* find all weakly connected components of graph */
alpar@1
  1068
alpar@1
  1069
int glp_strong_comp(glp_graph *G, int v_num);
alpar@1
  1070
/* find all strongly connected components of graph */
alpar@1
  1071
alpar@1
  1072
int glp_top_sort(glp_graph *G, int v_num);
alpar@1
  1073
/* topological sorting of acyclic digraph */
alpar@1
  1074
alpar@1
  1075
int glp_wclique_exact(glp_graph *G, int v_wgt, double *sol, int v_set);
alpar@1
  1076
/* find maximum weight clique with exact algorithm */
alpar@1
  1077
alpar@1
  1078
/***********************************************************************
alpar@1
  1079
*  NOTE: All symbols defined below are obsolete and kept here only for
alpar@1
  1080
*        backward compatibility.
alpar@1
  1081
***********************************************************************/
alpar@1
  1082
alpar@1
  1083
#define LPX glp_prob
alpar@1
  1084
alpar@1
  1085
/* problem class: */
alpar@1
  1086
#define LPX_LP          100   /* linear programming (LP) */
alpar@1
  1087
#define LPX_MIP         101   /* mixed integer programming (MIP) */
alpar@1
  1088
alpar@1
  1089
/* type of auxiliary/structural variable: */
alpar@1
  1090
#define LPX_FR          110   /* free variable */
alpar@1
  1091
#define LPX_LO          111   /* variable with lower bound */
alpar@1
  1092
#define LPX_UP          112   /* variable with upper bound */
alpar@1
  1093
#define LPX_DB          113   /* double-bounded variable */
alpar@1
  1094
#define LPX_FX          114   /* fixed variable */
alpar@1
  1095
alpar@1
  1096
/* optimization direction flag: */
alpar@1
  1097
#define LPX_MIN         120   /* minimization */
alpar@1
  1098
#define LPX_MAX         121   /* maximization */
alpar@1
  1099
alpar@1
  1100
/* status of primal basic solution: */
alpar@1
  1101
#define LPX_P_UNDEF     132   /* primal solution is undefined */
alpar@1
  1102
#define LPX_P_FEAS      133   /* solution is primal feasible */
alpar@1
  1103
#define LPX_P_INFEAS    134   /* solution is primal infeasible */
alpar@1
  1104
#define LPX_P_NOFEAS    135   /* no primal feasible solution exists */
alpar@1
  1105
alpar@1
  1106
/* status of dual basic solution: */
alpar@1
  1107
#define LPX_D_UNDEF     136   /* dual solution is undefined */
alpar@1
  1108
#define LPX_D_FEAS      137   /* solution is dual feasible */
alpar@1
  1109
#define LPX_D_INFEAS    138   /* solution is dual infeasible */
alpar@1
  1110
#define LPX_D_NOFEAS    139   /* no dual feasible solution exists */
alpar@1
  1111
alpar@1
  1112
/* status of auxiliary/structural variable: */
alpar@1
  1113
#define LPX_BS          140   /* basic variable */
alpar@1
  1114
#define LPX_NL          141   /* non-basic variable on lower bound */
alpar@1
  1115
#define LPX_NU          142   /* non-basic variable on upper bound */
alpar@1
  1116
#define LPX_NF          143   /* non-basic free variable */
alpar@1
  1117
#define LPX_NS          144   /* non-basic fixed variable */
alpar@1
  1118
alpar@1
  1119
/* status of interior-point solution: */
alpar@1
  1120
#define LPX_T_UNDEF     150   /* interior solution is undefined */
alpar@1
  1121
#define LPX_T_OPT       151   /* interior solution is optimal */
alpar@1
  1122
alpar@1
  1123
/* kind of structural variable: */
alpar@1
  1124
#define LPX_CV          160   /* continuous variable */
alpar@1
  1125
#define LPX_IV          161   /* integer variable */
alpar@1
  1126
alpar@1
  1127
/* status of integer solution: */
alpar@1
  1128
#define LPX_I_UNDEF     170   /* integer solution is undefined */
alpar@1
  1129
#define LPX_I_OPT       171   /* integer solution is optimal */
alpar@1
  1130
#define LPX_I_FEAS      172   /* integer solution is feasible */
alpar@1
  1131
#define LPX_I_NOFEAS    173   /* no integer solution exists */
alpar@1
  1132
alpar@1
  1133
/* status codes reported by the routine lpx_get_status: */
alpar@1
  1134
#define LPX_OPT         180   /* optimal */
alpar@1
  1135
#define LPX_FEAS        181   /* feasible */
alpar@1
  1136
#define LPX_INFEAS      182   /* infeasible */
alpar@1
  1137
#define LPX_NOFEAS      183   /* no feasible */
alpar@1
  1138
#define LPX_UNBND       184   /* unbounded */
alpar@1
  1139
#define LPX_UNDEF       185   /* undefined */
alpar@1
  1140
alpar@1
  1141
/* exit codes returned by solver routines: */
alpar@1
  1142
#define LPX_E_OK        200   /* success */
alpar@1
  1143
#define LPX_E_EMPTY     201   /* empty problem */
alpar@1
  1144
#define LPX_E_BADB      202   /* invalid initial basis */
alpar@1
  1145
#define LPX_E_INFEAS    203   /* infeasible initial solution */
alpar@1
  1146
#define LPX_E_FAULT     204   /* unable to start the search */
alpar@1
  1147
#define LPX_E_OBJLL     205   /* objective lower limit reached */
alpar@1
  1148
#define LPX_E_OBJUL     206   /* objective upper limit reached */
alpar@1
  1149
#define LPX_E_ITLIM     207   /* iterations limit exhausted */
alpar@1
  1150
#define LPX_E_TMLIM     208   /* time limit exhausted */
alpar@1
  1151
#define LPX_E_NOFEAS    209   /* no feasible solution */
alpar@1
  1152
#define LPX_E_INSTAB    210   /* numerical instability */
alpar@1
  1153
#define LPX_E_SING      211   /* problems with basis matrix */
alpar@1
  1154
#define LPX_E_NOCONV    212   /* no convergence (interior) */
alpar@1
  1155
#define LPX_E_NOPFS     213   /* no primal feas. sol. (LP presolver) */
alpar@1
  1156
#define LPX_E_NODFS     214   /* no dual feas. sol. (LP presolver) */
alpar@1
  1157
#define LPX_E_MIPGAP    215   /* relative mip gap tolerance reached */
alpar@1
  1158
alpar@1
  1159
/* control parameter identifiers: */
alpar@1
  1160
#define LPX_K_MSGLEV    300   /* lp->msg_lev */
alpar@1
  1161
#define LPX_K_SCALE     301   /* lp->scale */
alpar@1
  1162
#define LPX_K_DUAL      302   /* lp->dual */
alpar@1
  1163
#define LPX_K_PRICE     303   /* lp->price */
alpar@1
  1164
#define LPX_K_RELAX     304   /* lp->relax */
alpar@1
  1165
#define LPX_K_TOLBND    305   /* lp->tol_bnd */
alpar@1
  1166
#define LPX_K_TOLDJ     306   /* lp->tol_dj */
alpar@1
  1167
#define LPX_K_TOLPIV    307   /* lp->tol_piv */
alpar@1
  1168
#define LPX_K_ROUND     308   /* lp->round */
alpar@1
  1169
#define LPX_K_OBJLL     309   /* lp->obj_ll */
alpar@1
  1170
#define LPX_K_OBJUL     310   /* lp->obj_ul */
alpar@1
  1171
#define LPX_K_ITLIM     311   /* lp->it_lim */
alpar@1
  1172
#define LPX_K_ITCNT     312   /* lp->it_cnt */
alpar@1
  1173
#define LPX_K_TMLIM     313   /* lp->tm_lim */
alpar@1
  1174
#define LPX_K_OUTFRQ    314   /* lp->out_frq */
alpar@1
  1175
#define LPX_K_OUTDLY    315   /* lp->out_dly */
alpar@1
  1176
#define LPX_K_BRANCH    316   /* lp->branch */
alpar@1
  1177
#define LPX_K_BTRACK    317   /* lp->btrack */
alpar@1
  1178
#define LPX_K_TOLINT    318   /* lp->tol_int */
alpar@1
  1179
#define LPX_K_TOLOBJ    319   /* lp->tol_obj */
alpar@1
  1180
#define LPX_K_MPSINFO   320   /* lp->mps_info */
alpar@1
  1181
#define LPX_K_MPSOBJ    321   /* lp->mps_obj */
alpar@1
  1182
#define LPX_K_MPSORIG   322   /* lp->mps_orig */
alpar@1
  1183
#define LPX_K_MPSWIDE   323   /* lp->mps_wide */
alpar@1
  1184
#define LPX_K_MPSFREE   324   /* lp->mps_free */
alpar@1
  1185
#define LPX_K_MPSSKIP   325   /* lp->mps_skip */
alpar@1
  1186
#define LPX_K_LPTORIG   326   /* lp->lpt_orig */
alpar@1
  1187
#define LPX_K_PRESOL    327   /* lp->presol */
alpar@1
  1188
#define LPX_K_BINARIZE  328   /* lp->binarize */
alpar@1
  1189
#define LPX_K_USECUTS   329   /* lp->use_cuts */
alpar@1
  1190
#define LPX_K_BFTYPE    330   /* lp->bfcp->type */
alpar@1
  1191
#define LPX_K_MIPGAP    331   /* lp->mip_gap */
alpar@1
  1192
alpar@1
  1193
#define LPX_C_COVER     0x01  /* mixed cover cuts */
alpar@1
  1194
#define LPX_C_CLIQUE    0x02  /* clique cuts */
alpar@1
  1195
#define LPX_C_GOMORY    0x04  /* Gomory's mixed integer cuts */
alpar@1
  1196
#define LPX_C_MIR       0x08  /* mixed integer rounding cuts */
alpar@1
  1197
#define LPX_C_ALL       0xFF  /* all cuts */
alpar@1
  1198
alpar@1
  1199
typedef struct
alpar@1
  1200
{     /* this structure contains results reported by the routines which
alpar@1
  1201
         checks Karush-Kuhn-Tucker conditions (for details see comments
alpar@1
  1202
         to those routines) */
alpar@1
  1203
      /*--------------------------------------------------------------*/
alpar@1
  1204
      /* xR - A * xS = 0 (KKT.PE) */
alpar@1
  1205
      double pe_ae_max;
alpar@1
  1206
      /* largest absolute error */
alpar@1
  1207
      int    pe_ae_row;
alpar@1
  1208
      /* number of row with largest absolute error */
alpar@1
  1209
      double pe_re_max;
alpar@1
  1210
      /* largest relative error */
alpar@1
  1211
      int    pe_re_row;
alpar@1
  1212
      /* number of row with largest relative error */
alpar@1
  1213
      int    pe_quality;
alpar@1
  1214
      /* quality of primal solution:
alpar@1
  1215
         'H' - high
alpar@1
  1216
         'M' - medium
alpar@1
  1217
         'L' - low
alpar@1
  1218
         '?' - primal solution is wrong */
alpar@1
  1219
      /*--------------------------------------------------------------*/
alpar@1
  1220
      /* l[k] <= x[k] <= u[k] (KKT.PB) */
alpar@1
  1221
      double pb_ae_max;
alpar@1
  1222
      /* largest absolute error */
alpar@1
  1223
      int    pb_ae_ind;
alpar@1
  1224
      /* number of variable with largest absolute error */
alpar@1
  1225
      double pb_re_max;
alpar@1
  1226
      /* largest relative error */
alpar@1
  1227
      int    pb_re_ind;
alpar@1
  1228
      /* number of variable with largest relative error */
alpar@1
  1229
      int    pb_quality;
alpar@1
  1230
      /* quality of primal feasibility:
alpar@1
  1231
         'H' - high
alpar@1
  1232
         'M' - medium
alpar@1
  1233
         'L' - low
alpar@1
  1234
         '?' - primal solution is infeasible */
alpar@1
  1235
      /*--------------------------------------------------------------*/
alpar@1
  1236
      /* A' * (dR - cR) + (dS - cS) = 0 (KKT.DE) */
alpar@1
  1237
      double de_ae_max;
alpar@1
  1238
      /* largest absolute error */
alpar@1
  1239
      int    de_ae_col;
alpar@1
  1240
      /* number of column with largest absolute error */
alpar@1
  1241
      double de_re_max;
alpar@1
  1242
      /* largest relative error */
alpar@1
  1243
      int    de_re_col;
alpar@1
  1244
      /* number of column with largest relative error */
alpar@1
  1245
      int    de_quality;
alpar@1
  1246
      /* quality of dual solution:
alpar@1
  1247
         'H' - high
alpar@1
  1248
         'M' - medium
alpar@1
  1249
         'L' - low
alpar@1
  1250
         '?' - dual solution is wrong */
alpar@1
  1251
      /*--------------------------------------------------------------*/
alpar@1
  1252
      /* d[k] >= 0 or d[k] <= 0 (KKT.DB) */
alpar@1
  1253
      double db_ae_max;
alpar@1
  1254
      /* largest absolute error */
alpar@1
  1255
      int    db_ae_ind;
alpar@1
  1256
      /* number of variable with largest absolute error */
alpar@1
  1257
      double db_re_max;
alpar@1
  1258
      /* largest relative error */
alpar@1
  1259
      int    db_re_ind;
alpar@1
  1260
      /* number of variable with largest relative error */
alpar@1
  1261
      int    db_quality;
alpar@1
  1262
      /* quality of dual feasibility:
alpar@1
  1263
         'H' - high
alpar@1
  1264
         'M' - medium
alpar@1
  1265
         'L' - low
alpar@1
  1266
         '?' - dual solution is infeasible */
alpar@1
  1267
      /*--------------------------------------------------------------*/
alpar@1
  1268
      /* (x[k] - bound of x[k]) * d[k] = 0 (KKT.CS) */
alpar@1
  1269
      double cs_ae_max;
alpar@1
  1270
      /* largest absolute error */
alpar@1
  1271
      int    cs_ae_ind;
alpar@1
  1272
      /* number of variable with largest absolute error */
alpar@1
  1273
      double cs_re_max;
alpar@1
  1274
      /* largest relative error */
alpar@1
  1275
      int    cs_re_ind;
alpar@1
  1276
      /* number of variable with largest relative error */
alpar@1
  1277
      int    cs_quality;
alpar@1
  1278
      /* quality of complementary slackness:
alpar@1
  1279
         'H' - high
alpar@1
  1280
         'M' - medium
alpar@1
  1281
         'L' - low
alpar@1
  1282
         '?' - primal and dual solutions are not complementary */
alpar@1
  1283
} LPXKKT;
alpar@1
  1284
alpar@1
  1285
#define lpx_create_prob _glp_lpx_create_prob
alpar@1
  1286
LPX *lpx_create_prob(void);
alpar@1
  1287
/* create problem object */
alpar@1
  1288
alpar@1
  1289
#define lpx_set_prob_name _glp_lpx_set_prob_name
alpar@1
  1290
void lpx_set_prob_name(LPX *lp, const char *name);
alpar@1
  1291
/* assign (change) problem name */
alpar@1
  1292
alpar@1
  1293
#define lpx_set_obj_name _glp_lpx_set_obj_name
alpar@1
  1294
void lpx_set_obj_name(LPX *lp, const char *name);
alpar@1
  1295
/* assign (change) objective function name */
alpar@1
  1296
alpar@1
  1297
#define lpx_set_obj_dir _glp_lpx_set_obj_dir
alpar@1
  1298
void lpx_set_obj_dir(LPX *lp, int dir);
alpar@1
  1299
/* set (change) optimization direction flag */
alpar@1
  1300
alpar@1
  1301
#define lpx_add_rows _glp_lpx_add_rows
alpar@1
  1302
int lpx_add_rows(LPX *lp, int nrs);
alpar@1
  1303
/* add new rows to problem object */
alpar@1
  1304
alpar@1
  1305
#define lpx_add_cols _glp_lpx_add_cols
alpar@1
  1306
int lpx_add_cols(LPX *lp, int ncs);
alpar@1
  1307
/* add new columns to problem object */
alpar@1
  1308
alpar@1
  1309
#define lpx_set_row_name _glp_lpx_set_row_name
alpar@1
  1310
void lpx_set_row_name(LPX *lp, int i, const char *name);
alpar@1
  1311
/* assign (change) row name */
alpar@1
  1312
alpar@1
  1313
#define lpx_set_col_name _glp_lpx_set_col_name
alpar@1
  1314
void lpx_set_col_name(LPX *lp, int j, const char *name);
alpar@1
  1315
/* assign (change) column name */
alpar@1
  1316
alpar@1
  1317
#define lpx_set_row_bnds _glp_lpx_set_row_bnds
alpar@1
  1318
void lpx_set_row_bnds(LPX *lp, int i, int type, double lb, double ub);
alpar@1
  1319
/* set (change) row bounds */
alpar@1
  1320
alpar@1
  1321
#define lpx_set_col_bnds _glp_lpx_set_col_bnds
alpar@1
  1322
void lpx_set_col_bnds(LPX *lp, int j, int type, double lb, double ub);
alpar@1
  1323
/* set (change) column bounds */
alpar@1
  1324
alpar@1
  1325
#define lpx_set_obj_coef _glp_lpx_set_obj_coef
alpar@1
  1326
void lpx_set_obj_coef(glp_prob *lp, int j, double coef);
alpar@1
  1327
/* set (change) obj. coefficient or constant term */
alpar@1
  1328
alpar@1
  1329
#define lpx_set_mat_row _glp_lpx_set_mat_row
alpar@1
  1330
void lpx_set_mat_row(LPX *lp, int i, int len, const int ind[],
alpar@1
  1331
      const double val[]);
alpar@1
  1332
/* set (replace) row of the constraint matrix */
alpar@1
  1333
alpar@1
  1334
#define lpx_set_mat_col _glp_lpx_set_mat_col
alpar@1
  1335
void lpx_set_mat_col(LPX *lp, int j, int len, const int ind[],
alpar@1
  1336
      const double val[]);
alpar@1
  1337
/* set (replace) column of the constraint matrix */
alpar@1
  1338
alpar@1
  1339
#define lpx_load_matrix _glp_lpx_load_matrix
alpar@1
  1340
void lpx_load_matrix(LPX *lp, int ne, const int ia[], const int ja[],
alpar@1
  1341
      const double ar[]);
alpar@1
  1342
/* load (replace) the whole constraint matrix */
alpar@1
  1343
alpar@1
  1344
#define lpx_del_rows _glp_lpx_del_rows
alpar@1
  1345
void lpx_del_rows(LPX *lp, int nrs, const int num[]);
alpar@1
  1346
/* delete specified rows from problem object */
alpar@1
  1347
alpar@1
  1348
#define lpx_del_cols _glp_lpx_del_cols
alpar@1
  1349
void lpx_del_cols(LPX *lp, int ncs, const int num[]);
alpar@1
  1350
/* delete specified columns from problem object */
alpar@1
  1351
alpar@1
  1352
#define lpx_delete_prob _glp_lpx_delete_prob
alpar@1
  1353
void lpx_delete_prob(LPX *lp);
alpar@1
  1354
/* delete problem object */
alpar@1
  1355
alpar@1
  1356
#define lpx_get_prob_name _glp_lpx_get_prob_name
alpar@1
  1357
const char *lpx_get_prob_name(LPX *lp);
alpar@1
  1358
/* retrieve problem name */
alpar@1
  1359
alpar@1
  1360
#define lpx_get_obj_name _glp_lpx_get_obj_name
alpar@1
  1361
const char *lpx_get_obj_name(LPX *lp);
alpar@1
  1362
/* retrieve objective function name */
alpar@1
  1363
alpar@1
  1364
#define lpx_get_obj_dir _glp_lpx_get_obj_dir
alpar@1
  1365
int lpx_get_obj_dir(LPX *lp);
alpar@1
  1366
/* retrieve optimization direction flag */
alpar@1
  1367
alpar@1
  1368
#define lpx_get_num_rows _glp_lpx_get_num_rows
alpar@1
  1369
int lpx_get_num_rows(LPX *lp);
alpar@1
  1370
/* retrieve number of rows */
alpar@1
  1371
alpar@1
  1372
#define lpx_get_num_cols _glp_lpx_get_num_cols
alpar@1
  1373
int lpx_get_num_cols(LPX *lp);
alpar@1
  1374
/* retrieve number of columns */
alpar@1
  1375
alpar@1
  1376
#define lpx_get_row_name _glp_lpx_get_row_name
alpar@1
  1377
const char *lpx_get_row_name(LPX *lp, int i);
alpar@1
  1378
/* retrieve row name */
alpar@1
  1379
alpar@1
  1380
#define lpx_get_col_name _glp_lpx_get_col_name
alpar@1
  1381
const char *lpx_get_col_name(LPX *lp, int j);
alpar@1
  1382
/* retrieve column name */
alpar@1
  1383
alpar@1
  1384
#define lpx_get_row_type _glp_lpx_get_row_type
alpar@1
  1385
int lpx_get_row_type(LPX *lp, int i);
alpar@1
  1386
/* retrieve row type */
alpar@1
  1387
alpar@1
  1388
#define lpx_get_row_lb _glp_lpx_get_row_lb
alpar@1
  1389
double lpx_get_row_lb(LPX *lp, int i);
alpar@1
  1390
/* retrieve row lower bound */
alpar@1
  1391
alpar@1
  1392
#define lpx_get_row_ub _glp_lpx_get_row_ub
alpar@1
  1393
double lpx_get_row_ub(LPX *lp, int i);
alpar@1
  1394
/* retrieve row upper bound */
alpar@1
  1395
alpar@1
  1396
#define lpx_get_row_bnds _glp_lpx_get_row_bnds
alpar@1
  1397
void lpx_get_row_bnds(LPX *lp, int i, int *typx, double *lb,
alpar@1
  1398
      double *ub);
alpar@1
  1399
/* retrieve row bounds */
alpar@1
  1400
alpar@1
  1401
#define lpx_get_col_type _glp_lpx_get_col_type
alpar@1
  1402
int lpx_get_col_type(LPX *lp, int j);
alpar@1
  1403
/* retrieve column type */
alpar@1
  1404
alpar@1
  1405
#define lpx_get_col_lb _glp_lpx_get_col_lb
alpar@1
  1406
double lpx_get_col_lb(LPX *lp, int j);
alpar@1
  1407
/* retrieve column lower bound */
alpar@1
  1408
alpar@1
  1409
#define lpx_get_col_ub _glp_lpx_get_col_ub
alpar@1
  1410
double lpx_get_col_ub(LPX *lp, int j);
alpar@1
  1411
/* retrieve column upper bound */
alpar@1
  1412
alpar@1
  1413
#define lpx_get_col_bnds _glp_lpx_get_col_bnds
alpar@1
  1414
void lpx_get_col_bnds(LPX *lp, int j, int *typx, double *lb,
alpar@1
  1415
      double *ub);
alpar@1
  1416
/* retrieve column bounds */
alpar@1
  1417
alpar@1
  1418
#define lpx_get_obj_coef _glp_lpx_get_obj_coef
alpar@1
  1419
double lpx_get_obj_coef(LPX *lp, int j);
alpar@1
  1420
/* retrieve obj. coefficient or constant term */
alpar@1
  1421
alpar@1
  1422
#define lpx_get_num_nz _glp_lpx_get_num_nz
alpar@1
  1423
int lpx_get_num_nz(LPX *lp);
alpar@1
  1424
/* retrieve number of constraint coefficients */
alpar@1
  1425
alpar@1
  1426
#define lpx_get_mat_row _glp_lpx_get_mat_row
alpar@1
  1427
int lpx_get_mat_row(LPX *lp, int i, int ind[], double val[]);
alpar@1
  1428
/* retrieve row of the constraint matrix */
alpar@1
  1429
alpar@1
  1430
#define lpx_get_mat_col _glp_lpx_get_mat_col
alpar@1
  1431
int lpx_get_mat_col(LPX *lp, int j, int ind[], double val[]);
alpar@1
  1432
/* retrieve column of the constraint matrix */
alpar@1
  1433
alpar@1
  1434
#define lpx_create_index _glp_lpx_create_index
alpar@1
  1435
void lpx_create_index(LPX *lp);
alpar@1
  1436
/* create the name index */
alpar@1
  1437
alpar@1
  1438
#define lpx_find_row _glp_lpx_find_row
alpar@1
  1439
int lpx_find_row(LPX *lp, const char *name);
alpar@1
  1440
/* find row by its name */
alpar@1
  1441
alpar@1
  1442
#define lpx_find_col _glp_lpx_find_col
alpar@1
  1443
int lpx_find_col(LPX *lp, const char *name);
alpar@1
  1444
/* find column by its name */
alpar@1
  1445
alpar@1
  1446
#define lpx_delete_index _glp_lpx_delete_index
alpar@1
  1447
void lpx_delete_index(LPX *lp);
alpar@1
  1448
/* delete the name index */
alpar@1
  1449
alpar@1
  1450
#define lpx_scale_prob _glp_lpx_scale_prob
alpar@1
  1451
void lpx_scale_prob(LPX *lp);
alpar@1
  1452
/* scale problem data */
alpar@1
  1453
alpar@1
  1454
#define lpx_unscale_prob _glp_lpx_unscale_prob
alpar@1
  1455
void lpx_unscale_prob(LPX *lp);
alpar@1
  1456
/* unscale problem data */
alpar@1
  1457
alpar@1
  1458
#define lpx_set_row_stat _glp_lpx_set_row_stat
alpar@1
  1459
void lpx_set_row_stat(LPX *lp, int i, int stat);
alpar@1
  1460
/* set (change) row status */
alpar@1
  1461
alpar@1
  1462
#define lpx_set_col_stat _glp_lpx_set_col_stat
alpar@1
  1463
void lpx_set_col_stat(LPX *lp, int j, int stat);
alpar@1
  1464
/* set (change) column status */
alpar@1
  1465
alpar@1
  1466
#define lpx_std_basis _glp_lpx_std_basis
alpar@1
  1467
void lpx_std_basis(LPX *lp);
alpar@1
  1468
/* construct standard initial LP basis */
alpar@1
  1469
alpar@1
  1470
#define lpx_adv_basis _glp_lpx_adv_basis
alpar@1
  1471
void lpx_adv_basis(LPX *lp);
alpar@1
  1472
/* construct advanced initial LP basis */
alpar@1
  1473
alpar@1
  1474
#define lpx_cpx_basis _glp_lpx_cpx_basis
alpar@1
  1475
void lpx_cpx_basis(LPX *lp);
alpar@1
  1476
/* construct Bixby's initial LP basis */
alpar@1
  1477
alpar@1
  1478
#define lpx_simplex _glp_lpx_simplex
alpar@1
  1479
int lpx_simplex(LPX *lp);
alpar@1
  1480
/* easy-to-use driver to the simplex method */
alpar@1
  1481
alpar@1
  1482
#define lpx_exact _glp_lpx_exact
alpar@1
  1483
int lpx_exact(LPX *lp);
alpar@1
  1484
/* easy-to-use driver to the exact simplex method */
alpar@1
  1485
alpar@1
  1486
#define lpx_get_status _glp_lpx_get_status
alpar@1
  1487
int lpx_get_status(LPX *lp);
alpar@1
  1488
/* retrieve generic status of basic solution */
alpar@1
  1489
alpar@1
  1490
#define lpx_get_prim_stat _glp_lpx_get_prim_stat
alpar@1
  1491
int lpx_get_prim_stat(LPX *lp);
alpar@1
  1492
/* retrieve primal status of basic solution */
alpar@1
  1493
alpar@1
  1494
#define lpx_get_dual_stat _glp_lpx_get_dual_stat
alpar@1
  1495
int lpx_get_dual_stat(LPX *lp);
alpar@1
  1496
/* retrieve dual status of basic solution */
alpar@1
  1497
alpar@1
  1498
#define lpx_get_obj_val _glp_lpx_get_obj_val
alpar@1
  1499
double lpx_get_obj_val(LPX *lp);
alpar@1
  1500
/* retrieve objective value (basic solution) */
alpar@1
  1501
alpar@1
  1502
#define lpx_get_row_stat _glp_lpx_get_row_stat
alpar@1
  1503
int lpx_get_row_stat(LPX *lp, int i);
alpar@1
  1504
/* retrieve row status (basic solution) */
alpar@1
  1505
alpar@1
  1506
#define lpx_get_row_prim _glp_lpx_get_row_prim
alpar@1
  1507
double lpx_get_row_prim(LPX *lp, int i);
alpar@1
  1508
/* retrieve row primal value (basic solution) */
alpar@1
  1509
alpar@1
  1510
#define lpx_get_row_dual _glp_lpx_get_row_dual
alpar@1
  1511
double lpx_get_row_dual(LPX *lp, int i);
alpar@1
  1512
/* retrieve row dual value (basic solution) */
alpar@1
  1513
alpar@1
  1514
#define lpx_get_row_info _glp_lpx_get_row_info
alpar@1
  1515
void lpx_get_row_info(LPX *lp, int i, int *tagx, double *vx,
alpar@1
  1516
      double *dx);
alpar@1
  1517
/* obtain row solution information */
alpar@1
  1518
alpar@1
  1519
#define lpx_get_col_stat _glp_lpx_get_col_stat
alpar@1
  1520
int lpx_get_col_stat(LPX *lp, int j);
alpar@1
  1521
/* retrieve column status (basic solution) */
alpar@1
  1522
alpar@1
  1523
#define lpx_get_col_prim _glp_lpx_get_col_prim
alpar@1
  1524
double lpx_get_col_prim(LPX *lp, int j);
alpar@1
  1525
/* retrieve column primal value (basic solution) */
alpar@1
  1526
alpar@1
  1527
#define lpx_get_col_dual _glp_lpx_get_col_dual
alpar@1
  1528
double lpx_get_col_dual(glp_prob *lp, int j);
alpar@1
  1529
/* retrieve column dual value (basic solution) */
alpar@1
  1530
alpar@1
  1531
#define lpx_get_col_info _glp_lpx_get_col_info
alpar@1
  1532
void lpx_get_col_info(LPX *lp, int j, int *tagx, double *vx,
alpar@1
  1533
      double *dx);
alpar@1
  1534
/* obtain column solution information (obsolete) */
alpar@1
  1535
alpar@1
  1536
#define lpx_get_ray_info _glp_lpx_get_ray_info
alpar@1
  1537
int lpx_get_ray_info(LPX *lp);
alpar@1
  1538
/* determine what causes primal unboundness */
alpar@1
  1539
alpar@1
  1540
#define lpx_check_kkt _glp_lpx_check_kkt
alpar@1
  1541
void lpx_check_kkt(LPX *lp, int scaled, LPXKKT *kkt);
alpar@1
  1542
/* check Karush-Kuhn-Tucker conditions */
alpar@1
  1543
alpar@1
  1544
#define lpx_warm_up _glp_lpx_warm_up
alpar@1
  1545
int lpx_warm_up(LPX *lp);
alpar@1
  1546
/* "warm up" LP basis */
alpar@1
  1547
alpar@1
  1548
#define lpx_eval_tab_row _glp_lpx_eval_tab_row
alpar@1
  1549
int lpx_eval_tab_row(LPX *lp, int k, int ind[], double val[]);
alpar@1
  1550
/* compute row of the simplex table */
alpar@1
  1551
alpar@1
  1552
#define lpx_eval_tab_col _glp_lpx_eval_tab_col
alpar@1
  1553
int lpx_eval_tab_col(LPX *lp, int k, int ind[], double val[]);
alpar@1
  1554
/* compute column of the simplex table */
alpar@1
  1555
alpar@1
  1556
#define lpx_transform_row _glp_lpx_transform_row
alpar@1
  1557
int lpx_transform_row(LPX *lp, int len, int ind[], double val[]);
alpar@1
  1558
/* transform explicitly specified row */
alpar@1
  1559
alpar@1
  1560
#define lpx_transform_col _glp_lpx_transform_col
alpar@1
  1561
int lpx_transform_col(LPX *lp, int len, int ind[], double val[]);
alpar@1
  1562
/* transform explicitly specified column */
alpar@1
  1563
alpar@1
  1564
#define lpx_prim_ratio_test _glp_lpx_prim_ratio_test
alpar@1
  1565
int lpx_prim_ratio_test(LPX *lp, int len, const int ind[],
alpar@1
  1566
      const double val[], int how, double tol);
alpar@1
  1567
/* perform primal ratio test */
alpar@1
  1568
alpar@1
  1569
#define lpx_dual_ratio_test _glp_lpx_dual_ratio_test
alpar@1
  1570
int lpx_dual_ratio_test(LPX *lp, int len, const int ind[],
alpar@1
  1571
      const double val[], int how, double tol);
alpar@1
  1572
/* perform dual ratio test */
alpar@1
  1573
alpar@1
  1574
#define lpx_interior _glp_lpx_interior
alpar@1
  1575
int lpx_interior(LPX *lp);
alpar@1
  1576
/* easy-to-use driver to the interior point method */
alpar@1
  1577
alpar@1
  1578
#define lpx_ipt_status _glp_lpx_ipt_status
alpar@1
  1579
int lpx_ipt_status(LPX *lp);
alpar@1
  1580
/* retrieve status of interior-point solution */
alpar@1
  1581
alpar@1
  1582
#define lpx_ipt_obj_val _glp_lpx_ipt_obj_val
alpar@1
  1583
double lpx_ipt_obj_val(LPX *lp);
alpar@1
  1584
/* retrieve objective value (interior point) */
alpar@1
  1585
alpar@1
  1586
#define lpx_ipt_row_prim _glp_lpx_ipt_row_prim
alpar@1
  1587
double lpx_ipt_row_prim(LPX *lp, int i);
alpar@1
  1588
/* retrieve row primal value (interior point) */
alpar@1
  1589
alpar@1
  1590
#define lpx_ipt_row_dual _glp_lpx_ipt_row_dual
alpar@1
  1591
double lpx_ipt_row_dual(LPX *lp, int i);
alpar@1
  1592
/* retrieve row dual value (interior point) */
alpar@1
  1593
alpar@1
  1594
#define lpx_ipt_col_prim _glp_lpx_ipt_col_prim
alpar@1
  1595
double lpx_ipt_col_prim(LPX *lp, int j);
alpar@1
  1596
/* retrieve column primal value (interior point) */
alpar@1
  1597
alpar@1
  1598
#define lpx_ipt_col_dual _glp_lpx_ipt_col_dual
alpar@1
  1599
double lpx_ipt_col_dual(LPX *lp, int j);
alpar@1
  1600
/* retrieve column dual value (interior point) */
alpar@1
  1601
alpar@1
  1602
#define lpx_set_class _glp_lpx_set_class
alpar@1
  1603
void lpx_set_class(LPX *lp, int klass);
alpar@1
  1604
/* set problem class */
alpar@1
  1605
alpar@1
  1606
#define lpx_get_class _glp_lpx_get_class
alpar@1
  1607
int lpx_get_class(LPX *lp);
alpar@1
  1608
/* determine problem klass */
alpar@1
  1609
alpar@1
  1610
#define lpx_set_col_kind _glp_lpx_set_col_kind
alpar@1
  1611
void lpx_set_col_kind(LPX *lp, int j, int kind);
alpar@1
  1612
/* set (change) column kind */
alpar@1
  1613
alpar@1
  1614
#define lpx_get_col_kind _glp_lpx_get_col_kind
alpar@1
  1615
int lpx_get_col_kind(LPX *lp, int j);
alpar@1
  1616
/* retrieve column kind */
alpar@1
  1617
alpar@1
  1618
#define lpx_get_num_int _glp_lpx_get_num_int
alpar@1
  1619
int lpx_get_num_int(LPX *lp);
alpar@1
  1620
/* retrieve number of integer columns */
alpar@1
  1621
alpar@1
  1622
#define lpx_get_num_bin _glp_lpx_get_num_bin
alpar@1
  1623
int lpx_get_num_bin(LPX *lp);
alpar@1
  1624
/* retrieve number of binary columns */
alpar@1
  1625
alpar@1
  1626
#define lpx_integer _glp_lpx_integer
alpar@1
  1627
int lpx_integer(LPX *lp);
alpar@1
  1628
/* easy-to-use driver to the branch-and-bound method */
alpar@1
  1629
alpar@1
  1630
#define lpx_intopt _glp_lpx_intopt
alpar@1
  1631
int lpx_intopt(LPX *lp);
alpar@1
  1632
/* easy-to-use driver to the branch-and-bound method */
alpar@1
  1633
alpar@1
  1634
#define lpx_mip_status _glp_lpx_mip_status
alpar@1
  1635
int lpx_mip_status(LPX *lp);
alpar@1
  1636
/* retrieve status of MIP solution */
alpar@1
  1637
alpar@1
  1638
#define lpx_mip_obj_val _glp_lpx_mip_obj_val
alpar@1
  1639
double lpx_mip_obj_val(LPX *lp);
alpar@1
  1640
/* retrieve objective value (MIP solution) */
alpar@1
  1641
alpar@1
  1642
#define lpx_mip_row_val _glp_lpx_mip_row_val
alpar@1
  1643
double lpx_mip_row_val(LPX *lp, int i);
alpar@1
  1644
/* retrieve row value (MIP solution) */
alpar@1
  1645
alpar@1
  1646
#define lpx_mip_col_val _glp_lpx_mip_col_val
alpar@1
  1647
double lpx_mip_col_val(LPX *lp, int j);
alpar@1
  1648
/* retrieve column value (MIP solution) */
alpar@1
  1649
alpar@1
  1650
#define lpx_check_int _glp_lpx_check_int
alpar@1
  1651
void lpx_check_int(LPX *lp, LPXKKT *kkt);
alpar@1
  1652
/* check integer feasibility conditions */
alpar@1
  1653
alpar@1
  1654
#define lpx_reset_parms _glp_lpx_reset_parms
alpar@1
  1655
void lpx_reset_parms(LPX *lp);
alpar@1
  1656
/* reset control parameters to default values */
alpar@1
  1657
alpar@1
  1658
#define lpx_set_int_parm _glp_lpx_set_int_parm
alpar@1
  1659
void lpx_set_int_parm(LPX *lp, int parm, int val);
alpar@1
  1660
/* set (change) integer control parameter */
alpar@1
  1661
alpar@1
  1662
#define lpx_get_int_parm _glp_lpx_get_int_parm
alpar@1
  1663
int lpx_get_int_parm(LPX *lp, int parm);
alpar@1
  1664
/* query integer control parameter */
alpar@1
  1665
alpar@1
  1666
#define lpx_set_real_parm _glp_lpx_set_real_parm
alpar@1
  1667
void lpx_set_real_parm(LPX *lp, int parm, double val);
alpar@1
  1668
/* set (change) real control parameter */
alpar@1
  1669
alpar@1
  1670
#define lpx_get_real_parm _glp_lpx_get_real_parm
alpar@1
  1671
double lpx_get_real_parm(LPX *lp, int parm);
alpar@1
  1672
/* query real control parameter */
alpar@1
  1673
alpar@1
  1674
#define lpx_read_mps _glp_lpx_read_mps
alpar@1
  1675
LPX *lpx_read_mps(const char *fname);
alpar@1
  1676
/* read problem data in fixed MPS format */
alpar@1
  1677
alpar@1
  1678
#define lpx_write_mps _glp_lpx_write_mps
alpar@1
  1679
int lpx_write_mps(LPX *lp, const char *fname);
alpar@1
  1680
/* write problem data in fixed MPS format */
alpar@1
  1681
alpar@1
  1682
#define lpx_read_bas _glp_lpx_read_bas
alpar@1
  1683
int lpx_read_bas(LPX *lp, const char *fname);
alpar@1
  1684
/* read LP basis in fixed MPS format */
alpar@1
  1685
alpar@1
  1686
#define lpx_write_bas _glp_lpx_write_bas
alpar@1
  1687
int lpx_write_bas(LPX *lp, const char *fname);
alpar@1
  1688
/* write LP basis in fixed MPS format */
alpar@1
  1689
alpar@1
  1690
#define lpx_read_freemps _glp_lpx_read_freemps
alpar@1
  1691
LPX *lpx_read_freemps(const char *fname);
alpar@1
  1692
/* read problem data in free MPS format */
alpar@1
  1693
alpar@1
  1694
#define lpx_write_freemps _glp_lpx_write_freemps
alpar@1
  1695
int lpx_write_freemps(LPX *lp, const char *fname);
alpar@1
  1696
/* write problem data in free MPS format */
alpar@1
  1697
alpar@1
  1698
#define lpx_read_cpxlp _glp_lpx_read_cpxlp
alpar@1
  1699
LPX *lpx_read_cpxlp(const char *fname);
alpar@1
  1700
/* read problem data in CPLEX LP format */
alpar@1
  1701
alpar@1
  1702
#define lpx_write_cpxlp _glp_lpx_write_cpxlp
alpar@1
  1703
int lpx_write_cpxlp(LPX *lp, const char *fname);
alpar@1
  1704
/* write problem data in CPLEX LP format */
alpar@1
  1705
alpar@1
  1706
#define lpx_read_model _glp_lpx_read_model
alpar@1
  1707
LPX *lpx_read_model(const char *model, const char *data,
alpar@1
  1708
      const char *output);
alpar@1
  1709
/* read LP/MIP model written in GNU MathProg language */
alpar@1
  1710
alpar@1
  1711
#define lpx_print_prob _glp_lpx_print_prob
alpar@1
  1712
int lpx_print_prob(LPX *lp, const char *fname);
alpar@1
  1713
/* write problem data in plain text format */
alpar@1
  1714
alpar@1
  1715
#define lpx_print_sol _glp_lpx_print_sol
alpar@1
  1716
int lpx_print_sol(LPX *lp, const char *fname);
alpar@1
  1717
/* write LP problem solution in printable format */
alpar@1
  1718
alpar@1
  1719
#define lpx_print_sens_bnds _glp_lpx_print_sens_bnds
alpar@1
  1720
int lpx_print_sens_bnds(LPX *lp, const char *fname);
alpar@1
  1721
/* write bounds sensitivity information */
alpar@1
  1722
alpar@1
  1723
#define lpx_print_ips _glp_lpx_print_ips
alpar@1
  1724
int lpx_print_ips(LPX *lp, const char *fname);
alpar@1
  1725
/* write interior point solution in printable format */
alpar@1
  1726
alpar@1
  1727
#define lpx_print_mip _glp_lpx_print_mip
alpar@1
  1728
int lpx_print_mip(LPX *lp, const char *fname);
alpar@1
  1729
/* write MIP problem solution in printable format */
alpar@1
  1730
alpar@1
  1731
#define lpx_is_b_avail _glp_lpx_is_b_avail
alpar@1
  1732
int lpx_is_b_avail(LPX *lp);
alpar@1
  1733
/* check if LP basis is available */
alpar@1
  1734
alpar@1
  1735
#define lpx_write_pb _glp_lpx_write_pb
alpar@1
  1736
int lpx_write_pb(LPX *lp, const char *fname, int normalized,
alpar@1
  1737
      int binarize);
alpar@1
  1738
/* write problem data in (normalized) OPB format */
alpar@1
  1739
alpar@1
  1740
#define lpx_main _glp_lpx_main
alpar@1
  1741
int lpx_main(int argc, const char *argv[]);
alpar@1
  1742
/* stand-alone LP/MIP solver */
alpar@1
  1743
alpar@1
  1744
#ifdef __cplusplus
alpar@1
  1745
}
alpar@1
  1746
#endif
alpar@1
  1747
alpar@1
  1748
#endif
alpar@1
  1749
alpar@1
  1750
/* eof */