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;
315template <
class IT,
class NT>
316template <
typename UnaryOperation,
typename GlobalIT>
368template <
class IT,
class NT>
381template <
class IT,
class NT>
399template <
class IT,
class NT>
407 tuples.SortColBased();
414template <
class IT,
class NT>
438template <
class IT,
class NT>
445 tuples.SortRowBased();
454template <
class IT,
class NT>
459 tuples.SortRowBased();
466template <
class IT,
class NT>
471 tuples.SortRowBased();
478template <
class IT,
class NT>
487 std::cout<<
"Matrix is too small to be splitted" << std::endl;
505template <
class IT,
class NT>
516 else if (
partA.nnz == 0)
526 else if (
partB.nnz == 0)
547template <
class IT,
class NT>
553 outfile <<
"Matrix doesn't have any nonzeros" << std::endl;
558 outfile << tuples << std::endl;
570template <
class IT,
class NT>
585template <
class IT,
class NT>
586void SpCCols<IT,NT>::SubPrintInfo(Csc<IT,NT> * mycsc)
const
589 std::cout <<
"Printing for thread " << omp_get_thread_num() << std::endl;
593 NT **
A = SpHelper::allocate2D<NT>(m,n);
594 for(
IT i=0; i< m; ++i)
595 for(
IT j=0;
j<n; ++
j)
599 for(
IT i=0; i< n; ++i)
608 for(
IT i=0; i< m; ++i)
610 for(
IT j=0;
j<n; ++
j)
612 std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2) <<
A[i][
j];
615 std::cout << std::endl;
622template <
class IT,
class NT>
623inline void SpCCols<IT,NT>::CopyCsc(Csc<IT,NT> * source)
void CreateImpl(const std::vector< IT > &essentials)
void RowSplit(int numsplits)
void Split(SpCCols< IT, NT > &partA, SpCCols< IT, NT > &partB)
SpCCols< IT, NT > TransposeConst() const
SpCCols< IT, NT > * TransposeConstPtr() const
SpCCols< IT, NT > * PruneI(UnaryOperation unary_op, bool inPlace, GlobalIT rowOffset, GlobalIT colOffset)
Arr< IT, NT > GetArrays() const
std::ofstream & put(std::ofstream &outfile) const
SpCCols< IT, NT > & operator=(const SpCCols< IT, NT > &rhs)
void Merge(SpCCols< IT, NT > &partA, SpCCols< IT, NT > &partB)
std::vector< IT > GetEssentials() const
static void deallocate2D(T **array, I m)