00001
00002
00003 #ifndef CoinPackedVectorBase_H
00004 #define CoinPackedVectorBase_H
00005
00006 #if defined(_MSC_VER)
00007
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