static void copy_large_entries(const DynamicSparseVector &u, double threshhold, StaticSparseVector &v) { DynamicSparseVector::const_iterator p; for(p=u.begin(); p!=u.end(); ++p){ if(std::fabs(p->value)>threshhold) v.push_back(*p); } }
static double vector_norm(const DynamicSparseVector &v) { double norm_squared=0; DynamicSparseVector::const_iterator p; for(p=v.begin(); p!=v.end(); ++p) norm_squared+=sqr(p->value); return std::sqrt(norm_squared); }
void SparseMatrixDynamicCSR:: add_sparse_row(int i, const DynamicSparseVector &x, double multiplier) { assert(i>=0 && i<m); DynamicSparseVector &r=row[i]; DynamicSparseVector::iterator p=r.begin(); DynamicSparseVector::const_iterator q=x.begin(); while(p!=r.end() && q!=x.end()){ if(p->index<q->index) ++p; else if(p->index>q->index){ r.insert(p, SparseEntry(q->index, multiplier*q->value)); ++q; }else{ p->value+=multiplier*q->value; ++p; ++q; } } for(; q!=x.end(); ++q) r.push_back(SparseEntry(q->index, multiplier*q->value)); }
static double dot_product(const StaticSparseVector &u, const DynamicSparseVector &v) { StaticSparseVector::const_iterator p=u.begin(); if(p==u.end()) return 0; DynamicSparseVector::const_iterator q=v.begin(); if(q==v.end()) return 0; double result=0; for(;;){ if(p->index < q->index){ ++p; if(p==u.end()) break; }else if(p->index > q->index){ ++q; if(q==v.end()) break; }else{ // p->index == q->index result+=p->value*q->value; ++p; if(p==u.end()) break; ++q; if(q==v.end()) break; } } return result; }
static void add_to_vector(double multiplier, const StaticSparseVector &u, DynamicSparseVector &v) { StaticSparseVector::const_iterator p=u.begin(); if(p==u.end()) return; DynamicSparseVector::iterator q=v.begin(); for(;;){ if(q==v.end()) break; if(p->index < q->index){ q=v.insert(q, SparseEntry(p->index, multiplier*p->value)); ++p; if(p==u.end()) return; }else if(p->index > q->index){ ++q; if(q==v.end()) break; }else{ // p->index == q->index){ q->value+=multiplier*p->value; ++p; if(p==u.end()) return; ++q; if(q==v.end()) break; } } for(;;){ v.push_back(SparseEntry(p->index, multiplier*p->value)); ++p; if(p==u.end()) return; } }