src/glpfhv.h
author Alpar Juttner <alpar@cs.elte.hu>
Mon, 06 Dec 2010 13:09:21 +0100
changeset 1 c445c931472f
permissions -rw-r--r--
Import glpk-4.45

- Generated files and doc/notes are removed
alpar@1
     1
/* glpfhv.h (LP basis factorization, FHV eta file version) */
alpar@1
     2
alpar@1
     3
/***********************************************************************
alpar@1
     4
*  This code is part of GLPK (GNU Linear Programming Kit).
alpar@1
     5
*
alpar@1
     6
*  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
alpar@1
     7
*  2009, 2010 Andrew Makhorin, Department for Applied Informatics,
alpar@1
     8
*  Moscow Aviation Institute, Moscow, Russia. All rights reserved.
alpar@1
     9
*  E-mail: <mao@gnu.org>.
alpar@1
    10
*
alpar@1
    11
*  GLPK is free software: you can redistribute it and/or modify it
alpar@1
    12
*  under the terms of the GNU General Public License as published by
alpar@1
    13
*  the Free Software Foundation, either version 3 of the License, or
alpar@1
    14
*  (at your option) any later version.
alpar@1
    15
*
alpar@1
    16
*  GLPK is distributed in the hope that it will be useful, but WITHOUT
alpar@1
    17
*  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
alpar@1
    18
*  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
alpar@1
    19
*  License for more details.
alpar@1
    20
*
alpar@1
    21
*  You should have received a copy of the GNU General Public License
alpar@1
    22
*  along with GLPK. If not, see <http://www.gnu.org/licenses/>.
alpar@1
    23
***********************************************************************/
alpar@1
    24
alpar@1
    25
#ifndef GLPFHV_H
alpar@1
    26
#define GLPFHV_H
alpar@1
    27
alpar@1
    28
#include "glpluf.h"
alpar@1
    29
alpar@1
    30
/***********************************************************************
alpar@1
    31
*  The structure FHV defines the factorization of the basis mxm-matrix
alpar@1
    32
*  B, where m is the number of rows in corresponding problem instance.
alpar@1
    33
*
alpar@1
    34
*  This factorization is the following sextet:
alpar@1
    35
*
alpar@1
    36
*     [B] = (F, H, V, P0, P, Q),                                     (1)
alpar@1
    37
*
alpar@1
    38
*  where F, H, and V are such matrices that
alpar@1
    39
*
alpar@1
    40
*     B = F * H * V,                                                 (2)
alpar@1
    41
*
alpar@1
    42
*  and P0, P, and Q are such permutation matrices that the matrix
alpar@1
    43
*
alpar@1
    44
*     L = P0 * F * inv(P0)                                           (3)
alpar@1
    45
*
alpar@1
    46
*  is lower triangular with unity diagonal, and the matrix
alpar@1
    47
*
alpar@1
    48
*     U = P * V * Q                                                  (4)
alpar@1
    49
*
alpar@1
    50
*  is upper triangular. All the matrices have the same order m, which
alpar@1
    51
*  is the order of the basis matrix B.
alpar@1
    52
*
alpar@1
    53
*  The matrices F, V, P, and Q are stored in the structure LUF (see the
alpar@1
    54
*  module GLPLUF), which is a member of the structure FHV.
alpar@1
    55
*
alpar@1
    56
*  The matrix H is stored in the form of eta file using row-like format
alpar@1
    57
*  as follows:
alpar@1
    58
*
alpar@1
    59
*     H = H[1] * H[2] * ... * H[nfs],                                (5)
alpar@1
    60
*
alpar@1
    61
*  where H[k], k = 1, 2, ..., nfs, is a row-like factor, which differs
alpar@1
    62
*  from the unity matrix only by one row, nfs is current number of row-
alpar@1
    63
*  like factors. After the factorization has been built for some given
alpar@1
    64
*  basis matrix B the matrix H has no factors and thus it is the unity
alpar@1
    65
*  matrix. Then each time when the factorization is recomputed for an
alpar@1
    66
*  adjacent basis matrix, the next factor H[k], k = 1, 2, ... is built
alpar@1
    67
*  and added to the end of the eta file H.
alpar@1
    68
*
alpar@1
    69
*  Being sparse vectors non-trivial rows of the factors H[k] are stored
alpar@1
    70
*  in the right part of the sparse vector area (SVA) in the same manner
alpar@1
    71
*  as rows and columns of the matrix F.
alpar@1
    72
*
alpar@1
    73
*  For more details see the program documentation. */
alpar@1
    74
alpar@1
    75
typedef struct FHV FHV;
alpar@1
    76
alpar@1
    77
struct FHV
alpar@1
    78
{     /* LP basis factorization */
alpar@1
    79
      int m_max;
alpar@1
    80
      /* maximal value of m (increased automatically, if necessary) */
alpar@1
    81
      int m;
alpar@1
    82
      /* the order of matrices B, F, H, V, P0, P, Q */
alpar@1
    83
      int valid;
alpar@1
    84
      /* the factorization is valid only if this flag is set */
alpar@1
    85
      LUF *luf;
alpar@1
    86
      /* LU-factorization (contains the matrices F, V, P, Q) */
alpar@1
    87
      /*--------------------------------------------------------------*/
alpar@1
    88
      /* matrix H in the form of eta file */
alpar@1
    89
      int hh_max;
alpar@1
    90
      /* maximal number of row-like factors (which limits the number of
alpar@1
    91
         updates of the factorization) */
alpar@1
    92
      int hh_nfs;
alpar@1
    93
      /* current number of row-like factors (0 <= hh_nfs <= hh_max) */
alpar@1
    94
      int *hh_ind; /* int hh_ind[1+hh_max]; */
alpar@1
    95
      /* hh_ind[k], k = 1, ..., nfs, is the number of a non-trivial row
alpar@1
    96
         of factor H[k] */
alpar@1
    97
      int *hh_ptr; /* int hh_ptr[1+hh_max]; */
alpar@1
    98
      /* hh_ptr[k], k = 1, ..., nfs, is a pointer to the first element
alpar@1
    99
         of the non-trivial row of factor H[k] in the SVA */
alpar@1
   100
      int *hh_len; /* int hh_len[1+hh_max]; */
alpar@1
   101
      /* hh_len[k], k = 1, ..., nfs, is the number of non-zero elements
alpar@1
   102
         in the non-trivial row of factor H[k] */
alpar@1
   103
      /*--------------------------------------------------------------*/
alpar@1
   104
      /* matrix P0 */
alpar@1
   105
      int *p0_row; /* int p0_row[1+m_max]; */
alpar@1
   106
      /* p0_row[i] = j means that p0[i,j] = 1 */
alpar@1
   107
      int *p0_col; /* int p0_col[1+m_max]; */
alpar@1
   108
      /* p0_col[j] = i means that p0[i,j] = 1 */
alpar@1
   109
      /* if i-th row or column of the matrix F corresponds to i'-th row
alpar@1
   110
         or column of the matrix L = P0*F*inv(P0), then p0_row[i'] = i
alpar@1
   111
         and p0_col[i] = i' */
alpar@1
   112
      /*--------------------------------------------------------------*/
alpar@1
   113
      /* working arrays */
alpar@1
   114
      int *cc_ind; /* int cc_ind[1+m_max]; */
alpar@1
   115
      /* integer working array */
alpar@1
   116
      double *cc_val; /* double cc_val[1+m_max]; */
alpar@1
   117
      /* floating-point working array */
alpar@1
   118
      /*--------------------------------------------------------------*/
alpar@1
   119
      /* control parameters */
alpar@1
   120
      double upd_tol;
alpar@1
   121
      /* update tolerance; if after updating the factorization absolute
alpar@1
   122
         value of some diagonal element u[k,k] of matrix U = P*V*Q is
alpar@1
   123
         less than upd_tol * max(|u[k,*]|, |u[*,k]|), the factorization
alpar@1
   124
         is considered as inaccurate */
alpar@1
   125
      /*--------------------------------------------------------------*/
alpar@1
   126
      /* some statistics */
alpar@1
   127
      int nnz_h;
alpar@1
   128
      /* current number of non-zeros in all factors of matrix H */
alpar@1
   129
};
alpar@1
   130
alpar@1
   131
/* return codes: */
alpar@1
   132
#define FHV_ESING    1  /* singular matrix */
alpar@1
   133
#define FHV_ECOND    2  /* ill-conditioned matrix */
alpar@1
   134
#define FHV_ECHECK   3  /* insufficient accuracy */
alpar@1
   135
#define FHV_ELIMIT   4  /* update limit reached */
alpar@1
   136
#define FHV_EROOM    5  /* SVA overflow */
alpar@1
   137
alpar@1
   138
#define fhv_create_it _glp_fhv_create_it
alpar@1
   139
FHV *fhv_create_it(void);
alpar@1
   140
/* create LP basis factorization */
alpar@1
   141
alpar@1
   142
#define fhv_factorize _glp_fhv_factorize
alpar@1
   143
int fhv_factorize(FHV *fhv, int m, int (*col)(void *info, int j,
alpar@1
   144
      int ind[], double val[]), void *info);
alpar@1
   145
/* compute LP basis factorization */
alpar@1
   146
alpar@1
   147
#define fhv_h_solve _glp_fhv_h_solve
alpar@1
   148
void fhv_h_solve(FHV *fhv, int tr, double x[]);
alpar@1
   149
/* solve system H*x = b or H'*x = b */
alpar@1
   150
alpar@1
   151
#define fhv_ftran _glp_fhv_ftran
alpar@1
   152
void fhv_ftran(FHV *fhv, double x[]);
alpar@1
   153
/* perform forward transformation (solve system B*x = b) */
alpar@1
   154
alpar@1
   155
#define fhv_btran _glp_fhv_btran
alpar@1
   156
void fhv_btran(FHV *fhv, double x[]);
alpar@1
   157
/* perform backward transformation (solve system B'*x = b) */
alpar@1
   158
alpar@1
   159
#define fhv_update_it _glp_fhv_update_it
alpar@1
   160
int fhv_update_it(FHV *fhv, int j, int len, const int ind[],
alpar@1
   161
      const double val[]);
alpar@1
   162
/* update LP basis factorization */
alpar@1
   163
alpar@1
   164
#define fhv_delete_it _glp_fhv_delete_it
alpar@1
   165
void fhv_delete_it(FHV *fhv);
alpar@1
   166
/* delete LP basis factorization */
alpar@1
   167
alpar@1
   168
#endif
alpar@1
   169
alpar@1
   170
/* eof */