/* * ===================================================================================== * * Filename: sparse_vector_impl.h * * Description: * * Version: 1.0 * Created: 12/03/2007 07:12:26 PM EST * Revision: none * Compiler: gcc * * Author: Nikolaos Vasiloglou (NV), nvasil@ieee.org * Company: Georgia Tech Fastlab-ESP Lab * * ===================================================================================== */ inline SparseVector::SparseVector(std::vector &indices, Vector &values, index_t dimension) { Init(indices, values, dimension); } inline SparseVector::SparseVector(std::map &data, index_t dimension) { Init(data, dimension); } inline SparseVector::SparseVector(index_t estimated_non_zero_elements, index_t dimension) { Init(estimated_non_zero_elements, dimension); } inline SparseVector::SparseVector(Epetra_CrsMatrix *one_dim_matrix, index_t dimension) { Init(one_dim_matrix, dimension); } inline SparseVector::SparseVector(const SparseVector &other) { Copy(other); } inline void SparseVector::Init(index_t dimension) { map_ = new Epetra_Map(dimension_, 0, comm_); own_ = true; } inline void SparseVector::Init(std::vector &indices, Vector &values, index_t dimension) { if (unlikely((index_t)indices.size()!=values.length())) { FATAL("Indices vector has %i elements while Values vectors has %i\n", (index_t)indices.size(), values.length()); } std::vector::iterator it = std::max_element(indices.begin(), indices.end()); dimension_ = *it+1; if (dimension>0) { if (dimension > dimension_) { dimension_= dimension; } else { FATAL("Error, the requested dimension was %i, while the maximum " "index in the data is %i", dimension, dimension_); } } Init(dimension_); vector_ = new Epetra_CrsMatrix((Epetra_DataAccess)0, *map_, (index_t)indices.size()); my_global_elements_ = map_->MyGlobalElements(); vector_->InsertGlobalValues(*my_global_elements_, values.length(), values.ptr(), &indices[0]); start_ = 0; end_ = dimension_-1; } void SparseVector::Init(std::vector &indices, std::vector &values, index_t dimension) { if (unlikely(indices.size()!=values.size())) { FATAL("Indices vector has %i elements while Values vectors has %i\n", (index_t)indices.size(), (index_t)values.size()); } std::vector::iterator it = std::max_element(indices.begin(), indices.end()); dimension_ = *it+1; if (dimension>0) { if (dimension > dimension_) { dimension_= dimension; } else { FATAL("Error, the requested dimension was %i, while the maximum " "index in the data is %i", dimension, dimension_); } } Init(dimension_); vector_ = new Epetra_CrsMatrix((Epetra_DataAccess)0, *map_, indices.size()); my_global_elements_ = map_->MyGlobalElements(); vector_->InsertGlobalValues(*my_global_elements_, values.size(), &values[0], &indices[0]); start_ = 0; end_ = dimension_-1; } void SparseVector::Init(index_t *indices, double *values, index_t len, index_t dimension) { dimension_ = dimension; Init(dimension_); vector_ = new Epetra_CrsMatrix((Epetra_DataAccess)0, *map_, len); my_global_elements_ = map_->MyGlobalElements(); vector_->InsertGlobalValues(*my_global_elements_, len, values, indices); start_ = 0; end_ = dimension_-1; } inline void SparseVector::Init(std::map &data, index_t dimension) { std::map::iterator it=max_element(data.begin(), data.end()); dimension_ = it->first+1; if (dimension>0) { if (dimension > dimension_) { dimension_= dimension; } else { FATAL("Error, the requested dimension was %i, while the maximum " "index in the data is %i", dimension, dimension_); } } Init(dimension_); vector_ = new Epetra_CrsMatrix((Epetra_DataAccess)0, *map_, data.size()); index_t *indices = new index_t[data.size()]; double *values = new double[data.size()]; index_t i = 0; for(it=data.begin(); it!=data.end(); it++) { indices[i] = it->first; values[i] = it->second; i++; } my_global_elements_ = map_->MyGlobalElements(); vector_->InsertGlobalValues(*my_global_elements_, data.size(), values, indices); delete []indices; delete []values; start_ = 0; end_ = dimension_-1; } inline void SparseVector::Init(index_t estimated_non_zero_elements, index_t dimension) { dimension_ = dimension; Init(dimension_); vector_ = new Epetra_CrsMatrix((Epetra_DataAccess)0, *map_, estimated_non_zero_elements); start_ = 0; end_ = dimension_-1; } inline void SparseVector::Init(Epetra_CrsMatrix *one_dim_matrix, index_t dimension) { vector_ = one_dim_matrix; *map_ = one_dim_matrix->RowMap(); dimension_ = dimension; Init(dimension_); start_ = 0; end_ = dimension_-1; } inline void SparseVector::Copy(const SparseVector &other) { dimension_ = other.dimension_; Init(dimension_); vector_ = new Epetra_CrsMatrix(*other.vector_); start_=other.start_; end_=other.end_; } inline void SparseVector::Destruct() { if (own_ == true) { delete vector_; } if (map_!=NULL) { delete map_; } } inline void SparseVector::MakeSubvector(index_t start_index, index_t len, SparseVector* dest) { DEBUG_BOUNDS(start_ + start_index, end_+1); DEBUG_BOUNDS(start_ + start_index+len-1, end_+1); dest->Init(this->vector_, dimension_); dest->set_start(start_index + start_); dest->set_end(start_ + start_index + len-1); } inline double SparseVector::get(index_t i) { DEBUG_BOUNDS(start_+i, end_+1); index_t pos = start_+i; double *values; index_t *indices; index_t num_of_elements; vector_->ExtractGlobalRowView(*my_global_elements_, num_of_elements, values, indices); index_t *p = std::find(indices, indices+num_of_elements, pos); if (p!=indices+num_of_elements) { return values[p-indices]; } else { return 0; } } inline void SparseVector::set(index_t i, double value) { DEBUG_BOUNDS(start_+i, end_+1); index_t pos = start_+i; if (get(i)!=0) { vector_->ReplaceGlobalValues(*my_global_elements_, 1, &value, &pos); } else { vector_->InsertGlobalValues(*my_global_elements_, 1, &value, &pos); } } inline void SparseVector::Lock() { if (unlikely(vector_==NULL)) { FATAL("Attempted to Lock but you haven't initialized the Epetra_CrsMatrix pointer\n"); } vector_->FillComplete(); } inline void SparseVector::set_start(index_t ind) { start_ = ind; } inline void SparseVector::set_end(index_t ind) { end_ = ind; }