COIN-OR::LEMON - Graph Library

source: glpk-cmake/src/glpapi05.c @ 1:c445c931472f

Last change on this file since 1:c445c931472f was 1:c445c931472f, checked in by Alpar Juttner <alpar@…>, 13 years ago

Import glpk-4.45

  • Generated files and doc/notes are removed
File size: 5.6 KB
Line 
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
52void 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
106void 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
152void 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 */
Note: See TracBrowser for help on using the repository browser.