67template <
class IT,
class NT,
class DER>
85 template <
class DELIT>
96 template <
typename SR>
107 template <
typename _BinaryOperation>
110 template <
typename _BinaryOperation,
typename _UnaryOperation >
113 template <
typename _BinaryOperation>
116 template <
typename VT,
typename GIT,
typename _BinaryOperation,
typename _UnaryOperation >
119 template <
typename VT,
typename GIT,
typename _BinaryOperation>
122 template <
typename VT,
typename GIT>
124 template <
typename VT,
typename GIT>
127 template <
typename VT,
typename GIT,
typename _UnaryOperation>
129 template <
typename VT,
typename GIT,
typename _UnaryOperation>
131 template <
typename VT,
typename GIT>
133 template <
typename VT,
typename GIT>
139 template <
typename VT,
typename GIT,
typename _BinaryOperation>
141 template <
typename VT,
typename GIT,
typename _BinaryOperation,
typename _UnaryOperation >
144 template <
typename _UnaryOperation>
154 template <
typename LIT,
typename OT>
158 template <
typename _UnaryOperation>
174 template <
typename _UnaryOperation>
188 template <
typename _BinaryOperation>
191 template <
typename _BinaryOperation>
194 template <
typename _BinaryOperation>
207 template <
typename LIT>
213 template <
typename SelectFirstSR,
typename SelectSecondSR>
232 std::cout <<
"binaryfill(): error reading row index" << std::endl;
234 std::cout <<
"binaryfill(): error reading col index" << std::endl;
236 std::cout <<
"binaryfill(): error reading value" << std::endl;
241 template <
typename c,
typename t>
249 template <
typename c,
typename t>
256 template <
typename _BinaryOperation>
259 template <
typename _BinaryOperation>
262 template <
class HANDLER>
269 template <
class HANDLER>
275 std::shared_ptr<CommGrid>
getcommgrid()
const {
return commGrid; }
276 typename DER::LocalIT
getlocalrows()
const {
return spSeq->getnrow(); }
278 typename DER::LocalIT
getlocalnnz()
const {
return spSeq->getnnz(); }
282 template <
typename _BinaryOperation,
typename LIT>
286 template <
typename SR,
typename NUO,
typename UDERO,
typename IU,
typename NU1,
typename NU2,
typename UDER1,
typename UDER2>
290 template <
typename SR,
typename NUO,
typename UDERO,
typename IU,
typename NU1,
typename NU2,
typename UDER1,
typename UDER2>
294 template <
typename IU,
typename NU1,
typename NU2,
typename UDERA,
typename UDERB>
297 template <
typename SR,
typename IU,
typename NU1,
typename NU2,
typename UDER1,
typename UDER2>
301 template <
typename SR,
typename IU,
typename NU1,
typename NU2,
typename UDER1,
typename UDER2>
305 template <
typename SR,
typename IU,
typename NU1,
typename NU2,
typename UDER1,
typename UDER2>
309 template <
typename SR,
typename NUO,
typename UDERO,
typename IU,
typename NU1,
typename NU2,
typename UDERA,
typename UDERB>
313 template <
typename SR,
typename IU,
typename NUM,
typename NUV,
typename UDER>
317 template <
typename SR,
typename IU,
typename NUM,
typename NUV,
typename UDER>
321 template <
typename SR,
typename IU,
typename NUM,
typename UDER>
326 template <
typename SR,
typename IVT,
typename OVT,
typename IU,
typename NUM,
typename UDER>
329 template <
typename SR,
typename IVT,
typename OVT,
typename IU,
typename NUM,
typename UDER>
332 template <
typename IU,
typename NU1,
typename NU2,
typename UDER1,
typename UDER2>
336 template <
typename RETT,
typename RETDER,
typename IU,
typename NU1,
typename NU2,
typename UDERA,
typename UDERB,
typename _BinaryOperation>
340 template <
typename RETT,
typename RETDER,
typename IU,
typename NU1,
typename NU2,
typename UDERA,
typename UDERB,
typename _BinaryOperation,
typename _BinaryPredicate>
342 EWiseApply (
const SpParMat<IU,NU1,UDERA> &
A,
const SpParMat<IU,NU2,UDERB> &
B,
_BinaryOperation __binary_op,
_BinaryPredicate do_op,
bool allowANulls,
bool allowBNulls,
const NU1&
ANullVal,
const NU2&
BNullVal,
const bool allowIntersect,
const bool useExtendedBinOp);
344 template<
typename SR,
typename IVT,
typename OVT,
typename IU,
typename NUM,
typename UDER>
348 template<
typename VT,
typename IU,
typename UDER>
352 typedef std::array<char, MAXVERTNAME> STRASARRAY;
353 typedef std::pair< STRASARRAY, uint64_t> TYPE2SEND;
355 class CharArraySaveHandler
359 template <
typename c,
typename t>
368 MPI_File TupleRead1stPassNExchange (
const std::string & filename, TYPE2SEND * & senddata, IT & totsend, FullyDistVec<IT,STRASARRAY> & distmapper,
uint64_t & totallength);
370 template <
typename VT,
typename GIT,
typename _BinaryOperation,
typename _UnaryOperation >
371 void Reduce(FullyDistVec<GIT,VT> & rvec,
Dim dim, _BinaryOperation __binary_op, VT
id, _UnaryOperation __unary_op, MPI_Op mympiop)
const;
374 template <
typename VT,
typename GIT>
375 void TopKGather(std::vector<NT> & all_medians, std::vector<IT> & nnz_per_col,
int & thischunk,
int & chunksize,
376 const std::vector<NT> & medians,
const std::vector<IT> & nnzperc,
int itersuntil, std::vector< std::vector<NT> > & localmat,
377 const std::vector<IT> & actcolsmap, std::vector<IT> & klimits, std::vector<IT> & toretain, std::vector<std::vector<std::pair<IT,NT>>> & tmppair,
378 IT coffset,
const FullyDistVec<GIT,VT> & rvec)
const;
380 void GetPlaceInGlobalGrid(IT& rowOffset, IT& colOffset)
const;
382 void HorizontalSend(IT * & rows, IT * & cols, NT * & vals, IT * & temprows, IT * & tempcols, NT * & tempvals, std::vector < std::tuple <IT,IT,NT> > & localtuples,
383 int * rcurptrs,
int * rdispls, IT buffperrowneigh,
int rowneighs,
int recvcount, IT m_perproc, IT n_perproc,
int rankinrow);
385 template <
class HANDLER>
386 void 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,
387 IT m_perproc, IT n_perproc,
int rowneighs,
int colneighs, IT buffperrowneigh, IT buffpercolneigh, IT entriestoread, HANDLER handler,
int rankinrow,
bool transpose);
389 void VerticalSend(IT * & rows, IT * & cols, NT * & vals, std::vector< std::tuple<IT,IT,NT> > & localtuples,
int * rcurptrs,
int * ccurptrs,
int * rdispls,
int * cdispls,
390 IT m_perproc, IT n_perproc,
int rowneighs,
int colneighs, IT buffperrowneigh, IT buffpercolneigh,
int rankinrow);
392 void AllocateSetBuffers(IT * & rows, IT * & cols, NT * & vals,
int * & rcurptrs,
int * & ccurptrs,
int rowneighs,
int colneighs, IT buffpercolneigh);
393 void BcastEssentials(MPI_Comm & world, IT & total_m, IT & total_n, IT & total_nnz,
int master);
395 std::shared_ptr<CommGrid> commGrid;
398 template <
class IU,
class NU>
401 template <
typename IU,
typename NU,
typename UDER>
405template <
typename SR,
typename NUO,
typename UDERO,
typename IU,
typename NU1,
typename NU2,
typename UDER1,
typename UDER2>
406void PSpGEMM(
SpParMat<IU,NU1,UDER1> &
A,
SpParMat<IU,NU2,UDER2> &
B,
SpParMat<IU,NUO,UDERO> &
out,
bool clearA =
false,
bool clearB =
false)
411template <
typename SR,
typename IU,
typename NU1,
typename NU2,
typename UDER1,
typename UDER2>
412SpParMat<IU,typename promote_trait<NU1,NU2>::T_promote,
typename promote_trait<UDER2,UDER2>::T_promote>
413 PSpGEMM (SpParMat<IU,NU1,UDER1> &
A, SpParMat<IU,NU2,UDER2> &
B,
bool clearA =
false,
bool clearB =
false)
415 typedef typename promote_trait<NU1,NU2>::T_promote N_promote;
416 typedef typename promote_trait<UDER1,UDER2>::T_promote DER_promote;
417 return Mult_AnXBn_Synch<SR, N_promote, DER_promote> (
A,
B, clearA, clearB );
NT read(std::basic_istream< c, t > &is, IT row, IT col)
NT getNoNum(IT row, IT col)
void save(std::basic_ostream< c, t > &os, const NT &v, IT row, IT col)
void binaryfill(FILE *rFile, IT &row, IT &col, NT &val)
bool Kselect2(FullyDistVec< GIT, VT > &rvec, IT k_limit) const
void EWiseScale(const DenseParMat< IT, NT > &rhs)
void ReadDistribute(const std::string &filename, int master, bool nonum=false, bool pario=false)
friend SpParMat< IU, typename promote_trait< NU1, NU2 >::T_promote, typename promote_trait< UDER1, UDER2 >::T_promote > Mult_AnXBn_Fence(const SpParMat< IU, NU1, UDER1 > &A, const SpParMat< IU, NU2, UDER2 > &B)
FullyDistVec< IT, std::array< char, MAXVERTNAME > > ReadGeneralizedTuples(const std::string &, _BinaryOperation)
void SaveGathered(std::string filename) const
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(DER *myseq, MPI_Comm &world)
friend std::ofstream & operator<<(std::ofstream &outfile, const SpParMat< IU, NU, UDER > &s)
SpParMat< IT, NT, DER > PruneI(_UnaryOperation __unary_op, bool inPlace=true)
SpParMat(IT total_m, IT total_n, const FullyDistVec< IT, IT > &, const FullyDistVec< IT, IT > &, const FullyDistVec< IT, NT > &, bool SumDuplicates=false)
friend void LocalSpMV(const SpParMat< IU, NUM, UDER > &A, int rowneighs, OptBuf< int32_t, OVT > &optbuf, int32_t *&indacc, IVT *&numacc, int32_t *&sendindbuf, OVT *&sendnumbuf, int *&sdispls, int *sendcnt, int accnz, bool indexisvalue, PreAllocatedSPA< OVT > &SPA)
SpParMat(const DistEdgeList< DELIT > &rhs, bool removeloops=true)
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
friend FullyDistSpVec< IU, typename promote_trait< NUM, NUV >::T_promote > SpMV(const SpParMat< IU, NUM, UDER > &A, const FullyDistSpVec< IU, NUV > &x)
friend void LocalSpMV(const SpParMat< IU, bool, UDER > &A, int rowneighs, OptBuf< int32_t, VT > &optbuf, int32_t *&indacc, VT *&numacc, int *sendcnt, int accnz)
friend SpParMat< IU, typename promote_trait< NU1, NU2 >::T_promote, typename promote_trait< UDER1, UDER2 >::T_promote > Mult_AnXBn_PassiveTarget(const SpParMat< IU, NU1, UDER1 > &A, const SpParMat< IU, NU2, UDER2 > &B)
void ReadDistribute(const std::string &filename, int master, bool nonum, HANDLER handler, bool transpose=false, bool pario=false)
SpParMat(IT total_m, IT total_n, const FullyDistVec< IT, IT > &, const FullyDistVec< IT, IT > &, const NT &, bool SumDuplicates=false)
bool Kselect(FullyDistVec< GIT, VT > &rvec, IT k_limit, int kselectVersion) const
FullyDistVec< IT, NT > Reduce(Dim dim, _BinaryOperation __binary_op, NT id) const
void MaskedReduce(FullyDistVec< GIT, VT > &rvec, FullyDistSpVec< GIT, VT > &mask, Dim dim, _BinaryOperation __binary_op, VT id, bool exclude=false) const
SpParMat(std::ifstream &input, MPI_Comm &world)
SpParMat< IT, NT, DER > PruneColumn(const FullyDistSpVec< IT, NT > &pvals, _BinaryOperation __binary_op, bool inPlace=true)
void EWiseMult(const SpParMat< IT, NT, DER > &rhs, bool exclude)
DER::LocalIT getlocalcols() const
bool Kselect1(FullyDistSpVec< GIT, VT > &rvec, IT k_limit, _UnaryOperation __unary_op) const
bool Kselect1(FullyDistVec< GIT, VT > &rvec, IT k_limit) 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
friend SpParMat< IU, NUO, UDERO > MemEfficientSpGEMM(SpParMat< IU, NU1, UDERA > &A, SpParMat< IU, NU2, UDERB > &B, int phases, NUO hardThreshold, IU selectNum, IU recoverNum, NUO recoverPct, int kselectVersion, int64_t perProcessMem)
float LoadImbalance() const
friend SpParMat< IU, NUO, UDERO > Mult_AnXBn_DoubleBuff(SpParMat< IU, NU1, UDER1 > &A, SpParMat< IU, NU2, UDER2 > &B, bool clearA, bool clearB)
Friend declarations.
void Reduce(FullyDistVec< GIT, VT > &rvec, Dim dim, _BinaryOperation __binary_op, VT id, _UnaryOperation __unary_op) const
SpParMat(std::shared_ptr< CommGrid > grid)
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)
void AddLoops(FullyDistVec< IT, NT > loopvals, bool replaceExisting=false)
bool Kselect(FullyDistSpVec< GIT, VT > &kth, IT k_limit, int kselectVersion) const
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
void Apply(_UnaryOperation __unary_op)
SpParMat(DER *myseq, std::shared_ptr< CommGrid > grid)
void Find(FullyDistVec< IT, IT > &, FullyDistVec< IT, IT > &) const
friend SpParMat< IU, RETT, RETDER > EWiseApply(const SpParMat< IU, NU1, UDERA > &A, const SpParMat< IU, NU2, UDERB > &B, _BinaryOperation __binary_op, bool notB, const NU2 &defaultBVal)
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)
DER::LocalIT getlocalrows() const
DER::LocalIT getlocalnnz() const
bool Kselect1(FullyDistVec< GIT, VT > &rvec, IT k_limit, _UnaryOperation __unary_op) const
void OptimizeForGraph500(OptBuf< LIT, OT > &optbuf)
SpParMat(const SpParMat< IT, NT, DER > &rhs)
friend SpParMat< IU, typename promote_trait< NU1, NU2 >::T_promote, typename promote_trait< UDER1, UDER2 >::T_promote > Mult_AnXBn_ActiveTarget(const SpParMat< IU, NU1, UDER1 > &A, const SpParMat< IU, NU2, UDER2 > &B)
std::ofstream & put(std::ofstream &outfile) const
void Reduce(FullyDistVec< GIT, VT > &rvec, Dim dim, _BinaryOperation __binary_op, VT id) const
int Owner(IT total_m, IT total_n, IT grow, IT gcol, LIT &lrow, LIT &lcol) const
SpParMat< IT, NT, DER > PruneColumn(const FullyDistVec< IT, NT > &pvals, _BinaryOperation __binary_op, bool inPlace=true)
std::shared_ptr< CommGrid > getcommgrid() const
void MaskedReduce(FullyDistVec< GIT, VT > &rvec, FullyDistSpVec< GIT, VT > &mask, Dim dim, _BinaryOperation __binary_op, VT id, _UnaryOperation __unary_op, bool exclude=false) const
SpParMat< IT, NT, DER > operator()(const FullyDistVec< IT, IT > &ri, const FullyDistVec< IT, IT > &ci, bool inplace=false)
void Prune(const FullyDistVec< IT, IT > &ri, const FullyDistVec< IT, IT > &ci)
prune all entries whose row indices are in ri and column indices are in ci
friend int64_t EstPerProcessNnzSUMMA(SpParMat< IU, NU1, UDERA > &A, SpParMat< IU, NU2, UDERB > &B)
void SparseCommon(std::vector< std::vector< std::tuple< LIT, LIT, NT > > > &data, LIT locsize, IT total_m, IT total_n, _BinaryOperation BinOp)
friend SpParMat< IU, NUO, UDERO > Mult_AnXBn_Synch(SpParMat< IU, NU1, UDER1 > &A, SpParMat< IU, NU2, UDER2 > &B, bool clearA, bool clearB)
void PSpGEMM(SpParMat< IU, NU1, UDER1 > &A, SpParMat< IU, NU2, UDER2 > &B, SpParMat< IU, NUO, UDERO > &out, bool clearA=false, bool clearB=false)
unsigned __int64 uint64_t