*** empty log message ***

This commit is contained in:
jiri 2009-11-11 20:46:21 +00:00
parent b7d1d691b7
commit eda9171eee

View File

@ -27,6 +27,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include "la_traits.h"
#include "sparsemat.h"
#include "vec.h"
#include "mat.h"
@ -50,28 +51,37 @@ protected:
int *count;
public:
SparseSMat() : nn(0), v(NULL), count(NULL) {};
SparseSMat(const SPMatindex n);
explicit SparseSMat(const SPMatindex n); //prevent double -> int -> SparseSMat
SparseSMat(const SparseSMat &rhs);
SparseSMat(const SparseMat<T> &rhs);
SparseSMat(const NRSMat<T> &rhs);
explicit SparseSMat(const SparseMat<T> &rhs);
explicit SparseSMat(const NRSMat<T> &rhs);
SparseSMat & operator=(const SparseSMat &rhs);
void copyonwrite();
void resize(const SPMatindex n);
void clear() {resize(nn);}
void simplify();
~SparseSMat();
inline int getcount() const {return count?*count:0;}
//
SparseSMat & operator=(const T a); //assign a to diagonal
SparseSMat & operator+=(const T a); //assign a to diagonal
SparseSMat & operator-=(const T a); //assign a to diagonal
SparseSMat & operator*=(const T a); //multiply by a scalar
inline const SparseSMat operator+(const T &rhs) const {return SparseSMat(*this) += rhs;}
inline const SparseSMat operator-(const T &rhs) const {return SparseSMat(*this) -= rhs;}
inline const SparseSMat operator*(const T &rhs) const {return SparseSMat(*this) *= rhs;}
inline const SparseSMat operator+(const SparseSMat &rhs) const {return SparseSMat(*this) += rhs;}
inline const SparseSMat operator-(const SparseSMat &rhs) const {return SparseSMat(*this) -= rhs;}
inline const SparseSMat operator*(const SparseSMat &rhs) const; //!!!NOT A GENERAL ROUTINE, JUST FOR THE CASES WHEN THE RESULT STAYS SYMMETRIC
SparseSMat & operator=(const T &a); //assign a to diagonal
SparseSMat & operator+=(const T &a); //assign a to diagonal
SparseSMat & operator-=(const T &a); //assign a to diagonal
SparseSMat & operator*=(const T &a); //multiply by a scalar
SparseSMat & operator+=(const SparseSMat &rhs);
SparseSMat & operator-=(const SparseSMat &rhs);
void gemv(const T beta, NRVec<T> &r, const char trans, const T alpha, const NRVec<T> &x) const;
const SparseSMat operator*(const SparseSMat &rhs) const; //!!!NOT A GENERAL ROUTINE, JUST FOR THE CASES WHEN THE RESULT STAYS SYMMETRIC
void axpy(const T alpha, const SparseSMat &x, const bool transp=0); // this+= a*x
const typename LA_traits<T>::normtype norm(const T scalar=(T)0) const;
void add(const SPMatindex n, const SPMatindex m, const T elem, const bool both=true);
unsigned int length() const;
void transposeme() const {};
int nrows() const {return nn;}
int ncols() const {return nn;}
@ -145,6 +155,17 @@ v= new std::map<SPMatindex,T> * [n];
memset(v,0,nn*sizeof(std::map<SPMatindex,T> *));
}
template <typename T>
SparseSMat<T>::SparseSMat(const NRSMat<T> &rhs)
:nn(rhs.nrows()),
count(new int(1))
{
v= new std::map<SPMatindex,T> * [nn];
memset(v,0,nn*sizeof(std::map<SPMatindex,T> *));
int i,j;
for(i=0; i<nn; ++i) for(j=0; j<=i; ++j) if(std::abs(rhs(i,j))>SPARSEEPSILON) (*this).add(i,j,rhs(i,j),true);
}
template <typename T>
SparseSMat<T>::SparseSMat(const SparseSMat &rhs)
{
@ -154,6 +175,20 @@ count = rhs.count;
if(count) (*count)++;
}
//NRSMat from SparseSMat
#define nn2 (nn*(nn+1)/2)
template <typename T>
NRSMat<T>::NRSMat(const SparseSMat<T> &rhs)
: nn(rhs.nrows())
{
count = new int(1);
v=new T[nn2];
memset(v,0,nn2*sizeof(T));
typename SparseSMat<T>::iterator p(rhs);
for(; p.notend(); ++p) if(p->row <= p->col) (*this)(p->row,p->col)=p->elem;
}
#undef nn2
template <typename T>
SparseSMat<T>::~SparseSMat()
@ -231,6 +266,7 @@ SparseSMat<T> & SparseSMat<T>::operator=(const SparseSMat &rhs)
return *this;
}
template <typename T>
void SparseSMat<T>::copyonwrite()
{
@ -240,9 +276,9 @@ void SparseSMat<T>::copyonwrite()
(*count)--;
count = new int;
*count = 1;
std::map<SPMatindex,T> *newv= new std::map<SPMatindex,T> * [nn];
typename std::map<SPMatindex,T> **newv= new std::map<SPMatindex,T> * [nn];
for(SPMatindex i=0; i<nn; ++i) if(v[i])
newv[i]= new std::map<SPMatindex,T>(*(v[i])); //deep copy of each map
newv[i]= new typename std::map<SPMatindex,T>(*(v[i])); //deep copy of each map
else
newv[i]= NULL;
v = newv;
@ -298,11 +334,7 @@ std::ostream & operator<<(std::ostream &s, const SparseSMat<T> &x)
s << n << " "<< n<< std::endl;
typename SparseSMat<T>::iterator p(x);
for(;
p.notend();
++p)
s << (int)p->row << ' ' << (int)p->col << ' ' << (typename LA_traits_io<T>::IOtype) p->elem << '\n';
for(; p.notend(); ++p) s << (int)p->row << ' ' << (int)p->col << ' ' << (typename LA_traits_io<T>::IOtype) p->elem << '\n';
s << "-1 -1\n";
return s;
}
@ -328,7 +360,4 @@ std::istream& operator>>(std::istream &s, SparseSMat<T> &x)
#endif //_SPARSESMAT_H_