// // $Source: /cvsroot/gambit/gambit/sources/tools/lp/basis.cc,v $ // $Date: 2006/01/07 06:37:34 $ // $Revision: 1.3 $ // // DESCRIPTION: // Implementation of Basis class // // This file is part of Gambit // Copyright (c) 2002, The Gambit Project // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // #include "basis.h" // --------------------------------------------------------------------------- // Class Basis // --------------------------------------------------------------------------- // ----------------------- // C-tor, D-tor, Operators // ----------------------- Basis::Basis(int first, int last, int firstlabel, int lastlabel) : basis(first, last), cols(firstlabel, lastlabel), slacks(first, last), colBlocked(firstlabel,lastlabel), rowBlocked(first,last) { int i; for(i = cols.First(); i <= cols.Last(); i++) { cols[i] = 0; colBlocked[i] = false; } for(i = basis.First(); i <= basis.Last(); i++) { basis[i]= - i; slacks[i] = i; rowBlocked[i] = false; } IsBasisIdent = true; } Basis::Basis(const Basis &bas) : basis(bas.basis), cols( bas.cols ), slacks( bas.slacks ), colBlocked(bas.colBlocked), rowBlocked(bas.rowBlocked), IsBasisIdent(bas.IsBasisIdent) { } Basis::~Basis() { } Basis& Basis::operator=(const Basis &orig) { if(this != &orig) { basis = orig.basis; cols = orig.cols; slacks = orig.slacks; rowBlocked = orig.rowBlocked; colBlocked = orig.colBlocked; IsBasisIdent = orig.IsBasisIdent; } return *this; } // ------------------------- // Public Members // ------------------------- int Basis::First() const { return basis.First();} int Basis::Last() const { return basis.Last();} int Basis::MinCol() const { return cols.First();} int Basis::MaxCol() const { return cols.Last();} bool Basis::IsRegColumn( int col ) const {return col >= cols.First() && col <= cols.Last();} bool Basis::IsSlackColumn( int col ) const {return -col >= basis.First() && -col <= basis.Last();} int Basis::Pivot(int outindex, int col) { int outlabel = basis[outindex]; if (IsSlackColumn(col)) slacks[-col] = outindex; else if (IsRegColumn(col)) cols[col] = outindex; else throw Gambit::IndexException(); // not a valid column to pivot in. if (IsSlackColumn(outlabel)) slacks[-outlabel] = 0; else if (IsRegColumn(outlabel)) cols[outlabel] = 0; else { // Note: here, should back out outindex. throw Gambit::IndexException(); // not a valid column to pivot out. } basis[outindex] = col; CheckBasis(); return outlabel; } bool Basis::Member( int col ) const { int ret; if (IsSlackColumn(col)) ret = slacks[-col]; else if (IsRegColumn(col)) ret = cols[col]; else ret = 0; return (ret != 0); } int Basis::Find( int col ) const { int ret; if ( IsSlackColumn(col)) ret = slacks[-col]; else if (IsRegColumn(col)) ret = cols[col]; else throw Gambit::IndexException(); return ret; } int Basis::Label(int index) const { return basis[index]; } void Basis::Mark(int col ) { if (IsSlackColumn(col)) rowBlocked[-col] = true; else if (IsRegColumn(col)) colBlocked[col] = true; } void Basis::UnMark(int col ) { if (IsSlackColumn(col)) rowBlocked[-col] = false; else if (IsRegColumn(col)) colBlocked[col] = false; } bool Basis::IsBlocked(int col) const { if (IsSlackColumn(col)) return rowBlocked[-col]; else if (IsRegColumn(col)) return colBlocked[col]; return false; } void Basis::CheckBasis() { bool check = true; for (int i =basis.First(); i <= basis.Last() && check; i++) if(basis[i] != -i) check = false; IsBasisIdent = check; } bool Basis::IsIdent() { return IsBasisIdent; }