52template <
class IT,
class NT,
class DER>
55 assert( (
sizeof(
IT) >=
sizeof(
typename DER::LocalIT)) );
58 perror(
"Input file doesn't exist\n");
65template <
class IT,
class NT,
class DER>
68 assert( (
sizeof(
IT) >=
sizeof(
typename DER::LocalIT)) );
72template <
class IT,
class NT,
class DER>
75 assert( (
sizeof(
IT) >=
sizeof(
typename DER::LocalIT)) );
79template <
class IT,
class NT,
class DER>
82 assert( (
sizeof(
IT) >=
sizeof(
typename DER::LocalIT)) );
88template <
class IT,
class NT,
class DER>
91 SpParHelper::Print(
"COMBBLAS Warning: It is dangerous to create (matrix) objects without specifying the communicator, are you sure you want to create this object in MPI_COMM_WORLD?\n");
92 assert( (
sizeof(
IT) >=
sizeof(
typename DER::LocalIT)) );
100template <
class IT,
class NT,
class DER>
104 assert( (
sizeof(
IT) >=
sizeof(
typename DER::LocalIT)) );
109template <
class IT,
class NT,
class DER>
112 if(spSeq !=
NULL)
delete spSeq;
115template <
class IT,
class NT,
class DER>
118 if(spSeq !=
NULL)
delete spSeq;
128template <
class IT,
class NT,
class DER>
129template <
typename VT,
typename GIT>
136 int colneighs =
commGrid->GetGridRows();
150 for(
int k = 0; k<colneighs; ++k)
155 for(
int k = 0; k<colneighs; ++k)
178#pragma omp parallel for
212#pragma omp parallel for
217 int myThread = omp_get_thread_num();
263 IT n_perproc = getlocalcols() / colneighs;
289#pragma omp parallel for
296 for (
int i=0; i<
nprocs; i++)
307template <
class IT,
class NT,
class DER>
308template <
typename VT,
typename GIT>
321 int colneighs =
commGrid->GetGridRows();
331 int diagneigh =
colcnt.commGrid->GetComplementRank();
333 MPI_Sendrecv(&
xsize, 1,
MPI_INT, diagneigh,
TRX, &
trxsize, 1,
MPI_INT, diagneigh,
TRX,
commGrid->GetWorld(), &
status);
336 MPI_Sendrecv(
const_cast<IT*
>(
SpHelper::p2a(
colcnt.arr)),
xsize,
MPIType<IT>(), diagneigh,
TRX,
trxnums,
trxsize,
MPIType<IT>(), diagneigh,
TRX,
commGrid->GetWorld(), &
status);
338 int *
colsize =
new int[colneighs];
341 int *
dpls =
new int[colneighs]();
354 if(
accsize !=
locm) std::cout <<
"Gather vector along columns logic is wrong" << std::endl;
357 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
374 if(myrank == 0) std::cout <<
"Number of initial active columns are " <<
totactcols << std::endl;
377 if(myrank == 0) std::cout <<
"Number of initial nonzeros are " <<
totactnnzs << std::endl;
381 if(myrank == 0) std::cout <<
"Number of initial active columns are " <<
glactcols << std::endl;
382 if(
glactcols !=
totactcols)
if(myrank == 0) std::cout <<
"Wrong number of active columns are computed" << std::endl;
390 rvec.PrintInfo(
"rvector");
395 std::ostringstream
ss;
396 ss <<
"TopK: k_limit (" <<
k_limit <<
")" <<
" >= maxNnzInColumn. Returning the result of Reduce(Column, minimum<NT>()) instead..." << std::endl;
403 for (
IT i=0,
j=0; i<
locm; ++i) {
427 int * sdispls =
new int[
nprocs]();
428 int * rdispls =
new int[
nprocs]();
452#pragma omp parallel for
478 if(myrank == 0) std::cout <<
"Number of active nonzeros are " <<
totactnnzs << std::endl;
487 std::vector< std::vector< std::pair<IT,NT> > >
tmppair(
nprocs);
490 TopKGather(
all_medians,
nnz_per_col,
chunksize,
chunksize,
activemedians,
activennzperc, i,
localmat,
actcolsmap,
klimits,
toretain,
tmppair,
coffset,
rvec);
492 TopKGather(
all_medians,
nnz_per_col,
lastchunk,
chunksize,
activemedians,
activennzperc,
iterations-1,
localmat,
actcolsmap,
klimits,
toretain,
tmppair,
coffset,
rvec);
511 for(
int i=0; i<
nprocs; ++i)
514 std::vector< std::pair<IT,NT> >().
swap(
tmppair[i]);
528 if(myrank == 0) std::cout <<
"Total vector entries updated " <<
updated << std::endl;
547 if(myrank == 0) std::cout <<
"Number of active columns are " <<
totactcols << std::endl;
554 if(myrank == 0) std::cout <<
"Exiting kselect2"<< std::endl;
561template <
class IT,
class NT,
class DER>
575 int colneighs =
commGrid->GetGridRows();
602 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
619template <
class IT,
class NT,
class DER>
646 char start[5] =
"HKDT";
666 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
681 cout <<
"local move happened..., writing to file\n";
698 std::cout <<
"Remaining " <<
totalremaining <<
" bytes to write in aggregate" << std::endl;
715template <
class IT,
class NT,
class DER>
719 spSeq =
new DER(*(
rhs.spSeq));
724template <
class IT,
class NT,
class DER>
731 if(spSeq !=
NULL)
delete spSeq;
733 spSeq =
new DER(*(
rhs.spSeq));
740template <
class IT,
class NT,
class DER>
747 (*spSeq) += (*(
rhs.spSeq));
751 std::cout <<
"Grids are not comparable for parallel addition (A+B)" << std::endl;
756 std::cout<<
"Missing feature (A+A): Use multiply with 2 instead !"<<std::endl;
761template <
class IT,
class NT,
class DER>
772template <
class IT,
class NT,
class DER>
781template <
class IT,
class NT,
class DER>
790template <
class IT,
class NT,
class DER>
799template <
class IT,
class NT,
class DER>
800template <
typename _BinaryOperation>
806 std::cout <<
"Grids are not comparable for SpParMat::DimApply" << std::endl;
819 int diagneigh =
x.
commGrid->GetComplementRank();
821 MPI_Sendrecv(&
xsize, 1,
MPI_INT, diagneigh,
TRX, &
trxsize, 1,
MPI_INT, diagneigh,
TRX,
World, &
status);
824 MPI_Sendrecv(
const_cast<NT*
>(
SpHelper::p2a(
x.arr)),
xsize,
MPIType<NT>(), diagneigh,
TRX,
trxnums,
trxsize,
MPIType<NT>(), diagneigh,
TRX,
World, &
status);
826 int colneighs, colrank;
829 int *
colsize =
new int[colneighs];
833 int *
dpls =
new int[colneighs]();
841 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
868 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
880 std::cout <<
"Unknown scaling dimension, returning..." << std::endl;
886template <
class IT,
class NT,
class DER>
887template <
typename _BinaryOperation,
typename _UnaryOperation >
905 std::cout <<
"Unknown reduction dimension, returning empty vector" << std::endl;
914template <
class IT,
class NT,
class DER>
915template <
typename _BinaryOperation>
933 std::cout <<
"Unknown reduction dimension, returning empty vector" << std::endl;
943template <
class IT,
class NT,
class DER>
944template <
typename VT,
typename GIT,
typename _BinaryOperation>
951template <
class IT,
class NT,
class DER>
952template <
typename VT,
typename GIT,
typename _BinaryOperation,
typename _UnaryOperation>
959template <
class IT,
class NT,
class DER>
960template <
typename VT,
typename GIT,
typename _BinaryOperation,
typename _UnaryOperation>
977 int colneighs =
commGrid->GetGridRows();
978 int colrank =
commGrid->GetRankInProcCol();
984 if(colrank == colneighs-1)
992 std::vector<VT>
trarr;
993 typename DER::SpColIter
colit = spSeq->begcol();
994 for(
int i=0; i< colneighs; ++i)
1020 int diagneigh =
commGrid->GetComplementRank();
1022 MPI_Sendrecv(&
trlen, 1,
MPIType<IT>(), diagneigh,
TRNNZ, &
reallen, 1,
MPIType<IT>(), diagneigh,
TRNNZ,
commGrid->GetWorld(), &
status);
1025 MPI_Sendrecv(
SpHelper::p2a(
trarr),
trlen,
MPIType<VT>(), diagneigh,
TRX,
SpHelper::p2a(
rvec.arr),
reallen,
MPIType<VT>(), diagneigh,
TRX,
commGrid->GetWorld(), &
status);
1026 rvec.glen = getncol();
1032 rvec.glen = getnrow();
1046 #define MAXCOLUMNBATCH 5 * 1024 * 1024
1047 typename DER::SpColIter
begfinger = spSeq->begcol();
1056 std::vector<typename DER::SpColIter::NzIter>
nziters;
1095 catch (std::length_error&
le)
1097 std::cerr <<
"Length error: " <<
le.what() << std::endl;
1103 std::cout <<
"Unknown reduction dimension, returning empty vector" << std::endl;
1110#define KSELECTLIMIT 10000
1118template <
class IT,
class NT,
class DER>
1119template <
typename VT,
typename GIT>
1122#ifdef COMBBLAS_DEBUG
1132 test1.PrintToFile(
"test1");
1133 test2.PrintToFile(
"test2");
1158template <
class IT,
class NT,
class DER>
1159template <
typename VT,
typename GIT>
1162#ifdef COMBBLAS_DEBUG
1189template <
class IT,
class NT,
class DER>
1190template <
typename VT,
typename GIT,
typename _UnaryOperation>
1199 std::cerr <<
"Dense kslect is called!! " << std::endl;
1205 SpParHelper::Print(
"Kselect: k is greater then maxNnzInColumn. Calling Reduce instead...\n");
1223 if(spSeq->getnnz()>0)
1225 typename DER::SpColIter
colit = spSeq->begcol();
1230 if((
colit != spSeq->endcol()) && (i==
colit.colid()))
1246 std::vector<VT>
localmat(spSeq->getnnz());
1250#pragma omp parallel for
1252 for(
IT i=0; i<nzc; i++)
1255 typename DER::SpColIter
colit = spSeq->begcol() + i;
1283 int colneighs =
commGrid->GetGridRows();
1284 int colrank =
commGrid->GetRankInProcCol();
1286 for(
int p=2; p <= colneighs; p*=2)
1289 if(colrank%p == p/2)
1296 else if(colrank%p == 0)
1308#pragma omp parallel for
1337#pragma omp parallel for
1350 int root =
commGrid->GetDiagOfProcCol();
1351 if(root==0 && colrank==0)
1354#pragma omp parallel for
1362 kthItem[i] = std::numeric_limits<VT>::min();
1365 else if(root>0 && colrank==0)
1368#pragma omp parallel for
1376 kthItem[i] = std::numeric_limits<VT>::min();
1380 else if(root>0 && colrank==root)
1386 std::vector <int>
dpls;
1389 int proccols =
commGrid->GetGridCols();
1394 dpls.resize(proccols,0);
1405 rvec.glen = getncol();
1411template <
class IT,
class NT,
class DER>
1412template <
typename VT,
typename GIT,
typename _UnaryOperation>
1442 int colneighs =
commGrid->GetGridRows();
1443 int colrank =
commGrid->GetRankInProcCol();
1478 for(
int i=0; i<
accnz ; i++)
1502 if(spSeq->getnnz()>0)
1504 typename DER::SpColIter
colit = spSeq->begcol();
1509 if( (
colit != spSeq->endcol()) && (i==
colit.colid()) )
1532#pragma omp parallel for
1534 for(
IT i=0; i<nzc; i++)
1537 typename DER::SpColIter
colit = spSeq->begcol() + i;
1581 for(
int p=2; p <= colneighs; p*=2)
1584 if(colrank%p == p/2)
1591 else if(colrank%p == 0)
1611#pragma omp parallel for
1676#pragma omp parallel for
1685 kthItem[i] = std::numeric_limits<VT>::min();
1720 int proccols =
commGrid->GetGridCols();
1721 std::vector <int>
sendcnts(proccols,0);
1722 std::vector <int>
dpls(proccols,0);
1742template <
class IT,
class NT,
class DER>
1747 IT m_perproc = getnrow() /
commGrid->GetGridRows();
1748 IT n_perproc = getncol() /
commGrid->GetGridCols();
1752 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
1755 typename DER::SpColIter::NzIter
nzit = spSeq->begnz(
colit);
1785template <
class IT,
class NT,
class DER>
1788 int colrank =
commGrid->GetRankInProcRow();
1806 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
1809 typename DER::SpColIter::NzIter
nzit = spSeq->begnz(
colit);
1847template <
class IT,
class NT,
class DER>
1848template <
typename VT,
typename GIT,
typename _BinaryOperation>
1868template <
class IT,
class NT,
class DER>
1869template <
typename VT,
typename GIT,
typename _BinaryOperation,
typename _UnaryOperation>
1870void SpParMat<IT,NT,DER>::MaskedReduce(
FullyDistVec<GIT,VT> &
rvec,
FullyDistSpVec<GIT,VT> &
mask,
Dim dim,
_BinaryOperation __binary_op,
VT id,
_UnaryOperation __unary_op,
bool exclude)
const
1905 int colneighs =
commGrid->GetGridRows();
1906 int colrank =
commGrid->GetRankInProcCol();
1912 if(colrank == colneighs-1)
1920 std::vector<VT>
trarr;
1921 typename DER::SpColIter
colit = spSeq->begcol();
1922 for(
int i=0; i< colneighs; ++i)
1930 typename DER::SpColIter::NzIter
nzit = spSeq->begnz(
colit);
1977 int diagneigh =
commGrid->GetComplementRank();
1979 MPI_Sendrecv(&
trlen, 1,
MPIType<IT>(), diagneigh,
TRNNZ, &
reallen, 1,
MPIType<IT>(), diagneigh,
TRNNZ,
commGrid->GetWorld(), &
status);
1982 MPI_Sendrecv(
SpHelper::p2a(
trarr),
trlen,
MPIType<VT>(), diagneigh,
TRX,
SpHelper::p2a(
rvec.arr),
reallen,
MPIType<VT>(), diagneigh,
TRX,
commGrid->GetWorld(), &
status);
1983 rvec.glen = getncol();
1990template <
class IT,
class NT,
class DER>
1991template <
typename NNT,
typename NDER>
1999template <
class IT,
class NT,
class DER>
2000template <
typename NIT,
typename NNT,
typename NDER>
2011template <
class IT,
class NT,
class DER>
2026template <
class IT,
class NT,
class DER>
2027template <
typename PTNTBOOL,
typename PTBOOLNT>
2030 typedef typename DER::LocalIT
LIT;
2045 locmax_ri = *std::max_element(
ri.arr.begin(),
ri.arr.end());
2047 locmax_ci = *std::max_element(
ci.arr.begin(),
ci.arr.end());
2075 IT diagneigh =
commGrid->GetComplementRank();
2080 MPI_Sendrecv(&
mylocalrows, 1,
MPIType<IT>(), diagneigh,
TRROWX, &
trlocalrows, 1,
MPIType<IT>(), diagneigh,
TRROWX,
commGrid->GetWorld(), &
status);
2083 std::vector< std::vector<IT> > rowid(
rowneighs);
2084 std::vector< std::vector<IT> > colid(
rowneighs);
2088 for(
typename std::vector<IT>::size_type i=0; i< (
unsigned)
locvec; ++i)
2117 std::copy(rowid[i].begin(), rowid[i].end(),
senddata+sdispls[i]);
2118 std::vector<IT>().swap(rowid[i]);
2124 std::copy(colid[i].begin(), colid[i].end(),
senddata+sdispls[i]);
2125 std::vector<IT>().swap(colid[i]);
2130 std::tuple<LIT,LIT,bool> *
p_tuples =
new std::tuple<LIT,LIT,bool>[
p_nnz];
2186 for(
typename std::vector<IT>::size_type i=0; i< (
unsigned)
locvec; ++i)
2200 std::fill(sdispls, sdispls+
rowneighs, 0);
2201 std::fill(rdispls, rdispls+
rowneighs, 0);
2212 std::copy(rowid[i].begin(), rowid[i].end(),
senddata+sdispls[i]);
2213 std::vector<IT>().swap(rowid[i]);
2219 std::copy(colid[i].begin(), colid[i].end(),
senddata+sdispls[i]);
2220 std::vector<IT>().swap(colid[i]);
2225 std::tuple<LIT,LIT,bool> *
q_tuples =
new std::tuple<LIT,LIT,bool>[
q_nnz];
2263 typedef typename DER::LocalIT
LIT;
2274 locmax = *std::max_element(v.arr.begin(), v.arr.end());
2293 diagneigh =
commGrid->GetComplementRank();
2295 tmp = getlocalrows();
2308 dimy = getlocalcols();
2319 std::vector<std::vector<IT>> rowid(
rowneighs);
2320 std::vector<std::vector<IT>> colid(
rowneighs);
2322 for(
typename std::vector<IT>::size_type i = 0; i < (
unsigned)
locvec; ++i)
2355 std::copy(rowid[i].begin(), rowid[i].end(),
senddata + sdispls[i]);
2356 std::vector<IT>().swap(rowid[i]);
2365 std::copy(colid[i].begin(), colid[i].end(),
senddata + sdispls[i]);
2366 std::vector<IT>().swap(colid[i]);
2377 std::tuple<LIT, LIT, bool> *
v_tuples =
2378 new std::tuple<LIT, LIT, bool>[
v_nnz];
2426template <
class IT,
class NT,
class DER>
2474template <
class IT,
class NT,
class DER>
2487 locmax_ri = *std::max_element(
ri.arr.begin(),
ri.arr.end());
2489 locmax_ci = *std::max_element(
ci.arr.begin(),
ci.arr.end());
2499 typedef typename DER::LocalIT
LIT;
2521template <
class IT,
class NT,
class DER>
2534 locmax_ri = *std::max_element(
ri.arr.begin(),
ri.arr.end());
2536 locmax_ci = *std::max_element(
ci.arr.begin(),
ci.arr.end());
2546 typedef typename DER::LocalIT
LIT;
2565template <
class IT,
class NT,
class DER>
2566template <
typename _BinaryOperation>
2574 if(getncol() !=
pvals.TotalLength())
2576 std::ostringstream
outs;
2577 outs <<
"Can not prune column-by-column, dimensions does not match"<< std::endl;
2578 outs << getncol() <<
" != " <<
pvals.TotalLength() << std::endl;
2582 if(! ( *(getcommgrid()) == *(
pvals.getcommgrid())) )
2584 std::cout <<
"Grids are not comparable for PurneColumn" << std::endl;
2596 MPI_Sendrecv(&
xsize, 1,
MPI_INT, diagneigh,
TRX, &
trxsize, 1,
MPI_INT, diagneigh,
TRX,
World, &
status);
2600 MPI_Sendrecv(
const_cast<NT*
>(
SpHelper::p2a(
pvals.arr)),
xsize,
MPIType<NT>(), diagneigh,
TRX,
trxnums,
trxsize,
MPIType<NT>(), diagneigh,
TRX,
World, &
status);
2602 int colneighs, colrank;
2605 int *
colsize =
new int[colneighs];
2608 int *
dpls =
new int[colneighs]();
2613#ifdef COMBBLAS_DEBUG
2614 std::ostringstream
outs2;
2615 outs2 <<
"PruneColumn displacements: ";
2616 for(
int i=0; i< colneighs; ++i)
2632 if(
accsize != getlocalcols()){
2633 fprintf(
stderr,
"[PruneColumn]\tmyrank:%d\taccsize:%d\tgetlocalcols():%d\n", myrank,
accsize, getlocalcols());
2647template <
class IT,
class NT,
class DER>
2648template <
class IRRELEVANT_NT>
2654 if (getncol() !=
ci.TotalLength())
2656 std::ostringstream
outs;
2657 outs <<
"Cannot prune column-by-column, dimensions do not match" << std::endl;
2658 outs << getncol() <<
" != " <<
ci.TotalLength() << std::endl;
2663 if (!(*(getcommgrid()) == *(
ci.getcommgrid())))
2665 std::cout <<
"Grids are not comparable for PruneColumnByIndex" << std::endl;
2670 int diagneigh =
ci.
commGrid->GetComplementRank();
2677 MPI_Sendrecv(&
xrofst, 1,
MPIType<IT>(), diagneigh,
TROST, &
trxrofst, 1,
MPIType<IT>(), diagneigh,
TROST,
World,
MPI_STATUS_IGNORE);
2678 MPI_Sendrecv(&
xlocnz, 1,
MPIType<IT>(), diagneigh,
TRNNZ, &
trxlocnz, 1,
MPIType<IT>(), diagneigh,
TRNNZ,
World,
MPI_STATUS_IGNORE);
2682 MPI_Sendrecv(
ci.ind.data(),
xlocnz,
MPIType<IT>(), diagneigh,
TRI,
trxinds.data(),
trxlocnz,
MPIType<IT>(), diagneigh,
TRI,
World,
MPI_STATUS_IGNORE);
2686 int colneighs, colrank;
2690 std::vector<int>
colnz(colneighs);
2693 std::vector<int>
dpls(colneighs, 0);
2702 spSeq->PruneColumnByIndex(
indacc);
2708template <
class IT,
class NT,
class DER>
2709template <
typename _BinaryOperation>
2715 if(getncol() !=
pvals.TotalLength())
2717 std::ostringstream
outs;
2718 outs <<
"Can not prune column-by-column, dimensions does not match"<< std::endl;
2719 outs << getncol() <<
" != " <<
pvals.TotalLength() << std::endl;
2723 if(! ( *(getcommgrid()) == *(
pvals.getcommgrid())) )
2725 std::cout <<
"Grids are not comparable for PurneColumn" << std::endl;
2738 MPI_Sendrecv(&
roffst, 1,
MPIType<IT>(), diagneigh,
TROST, &
roffset, 1,
MPIType<IT>(), diagneigh,
TROST,
World, &
status);
2739 MPI_Sendrecv(&
xlocnz, 1,
MPIType<IT>(), diagneigh,
TRNNZ, &
trxlocnz, 1,
MPIType<IT>(), diagneigh,
TRNNZ,
World, &
status);
2743 MPI_Sendrecv(
pvals.ind.data(),
xlocnz,
MPIType<IT>(), diagneigh,
TRI,
trxinds.data(),
trxlocnz,
MPIType<IT>(), diagneigh,
TRI,
World, &
status);
2744 MPI_Sendrecv(
pvals.num.data(),
xlocnz,
MPIType<NT>(), diagneigh,
TRX,
trxnums.data(),
trxlocnz,
MPIType<NT>(), diagneigh,
TRX,
World, &
status);
2747 int colneighs, colrank;
2750 int *
colnz =
new int[colneighs];
2753 int *
dpls =
new int[colneighs]();
2780template <
class IT,
class NT,
class DER>
2789 std::cout <<
"Grids are not comparable, EWiseMult() fails !" << std::endl;
2801template <
class IT,
class NT,
class DER>
2806 spSeq->SetDifference(*(
rhs.spSeq));
2810 std::cout <<
"Grids are not comparable, SetDifference() fails !" << std::endl;
2816template <
class IT,
class NT,
class DER>
2821 spSeq->EWiseScale(
rhs.array,
rhs.m,
rhs.n);
2825 std::cout <<
"Grids are not comparable, EWiseScale() fails !" << std::endl;
2830template <
class IT,
class NT,
class DER>
2831template <
typename _BinaryOperation>
2836 if(getlocalrows() ==
rhs.m && getlocalcols() ==
rhs.n)
2842 std::cout <<
"Matrices have different dimensions, UpdateDense() fails !" << std::endl;
2848 std::cout <<
"Grids are not comparable, UpdateDense() fails !" << std::endl;
2853template <
class IT,
class NT,
class DER>
2861 std::cout <<
"As a whole: " <<
mm <<
" rows and "<<
nn <<
" columns and "<<
nznz <<
" nonzeros" << std::endl;
2869 std::cout <<
"Processor (" <<
commGrid->GetRankInProcRow() <<
"," <<
commGrid->GetRankInProcCol() <<
")'s data: " << std::endl;
2877template <
class IT,
class NT,
class DER>
2880 int local =
static_cast<int>((*spSeq) == (*(
rhs.spSeq)));
2883 return static_cast<bool>(
whole);
2891template <
class IT,
class NT,
class DER>
2892template <
typename _BinaryOperation,
typename LIT>
2900 for(
int i=0; i<
nprocs; ++i)
2904 int * sdispls =
new int[
nprocs]();
2905 int * rdispls =
new int[
nprocs]();
2925 if(
commGrid->GetRank() == 0) { std::copy(
gsizes,
gsizes+
nprocs, std::ostream_iterator<IT>(std::cout,
" ")); std::cout << std::endl; }
2933 std::tuple<LIT,LIT,NT> *
senddata =
new std::tuple<LIT,LIT,NT>[
locsize];
2934 for(
int i=0; i<
nprocs; ++i)
2936 std::copy(data[i].begin(), data[i].end(),
senddata+sdispls[i]);
2938 data[i].shrink_to_fit();
2944 std::tuple<LIT,LIT,NT> *
recvdata =
new std::tuple<LIT,LIT,NT>[
totrecv];
2954 int myprocrow =
commGrid->GetRankInProcCol();
2955 int myproccol =
commGrid->GetRankInProcRow();
2957 if(myprocrow !=
r-1)
locrows = m_perproc;
2959 if(myproccol != s-1)
loccols = n_perproc;
2965 A.RemoveDuplicates(
BinOp);
2967 spSeq =
new DER(
A,
false);
2972template <
class IT,
class NT,
class DER>
2973std::vector<std::vector<SpParMat<IT, NT, DER>>>
2976 IT g_nr = this->getnrow();
2977 IT g_nc = this->getncol();
2980 return std::vector<std::vector<SpParMat<IT, NT, DER>>>
2981 (1, std::vector<SpParMat<IT, NT, DER>>(1, *
this));
2986 std::vector<std::vector<SpParMat<IT, NT, DER>>>
2990 std::vector<std::vector<std::vector<std::vector<std::tuple<IT, IT, NT>>>>>
2992 std::vector<std::vector<std::vector<std::tuple<IT, IT, NT>>>>
2993 (
bc, std::vector<std::vector<std::tuple<IT, IT, NT>>>
2994 (
np, std::vector<std::tuple<IT, IT, NT>>())));
3008 for (
IT i = 0; i <
br_r; ++i)
3010 for (
IT i = 0; i <
bc_r; ++i)
3029 for (
int64_t i = 0; i < tuples.getnnz(); ++i)
3045 for (
int i = 0; i <
br; ++i)
3047 for (
int j = 0;
j <
bc; ++
j)
3065template <
class IT,
class NT,
class DER>
3082 std::vector< std::vector < std::tuple<IT,IT,NT> > > data(
nprocs);
3103template <
class IT,
class NT,
class DER>
3119 std::vector< std::vector < std::tuple<IT,IT,NT> > > data(
nprocs);
3138template <
class IT,
class NT,
class DER>
3139template <
class DELIT>
3143 typedef typename DER::LocalIT
LIT;
3148 std::vector< std::vector<LIT> > data(
nprocs);
3155 std::ostringstream
outs;
3156 outs <<
"Warning: Using smaller indices for the matrix than DistEdgeList\n";
3157 outs <<
"Local matrices are " << m_perproc <<
"-by-" << n_perproc << std::endl;
3181 int64_t to = get_v1_from_edge(&(
DEL.pedges[i]));
3183 if(
fr >= 0 && to >= 0)
3197 if(
DEL.edges[2*i+0] >= 0 &&
DEL.edges[2*i+1] >= 0)
3210 int * sdispls =
new int[
nprocs];
3211 for(
int i=0; i<
nprocs; ++i)
3214 int * rdispls =
new int[
nprocs];
3220 for(
int i=0; i<
nprocs-1; ++i)
3222 sdispls[i+1] = sdispls[i] +
sendcnt[i];
3223 rdispls[i+1] = rdispls[i] +
recvcnt[i];
3225 for(
int i=0; i<
nprocs; ++i)
3226 std::copy(data[i].begin(), data[i].end(),
sendbuf+sdispls[i]);
3229 for(
int i=0; i<
nprocs; ++i)
3230 std::vector<LIT>().swap(data[i]);
3244 int myprocrow =
commGrid->GetRankInProcCol();
3245 int myproccol =
commGrid->GetRankInProcRow();
3253 spSeq =
new DER(
A,
false);
3256template <
class IT,
class NT,
class DER>
3264 typedef typename DER::LocalIT
LIT;
3267 removed = tuples.RemoveLoops();
3268 spSeq =
new DER(tuples,
false);
3276template <
class IT,
class NT,
class DER>
3282 typedef typename DER::LocalIT
LIT;
3286 tuples.SortColBased();
3287 spSeq =
new DER(tuples,
false);
3293template <
class IT,
class NT,
class DER>
3303 if (getncol()!=
loopvals.TotalLength())
3305 SpParHelper::Print(
"The number of entries in loopvals is not equal to the number of diagonal entries.\n");
3328 typedef typename DER::LocalIT
LIT;
3332 tuples.SortColBased();
3333 spSeq =
new DER(tuples,
false);
3341template <
class IT,
class NT,
class DER>
3342template <
typename LIT,
typename OT>
3345 if(spSeq->getnsplit() > 0)
3351 typedef typename DER::LocalIT
LocIT;
3380 int diagneigh =
commGrid->GetComplementRank();
3381 MPI_Sendrecv(&
offset, 1,
MPIType<IT>(), diagneigh,
TRTAGNZ, &
diagoffset, 1,
MPIType<IT>(), diagneigh,
TRTAGNZ,
commGrid->GetWorld(), &
status);
3406 for(
int i=0; i<
p_r; ++i)
3423 std::vector<bool> isthere(
mA,
false);
3424 std::vector<int>
maxlens(p_c,0);
3426 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
3435 isthere[rowid] =
true;
3443template <
class IT,
class NT,
class DER>
3454template <
class IT,
class NT,
class DER>
3455template <
typename SR>
3461 typedef typename DER::LocalIT
LIT;
3479 std::vector< SpTuples<LIT,NT> *>
tomerge;
3484 for(
int i = 0; i <
stages; ++i)
3486 std::vector<LIT>
ess;
3490 ess.resize(DER::esscount);
3491 for(
int j=0;
j< DER::esscount; ++
j)
3502 ess.resize(DER::esscount);
3503 for(
int j=0;
j< DER::esscount; ++
j)
3522 for(
unsigned int i=0; i<
tomerge.size(); ++i)
3527template <
class IT,
class NT,
class DER>
3536 typedef typename DER::LocalIT
LIT;
3554 int diagneigh =
commGrid->GetComplementRank();
3557 MPI_Sendrecv(&
locnnz, 1,
MPIType<LIT>(), diagneigh,
TRTAGNZ, &
remotennz, 1,
MPIType<LIT>(), diagneigh,
TRTAGNZ,
commGrid->GetWorld(), &
status);
3558 MPI_Sendrecv(&
locn, 1,
MPIType<LIT>(), diagneigh,
TRTAGM, &
remotem, 1,
MPIType<LIT>(), diagneigh,
TRTAGM,
commGrid->GetWorld(), &
status);
3559 MPI_Sendrecv(&
locm, 1,
MPIType<LIT>(), diagneigh,
TRTAGN, &
remoten, 1,
MPIType<LIT>(), diagneigh,
TRTAGN,
commGrid->GetWorld(), &
status);
3562 MPI_Sendrecv(
rows,
locnnz,
MPIType<LIT>(), diagneigh,
TRTAGROWS,
rowsrecv,
remotennz,
MPIType<LIT>(), diagneigh,
TRTAGROWS,
commGrid->GetWorld(), &
status);
3566 MPI_Sendrecv(
cols,
locnnz,
MPIType<LIT>(), diagneigh,
TRTAGCOLS,
colsrecv,
remotennz,
MPIType<LIT>(), diagneigh,
TRTAGCOLS,
commGrid->GetWorld(), &
status);
3570 MPI_Sendrecv(
vals,
locnnz,
MPIType<NT>(), diagneigh,
TRTAGVALS,
valsrecv,
remotennz,
MPIType<NT>(), diagneigh,
TRTAGVALS,
commGrid->GetWorld(), &
status);
3588template <
class IT,
class NT,
class DER>
3589template <
class HANDLER>
3592 int proccols =
commGrid->GetGridCols();
3593 int procrows =
commGrid->GetGridRows();
3602 std::stringstream
strm;
3603 strm <<
"%%MatrixMarket matrix coordinate real general" << std::endl;
3611 int colrank =
commGrid->GetRankInProcCol();
3612 int colneighs =
commGrid->GetGridRows();
3623 for(
int i = 0; i < procrows; i++)
3625 if(
commGrid->GetRankInProcCol() == i)
3628 std::vector< std::vector< std::pair<IT,NT> > >
csr(
localrows);
3629 if(
commGrid->GetRankInProcRow() == 0)
3633 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
3637 csr[
nzit.rowid()].push_back( std::make_pair(
colit.colid(),
nzit.value()) );
3646 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
3656 if(
commGrid->GetRankInProcRow() == 0)
3659 gsizes =
new int[proccols];
3660 dpls =
new int[proccols]();
3665 sort(
csr[
j].begin(),
csr[
j].end());
3668 if(
commGrid->GetRankInProcRow() == 0)
3678 if(
commGrid->GetRankInProcRow() == 0)
3680 for(
int k=0; k<
rowcnt; ++k)
3695 if(
commGrid->GetRankInProcRow() == 0)
3708template <
class IT,
class NT,
class DER>
3724 std::cout <<
"File is " <<
file_size <<
" bytes" << std::endl;
3734 typedef std::map<std::string, uint64_t>
KEYMAP;
3737 std::vector<std::string>
lines;
3751#ifdef COMBBLAS_DEBUG
3753 std::cout <<
"Initial reading finished. Total number of entries read across all processors is " <<
allentriesread << std::endl;
3758 for(
int i=0; i<
nprocs; ++i)
3762 int * sdispls =
new int[
nprocs]();
3763 int * rdispls =
new int[
nprocs]();
3777 #pragma omp parallel for
3778 for(
int i=0; i<
nprocs; ++i)
3784 std::array<char, MAXVERTNAME> vname;
3785 std::copy(
pobj.first.begin(),
pobj.first.end(), vname.begin() );
3802 std::set< std::pair<uint64_t, std::string> >
uniqsorted;
3812#ifdef COMBBLAS_DEBUG
3814 std::cout <<
"out of " <<
totrecv <<
" vertices received, " <<
uniqsize <<
" were unique" << std::endl;
3864 std::cout <<
"Assertion failed at proc " << myrank <<
": the absence of the entry in invindex is unexpected!!!" << std::endl;
3880template <
class IT,
class NT,
class DER>
3881template <
typename _BinaryOperation>
3893 typedef std::map<std::string, uint64_t>
KEYMAP;
3904 std::cout <<
"the duplication in ultimateperm is unexpected!!!" << std::endl;
3923 typedef typename DER::LocalIT
LIT;
3924 std::vector<LIT>
rows;
3925 std::vector<LIT>
cols;
3926 std::vector<NT>
vals;
3928 std::vector<std::string>
lines;
3942#ifdef COMBBLAS_DEBUG
3944 std::cout <<
"Second reading finished. Total number of entries read across all processors is " <<
allentriesread << std::endl;
3948 std::vector< std::vector < std::tuple<LIT,LIT,NT> > > data(
nprocs);
3957 std::vector<LIT>().swap(
rows);
3958 std::vector<LIT>().swap(
cols);
3959 std::vector<NT>().swap(
vals);
3961#ifdef COMBBLAS_DEBUG
3963 std::cout <<
"Packing to recipients finished, about to send..." << std::endl;
3966 if(spSeq)
delete spSeq;
3978template <
class IT,
class NT,
class DER>
3979template <
typename _BinaryOperation>
3995 printf(
"COMBBLAS: Matrix-market file %s can not be found\n",
filename.c_str());
4000 printf(
"Could not process Matrix Market banner.\n");
4007 printf(
"Sorry, this application does not support complext types");
4012 std::cout <<
"Matrix is Float" << std::endl;
4017 std::cout <<
"Matrix is Integer" << std::endl;
4022 std::cout <<
"Matrix is Boolean" << std::endl;
4027 std::cout <<
"Matrix is symmetric" << std::endl;
4034 std::cout <<
"Total number of nonzeros expected across all processors is " <<
nonzeros << std::endl;
4053 std::cout <<
"File is " <<
file_size <<
" bytes" << std::endl;
4071 typedef typename DER::LocalIT
LIT;
4072 std::vector<LIT>
rows;
4073 std::vector<LIT>
cols;
4074 std::vector<NT>
vals;
4076 std::vector<std::string>
lines;
4090#ifdef COMBBLAS_DEBUG
4092 std::cout <<
"Reading finished. Total number of entries read across all processors is " <<
allentriesread << std::endl;
4095 std::vector< std::vector < std::tuple<LIT,LIT,NT> > > data(
nprocs);
4104 std::vector<LIT>().swap(
rows);
4105 std::vector<LIT>().swap(
cols);
4106 std::vector<NT>().swap(
vals);
4108#ifdef COMBBLAS_DEBUG
4110 std::cout <<
"Packing to recepients finished, about to send..." << std::endl;
4113 if(spSeq)
delete spSeq;
4118template <
class IT,
class NT,
class DER>
4119template <
class HANDLER>
4128 std::stringstream
ss;
4131 ss <<
"%%MatrixMarket matrix coordinate real general" << std::endl;
4149 for(
typename DER::SpColIter
colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit)
4161 std::string
text =
ss.str();
4185 #ifdef COMBBLAS_DEBUG
4187 std::cout <<
"Remaining " <<
totalremaining <<
" bytes to write in aggregate" << std::endl;
4209template <
class IT,
class NT,
class DER>
4210template <
class HANDLER>
4229 IT m_perproc = 0, n_perproc = 0;
4231 int colneighs =
commGrid->GetGridRows();
4253 SpParHelper::Print(
"COMBBLAS: MPI doesn't support sending int64_t send/recv counts or displacements\n",
commGrid->GetWorld());
4256 int *
cdispls =
new int[colneighs];
4270 std::vector< std::tuple<IT, IT, NT> >
localtuples;
4274 if( !
hfile.fileexists )
4288 if ( !
hfile.headerexists )
4297 std::stringstream
ss;
4314 m_perproc =
total_m / colneighs;
4328 ReadAllMine(
binfile,
rows,
cols,
vals,
localtuples,
rcurptrs,
ccurptrs, rdispls,
cdispls, m_perproc, n_perproc,
4371 colrec = std::min(
static_cast<int>(
temprow / m_perproc), colneighs-1);
4399 std::fill_n(
ccurptrs, colneighs, 0);
4417 std::fill_n(
ccurptrs, colneighs, std::numeric_limits<int>::max());
4428 m_perproc =
total_m / colneighs;
4451 ReadAllMine(
binfile,
rows,
cols,
vals,
localtuples,
rcurptrs,
ccurptrs, rdispls,
cdispls, m_perproc, n_perproc,
4467 if(
recvcount == std::numeric_limits<int>::max())
break;
4498 m_perproc =
total_m / colneighs;
4504 if(
recvcount == std::numeric_limits<int>::max())
4548template <
class IT,
class NT,
class DER>
4558 std::fill_n(
ccurptrs, colneighs, 0);
4562template <
class IT,
class NT,
class DER>
4563void SpParMat<IT,NT,DER>::BcastEssentials(MPI_Comm & world,
IT & total_m,
IT & total_n,
IT & total_nnz,
int master)
4574template <
class IT,
class NT,
class DER>
4575void SpParMat<IT,NT,DER>::VerticalSend(
IT * & rows,
IT * & cols,
NT * & vals, std::vector< std::tuple<IT,IT,NT> > & localtuples,
int * rcurptrs,
int * ccurptrs,
int * rdispls,
int * cdispls,
4576 IT m_perproc,
IT n_perproc,
int rowneighs,
int colneighs,
IT buffperrowneigh,
IT buffpercolneigh,
int rankinrow)
4584 for(
int i=0; i<colneighs-1; ++i)
4598 std::fill_n(
ccurptrs, colneighs, 0);
4603 HorizontalSend(
rows,
cols,
vals,
temprows,
tempcols,
tempvals,
localtuples,
rcurptrs, rdispls,
buffperrowneigh,
rowneighs,
totrecv, m_perproc, n_perproc,
rankinrow);
4618template <
class IT,
class NT,
class DER>
4619template <
class HANDLER>
4620void SpParMat<IT,NT,DER>::ReadAllMine(FILE * binfile,
IT * & rows,
IT * & cols,
NT * & vals, std::vector< std::tuple<IT,IT,NT> > & localtuples,
int * rcurptrs,
int * ccurptrs,
int * rdispls,
int * cdispls,
4621 IT m_perproc,
IT n_perproc,
int rowneighs,
int colneighs,
IT buffperrowneigh,
IT buffpercolneigh,
IT entriestoread, HANDLER handler,
int rankinrow,
bool transpose)
4638 int colrec = std::min(
static_cast<int>(
temprow / m_perproc), colneighs-1);
4649 oput <<
"To column neighbors: ";
4654 VerticalSend(
rows,
cols,
vals,
localtuples,
rcurptrs,
ccurptrs, rdispls,
cdispls, m_perproc, n_perproc,
4666 oput <<
"To column neighbors: ";
4673 VerticalSend(
rows,
cols,
vals,
localtuples,
rcurptrs,
ccurptrs, rdispls,
cdispls, m_perproc, n_perproc,
4701template <
class IT,
class NT,
class DER>
4702void SpParMat<IT,NT,DER>::HorizontalSend(
IT * & rows,
IT * & cols,
NT * & vals,
IT * & temprows,
IT * & tempcols,
NT * & tempvals, std::vector < std::tuple <IT,IT,NT> > & localtuples,
4703 int * rcurptrs,
int * rdispls,
IT buffperrowneigh,
int rowneighs,
int recvcount,
IT m_perproc,
IT n_perproc,
int rankinrow)
4722 oput <<
"To row neighbors: ";
4724 oput <<
"Row displacements were: ";
4725 std::copy(rdispls, rdispls+
rowneighs, std::ostream_iterator<int>(
oput,
" "));
oput << std::endl;
4759template <
class IT,
class NT,
class DER>
4790 int colrank =
commGrid->GetRankInProcCol();
4792 int colneighs =
commGrid->GetGridRows();
4795 locnrows[colrank] = getlocalrows();
4805 for(
int i=0; i<
prelen; ++i)
4837template <
class IT,
class NT,
class DER>
4866 int colrank =
commGrid->GetRankInProcCol();
4868 int colneighs =
commGrid->GetGridRows();
4871 locnrows[colrank] = getlocalrows();
4880 for(
int i=0; i<
prelen; ++i)
4907template <
class IT,
class NT,
class DER>
4914 if (
nverts != getncol()) {
4920 SpParHelper::Print(
"Assignments vector length does not match number of vertices!\n");
4927 SpParHelper::Print(
"Assignments vector assigns to process not not in this group!\n");
4974 std::vector<std::vector<std::tuple<IT,IT,NT>>>
svec(
nprocs);
4976 std::vector<int> sendcounts(
nprocs, 0);
4977 std::vector<int> recvcounts(
nprocs, 0);
4978 std::vector<int> sdispls(
nprocs, 0);
4979 std::vector<int> rdispls(
nprocs, 0);
4986 for (
auto colit = spSeq->begcol();
colit != spSeq->endcol(); ++
colit) {
5000 size_t rbuflen = std::accumulate(recvcounts.begin(), recvcounts.end(),
static_cast<size_t>(0));
5002 std::partial_sum(sendcounts.begin(), sendcounts.end()-1, sdispls.begin()+1);
5003 std::partial_sum(recvcounts.begin(), recvcounts.end()-1, rdispls.begin()+1);
5005 std::tuple<IT,IT,NT> *
sbuf =
new std::tuple<IT,IT,NT>[
sbuflen];
5006 std::tuple<IT,IT,NT> *
rbuf =
new std::tuple<IT,IT,NT>[
rbuflen];
5008 for (
int i = 0; i <
nprocs; ++i)
5009 std::copy(
svec[i].begin(),
svec[i].end(),
sbuf + sdispls[i]);
5012 MPI_Alltoallv(
sbuf, sendcounts.data(), sdispls.data(),
MPIType<std::tuple<IT,IT,NT>>(),
rbuf, recvcounts.data(), rdispls.data(),
MPIType<std::tuple<IT,IT,NT>>(),
World);
5019 std::unordered_map<IT, IT>
locmap;
5024 for (
int i = 0; i <
rbuflen; ++i) {
5027 for (
int j = 0;
j < 2; ++
j) {
5045template <
class IT,
class NT,
class DER>
5048 outfile << (*spSeq) << std::endl;
5052template <
class IU,
class NU,
class UDER>
5066template <
class IT,
class NT,
class DER>
5067template <
typename LIT>
5070 int procrows =
commGrid->GetGridRows();
5071 int proccols =
commGrid->GetGridCols();
5078 own_procrow = std::min(
static_cast<int>(
grow / m_perproc), procrows-1);
5087 own_proccol = std::min(
static_cast<int>(
gcol / n_perproc), proccols-1);
5102template <
class IT,
class NT,
class DER>
5108 int procrows =
commGrid->GetGridRows();
5109 int proccols =
commGrid->GetGridCols();
void convert(string ifname, string ofname, string sort="revsize")
std::shared_ptr< CommGrid > commGrid
int64_t getGlobalV() const
static void ProcessLines(std::vector< IT1 > &rows, std::vector< IT1 > &cols, std::vector< NT1 > &vals, std::vector< std::string > &lines, int symmetric, int type, bool onebased=true)
static void ProcessLinesWithStringKeys(std::vector< std::map< std::string, uint64_t > > &allkeys, std::vector< std::string > &lines, int nprocs)
static void deallocate2D(T **array, I m)
static void ProcessStrLinesNPermute(std::vector< IT1 > &rows, std::vector< IT1 > &cols, std::vector< NT1 > &vals, std::vector< std::string > &lines, std::map< std::string, uint64_t > &ultperm)
static const T * p2a(const std::vector< T > &v)
static bool FetchBatch(MPI_File &infile, MPI_Offset &curpos, MPI_Offset end_fpos, bool firstcall, std::vector< std::string > &lines, int myrank)
static void GetSetSizes(const SpMat< IT, NT, DER > &Matrix, IT **&sizes, MPI_Comm &comm1d)
static void BCastMatrix(MPI_Comm &comm1d, SpMat< IT, NT, DER > &Matrix, const std::vector< IT > &essentials, int root)
static void Print(const std::string &s)
static void ReDistributeToVector(int *&map_scnt, std::vector< std::vector< IT > > &locs_send, std::vector< std::vector< std::string > > &data_send, std::vector< std::array< char, MAXVERTNAME > > &distmapper_array, const MPI_Comm &comm)
void PruneFull(const FullyDistVec< IT, IT > &ri, const FullyDistVec< IT, IT > &ci)
prune all entries whose row indices are in ri OR column indices are in ci
bool Kselect2(FullyDistVec< GIT, VT > &rvec, IT k_limit) const
void EWiseScale(const DenseParMat< IT, NT > &rhs)
FullyDistVec< IT, std::array< char, MAXVERTNAME > > ReadGeneralizedTuples(const std::string &, _BinaryOperation)
void DimApply(Dim dim, const FullyDistVec< IT, NT > &v, _BinaryOperation __binary_op)
FullyDistVec< IT, NT > Reduce(Dim dim, _BinaryOperation __binary_op, NT id, _UnaryOperation __unary_op) const
SpParMat< IT, NT, DER > SubsRefCol(const std::vector< IT > &ci) const
Column indexing with special parallel semantics.
bool operator==(const SpParMat< IT, NT, DER > &rhs) const
std::vector< std::vector< SpParMat< IT, NT, DER > > > BlockSplit(int br, int bc)
void ReadDistribute(const std::string &filename, int master, bool nonum, HANDLER handler, bool transpose=false, bool pario=false)
bool Kselect(FullyDistVec< GIT, VT > &rvec, IT k_limit, int kselectVersion) const
void MaskedReduce(FullyDistVec< GIT, VT > &rvec, FullyDistSpVec< GIT, VT > &mask, Dim dim, _BinaryOperation __binary_op, VT id, bool exclude=false) const
SpParMat< IT, NT, DER > Prune(_UnaryOperation __unary_op, bool inPlace=true)
void ActivateThreading(int numsplits)
void Find(FullyDistVec< IT, IT > &, FullyDistVec< IT, IT > &, FullyDistVec< IT, NT > &) const
float LoadImbalance() const
void SetDifference(const SpParMat< IT, NT, DER > &rhs)
SpParMat< IT, NT, DER > SubsRef_SR(const FullyDistVec< IT, IT > &ri, const FullyDistVec< IT, IT > &ci, bool inplace=false)
General indexing with serial semantics.
void SpAsgn(const FullyDistVec< IT, IT > &ri, const FullyDistVec< IT, IT > &ci, SpParMat< IT, NT, DER > &B)
SpParMat< IT, NT, DER > & operator+=(const SpParMat< IT, NT, DER > &rhs)
void Dump(std::string filename) const
void UpdateDense(DenseParMat< IT, NT > &rhs, _BinaryOperation __binary_op) const
friend SpParMat< IU, typename promote_trait< NU1, NU2 >::T_promote, typename promote_trait< UDER1, UDER2 >::T_promote > EWiseMult(const SpParMat< IU, NU1, UDER1 > &A, const SpParMat< IU, NU2, UDER2 > &B, bool exclude)
void AddLoops(NT loopval, bool replaceExisting=false)
void SaveGathered(std::string filename, HANDLER handler, bool transpose=false) const
SpParMat< IT, NT, DER > & operator=(const SpParMat< IT, NT, DER > &rhs)
void ParallelReadMM(const std::string &filename, bool onebased, _BinaryOperation BinOp)
void ParallelBinaryWrite(std::string filename) const
bool Kselect1(FullyDistVec< GIT, VT > &rvec, IT k_limit, _UnaryOperation __unary_op) const
void OptimizeForGraph500(OptBuf< LIT, OT > &optbuf)
std::ofstream & put(std::ofstream &outfile) const
void ParallelWriteMM(const std::string &filename, bool onebased, HANDLER handler)
SpParMat()
Deprecated. Don't call the default constructor.
DER InducedSubgraphs2Procs(const FullyDistVec< IT, IT > &Assignments, std::vector< IT > &LocalIdxs) const
int Owner(IT total_m, IT total_n, IT grow, IT gcol, LIT &lrow, LIT &lcol) const
void PruneColumnByIndex(const FullyDistSpVec< IT, IRRELEVANT_NT > &ci)
SpParMat< IT, NT, DER > PruneColumn(const FullyDistVec< IT, NT > &pvals, _BinaryOperation __binary_op, bool inPlace=true)
Prune every column of a sparse matrix based on pvals.
void SparseCommon(std::vector< std::vector< std::tuple< LIT, LIT, NT > > > &data, LIT locsize, IT total_m, IT total_n, _BinaryOperation BinOp)
#define MEM_EFFICIENT_STAGES
#define mm_is_complex(typecode)
#define mm_is_hermitian(typecode)
char * mm_typecode_to_str(MM_typecode matcode)
#define mm_is_real(typecode)
#define mm_is_pattern(typecode)
#define mm_is_integer(typecode)
int mm_read_mtx_crd_size(FILE *f, int64_t *M, int64_t *N, int64_t *nz, int64_t *numlinesread)
int mm_read_banner(FILE *f, MM_typecode *matcode)
#define mm_is_symmetric(typecode)
HeaderInfo ParseHeader(const std::string &inputname, FILE *&f, int &seeklength)
MPI_Datatype MPIType< double >(void)
std::ofstream & operator<<(std::ofstream &outfile, const SpMat< UIT, UNT, UDER > &s)
Dcsc< IU, typename promote_trait< NU1, NU2 >::T_promote > SetDifference(const Dcsc< IU, NU1 > &A, const Dcsc< IU, NU2 > *B)
MPI_Datatype MPIType(void)
MPI_Datatype MPIType< int64_t >(void)
void AllGatherVector(MPI_Comm &ColWorld, int trxlocnz, IU lenuntil, int32_t *&trxinds, NV *&trxnums, int32_t *&indacc, NV *&numacc, int &accnz, bool indexisvalue)
void TransposeVector(MPI_Comm &World, const FullyDistSpVec< IU, NV > &x, int32_t &trxlocnz, IU &lenuntil, int32_t *&trxinds, NV *&trxnums, bool indexisvalue)
MPI_Datatype MPIType< uint64_t >(void)
shared_ptr< CommGrid > ProductGrid(CommGrid *gridA, CommGrid *gridB, int &innerdim, int &Aoffset, int &Boffset)
Collection of Generic Sequential Functions.
unsigned __int64 uint64_t