[1] | 1 | /* glpspx01.c (primal simplex method) */ |
---|
| 2 | |
---|
| 3 | /*********************************************************************** |
---|
| 4 | * This code is part of GLPK (GNU Linear Programming Kit). |
---|
| 5 | * |
---|
| 6 | * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, |
---|
| 7 | * 2009, 2010 Andrew Makhorin, Department for Applied Informatics, |
---|
| 8 | * Moscow Aviation Institute, Moscow, Russia. All rights reserved. |
---|
| 9 | * E-mail: <mao@gnu.org>. |
---|
| 10 | * |
---|
| 11 | * GLPK is free software: you can redistribute it and/or modify it |
---|
| 12 | * under the terms of the GNU General Public License as published by |
---|
| 13 | * the Free Software Foundation, either version 3 of the License, or |
---|
| 14 | * (at your option) any later version. |
---|
| 15 | * |
---|
| 16 | * GLPK is distributed in the hope that it will be useful, but WITHOUT |
---|
| 17 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
---|
| 18 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
---|
| 19 | * License for more details. |
---|
| 20 | * |
---|
| 21 | * You should have received a copy of the GNU General Public License |
---|
| 22 | * along with GLPK. If not, see <http://www.gnu.org/licenses/>. |
---|
| 23 | ***********************************************************************/ |
---|
| 24 | |
---|
| 25 | #include "glpspx.h" |
---|
| 26 | |
---|
| 27 | struct csa |
---|
| 28 | { /* common storage area */ |
---|
| 29 | /*--------------------------------------------------------------*/ |
---|
| 30 | /* LP data */ |
---|
| 31 | int m; |
---|
| 32 | /* number of rows (auxiliary variables), m > 0 */ |
---|
| 33 | int n; |
---|
| 34 | /* number of columns (structural variables), n > 0 */ |
---|
| 35 | char *type; /* char type[1+m+n]; */ |
---|
| 36 | /* type[0] is not used; |
---|
| 37 | type[k], 1 <= k <= m+n, is the type of variable x[k]: |
---|
| 38 | GLP_FR - free variable |
---|
| 39 | GLP_LO - variable with lower bound |
---|
| 40 | GLP_UP - variable with upper bound |
---|
| 41 | GLP_DB - double-bounded variable |
---|
| 42 | GLP_FX - fixed variable */ |
---|
| 43 | double *lb; /* double lb[1+m+n]; */ |
---|
| 44 | /* lb[0] is not used; |
---|
| 45 | lb[k], 1 <= k <= m+n, is an lower bound of variable x[k]; |
---|
| 46 | if x[k] has no lower bound, lb[k] is zero */ |
---|
| 47 | double *ub; /* double ub[1+m+n]; */ |
---|
| 48 | /* ub[0] is not used; |
---|
| 49 | ub[k], 1 <= k <= m+n, is an upper bound of variable x[k]; |
---|
| 50 | if x[k] has no upper bound, ub[k] is zero; |
---|
| 51 | if x[k] is of fixed type, ub[k] is the same as lb[k] */ |
---|
| 52 | double *coef; /* double coef[1+m+n]; */ |
---|
| 53 | /* coef[0] is not used; |
---|
| 54 | coef[k], 1 <= k <= m+n, is an objective coefficient at |
---|
| 55 | variable x[k] (note that on phase I auxiliary variables also |
---|
| 56 | may have non-zero objective coefficients) */ |
---|
| 57 | /*--------------------------------------------------------------*/ |
---|
| 58 | /* original objective function */ |
---|
| 59 | double *obj; /* double obj[1+n]; */ |
---|
| 60 | /* obj[0] is a constant term of the original objective function; |
---|
| 61 | obj[j], 1 <= j <= n, is an original objective coefficient at |
---|
| 62 | structural variable x[m+j] */ |
---|
| 63 | double zeta; |
---|
| 64 | /* factor used to scale original objective coefficients; its |
---|
| 65 | sign defines original optimization direction: zeta > 0 means |
---|
| 66 | minimization, zeta < 0 means maximization */ |
---|
| 67 | /*--------------------------------------------------------------*/ |
---|
| 68 | /* constraint matrix A; it has m rows and n columns and is stored |
---|
| 69 | by columns */ |
---|
| 70 | int *A_ptr; /* int A_ptr[1+n+1]; */ |
---|
| 71 | /* A_ptr[0] is not used; |
---|
| 72 | A_ptr[j], 1 <= j <= n, is starting position of j-th column in |
---|
| 73 | arrays A_ind and A_val; note that A_ptr[1] is always 1; |
---|
| 74 | A_ptr[n+1] indicates the position after the last element in |
---|
| 75 | arrays A_ind and A_val */ |
---|
| 76 | int *A_ind; /* int A_ind[A_ptr[n+1]]; */ |
---|
| 77 | /* row indices */ |
---|
| 78 | double *A_val; /* double A_val[A_ptr[n+1]]; */ |
---|
| 79 | /* non-zero element values */ |
---|
| 80 | /*--------------------------------------------------------------*/ |
---|
| 81 | /* basis header */ |
---|
| 82 | int *head; /* int head[1+m+n]; */ |
---|
| 83 | /* head[0] is not used; |
---|
| 84 | head[i], 1 <= i <= m, is the ordinal number of basic variable |
---|
| 85 | xB[i]; head[i] = k means that xB[i] = x[k] and i-th column of |
---|
| 86 | matrix B is k-th column of matrix (I|-A); |
---|
| 87 | head[m+j], 1 <= j <= n, is the ordinal number of non-basic |
---|
| 88 | variable xN[j]; head[m+j] = k means that xN[j] = x[k] and j-th |
---|
| 89 | column of matrix N is k-th column of matrix (I|-A) */ |
---|
| 90 | char *stat; /* char stat[1+n]; */ |
---|
| 91 | /* stat[0] is not used; |
---|
| 92 | stat[j], 1 <= j <= n, is the status of non-basic variable |
---|
| 93 | xN[j], which defines its active bound: |
---|
| 94 | GLP_NL - lower bound is active |
---|
| 95 | GLP_NU - upper bound is active |
---|
| 96 | GLP_NF - free variable |
---|
| 97 | GLP_NS - fixed variable */ |
---|
| 98 | /*--------------------------------------------------------------*/ |
---|
| 99 | /* matrix B is the basis matrix; it is composed from columns of |
---|
| 100 | the augmented constraint matrix (I|-A) corresponding to basic |
---|
| 101 | variables and stored in a factorized (invertable) form */ |
---|
| 102 | int valid; |
---|
| 103 | /* factorization is valid only if this flag is set */ |
---|
| 104 | BFD *bfd; /* BFD bfd[1:m,1:m]; */ |
---|
| 105 | /* factorized (invertable) form of the basis matrix */ |
---|
| 106 | /*--------------------------------------------------------------*/ |
---|
| 107 | /* matrix N is a matrix composed from columns of the augmented |
---|
| 108 | constraint matrix (I|-A) corresponding to non-basic variables |
---|
| 109 | except fixed ones; it is stored by rows and changes every time |
---|
| 110 | the basis changes */ |
---|
| 111 | int *N_ptr; /* int N_ptr[1+m+1]; */ |
---|
| 112 | /* N_ptr[0] is not used; |
---|
| 113 | N_ptr[i], 1 <= i <= m, is starting position of i-th row in |
---|
| 114 | arrays N_ind and N_val; note that N_ptr[1] is always 1; |
---|
| 115 | N_ptr[m+1] indicates the position after the last element in |
---|
| 116 | arrays N_ind and N_val */ |
---|
| 117 | int *N_len; /* int N_len[1+m]; */ |
---|
| 118 | /* N_len[0] is not used; |
---|
| 119 | N_len[i], 1 <= i <= m, is length of i-th row (0 to n) */ |
---|
| 120 | int *N_ind; /* int N_ind[N_ptr[m+1]]; */ |
---|
| 121 | /* column indices */ |
---|
| 122 | double *N_val; /* double N_val[N_ptr[m+1]]; */ |
---|
| 123 | /* non-zero element values */ |
---|
| 124 | /*--------------------------------------------------------------*/ |
---|
| 125 | /* working parameters */ |
---|
| 126 | int phase; |
---|
| 127 | /* search phase: |
---|
| 128 | 0 - not determined yet |
---|
| 129 | 1 - search for primal feasible solution |
---|
| 130 | 2 - search for optimal solution */ |
---|
| 131 | glp_long tm_beg; |
---|
| 132 | /* time value at the beginning of the search */ |
---|
| 133 | int it_beg; |
---|
| 134 | /* simplex iteration count at the beginning of the search */ |
---|
| 135 | int it_cnt; |
---|
| 136 | /* simplex iteration count; it increases by one every time the |
---|
| 137 | basis changes (including the case when a non-basic variable |
---|
| 138 | jumps to its opposite bound) */ |
---|
| 139 | int it_dpy; |
---|
| 140 | /* simplex iteration count at the most recent display output */ |
---|
| 141 | /*--------------------------------------------------------------*/ |
---|
| 142 | /* basic solution components */ |
---|
| 143 | double *bbar; /* double bbar[1+m]; */ |
---|
| 144 | /* bbar[0] is not used; |
---|
| 145 | bbar[i], 1 <= i <= m, is primal value of basic variable xB[i] |
---|
| 146 | (if xB[i] is free, its primal value is not updated) */ |
---|
| 147 | double *cbar; /* double cbar[1+n]; */ |
---|
| 148 | /* cbar[0] is not used; |
---|
| 149 | cbar[j], 1 <= j <= n, is reduced cost of non-basic variable |
---|
| 150 | xN[j] (if xN[j] is fixed, its reduced cost is not updated) */ |
---|
| 151 | /*--------------------------------------------------------------*/ |
---|
| 152 | /* the following pricing technique options may be used: |
---|
| 153 | GLP_PT_STD - standard ("textbook") pricing; |
---|
| 154 | GLP_PT_PSE - projected steepest edge; |
---|
| 155 | GLP_PT_DVX - Devex pricing (not implemented yet); |
---|
| 156 | in case of GLP_PT_STD the reference space is not used, and all |
---|
| 157 | steepest edge coefficients are set to 1 */ |
---|
| 158 | int refct; |
---|
| 159 | /* this count is set to an initial value when the reference space |
---|
| 160 | is defined and decreases by one every time the basis changes; |
---|
| 161 | once this count reaches zero, the reference space is redefined |
---|
| 162 | again */ |
---|
| 163 | char *refsp; /* char refsp[1+m+n]; */ |
---|
| 164 | /* refsp[0] is not used; |
---|
| 165 | refsp[k], 1 <= k <= m+n, is the flag which means that variable |
---|
| 166 | x[k] belongs to the current reference space */ |
---|
| 167 | double *gamma; /* double gamma[1+n]; */ |
---|
| 168 | /* gamma[0] is not used; |
---|
| 169 | gamma[j], 1 <= j <= n, is the steepest edge coefficient for |
---|
| 170 | non-basic variable xN[j]; if xN[j] is fixed, gamma[j] is not |
---|
| 171 | used and just set to 1 */ |
---|
| 172 | /*--------------------------------------------------------------*/ |
---|
| 173 | /* non-basic variable xN[q] chosen to enter the basis */ |
---|
| 174 | int q; |
---|
| 175 | /* index of the non-basic variable xN[q] chosen, 1 <= q <= n; |
---|
| 176 | if the set of eligible non-basic variables is empty and thus |
---|
| 177 | no variable has been chosen, q is set to 0 */ |
---|
| 178 | /*--------------------------------------------------------------*/ |
---|
| 179 | /* pivot column of the simplex table corresponding to non-basic |
---|
| 180 | variable xN[q] chosen is the following vector: |
---|
| 181 | T * e[q] = - inv(B) * N * e[q] = - inv(B) * N[q], |
---|
| 182 | where B is the current basis matrix, N[q] is a column of the |
---|
| 183 | matrix (I|-A) corresponding to xN[q] */ |
---|
| 184 | int tcol_nnz; |
---|
| 185 | /* number of non-zero components, 0 <= nnz <= m */ |
---|
| 186 | int *tcol_ind; /* int tcol_ind[1+m]; */ |
---|
| 187 | /* tcol_ind[0] is not used; |
---|
| 188 | tcol_ind[t], 1 <= t <= nnz, is an index of non-zero component, |
---|
| 189 | i.e. tcol_ind[t] = i means that tcol_vec[i] != 0 */ |
---|
| 190 | double *tcol_vec; /* double tcol_vec[1+m]; */ |
---|
| 191 | /* tcol_vec[0] is not used; |
---|
| 192 | tcol_vec[i], 1 <= i <= m, is a numeric value of i-th component |
---|
| 193 | of the column */ |
---|
| 194 | double tcol_max; |
---|
| 195 | /* infinity (maximum) norm of the column (max |tcol_vec[i]|) */ |
---|
| 196 | int tcol_num; |
---|
| 197 | /* number of significant non-zero components, which means that: |
---|
| 198 | |tcol_vec[i]| >= eps for i in tcol_ind[1,...,num], |
---|
| 199 | |tcol_vec[i]| < eps for i in tcol_ind[num+1,...,nnz], |
---|
| 200 | where eps is a pivot tolerance */ |
---|
| 201 | /*--------------------------------------------------------------*/ |
---|
| 202 | /* basic variable xB[p] chosen to leave the basis */ |
---|
| 203 | int p; |
---|
| 204 | /* index of the basic variable xB[p] chosen, 1 <= p <= m; |
---|
| 205 | p = 0 means that no basic variable reaches its bound; |
---|
| 206 | p < 0 means that non-basic variable xN[q] reaches its opposite |
---|
| 207 | bound before any basic variable */ |
---|
| 208 | int p_stat; |
---|
| 209 | /* new status (GLP_NL, GLP_NU, or GLP_NS) to be assigned to xB[p] |
---|
| 210 | once it has left the basis */ |
---|
| 211 | double teta; |
---|
| 212 | /* change of non-basic variable xN[q] (see above), on which xB[p] |
---|
| 213 | (or, if p < 0, xN[q] itself) reaches its bound */ |
---|
| 214 | /*--------------------------------------------------------------*/ |
---|
| 215 | /* pivot row of the simplex table corresponding to basic variable |
---|
| 216 | xB[p] chosen is the following vector: |
---|
| 217 | T' * e[p] = - N' * inv(B') * e[p] = - N' * rho, |
---|
| 218 | where B' is a matrix transposed to the current basis matrix, |
---|
| 219 | N' is a matrix, whose rows are columns of the matrix (I|-A) |
---|
| 220 | corresponding to non-basic non-fixed variables */ |
---|
| 221 | int trow_nnz; |
---|
| 222 | /* number of non-zero components, 0 <= nnz <= n */ |
---|
| 223 | int *trow_ind; /* int trow_ind[1+n]; */ |
---|
| 224 | /* trow_ind[0] is not used; |
---|
| 225 | trow_ind[t], 1 <= t <= nnz, is an index of non-zero component, |
---|
| 226 | i.e. trow_ind[t] = j means that trow_vec[j] != 0 */ |
---|
| 227 | double *trow_vec; /* int trow_vec[1+n]; */ |
---|
| 228 | /* trow_vec[0] is not used; |
---|
| 229 | trow_vec[j], 1 <= j <= n, is a numeric value of j-th component |
---|
| 230 | of the row */ |
---|
| 231 | /*--------------------------------------------------------------*/ |
---|
| 232 | /* working arrays */ |
---|
| 233 | double *work1; /* double work1[1+m]; */ |
---|
| 234 | double *work2; /* double work2[1+m]; */ |
---|
| 235 | double *work3; /* double work3[1+m]; */ |
---|
| 236 | double *work4; /* double work4[1+m]; */ |
---|
| 237 | }; |
---|
| 238 | |
---|
| 239 | static const double kappa = 0.10; |
---|
| 240 | |
---|
| 241 | /*********************************************************************** |
---|
| 242 | * alloc_csa - allocate common storage area |
---|
| 243 | * |
---|
| 244 | * This routine allocates all arrays in the common storage area (CSA) |
---|
| 245 | * and returns a pointer to the CSA. */ |
---|
| 246 | |
---|
| 247 | static struct csa *alloc_csa(glp_prob *lp) |
---|
| 248 | { struct csa *csa; |
---|
| 249 | int m = lp->m; |
---|
| 250 | int n = lp->n; |
---|
| 251 | int nnz = lp->nnz; |
---|
| 252 | csa = xmalloc(sizeof(struct csa)); |
---|
| 253 | xassert(m > 0 && n > 0); |
---|
| 254 | csa->m = m; |
---|
| 255 | csa->n = n; |
---|
| 256 | csa->type = xcalloc(1+m+n, sizeof(char)); |
---|
| 257 | csa->lb = xcalloc(1+m+n, sizeof(double)); |
---|
| 258 | csa->ub = xcalloc(1+m+n, sizeof(double)); |
---|
| 259 | csa->coef = xcalloc(1+m+n, sizeof(double)); |
---|
| 260 | csa->obj = xcalloc(1+n, sizeof(double)); |
---|
| 261 | csa->A_ptr = xcalloc(1+n+1, sizeof(int)); |
---|
| 262 | csa->A_ind = xcalloc(1+nnz, sizeof(int)); |
---|
| 263 | csa->A_val = xcalloc(1+nnz, sizeof(double)); |
---|
| 264 | csa->head = xcalloc(1+m+n, sizeof(int)); |
---|
| 265 | csa->stat = xcalloc(1+n, sizeof(char)); |
---|
| 266 | csa->N_ptr = xcalloc(1+m+1, sizeof(int)); |
---|
| 267 | csa->N_len = xcalloc(1+m, sizeof(int)); |
---|
| 268 | csa->N_ind = NULL; /* will be allocated later */ |
---|
| 269 | csa->N_val = NULL; /* will be allocated later */ |
---|
| 270 | csa->bbar = xcalloc(1+m, sizeof(double)); |
---|
| 271 | csa->cbar = xcalloc(1+n, sizeof(double)); |
---|
| 272 | csa->refsp = xcalloc(1+m+n, sizeof(char)); |
---|
| 273 | csa->gamma = xcalloc(1+n, sizeof(double)); |
---|
| 274 | csa->tcol_ind = xcalloc(1+m, sizeof(int)); |
---|
| 275 | csa->tcol_vec = xcalloc(1+m, sizeof(double)); |
---|
| 276 | csa->trow_ind = xcalloc(1+n, sizeof(int)); |
---|
| 277 | csa->trow_vec = xcalloc(1+n, sizeof(double)); |
---|
| 278 | csa->work1 = xcalloc(1+m, sizeof(double)); |
---|
| 279 | csa->work2 = xcalloc(1+m, sizeof(double)); |
---|
| 280 | csa->work3 = xcalloc(1+m, sizeof(double)); |
---|
| 281 | csa->work4 = xcalloc(1+m, sizeof(double)); |
---|
| 282 | return csa; |
---|
| 283 | } |
---|
| 284 | |
---|
| 285 | /*********************************************************************** |
---|
| 286 | * init_csa - initialize common storage area |
---|
| 287 | * |
---|
| 288 | * This routine initializes all data structures in the common storage |
---|
| 289 | * area (CSA). */ |
---|
| 290 | |
---|
| 291 | static void alloc_N(struct csa *csa); |
---|
| 292 | static void build_N(struct csa *csa); |
---|
| 293 | |
---|
| 294 | static void init_csa(struct csa *csa, glp_prob *lp) |
---|
| 295 | { int m = csa->m; |
---|
| 296 | int n = csa->n; |
---|
| 297 | char *type = csa->type; |
---|
| 298 | double *lb = csa->lb; |
---|
| 299 | double *ub = csa->ub; |
---|
| 300 | double *coef = csa->coef; |
---|
| 301 | double *obj = csa->obj; |
---|
| 302 | int *A_ptr = csa->A_ptr; |
---|
| 303 | int *A_ind = csa->A_ind; |
---|
| 304 | double *A_val = csa->A_val; |
---|
| 305 | int *head = csa->head; |
---|
| 306 | char *stat = csa->stat; |
---|
| 307 | char *refsp = csa->refsp; |
---|
| 308 | double *gamma = csa->gamma; |
---|
| 309 | int i, j, k, loc; |
---|
| 310 | double cmax; |
---|
| 311 | /* auxiliary variables */ |
---|
| 312 | for (i = 1; i <= m; i++) |
---|
| 313 | { GLPROW *row = lp->row[i]; |
---|
| 314 | type[i] = (char)row->type; |
---|
| 315 | lb[i] = row->lb * row->rii; |
---|
| 316 | ub[i] = row->ub * row->rii; |
---|
| 317 | coef[i] = 0.0; |
---|
| 318 | } |
---|
| 319 | /* structural variables */ |
---|
| 320 | for (j = 1; j <= n; j++) |
---|
| 321 | { GLPCOL *col = lp->col[j]; |
---|
| 322 | type[m+j] = (char)col->type; |
---|
| 323 | lb[m+j] = col->lb / col->sjj; |
---|
| 324 | ub[m+j] = col->ub / col->sjj; |
---|
| 325 | coef[m+j] = col->coef * col->sjj; |
---|
| 326 | } |
---|
| 327 | /* original objective function */ |
---|
| 328 | obj[0] = lp->c0; |
---|
| 329 | memcpy(&obj[1], &coef[m+1], n * sizeof(double)); |
---|
| 330 | /* factor used to scale original objective coefficients */ |
---|
| 331 | cmax = 0.0; |
---|
| 332 | for (j = 1; j <= n; j++) |
---|
| 333 | if (cmax < fabs(obj[j])) cmax = fabs(obj[j]); |
---|
| 334 | if (cmax == 0.0) cmax = 1.0; |
---|
| 335 | switch (lp->dir) |
---|
| 336 | { case GLP_MIN: |
---|
| 337 | csa->zeta = + 1.0 / cmax; |
---|
| 338 | break; |
---|
| 339 | case GLP_MAX: |
---|
| 340 | csa->zeta = - 1.0 / cmax; |
---|
| 341 | break; |
---|
| 342 | default: |
---|
| 343 | xassert(lp != lp); |
---|
| 344 | } |
---|
| 345 | #if 1 |
---|
| 346 | if (fabs(csa->zeta) < 1.0) csa->zeta *= 1000.0; |
---|
| 347 | #endif |
---|
| 348 | /* matrix A (by columns) */ |
---|
| 349 | loc = 1; |
---|
| 350 | for (j = 1; j <= n; j++) |
---|
| 351 | { GLPAIJ *aij; |
---|
| 352 | A_ptr[j] = loc; |
---|
| 353 | for (aij = lp->col[j]->ptr; aij != NULL; aij = aij->c_next) |
---|
| 354 | { A_ind[loc] = aij->row->i; |
---|
| 355 | A_val[loc] = aij->row->rii * aij->val * aij->col->sjj; |
---|
| 356 | loc++; |
---|
| 357 | } |
---|
| 358 | } |
---|
| 359 | A_ptr[n+1] = loc; |
---|
| 360 | xassert(loc == lp->nnz+1); |
---|
| 361 | /* basis header */ |
---|
| 362 | xassert(lp->valid); |
---|
| 363 | memcpy(&head[1], &lp->head[1], m * sizeof(int)); |
---|
| 364 | k = 0; |
---|
| 365 | for (i = 1; i <= m; i++) |
---|
| 366 | { GLPROW *row = lp->row[i]; |
---|
| 367 | if (row->stat != GLP_BS) |
---|
| 368 | { k++; |
---|
| 369 | xassert(k <= n); |
---|
| 370 | head[m+k] = i; |
---|
| 371 | stat[k] = (char)row->stat; |
---|
| 372 | } |
---|
| 373 | } |
---|
| 374 | for (j = 1; j <= n; j++) |
---|
| 375 | { GLPCOL *col = lp->col[j]; |
---|
| 376 | if (col->stat != GLP_BS) |
---|
| 377 | { k++; |
---|
| 378 | xassert(k <= n); |
---|
| 379 | head[m+k] = m + j; |
---|
| 380 | stat[k] = (char)col->stat; |
---|
| 381 | } |
---|
| 382 | } |
---|
| 383 | xassert(k == n); |
---|
| 384 | /* factorization of matrix B */ |
---|
| 385 | csa->valid = 1, lp->valid = 0; |
---|
| 386 | csa->bfd = lp->bfd, lp->bfd = NULL; |
---|
| 387 | /* matrix N (by rows) */ |
---|
| 388 | alloc_N(csa); |
---|
| 389 | build_N(csa); |
---|
| 390 | /* working parameters */ |
---|
| 391 | csa->phase = 0; |
---|
| 392 | csa->tm_beg = xtime(); |
---|
| 393 | csa->it_beg = csa->it_cnt = lp->it_cnt; |
---|
| 394 | csa->it_dpy = -1; |
---|
| 395 | /* reference space and steepest edge coefficients */ |
---|
| 396 | csa->refct = 0; |
---|
| 397 | memset(&refsp[1], 0, (m+n) * sizeof(char)); |
---|
| 398 | for (j = 1; j <= n; j++) gamma[j] = 1.0; |
---|
| 399 | return; |
---|
| 400 | } |
---|
| 401 | |
---|
| 402 | /*********************************************************************** |
---|
| 403 | * invert_B - compute factorization of the basis matrix |
---|
| 404 | * |
---|
| 405 | * This routine computes factorization of the current basis matrix B. |
---|
| 406 | * |
---|
| 407 | * If the operation is successful, the routine returns zero, otherwise |
---|
| 408 | * non-zero. */ |
---|
| 409 | |
---|
| 410 | static int inv_col(void *info, int i, int ind[], double val[]) |
---|
| 411 | { /* this auxiliary routine returns row indices and numeric values |
---|
| 412 | of non-zero elements of i-th column of the basis matrix */ |
---|
| 413 | struct csa *csa = info; |
---|
| 414 | int m = csa->m; |
---|
| 415 | #ifdef GLP_DEBUG |
---|
| 416 | int n = csa->n; |
---|
| 417 | #endif |
---|
| 418 | int *A_ptr = csa->A_ptr; |
---|
| 419 | int *A_ind = csa->A_ind; |
---|
| 420 | double *A_val = csa->A_val; |
---|
| 421 | int *head = csa->head; |
---|
| 422 | int k, len, ptr, t; |
---|
| 423 | #ifdef GLP_DEBUG |
---|
| 424 | xassert(1 <= i && i <= m); |
---|
| 425 | #endif |
---|
| 426 | k = head[i]; /* B[i] is k-th column of (I|-A) */ |
---|
| 427 | #ifdef GLP_DEBUG |
---|
| 428 | xassert(1 <= k && k <= m+n); |
---|
| 429 | #endif |
---|
| 430 | if (k <= m) |
---|
| 431 | { /* B[i] is k-th column of submatrix I */ |
---|
| 432 | len = 1; |
---|
| 433 | ind[1] = k; |
---|
| 434 | val[1] = 1.0; |
---|
| 435 | } |
---|
| 436 | else |
---|
| 437 | { /* B[i] is (k-m)-th column of submatrix (-A) */ |
---|
| 438 | ptr = A_ptr[k-m]; |
---|
| 439 | len = A_ptr[k-m+1] - ptr; |
---|
| 440 | memcpy(&ind[1], &A_ind[ptr], len * sizeof(int)); |
---|
| 441 | memcpy(&val[1], &A_val[ptr], len * sizeof(double)); |
---|
| 442 | for (t = 1; t <= len; t++) val[t] = - val[t]; |
---|
| 443 | } |
---|
| 444 | return len; |
---|
| 445 | } |
---|
| 446 | |
---|
| 447 | static int invert_B(struct csa *csa) |
---|
| 448 | { int ret; |
---|
| 449 | ret = bfd_factorize(csa->bfd, csa->m, NULL, inv_col, csa); |
---|
| 450 | csa->valid = (ret == 0); |
---|
| 451 | return ret; |
---|
| 452 | } |
---|
| 453 | |
---|
| 454 | /*********************************************************************** |
---|
| 455 | * update_B - update factorization of the basis matrix |
---|
| 456 | * |
---|
| 457 | * This routine replaces i-th column of the basis matrix B by k-th |
---|
| 458 | * column of the augmented constraint matrix (I|-A) and then updates |
---|
| 459 | * the factorization of B. |
---|
| 460 | * |
---|
| 461 | * If the factorization has been successfully updated, the routine |
---|
| 462 | * returns zero, otherwise non-zero. */ |
---|
| 463 | |
---|
| 464 | static int update_B(struct csa *csa, int i, int k) |
---|
| 465 | { int m = csa->m; |
---|
| 466 | #ifdef GLP_DEBUG |
---|
| 467 | int n = csa->n; |
---|
| 468 | #endif |
---|
| 469 | int ret; |
---|
| 470 | #ifdef GLP_DEBUG |
---|
| 471 | xassert(1 <= i && i <= m); |
---|
| 472 | xassert(1 <= k && k <= m+n); |
---|
| 473 | #endif |
---|
| 474 | if (k <= m) |
---|
| 475 | { /* new i-th column of B is k-th column of I */ |
---|
| 476 | int ind[1+1]; |
---|
| 477 | double val[1+1]; |
---|
| 478 | ind[1] = k; |
---|
| 479 | val[1] = 1.0; |
---|
| 480 | xassert(csa->valid); |
---|
| 481 | ret = bfd_update_it(csa->bfd, i, 0, 1, ind, val); |
---|
| 482 | } |
---|
| 483 | else |
---|
| 484 | { /* new i-th column of B is (k-m)-th column of (-A) */ |
---|
| 485 | int *A_ptr = csa->A_ptr; |
---|
| 486 | int *A_ind = csa->A_ind; |
---|
| 487 | double *A_val = csa->A_val; |
---|
| 488 | double *val = csa->work1; |
---|
| 489 | int beg, end, ptr, len; |
---|
| 490 | beg = A_ptr[k-m]; |
---|
| 491 | end = A_ptr[k-m+1]; |
---|
| 492 | len = 0; |
---|
| 493 | for (ptr = beg; ptr < end; ptr++) |
---|
| 494 | val[++len] = - A_val[ptr]; |
---|
| 495 | xassert(csa->valid); |
---|
| 496 | ret = bfd_update_it(csa->bfd, i, 0, len, &A_ind[beg-1], val); |
---|
| 497 | } |
---|
| 498 | csa->valid = (ret == 0); |
---|
| 499 | return ret; |
---|
| 500 | } |
---|
| 501 | |
---|
| 502 | /*********************************************************************** |
---|
| 503 | * error_ftran - compute residual vector r = h - B * x |
---|
| 504 | * |
---|
| 505 | * This routine computes the residual vector r = h - B * x, where B is |
---|
| 506 | * the current basis matrix, h is the vector of right-hand sides, x is |
---|
| 507 | * the solution vector. */ |
---|
| 508 | |
---|
| 509 | static void error_ftran(struct csa *csa, double h[], double x[], |
---|
| 510 | double r[]) |
---|
| 511 | { int m = csa->m; |
---|
| 512 | #ifdef GLP_DEBUG |
---|
| 513 | int n = csa->n; |
---|
| 514 | #endif |
---|
| 515 | int *A_ptr = csa->A_ptr; |
---|
| 516 | int *A_ind = csa->A_ind; |
---|
| 517 | double *A_val = csa->A_val; |
---|
| 518 | int *head = csa->head; |
---|
| 519 | int i, k, beg, end, ptr; |
---|
| 520 | double temp; |
---|
| 521 | /* compute the residual vector: |
---|
| 522 | r = h - B * x = h - B[1] * x[1] - ... - B[m] * x[m], |
---|
| 523 | where B[1], ..., B[m] are columns of matrix B */ |
---|
| 524 | memcpy(&r[1], &h[1], m * sizeof(double)); |
---|
| 525 | for (i = 1; i <= m; i++) |
---|
| 526 | { temp = x[i]; |
---|
| 527 | if (temp == 0.0) continue; |
---|
| 528 | k = head[i]; /* B[i] is k-th column of (I|-A) */ |
---|
| 529 | #ifdef GLP_DEBUG |
---|
| 530 | xassert(1 <= k && k <= m+n); |
---|
| 531 | #endif |
---|
| 532 | if (k <= m) |
---|
| 533 | { /* B[i] is k-th column of submatrix I */ |
---|
| 534 | r[k] -= temp; |
---|
| 535 | } |
---|
| 536 | else |
---|
| 537 | { /* B[i] is (k-m)-th column of submatrix (-A) */ |
---|
| 538 | beg = A_ptr[k-m]; |
---|
| 539 | end = A_ptr[k-m+1]; |
---|
| 540 | for (ptr = beg; ptr < end; ptr++) |
---|
| 541 | r[A_ind[ptr]] += A_val[ptr] * temp; |
---|
| 542 | } |
---|
| 543 | } |
---|
| 544 | return; |
---|
| 545 | } |
---|
| 546 | |
---|
| 547 | /*********************************************************************** |
---|
| 548 | * refine_ftran - refine solution of B * x = h |
---|
| 549 | * |
---|
| 550 | * This routine performs one iteration to refine the solution of |
---|
| 551 | * the system B * x = h, where B is the current basis matrix, h is the |
---|
| 552 | * vector of right-hand sides, x is the solution vector. */ |
---|
| 553 | |
---|
| 554 | static void refine_ftran(struct csa *csa, double h[], double x[]) |
---|
| 555 | { int m = csa->m; |
---|
| 556 | double *r = csa->work1; |
---|
| 557 | double *d = csa->work1; |
---|
| 558 | int i; |
---|
| 559 | /* compute the residual vector r = h - B * x */ |
---|
| 560 | error_ftran(csa, h, x, r); |
---|
| 561 | /* compute the correction vector d = inv(B) * r */ |
---|
| 562 | xassert(csa->valid); |
---|
| 563 | bfd_ftran(csa->bfd, d); |
---|
| 564 | /* refine the solution vector (new x) = (old x) + d */ |
---|
| 565 | for (i = 1; i <= m; i++) x[i] += d[i]; |
---|
| 566 | return; |
---|
| 567 | } |
---|
| 568 | |
---|
| 569 | /*********************************************************************** |
---|
| 570 | * error_btran - compute residual vector r = h - B'* x |
---|
| 571 | * |
---|
| 572 | * This routine computes the residual vector r = h - B'* x, where B' |
---|
| 573 | * is a matrix transposed to the current basis matrix, h is the vector |
---|
| 574 | * of right-hand sides, x is the solution vector. */ |
---|
| 575 | |
---|
| 576 | static void error_btran(struct csa *csa, double h[], double x[], |
---|
| 577 | double r[]) |
---|
| 578 | { int m = csa->m; |
---|
| 579 | #ifdef GLP_DEBUG |
---|
| 580 | int n = csa->n; |
---|
| 581 | #endif |
---|
| 582 | int *A_ptr = csa->A_ptr; |
---|
| 583 | int *A_ind = csa->A_ind; |
---|
| 584 | double *A_val = csa->A_val; |
---|
| 585 | int *head = csa->head; |
---|
| 586 | int i, k, beg, end, ptr; |
---|
| 587 | double temp; |
---|
| 588 | /* compute the residual vector r = b - B'* x */ |
---|
| 589 | for (i = 1; i <= m; i++) |
---|
| 590 | { /* r[i] := b[i] - (i-th column of B)'* x */ |
---|
| 591 | k = head[i]; /* B[i] is k-th column of (I|-A) */ |
---|
| 592 | #ifdef GLP_DEBUG |
---|
| 593 | xassert(1 <= k && k <= m+n); |
---|
| 594 | #endif |
---|
| 595 | temp = h[i]; |
---|
| 596 | if (k <= m) |
---|
| 597 | { /* B[i] is k-th column of submatrix I */ |
---|
| 598 | temp -= x[k]; |
---|
| 599 | } |
---|
| 600 | else |
---|
| 601 | { /* B[i] is (k-m)-th column of submatrix (-A) */ |
---|
| 602 | beg = A_ptr[k-m]; |
---|
| 603 | end = A_ptr[k-m+1]; |
---|
| 604 | for (ptr = beg; ptr < end; ptr++) |
---|
| 605 | temp += A_val[ptr] * x[A_ind[ptr]]; |
---|
| 606 | } |
---|
| 607 | r[i] = temp; |
---|
| 608 | } |
---|
| 609 | return; |
---|
| 610 | } |
---|
| 611 | |
---|
| 612 | /*********************************************************************** |
---|
| 613 | * refine_btran - refine solution of B'* x = h |
---|
| 614 | * |
---|
| 615 | * This routine performs one iteration to refine the solution of the |
---|
| 616 | * system B'* x = h, where B' is a matrix transposed to the current |
---|
| 617 | * basis matrix, h is the vector of right-hand sides, x is the solution |
---|
| 618 | * vector. */ |
---|
| 619 | |
---|
| 620 | static void refine_btran(struct csa *csa, double h[], double x[]) |
---|
| 621 | { int m = csa->m; |
---|
| 622 | double *r = csa->work1; |
---|
| 623 | double *d = csa->work1; |
---|
| 624 | int i; |
---|
| 625 | /* compute the residual vector r = h - B'* x */ |
---|
| 626 | error_btran(csa, h, x, r); |
---|
| 627 | /* compute the correction vector d = inv(B') * r */ |
---|
| 628 | xassert(csa->valid); |
---|
| 629 | bfd_btran(csa->bfd, d); |
---|
| 630 | /* refine the solution vector (new x) = (old x) + d */ |
---|
| 631 | for (i = 1; i <= m; i++) x[i] += d[i]; |
---|
| 632 | return; |
---|
| 633 | } |
---|
| 634 | |
---|
| 635 | /*********************************************************************** |
---|
| 636 | * alloc_N - allocate matrix N |
---|
| 637 | * |
---|
| 638 | * This routine determines maximal row lengths of matrix N, sets its |
---|
| 639 | * row pointers, and then allocates arrays N_ind and N_val. |
---|
| 640 | * |
---|
| 641 | * Note that some fixed structural variables may temporarily become |
---|
| 642 | * double-bounded, so corresponding columns of matrix A should not be |
---|
| 643 | * ignored on calculating maximal row lengths of matrix N. */ |
---|
| 644 | |
---|
| 645 | static void alloc_N(struct csa *csa) |
---|
| 646 | { int m = csa->m; |
---|
| 647 | int n = csa->n; |
---|
| 648 | int *A_ptr = csa->A_ptr; |
---|
| 649 | int *A_ind = csa->A_ind; |
---|
| 650 | int *N_ptr = csa->N_ptr; |
---|
| 651 | int *N_len = csa->N_len; |
---|
| 652 | int i, j, beg, end, ptr; |
---|
| 653 | /* determine number of non-zeros in each row of the augmented |
---|
| 654 | constraint matrix (I|-A) */ |
---|
| 655 | for (i = 1; i <= m; i++) |
---|
| 656 | N_len[i] = 1; |
---|
| 657 | for (j = 1; j <= n; j++) |
---|
| 658 | { beg = A_ptr[j]; |
---|
| 659 | end = A_ptr[j+1]; |
---|
| 660 | for (ptr = beg; ptr < end; ptr++) |
---|
| 661 | N_len[A_ind[ptr]]++; |
---|
| 662 | } |
---|
| 663 | /* determine maximal row lengths of matrix N and set its row |
---|
| 664 | pointers */ |
---|
| 665 | N_ptr[1] = 1; |
---|
| 666 | for (i = 1; i <= m; i++) |
---|
| 667 | { /* row of matrix N cannot have more than n non-zeros */ |
---|
| 668 | if (N_len[i] > n) N_len[i] = n; |
---|
| 669 | N_ptr[i+1] = N_ptr[i] + N_len[i]; |
---|
| 670 | } |
---|
| 671 | /* now maximal number of non-zeros in matrix N is known */ |
---|
| 672 | csa->N_ind = xcalloc(N_ptr[m+1], sizeof(int)); |
---|
| 673 | csa->N_val = xcalloc(N_ptr[m+1], sizeof(double)); |
---|
| 674 | return; |
---|
| 675 | } |
---|
| 676 | |
---|
| 677 | /*********************************************************************** |
---|
| 678 | * add_N_col - add column of matrix (I|-A) to matrix N |
---|
| 679 | * |
---|
| 680 | * This routine adds j-th column to matrix N which is k-th column of |
---|
| 681 | * the augmented constraint matrix (I|-A). (It is assumed that old j-th |
---|
| 682 | * column was previously removed from matrix N.) */ |
---|
| 683 | |
---|
| 684 | static void add_N_col(struct csa *csa, int j, int k) |
---|
| 685 | { int m = csa->m; |
---|
| 686 | #ifdef GLP_DEBUG |
---|
| 687 | int n = csa->n; |
---|
| 688 | #endif |
---|
| 689 | int *N_ptr = csa->N_ptr; |
---|
| 690 | int *N_len = csa->N_len; |
---|
| 691 | int *N_ind = csa->N_ind; |
---|
| 692 | double *N_val = csa->N_val; |
---|
| 693 | int pos; |
---|
| 694 | #ifdef GLP_DEBUG |
---|
| 695 | xassert(1 <= j && j <= n); |
---|
| 696 | xassert(1 <= k && k <= m+n); |
---|
| 697 | #endif |
---|
| 698 | if (k <= m) |
---|
| 699 | { /* N[j] is k-th column of submatrix I */ |
---|
| 700 | pos = N_ptr[k] + (N_len[k]++); |
---|
| 701 | #ifdef GLP_DEBUG |
---|
| 702 | xassert(pos < N_ptr[k+1]); |
---|
| 703 | #endif |
---|
| 704 | N_ind[pos] = j; |
---|
| 705 | N_val[pos] = 1.0; |
---|
| 706 | } |
---|
| 707 | else |
---|
| 708 | { /* N[j] is (k-m)-th column of submatrix (-A) */ |
---|
| 709 | int *A_ptr = csa->A_ptr; |
---|
| 710 | int *A_ind = csa->A_ind; |
---|
| 711 | double *A_val = csa->A_val; |
---|
| 712 | int i, beg, end, ptr; |
---|
| 713 | beg = A_ptr[k-m]; |
---|
| 714 | end = A_ptr[k-m+1]; |
---|
| 715 | for (ptr = beg; ptr < end; ptr++) |
---|
| 716 | { i = A_ind[ptr]; /* row number */ |
---|
| 717 | pos = N_ptr[i] + (N_len[i]++); |
---|
| 718 | #ifdef GLP_DEBUG |
---|
| 719 | xassert(pos < N_ptr[i+1]); |
---|
| 720 | #endif |
---|
| 721 | N_ind[pos] = j; |
---|
| 722 | N_val[pos] = - A_val[ptr]; |
---|
| 723 | } |
---|
| 724 | } |
---|
| 725 | return; |
---|
| 726 | } |
---|
| 727 | |
---|
| 728 | /*********************************************************************** |
---|
| 729 | * del_N_col - remove column of matrix (I|-A) from matrix N |
---|
| 730 | * |
---|
| 731 | * This routine removes j-th column from matrix N which is k-th column |
---|
| 732 | * of the augmented constraint matrix (I|-A). */ |
---|
| 733 | |
---|
| 734 | static void del_N_col(struct csa *csa, int j, int k) |
---|
| 735 | { int m = csa->m; |
---|
| 736 | #ifdef GLP_DEBUG |
---|
| 737 | int n = csa->n; |
---|
| 738 | #endif |
---|
| 739 | int *N_ptr = csa->N_ptr; |
---|
| 740 | int *N_len = csa->N_len; |
---|
| 741 | int *N_ind = csa->N_ind; |
---|
| 742 | double *N_val = csa->N_val; |
---|
| 743 | int pos, head, tail; |
---|
| 744 | #ifdef GLP_DEBUG |
---|
| 745 | xassert(1 <= j && j <= n); |
---|
| 746 | xassert(1 <= k && k <= m+n); |
---|
| 747 | #endif |
---|
| 748 | if (k <= m) |
---|
| 749 | { /* N[j] is k-th column of submatrix I */ |
---|
| 750 | /* find element in k-th row of N */ |
---|
| 751 | head = N_ptr[k]; |
---|
| 752 | for (pos = head; N_ind[pos] != j; pos++) /* nop */; |
---|
| 753 | /* and remove it from the row list */ |
---|
| 754 | tail = head + (--N_len[k]); |
---|
| 755 | #ifdef GLP_DEBUG |
---|
| 756 | xassert(pos <= tail); |
---|
| 757 | #endif |
---|
| 758 | N_ind[pos] = N_ind[tail]; |
---|
| 759 | N_val[pos] = N_val[tail]; |
---|
| 760 | } |
---|
| 761 | else |
---|
| 762 | { /* N[j] is (k-m)-th column of submatrix (-A) */ |
---|
| 763 | int *A_ptr = csa->A_ptr; |
---|
| 764 | int *A_ind = csa->A_ind; |
---|
| 765 | int i, beg, end, ptr; |
---|
| 766 | beg = A_ptr[k-m]; |
---|
| 767 | end = A_ptr[k-m+1]; |
---|
| 768 | for (ptr = beg; ptr < end; ptr++) |
---|
| 769 | { i = A_ind[ptr]; /* row number */ |
---|
| 770 | /* find element in i-th row of N */ |
---|
| 771 | head = N_ptr[i]; |
---|
| 772 | for (pos = head; N_ind[pos] != j; pos++) /* nop */; |
---|
| 773 | /* and remove it from the row list */ |
---|
| 774 | tail = head + (--N_len[i]); |
---|
| 775 | #ifdef GLP_DEBUG |
---|
| 776 | xassert(pos <= tail); |
---|
| 777 | #endif |
---|
| 778 | N_ind[pos] = N_ind[tail]; |
---|
| 779 | N_val[pos] = N_val[tail]; |
---|
| 780 | } |
---|
| 781 | } |
---|
| 782 | return; |
---|
| 783 | } |
---|
| 784 | |
---|
| 785 | /*********************************************************************** |
---|
| 786 | * build_N - build matrix N for current basis |
---|
| 787 | * |
---|
| 788 | * This routine builds matrix N for the current basis from columns |
---|
| 789 | * of the augmented constraint matrix (I|-A) corresponding to non-basic |
---|
| 790 | * non-fixed variables. */ |
---|
| 791 | |
---|
| 792 | static void build_N(struct csa *csa) |
---|
| 793 | { int m = csa->m; |
---|
| 794 | int n = csa->n; |
---|
| 795 | int *head = csa->head; |
---|
| 796 | char *stat = csa->stat; |
---|
| 797 | int *N_len = csa->N_len; |
---|
| 798 | int j, k; |
---|
| 799 | /* N := empty matrix */ |
---|
| 800 | memset(&N_len[1], 0, m * sizeof(int)); |
---|
| 801 | /* go through non-basic columns of matrix (I|-A) */ |
---|
| 802 | for (j = 1; j <= n; j++) |
---|
| 803 | { if (stat[j] != GLP_NS) |
---|
| 804 | { /* xN[j] is non-fixed; add j-th column to matrix N which is |
---|
| 805 | k-th column of matrix (I|-A) */ |
---|
| 806 | k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 807 | #ifdef GLP_DEBUG |
---|
| 808 | xassert(1 <= k && k <= m+n); |
---|
| 809 | #endif |
---|
| 810 | add_N_col(csa, j, k); |
---|
| 811 | } |
---|
| 812 | } |
---|
| 813 | return; |
---|
| 814 | } |
---|
| 815 | |
---|
| 816 | /*********************************************************************** |
---|
| 817 | * get_xN - determine current value of non-basic variable xN[j] |
---|
| 818 | * |
---|
| 819 | * This routine returns the current value of non-basic variable xN[j], |
---|
| 820 | * which is a value of its active bound. */ |
---|
| 821 | |
---|
| 822 | static double get_xN(struct csa *csa, int j) |
---|
| 823 | { int m = csa->m; |
---|
| 824 | #ifdef GLP_DEBUG |
---|
| 825 | int n = csa->n; |
---|
| 826 | #endif |
---|
| 827 | double *lb = csa->lb; |
---|
| 828 | double *ub = csa->ub; |
---|
| 829 | int *head = csa->head; |
---|
| 830 | char *stat = csa->stat; |
---|
| 831 | int k; |
---|
| 832 | double xN; |
---|
| 833 | #ifdef GLP_DEBUG |
---|
| 834 | xassert(1 <= j && j <= n); |
---|
| 835 | #endif |
---|
| 836 | k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 837 | #ifdef GLP_DEBUG |
---|
| 838 | xassert(1 <= k && k <= m+n); |
---|
| 839 | #endif |
---|
| 840 | switch (stat[j]) |
---|
| 841 | { case GLP_NL: |
---|
| 842 | /* x[k] is on its lower bound */ |
---|
| 843 | xN = lb[k]; break; |
---|
| 844 | case GLP_NU: |
---|
| 845 | /* x[k] is on its upper bound */ |
---|
| 846 | xN = ub[k]; break; |
---|
| 847 | case GLP_NF: |
---|
| 848 | /* x[k] is free non-basic variable */ |
---|
| 849 | xN = 0.0; break; |
---|
| 850 | case GLP_NS: |
---|
| 851 | /* x[k] is fixed non-basic variable */ |
---|
| 852 | xN = lb[k]; break; |
---|
| 853 | default: |
---|
| 854 | xassert(stat != stat); |
---|
| 855 | } |
---|
| 856 | return xN; |
---|
| 857 | } |
---|
| 858 | |
---|
| 859 | /*********************************************************************** |
---|
| 860 | * eval_beta - compute primal values of basic variables |
---|
| 861 | * |
---|
| 862 | * This routine computes current primal values of all basic variables: |
---|
| 863 | * |
---|
| 864 | * beta = - inv(B) * N * xN, |
---|
| 865 | * |
---|
| 866 | * where B is the current basis matrix, N is a matrix built of columns |
---|
| 867 | * of matrix (I|-A) corresponding to non-basic variables, and xN is the |
---|
| 868 | * vector of current values of non-basic variables. */ |
---|
| 869 | |
---|
| 870 | static void eval_beta(struct csa *csa, double beta[]) |
---|
| 871 | { int m = csa->m; |
---|
| 872 | int n = csa->n; |
---|
| 873 | int *A_ptr = csa->A_ptr; |
---|
| 874 | int *A_ind = csa->A_ind; |
---|
| 875 | double *A_val = csa->A_val; |
---|
| 876 | int *head = csa->head; |
---|
| 877 | double *h = csa->work2; |
---|
| 878 | int i, j, k, beg, end, ptr; |
---|
| 879 | double xN; |
---|
| 880 | /* compute the right-hand side vector: |
---|
| 881 | h := - N * xN = - N[1] * xN[1] - ... - N[n] * xN[n], |
---|
| 882 | where N[1], ..., N[n] are columns of matrix N */ |
---|
| 883 | for (i = 1; i <= m; i++) |
---|
| 884 | h[i] = 0.0; |
---|
| 885 | for (j = 1; j <= n; j++) |
---|
| 886 | { k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 887 | #ifdef GLP_DEBUG |
---|
| 888 | xassert(1 <= k && k <= m+n); |
---|
| 889 | #endif |
---|
| 890 | /* determine current value of xN[j] */ |
---|
| 891 | xN = get_xN(csa, j); |
---|
| 892 | if (xN == 0.0) continue; |
---|
| 893 | if (k <= m) |
---|
| 894 | { /* N[j] is k-th column of submatrix I */ |
---|
| 895 | h[k] -= xN; |
---|
| 896 | } |
---|
| 897 | else |
---|
| 898 | { /* N[j] is (k-m)-th column of submatrix (-A) */ |
---|
| 899 | beg = A_ptr[k-m]; |
---|
| 900 | end = A_ptr[k-m+1]; |
---|
| 901 | for (ptr = beg; ptr < end; ptr++) |
---|
| 902 | h[A_ind[ptr]] += xN * A_val[ptr]; |
---|
| 903 | } |
---|
| 904 | } |
---|
| 905 | /* solve system B * beta = h */ |
---|
| 906 | memcpy(&beta[1], &h[1], m * sizeof(double)); |
---|
| 907 | xassert(csa->valid); |
---|
| 908 | bfd_ftran(csa->bfd, beta); |
---|
| 909 | /* and refine the solution */ |
---|
| 910 | refine_ftran(csa, h, beta); |
---|
| 911 | return; |
---|
| 912 | } |
---|
| 913 | |
---|
| 914 | /*********************************************************************** |
---|
| 915 | * eval_pi - compute vector of simplex multipliers |
---|
| 916 | * |
---|
| 917 | * This routine computes the vector of current simplex multipliers: |
---|
| 918 | * |
---|
| 919 | * pi = inv(B') * cB, |
---|
| 920 | * |
---|
| 921 | * where B' is a matrix transposed to the current basis matrix, cB is |
---|
| 922 | * a subvector of objective coefficients at basic variables. */ |
---|
| 923 | |
---|
| 924 | static void eval_pi(struct csa *csa, double pi[]) |
---|
| 925 | { int m = csa->m; |
---|
| 926 | double *c = csa->coef; |
---|
| 927 | int *head = csa->head; |
---|
| 928 | double *cB = csa->work2; |
---|
| 929 | int i; |
---|
| 930 | /* construct the right-hand side vector cB */ |
---|
| 931 | for (i = 1; i <= m; i++) |
---|
| 932 | cB[i] = c[head[i]]; |
---|
| 933 | /* solve system B'* pi = cB */ |
---|
| 934 | memcpy(&pi[1], &cB[1], m * sizeof(double)); |
---|
| 935 | xassert(csa->valid); |
---|
| 936 | bfd_btran(csa->bfd, pi); |
---|
| 937 | /* and refine the solution */ |
---|
| 938 | refine_btran(csa, cB, pi); |
---|
| 939 | return; |
---|
| 940 | } |
---|
| 941 | |
---|
| 942 | /*********************************************************************** |
---|
| 943 | * eval_cost - compute reduced cost of non-basic variable xN[j] |
---|
| 944 | * |
---|
| 945 | * This routine computes the current reduced cost of non-basic variable |
---|
| 946 | * xN[j]: |
---|
| 947 | * |
---|
| 948 | * d[j] = cN[j] - N'[j] * pi, |
---|
| 949 | * |
---|
| 950 | * where cN[j] is the objective coefficient at variable xN[j], N[j] is |
---|
| 951 | * a column of the augmented constraint matrix (I|-A) corresponding to |
---|
| 952 | * xN[j], pi is the vector of simplex multipliers. */ |
---|
| 953 | |
---|
| 954 | static double eval_cost(struct csa *csa, double pi[], int j) |
---|
| 955 | { int m = csa->m; |
---|
| 956 | #ifdef GLP_DEBUG |
---|
| 957 | int n = csa->n; |
---|
| 958 | #endif |
---|
| 959 | double *coef = csa->coef; |
---|
| 960 | int *head = csa->head; |
---|
| 961 | int k; |
---|
| 962 | double dj; |
---|
| 963 | #ifdef GLP_DEBUG |
---|
| 964 | xassert(1 <= j && j <= n); |
---|
| 965 | #endif |
---|
| 966 | k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 967 | #ifdef GLP_DEBUG |
---|
| 968 | xassert(1 <= k && k <= m+n); |
---|
| 969 | #endif |
---|
| 970 | dj = coef[k]; |
---|
| 971 | if (k <= m) |
---|
| 972 | { /* N[j] is k-th column of submatrix I */ |
---|
| 973 | dj -= pi[k]; |
---|
| 974 | } |
---|
| 975 | else |
---|
| 976 | { /* N[j] is (k-m)-th column of submatrix (-A) */ |
---|
| 977 | int *A_ptr = csa->A_ptr; |
---|
| 978 | int *A_ind = csa->A_ind; |
---|
| 979 | double *A_val = csa->A_val; |
---|
| 980 | int beg, end, ptr; |
---|
| 981 | beg = A_ptr[k-m]; |
---|
| 982 | end = A_ptr[k-m+1]; |
---|
| 983 | for (ptr = beg; ptr < end; ptr++) |
---|
| 984 | dj += A_val[ptr] * pi[A_ind[ptr]]; |
---|
| 985 | } |
---|
| 986 | return dj; |
---|
| 987 | } |
---|
| 988 | |
---|
| 989 | /*********************************************************************** |
---|
| 990 | * eval_bbar - compute and store primal values of basic variables |
---|
| 991 | * |
---|
| 992 | * This routine computes primal values of all basic variables and then |
---|
| 993 | * stores them in the solution array. */ |
---|
| 994 | |
---|
| 995 | static void eval_bbar(struct csa *csa) |
---|
| 996 | { eval_beta(csa, csa->bbar); |
---|
| 997 | return; |
---|
| 998 | } |
---|
| 999 | |
---|
| 1000 | /*********************************************************************** |
---|
| 1001 | * eval_cbar - compute and store reduced costs of non-basic variables |
---|
| 1002 | * |
---|
| 1003 | * This routine computes reduced costs of all non-basic variables and |
---|
| 1004 | * then stores them in the solution array. */ |
---|
| 1005 | |
---|
| 1006 | static void eval_cbar(struct csa *csa) |
---|
| 1007 | { |
---|
| 1008 | #ifdef GLP_DEBUG |
---|
| 1009 | int m = csa->m; |
---|
| 1010 | #endif |
---|
| 1011 | int n = csa->n; |
---|
| 1012 | #ifdef GLP_DEBUG |
---|
| 1013 | int *head = csa->head; |
---|
| 1014 | #endif |
---|
| 1015 | double *cbar = csa->cbar; |
---|
| 1016 | double *pi = csa->work3; |
---|
| 1017 | int j; |
---|
| 1018 | #ifdef GLP_DEBUG |
---|
| 1019 | int k; |
---|
| 1020 | #endif |
---|
| 1021 | /* compute simplex multipliers */ |
---|
| 1022 | eval_pi(csa, pi); |
---|
| 1023 | /* compute and store reduced costs */ |
---|
| 1024 | for (j = 1; j <= n; j++) |
---|
| 1025 | { |
---|
| 1026 | #ifdef GLP_DEBUG |
---|
| 1027 | k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 1028 | xassert(1 <= k && k <= m+n); |
---|
| 1029 | #endif |
---|
| 1030 | cbar[j] = eval_cost(csa, pi, j); |
---|
| 1031 | } |
---|
| 1032 | return; |
---|
| 1033 | } |
---|
| 1034 | |
---|
| 1035 | /*********************************************************************** |
---|
| 1036 | * reset_refsp - reset the reference space |
---|
| 1037 | * |
---|
| 1038 | * This routine resets (redefines) the reference space used in the |
---|
| 1039 | * projected steepest edge pricing algorithm. */ |
---|
| 1040 | |
---|
| 1041 | static void reset_refsp(struct csa *csa) |
---|
| 1042 | { int m = csa->m; |
---|
| 1043 | int n = csa->n; |
---|
| 1044 | int *head = csa->head; |
---|
| 1045 | char *refsp = csa->refsp; |
---|
| 1046 | double *gamma = csa->gamma; |
---|
| 1047 | int j, k; |
---|
| 1048 | xassert(csa->refct == 0); |
---|
| 1049 | csa->refct = 1000; |
---|
| 1050 | memset(&refsp[1], 0, (m+n) * sizeof(char)); |
---|
| 1051 | for (j = 1; j <= n; j++) |
---|
| 1052 | { k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 1053 | refsp[k] = 1; |
---|
| 1054 | gamma[j] = 1.0; |
---|
| 1055 | } |
---|
| 1056 | return; |
---|
| 1057 | } |
---|
| 1058 | |
---|
| 1059 | /*********************************************************************** |
---|
| 1060 | * eval_gamma - compute steepest edge coefficient |
---|
| 1061 | * |
---|
| 1062 | * This routine computes the steepest edge coefficient for non-basic |
---|
| 1063 | * variable xN[j] using its direct definition: |
---|
| 1064 | * |
---|
| 1065 | * gamma[j] = delta[j] + sum alfa[i,j]^2, |
---|
| 1066 | * i in R |
---|
| 1067 | * |
---|
| 1068 | * where delta[j] = 1, if xN[j] is in the current reference space, |
---|
| 1069 | * and 0 otherwise; R is a set of basic variables xB[i], which are in |
---|
| 1070 | * the current reference space; alfa[i,j] are elements of the current |
---|
| 1071 | * simplex table. |
---|
| 1072 | * |
---|
| 1073 | * NOTE: The routine is intended only for debugginig purposes. */ |
---|
| 1074 | |
---|
| 1075 | static double eval_gamma(struct csa *csa, int j) |
---|
| 1076 | { int m = csa->m; |
---|
| 1077 | #ifdef GLP_DEBUG |
---|
| 1078 | int n = csa->n; |
---|
| 1079 | #endif |
---|
| 1080 | int *head = csa->head; |
---|
| 1081 | char *refsp = csa->refsp; |
---|
| 1082 | double *alfa = csa->work3; |
---|
| 1083 | double *h = csa->work3; |
---|
| 1084 | int i, k; |
---|
| 1085 | double gamma; |
---|
| 1086 | #ifdef GLP_DEBUG |
---|
| 1087 | xassert(1 <= j && j <= n); |
---|
| 1088 | #endif |
---|
| 1089 | k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 1090 | #ifdef GLP_DEBUG |
---|
| 1091 | xassert(1 <= k && k <= m+n); |
---|
| 1092 | #endif |
---|
| 1093 | /* construct the right-hand side vector h = - N[j] */ |
---|
| 1094 | for (i = 1; i <= m; i++) |
---|
| 1095 | h[i] = 0.0; |
---|
| 1096 | if (k <= m) |
---|
| 1097 | { /* N[j] is k-th column of submatrix I */ |
---|
| 1098 | h[k] = -1.0; |
---|
| 1099 | } |
---|
| 1100 | else |
---|
| 1101 | { /* N[j] is (k-m)-th column of submatrix (-A) */ |
---|
| 1102 | int *A_ptr = csa->A_ptr; |
---|
| 1103 | int *A_ind = csa->A_ind; |
---|
| 1104 | double *A_val = csa->A_val; |
---|
| 1105 | int beg, end, ptr; |
---|
| 1106 | beg = A_ptr[k-m]; |
---|
| 1107 | end = A_ptr[k-m+1]; |
---|
| 1108 | for (ptr = beg; ptr < end; ptr++) |
---|
| 1109 | h[A_ind[ptr]] = A_val[ptr]; |
---|
| 1110 | } |
---|
| 1111 | /* solve system B * alfa = h */ |
---|
| 1112 | xassert(csa->valid); |
---|
| 1113 | bfd_ftran(csa->bfd, alfa); |
---|
| 1114 | /* compute gamma */ |
---|
| 1115 | gamma = (refsp[k] ? 1.0 : 0.0); |
---|
| 1116 | for (i = 1; i <= m; i++) |
---|
| 1117 | { k = head[i]; |
---|
| 1118 | #ifdef GLP_DEBUG |
---|
| 1119 | xassert(1 <= k && k <= m+n); |
---|
| 1120 | #endif |
---|
| 1121 | if (refsp[k]) gamma += alfa[i] * alfa[i]; |
---|
| 1122 | } |
---|
| 1123 | return gamma; |
---|
| 1124 | } |
---|
| 1125 | |
---|
| 1126 | /*********************************************************************** |
---|
| 1127 | * chuzc - choose non-basic variable (column of the simplex table) |
---|
| 1128 | * |
---|
| 1129 | * This routine chooses non-basic variable xN[q], which has largest |
---|
| 1130 | * weighted reduced cost: |
---|
| 1131 | * |
---|
| 1132 | * |d[q]| / sqrt(gamma[q]) = max |d[j]| / sqrt(gamma[j]), |
---|
| 1133 | * j in J |
---|
| 1134 | * |
---|
| 1135 | * where J is a subset of eligible non-basic variables xN[j], d[j] is |
---|
| 1136 | * reduced cost of xN[j], gamma[j] is the steepest edge coefficient. |
---|
| 1137 | * |
---|
| 1138 | * The working objective function is always minimized, so the sign of |
---|
| 1139 | * d[q] determines direction, in which xN[q] has to change: |
---|
| 1140 | * |
---|
| 1141 | * if d[q] < 0, xN[q] has to increase; |
---|
| 1142 | * |
---|
| 1143 | * if d[q] > 0, xN[q] has to decrease. |
---|
| 1144 | * |
---|
| 1145 | * If |d[j]| <= tol_dj, where tol_dj is a specified tolerance, xN[j] |
---|
| 1146 | * is not included in J and therefore ignored. (It is assumed that the |
---|
| 1147 | * working objective row is appropriately scaled, i.e. max|c[k]| = 1.) |
---|
| 1148 | * |
---|
| 1149 | * If J is empty and no variable has been chosen, q is set to 0. */ |
---|
| 1150 | |
---|
| 1151 | static void chuzc(struct csa *csa, double tol_dj) |
---|
| 1152 | { int n = csa->n; |
---|
| 1153 | char *stat = csa->stat; |
---|
| 1154 | double *cbar = csa->cbar; |
---|
| 1155 | double *gamma = csa->gamma; |
---|
| 1156 | int j, q; |
---|
| 1157 | double dj, best, temp; |
---|
| 1158 | /* nothing is chosen so far */ |
---|
| 1159 | q = 0, best = 0.0; |
---|
| 1160 | /* look through the list of non-basic variables */ |
---|
| 1161 | for (j = 1; j <= n; j++) |
---|
| 1162 | { dj = cbar[j]; |
---|
| 1163 | switch (stat[j]) |
---|
| 1164 | { case GLP_NL: |
---|
| 1165 | /* xN[j] can increase */ |
---|
| 1166 | if (dj >= - tol_dj) continue; |
---|
| 1167 | break; |
---|
| 1168 | case GLP_NU: |
---|
| 1169 | /* xN[j] can decrease */ |
---|
| 1170 | if (dj <= + tol_dj) continue; |
---|
| 1171 | break; |
---|
| 1172 | case GLP_NF: |
---|
| 1173 | /* xN[j] can change in any direction */ |
---|
| 1174 | if (- tol_dj <= dj && dj <= + tol_dj) continue; |
---|
| 1175 | break; |
---|
| 1176 | case GLP_NS: |
---|
| 1177 | /* xN[j] cannot change at all */ |
---|
| 1178 | continue; |
---|
| 1179 | default: |
---|
| 1180 | xassert(stat != stat); |
---|
| 1181 | } |
---|
| 1182 | /* xN[j] is eligible non-basic variable; choose one which has |
---|
| 1183 | largest weighted reduced cost */ |
---|
| 1184 | #ifdef GLP_DEBUG |
---|
| 1185 | xassert(gamma[j] > 0.0); |
---|
| 1186 | #endif |
---|
| 1187 | temp = (dj * dj) / gamma[j]; |
---|
| 1188 | if (best < temp) |
---|
| 1189 | q = j, best = temp; |
---|
| 1190 | } |
---|
| 1191 | /* store the index of non-basic variable xN[q] chosen */ |
---|
| 1192 | csa->q = q; |
---|
| 1193 | return; |
---|
| 1194 | } |
---|
| 1195 | |
---|
| 1196 | /*********************************************************************** |
---|
| 1197 | * eval_tcol - compute pivot column of the simplex table |
---|
| 1198 | * |
---|
| 1199 | * This routine computes the pivot column of the simplex table, which |
---|
| 1200 | * corresponds to non-basic variable xN[q] chosen. |
---|
| 1201 | * |
---|
| 1202 | * The pivot column is the following vector: |
---|
| 1203 | * |
---|
| 1204 | * tcol = T * e[q] = - inv(B) * N * e[q] = - inv(B) * N[q], |
---|
| 1205 | * |
---|
| 1206 | * where B is the current basis matrix, N[q] is a column of the matrix |
---|
| 1207 | * (I|-A) corresponding to variable xN[q]. */ |
---|
| 1208 | |
---|
| 1209 | static void eval_tcol(struct csa *csa) |
---|
| 1210 | { int m = csa->m; |
---|
| 1211 | #ifdef GLP_DEBUG |
---|
| 1212 | int n = csa->n; |
---|
| 1213 | #endif |
---|
| 1214 | int *head = csa->head; |
---|
| 1215 | int q = csa->q; |
---|
| 1216 | int *tcol_ind = csa->tcol_ind; |
---|
| 1217 | double *tcol_vec = csa->tcol_vec; |
---|
| 1218 | double *h = csa->tcol_vec; |
---|
| 1219 | int i, k, nnz; |
---|
| 1220 | #ifdef GLP_DEBUG |
---|
| 1221 | xassert(1 <= q && q <= n); |
---|
| 1222 | #endif |
---|
| 1223 | k = head[m+q]; /* x[k] = xN[q] */ |
---|
| 1224 | #ifdef GLP_DEBUG |
---|
| 1225 | xassert(1 <= k && k <= m+n); |
---|
| 1226 | #endif |
---|
| 1227 | /* construct the right-hand side vector h = - N[q] */ |
---|
| 1228 | for (i = 1; i <= m; i++) |
---|
| 1229 | h[i] = 0.0; |
---|
| 1230 | if (k <= m) |
---|
| 1231 | { /* N[q] is k-th column of submatrix I */ |
---|
| 1232 | h[k] = -1.0; |
---|
| 1233 | } |
---|
| 1234 | else |
---|
| 1235 | { /* N[q] is (k-m)-th column of submatrix (-A) */ |
---|
| 1236 | int *A_ptr = csa->A_ptr; |
---|
| 1237 | int *A_ind = csa->A_ind; |
---|
| 1238 | double *A_val = csa->A_val; |
---|
| 1239 | int beg, end, ptr; |
---|
| 1240 | beg = A_ptr[k-m]; |
---|
| 1241 | end = A_ptr[k-m+1]; |
---|
| 1242 | for (ptr = beg; ptr < end; ptr++) |
---|
| 1243 | h[A_ind[ptr]] = A_val[ptr]; |
---|
| 1244 | } |
---|
| 1245 | /* solve system B * tcol = h */ |
---|
| 1246 | xassert(csa->valid); |
---|
| 1247 | bfd_ftran(csa->bfd, tcol_vec); |
---|
| 1248 | /* construct sparse pattern of the pivot column */ |
---|
| 1249 | nnz = 0; |
---|
| 1250 | for (i = 1; i <= m; i++) |
---|
| 1251 | { if (tcol_vec[i] != 0.0) |
---|
| 1252 | tcol_ind[++nnz] = i; |
---|
| 1253 | } |
---|
| 1254 | csa->tcol_nnz = nnz; |
---|
| 1255 | return; |
---|
| 1256 | } |
---|
| 1257 | |
---|
| 1258 | /*********************************************************************** |
---|
| 1259 | * refine_tcol - refine pivot column of the simplex table |
---|
| 1260 | * |
---|
| 1261 | * This routine refines the pivot column of the simplex table assuming |
---|
| 1262 | * that it was previously computed by the routine eval_tcol. */ |
---|
| 1263 | |
---|
| 1264 | static void refine_tcol(struct csa *csa) |
---|
| 1265 | { int m = csa->m; |
---|
| 1266 | #ifdef GLP_DEBUG |
---|
| 1267 | int n = csa->n; |
---|
| 1268 | #endif |
---|
| 1269 | int *head = csa->head; |
---|
| 1270 | int q = csa->q; |
---|
| 1271 | int *tcol_ind = csa->tcol_ind; |
---|
| 1272 | double *tcol_vec = csa->tcol_vec; |
---|
| 1273 | double *h = csa->work3; |
---|
| 1274 | int i, k, nnz; |
---|
| 1275 | #ifdef GLP_DEBUG |
---|
| 1276 | xassert(1 <= q && q <= n); |
---|
| 1277 | #endif |
---|
| 1278 | k = head[m+q]; /* x[k] = xN[q] */ |
---|
| 1279 | #ifdef GLP_DEBUG |
---|
| 1280 | xassert(1 <= k && k <= m+n); |
---|
| 1281 | #endif |
---|
| 1282 | /* construct the right-hand side vector h = - N[q] */ |
---|
| 1283 | for (i = 1; i <= m; i++) |
---|
| 1284 | h[i] = 0.0; |
---|
| 1285 | if (k <= m) |
---|
| 1286 | { /* N[q] is k-th column of submatrix I */ |
---|
| 1287 | h[k] = -1.0; |
---|
| 1288 | } |
---|
| 1289 | else |
---|
| 1290 | { /* N[q] is (k-m)-th column of submatrix (-A) */ |
---|
| 1291 | int *A_ptr = csa->A_ptr; |
---|
| 1292 | int *A_ind = csa->A_ind; |
---|
| 1293 | double *A_val = csa->A_val; |
---|
| 1294 | int beg, end, ptr; |
---|
| 1295 | beg = A_ptr[k-m]; |
---|
| 1296 | end = A_ptr[k-m+1]; |
---|
| 1297 | for (ptr = beg; ptr < end; ptr++) |
---|
| 1298 | h[A_ind[ptr]] = A_val[ptr]; |
---|
| 1299 | } |
---|
| 1300 | /* refine solution of B * tcol = h */ |
---|
| 1301 | refine_ftran(csa, h, tcol_vec); |
---|
| 1302 | /* construct sparse pattern of the pivot column */ |
---|
| 1303 | nnz = 0; |
---|
| 1304 | for (i = 1; i <= m; i++) |
---|
| 1305 | { if (tcol_vec[i] != 0.0) |
---|
| 1306 | tcol_ind[++nnz] = i; |
---|
| 1307 | } |
---|
| 1308 | csa->tcol_nnz = nnz; |
---|
| 1309 | return; |
---|
| 1310 | } |
---|
| 1311 | |
---|
| 1312 | /*********************************************************************** |
---|
| 1313 | * sort_tcol - sort pivot column of the simplex table |
---|
| 1314 | * |
---|
| 1315 | * This routine reorders the list of non-zero elements of the pivot |
---|
| 1316 | * column to put significant elements, whose magnitude is not less than |
---|
| 1317 | * a specified tolerance, in front of the list, and stores the number |
---|
| 1318 | * of significant elements in tcol_num. */ |
---|
| 1319 | |
---|
| 1320 | static void sort_tcol(struct csa *csa, double tol_piv) |
---|
| 1321 | { |
---|
| 1322 | #ifdef GLP_DEBUG |
---|
| 1323 | int m = csa->m; |
---|
| 1324 | #endif |
---|
| 1325 | int nnz = csa->tcol_nnz; |
---|
| 1326 | int *tcol_ind = csa->tcol_ind; |
---|
| 1327 | double *tcol_vec = csa->tcol_vec; |
---|
| 1328 | int i, num, pos; |
---|
| 1329 | double big, eps, temp; |
---|
| 1330 | /* compute infinity (maximum) norm of the column */ |
---|
| 1331 | big = 0.0; |
---|
| 1332 | for (pos = 1; pos <= nnz; pos++) |
---|
| 1333 | { |
---|
| 1334 | #ifdef GLP_DEBUG |
---|
| 1335 | i = tcol_ind[pos]; |
---|
| 1336 | xassert(1 <= i && i <= m); |
---|
| 1337 | #endif |
---|
| 1338 | temp = fabs(tcol_vec[tcol_ind[pos]]); |
---|
| 1339 | if (big < temp) big = temp; |
---|
| 1340 | } |
---|
| 1341 | csa->tcol_max = big; |
---|
| 1342 | /* determine absolute pivot tolerance */ |
---|
| 1343 | eps = tol_piv * (1.0 + 0.01 * big); |
---|
| 1344 | /* move significant column components to front of the list */ |
---|
| 1345 | for (num = 0; num < nnz; ) |
---|
| 1346 | { i = tcol_ind[nnz]; |
---|
| 1347 | if (fabs(tcol_vec[i]) < eps) |
---|
| 1348 | nnz--; |
---|
| 1349 | else |
---|
| 1350 | { num++; |
---|
| 1351 | tcol_ind[nnz] = tcol_ind[num]; |
---|
| 1352 | tcol_ind[num] = i; |
---|
| 1353 | } |
---|
| 1354 | } |
---|
| 1355 | csa->tcol_num = num; |
---|
| 1356 | return; |
---|
| 1357 | } |
---|
| 1358 | |
---|
| 1359 | /*********************************************************************** |
---|
| 1360 | * chuzr - choose basic variable (row of the simplex table) |
---|
| 1361 | * |
---|
| 1362 | * This routine chooses basic variable xB[p], which reaches its bound |
---|
| 1363 | * first on changing non-basic variable xN[q] in valid direction. |
---|
| 1364 | * |
---|
| 1365 | * The parameter rtol is a relative tolerance used to relax bounds of |
---|
| 1366 | * basic variables. If rtol = 0, the routine implements the standard |
---|
| 1367 | * ratio test. Otherwise, if rtol > 0, the routine implements Harris' |
---|
| 1368 | * two-pass ratio test. In the latter case rtol should be about three |
---|
| 1369 | * times less than a tolerance used to check primal feasibility. */ |
---|
| 1370 | |
---|
| 1371 | static void chuzr(struct csa *csa, double rtol) |
---|
| 1372 | { int m = csa->m; |
---|
| 1373 | #ifdef GLP_DEBUG |
---|
| 1374 | int n = csa->n; |
---|
| 1375 | #endif |
---|
| 1376 | char *type = csa->type; |
---|
| 1377 | double *lb = csa->lb; |
---|
| 1378 | double *ub = csa->ub; |
---|
| 1379 | double *coef = csa->coef; |
---|
| 1380 | int *head = csa->head; |
---|
| 1381 | int phase = csa->phase; |
---|
| 1382 | double *bbar = csa->bbar; |
---|
| 1383 | double *cbar = csa->cbar; |
---|
| 1384 | int q = csa->q; |
---|
| 1385 | int *tcol_ind = csa->tcol_ind; |
---|
| 1386 | double *tcol_vec = csa->tcol_vec; |
---|
| 1387 | int tcol_num = csa->tcol_num; |
---|
| 1388 | int i, i_stat, k, p, p_stat, pos; |
---|
| 1389 | double alfa, big, delta, s, t, teta, tmax; |
---|
| 1390 | #ifdef GLP_DEBUG |
---|
| 1391 | xassert(1 <= q && q <= n); |
---|
| 1392 | #endif |
---|
| 1393 | /* s := - sign(d[q]), where d[q] is reduced cost of xN[q] */ |
---|
| 1394 | #ifdef GLP_DEBUG |
---|
| 1395 | xassert(cbar[q] != 0.0); |
---|
| 1396 | #endif |
---|
| 1397 | s = (cbar[q] > 0.0 ? -1.0 : +1.0); |
---|
| 1398 | /*** FIRST PASS ***/ |
---|
| 1399 | k = head[m+q]; /* x[k] = xN[q] */ |
---|
| 1400 | #ifdef GLP_DEBUG |
---|
| 1401 | xassert(1 <= k && k <= m+n); |
---|
| 1402 | #endif |
---|
| 1403 | if (type[k] == GLP_DB) |
---|
| 1404 | { /* xN[q] has both lower and upper bounds */ |
---|
| 1405 | p = -1, p_stat = 0, teta = ub[k] - lb[k], big = 1.0; |
---|
| 1406 | } |
---|
| 1407 | else |
---|
| 1408 | { /* xN[q] has no opposite bound */ |
---|
| 1409 | p = 0, p_stat = 0, teta = DBL_MAX, big = 0.0; |
---|
| 1410 | } |
---|
| 1411 | /* walk through significant elements of the pivot column */ |
---|
| 1412 | for (pos = 1; pos <= tcol_num; pos++) |
---|
| 1413 | { i = tcol_ind[pos]; |
---|
| 1414 | #ifdef GLP_DEBUG |
---|
| 1415 | xassert(1 <= i && i <= m); |
---|
| 1416 | #endif |
---|
| 1417 | k = head[i]; /* x[k] = xB[i] */ |
---|
| 1418 | #ifdef GLP_DEBUG |
---|
| 1419 | xassert(1 <= k && k <= m+n); |
---|
| 1420 | #endif |
---|
| 1421 | alfa = s * tcol_vec[i]; |
---|
| 1422 | #ifdef GLP_DEBUG |
---|
| 1423 | xassert(alfa != 0.0); |
---|
| 1424 | #endif |
---|
| 1425 | /* xB[i] = ... + alfa * xN[q] + ..., and due to s we need to |
---|
| 1426 | consider the only case when xN[q] is increasing */ |
---|
| 1427 | if (alfa > 0.0) |
---|
| 1428 | { /* xB[i] is increasing */ |
---|
| 1429 | if (phase == 1 && coef[k] < 0.0) |
---|
| 1430 | { /* xB[i] violates its lower bound, which plays the role |
---|
| 1431 | of an upper bound on phase I */ |
---|
| 1432 | delta = rtol * (1.0 + kappa * fabs(lb[k])); |
---|
| 1433 | t = ((lb[k] + delta) - bbar[i]) / alfa; |
---|
| 1434 | i_stat = GLP_NL; |
---|
| 1435 | } |
---|
| 1436 | else if (phase == 1 && coef[k] > 0.0) |
---|
| 1437 | { /* xB[i] violates its upper bound, which plays the role |
---|
| 1438 | of an lower bound on phase I */ |
---|
| 1439 | continue; |
---|
| 1440 | } |
---|
| 1441 | else if (type[k] == GLP_UP || type[k] == GLP_DB || |
---|
| 1442 | type[k] == GLP_FX) |
---|
| 1443 | { /* xB[i] is within its bounds and has an upper bound */ |
---|
| 1444 | delta = rtol * (1.0 + kappa * fabs(ub[k])); |
---|
| 1445 | t = ((ub[k] + delta) - bbar[i]) / alfa; |
---|
| 1446 | i_stat = GLP_NU; |
---|
| 1447 | } |
---|
| 1448 | else |
---|
| 1449 | { /* xB[i] is within its bounds and has no upper bound */ |
---|
| 1450 | continue; |
---|
| 1451 | } |
---|
| 1452 | } |
---|
| 1453 | else |
---|
| 1454 | { /* xB[i] is decreasing */ |
---|
| 1455 | if (phase == 1 && coef[k] > 0.0) |
---|
| 1456 | { /* xB[i] violates its upper bound, which plays the role |
---|
| 1457 | of an lower bound on phase I */ |
---|
| 1458 | delta = rtol * (1.0 + kappa * fabs(ub[k])); |
---|
| 1459 | t = ((ub[k] - delta) - bbar[i]) / alfa; |
---|
| 1460 | i_stat = GLP_NU; |
---|
| 1461 | } |
---|
| 1462 | else if (phase == 1 && coef[k] < 0.0) |
---|
| 1463 | { /* xB[i] violates its lower bound, which plays the role |
---|
| 1464 | of an upper bound on phase I */ |
---|
| 1465 | continue; |
---|
| 1466 | } |
---|
| 1467 | else if (type[k] == GLP_LO || type[k] == GLP_DB || |
---|
| 1468 | type[k] == GLP_FX) |
---|
| 1469 | { /* xB[i] is within its bounds and has an lower bound */ |
---|
| 1470 | delta = rtol * (1.0 + kappa * fabs(lb[k])); |
---|
| 1471 | t = ((lb[k] - delta) - bbar[i]) / alfa; |
---|
| 1472 | i_stat = GLP_NL; |
---|
| 1473 | } |
---|
| 1474 | else |
---|
| 1475 | { /* xB[i] is within its bounds and has no lower bound */ |
---|
| 1476 | continue; |
---|
| 1477 | } |
---|
| 1478 | } |
---|
| 1479 | /* t is a change of xN[q], on which xB[i] reaches its bound |
---|
| 1480 | (possibly relaxed); since the basic solution is assumed to |
---|
| 1481 | be primal feasible (or pseudo feasible on phase I), t has |
---|
| 1482 | to be non-negative by definition; however, it may happen |
---|
| 1483 | that xB[i] slightly (i.e. within a tolerance) violates its |
---|
| 1484 | bound, that leads to negative t; in the latter case, if |
---|
| 1485 | xB[i] is chosen, negative t means that xN[q] changes in |
---|
| 1486 | wrong direction; if pivot alfa[i,q] is close to zero, even |
---|
| 1487 | small bound violation of xB[i] may lead to a large change |
---|
| 1488 | of xN[q] in wrong direction; let, for example, xB[i] >= 0 |
---|
| 1489 | and in the current basis its value be -5e-9; let also xN[q] |
---|
| 1490 | be on its zero bound and should increase; from the ratio |
---|
| 1491 | test rule it follows that the pivot alfa[i,q] < 0; however, |
---|
| 1492 | if alfa[i,q] is, say, -1e-9, the change of xN[q] in wrong |
---|
| 1493 | direction is 5e-9 / (-1e-9) = -5, and using it for updating |
---|
| 1494 | values of other basic variables will give absolutely wrong |
---|
| 1495 | results; therefore, if t is negative, we should replace it |
---|
| 1496 | by exact zero assuming that xB[i] is exactly on its bound, |
---|
| 1497 | and the violation appears due to round-off errors */ |
---|
| 1498 | if (t < 0.0) t = 0.0; |
---|
| 1499 | /* apply minimal ratio test */ |
---|
| 1500 | if (teta > t || teta == t && big < fabs(alfa)) |
---|
| 1501 | p = i, p_stat = i_stat, teta = t, big = fabs(alfa); |
---|
| 1502 | } |
---|
| 1503 | /* the second pass is skipped in the following cases: */ |
---|
| 1504 | /* if the standard ratio test is used */ |
---|
| 1505 | if (rtol == 0.0) goto done; |
---|
| 1506 | /* if xN[q] reaches its opposite bound or if no basic variable |
---|
| 1507 | has been chosen on the first pass */ |
---|
| 1508 | if (p <= 0) goto done; |
---|
| 1509 | /* if xB[p] is a blocking variable, i.e. if it prevents xN[q] |
---|
| 1510 | from any change */ |
---|
| 1511 | if (teta == 0.0) goto done; |
---|
| 1512 | /*** SECOND PASS ***/ |
---|
| 1513 | /* here tmax is a maximal change of xN[q], on which the solution |
---|
| 1514 | remains primal feasible (or pseudo feasible on phase I) within |
---|
| 1515 | a tolerance */ |
---|
| 1516 | #if 0 |
---|
| 1517 | tmax = (1.0 + 10.0 * DBL_EPSILON) * teta; |
---|
| 1518 | #else |
---|
| 1519 | tmax = teta; |
---|
| 1520 | #endif |
---|
| 1521 | /* nothing is chosen so far */ |
---|
| 1522 | p = 0, p_stat = 0, teta = DBL_MAX, big = 0.0; |
---|
| 1523 | /* walk through significant elements of the pivot column */ |
---|
| 1524 | for (pos = 1; pos <= tcol_num; pos++) |
---|
| 1525 | { i = tcol_ind[pos]; |
---|
| 1526 | #ifdef GLP_DEBUG |
---|
| 1527 | xassert(1 <= i && i <= m); |
---|
| 1528 | #endif |
---|
| 1529 | k = head[i]; /* x[k] = xB[i] */ |
---|
| 1530 | #ifdef GLP_DEBUG |
---|
| 1531 | xassert(1 <= k && k <= m+n); |
---|
| 1532 | #endif |
---|
| 1533 | alfa = s * tcol_vec[i]; |
---|
| 1534 | #ifdef GLP_DEBUG |
---|
| 1535 | xassert(alfa != 0.0); |
---|
| 1536 | #endif |
---|
| 1537 | /* xB[i] = ... + alfa * xN[q] + ..., and due to s we need to |
---|
| 1538 | consider the only case when xN[q] is increasing */ |
---|
| 1539 | if (alfa > 0.0) |
---|
| 1540 | { /* xB[i] is increasing */ |
---|
| 1541 | if (phase == 1 && coef[k] < 0.0) |
---|
| 1542 | { /* xB[i] violates its lower bound, which plays the role |
---|
| 1543 | of an upper bound on phase I */ |
---|
| 1544 | t = (lb[k] - bbar[i]) / alfa; |
---|
| 1545 | i_stat = GLP_NL; |
---|
| 1546 | } |
---|
| 1547 | else if (phase == 1 && coef[k] > 0.0) |
---|
| 1548 | { /* xB[i] violates its upper bound, which plays the role |
---|
| 1549 | of an lower bound on phase I */ |
---|
| 1550 | continue; |
---|
| 1551 | } |
---|
| 1552 | else if (type[k] == GLP_UP || type[k] == GLP_DB || |
---|
| 1553 | type[k] == GLP_FX) |
---|
| 1554 | { /* xB[i] is within its bounds and has an upper bound */ |
---|
| 1555 | t = (ub[k] - bbar[i]) / alfa; |
---|
| 1556 | i_stat = GLP_NU; |
---|
| 1557 | } |
---|
| 1558 | else |
---|
| 1559 | { /* xB[i] is within its bounds and has no upper bound */ |
---|
| 1560 | continue; |
---|
| 1561 | } |
---|
| 1562 | } |
---|
| 1563 | else |
---|
| 1564 | { /* xB[i] is decreasing */ |
---|
| 1565 | if (phase == 1 && coef[k] > 0.0) |
---|
| 1566 | { /* xB[i] violates its upper bound, which plays the role |
---|
| 1567 | of an lower bound on phase I */ |
---|
| 1568 | t = (ub[k] - bbar[i]) / alfa; |
---|
| 1569 | i_stat = GLP_NU; |
---|
| 1570 | } |
---|
| 1571 | else if (phase == 1 && coef[k] < 0.0) |
---|
| 1572 | { /* xB[i] violates its lower bound, which plays the role |
---|
| 1573 | of an upper bound on phase I */ |
---|
| 1574 | continue; |
---|
| 1575 | } |
---|
| 1576 | else if (type[k] == GLP_LO || type[k] == GLP_DB || |
---|
| 1577 | type[k] == GLP_FX) |
---|
| 1578 | { /* xB[i] is within its bounds and has an lower bound */ |
---|
| 1579 | t = (lb[k] - bbar[i]) / alfa; |
---|
| 1580 | i_stat = GLP_NL; |
---|
| 1581 | } |
---|
| 1582 | else |
---|
| 1583 | { /* xB[i] is within its bounds and has no lower bound */ |
---|
| 1584 | continue; |
---|
| 1585 | } |
---|
| 1586 | } |
---|
| 1587 | /* (see comments for the first pass) */ |
---|
| 1588 | if (t < 0.0) t = 0.0; |
---|
| 1589 | /* t is a change of xN[q], on which xB[i] reaches its bound; |
---|
| 1590 | if t <= tmax, all basic variables can violate their bounds |
---|
| 1591 | only within relaxation tolerance delta; we can use this |
---|
| 1592 | freedom and choose basic variable having largest influence |
---|
| 1593 | coefficient to avoid possible numeric instability */ |
---|
| 1594 | if (t <= tmax && big < fabs(alfa)) |
---|
| 1595 | p = i, p_stat = i_stat, teta = t, big = fabs(alfa); |
---|
| 1596 | } |
---|
| 1597 | /* something must be chosen on the second pass */ |
---|
| 1598 | xassert(p != 0); |
---|
| 1599 | done: /* store the index and status of basic variable xB[p] chosen */ |
---|
| 1600 | csa->p = p; |
---|
| 1601 | if (p > 0 && type[head[p]] == GLP_FX) |
---|
| 1602 | csa->p_stat = GLP_NS; |
---|
| 1603 | else |
---|
| 1604 | csa->p_stat = p_stat; |
---|
| 1605 | /* store corresponding change of non-basic variable xN[q] */ |
---|
| 1606 | #ifdef GLP_DEBUG |
---|
| 1607 | xassert(teta >= 0.0); |
---|
| 1608 | #endif |
---|
| 1609 | csa->teta = s * teta; |
---|
| 1610 | return; |
---|
| 1611 | } |
---|
| 1612 | |
---|
| 1613 | /*********************************************************************** |
---|
| 1614 | * eval_rho - compute pivot row of the inverse |
---|
| 1615 | * |
---|
| 1616 | * This routine computes the pivot (p-th) row of the inverse inv(B), |
---|
| 1617 | * which corresponds to basic variable xB[p] chosen: |
---|
| 1618 | * |
---|
| 1619 | * rho = inv(B') * e[p], |
---|
| 1620 | * |
---|
| 1621 | * where B' is a matrix transposed to the current basis matrix, e[p] |
---|
| 1622 | * is unity vector. */ |
---|
| 1623 | |
---|
| 1624 | static void eval_rho(struct csa *csa, double rho[]) |
---|
| 1625 | { int m = csa->m; |
---|
| 1626 | int p = csa->p; |
---|
| 1627 | double *e = rho; |
---|
| 1628 | int i; |
---|
| 1629 | #ifdef GLP_DEBUG |
---|
| 1630 | xassert(1 <= p && p <= m); |
---|
| 1631 | #endif |
---|
| 1632 | /* construct the right-hand side vector e[p] */ |
---|
| 1633 | for (i = 1; i <= m; i++) |
---|
| 1634 | e[i] = 0.0; |
---|
| 1635 | e[p] = 1.0; |
---|
| 1636 | /* solve system B'* rho = e[p] */ |
---|
| 1637 | xassert(csa->valid); |
---|
| 1638 | bfd_btran(csa->bfd, rho); |
---|
| 1639 | return; |
---|
| 1640 | } |
---|
| 1641 | |
---|
| 1642 | /*********************************************************************** |
---|
| 1643 | * refine_rho - refine pivot row of the inverse |
---|
| 1644 | * |
---|
| 1645 | * This routine refines the pivot row of the inverse inv(B) assuming |
---|
| 1646 | * that it was previously computed by the routine eval_rho. */ |
---|
| 1647 | |
---|
| 1648 | static void refine_rho(struct csa *csa, double rho[]) |
---|
| 1649 | { int m = csa->m; |
---|
| 1650 | int p = csa->p; |
---|
| 1651 | double *e = csa->work3; |
---|
| 1652 | int i; |
---|
| 1653 | #ifdef GLP_DEBUG |
---|
| 1654 | xassert(1 <= p && p <= m); |
---|
| 1655 | #endif |
---|
| 1656 | /* construct the right-hand side vector e[p] */ |
---|
| 1657 | for (i = 1; i <= m; i++) |
---|
| 1658 | e[i] = 0.0; |
---|
| 1659 | e[p] = 1.0; |
---|
| 1660 | /* refine solution of B'* rho = e[p] */ |
---|
| 1661 | refine_btran(csa, e, rho); |
---|
| 1662 | return; |
---|
| 1663 | } |
---|
| 1664 | |
---|
| 1665 | /*********************************************************************** |
---|
| 1666 | * eval_trow - compute pivot row of the simplex table |
---|
| 1667 | * |
---|
| 1668 | * This routine computes the pivot row of the simplex table, which |
---|
| 1669 | * corresponds to basic variable xB[p] chosen. |
---|
| 1670 | * |
---|
| 1671 | * The pivot row is the following vector: |
---|
| 1672 | * |
---|
| 1673 | * trow = T'* e[p] = - N'* inv(B') * e[p] = - N' * rho, |
---|
| 1674 | * |
---|
| 1675 | * where rho is the pivot row of the inverse inv(B) previously computed |
---|
| 1676 | * by the routine eval_rho. |
---|
| 1677 | * |
---|
| 1678 | * Note that elements of the pivot row corresponding to fixed non-basic |
---|
| 1679 | * variables are not computed. */ |
---|
| 1680 | |
---|
| 1681 | static void eval_trow(struct csa *csa, double rho[]) |
---|
| 1682 | { int m = csa->m; |
---|
| 1683 | int n = csa->n; |
---|
| 1684 | #ifdef GLP_DEBUG |
---|
| 1685 | char *stat = csa->stat; |
---|
| 1686 | #endif |
---|
| 1687 | int *N_ptr = csa->N_ptr; |
---|
| 1688 | int *N_len = csa->N_len; |
---|
| 1689 | int *N_ind = csa->N_ind; |
---|
| 1690 | double *N_val = csa->N_val; |
---|
| 1691 | int *trow_ind = csa->trow_ind; |
---|
| 1692 | double *trow_vec = csa->trow_vec; |
---|
| 1693 | int i, j, beg, end, ptr, nnz; |
---|
| 1694 | double temp; |
---|
| 1695 | /* clear the pivot row */ |
---|
| 1696 | for (j = 1; j <= n; j++) |
---|
| 1697 | trow_vec[j] = 0.0; |
---|
| 1698 | /* compute the pivot row as a linear combination of rows of the |
---|
| 1699 | matrix N: trow = - rho[1] * N'[1] - ... - rho[m] * N'[m] */ |
---|
| 1700 | for (i = 1; i <= m; i++) |
---|
| 1701 | { temp = rho[i]; |
---|
| 1702 | if (temp == 0.0) continue; |
---|
| 1703 | /* trow := trow - rho[i] * N'[i] */ |
---|
| 1704 | beg = N_ptr[i]; |
---|
| 1705 | end = beg + N_len[i]; |
---|
| 1706 | for (ptr = beg; ptr < end; ptr++) |
---|
| 1707 | { |
---|
| 1708 | #ifdef GLP_DEBUG |
---|
| 1709 | j = N_ind[ptr]; |
---|
| 1710 | xassert(1 <= j && j <= n); |
---|
| 1711 | xassert(stat[j] != GLP_NS); |
---|
| 1712 | #endif |
---|
| 1713 | trow_vec[N_ind[ptr]] -= temp * N_val[ptr]; |
---|
| 1714 | } |
---|
| 1715 | } |
---|
| 1716 | /* construct sparse pattern of the pivot row */ |
---|
| 1717 | nnz = 0; |
---|
| 1718 | for (j = 1; j <= n; j++) |
---|
| 1719 | { if (trow_vec[j] != 0.0) |
---|
| 1720 | trow_ind[++nnz] = j; |
---|
| 1721 | } |
---|
| 1722 | csa->trow_nnz = nnz; |
---|
| 1723 | return; |
---|
| 1724 | } |
---|
| 1725 | |
---|
| 1726 | /*********************************************************************** |
---|
| 1727 | * update_bbar - update values of basic variables |
---|
| 1728 | * |
---|
| 1729 | * This routine updates values of all basic variables for the adjacent |
---|
| 1730 | * basis. */ |
---|
| 1731 | |
---|
| 1732 | static void update_bbar(struct csa *csa) |
---|
| 1733 | { |
---|
| 1734 | #ifdef GLP_DEBUG |
---|
| 1735 | int m = csa->m; |
---|
| 1736 | int n = csa->n; |
---|
| 1737 | #endif |
---|
| 1738 | double *bbar = csa->bbar; |
---|
| 1739 | int q = csa->q; |
---|
| 1740 | int tcol_nnz = csa->tcol_nnz; |
---|
| 1741 | int *tcol_ind = csa->tcol_ind; |
---|
| 1742 | double *tcol_vec = csa->tcol_vec; |
---|
| 1743 | int p = csa->p; |
---|
| 1744 | double teta = csa->teta; |
---|
| 1745 | int i, pos; |
---|
| 1746 | #ifdef GLP_DEBUG |
---|
| 1747 | xassert(1 <= q && q <= n); |
---|
| 1748 | xassert(p < 0 || 1 <= p && p <= m); |
---|
| 1749 | #endif |
---|
| 1750 | /* if xN[q] leaves the basis, compute its value in the adjacent |
---|
| 1751 | basis, where it will replace xB[p] */ |
---|
| 1752 | if (p > 0) |
---|
| 1753 | bbar[p] = get_xN(csa, q) + teta; |
---|
| 1754 | /* update values of other basic variables (except xB[p], because |
---|
| 1755 | it will be replaced by xN[q]) */ |
---|
| 1756 | if (teta == 0.0) goto done; |
---|
| 1757 | for (pos = 1; pos <= tcol_nnz; pos++) |
---|
| 1758 | { i = tcol_ind[pos]; |
---|
| 1759 | /* skip xB[p] */ |
---|
| 1760 | if (i == p) continue; |
---|
| 1761 | /* (change of xB[i]) = alfa[i,q] * (change of xN[q]) */ |
---|
| 1762 | bbar[i] += tcol_vec[i] * teta; |
---|
| 1763 | } |
---|
| 1764 | done: return; |
---|
| 1765 | } |
---|
| 1766 | |
---|
| 1767 | /*********************************************************************** |
---|
| 1768 | * reeval_cost - recompute reduced cost of non-basic variable xN[q] |
---|
| 1769 | * |
---|
| 1770 | * This routine recomputes reduced cost of non-basic variable xN[q] for |
---|
| 1771 | * the current basis more accurately using its direct definition: |
---|
| 1772 | * |
---|
| 1773 | * d[q] = cN[q] - N'[q] * pi = |
---|
| 1774 | * |
---|
| 1775 | * = cN[q] - N'[q] * (inv(B') * cB) = |
---|
| 1776 | * |
---|
| 1777 | * = cN[q] - (cB' * inv(B) * N[q]) = |
---|
| 1778 | * |
---|
| 1779 | * = cN[q] + cB' * (pivot column). |
---|
| 1780 | * |
---|
| 1781 | * It is assumed that the pivot column of the simplex table is already |
---|
| 1782 | * computed. */ |
---|
| 1783 | |
---|
| 1784 | static double reeval_cost(struct csa *csa) |
---|
| 1785 | { int m = csa->m; |
---|
| 1786 | #ifdef GLP_DEBUG |
---|
| 1787 | int n = csa->n; |
---|
| 1788 | #endif |
---|
| 1789 | double *coef = csa->coef; |
---|
| 1790 | int *head = csa->head; |
---|
| 1791 | int q = csa->q; |
---|
| 1792 | int tcol_nnz = csa->tcol_nnz; |
---|
| 1793 | int *tcol_ind = csa->tcol_ind; |
---|
| 1794 | double *tcol_vec = csa->tcol_vec; |
---|
| 1795 | int i, pos; |
---|
| 1796 | double dq; |
---|
| 1797 | #ifdef GLP_DEBUG |
---|
| 1798 | xassert(1 <= q && q <= n); |
---|
| 1799 | #endif |
---|
| 1800 | dq = coef[head[m+q]]; |
---|
| 1801 | for (pos = 1; pos <= tcol_nnz; pos++) |
---|
| 1802 | { i = tcol_ind[pos]; |
---|
| 1803 | #ifdef GLP_DEBUG |
---|
| 1804 | xassert(1 <= i && i <= m); |
---|
| 1805 | #endif |
---|
| 1806 | dq += coef[head[i]] * tcol_vec[i]; |
---|
| 1807 | } |
---|
| 1808 | return dq; |
---|
| 1809 | } |
---|
| 1810 | |
---|
| 1811 | /*********************************************************************** |
---|
| 1812 | * update_cbar - update reduced costs of non-basic variables |
---|
| 1813 | * |
---|
| 1814 | * This routine updates reduced costs of all (except fixed) non-basic |
---|
| 1815 | * variables for the adjacent basis. */ |
---|
| 1816 | |
---|
| 1817 | static void update_cbar(struct csa *csa) |
---|
| 1818 | { |
---|
| 1819 | #ifdef GLP_DEBUG |
---|
| 1820 | int n = csa->n; |
---|
| 1821 | #endif |
---|
| 1822 | double *cbar = csa->cbar; |
---|
| 1823 | int q = csa->q; |
---|
| 1824 | int trow_nnz = csa->trow_nnz; |
---|
| 1825 | int *trow_ind = csa->trow_ind; |
---|
| 1826 | double *trow_vec = csa->trow_vec; |
---|
| 1827 | int j, pos; |
---|
| 1828 | double new_dq; |
---|
| 1829 | #ifdef GLP_DEBUG |
---|
| 1830 | xassert(1 <= q && q <= n); |
---|
| 1831 | #endif |
---|
| 1832 | /* compute reduced cost of xB[p] in the adjacent basis, where it |
---|
| 1833 | will replace xN[q] */ |
---|
| 1834 | #ifdef GLP_DEBUG |
---|
| 1835 | xassert(trow_vec[q] != 0.0); |
---|
| 1836 | #endif |
---|
| 1837 | new_dq = (cbar[q] /= trow_vec[q]); |
---|
| 1838 | /* update reduced costs of other non-basic variables (except |
---|
| 1839 | xN[q], because it will be replaced by xB[p]) */ |
---|
| 1840 | for (pos = 1; pos <= trow_nnz; pos++) |
---|
| 1841 | { j = trow_ind[pos]; |
---|
| 1842 | /* skip xN[q] */ |
---|
| 1843 | if (j == q) continue; |
---|
| 1844 | cbar[j] -= trow_vec[j] * new_dq; |
---|
| 1845 | } |
---|
| 1846 | return; |
---|
| 1847 | } |
---|
| 1848 | |
---|
| 1849 | /*********************************************************************** |
---|
| 1850 | * update_gamma - update steepest edge coefficients |
---|
| 1851 | * |
---|
| 1852 | * This routine updates steepest-edge coefficients for the adjacent |
---|
| 1853 | * basis. */ |
---|
| 1854 | |
---|
| 1855 | static void update_gamma(struct csa *csa) |
---|
| 1856 | { int m = csa->m; |
---|
| 1857 | #ifdef GLP_DEBUG |
---|
| 1858 | int n = csa->n; |
---|
| 1859 | #endif |
---|
| 1860 | char *type = csa->type; |
---|
| 1861 | int *A_ptr = csa->A_ptr; |
---|
| 1862 | int *A_ind = csa->A_ind; |
---|
| 1863 | double *A_val = csa->A_val; |
---|
| 1864 | int *head = csa->head; |
---|
| 1865 | char *refsp = csa->refsp; |
---|
| 1866 | double *gamma = csa->gamma; |
---|
| 1867 | int q = csa->q; |
---|
| 1868 | int tcol_nnz = csa->tcol_nnz; |
---|
| 1869 | int *tcol_ind = csa->tcol_ind; |
---|
| 1870 | double *tcol_vec = csa->tcol_vec; |
---|
| 1871 | int p = csa->p; |
---|
| 1872 | int trow_nnz = csa->trow_nnz; |
---|
| 1873 | int *trow_ind = csa->trow_ind; |
---|
| 1874 | double *trow_vec = csa->trow_vec; |
---|
| 1875 | double *u = csa->work3; |
---|
| 1876 | int i, j, k, pos, beg, end, ptr; |
---|
| 1877 | double gamma_q, delta_q, pivot, s, t, t1, t2; |
---|
| 1878 | #ifdef GLP_DEBUG |
---|
| 1879 | xassert(1 <= p && p <= m); |
---|
| 1880 | xassert(1 <= q && q <= n); |
---|
| 1881 | #endif |
---|
| 1882 | /* the basis changes, so decrease the count */ |
---|
| 1883 | xassert(csa->refct > 0); |
---|
| 1884 | csa->refct--; |
---|
| 1885 | /* recompute gamma[q] for the current basis more accurately and |
---|
| 1886 | compute auxiliary vector u */ |
---|
| 1887 | gamma_q = delta_q = (refsp[head[m+q]] ? 1.0 : 0.0); |
---|
| 1888 | for (i = 1; i <= m; i++) u[i] = 0.0; |
---|
| 1889 | for (pos = 1; pos <= tcol_nnz; pos++) |
---|
| 1890 | { i = tcol_ind[pos]; |
---|
| 1891 | if (refsp[head[i]]) |
---|
| 1892 | { u[i] = t = tcol_vec[i]; |
---|
| 1893 | gamma_q += t * t; |
---|
| 1894 | } |
---|
| 1895 | else |
---|
| 1896 | u[i] = 0.0; |
---|
| 1897 | } |
---|
| 1898 | xassert(csa->valid); |
---|
| 1899 | bfd_btran(csa->bfd, u); |
---|
| 1900 | /* update gamma[k] for other non-basic variables (except fixed |
---|
| 1901 | variables and xN[q], because it will be replaced by xB[p]) */ |
---|
| 1902 | pivot = trow_vec[q]; |
---|
| 1903 | #ifdef GLP_DEBUG |
---|
| 1904 | xassert(pivot != 0.0); |
---|
| 1905 | #endif |
---|
| 1906 | for (pos = 1; pos <= trow_nnz; pos++) |
---|
| 1907 | { j = trow_ind[pos]; |
---|
| 1908 | /* skip xN[q] */ |
---|
| 1909 | if (j == q) continue; |
---|
| 1910 | /* compute t */ |
---|
| 1911 | t = trow_vec[j] / pivot; |
---|
| 1912 | /* compute inner product s = N'[j] * u */ |
---|
| 1913 | k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 1914 | if (k <= m) |
---|
| 1915 | s = u[k]; |
---|
| 1916 | else |
---|
| 1917 | { s = 0.0; |
---|
| 1918 | beg = A_ptr[k-m]; |
---|
| 1919 | end = A_ptr[k-m+1]; |
---|
| 1920 | for (ptr = beg; ptr < end; ptr++) |
---|
| 1921 | s -= A_val[ptr] * u[A_ind[ptr]]; |
---|
| 1922 | } |
---|
| 1923 | /* compute gamma[k] for the adjacent basis */ |
---|
| 1924 | t1 = gamma[j] + t * t * gamma_q + 2.0 * t * s; |
---|
| 1925 | t2 = (refsp[k] ? 1.0 : 0.0) + delta_q * t * t; |
---|
| 1926 | gamma[j] = (t1 >= t2 ? t1 : t2); |
---|
| 1927 | if (gamma[j] < DBL_EPSILON) gamma[j] = DBL_EPSILON; |
---|
| 1928 | } |
---|
| 1929 | /* compute gamma[q] for the adjacent basis */ |
---|
| 1930 | if (type[head[p]] == GLP_FX) |
---|
| 1931 | gamma[q] = 1.0; |
---|
| 1932 | else |
---|
| 1933 | { gamma[q] = gamma_q / (pivot * pivot); |
---|
| 1934 | if (gamma[q] < DBL_EPSILON) gamma[q] = DBL_EPSILON; |
---|
| 1935 | } |
---|
| 1936 | return; |
---|
| 1937 | } |
---|
| 1938 | |
---|
| 1939 | /*********************************************************************** |
---|
| 1940 | * err_in_bbar - compute maximal relative error in primal solution |
---|
| 1941 | * |
---|
| 1942 | * This routine returns maximal relative error: |
---|
| 1943 | * |
---|
| 1944 | * max |beta[i] - bbar[i]| / (1 + |beta[i]|), |
---|
| 1945 | * |
---|
| 1946 | * where beta and bbar are, respectively, directly computed and the |
---|
| 1947 | * current (updated) values of basic variables. |
---|
| 1948 | * |
---|
| 1949 | * NOTE: The routine is intended only for debugginig purposes. */ |
---|
| 1950 | |
---|
| 1951 | static double err_in_bbar(struct csa *csa) |
---|
| 1952 | { int m = csa->m; |
---|
| 1953 | double *bbar = csa->bbar; |
---|
| 1954 | int i; |
---|
| 1955 | double e, emax, *beta; |
---|
| 1956 | beta = xcalloc(1+m, sizeof(double)); |
---|
| 1957 | eval_beta(csa, beta); |
---|
| 1958 | emax = 0.0; |
---|
| 1959 | for (i = 1; i <= m; i++) |
---|
| 1960 | { e = fabs(beta[i] - bbar[i]) / (1.0 + fabs(beta[i])); |
---|
| 1961 | if (emax < e) emax = e; |
---|
| 1962 | } |
---|
| 1963 | xfree(beta); |
---|
| 1964 | return emax; |
---|
| 1965 | } |
---|
| 1966 | |
---|
| 1967 | /*********************************************************************** |
---|
| 1968 | * err_in_cbar - compute maximal relative error in dual solution |
---|
| 1969 | * |
---|
| 1970 | * This routine returns maximal relative error: |
---|
| 1971 | * |
---|
| 1972 | * max |cost[j] - cbar[j]| / (1 + |cost[j]|), |
---|
| 1973 | * |
---|
| 1974 | * where cost and cbar are, respectively, directly computed and the |
---|
| 1975 | * current (updated) reduced costs of non-basic non-fixed variables. |
---|
| 1976 | * |
---|
| 1977 | * NOTE: The routine is intended only for debugginig purposes. */ |
---|
| 1978 | |
---|
| 1979 | static double err_in_cbar(struct csa *csa) |
---|
| 1980 | { int m = csa->m; |
---|
| 1981 | int n = csa->n; |
---|
| 1982 | char *stat = csa->stat; |
---|
| 1983 | double *cbar = csa->cbar; |
---|
| 1984 | int j; |
---|
| 1985 | double e, emax, cost, *pi; |
---|
| 1986 | pi = xcalloc(1+m, sizeof(double)); |
---|
| 1987 | eval_pi(csa, pi); |
---|
| 1988 | emax = 0.0; |
---|
| 1989 | for (j = 1; j <= n; j++) |
---|
| 1990 | { if (stat[j] == GLP_NS) continue; |
---|
| 1991 | cost = eval_cost(csa, pi, j); |
---|
| 1992 | e = fabs(cost - cbar[j]) / (1.0 + fabs(cost)); |
---|
| 1993 | if (emax < e) emax = e; |
---|
| 1994 | } |
---|
| 1995 | xfree(pi); |
---|
| 1996 | return emax; |
---|
| 1997 | } |
---|
| 1998 | |
---|
| 1999 | /*********************************************************************** |
---|
| 2000 | * err_in_gamma - compute maximal relative error in steepest edge cff. |
---|
| 2001 | * |
---|
| 2002 | * This routine returns maximal relative error: |
---|
| 2003 | * |
---|
| 2004 | * max |gamma'[j] - gamma[j]| / (1 + |gamma'[j]), |
---|
| 2005 | * |
---|
| 2006 | * where gamma'[j] and gamma[j] are, respectively, directly computed |
---|
| 2007 | * and the current (updated) steepest edge coefficients for non-basic |
---|
| 2008 | * non-fixed variable x[j]. |
---|
| 2009 | * |
---|
| 2010 | * NOTE: The routine is intended only for debugginig purposes. */ |
---|
| 2011 | |
---|
| 2012 | static double err_in_gamma(struct csa *csa) |
---|
| 2013 | { int n = csa->n; |
---|
| 2014 | char *stat = csa->stat; |
---|
| 2015 | double *gamma = csa->gamma; |
---|
| 2016 | int j; |
---|
| 2017 | double e, emax, temp; |
---|
| 2018 | emax = 0.0; |
---|
| 2019 | for (j = 1; j <= n; j++) |
---|
| 2020 | { if (stat[j] == GLP_NS) |
---|
| 2021 | { xassert(gamma[j] == 1.0); |
---|
| 2022 | continue; |
---|
| 2023 | } |
---|
| 2024 | temp = eval_gamma(csa, j); |
---|
| 2025 | e = fabs(temp - gamma[j]) / (1.0 + fabs(temp)); |
---|
| 2026 | if (emax < e) emax = e; |
---|
| 2027 | } |
---|
| 2028 | return emax; |
---|
| 2029 | } |
---|
| 2030 | |
---|
| 2031 | /*********************************************************************** |
---|
| 2032 | * change_basis - change basis header |
---|
| 2033 | * |
---|
| 2034 | * This routine changes the basis header to make it corresponding to |
---|
| 2035 | * the adjacent basis. */ |
---|
| 2036 | |
---|
| 2037 | static void change_basis(struct csa *csa) |
---|
| 2038 | { int m = csa->m; |
---|
| 2039 | #ifdef GLP_DEBUG |
---|
| 2040 | int n = csa->n; |
---|
| 2041 | char *type = csa->type; |
---|
| 2042 | #endif |
---|
| 2043 | int *head = csa->head; |
---|
| 2044 | char *stat = csa->stat; |
---|
| 2045 | int q = csa->q; |
---|
| 2046 | int p = csa->p; |
---|
| 2047 | int p_stat = csa->p_stat; |
---|
| 2048 | int k; |
---|
| 2049 | #ifdef GLP_DEBUG |
---|
| 2050 | xassert(1 <= q && q <= n); |
---|
| 2051 | #endif |
---|
| 2052 | if (p < 0) |
---|
| 2053 | { /* xN[q] goes to its opposite bound */ |
---|
| 2054 | #ifdef GLP_DEBUG |
---|
| 2055 | k = head[m+q]; /* x[k] = xN[q] */ |
---|
| 2056 | xassert(1 <= k && k <= m+n); |
---|
| 2057 | xassert(type[k] == GLP_DB); |
---|
| 2058 | #endif |
---|
| 2059 | switch (stat[q]) |
---|
| 2060 | { case GLP_NL: |
---|
| 2061 | /* xN[q] increases */ |
---|
| 2062 | stat[q] = GLP_NU; |
---|
| 2063 | break; |
---|
| 2064 | case GLP_NU: |
---|
| 2065 | /* xN[q] decreases */ |
---|
| 2066 | stat[q] = GLP_NL; |
---|
| 2067 | break; |
---|
| 2068 | default: |
---|
| 2069 | xassert(stat != stat); |
---|
| 2070 | } |
---|
| 2071 | } |
---|
| 2072 | else |
---|
| 2073 | { /* xB[p] leaves the basis, xN[q] enters the basis */ |
---|
| 2074 | #ifdef GLP_DEBUG |
---|
| 2075 | xassert(1 <= p && p <= m); |
---|
| 2076 | k = head[p]; /* x[k] = xB[p] */ |
---|
| 2077 | switch (p_stat) |
---|
| 2078 | { case GLP_NL: |
---|
| 2079 | /* xB[p] goes to its lower bound */ |
---|
| 2080 | xassert(type[k] == GLP_LO || type[k] == GLP_DB); |
---|
| 2081 | break; |
---|
| 2082 | case GLP_NU: |
---|
| 2083 | /* xB[p] goes to its upper bound */ |
---|
| 2084 | xassert(type[k] == GLP_UP || type[k] == GLP_DB); |
---|
| 2085 | break; |
---|
| 2086 | case GLP_NS: |
---|
| 2087 | /* xB[p] goes to its fixed value */ |
---|
| 2088 | xassert(type[k] == GLP_NS); |
---|
| 2089 | break; |
---|
| 2090 | default: |
---|
| 2091 | xassert(p_stat != p_stat); |
---|
| 2092 | } |
---|
| 2093 | #endif |
---|
| 2094 | /* xB[p] <-> xN[q] */ |
---|
| 2095 | k = head[p], head[p] = head[m+q], head[m+q] = k; |
---|
| 2096 | stat[q] = (char)p_stat; |
---|
| 2097 | } |
---|
| 2098 | return; |
---|
| 2099 | } |
---|
| 2100 | |
---|
| 2101 | /*********************************************************************** |
---|
| 2102 | * set_aux_obj - construct auxiliary objective function |
---|
| 2103 | * |
---|
| 2104 | * The auxiliary objective function is a separable piecewise linear |
---|
| 2105 | * convex function, which is the sum of primal infeasibilities: |
---|
| 2106 | * |
---|
| 2107 | * z = t[1] + ... + t[m+n] -> minimize, |
---|
| 2108 | * |
---|
| 2109 | * where: |
---|
| 2110 | * |
---|
| 2111 | * / lb[k] - x[k], if x[k] < lb[k] |
---|
| 2112 | * | |
---|
| 2113 | * t[k] = < 0, if lb[k] <= x[k] <= ub[k] |
---|
| 2114 | * | |
---|
| 2115 | * \ x[k] - ub[k], if x[k] > ub[k] |
---|
| 2116 | * |
---|
| 2117 | * This routine computes objective coefficients for the current basis |
---|
| 2118 | * and returns the number of non-zero terms t[k]. */ |
---|
| 2119 | |
---|
| 2120 | static int set_aux_obj(struct csa *csa, double tol_bnd) |
---|
| 2121 | { int m = csa->m; |
---|
| 2122 | int n = csa->n; |
---|
| 2123 | char *type = csa->type; |
---|
| 2124 | double *lb = csa->lb; |
---|
| 2125 | double *ub = csa->ub; |
---|
| 2126 | double *coef = csa->coef; |
---|
| 2127 | int *head = csa->head; |
---|
| 2128 | double *bbar = csa->bbar; |
---|
| 2129 | int i, k, cnt = 0; |
---|
| 2130 | double eps; |
---|
| 2131 | /* use a bit more restrictive tolerance */ |
---|
| 2132 | tol_bnd *= 0.90; |
---|
| 2133 | /* clear all objective coefficients */ |
---|
| 2134 | for (k = 1; k <= m+n; k++) |
---|
| 2135 | coef[k] = 0.0; |
---|
| 2136 | /* walk through the list of basic variables */ |
---|
| 2137 | for (i = 1; i <= m; i++) |
---|
| 2138 | { k = head[i]; /* x[k] = xB[i] */ |
---|
| 2139 | if (type[k] == GLP_LO || type[k] == GLP_DB || |
---|
| 2140 | type[k] == GLP_FX) |
---|
| 2141 | { /* x[k] has lower bound */ |
---|
| 2142 | eps = tol_bnd * (1.0 + kappa * fabs(lb[k])); |
---|
| 2143 | if (bbar[i] < lb[k] - eps) |
---|
| 2144 | { /* and violates it */ |
---|
| 2145 | coef[k] = -1.0; |
---|
| 2146 | cnt++; |
---|
| 2147 | } |
---|
| 2148 | } |
---|
| 2149 | if (type[k] == GLP_UP || type[k] == GLP_DB || |
---|
| 2150 | type[k] == GLP_FX) |
---|
| 2151 | { /* x[k] has upper bound */ |
---|
| 2152 | eps = tol_bnd * (1.0 + kappa * fabs(ub[k])); |
---|
| 2153 | if (bbar[i] > ub[k] + eps) |
---|
| 2154 | { /* and violates it */ |
---|
| 2155 | coef[k] = +1.0; |
---|
| 2156 | cnt++; |
---|
| 2157 | } |
---|
| 2158 | } |
---|
| 2159 | } |
---|
| 2160 | return cnt; |
---|
| 2161 | } |
---|
| 2162 | |
---|
| 2163 | /*********************************************************************** |
---|
| 2164 | * set_orig_obj - restore original objective function |
---|
| 2165 | * |
---|
| 2166 | * This routine assigns scaled original objective coefficients to the |
---|
| 2167 | * working objective function. */ |
---|
| 2168 | |
---|
| 2169 | static void set_orig_obj(struct csa *csa) |
---|
| 2170 | { int m = csa->m; |
---|
| 2171 | int n = csa->n; |
---|
| 2172 | double *coef = csa->coef; |
---|
| 2173 | double *obj = csa->obj; |
---|
| 2174 | double zeta = csa->zeta; |
---|
| 2175 | int i, j; |
---|
| 2176 | for (i = 1; i <= m; i++) |
---|
| 2177 | coef[i] = 0.0; |
---|
| 2178 | for (j = 1; j <= n; j++) |
---|
| 2179 | coef[m+j] = zeta * obj[j]; |
---|
| 2180 | return; |
---|
| 2181 | } |
---|
| 2182 | |
---|
| 2183 | /*********************************************************************** |
---|
| 2184 | * check_stab - check numerical stability of basic solution |
---|
| 2185 | * |
---|
| 2186 | * If the current basic solution is primal feasible (or pseudo feasible |
---|
| 2187 | * on phase I) within a tolerance, this routine returns zero, otherwise |
---|
| 2188 | * it returns non-zero. */ |
---|
| 2189 | |
---|
| 2190 | static int check_stab(struct csa *csa, double tol_bnd) |
---|
| 2191 | { int m = csa->m; |
---|
| 2192 | #ifdef GLP_DEBUG |
---|
| 2193 | int n = csa->n; |
---|
| 2194 | #endif |
---|
| 2195 | char *type = csa->type; |
---|
| 2196 | double *lb = csa->lb; |
---|
| 2197 | double *ub = csa->ub; |
---|
| 2198 | double *coef = csa->coef; |
---|
| 2199 | int *head = csa->head; |
---|
| 2200 | int phase = csa->phase; |
---|
| 2201 | double *bbar = csa->bbar; |
---|
| 2202 | int i, k; |
---|
| 2203 | double eps; |
---|
| 2204 | /* walk through the list of basic variables */ |
---|
| 2205 | for (i = 1; i <= m; i++) |
---|
| 2206 | { k = head[i]; /* x[k] = xB[i] */ |
---|
| 2207 | #ifdef GLP_DEBUG |
---|
| 2208 | xassert(1 <= k && k <= m+n); |
---|
| 2209 | #endif |
---|
| 2210 | if (phase == 1 && coef[k] < 0.0) |
---|
| 2211 | { /* x[k] must not be greater than its lower bound */ |
---|
| 2212 | #ifdef GLP_DEBUG |
---|
| 2213 | xassert(type[k] == GLP_LO || type[k] == GLP_DB || |
---|
| 2214 | type[k] == GLP_FX); |
---|
| 2215 | #endif |
---|
| 2216 | eps = tol_bnd * (1.0 + kappa * fabs(lb[k])); |
---|
| 2217 | if (bbar[i] > lb[k] + eps) return 1; |
---|
| 2218 | } |
---|
| 2219 | else if (phase == 1 && coef[k] > 0.0) |
---|
| 2220 | { /* x[k] must not be less than its upper bound */ |
---|
| 2221 | #ifdef GLP_DEBUG |
---|
| 2222 | xassert(type[k] == GLP_UP || type[k] == GLP_DB || |
---|
| 2223 | type[k] == GLP_FX); |
---|
| 2224 | #endif |
---|
| 2225 | eps = tol_bnd * (1.0 + kappa * fabs(ub[k])); |
---|
| 2226 | if (bbar[i] < ub[k] - eps) return 1; |
---|
| 2227 | } |
---|
| 2228 | else |
---|
| 2229 | { /* either phase = 1 and coef[k] = 0, or phase = 2 */ |
---|
| 2230 | if (type[k] == GLP_LO || type[k] == GLP_DB || |
---|
| 2231 | type[k] == GLP_FX) |
---|
| 2232 | { /* x[k] must not be less than its lower bound */ |
---|
| 2233 | eps = tol_bnd * (1.0 + kappa * fabs(lb[k])); |
---|
| 2234 | if (bbar[i] < lb[k] - eps) return 1; |
---|
| 2235 | } |
---|
| 2236 | if (type[k] == GLP_UP || type[k] == GLP_DB || |
---|
| 2237 | type[k] == GLP_FX) |
---|
| 2238 | { /* x[k] must not be greater then its upper bound */ |
---|
| 2239 | eps = tol_bnd * (1.0 + kappa * fabs(ub[k])); |
---|
| 2240 | if (bbar[i] > ub[k] + eps) return 1; |
---|
| 2241 | } |
---|
| 2242 | } |
---|
| 2243 | } |
---|
| 2244 | /* basic solution is primal feasible within a tolerance */ |
---|
| 2245 | return 0; |
---|
| 2246 | } |
---|
| 2247 | |
---|
| 2248 | /*********************************************************************** |
---|
| 2249 | * check_feas - check primal feasibility of basic solution |
---|
| 2250 | * |
---|
| 2251 | * If the current basic solution is primal feasible within a tolerance, |
---|
| 2252 | * this routine returns zero, otherwise it returns non-zero. */ |
---|
| 2253 | |
---|
| 2254 | static int check_feas(struct csa *csa, double tol_bnd) |
---|
| 2255 | { int m = csa->m; |
---|
| 2256 | #ifdef GLP_DEBUG |
---|
| 2257 | int n = csa->n; |
---|
| 2258 | char *type = csa->type; |
---|
| 2259 | #endif |
---|
| 2260 | double *lb = csa->lb; |
---|
| 2261 | double *ub = csa->ub; |
---|
| 2262 | double *coef = csa->coef; |
---|
| 2263 | int *head = csa->head; |
---|
| 2264 | double *bbar = csa->bbar; |
---|
| 2265 | int i, k; |
---|
| 2266 | double eps; |
---|
| 2267 | xassert(csa->phase == 1); |
---|
| 2268 | /* walk through the list of basic variables */ |
---|
| 2269 | for (i = 1; i <= m; i++) |
---|
| 2270 | { k = head[i]; /* x[k] = xB[i] */ |
---|
| 2271 | #ifdef GLP_DEBUG |
---|
| 2272 | xassert(1 <= k && k <= m+n); |
---|
| 2273 | #endif |
---|
| 2274 | if (coef[k] < 0.0) |
---|
| 2275 | { /* check if x[k] still violates its lower bound */ |
---|
| 2276 | #ifdef GLP_DEBUG |
---|
| 2277 | xassert(type[k] == GLP_LO || type[k] == GLP_DB || |
---|
| 2278 | type[k] == GLP_FX); |
---|
| 2279 | #endif |
---|
| 2280 | eps = tol_bnd * (1.0 + kappa * fabs(lb[k])); |
---|
| 2281 | if (bbar[i] < lb[k] - eps) return 1; |
---|
| 2282 | } |
---|
| 2283 | else if (coef[k] > 0.0) |
---|
| 2284 | { /* check if x[k] still violates its upper bound */ |
---|
| 2285 | #ifdef GLP_DEBUG |
---|
| 2286 | xassert(type[k] == GLP_UP || type[k] == GLP_DB || |
---|
| 2287 | type[k] == GLP_FX); |
---|
| 2288 | #endif |
---|
| 2289 | eps = tol_bnd * (1.0 + kappa * fabs(ub[k])); |
---|
| 2290 | if (bbar[i] > ub[k] + eps) return 1; |
---|
| 2291 | } |
---|
| 2292 | } |
---|
| 2293 | /* basic solution is primal feasible within a tolerance */ |
---|
| 2294 | return 0; |
---|
| 2295 | } |
---|
| 2296 | |
---|
| 2297 | /*********************************************************************** |
---|
| 2298 | * eval_obj - compute original objective function |
---|
| 2299 | * |
---|
| 2300 | * This routine computes the current value of the original objective |
---|
| 2301 | * function. */ |
---|
| 2302 | |
---|
| 2303 | static double eval_obj(struct csa *csa) |
---|
| 2304 | { int m = csa->m; |
---|
| 2305 | int n = csa->n; |
---|
| 2306 | double *obj = csa->obj; |
---|
| 2307 | int *head = csa->head; |
---|
| 2308 | double *bbar = csa->bbar; |
---|
| 2309 | int i, j, k; |
---|
| 2310 | double sum; |
---|
| 2311 | sum = obj[0]; |
---|
| 2312 | /* walk through the list of basic variables */ |
---|
| 2313 | for (i = 1; i <= m; i++) |
---|
| 2314 | { k = head[i]; /* x[k] = xB[i] */ |
---|
| 2315 | #ifdef GLP_DEBUG |
---|
| 2316 | xassert(1 <= k && k <= m+n); |
---|
| 2317 | #endif |
---|
| 2318 | if (k > m) |
---|
| 2319 | sum += obj[k-m] * bbar[i]; |
---|
| 2320 | } |
---|
| 2321 | /* walk through the list of non-basic variables */ |
---|
| 2322 | for (j = 1; j <= n; j++) |
---|
| 2323 | { k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 2324 | #ifdef GLP_DEBUG |
---|
| 2325 | xassert(1 <= k && k <= m+n); |
---|
| 2326 | #endif |
---|
| 2327 | if (k > m) |
---|
| 2328 | sum += obj[k-m] * get_xN(csa, j); |
---|
| 2329 | } |
---|
| 2330 | return sum; |
---|
| 2331 | } |
---|
| 2332 | |
---|
| 2333 | /*********************************************************************** |
---|
| 2334 | * display - display the search progress |
---|
| 2335 | * |
---|
| 2336 | * This routine displays some information about the search progress |
---|
| 2337 | * that includes: |
---|
| 2338 | * |
---|
| 2339 | * the search phase; |
---|
| 2340 | * |
---|
| 2341 | * the number of simplex iterations performed by the solver; |
---|
| 2342 | * |
---|
| 2343 | * the original objective value; |
---|
| 2344 | * |
---|
| 2345 | * the sum of (scaled) primal infeasibilities; |
---|
| 2346 | * |
---|
| 2347 | * the number of basic fixed variables. */ |
---|
| 2348 | |
---|
| 2349 | static void display(struct csa *csa, const glp_smcp *parm, int spec) |
---|
| 2350 | { int m = csa->m; |
---|
| 2351 | #ifdef GLP_DEBUG |
---|
| 2352 | int n = csa->n; |
---|
| 2353 | #endif |
---|
| 2354 | char *type = csa->type; |
---|
| 2355 | double *lb = csa->lb; |
---|
| 2356 | double *ub = csa->ub; |
---|
| 2357 | int phase = csa->phase; |
---|
| 2358 | int *head = csa->head; |
---|
| 2359 | double *bbar = csa->bbar; |
---|
| 2360 | int i, k, cnt; |
---|
| 2361 | double sum; |
---|
| 2362 | if (parm->msg_lev < GLP_MSG_ON) goto skip; |
---|
| 2363 | if (parm->out_dly > 0 && |
---|
| 2364 | 1000.0 * xdifftime(xtime(), csa->tm_beg) < parm->out_dly) |
---|
| 2365 | goto skip; |
---|
| 2366 | if (csa->it_cnt == csa->it_dpy) goto skip; |
---|
| 2367 | if (!spec && csa->it_cnt % parm->out_frq != 0) goto skip; |
---|
| 2368 | /* compute the sum of primal infeasibilities and determine the |
---|
| 2369 | number of basic fixed variables */ |
---|
| 2370 | sum = 0.0, cnt = 0; |
---|
| 2371 | for (i = 1; i <= m; i++) |
---|
| 2372 | { k = head[i]; /* x[k] = xB[i] */ |
---|
| 2373 | #ifdef GLP_DEBUG |
---|
| 2374 | xassert(1 <= k && k <= m+n); |
---|
| 2375 | #endif |
---|
| 2376 | if (type[k] == GLP_LO || type[k] == GLP_DB || |
---|
| 2377 | type[k] == GLP_FX) |
---|
| 2378 | { /* x[k] has lower bound */ |
---|
| 2379 | if (bbar[i] < lb[k]) |
---|
| 2380 | sum += (lb[k] - bbar[i]); |
---|
| 2381 | } |
---|
| 2382 | if (type[k] == GLP_UP || type[k] == GLP_DB || |
---|
| 2383 | type[k] == GLP_FX) |
---|
| 2384 | { /* x[k] has upper bound */ |
---|
| 2385 | if (bbar[i] > ub[k]) |
---|
| 2386 | sum += (bbar[i] - ub[k]); |
---|
| 2387 | } |
---|
| 2388 | if (type[k] == GLP_FX) cnt++; |
---|
| 2389 | } |
---|
| 2390 | xprintf("%c%6d: obj = %17.9e infeas = %10.3e (%d)\n", |
---|
| 2391 | phase == 1 ? ' ' : '*', csa->it_cnt, eval_obj(csa), sum, cnt); |
---|
| 2392 | csa->it_dpy = csa->it_cnt; |
---|
| 2393 | skip: return; |
---|
| 2394 | } |
---|
| 2395 | |
---|
| 2396 | /*********************************************************************** |
---|
| 2397 | * store_sol - store basic solution back to the problem object |
---|
| 2398 | * |
---|
| 2399 | * This routine stores basic solution components back to the problem |
---|
| 2400 | * object. */ |
---|
| 2401 | |
---|
| 2402 | static void store_sol(struct csa *csa, glp_prob *lp, int p_stat, |
---|
| 2403 | int d_stat, int ray) |
---|
| 2404 | { int m = csa->m; |
---|
| 2405 | int n = csa->n; |
---|
| 2406 | double zeta = csa->zeta; |
---|
| 2407 | int *head = csa->head; |
---|
| 2408 | char *stat = csa->stat; |
---|
| 2409 | double *bbar = csa->bbar; |
---|
| 2410 | double *cbar = csa->cbar; |
---|
| 2411 | int i, j, k; |
---|
| 2412 | #ifdef GLP_DEBUG |
---|
| 2413 | xassert(lp->m == m); |
---|
| 2414 | xassert(lp->n == n); |
---|
| 2415 | #endif |
---|
| 2416 | /* basis factorization */ |
---|
| 2417 | #ifdef GLP_DEBUG |
---|
| 2418 | xassert(!lp->valid && lp->bfd == NULL); |
---|
| 2419 | xassert(csa->valid && csa->bfd != NULL); |
---|
| 2420 | #endif |
---|
| 2421 | lp->valid = 1, csa->valid = 0; |
---|
| 2422 | lp->bfd = csa->bfd, csa->bfd = NULL; |
---|
| 2423 | memcpy(&lp->head[1], &head[1], m * sizeof(int)); |
---|
| 2424 | /* basic solution status */ |
---|
| 2425 | lp->pbs_stat = p_stat; |
---|
| 2426 | lp->dbs_stat = d_stat; |
---|
| 2427 | /* objective function value */ |
---|
| 2428 | lp->obj_val = eval_obj(csa); |
---|
| 2429 | /* simplex iteration count */ |
---|
| 2430 | lp->it_cnt = csa->it_cnt; |
---|
| 2431 | /* unbounded ray */ |
---|
| 2432 | lp->some = ray; |
---|
| 2433 | /* basic variables */ |
---|
| 2434 | for (i = 1; i <= m; i++) |
---|
| 2435 | { k = head[i]; /* x[k] = xB[i] */ |
---|
| 2436 | #ifdef GLP_DEBUG |
---|
| 2437 | xassert(1 <= k && k <= m+n); |
---|
| 2438 | #endif |
---|
| 2439 | if (k <= m) |
---|
| 2440 | { GLPROW *row = lp->row[k]; |
---|
| 2441 | row->stat = GLP_BS; |
---|
| 2442 | row->bind = i; |
---|
| 2443 | row->prim = bbar[i] / row->rii; |
---|
| 2444 | row->dual = 0.0; |
---|
| 2445 | } |
---|
| 2446 | else |
---|
| 2447 | { GLPCOL *col = lp->col[k-m]; |
---|
| 2448 | col->stat = GLP_BS; |
---|
| 2449 | col->bind = i; |
---|
| 2450 | col->prim = bbar[i] * col->sjj; |
---|
| 2451 | col->dual = 0.0; |
---|
| 2452 | } |
---|
| 2453 | } |
---|
| 2454 | /* non-basic variables */ |
---|
| 2455 | for (j = 1; j <= n; j++) |
---|
| 2456 | { k = head[m+j]; /* x[k] = xN[j] */ |
---|
| 2457 | #ifdef GLP_DEBUG |
---|
| 2458 | xassert(1 <= k && k <= m+n); |
---|
| 2459 | #endif |
---|
| 2460 | if (k <= m) |
---|
| 2461 | { GLPROW *row = lp->row[k]; |
---|
| 2462 | row->stat = stat[j]; |
---|
| 2463 | row->bind = 0; |
---|
| 2464 | #if 0 |
---|
| 2465 | row->prim = get_xN(csa, j) / row->rii; |
---|
| 2466 | #else |
---|
| 2467 | switch (stat[j]) |
---|
| 2468 | { case GLP_NL: |
---|
| 2469 | row->prim = row->lb; break; |
---|
| 2470 | case GLP_NU: |
---|
| 2471 | row->prim = row->ub; break; |
---|
| 2472 | case GLP_NF: |
---|
| 2473 | row->prim = 0.0; break; |
---|
| 2474 | case GLP_NS: |
---|
| 2475 | row->prim = row->lb; break; |
---|
| 2476 | default: |
---|
| 2477 | xassert(stat != stat); |
---|
| 2478 | } |
---|
| 2479 | #endif |
---|
| 2480 | row->dual = (cbar[j] * row->rii) / zeta; |
---|
| 2481 | } |
---|
| 2482 | else |
---|
| 2483 | { GLPCOL *col = lp->col[k-m]; |
---|
| 2484 | col->stat = stat[j]; |
---|
| 2485 | col->bind = 0; |
---|
| 2486 | #if 0 |
---|
| 2487 | col->prim = get_xN(csa, j) * col->sjj; |
---|
| 2488 | #else |
---|
| 2489 | switch (stat[j]) |
---|
| 2490 | { case GLP_NL: |
---|
| 2491 | col->prim = col->lb; break; |
---|
| 2492 | case GLP_NU: |
---|
| 2493 | col->prim = col->ub; break; |
---|
| 2494 | case GLP_NF: |
---|
| 2495 | col->prim = 0.0; break; |
---|
| 2496 | case GLP_NS: |
---|
| 2497 | col->prim = col->lb; break; |
---|
| 2498 | default: |
---|
| 2499 | xassert(stat != stat); |
---|
| 2500 | } |
---|
| 2501 | #endif |
---|
| 2502 | col->dual = (cbar[j] / col->sjj) / zeta; |
---|
| 2503 | } |
---|
| 2504 | } |
---|
| 2505 | return; |
---|
| 2506 | } |
---|
| 2507 | |
---|
| 2508 | /*********************************************************************** |
---|
| 2509 | * free_csa - deallocate common storage area |
---|
| 2510 | * |
---|
| 2511 | * This routine frees all the memory allocated to arrays in the common |
---|
| 2512 | * storage area (CSA). */ |
---|
| 2513 | |
---|
| 2514 | static void free_csa(struct csa *csa) |
---|
| 2515 | { xfree(csa->type); |
---|
| 2516 | xfree(csa->lb); |
---|
| 2517 | xfree(csa->ub); |
---|
| 2518 | xfree(csa->coef); |
---|
| 2519 | xfree(csa->obj); |
---|
| 2520 | xfree(csa->A_ptr); |
---|
| 2521 | xfree(csa->A_ind); |
---|
| 2522 | xfree(csa->A_val); |
---|
| 2523 | xfree(csa->head); |
---|
| 2524 | xfree(csa->stat); |
---|
| 2525 | xfree(csa->N_ptr); |
---|
| 2526 | xfree(csa->N_len); |
---|
| 2527 | xfree(csa->N_ind); |
---|
| 2528 | xfree(csa->N_val); |
---|
| 2529 | xfree(csa->bbar); |
---|
| 2530 | xfree(csa->cbar); |
---|
| 2531 | xfree(csa->refsp); |
---|
| 2532 | xfree(csa->gamma); |
---|
| 2533 | xfree(csa->tcol_ind); |
---|
| 2534 | xfree(csa->tcol_vec); |
---|
| 2535 | xfree(csa->trow_ind); |
---|
| 2536 | xfree(csa->trow_vec); |
---|
| 2537 | xfree(csa->work1); |
---|
| 2538 | xfree(csa->work2); |
---|
| 2539 | xfree(csa->work3); |
---|
| 2540 | xfree(csa->work4); |
---|
| 2541 | xfree(csa); |
---|
| 2542 | return; |
---|
| 2543 | } |
---|
| 2544 | |
---|
| 2545 | /*********************************************************************** |
---|
| 2546 | * spx_primal - core LP solver based on the primal simplex method |
---|
| 2547 | * |
---|
| 2548 | * SYNOPSIS |
---|
| 2549 | * |
---|
| 2550 | * #include "glpspx.h" |
---|
| 2551 | * int spx_primal(glp_prob *lp, const glp_smcp *parm); |
---|
| 2552 | * |
---|
| 2553 | * DESCRIPTION |
---|
| 2554 | * |
---|
| 2555 | * The routine spx_primal is a core LP solver based on the two-phase |
---|
| 2556 | * primal simplex method. |
---|
| 2557 | * |
---|
| 2558 | * RETURNS |
---|
| 2559 | * |
---|
| 2560 | * 0 LP instance has been successfully solved. |
---|
| 2561 | * |
---|
| 2562 | * GLP_EITLIM |
---|
| 2563 | * Iteration limit has been exhausted. |
---|
| 2564 | * |
---|
| 2565 | * GLP_ETMLIM |
---|
| 2566 | * Time limit has been exhausted. |
---|
| 2567 | * |
---|
| 2568 | * GLP_EFAIL |
---|
| 2569 | * The solver failed to solve LP instance. */ |
---|
| 2570 | |
---|
| 2571 | int spx_primal(glp_prob *lp, const glp_smcp *parm) |
---|
| 2572 | { struct csa *csa; |
---|
| 2573 | int binv_st = 2; |
---|
| 2574 | /* status of basis matrix factorization: |
---|
| 2575 | 0 - invalid; 1 - just computed; 2 - updated */ |
---|
| 2576 | int bbar_st = 0; |
---|
| 2577 | /* status of primal values of basic variables: |
---|
| 2578 | 0 - invalid; 1 - just computed; 2 - updated */ |
---|
| 2579 | int cbar_st = 0; |
---|
| 2580 | /* status of reduced costs of non-basic variables: |
---|
| 2581 | 0 - invalid; 1 - just computed; 2 - updated */ |
---|
| 2582 | int rigorous = 0; |
---|
| 2583 | /* rigorous mode flag; this flag is used to enable iterative |
---|
| 2584 | refinement on computing pivot rows and columns of the simplex |
---|
| 2585 | table */ |
---|
| 2586 | int check = 0; |
---|
| 2587 | int p_stat, d_stat, ret; |
---|
| 2588 | /* allocate and initialize the common storage area */ |
---|
| 2589 | csa = alloc_csa(lp); |
---|
| 2590 | init_csa(csa, lp); |
---|
| 2591 | if (parm->msg_lev >= GLP_MSG_DBG) |
---|
| 2592 | xprintf("Objective scale factor = %g\n", csa->zeta); |
---|
| 2593 | loop: /* main loop starts here */ |
---|
| 2594 | /* compute factorization of the basis matrix */ |
---|
| 2595 | if (binv_st == 0) |
---|
| 2596 | { ret = invert_B(csa); |
---|
| 2597 | if (ret != 0) |
---|
| 2598 | { if (parm->msg_lev >= GLP_MSG_ERR) |
---|
| 2599 | { xprintf("Error: unable to factorize the basis matrix (%d" |
---|
| 2600 | ")\n", ret); |
---|
| 2601 | xprintf("Sorry, basis recovery procedure not implemented" |
---|
| 2602 | " yet\n"); |
---|
| 2603 | } |
---|
| 2604 | xassert(!lp->valid && lp->bfd == NULL); |
---|
| 2605 | lp->bfd = csa->bfd, csa->bfd = NULL; |
---|
| 2606 | lp->pbs_stat = lp->dbs_stat = GLP_UNDEF; |
---|
| 2607 | lp->obj_val = 0.0; |
---|
| 2608 | lp->it_cnt = csa->it_cnt; |
---|
| 2609 | lp->some = 0; |
---|
| 2610 | ret = GLP_EFAIL; |
---|
| 2611 | goto done; |
---|
| 2612 | } |
---|
| 2613 | csa->valid = 1; |
---|
| 2614 | binv_st = 1; /* just computed */ |
---|
| 2615 | /* invalidate basic solution components */ |
---|
| 2616 | bbar_st = cbar_st = 0; |
---|
| 2617 | } |
---|
| 2618 | /* compute primal values of basic variables */ |
---|
| 2619 | if (bbar_st == 0) |
---|
| 2620 | { eval_bbar(csa); |
---|
| 2621 | bbar_st = 1; /* just computed */ |
---|
| 2622 | /* determine the search phase, if not determined yet */ |
---|
| 2623 | if (csa->phase == 0) |
---|
| 2624 | { if (set_aux_obj(csa, parm->tol_bnd) > 0) |
---|
| 2625 | { /* current basic solution is primal infeasible */ |
---|
| 2626 | /* start to minimize the sum of infeasibilities */ |
---|
| 2627 | csa->phase = 1; |
---|
| 2628 | } |
---|
| 2629 | else |
---|
| 2630 | { /* current basic solution is primal feasible */ |
---|
| 2631 | /* start to minimize the original objective function */ |
---|
| 2632 | set_orig_obj(csa); |
---|
| 2633 | csa->phase = 2; |
---|
| 2634 | } |
---|
| 2635 | xassert(check_stab(csa, parm->tol_bnd) == 0); |
---|
| 2636 | /* working objective coefficients have been changed, so |
---|
| 2637 | invalidate reduced costs */ |
---|
| 2638 | cbar_st = 0; |
---|
| 2639 | display(csa, parm, 1); |
---|
| 2640 | } |
---|
| 2641 | /* make sure that the current basic solution remains primal |
---|
| 2642 | feasible (or pseudo feasible on phase I) */ |
---|
| 2643 | if (check_stab(csa, parm->tol_bnd)) |
---|
| 2644 | { /* there are excessive bound violations due to round-off |
---|
| 2645 | errors */ |
---|
| 2646 | if (parm->msg_lev >= GLP_MSG_ERR) |
---|
| 2647 | xprintf("Warning: numerical instability (primal simplex," |
---|
| 2648 | " phase %s)\n", csa->phase == 1 ? "I" : "II"); |
---|
| 2649 | /* restart the search */ |
---|
| 2650 | csa->phase = 0; |
---|
| 2651 | binv_st = 0; |
---|
| 2652 | rigorous = 5; |
---|
| 2653 | goto loop; |
---|
| 2654 | } |
---|
| 2655 | } |
---|
| 2656 | xassert(csa->phase == 1 || csa->phase == 2); |
---|
| 2657 | /* on phase I we do not need to wait until the current basic |
---|
| 2658 | solution becomes dual feasible; it is sufficient to make sure |
---|
| 2659 | that no basic variable violates its bounds */ |
---|
| 2660 | if (csa->phase == 1 && !check_feas(csa, parm->tol_bnd)) |
---|
| 2661 | { /* the current basis is primal feasible; switch to phase II */ |
---|
| 2662 | csa->phase = 2; |
---|
| 2663 | set_orig_obj(csa); |
---|
| 2664 | cbar_st = 0; |
---|
| 2665 | display(csa, parm, 1); |
---|
| 2666 | } |
---|
| 2667 | /* compute reduced costs of non-basic variables */ |
---|
| 2668 | if (cbar_st == 0) |
---|
| 2669 | { eval_cbar(csa); |
---|
| 2670 | cbar_st = 1; /* just computed */ |
---|
| 2671 | } |
---|
| 2672 | /* redefine the reference space, if required */ |
---|
| 2673 | switch (parm->pricing) |
---|
| 2674 | { case GLP_PT_STD: |
---|
| 2675 | break; |
---|
| 2676 | case GLP_PT_PSE: |
---|
| 2677 | if (csa->refct == 0) reset_refsp(csa); |
---|
| 2678 | break; |
---|
| 2679 | default: |
---|
| 2680 | xassert(parm != parm); |
---|
| 2681 | } |
---|
| 2682 | /* at this point the basis factorization and all basic solution |
---|
| 2683 | components are valid */ |
---|
| 2684 | xassert(binv_st && bbar_st && cbar_st); |
---|
| 2685 | /* check accuracy of current basic solution components (only for |
---|
| 2686 | debugging) */ |
---|
| 2687 | if (check) |
---|
| 2688 | { double e_bbar = err_in_bbar(csa); |
---|
| 2689 | double e_cbar = err_in_cbar(csa); |
---|
| 2690 | double e_gamma = |
---|
| 2691 | (parm->pricing == GLP_PT_PSE ? err_in_gamma(csa) : 0.0); |
---|
| 2692 | xprintf("e_bbar = %10.3e; e_cbar = %10.3e; e_gamma = %10.3e\n", |
---|
| 2693 | e_bbar, e_cbar, e_gamma); |
---|
| 2694 | xassert(e_bbar <= 1e-5 && e_cbar <= 1e-5 && e_gamma <= 1e-3); |
---|
| 2695 | } |
---|
| 2696 | /* check if the iteration limit has been exhausted */ |
---|
| 2697 | if (parm->it_lim < INT_MAX && |
---|
| 2698 | csa->it_cnt - csa->it_beg >= parm->it_lim) |
---|
| 2699 | { if (bbar_st != 1 || csa->phase == 2 && cbar_st != 1) |
---|
| 2700 | { if (bbar_st != 1) bbar_st = 0; |
---|
| 2701 | if (csa->phase == 2 && cbar_st != 1) cbar_st = 0; |
---|
| 2702 | goto loop; |
---|
| 2703 | } |
---|
| 2704 | display(csa, parm, 1); |
---|
| 2705 | if (parm->msg_lev >= GLP_MSG_ALL) |
---|
| 2706 | xprintf("ITERATION LIMIT EXCEEDED; SEARCH TERMINATED\n"); |
---|
| 2707 | switch (csa->phase) |
---|
| 2708 | { case 1: |
---|
| 2709 | p_stat = GLP_INFEAS; |
---|
| 2710 | set_orig_obj(csa); |
---|
| 2711 | eval_cbar(csa); |
---|
| 2712 | break; |
---|
| 2713 | case 2: |
---|
| 2714 | p_stat = GLP_FEAS; |
---|
| 2715 | break; |
---|
| 2716 | default: |
---|
| 2717 | xassert(csa != csa); |
---|
| 2718 | } |
---|
| 2719 | chuzc(csa, parm->tol_dj); |
---|
| 2720 | d_stat = (csa->q == 0 ? GLP_FEAS : GLP_INFEAS); |
---|
| 2721 | store_sol(csa, lp, p_stat, d_stat, 0); |
---|
| 2722 | ret = GLP_EITLIM; |
---|
| 2723 | goto done; |
---|
| 2724 | } |
---|
| 2725 | /* check if the time limit has been exhausted */ |
---|
| 2726 | if (parm->tm_lim < INT_MAX && |
---|
| 2727 | 1000.0 * xdifftime(xtime(), csa->tm_beg) >= parm->tm_lim) |
---|
| 2728 | { if (bbar_st != 1 || csa->phase == 2 && cbar_st != 1) |
---|
| 2729 | { if (bbar_st != 1) bbar_st = 0; |
---|
| 2730 | if (csa->phase == 2 && cbar_st != 1) cbar_st = 0; |
---|
| 2731 | goto loop; |
---|
| 2732 | } |
---|
| 2733 | display(csa, parm, 1); |
---|
| 2734 | if (parm->msg_lev >= GLP_MSG_ALL) |
---|
| 2735 | xprintf("TIME LIMIT EXCEEDED; SEARCH TERMINATED\n"); |
---|
| 2736 | switch (csa->phase) |
---|
| 2737 | { case 1: |
---|
| 2738 | p_stat = GLP_INFEAS; |
---|
| 2739 | set_orig_obj(csa); |
---|
| 2740 | eval_cbar(csa); |
---|
| 2741 | break; |
---|
| 2742 | case 2: |
---|
| 2743 | p_stat = GLP_FEAS; |
---|
| 2744 | break; |
---|
| 2745 | default: |
---|
| 2746 | xassert(csa != csa); |
---|
| 2747 | } |
---|
| 2748 | chuzc(csa, parm->tol_dj); |
---|
| 2749 | d_stat = (csa->q == 0 ? GLP_FEAS : GLP_INFEAS); |
---|
| 2750 | store_sol(csa, lp, p_stat, d_stat, 0); |
---|
| 2751 | ret = GLP_ETMLIM; |
---|
| 2752 | goto done; |
---|
| 2753 | } |
---|
| 2754 | /* display the search progress */ |
---|
| 2755 | display(csa, parm, 0); |
---|
| 2756 | /* choose non-basic variable xN[q] */ |
---|
| 2757 | chuzc(csa, parm->tol_dj); |
---|
| 2758 | if (csa->q == 0) |
---|
| 2759 | { if (bbar_st != 1 || cbar_st != 1) |
---|
| 2760 | { if (bbar_st != 1) bbar_st = 0; |
---|
| 2761 | if (cbar_st != 1) cbar_st = 0; |
---|
| 2762 | goto loop; |
---|
| 2763 | } |
---|
| 2764 | display(csa, parm, 1); |
---|
| 2765 | switch (csa->phase) |
---|
| 2766 | { case 1: |
---|
| 2767 | if (parm->msg_lev >= GLP_MSG_ALL) |
---|
| 2768 | xprintf("PROBLEM HAS NO FEASIBLE SOLUTION\n"); |
---|
| 2769 | p_stat = GLP_NOFEAS; |
---|
| 2770 | set_orig_obj(csa); |
---|
| 2771 | eval_cbar(csa); |
---|
| 2772 | chuzc(csa, parm->tol_dj); |
---|
| 2773 | d_stat = (csa->q == 0 ? GLP_FEAS : GLP_INFEAS); |
---|
| 2774 | break; |
---|
| 2775 | case 2: |
---|
| 2776 | if (parm->msg_lev >= GLP_MSG_ALL) |
---|
| 2777 | xprintf("OPTIMAL SOLUTION FOUND\n"); |
---|
| 2778 | p_stat = d_stat = GLP_FEAS; |
---|
| 2779 | break; |
---|
| 2780 | default: |
---|
| 2781 | xassert(csa != csa); |
---|
| 2782 | } |
---|
| 2783 | store_sol(csa, lp, p_stat, d_stat, 0); |
---|
| 2784 | ret = 0; |
---|
| 2785 | goto done; |
---|
| 2786 | } |
---|
| 2787 | /* compute pivot column of the simplex table */ |
---|
| 2788 | eval_tcol(csa); |
---|
| 2789 | if (rigorous) refine_tcol(csa); |
---|
| 2790 | sort_tcol(csa, parm->tol_piv); |
---|
| 2791 | /* check accuracy of the reduced cost of xN[q] */ |
---|
| 2792 | { double d1 = csa->cbar[csa->q]; /* less accurate */ |
---|
| 2793 | double d2 = reeval_cost(csa); /* more accurate */ |
---|
| 2794 | xassert(d1 != 0.0); |
---|
| 2795 | if (fabs(d1 - d2) > 1e-5 * (1.0 + fabs(d2)) || |
---|
| 2796 | !(d1 < 0.0 && d2 < 0.0 || d1 > 0.0 && d2 > 0.0)) |
---|
| 2797 | { if (parm->msg_lev >= GLP_MSG_DBG) |
---|
| 2798 | xprintf("d1 = %.12g; d2 = %.12g\n", d1, d2); |
---|
| 2799 | if (cbar_st != 1 || !rigorous) |
---|
| 2800 | { if (cbar_st != 1) cbar_st = 0; |
---|
| 2801 | rigorous = 5; |
---|
| 2802 | goto loop; |
---|
| 2803 | } |
---|
| 2804 | } |
---|
| 2805 | /* replace cbar[q] by more accurate value keeping its sign */ |
---|
| 2806 | if (d1 > 0.0) |
---|
| 2807 | csa->cbar[csa->q] = (d2 > 0.0 ? d2 : +DBL_EPSILON); |
---|
| 2808 | else |
---|
| 2809 | csa->cbar[csa->q] = (d2 < 0.0 ? d2 : -DBL_EPSILON); |
---|
| 2810 | } |
---|
| 2811 | /* choose basic variable xB[p] */ |
---|
| 2812 | switch (parm->r_test) |
---|
| 2813 | { case GLP_RT_STD: |
---|
| 2814 | chuzr(csa, 0.0); |
---|
| 2815 | break; |
---|
| 2816 | case GLP_RT_HAR: |
---|
| 2817 | chuzr(csa, 0.30 * parm->tol_bnd); |
---|
| 2818 | break; |
---|
| 2819 | default: |
---|
| 2820 | xassert(parm != parm); |
---|
| 2821 | } |
---|
| 2822 | if (csa->p == 0) |
---|
| 2823 | { if (bbar_st != 1 || cbar_st != 1 || !rigorous) |
---|
| 2824 | { if (bbar_st != 1) bbar_st = 0; |
---|
| 2825 | if (cbar_st != 1) cbar_st = 0; |
---|
| 2826 | rigorous = 1; |
---|
| 2827 | goto loop; |
---|
| 2828 | } |
---|
| 2829 | display(csa, parm, 1); |
---|
| 2830 | switch (csa->phase) |
---|
| 2831 | { case 1: |
---|
| 2832 | if (parm->msg_lev >= GLP_MSG_ERR) |
---|
| 2833 | xprintf("Error: unable to choose basic variable on ph" |
---|
| 2834 | "ase I\n"); |
---|
| 2835 | xassert(!lp->valid && lp->bfd == NULL); |
---|
| 2836 | lp->bfd = csa->bfd, csa->bfd = NULL; |
---|
| 2837 | lp->pbs_stat = lp->dbs_stat = GLP_UNDEF; |
---|
| 2838 | lp->obj_val = 0.0; |
---|
| 2839 | lp->it_cnt = csa->it_cnt; |
---|
| 2840 | lp->some = 0; |
---|
| 2841 | ret = GLP_EFAIL; |
---|
| 2842 | break; |
---|
| 2843 | case 2: |
---|
| 2844 | if (parm->msg_lev >= GLP_MSG_ALL) |
---|
| 2845 | xprintf("PROBLEM HAS UNBOUNDED SOLUTION\n"); |
---|
| 2846 | store_sol(csa, lp, GLP_FEAS, GLP_NOFEAS, |
---|
| 2847 | csa->head[csa->m+csa->q]); |
---|
| 2848 | ret = 0; |
---|
| 2849 | break; |
---|
| 2850 | default: |
---|
| 2851 | xassert(csa != csa); |
---|
| 2852 | } |
---|
| 2853 | goto done; |
---|
| 2854 | } |
---|
| 2855 | /* check if the pivot element is acceptable */ |
---|
| 2856 | if (csa->p > 0) |
---|
| 2857 | { double piv = csa->tcol_vec[csa->p]; |
---|
| 2858 | double eps = 1e-5 * (1.0 + 0.01 * csa->tcol_max); |
---|
| 2859 | if (fabs(piv) < eps) |
---|
| 2860 | { if (parm->msg_lev >= GLP_MSG_DBG) |
---|
| 2861 | xprintf("piv = %.12g; eps = %g\n", piv, eps); |
---|
| 2862 | if (!rigorous) |
---|
| 2863 | { rigorous = 5; |
---|
| 2864 | goto loop; |
---|
| 2865 | } |
---|
| 2866 | } |
---|
| 2867 | } |
---|
| 2868 | /* now xN[q] and xB[p] have been chosen anyhow */ |
---|
| 2869 | /* compute pivot row of the simplex table */ |
---|
| 2870 | if (csa->p > 0) |
---|
| 2871 | { double *rho = csa->work4; |
---|
| 2872 | eval_rho(csa, rho); |
---|
| 2873 | if (rigorous) refine_rho(csa, rho); |
---|
| 2874 | eval_trow(csa, rho); |
---|
| 2875 | } |
---|
| 2876 | /* accuracy check based on the pivot element */ |
---|
| 2877 | if (csa->p > 0) |
---|
| 2878 | { double piv1 = csa->tcol_vec[csa->p]; /* more accurate */ |
---|
| 2879 | double piv2 = csa->trow_vec[csa->q]; /* less accurate */ |
---|
| 2880 | xassert(piv1 != 0.0); |
---|
| 2881 | if (fabs(piv1 - piv2) > 1e-8 * (1.0 + fabs(piv1)) || |
---|
| 2882 | !(piv1 > 0.0 && piv2 > 0.0 || piv1 < 0.0 && piv2 < 0.0)) |
---|
| 2883 | { if (parm->msg_lev >= GLP_MSG_DBG) |
---|
| 2884 | xprintf("piv1 = %.12g; piv2 = %.12g\n", piv1, piv2); |
---|
| 2885 | if (binv_st != 1 || !rigorous) |
---|
| 2886 | { if (binv_st != 1) binv_st = 0; |
---|
| 2887 | rigorous = 5; |
---|
| 2888 | goto loop; |
---|
| 2889 | } |
---|
| 2890 | /* use more accurate version in the pivot row */ |
---|
| 2891 | if (csa->trow_vec[csa->q] == 0.0) |
---|
| 2892 | { csa->trow_nnz++; |
---|
| 2893 | xassert(csa->trow_nnz <= csa->n); |
---|
| 2894 | csa->trow_ind[csa->trow_nnz] = csa->q; |
---|
| 2895 | } |
---|
| 2896 | csa->trow_vec[csa->q] = piv1; |
---|
| 2897 | } |
---|
| 2898 | } |
---|
| 2899 | /* update primal values of basic variables */ |
---|
| 2900 | update_bbar(csa); |
---|
| 2901 | bbar_st = 2; /* updated */ |
---|
| 2902 | /* update reduced costs of non-basic variables */ |
---|
| 2903 | if (csa->p > 0) |
---|
| 2904 | { update_cbar(csa); |
---|
| 2905 | cbar_st = 2; /* updated */ |
---|
| 2906 | /* on phase I objective coefficient of xB[p] in the adjacent |
---|
| 2907 | basis becomes zero */ |
---|
| 2908 | if (csa->phase == 1) |
---|
| 2909 | { int k = csa->head[csa->p]; /* x[k] = xB[p] -> xN[q] */ |
---|
| 2910 | csa->cbar[csa->q] -= csa->coef[k]; |
---|
| 2911 | csa->coef[k] = 0.0; |
---|
| 2912 | } |
---|
| 2913 | } |
---|
| 2914 | /* update steepest edge coefficients */ |
---|
| 2915 | if (csa->p > 0) |
---|
| 2916 | { switch (parm->pricing) |
---|
| 2917 | { case GLP_PT_STD: |
---|
| 2918 | break; |
---|
| 2919 | case GLP_PT_PSE: |
---|
| 2920 | if (csa->refct > 0) update_gamma(csa); |
---|
| 2921 | break; |
---|
| 2922 | default: |
---|
| 2923 | xassert(parm != parm); |
---|
| 2924 | } |
---|
| 2925 | } |
---|
| 2926 | /* update factorization of the basis matrix */ |
---|
| 2927 | if (csa->p > 0) |
---|
| 2928 | { ret = update_B(csa, csa->p, csa->head[csa->m+csa->q]); |
---|
| 2929 | if (ret == 0) |
---|
| 2930 | binv_st = 2; /* updated */ |
---|
| 2931 | else |
---|
| 2932 | { csa->valid = 0; |
---|
| 2933 | binv_st = 0; /* invalid */ |
---|
| 2934 | } |
---|
| 2935 | } |
---|
| 2936 | /* update matrix N */ |
---|
| 2937 | if (csa->p > 0) |
---|
| 2938 | { del_N_col(csa, csa->q, csa->head[csa->m+csa->q]); |
---|
| 2939 | if (csa->type[csa->head[csa->p]] != GLP_FX) |
---|
| 2940 | add_N_col(csa, csa->q, csa->head[csa->p]); |
---|
| 2941 | } |
---|
| 2942 | /* change the basis header */ |
---|
| 2943 | change_basis(csa); |
---|
| 2944 | /* iteration complete */ |
---|
| 2945 | csa->it_cnt++; |
---|
| 2946 | if (rigorous > 0) rigorous--; |
---|
| 2947 | goto loop; |
---|
| 2948 | done: /* deallocate the common storage area */ |
---|
| 2949 | free_csa(csa); |
---|
| 2950 | /* return to the calling program */ |
---|
| 2951 | return ret; |
---|
| 2952 | } |
---|
| 2953 | |
---|
| 2954 | /* eof */ |
---|