src/glpapi05.c
changeset 2 4c8956a7bdf4
equal deleted inserted replaced
-1:000000000000 0:8f423c43d2d8
       
     1 /* glpapi05.c (LP basis constructing routines) */
       
     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 "glpapi.h"
       
    26 
       
    27 /***********************************************************************
       
    28 *  NAME
       
    29 *
       
    30 *  glp_set_row_stat - set (change) row status
       
    31 *
       
    32 *  SYNOPSIS
       
    33 *
       
    34 *  void glp_set_row_stat(glp_prob *lp, int i, int stat);
       
    35 *
       
    36 *  DESCRIPTION
       
    37 *
       
    38 *  The routine glp_set_row_stat sets (changes) status of the auxiliary
       
    39 *  variable associated with i-th row.
       
    40 *
       
    41 *  The new status of the auxiliary variable should be specified by the
       
    42 *  parameter stat as follows:
       
    43 *
       
    44 *  GLP_BS - basic variable;
       
    45 *  GLP_NL - non-basic variable;
       
    46 *  GLP_NU - non-basic variable on its upper bound; if the variable is
       
    47 *           not double-bounded, this means the same as GLP_NL (only in
       
    48 *           case of this routine);
       
    49 *  GLP_NF - the same as GLP_NL (only in case of this routine);
       
    50 *  GLP_NS - the same as GLP_NL (only in case of this routine). */
       
    51 
       
    52 void glp_set_row_stat(glp_prob *lp, int i, int stat)
       
    53 {     GLPROW *row;
       
    54       if (!(1 <= i && i <= lp->m))
       
    55          xerror("glp_set_row_stat: i = %d; row number out of range\n",
       
    56             i);
       
    57       if (!(stat == GLP_BS || stat == GLP_NL || stat == GLP_NU ||
       
    58             stat == GLP_NF || stat == GLP_NS))
       
    59          xerror("glp_set_row_stat: i = %d; stat = %d; invalid status\n",
       
    60             i, stat);
       
    61       row = lp->row[i];
       
    62       if (stat != GLP_BS)
       
    63       {  switch (row->type)
       
    64          {  case GLP_FR: stat = GLP_NF; break;
       
    65             case GLP_LO: stat = GLP_NL; break;
       
    66             case GLP_UP: stat = GLP_NU; break;
       
    67             case GLP_DB: if (stat != GLP_NU) stat = GLP_NL; break;
       
    68             case GLP_FX: stat = GLP_NS; break;
       
    69             default: xassert(row != row);
       
    70          }
       
    71       }
       
    72       if (row->stat == GLP_BS && stat != GLP_BS ||
       
    73           row->stat != GLP_BS && stat == GLP_BS)
       
    74       {  /* invalidate the basis factorization */
       
    75          lp->valid = 0;
       
    76       }
       
    77       row->stat = stat;
       
    78       return;
       
    79 }
       
    80 
       
    81 /***********************************************************************
       
    82 *  NAME
       
    83 *
       
    84 *  glp_set_col_stat - set (change) column status
       
    85 *
       
    86 *  SYNOPSIS
       
    87 *
       
    88 *  void glp_set_col_stat(glp_prob *lp, int j, int stat);
       
    89 *
       
    90 *  DESCRIPTION
       
    91 *
       
    92 *  The routine glp_set_col_stat sets (changes) status of the structural
       
    93 *  variable associated with j-th column.
       
    94 *
       
    95 *  The new status of the structural variable should be specified by the
       
    96 *  parameter stat as follows:
       
    97 *
       
    98 *  GLP_BS - basic variable;
       
    99 *  GLP_NL - non-basic variable;
       
   100 *  GLP_NU - non-basic variable on its upper bound; if the variable is
       
   101 *           not double-bounded, this means the same as GLP_NL (only in
       
   102 *           case of this routine);
       
   103 *  GLP_NF - the same as GLP_NL (only in case of this routine);
       
   104 *  GLP_NS - the same as GLP_NL (only in case of this routine). */
       
   105 
       
   106 void glp_set_col_stat(glp_prob *lp, int j, int stat)
       
   107 {     GLPCOL *col;
       
   108       if (!(1 <= j && j <= lp->n))
       
   109          xerror("glp_set_col_stat: j = %d; column number out of range\n"
       
   110             , j);
       
   111       if (!(stat == GLP_BS || stat == GLP_NL || stat == GLP_NU ||
       
   112             stat == GLP_NF || stat == GLP_NS))
       
   113          xerror("glp_set_col_stat: j = %d; stat = %d; invalid status\n",
       
   114             j, stat);
       
   115       col = lp->col[j];
       
   116       if (stat != GLP_BS)
       
   117       {  switch (col->type)
       
   118          {  case GLP_FR: stat = GLP_NF; break;
       
   119             case GLP_LO: stat = GLP_NL; break;
       
   120             case GLP_UP: stat = GLP_NU; break;
       
   121             case GLP_DB: if (stat != GLP_NU) stat = GLP_NL; break;
       
   122             case GLP_FX: stat = GLP_NS; break;
       
   123             default: xassert(col != col);
       
   124          }
       
   125       }
       
   126       if (col->stat == GLP_BS && stat != GLP_BS ||
       
   127           col->stat != GLP_BS && stat == GLP_BS)
       
   128       {  /* invalidate the basis factorization */
       
   129          lp->valid = 0;
       
   130       }
       
   131       col->stat = stat;
       
   132       return;
       
   133 }
       
   134 
       
   135 /***********************************************************************
       
   136 *  NAME
       
   137 *
       
   138 *  glp_std_basis - construct standard initial LP basis
       
   139 *
       
   140 *  SYNOPSIS
       
   141 *
       
   142 *  void glp_std_basis(glp_prob *lp);
       
   143 *
       
   144 *  DESCRIPTION
       
   145 *
       
   146 *  The routine glp_std_basis builds the "standard" (trivial) initial
       
   147 *  basis for the specified problem object.
       
   148 *
       
   149 *  In the "standard" basis all auxiliary variables are basic, and all
       
   150 *  structural variables are non-basic. */
       
   151 
       
   152 void glp_std_basis(glp_prob *lp)
       
   153 {     int i, j;
       
   154       /* make all auxiliary variables basic */
       
   155       for (i = 1; i <= lp->m; i++)
       
   156          glp_set_row_stat(lp, i, GLP_BS);
       
   157       /* make all structural variables non-basic */
       
   158       for (j = 1; j <= lp->n; j++)
       
   159       {  GLPCOL *col = lp->col[j];
       
   160          if (col->type == GLP_DB && fabs(col->lb) > fabs(col->ub))
       
   161             glp_set_col_stat(lp, j, GLP_NU);
       
   162          else
       
   163             glp_set_col_stat(lp, j, GLP_NL);
       
   164       }
       
   165       return;
       
   166 }
       
   167 
       
   168 /* eof */