Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

CoinPackedVectorBase.hpp

00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 #ifndef CoinPackedVectorBase_H
00004 #define CoinPackedVectorBase_H
00005 
00006 #if defined(_MSC_VER)
00007 // Turn off compiler warning about long names
00008 #  pragma warning(disable:4786)
00009 #endif
00010 
00011 #include <set>
00012 #include <map>
00013 #include "CoinError.hpp"
00014 #include "CoinFloatEqual.hpp"
00015 
00016 class CoinPackedVector;
00017 
00025 class CoinPackedVectorBase  {
00026   
00027 public:
00030 
00031    virtual int getNumElements() const = 0;
00033    virtual const int * getIndices() const = 0;
00035    virtual const double * getElements() const = 0;
00037 
00049    void setTestForDuplicateIndex(bool test) const;
00052    bool testForDuplicateIndex() const { return testForDuplicateIndex_; }
00054 
00062    double * denseVector(int denseSize) const throw(CoinError);
00070    double operator[](int i) const throw(CoinError); 
00072 
00075 
00076    int getMaxIndex() const;
00078    int getMinIndex() const;
00079 
00081    void duplicateIndex(const char* methodName = NULL,
00082                        const char * className = NULL)  const throw(CoinError);
00083 
00086    bool isExistingIndex(int i) const;
00087    
00090    int findIndex(int i) const;
00091  
00093   
00098    bool operator==(const CoinPackedVectorBase & rhs) const;
00100    bool operator!=(const CoinPackedVectorBase & rhs) const;
00101 
00109    template <class FloatEqual> bool
00110    isEquivalent(const CoinPackedVectorBase& rhs, const FloatEqual& eq) const
00111       throw(CoinError)
00112    {
00113       if (getNumElements() != rhs.getNumElements())
00114          return false;
00115 
00116       duplicateIndex("equivalent", "CoinPackedVector");
00117       rhs.duplicateIndex("equivalent", "CoinPackedVector");
00118 
00119       std::map<int,double> mv;
00120       const int * inds = getIndices();
00121       const double * elems = getElements();
00122       int i;
00123       for ( i = getNumElements() - 1; i >= 0; --i) {
00124          mv.insert(std::make_pair(inds[i], elems[i]));
00125       }
00126 
00127       std::map<int,double> mvRhs;
00128       inds = rhs.getIndices();
00129       elems = rhs.getElements();
00130       for ( i = getNumElements() - 1; i >= 0; --i) {
00131          mvRhs.insert(std::make_pair(inds[i], elems[i]));
00132       }
00133 
00134       std::map<int,double>::const_iterator mvI = mv.begin();
00135       std::map<int,double>::const_iterator mvIlast = mv.end();
00136       std::map<int,double>::const_iterator mvIrhs = mvRhs.begin();
00137       while (mvI != mvIlast) {
00138          if (mvI->first != mvIrhs->first || ! eq(mvI->second, mvIrhs->second))
00139             return false;
00140          ++mvI;
00141          ++mvIrhs;
00142       }
00143       return true;
00144    }
00145    bool isEquivalent(const CoinPackedVectorBase& rhs) const
00146    {
00147       return isEquivalent(rhs,  CoinRelFltEq());
00148    }
00150 
00151 
00154 
00155    double dotProduct(const double* dense) const;
00156 
00158    double oneNorm() const;
00159 
00161    double normSquare() const;
00162 
00164    inline double twoNorm() const { return sqrt(normSquare()); }
00165 
00167    double infNorm() const;
00168 
00170    double sum() const;
00172 
00173 protected:
00174 
00180    CoinPackedVectorBase();
00181 
00182 public:
00184    virtual ~CoinPackedVectorBase();
00186 
00187 private:
00196    CoinPackedVectorBase(const CoinPackedVectorBase&);
00199    CoinPackedVectorBase& operator=(const CoinPackedVectorBase&);
00201    
00202 protected:
00203     
00206 
00207    void findMaxMinIndices() const;
00208 
00210    std::set<int> * indexSet(const char* methodName = NULL,
00211                             const char * className = NULL) const
00212       throw(CoinError);
00213 
00215    void clearIndexSet() const;
00216    void clearBase() const;
00217    void copyMaxMinIndex(const CoinPackedVectorBase & x) const {
00218       maxIndex_ = x.maxIndex_;
00219       minIndex_ = x.minIndex_;
00220    }
00222     
00223 private:
00226 
00227    mutable int maxIndex_;
00229    mutable int minIndex_;
00233    mutable std::set<int> * indexSetPtr_;
00236    mutable bool testForDuplicateIndex_;
00239    mutable bool testedDuplicateIndex_;
00241 };
00242 
00243 #endif

Generated on Wed Dec 3 14:34:21 2003 for Coin by doxygen 1.3.5