src/glpapi05.c
author Alpar Juttner <alpar@cs.elte.hu>
Sun, 05 Dec 2010 17:35:23 +0100
changeset 2 4c8956a7bdf4
permissions -rw-r--r--
Set up CMAKE build environment
     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 */