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 CopyDcsc(
rhs.dcscarr[i]);
108template <
class IT,
class NT>
110: m(
rhs.m), n(
rhs.n), nnz(
rhs.nnz), splits(0)
124 for(
IT i=1; i<
rhs.nnz; ++i)
126 if(
rhs.rowindex(i) !=
rhs.rowindex(i-1))
135 for(
IT i=0; i<
rhs.nnz; ++i)
138 dcsc->numx[i] =
rhs.numvalue(i);
142 for(
IT i=1; i<
rhs.nnz; ++i)
155 for(
IT i=1; i<
rhs.nnz; ++i)
157 if(
rhs.colindex(i) !=
rhs.colindex(i-1))
166 for(
IT i=0; i<
rhs.nnz; ++i)
169 dcsc->numx[i] =
rhs.numvalue(i);
173 for(
IT i=1; i<
rhs.nnz; ++i)
197template <
class IT,
class NT>
238 temp_jc[start] = std::get<1>(tuples[start]);
240 for (
IT i = start+1; i < end; ++i)
294#pragma omp parallel for schedule (static)
298 dcsc->ir[i] = std::get<0>(tuples[i]);
299 dcsc->numx[i] = std::get<2>(tuples[i]);
364template <
class IT,
class NT>
371 if(dcsc !=
NULL && nnz > 0)
393template <
class IT,
class NT>
400 if(m ==
rhs.m && n ==
rhs.n)
413 (*dcsc) += (*(
rhs.dcsc));
419 std::cout<<
"Not addable: " << m <<
"!=" <<
rhs.m <<
" or " << n <<
"!=" <<
rhs.n <<std::endl;
424 std::cout<<
"Missing feature (A+A): Use multiply with 2 instead !"<<std::endl;
429template <
class IT,
class NT>
430template <
typename _UnaryOperation,
typename GlobalIT>
476template <
class IT,
class NT>
477template <
typename _UnaryOperation>
525template <
class IT,
class NT>
526template <
typename _BinaryOperation>
572template <
class IT,
class NT>
577 dcsc->PruneColumnByIndex(
ci);
582template <
class IT,
class NT>
583template <
typename _BinaryOperation>
630template <
class IT,
class NT>
635 if(m ==
rhs.m && n ==
rhs.n)
641 else if (
rhs.nnz != 0 && nnz != 0)
643 dcsc->SetDifference (*(
rhs.dcsc));
651 std::cout<<
"Matrices do not conform for A - B !"<<std::endl;
656 std::cout<<
"Missing feature (A .* A): Use Square_EWise() instead !"<<std::endl;
661template <
class IT,
class NT>
666 if(m ==
rhs.m && n ==
rhs.n)
679 else if (
rhs.nnz != 0 && nnz != 0)
689 std::cout<<
"Matrices do not conform for A .* op(B) !"<<std::endl;
694 std::cout<<
"Missing feature (A .* A): Use Square_EWise() instead !"<<std::endl;
701template <
class IT,
class NT>
707 dcsc->EWiseScale (
scaler);
711 std::cout<<
"Matrices do not conform for EWiseScale !"<<std::endl;
720template <
class IT,
class NT>
733template <
class IT,
class NT>
747template <
class IT,
class NT>
751 tuples.SortColBased();
754 std::pair<IT,IT>
rlim = tuples.RowLimits();
755 std::pair<IT,IT>
clim = tuples.ColLimits();
758 std::stringstream
ss;
764 std::string ofilename =
"Read";
766 oput.open(ofilename.c_str(), std::ios_base::app );
767 oput <<
"Creating of dimensions " <<
nRow <<
"-by-" <<
nCol <<
" of size: " <<
size <<
768 " with row range (" <<
rlim.first <<
"," <<
rlim.second <<
") and column range (" <<
clim.first <<
"," <<
clim.second <<
")" << std::endl;
769 if(tuples.getnnz() > 0)
771 IT minfr = joker::get<0>(tuples.front());
772 IT minto = joker::get<1>(tuples.front());
773 IT maxfr = joker::get<0>(tuples.back());
774 IT maxto = joker::get<1>(tuples.back());
786template <
class IT,
class NT>
797template <
class IT,
class NT>
798template <
typename NNT>
811template <
class IT,
class NT>
812template <
typename NIT,
typename NNT>
825template <
class IT,
class NT>
853template <
class IT,
class NT>
876template <
class IT,
class NT>
890template <
class IT,
class NT>
905template <
class IT,
class NT>
911 std::cout<<
"Matrix is too small to be splitted" << std::endl;
935template <
class IT,
class NT>
945 for(
int i=0; i< (
parts-1); ++i)
951 std::cout<<
"Matrix is too small to be splitted" << std::endl;
961 for(
int i=0; i< (
parts-1); ++i)
977template <
class IT,
class NT>
987 for(
int i=0; i< (
parts-1); ++i)
993 std::cout<<
"Matrix is too small to be splitted" << std::endl;
1003 for(
int i=0; i< (
parts-1); ++i)
1019template <
class IT,
class NT>
1029 std::cout <<
"Cut sizes are not appropriate" << std::endl;
1035 for(
int i = 1; i <
parts-1; i++){
1044 for(
int i=0; i<
parts; ++i){
1058template <
class IT,
class NT>
1068 std::cout <<
"Cut sizes are not appropriate" << std::endl;
1074 for(
int i = 1; i <
parts-1; i++){
1083 for(
int i=0; i<
parts; ++i){
1095template <
class IT,
class NT>
1099 std::vector< Dcsc<IT,NT> * >
dcscs;
1103 for(
size_t i=0; i<
matrices.size(); ++i)
1117 std::cout <<
"Nothing to ColConcatenate" << std::endl;
1134 for(
size_t i=0; i<
matrices.size(); ++i)
1144template <
class IT,
class NT>
1148 std::vector< Dcsc<IT,NT> * >
dcscs;
1152 for(
size_t i=0; i<
matrices.size(); ++i)
1166 std::cout <<
"Nothing to ColConcatenate" << std::endl;
1183 for(
size_t i=0; i<
matrices.size(); ++i)
1194template <
class IT,
class NT>
1205 else if(
partA.nnz == 0)
1210 else if(
partB.nnz == 0)
1230template <
class IT,
class NT>
1234 if(
A.isZero() ||
B.isZero())
1274template <
class IT,
class NT>
1275template <
typename SR>
1278 if(
A.isZero() ||
B.isZero())
1283 int cnz = SpHelper::SpColByCol< SR > (*(
A.dcsc), *(
B.dcsc),
A.n,
multstack);
1302template <
class IT,
class NT>
1303template <
typename SR>
1306 std::cout <<
"PlusEq_AtXBn function has not been implemented yet !" << std::endl;
1310template <
class IT,
class NT>
1311template <
typename SR>
1314 std::cout <<
"PlusEq_AtXBt function has not been implemented yet !" << std::endl;
1319template <
class IT,
class NT>
1322 IT *
itr = std::find(dcsc->jc, dcsc->jc + dcsc->nzc,
ci);
1323 if(
itr != dcsc->jc + dcsc->nzc)
1329 if(ele != dcsc->ir +
irend)
1332 *(
SingEleMat.dcsc->numx) = dcsc->numx[ele - dcsc->ir];
1354template <
class IT,
class NT>
1370 return ColIndex(
ci);
1385template <
class IT,
class NT>
1390 outfile <<
"Matrix doesn't have any nonzeros" <<std::endl;
1394 outfile << tuples << std::endl;
1399template <
class IT,
class NT>
1402 std::cout <<
"Getting... SpDCCols" << std::endl;
1407 tuples.SortColBased();
1415template<
class IT,
class NT>
1419 out <<
", n: " << n ;
1420 out <<
", nnz: "<< nnz ;
1424 out <<
", local splits: " << splits << std::endl;
1430 out <<
", nzc: "<< dcsc->nzc << std::endl;
1434 out <<
", nzc: "<< 0 << std::endl;
1439template<
class IT,
class NT>
1442 std::cout <<
"m: " << m ;
1443 std::cout <<
", n: " << n ;
1444 std::cout <<
", nnz: "<< nnz ;
1448 std::cout <<
", local splits: " << splits << std::endl;
1454 std::cout <<
", nzc: "<< dcsc->nzc << std::endl;
1458 std::cout <<
", nzc: "<< 0 << std::endl;
1463 std::string **
A = SpHelper::allocate2D<std::string>(m,n);
1464 for(
IT i=0; i< m; ++i)
1465 for(
IT j=0;
j<n; ++
j)
1469 for(
IT i=0; i< dcsc->nzc; ++i)
1471 for(
IT j = dcsc->cp[i];
j<dcsc->cp[i+1]; ++
j)
1473 IT colid = dcsc->jc[i];
1474 IT rowid = dcsc->ir[
j];
1475 A[rowid][colid] = std::to_string(dcsc->numx[
j]);
1479 for(
IT i=0; i< m; ++i)
1481 for(
IT j=0;
j<n; ++
j)
1483 std::cout <<
A[i][
j];
1486 std::cout << std::endl;
1499template <
class IT,
class NT>
1510template <
class IT,
class NT>
1512:m(nRow), n(nCol), nnz(
size), splits(0)
1515 dcsc =
new Dcsc<IT,NT>(
size,indices,isRow);
1525template <
class IT,
class NT>
1526inline void SpDCCols<IT,NT>::CopyDcsc(Dcsc<IT,NT> * source)
1541template <
class IT,
class NT>
1542SpDCCols<IT,NT> SpDCCols<IT,NT>::ColIndex(
const std::vector<IT> & ci)
const
1557 for(
IT i=0,
j=0; i< dcsc->nzc &&
j <
csize;)
1559 if((dcsc->jc)[i] <
ci[
j])
1563 else if ((dcsc->jc)[i] >
ci[
j])
1569 estsize += (dcsc->cp)[i+1] - (dcsc->cp)[i];
1581 SubA.dcsc->cp[0] = 0;
1584 for(
IT i=0,
j=0; i < dcsc->nzc &&
j <
csize;)
1586 if((dcsc->jc)[i] <
ci[
j])
1590 else if ((dcsc->jc)[i] >
ci[
j])
1599 std::copy(dcsc->ir + dcsc->cp[i], dcsc->ir + dcsc->cp[i+1],
SubA.dcsc->ir +
cnz);
1600 std::copy(dcsc->numx + dcsc->cp[i], dcsc->numx + dcsc->cp[i+1],
SubA.dcsc->numx +
cnz);
1609template <
class IT,
class NT>
1610template <
typename SR,
typename NTR>
1611SpDCCols< IT, typename promote_trait<NT,NTR>::T_promote > SpDCCols<IT,NT>::OrdOutProdMult(
const SpDCCols<IT,NTR> & rhs)
const
1615 if(isZero() ||
rhs.isZero())
1644template <
class IT,
class NT>
1645template <
typename SR,
typename NTR>
1646SpDCCols< IT, typename promote_trait<NT,NTR>::T_promote > SpDCCols<IT,NT>::OrdColByCol(
const SpDCCols<IT,NTR> & rhs)
const
1650 if(isZero() ||
rhs.isZero())
void convert(string ifname, string ofname, string sort="revsize")
SpDCCols< IT, NT > & operator=(const SpDCCols< IT, NT > &rhs)
SpDCCols< IT, NT > * PruneI(_UnaryOperation __unary_op, bool inPlace, GlobalIT rowOffset, GlobalIT colOffset)
std::ofstream & put(std::ofstream &outfile) const
std::ifstream & get(std::ifstream &infile)
void ColSplit(int parts, std::vector< SpDCCols< IT, NT > > &matrices)
int PlusEq_AnXBn(const SpDCCols< IT, NT > &A, const SpDCCols< IT, NT > &B)
void PruneColumnByIndex(const std::vector< IT > &ci)
void ColConcatenate(std::vector< SpDCCols< IT, NT > > &matrices)
SpDCCols< IT, NT > * Prune(_UnaryOperation __unary_op, bool inPlace)
std::vector< IT > GetEssentials() const
void Merge(SpDCCols< IT, NT > &partA, SpDCCols< IT, NT > &partB)
int PlusEq_AnXBt(const SpDCCols< IT, NT > &A, const SpDCCols< IT, NT > &B)
SpDCCols< IT, NT > operator()(IT ri, IT ci) const
SpDCCols< IT, NT > & operator+=(const SpDCCols< IT, NT > &rhs)
SpDCCols< IT, NT > TransposeConst() const
Const version, doesn't touch the existing object.
void SetDifference(const SpDCCols< IT, NT > &rhs)
void Transpose()
Mutator version, replaces the calling object.
int PlusEq_AtXBt(const SpDCCols< IT, NT > &A, const SpDCCols< IT, NT > &B)
void EWiseScale(NT **scaler, IT m_scaler, IT n_scaler)
friend SpDCCols< IU, typename promote_trait< NU1, NU2 >::T_promote > EWiseMult(const SpDCCols< IU, NU1 > &A, const SpDCCols< IU, NU2 > &B, bool exclude)
void CreateImpl(const std::vector< IT > &essentials)
SpDCCols< IT, NT > * TransposeConstPtr() const
Arr< IT, NT > GetArrays() const
SpDCCols< IT, NT > * PruneColumn(NT *pvals, _BinaryOperation __binary_op, bool inPlace)
int PlusEq_AtXBn(const SpDCCols< IT, NT > &A, const SpDCCols< IT, NT > &B)
void Split(SpDCCols< IT, NT > &partA, SpDCCols< IT, NT > &partB)
static void SpIntersect(const Dcsc< IT, NT1 > &Adcsc, const Dcsc< IT, NT2 > &Bdcsc, Isect< IT > *&cols, Isect< IT > *&rows, Isect< IT > *&isect1, Isect< IT > *&isect2, Isect< IT > *&itr1, Isect< IT > *&itr2)
static void deallocate2D(T **array, I m)