00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef DOUBLE_HASHED_MATRIX_HPP
00024 #define DOUBLE_HASHED_MATRIX_HPP
00025
00026 #include <BaseMatrix.hpp>
00027 #include <Vector.hpp>
00028
00029 #include <Types.hpp>
00030 #include <ErrorHandler.hpp>
00031
00032 #include <map>
00033 #include <vector>
00034
00042 class DoubleHashedMatrix
00043 : public BaseMatrix
00044 {
00045
00046 private:
00055 class DoubleEntry
00056 {
00057 private:
00058 size_t __i;
00059 size_t __j;
00060 public:
00061
00062 bool operator<(const DoubleEntry& d) const
00063 {
00064 return ((__i < d.__i)
00065 ||((__i == d.__i)
00066 &&(__j < d.__j)));
00067 }
00068
00069 DoubleEntry(const DoubleEntry& d)
00070 : __i(d.__i),
00071 __j(d.__j)
00072 {
00073 ;
00074 }
00075
00076 DoubleEntry(size_t i, size_t j)
00077 : __i(i),
00078 __j(j)
00079 {
00080 ;
00081 }
00082
00083 ~DoubleEntry()
00084 {
00085 ;
00086 }
00087 };
00088 public:
00097 class iterator
00098 {
00099 private:
00100 typedef std::map<size_t, real_t*>::iterator Iterator;
00101 Iterator __i;
00102 public:
00103 const iterator& operator=(const iterator::Iterator& i)
00104 {
00105 __i=i;
00106 return (*this);
00107 }
00108
00109 inline bool operator != (const iterator::Iterator& i) const
00110 {
00111 return (i!=__i);
00112 }
00113
00114 const iterator operator++()
00115 {
00116 __i++;
00117 return (*this);
00118 }
00119
00120 const iterator& operator++(int)
00121 {
00122 ++__i;
00123 return (*this);
00124 }
00125
00126 const iterator& operator--()
00127 {
00128 __i++;
00129 return (*this);
00130 }
00131
00132 size_t first()
00133 {
00134 return ((*__i).first);
00135 }
00136
00137 real_t& second()
00138 {
00139 return (*(*__i).second);
00140 }
00141
00142 iterator(std::map<size_t, real_t*>::iterator i)
00143 : __i(i)
00144 {
00145 ;
00146 }
00147 };
00148
00149
00158 class const_iterator
00159 {
00160 private:
00161 typedef std::map<size_t, real_t*>::const_iterator ConstIterator;
00162 ConstIterator __i;
00163 public:
00164 const const_iterator& operator=(const ConstIterator& i)
00165 {
00166 __i=i;
00167 return (*this);
00168 }
00169
00170 inline bool operator != (const ConstIterator& i) const
00171 {
00172 return (i!=__i);
00173 }
00174
00175 const_iterator operator++()
00176 {
00177 __i++;
00178 return (*this);
00179 }
00180
00181 const_iterator operator++(int)
00182 {
00183 ++__i;
00184 return (*this);
00185 }
00186
00187 const_iterator& operator--()
00188 {
00189 __i++;
00190 return (*this);
00191 }
00192
00193 const size_t& first() const
00194 {
00195 return ((*__i).first);
00196 }
00197
00198 const real_t& second() const
00199 {
00200 return (*(*__i).second);
00201 }
00202
00203 const_iterator(std::map<size_t, real_t*>::const_iterator i)
00204 : __i(i)
00205 {
00206 ;
00207 }
00208 };
00209
00210 private:
00212 std::vector<std::map<size_t,real_t*> > __lines;
00213
00215 std::vector<std::map<size_t,real_t*> > __columns;
00216
00218 std::map<DoubleEntry, real_t> __elements;
00219 public:
00220 size_t numberOfColumns() const
00221 {
00222 return __columns.size();
00223 }
00224
00225 std::map<size_t,real_t*>::iterator beginOfColumn(const size_t& i)
00226 {
00227 ASSERT (i<__columns.size());
00228 return __columns[i].begin();
00229 }
00230
00231 std::map<size_t,real_t*>::iterator endOfColumn(const size_t& i)
00232 {
00233 ASSERT (i<__columns.size());
00234 return __columns[i].end();
00235 }
00236
00237 size_t numberOfLines() const
00238 {
00239 return __lines.size();
00240 }
00241
00242 std::map<size_t,real_t*>::iterator beginOfLine(const size_t& i)
00243 {
00244 ASSERT (i<__lines.size());
00245 return __lines[i].begin();
00246 }
00247
00248 std::map<size_t,real_t*>::iterator endOfLine(const size_t& i)
00249 {
00250 ASSERT (i<__lines.size());
00251 return __lines[i].end();
00252 }
00253
00254 std::map<size_t,real_t*>::const_iterator beginOfLine(const size_t& i) const
00255 {
00256 ASSERT (i<__lines.size());
00257 return __lines[i].begin();
00258 }
00259
00260 std::map<size_t,real_t*>::const_iterator endOfLine(const size_t& i) const
00261 {
00262 ASSERT (i<__lines.size());
00263 return __lines[i].end();
00264 }
00265
00266 size_t numberOfLineNonNull(const size_t& i) const
00267 {
00268 return __lines[i].size();
00269 }
00270
00271 void reset()
00272 {
00273 __lines.clear();
00274 __columns.clear();
00275 __elements.clear();
00276 }
00277
00278 void getDiagonal(BaseVector& X) const
00279 {
00280 throw ErrorHandler(__FILE__, __LINE__,
00281 "not implemented",
00282 ErrorHandler::unexpected);
00283 }
00284
00285 void transposedTimesX(const BaseVector& X, BaseVector& Z) const
00286 {
00287 throw ErrorHandler(__FILE__, __LINE__,
00288 "not implemented",
00289 ErrorHandler::unexpected);
00290 }
00291
00293 void timesX(const BaseVector& X,
00294 BaseVector& Z) const
00295 {
00296 const Vector<real_t>& x =dynamic_cast<const Vector<real_t>&>(X);
00297 Vector<real_t>& z =dynamic_cast<Vector<real_t>&>(Z);
00298 z=0;
00299 for (size_t i=0; i<this->numberOfLines(); ++i) {
00300 for(std::map<size_t,real_t*>::const_iterator j = this->beginOfLine(i);
00301 j != this->endOfLine(i); ++j) {
00302 z[i] += (*(*j).second)*x[(*j).first];
00303 }
00304 }
00305 }
00306
00307 DoubleHashedMatrix(const size_t& i, const size_t& j)
00308 : BaseMatrix(BaseMatrix::doubleHashedMatrix,i)
00309 {
00310 __lines.resize(i);
00311 __columns.resize(j);
00312 }
00313
00314 real_t& operator()(const size_t& i, const size_t& j)
00315 {
00316 ASSERT ((i<__lines.size())&&(j<__columns.size()));
00317
00318
00319 std::map<DoubleEntry, real_t>::iterator elem
00320 = __elements.find(DoubleEntry(i,j));
00321
00322 if (elem != __elements.end()) {
00323 return (*elem).second;
00324 } else {
00325
00326 __lines[i][j] = __columns[j][i] = &__elements[DoubleEntry(i,j)];
00327
00328 return __elements[DoubleEntry(i,j)];
00329 }
00330 }
00331
00332 ~DoubleHashedMatrix()
00333 {
00334 ;
00335 }
00336 };
00337
00338 #endif // _DOUBLE_HASHED_MATRIX_HPP_
00339