#ifndef _SPARSE_MATRIX_H #define _SPARSE_MATRIX_H //The total number of high mode indices is nhits * nspincolors * nflavors * Lt, and for each of those there are Lt 3d spin/color/flavor solution vectors //Depending on the level of dilution the vast majority of entries are zero; in fact only the V vector has no non-zero entries //It is therefore imperative to have sparse vectors and matrices to hold these // inline void computeUnion(std::vector &into, const std::vector &a, const std::vector &b){ // assert(a.size()==b.size()); // into.resize(a.size()); // for(int i=0;i // class A2AsparseVector{ // std::vector zeroes; // std::vector *> elems; // CPSfermion4D zero; //defaults to zero anyway // size_t len; // void clear(){ // zeroes.resize(0); // for(int i=0;i & operator()(const size_t &idx){ // if(zeroes[idx]) return zero; // else return *elems[idx]; // } // void set(const size_t &idx, const CPSfermion4D &to){ // zeroes[idx] = false; // elems[idx] = new CPSfermion4D(to); // } // const size_t &size() const{ return len; } //the supposed maximum length of the vector (not checked ofc!) // //Deletes everything already in vector // void resize(const size_t &to){ // clear(); // len = to; // zeroes.resize(len,true); // elems.resize(len,NULL); // } // ~SparseVector(){ clear(); } // }; // template // class A2AsparseMesonField{ // std::vector row_zeroes; // std::vector col_zeroes; // std::vector > elems; // size_t side_length; // void clear(){ // zeroes.resize(0); // elems.resize(0); // } // public: // //Setup a sparse vector of length _len. Reserves space for pointers but does not assign anything // SparseVector(const size_t &_len): len(_len), zeroes(_len,true), elems(_len,std::complex(0,0) ){ // } // SparseVector(): len(0){ // } // const CPSfermion4D & operator()(const size_t &idx){ // return // if(zeroes[idx]) return zero; // else return *elems[idx]; // } // void set(const size_t &idx, const CPSfermion4D &to){ // zeroes[idx] = false; // elems[idx] = new CPSfermion4D(to); // } // const size_t &size() const{ return len; } //the supposed maximum length of the vector (not checked ofc!) // //Deletes everything already in vector // void resize(const size_t &to){ // clear(); // len = to; // zeroes.resize(len,true); // elems.resize(len,NULL); // } // ~SparseVector(){ clear(); } // }; #if 0 //The total number of high mode indices is nhits * nspincolors * nflavors * Lt, and for each of those there are Lt 3d spin/color/flavor solution vectors //Depending on the level of dilution the vast majority of entries are zero; in fact only the V vector has no non-zero entries //It is therefore imperative to have sparse vectors and matrices to hold these template class BasicZeroGenerator{ public: static void zero(T &z){ z = 0.0; } }; template class ZeroGenerator = BasicZeroGenerator> class SparseVector{ std::map sparse_map; const ElementType zero; size_t len; public: SparseVector(const size_t &_len): len(_len){ ZeroGenerator::zero(zero); } SparseVector(): len(0){ ZeroGenerator::zero(zero); } const ElementType & operator()(const size_t &idx){ typename std::map::const_iterator it = sparse_map.find(idx); return it == sparse_map.end() ? zero : *it; } void set(const size_t &idx, const ElementType &to){ sparse_map[idx] = to; } const size_t &size() const{ return len; } //the supposed maximum length of the vector (not checked ofc!) void resize(const size_t &to){ len = to; } }; template class ZeroGenerator = BasicZeroGenerator> class SparseMatrix{ typedef SparseVector Vtype; typename std::map sparse_col_map; const ElementType zero; size_t rows, cols; public: SparseMatrix(const size_t &_rows, const size_t &_cols){ ZeroGenerator::zero(zero); } const ElementType & operator()(const size_t &i1, const size_t &i2){ typename std::map::const_iterator it = sparse_col_map.find(i1); return it == sparse_col_map.end() ? zero : it->operator()(i2); } void set(const size_t &i1, const size_t &i2, const ElementType &to){ if(sparse_col_map.count(i1) == 0) ..... sparse_col_map[i1](i2) = to; } const size_t &nRows() const{ return rows; } const size_t &nCols() const{ return cols; } }; template class ZeroGenerator = BasicZeroGenerator> void dot(SparseVector &out, const SparseMatrix &M, const SparseVector &v){ } #endif #endif