45template <
class IT,
class NT>
49template <
class IT,
class NT>
54template <
class IT,
class NT>
64template <
class IT,
class NT>
73 for(
int i=0; i<splits; ++i)
87template <
class IT,
class NT>
93 for(
int i=0; i<splits; ++i)
94 CopyCsc(
rhs.cscarr[i]);
108template <
class IT,
class NT>
110: m(
rhs.m), n(
rhs.n), nnz(
rhs.nnz), splits(0)
124 std::vector< std::pair<IT,NT> >
tosort (nnz);
125 std::vector<IT>
work(n+1, (
IT) 0 );
126 for (
IT k = 0 ; k < nnz ; ++k)
133 std::partial_sum(
work.begin(),
work.end(),
work.begin());
136 for (
IT k = 0 ; k < nnz ; ++k)
141 #pragma omp parallel for
143 for(
int i=0; i< n; ++i)
148 typename std::vector<std::pair<IT,NT> >::iterator
itr;
151 csc->ir[ind] =
itr->first;
152 csc->num[ind] =
itr->second;
160 std::vector< std::pair<IT,NT> >
tosort (nnz);
161 std::vector<IT>
work(n+1, (
IT) 0 );
162 for (
IT k = 0 ; k < nnz ; ++k)
169 std::partial_sum(
work.begin(),
work.end(),
work.begin());
172 for (
IT k = 0 ; k < nnz ; ++k)
177 #pragma omp parallel for
179 for(
int i=0; i< n; ++i)
184 typename std::vector<std::pair<IT,NT> >::iterator
itr;
187 csc->ir[ind] =
itr->first;
188 csc->num[ind] =
itr->second;
205template <
class IT,
class NT>
212 if(csc !=
NULL && nnz > 0)
235template <
class IT,
class NT>
240 std::vector<IT>
nnzs(splits, 0);
241 std::vector < std::vector < std::tuple<IT,IT,NT> > >
colrowpairs(splits);
242 std::vector< std::vector<IT> >
colcnts(splits);
243 for(
int i=0; i< splits; ++i)
246 if(nnz > 0 && csc !=
NULL)
248 for(
IT i=0; i< csc->n; ++i)
250 for(
IT j = csc->jc[i];
j< csc->jc[i+1]; ++
j)
252 IT rowid = csc->ir[
j];
265 #pragma omp parallel for
267 for(
int i=0; i< splits; ++i)
271 cscarr[i]->jc[0] = 0;
272 std::partial_sum(
colcnts[i].begin(),
colcnts[i].end(), cscarr[i]->jc+1);
273 std::copy(cscarr[i]->jc, cscarr[i]->jc+n,
colcnts[i].begin());
276 for(
IT k=0; k<
nnzs[i]; ++k)
283 cscarr[i]->ir[curcptr] =
rindex;
284 cscarr[i]->num[curcptr] = value;
290template<
class IT,
class NT>
293 std::cout <<
"m: " << m ;
294 std::cout <<
", n: " << n ;
295 std::cout <<
", nnz: "<< nnz ;
299 std::cout <<
", local splits: " << splits << std::endl;
301 if(omp_get_thread_num() == 0)
303 SubPrintInfo(cscarr[0]);
309 std::cout << std::endl;
322template <
class IT,
class NT>
326 std::cout <<
"Printing for thread " << omp_get_thread_num() << std::endl;
330 NT **
A = SpHelper::allocate2D<NT>(m,n);
331 for(
IT i=0; i< m; ++i)
332 for(
IT j=0;
j<n; ++
j)
336 for(
IT i=0; i< n; ++i)
345 for(
IT i=0; i< m; ++i)
347 for(
IT j=0;
j<n; ++
j)
349 std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2) <<
A[i][
j];
352 std::cout << std::endl;
359template <
class IT,
class NT>
360inline void SpCCols<IT,NT>::CopyCsc(Csc<IT,NT> * source)
void RowSplit(int numsplits)
SpCCols< IT, NT > & operator=(const SpCCols< IT, NT > &rhs)
static void deallocate2D(T **array, I m)