44 template <
class IT,
class NT>
48 template <
class IT,
class NT>
53 template <
class IT,
class NT>
55 :m(nRow), n(nCol), nnz(size), splits(0)
63 template <
class IT,
class NT>
72 for(
int i=0; i<splits; ++i)
86 template <
class IT,
class NT>
88 : m(rhs.m), n(rhs.n), nnz(rhs.nnz), splits(rhs.splits)
92 for(
int i=0; i<splits; ++i)
107 template <
class IT,
class NT>
109 : m(rhs.m), n(rhs.n), nnz(rhs.nnz), splits(0)
114 if(transpose) swap(m,n);
123 for(IT i=1; i< rhs.nnz; ++i)
134 for(IT i=0; i<rhs.nnz; ++i)
141 for(IT i=1; i<rhs.nnz; ++i)
146 dcsc->cp[jspos++] = i;
149 dcsc->cp[jspos] = rhs.nnz;
154 for(IT i=1; i<rhs.nnz; ++i)
165 for(IT i=0; i<rhs.nnz; ++i)
172 for(IT i=1; i<rhs.nnz; ++i)
177 dcsc->cp[jspos++] = i;
180 dcsc->cp[jspos] = rhs.nnz;
195 template <
class IT,
class NT>
202 if(dcsc != NULL && nnz > 0)
224 template <
class IT,
class NT>
231 if(m == rhs.m && n == rhs.n)
244 (*dcsc) += (*(rhs.
dcsc));
250 cout<<
"Not addable: " << m <<
"!=" << rhs.m <<
" or " << n <<
"!=" << rhs.n <<endl;
255 cout<<
"Missing feature (A+A): Use multiply with 2 instead !"<<endl;
260 template <
class IT,
class NT>
261 template <
typename _UnaryOperation>
283 retcols->nnz = retcols->
dcsc->nz;
298 retcols->
dcsc = NULL;
307 template <
class IT,
class NT>
312 if(m == rhs.m && n == rhs.n)
325 else if (rhs.nnz != 0 && nnz != 0)
335 cout<<
"Matrices do not conform for A .* op(B) !"<<endl;
340 cout<<
"Missing feature (A .* A): Use Square_EWise() instead !"<<endl;
347 template <
class IT,
class NT>
350 if(m == m_scaler && n == n_scaler)
353 dcsc->EWiseScale (scaler);
357 cout<<
"Matrices do not conform for EWiseScale !"<<endl;
366 template <
class IT,
class NT>
369 assert(essentials.size() == esscount);
380 template <
class IT,
class NT>
394 MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
397 string ofilename =
"Read";
399 oput.open(ofilename.c_str(), ios_base::app );
400 oput <<
"Creating of dimensions " << nRow <<
"-by-" << nCol <<
" of size: " << size <<
401 " with row range (" << rlim.first <<
"," << rlim.second <<
") and column range (" << clim.first <<
"," << clim.second <<
")" << endl;
404 IT minfr = joker::get<0>(tuples.
front());
405 IT minto = joker::get<1>(tuples.
front());
406 IT maxfr = joker::get<0>(tuples.
back());
407 IT maxto = joker::get<1>(tuples.
back());
409 oput <<
"Min: " << minfr <<
", " << minto <<
"; Max: " << maxfr <<
", " << maxto << endl;
419 template <
class IT,
class NT>
422 vector<IT> essentials(esscount);
426 essentials[3] = (nnz > 0) ? dcsc->nzc : 0;
430 template <
class IT,
class NT>
431 template <
typename NNT>
444 template <
class IT,
class NT>
445 template <
typename NIT,
typename NNT>
458 template <
class IT,
class NT>
486 template <
class IT,
class NT>
509 template <
class IT,
class NT>
523 template <
class IT,
class NT>
529 cout<<
"Matrix is too small to be splitted" << endl;
538 dcsc->
Split(Adcsc, Bdcsc, cut);
552 template <
class IT,
class NT>
555 assert( partA.m == partB.m );
559 if(partA.nnz == 0 && partB.nnz == 0)
563 else if(partA.nnz == 0)
566 transform(Cdcsc->
jc, Cdcsc->
jc + Cdcsc->
nzc, Cdcsc->
jc, bind2nd(plus<IT>(), partA.n));
568 else if(partB.nnz == 0)
588 template <
class IT,
class NT>
596 Isect<IT> *isect1, *isect2, *itr1, *itr2, *cols, *rows;
599 IT kisect =
static_cast<IT
>(itr1-isect1);
607 IT cnz = SpHelper::SpCartesian< SR > (*(A.
dcsc), *(B.
dcsc), kisect, isect1, isect2, multstack);
614 dcsc =
new Dcsc<IT,NT>(multstack, mdim, ndim, cnz);
632 template <
class IT,
class NT>
633 template <
typename SR>
641 int cnz = SpHelper::SpColByCol< SR > (*(A.
dcsc), *(B.
dcsc), A.n, multstack);
647 dcsc =
new Dcsc<IT,NT>(multstack, mdim, ndim, cnz);
660 template <
class IT,
class NT>
661 template <
typename SR>
664 cout <<
"PlusEq_AtXBn function has not been implemented yet !" << endl;
668 template <
class IT,
class NT>
669 template <
typename SR>
672 cout <<
"PlusEq_AtXBt function has not been implemented yet !" << endl;
677 template <
class IT,
class NT>
680 IT * itr = find(dcsc->jc, dcsc->jc + dcsc->nzc, ci);
681 if(itr != dcsc->jc + dcsc->nzc)
683 IT irbeg = dcsc->cp[itr - dcsc->jc];
684 IT irend = dcsc->cp[itr - dcsc->jc + 1];
686 IT * ele = find(dcsc->ir + irbeg, dcsc->ir + irend, ri);
687 if(ele != dcsc->ir + irend)
690 *(SingEleMat.
dcsc->numx) = dcsc->numx[ele - dcsc->ir];
691 *(SingEleMat.
dcsc->ir) = *ele;
692 *(SingEleMat.
dcsc->jc) = *itr;
693 (SingEleMat.
dcsc->cp)[0] = 0;
694 (SingEleMat.
dcsc->cp)[1] = 1;
711 template <
class IT,
class NT>
716 IT rsize = ri.size();
717 IT csize = ci.size();
719 if(rsize == 0 && csize == 0)
732 return LeftMatrix.OrdColByCol< PT >(*this);
738 return LeftMatrix.OrdColByCol< PT >( OrdColByCol< PT >(RightMatrix) );
742 template <
class IT,
class NT>
747 outfile <<
"Matrix doesn't have any nonzeros" <<endl;
751 outfile << tuples << endl;
756 template <
class IT,
class NT>
759 cout <<
"Getting... SpDCCols" << endl;
761 infile >> m >> n >> nnz;
772 template<
class IT,
class NT>
776 out <<
", n: " << n ;
777 out <<
", nnz: "<< nnz ;
781 out <<
", local splits: " << splits << endl;
787 out <<
", nzc: "<< dcsc->nzc << endl;
791 out <<
", nzc: "<< 0 << endl;
796 template<
class IT,
class NT>
800 cout <<
", n: " << n ;
801 cout <<
", nnz: "<< nnz ;
805 cout <<
", local splits: " << splits << endl;
811 cout <<
", nzc: "<< dcsc->nzc << endl;
815 cout <<
", nzc: "<< 0 << endl;
820 NT **
A = SpHelper::allocate2D<NT>(m,n);
821 for(IT i=0; i< m; ++i)
822 for(IT j=0; j<n; ++j)
826 for(IT i=0; i< dcsc->nzc; ++i)
828 for(IT j = dcsc->cp[i]; j<dcsc->cp[i+1]; ++j)
830 IT colid = dcsc->jc[i];
831 IT rowid = dcsc->ir[j];
832 A[rowid][colid] = dcsc->numx[j];
836 for(IT i=0; i< m; ++i)
838 for(IT j=0; j<n; ++j)
840 cout << setiosflags(ios::fixed) << setprecision(2) << A[i][j];
856 template <
class IT,
class NT>
858 :dcsc(mydcsc), m(nRow), n(nCol), splits(0)
867 template <
class IT,
class NT>
869 :m(nRow), n(nCol), nnz(size), splits(0)
882 template <
class IT,
class NT>
898 template <
class IT,
class NT>
901 IT csize = ci.size();
914 for(IT i=0, j=0; i< dcsc->nzc && j < csize;)
916 if((dcsc->jc)[i] < ci[j])
920 else if ((dcsc->jc)[i] > ci[j])
926 estsize += (dcsc->cp)[i+1] - (dcsc->cp)[i];
938 SubA.dcsc->cp[0] = 0;
941 for(IT i=0, j=0; i < dcsc->nzc && j < csize;)
943 if((dcsc->jc)[i] < ci[j])
947 else if ((dcsc->jc)[i] > ci[j])
953 IT columncount = (dcsc->cp)[i+1] - (dcsc->cp)[i];
954 SubA.dcsc->jc[cnzc++] = j;
955 SubA.dcsc->cp[cnzc] = SubA.dcsc->cp[cnzc-1] + columncount;
956 copy(dcsc->ir + dcsc->cp[i], dcsc->ir + dcsc->cp[i+1], SubA.dcsc->ir + cnz);
957 copy(dcsc->numx + dcsc->cp[i], dcsc->numx + dcsc->cp[i+1], SubA.dcsc->numx + cnz);
966 template <
class IT,
class NT>
967 template <
typename SR,
typename NTR>
972 if(isZero() || rhs.
isZero())
978 Isect<IT> *isect1, *isect2, *itr1, *itr2, *cols, *rows;
981 IT kisect =
static_cast<IT
>(itr1-isect1);
988 IT cnz = SpHelper::SpCartesian< SR > (*dcsc, *(Btrans.
dcsc), kisect, isect1, isect2, multstack);
1001 template <
class IT,
class NT>
1002 template <
typename SR,
typename NTR>
1007 if(isZero() || rhs.
isZero())
1012 IT cnz = SpHelper::SpColByCol< SR > (*dcsc, *(rhs.
dcsc), n, multstack);
1018 delete [] multstack;