src/glpnpp.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
/* glpnpp.h (LP/MIP preprocessor) */
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 GLPNPP_H
alpar@1
    26
#define GLPNPP_H
alpar@1
    27
alpar@1
    28
#include "glpapi.h"
alpar@1
    29
alpar@1
    30
typedef struct NPP NPP;
alpar@1
    31
typedef struct NPPROW NPPROW;
alpar@1
    32
typedef struct NPPCOL NPPCOL;
alpar@1
    33
typedef struct NPPAIJ NPPAIJ;
alpar@1
    34
typedef struct NPPTSE NPPTSE;
alpar@1
    35
typedef struct NPPLFE NPPLFE;
alpar@1
    36
alpar@1
    37
struct NPP
alpar@1
    38
{     /* LP/MIP preprocessor workspace */
alpar@1
    39
      /*--------------------------------------------------------------*/
alpar@1
    40
      /* original problem segment */
alpar@1
    41
      int orig_dir;
alpar@1
    42
      /* optimization direction flag:
alpar@1
    43
         GLP_MIN - minimization
alpar@1
    44
         GLP_MAX - maximization */
alpar@1
    45
      int orig_m;
alpar@1
    46
      /* number of rows */
alpar@1
    47
      int orig_n;
alpar@1
    48
      /* number of columns */
alpar@1
    49
      int orig_nnz;
alpar@1
    50
      /* number of non-zero constraint coefficients */
alpar@1
    51
      /*--------------------------------------------------------------*/
alpar@1
    52
      /* transformed problem segment (always minimization) */
alpar@1
    53
      DMP *pool;
alpar@1
    54
      /* memory pool to store problem components */
alpar@1
    55
      char *name;
alpar@1
    56
      /* problem name (1 to 255 chars); NULL means no name is assigned
alpar@1
    57
         to the problem */
alpar@1
    58
      char *obj;
alpar@1
    59
      /* objective function name (1 to 255 chars); NULL means no name
alpar@1
    60
         is assigned to the objective function */
alpar@1
    61
      double c0;
alpar@1
    62
      /* constant term of the objective function */
alpar@1
    63
      int nrows;
alpar@1
    64
      /* number of rows introduced into the problem; this count
alpar@1
    65
         increases by one every time a new row is added and never
alpar@1
    66
         decreases; thus, actual number of rows may be less than nrows
alpar@1
    67
         due to row deletions */
alpar@1
    68
      int ncols;
alpar@1
    69
      /* number of columns introduced into the problem; this count
alpar@1
    70
         increases by one every time a new column is added and never
alpar@1
    71
         decreases; thus, actual number of column may be less than
alpar@1
    72
         ncols due to column deletions */
alpar@1
    73
      NPPROW *r_head;
alpar@1
    74
      /* pointer to the beginning of the row list */
alpar@1
    75
      NPPROW *r_tail;
alpar@1
    76
      /* pointer to the end of the row list */
alpar@1
    77
      NPPCOL *c_head;
alpar@1
    78
      /* pointer to the beginning of the column list */
alpar@1
    79
      NPPCOL *c_tail;
alpar@1
    80
      /* pointer to the end of the column list */
alpar@1
    81
      /*--------------------------------------------------------------*/
alpar@1
    82
      /* transformation history */
alpar@1
    83
      DMP *stack;
alpar@1
    84
      /* memory pool to store transformation entries */
alpar@1
    85
      NPPTSE *top;
alpar@1
    86
      /* pointer to most recent transformation entry */
alpar@1
    87
#if 0 /* 16/XII-2009 */
alpar@1
    88
      int count[1+25];
alpar@1
    89
      /* transformation statistics */
alpar@1
    90
#endif
alpar@1
    91
      /*--------------------------------------------------------------*/
alpar@1
    92
      /* resultant (preprocessed) problem segment */
alpar@1
    93
      int m;
alpar@1
    94
      /* number of rows */
alpar@1
    95
      int n;
alpar@1
    96
      /* number of columns */
alpar@1
    97
      int nnz;
alpar@1
    98
      /* number of non-zero constraint coefficients */
alpar@1
    99
      int *row_ref; /* int row_ref[1+m]; */
alpar@1
   100
      /* row_ref[i], 1 <= i <= m, is the reference number assigned to
alpar@1
   101
         a row, which is i-th row of the resultant problem */
alpar@1
   102
      int *col_ref; /* int col_ref[1+n]; */
alpar@1
   103
      /* col_ref[j], 1 <= j <= n, is the reference number assigned to
alpar@1
   104
         a column, which is j-th column of the resultant problem */
alpar@1
   105
      /*--------------------------------------------------------------*/
alpar@1
   106
      /* recovered solution segment */
alpar@1
   107
      int sol;
alpar@1
   108
      /* solution indicator:
alpar@1
   109
         GLP_SOL - basic solution
alpar@1
   110
         GLP_IPT - interior-point solution
alpar@1
   111
         GLP_MIP - mixed integer solution */
alpar@1
   112
      int scaling;
alpar@1
   113
      /* scaling option:
alpar@1
   114
         GLP_OFF - scaling is disabled
alpar@1
   115
         GLP_ON  - scaling is enabled */
alpar@1
   116
      int p_stat;
alpar@1
   117
      /* status of primal basic solution:
alpar@1
   118
         GLP_UNDEF  - primal solution is undefined
alpar@1
   119
         GLP_FEAS   - primal solution is feasible
alpar@1
   120
         GLP_INFEAS - primal solution is infeasible
alpar@1
   121
         GLP_NOFEAS - no primal feasible solution exists */
alpar@1
   122
      int d_stat;
alpar@1
   123
      /* status of dual basic solution:
alpar@1
   124
         GLP_UNDEF  - dual solution is undefined
alpar@1
   125
         GLP_FEAS   - dual solution is feasible
alpar@1
   126
         GLP_INFEAS - dual solution is infeasible
alpar@1
   127
         GLP_NOFEAS - no dual feasible solution exists */
alpar@1
   128
      int t_stat;
alpar@1
   129
      /* status of interior-point solution:
alpar@1
   130
         GLP_UNDEF  - interior solution is undefined
alpar@1
   131
         GLP_OPT    - interior solution is optimal */
alpar@1
   132
      int i_stat;
alpar@1
   133
      /* status of mixed integer solution:
alpar@1
   134
         GLP_UNDEF  - integer solution is undefined
alpar@1
   135
         GLP_OPT    - integer solution is optimal
alpar@1
   136
         GLP_FEAS   - integer solution is feasible
alpar@1
   137
         GLP_NOFEAS - no integer solution exists */
alpar@1
   138
      char *r_stat; /* char r_stat[1+nrows]; */
alpar@1
   139
      /* r_stat[i], 1 <= i <= nrows, is status of i-th row:
alpar@1
   140
         GLP_BS - inactive constraint
alpar@1
   141
         GLP_NL - active constraint on lower bound
alpar@1
   142
         GLP_NU - active constraint on upper bound
alpar@1
   143
         GLP_NF - active free row
alpar@1
   144
         GLP_NS - active equality constraint */
alpar@1
   145
      char *c_stat; /* char c_stat[1+nrows]; */
alpar@1
   146
      /* c_stat[j], 1 <= j <= nrows, is status of j-th column:
alpar@1
   147
         GLP_BS - basic variable
alpar@1
   148
         GLP_NL - non-basic variable on lower bound
alpar@1
   149
         GLP_NU - non-basic variable on upper bound
alpar@1
   150
         GLP_NF - non-basic free variable
alpar@1
   151
         GLP_NS - non-basic fixed variable */
alpar@1
   152
      double *r_pi; /* double r_pi[1+nrows]; */
alpar@1
   153
      /* r_pi[i], 1 <= i <= nrows, is Lagrange multiplier (dual value)
alpar@1
   154
         for i-th row (constraint) */
alpar@1
   155
      double *c_value; /* double c_value[1+ncols]; */
alpar@1
   156
      /* c_value[j], 1 <= j <= ncols, is primal value of j-th column
alpar@1
   157
         (structural variable) */
alpar@1
   158
};
alpar@1
   159
alpar@1
   160
struct NPPROW
alpar@1
   161
{     /* row (constraint) */
alpar@1
   162
      int i;
alpar@1
   163
      /* reference number assigned to the row, 1 <= i <= nrows */
alpar@1
   164
      char *name;
alpar@1
   165
      /* row name (1 to 255 chars); NULL means no name is assigned to
alpar@1
   166
         the row */
alpar@1
   167
      double lb;
alpar@1
   168
      /* lower bound; -DBL_MAX means the row has no lower bound */
alpar@1
   169
      double ub;
alpar@1
   170
      /* upper bound; +DBL_MAX means the row has no upper bound */
alpar@1
   171
      NPPAIJ *ptr;
alpar@1
   172
      /* pointer to the linked list of constraint coefficients */
alpar@1
   173
      int temp;
alpar@1
   174
      /* working field used by preprocessor routines */
alpar@1
   175
      NPPROW *prev;
alpar@1
   176
      /* pointer to previous row in the row list */
alpar@1
   177
      NPPROW *next;
alpar@1
   178
      /* pointer to next row in the row list */
alpar@1
   179
};
alpar@1
   180
alpar@1
   181
struct NPPCOL
alpar@1
   182
{     /* column (variable) */
alpar@1
   183
      int j;
alpar@1
   184
      /* reference number assigned to the column, 1 <= j <= ncols */
alpar@1
   185
      char *name;
alpar@1
   186
      /* column name (1 to 255 chars); NULL means no name is assigned
alpar@1
   187
         to the column */
alpar@1
   188
      char is_int;
alpar@1
   189
      /* 0 means continuous variable; 1 means integer variable */
alpar@1
   190
      double lb;
alpar@1
   191
      /* lower bound; -DBL_MAX means the column has no lower bound */
alpar@1
   192
      double ub;
alpar@1
   193
      /* upper bound; +DBL_MAX means the column has no upper bound */
alpar@1
   194
      double coef;
alpar@1
   195
      /* objective coefficient */
alpar@1
   196
      NPPAIJ *ptr;
alpar@1
   197
      /* pointer to the linked list of constraint coefficients */
alpar@1
   198
      int temp;
alpar@1
   199
      /* working field used by preprocessor routines */
alpar@1
   200
#if 1 /* 28/XII-2009 */
alpar@1
   201
      union
alpar@1
   202
      {  double ll;
alpar@1
   203
         /* implied column lower bound */
alpar@1
   204
         int pos;
alpar@1
   205
         /* vertex ordinal number corresponding to this binary column
alpar@1
   206
            in the conflict graph (0, if the vertex does not exist) */
alpar@1
   207
      }  ll;
alpar@1
   208
      union
alpar@1
   209
      {  double uu;
alpar@1
   210
         /* implied column upper bound */
alpar@1
   211
         int neg;
alpar@1
   212
         /* vertex ordinal number corresponding to complement of this
alpar@1
   213
            binary column in the conflict graph (0, if the vertex does
alpar@1
   214
            not exist) */
alpar@1
   215
      }  uu;
alpar@1
   216
#endif
alpar@1
   217
      NPPCOL *prev;
alpar@1
   218
      /* pointer to previous column in the column list */
alpar@1
   219
      NPPCOL *next;
alpar@1
   220
      /* pointer to next column in the column list */
alpar@1
   221
};
alpar@1
   222
alpar@1
   223
struct NPPAIJ
alpar@1
   224
{     /* constraint coefficient */
alpar@1
   225
      NPPROW *row;
alpar@1
   226
      /* pointer to corresponding row */
alpar@1
   227
      NPPCOL *col;
alpar@1
   228
      /* pointer to corresponding column */
alpar@1
   229
      double val;
alpar@1
   230
      /* (non-zero) coefficient value */
alpar@1
   231
      NPPAIJ *r_prev;
alpar@1
   232
      /* pointer to previous coefficient in the same row */
alpar@1
   233
      NPPAIJ *r_next;
alpar@1
   234
      /* pointer to next coefficient in the same row */
alpar@1
   235
      NPPAIJ *c_prev;
alpar@1
   236
      /* pointer to previous coefficient in the same column */
alpar@1
   237
      NPPAIJ *c_next;
alpar@1
   238
      /* pointer to next coefficient in the same column */
alpar@1
   239
};
alpar@1
   240
alpar@1
   241
struct NPPTSE
alpar@1
   242
{     /* transformation stack entry */
alpar@1
   243
      int (*func)(NPP *npp, void *info);
alpar@1
   244
      /* pointer to routine performing back transformation */
alpar@1
   245
      void *info;
alpar@1
   246
      /* pointer to specific info (depends on the transformation) */
alpar@1
   247
      NPPTSE *link;
alpar@1
   248
      /* pointer to another entry created *before* this entry */
alpar@1
   249
};
alpar@1
   250
alpar@1
   251
struct NPPLFE
alpar@1
   252
{     /* linear form element */
alpar@1
   253
      int ref;
alpar@1
   254
      /* row/column reference number */
alpar@1
   255
      double val;
alpar@1
   256
      /* (non-zero) coefficient value */
alpar@1
   257
      NPPLFE *next;
alpar@1
   258
      /* pointer to another element */
alpar@1
   259
};
alpar@1
   260
alpar@1
   261
#define npp_create_wksp _glp_npp_create_wksp
alpar@1
   262
NPP *npp_create_wksp(void);
alpar@1
   263
/* create LP/MIP preprocessor workspace */
alpar@1
   264
alpar@1
   265
#define npp_insert_row _glp_npp_insert_row
alpar@1
   266
void npp_insert_row(NPP *npp, NPPROW *row, int where);
alpar@1
   267
/* insert row to the row list */
alpar@1
   268
alpar@1
   269
#define npp_remove_row _glp_npp_remove_row
alpar@1
   270
void npp_remove_row(NPP *npp, NPPROW *row);
alpar@1
   271
/* remove row from the row list */
alpar@1
   272
alpar@1
   273
#define npp_activate_row _glp_npp_activate_row
alpar@1
   274
void npp_activate_row(NPP *npp, NPPROW *row);
alpar@1
   275
/* make row active */
alpar@1
   276
alpar@1
   277
#define npp_deactivate_row _glp_npp_deactivate_row
alpar@1
   278
void npp_deactivate_row(NPP *npp, NPPROW *row);
alpar@1
   279
/* make row inactive */
alpar@1
   280
alpar@1
   281
#define npp_insert_col _glp_npp_insert_col
alpar@1
   282
void npp_insert_col(NPP *npp, NPPCOL *col, int where);
alpar@1
   283
/* insert column to the column list */
alpar@1
   284
alpar@1
   285
#define npp_remove_col _glp_npp_remove_col
alpar@1
   286
void npp_remove_col(NPP *npp, NPPCOL *col);
alpar@1
   287
/* remove column from the column list */
alpar@1
   288
alpar@1
   289
#define npp_activate_col _glp_npp_activate_col
alpar@1
   290
void npp_activate_col(NPP *npp, NPPCOL *col);
alpar@1
   291
/* make column active */
alpar@1
   292
alpar@1
   293
#define npp_deactivate_col _glp_npp_deactivate_col
alpar@1
   294
void npp_deactivate_col(NPP *npp, NPPCOL *col);
alpar@1
   295
/* make column inactive */
alpar@1
   296
alpar@1
   297
#define npp_add_row _glp_npp_add_row
alpar@1
   298
NPPROW *npp_add_row(NPP *npp);
alpar@1
   299
/* add new row to the current problem */
alpar@1
   300
alpar@1
   301
#define npp_add_col _glp_npp_add_col
alpar@1
   302
NPPCOL *npp_add_col(NPP *npp);
alpar@1
   303
/* add new column to the current problem */
alpar@1
   304
alpar@1
   305
#define npp_add_aij _glp_npp_add_aij
alpar@1
   306
NPPAIJ *npp_add_aij(NPP *npp, NPPROW *row, NPPCOL *col, double val);
alpar@1
   307
/* add new element to the constraint matrix */
alpar@1
   308
alpar@1
   309
#define npp_row_nnz _glp_npp_row_nnz
alpar@1
   310
int npp_row_nnz(NPP *npp, NPPROW *row);
alpar@1
   311
/* count number of non-zero coefficients in row */
alpar@1
   312
alpar@1
   313
#define npp_col_nnz _glp_npp_col_nnz
alpar@1
   314
int npp_col_nnz(NPP *npp, NPPCOL *col);
alpar@1
   315
/* count number of non-zero coefficients in column */
alpar@1
   316
alpar@1
   317
#define npp_push_tse _glp_npp_push_tse
alpar@1
   318
void *npp_push_tse(NPP *npp, int (*func)(NPP *npp, void *info),
alpar@1
   319
      int size);
alpar@1
   320
/* push new entry to the transformation stack */
alpar@1
   321
alpar@1
   322
#define npp_erase_row _glp_npp_erase_row
alpar@1
   323
void npp_erase_row(NPP *npp, NPPROW *row);
alpar@1
   324
/* erase row content to make it empty */
alpar@1
   325
alpar@1
   326
#define npp_del_row _glp_npp_del_row
alpar@1
   327
void npp_del_row(NPP *npp, NPPROW *row);
alpar@1
   328
/* remove row from the current problem */
alpar@1
   329
alpar@1
   330
#define npp_del_col _glp_npp_del_col
alpar@1
   331
void npp_del_col(NPP *npp, NPPCOL *col);
alpar@1
   332
/* remove column from the current problem */
alpar@1
   333
alpar@1
   334
#define npp_del_aij _glp_npp_del_aij
alpar@1
   335
void npp_del_aij(NPP *npp, NPPAIJ *aij);
alpar@1
   336
/* remove element from the constraint matrix */
alpar@1
   337
alpar@1
   338
#define npp_load_prob _glp_npp_load_prob
alpar@1
   339
void npp_load_prob(NPP *npp, glp_prob *orig, int names, int sol,
alpar@1
   340
      int scaling);
alpar@1
   341
/* load original problem into the preprocessor workspace */
alpar@1
   342
alpar@1
   343
#define npp_build_prob _glp_npp_build_prob
alpar@1
   344
void npp_build_prob(NPP *npp, glp_prob *prob);
alpar@1
   345
/* build resultant (preprocessed) problem */
alpar@1
   346
alpar@1
   347
#define npp_postprocess _glp_npp_postprocess
alpar@1
   348
void npp_postprocess(NPP *npp, glp_prob *prob);
alpar@1
   349
/* postprocess solution from the resultant problem */
alpar@1
   350
alpar@1
   351
#define npp_unload_sol _glp_npp_unload_sol
alpar@1
   352
void npp_unload_sol(NPP *npp, glp_prob *orig);
alpar@1
   353
/* store solution to the original problem */
alpar@1
   354
alpar@1
   355
#define npp_delete_wksp _glp_npp_delete_wksp
alpar@1
   356
void npp_delete_wksp(NPP *npp);
alpar@1
   357
/* delete LP/MIP preprocessor workspace */
alpar@1
   358
alpar@1
   359
#define npp_error()
alpar@1
   360
alpar@1
   361
#define npp_free_row _glp_npp_free_row
alpar@1
   362
void npp_free_row(NPP *npp, NPPROW *p);
alpar@1
   363
/* process free (unbounded) row */
alpar@1
   364
alpar@1
   365
#define npp_geq_row _glp_npp_geq_row
alpar@1
   366
void npp_geq_row(NPP *npp, NPPROW *p);
alpar@1
   367
/* process row of 'not less than' type */
alpar@1
   368
alpar@1
   369
#define npp_leq_row _glp_npp_leq_row
alpar@1
   370
void npp_leq_row(NPP *npp, NPPROW *p);
alpar@1
   371
/* process row of 'not greater than' type */
alpar@1
   372
alpar@1
   373
#define npp_free_col _glp_npp_free_col
alpar@1
   374
void npp_free_col(NPP *npp, NPPCOL *q);
alpar@1
   375
/* process free (unbounded) column */
alpar@1
   376
alpar@1
   377
#define npp_lbnd_col _glp_npp_lbnd_col
alpar@1
   378
void npp_lbnd_col(NPP *npp, NPPCOL *q);
alpar@1
   379
/* process column with (non-zero) lower bound */
alpar@1
   380
alpar@1
   381
#define npp_ubnd_col _glp_npp_ubnd_col
alpar@1
   382
void npp_ubnd_col(NPP *npp, NPPCOL *q);
alpar@1
   383
/* process column with upper bound */
alpar@1
   384
alpar@1
   385
#define npp_dbnd_col _glp_npp_dbnd_col
alpar@1
   386
void npp_dbnd_col(NPP *npp, NPPCOL *q);
alpar@1
   387
/* process non-negative column with upper bound */
alpar@1
   388
alpar@1
   389
#define npp_fixed_col _glp_npp_fixed_col
alpar@1
   390
void npp_fixed_col(NPP *npp, NPPCOL *q);
alpar@1
   391
/* process fixed column */
alpar@1
   392
alpar@1
   393
#define npp_make_equality _glp_npp_make_equality
alpar@1
   394
int npp_make_equality(NPP *npp, NPPROW *p);
alpar@1
   395
/* process row with almost identical bounds */
alpar@1
   396
alpar@1
   397
#define npp_make_fixed _glp_npp_make_fixed
alpar@1
   398
int npp_make_fixed(NPP *npp, NPPCOL *q);
alpar@1
   399
/* process column with almost identical bounds */
alpar@1
   400
alpar@1
   401
#define npp_empty_row _glp_npp_empty_row
alpar@1
   402
int npp_empty_row(NPP *npp, NPPROW *p);
alpar@1
   403
/* process empty row */
alpar@1
   404
alpar@1
   405
#define npp_empty_col _glp_npp_empty_col
alpar@1
   406
int npp_empty_col(NPP *npp, NPPCOL *q);
alpar@1
   407
/* process empty column */
alpar@1
   408
alpar@1
   409
#define npp_implied_value _glp_npp_implied_value
alpar@1
   410
int npp_implied_value(NPP *npp, NPPCOL *q, double s);
alpar@1
   411
/* process implied column value */
alpar@1
   412
alpar@1
   413
#define npp_eq_singlet _glp_npp_eq_singlet
alpar@1
   414
int npp_eq_singlet(NPP *npp, NPPROW *p);
alpar@1
   415
/* process row singleton (equality constraint) */
alpar@1
   416
alpar@1
   417
#define npp_implied_lower _glp_npp_implied_lower
alpar@1
   418
int npp_implied_lower(NPP *npp, NPPCOL *q, double l);
alpar@1
   419
/* process implied column lower bound */
alpar@1
   420
alpar@1
   421
#define npp_implied_upper _glp_npp_implied_upper
alpar@1
   422
int npp_implied_upper(NPP *npp, NPPCOL *q, double u);
alpar@1
   423
/* process implied upper bound of column */
alpar@1
   424
alpar@1
   425
#define npp_ineq_singlet _glp_npp_ineq_singlet
alpar@1
   426
int npp_ineq_singlet(NPP *npp, NPPROW *p);
alpar@1
   427
/* process row singleton (inequality constraint) */
alpar@1
   428
alpar@1
   429
#define npp_implied_slack _glp_npp_implied_slack
alpar@1
   430
void npp_implied_slack(NPP *npp, NPPCOL *q);
alpar@1
   431
/* process column singleton (implied slack variable) */
alpar@1
   432
alpar@1
   433
#define npp_implied_free _glp_npp_implied_free
alpar@1
   434
int npp_implied_free(NPP *npp, NPPCOL *q);
alpar@1
   435
/* process column singleton (implied free variable) */
alpar@1
   436
alpar@1
   437
#define npp_eq_doublet _glp_npp_eq_doublet
alpar@1
   438
NPPCOL *npp_eq_doublet(NPP *npp, NPPROW *p);
alpar@1
   439
/* process row doubleton (equality constraint) */
alpar@1
   440
alpar@1
   441
#define npp_forcing_row _glp_npp_forcing_row
alpar@1
   442
int npp_forcing_row(NPP *npp, NPPROW *p, int at);
alpar@1
   443
/* process forcing row */
alpar@1
   444
alpar@1
   445
#define npp_analyze_row _glp_npp_analyze_row
alpar@1
   446
int npp_analyze_row(NPP *npp, NPPROW *p);
alpar@1
   447
/* perform general row analysis */
alpar@1
   448
alpar@1
   449
#define npp_inactive_bound _glp_npp_inactive_bound
alpar@1
   450
void npp_inactive_bound(NPP *npp, NPPROW *p, int which);
alpar@1
   451
/* remove row lower/upper inactive bound */
alpar@1
   452
alpar@1
   453
#define npp_implied_bounds _glp_npp_implied_bounds
alpar@1
   454
void npp_implied_bounds(NPP *npp, NPPROW *p);
alpar@1
   455
/* determine implied column bounds */
alpar@1
   456
alpar@1
   457
#define npp_binarize_prob _glp_npp_binarize_prob
alpar@1
   458
int npp_binarize_prob(NPP *npp);
alpar@1
   459
/* binarize MIP problem */
alpar@1
   460
alpar@1
   461
#define npp_is_packing _glp_npp_is_packing
alpar@1
   462
int npp_is_packing(NPP *npp, NPPROW *row);
alpar@1
   463
/* test if constraint is packing inequality */
alpar@1
   464
alpar@1
   465
#define npp_hidden_packing _glp_npp_hidden_packing
alpar@1
   466
int npp_hidden_packing(NPP *npp, NPPROW *row);
alpar@1
   467
/* identify hidden packing inequality */
alpar@1
   468
alpar@1
   469
#define npp_implied_packing _glp_npp_implied_packing
alpar@1
   470
int npp_implied_packing(NPP *npp, NPPROW *row, int which,
alpar@1
   471
      NPPCOL *var[], char set[]);
alpar@1
   472
/* identify implied packing inequality */
alpar@1
   473
alpar@1
   474
#define npp_is_covering _glp_npp_is_covering
alpar@1
   475
int npp_is_covering(NPP *npp, NPPROW *row);
alpar@1
   476
/* test if constraint is covering inequality */
alpar@1
   477
alpar@1
   478
#define npp_hidden_covering _glp_npp_hidden_covering
alpar@1
   479
int npp_hidden_covering(NPP *npp, NPPROW *row);
alpar@1
   480
/* identify hidden covering inequality */
alpar@1
   481
alpar@1
   482
#define npp_is_partitioning _glp_npp_is_partitioning
alpar@1
   483
int npp_is_partitioning(NPP *npp, NPPROW *row);
alpar@1
   484
/* test if constraint is partitioning equality */
alpar@1
   485
alpar@1
   486
#define npp_reduce_ineq_coef _glp_npp_reduce_ineq_coef
alpar@1
   487
int npp_reduce_ineq_coef(NPP *npp, NPPROW *row);
alpar@1
   488
/* reduce inequality constraint coefficients */
alpar@1
   489
alpar@1
   490
#define npp_clean_prob _glp_npp_clean_prob
alpar@1
   491
void npp_clean_prob(NPP *npp);
alpar@1
   492
/* perform initial LP/MIP processing */
alpar@1
   493
alpar@1
   494
#define npp_process_row _glp_npp_process_row
alpar@1
   495
int npp_process_row(NPP *npp, NPPROW *row, int hard);
alpar@1
   496
/* perform basic row processing */
alpar@1
   497
alpar@1
   498
#define npp_improve_bounds _glp_npp_improve_bounds
alpar@1
   499
int npp_improve_bounds(NPP *npp, NPPROW *row, int flag);
alpar@1
   500
/* improve current column bounds */
alpar@1
   501
alpar@1
   502
#define npp_process_col _glp_npp_process_col
alpar@1
   503
int npp_process_col(NPP *npp, NPPCOL *col);
alpar@1
   504
/* perform basic column processing */
alpar@1
   505
alpar@1
   506
#define npp_process_prob _glp_npp_process_prob
alpar@1
   507
int npp_process_prob(NPP *npp, int hard);
alpar@1
   508
/* perform basic LP/MIP processing */
alpar@1
   509
alpar@1
   510
#define npp_simplex _glp_npp_simplex
alpar@1
   511
int npp_simplex(NPP *npp, const glp_smcp *parm);
alpar@1
   512
/* process LP prior to applying primal/dual simplex method */
alpar@1
   513
alpar@1
   514
#define npp_integer _glp_npp_integer
alpar@1
   515
int npp_integer(NPP *npp, const glp_iocp *parm);
alpar@1
   516
/* process MIP prior to applying branch-and-bound method */
alpar@1
   517
alpar@1
   518
#endif
alpar@1
   519
alpar@1
   520
/* eof */