00001
00039 #ifndef ABA_SPARVEC_H
00040 #define ABA_SPARVEC_H
00041 #include <stdlib.h>
00042
00043 #include "abacus/array.h"
00044 #include "abacus/buffer.h"
00045
00046 #ifdef ABACUS_PARALLEL
00047 class ABA_MESSAGE;
00048 #endif
00049
00050 class ABA_SPARVEC : public ABA_ABACUSROOT {
00051 public:
00052
00067 ABA_SPARVEC(ABA_GLOBAL *glob,
00068 int size,
00069 double reallocFac = 10.0);
00070
00093 ABA_SPARVEC(ABA_GLOBAL *glob,
00094 int size,
00095 const ABA_ARRAY<int> &s,
00096 const ABA_ARRAY<double> &c,
00097 double reallocFac = 10.0);
00098
00103 ABA_SPARVEC(ABA_GLOBAL *glob,
00104 int size,
00105 int *s,
00106 double *c,
00107 double reallocFac = 10.0);
00108
00113 ABA_SPARVEC(const ABA_SPARVEC& rhs);
00114
00116 ~ABA_SPARVEC();
00117 #ifdef ABACUS_PARALLEL
00118
00126 ABA_SPARVEC(const ABA_GLOBAL *glob, ABA_MESSAGE &msg);
00127
00133 void pack(ABA_MESSAGE &msg) const;
00134 #endif
00135
00145 const ABA_SPARVEC& operator=(const ABA_SPARVEC& rhs);
00146
00156 friend ostream& operator<<(ostream& out, const ABA_SPARVEC& rhs);
00157
00165 int support(int i) const;
00166
00174 double coeff(int i) const;
00175
00180 double origCoeff(int i) const;
00181
00190 void insert(int s, double c);
00191
00201 void leftShift(ABA_BUFFER<int> &del);
00202
00210 void copy (const ABA_SPARVEC &vec);
00211
00214 void clear();
00215
00223 void rename(ABA_ARRAY<int> &newName);
00224
00227 int size() const;
00228
00234 int nnz() const;
00235
00238 double norm();
00239
00245 void realloc();
00246
00256 void realloc(int newSize);
00257 protected:
00258
00269 void rangeCheck(int i) const;
00270
00273 ABA_GLOBAL *glob_;
00274
00278 int size_;
00279
00282 int nnz_;
00283
00288 double reallocFac_;
00289
00292 int *support_;
00293
00296 double *coeff_;
00297 };
00298
00299
00300 inline int ABA_SPARVEC::support(int i) const
00301 {
00302 #ifdef ABACUSSAFE
00303 rangeCheck(i);
00304 #endif
00305 return support_[i];
00306 }
00307
00308 inline double ABA_SPARVEC::coeff(int i) const
00309 {
00310 #ifdef ABACUSSAFE
00311 rangeCheck(i);
00312 #endif
00313 return coeff_[i];
00314 }
00315
00316 inline void ABA_SPARVEC::insert(int s, double c)
00317 {
00318
00319 if (nnz_ == size_) realloc();
00320
00321 support_[nnz_] = s;
00322 coeff_[nnz_] = c;
00323 ++nnz_;
00324
00325 }
00326
00327 inline void ABA_SPARVEC::clear()
00328 {
00329 nnz_ = 0;
00330 }
00331
00332 inline int ABA_SPARVEC::size() const
00333 {
00334 return size_;
00335 }
00336
00337 inline int ABA_SPARVEC::nnz() const
00338 {
00339 return nnz_;
00340 }
00341
00342
00343 #endif // ABA_SPARVEC_H
00344