39template <
class IT,
class NT>
42template <
class IT,
class NT>
54template <
class IT,
class NT>
64 rindex = std::numeric_limits<IT>::max();
65 cindex = std::numeric_limits<IT>::max();
70template <
class IT,
class NT>
73 if(nnz == 0)
return *
this;
87 while(i< nzc &&
cindex < std::numeric_limits<IT>::max())
108 for(
IT k = cp[i-1]; k< cp[i]; ++k)
120 while (
ii < cp[i+1] &&
cindex == jc[i])
161 for(
IT k = cp[i-1]; k< cp[i]; ++k)
168 while(
cindex < std::numeric_limits<IT>::max())
194template <
class IT,
class NT>
215 for(
IT i=1; i<
nz; ++i)
237template <
class IT,
class NT>
247 std::fill_n(
numx, nnz,
static_cast<NT>(1));
262template <
class IT,
class NT>
263template <
typename NNT>
268 for(
IT i=0; i< nz; ++i)
272 std::copy(ir, ir+nz,
convert.ir);
273 std::copy(jc, jc+nzc,
convert.jc);
274 std::copy(cp, cp+nzc+1,
convert.cp);
278template <
class IT,
class NT>
279template <
typename NIT,
typename NNT>
284 for(
IT i=0; i< nz; ++i)
286 for(
IT i=0; i< nz; ++i)
288 for(
IT i=0; i< nzc; ++i)
290 for(
IT i=0; i<= nzc; ++i)
295template <
class IT,
class NT>
327template <
class IT,
class NT>
349 std::copy(
rhs.numx,
rhs.numx + nz, numx);
350 std::copy(
rhs.ir,
rhs.ir + nz, ir);
361 std::copy(
rhs.jc,
rhs.jc + nzc, jc);
362 std::copy(
rhs.cp,
rhs.cp + nzc + 1, cp);
373template <
class IT,
class NT>
385 while(i< nzc &&
j<
rhs.nzc)
387 if(jc[i] >
rhs.jc[
j])
397 else if(jc[i] <
rhs.jc[
j])
400 for(
IT k = cp[i-1]; k< cp[i]; k++)
413 while (
ii < cp[i+1] &&
jj <
rhs.cp[
j+1])
449 for(
IT k = cp[i-1]; k< cp[i]; ++k)
471template <
class IT,
class NT>
474 if(nzc !=
rhs.nzc)
return false;
475 bool same = std::equal(cp, cp+nzc+1,
rhs.cp);
480 std::vector<NT>
error(nz);
483 for(
IT i=0; i < nz; ++i)
488 std::cout <<
"Highest 10 different entries are: " << std::endl;
489 for(
IT i=0; i < 10; ++i)
495 std::cout <<
"Highest different entries are: " << std::endl;
497 std::cout <<
"Diff: " <<
it->first <<
" on " <<
it->second << std::endl;
499 std::cout <<
"Same before num: " <<
same << std::endl;
512template <
class IT,
class NT>
521template <
class IT,
class NT>
522template <
typename _UnaryOperation,
typename GlobalIT>
528 for(
IT i=0; i<nzc; ++i)
531 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
554 for(
IT i=0; i<nzc; ++i)
602template <
class IT,
class NT>
603template <
typename _UnaryOperation>
609 for(
IT i=0; i<nzc; ++i)
612 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
635 for(
IT i=0; i<nzc; ++i)
684template <
class IT,
class NT>
685template <
typename _BinaryOperation>
691 for(
IT i=0; i<nzc; ++i)
694 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
718 for(
IT i=0; i<nzc; ++i)
768template <
class IT,
class NT>
769template <
typename _BinaryOperation>
776 for(
IT i=0; i<nzc; ++i)
782 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
813 for(
IT i=0; i<nzc; ++i)
873template <
class IT,
class NT>
876 for(
IT i=0; i<nzc; ++i)
879 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
882 numx[
j] *=
scaler[rowid][colid];
891template <
class IT,
class NT>
892template <
typename _BinaryOperation>
895 for(
IT i=0; i<nzc; ++i)
898 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
901 array[rowid][colid] =
__binary_op(array[rowid][colid], numx[
j]);
911template <
class IT,
class NT>
914 float cf =
static_cast<float>(
ndim+1) /
static_cast<float>(nzc);
923 for(
IT i = 0; i< nzc; ++i)
945template <
class IT,
class NT>
1012template<
class IT,
class NT>
1016 IT start =
aux[base];
1017 IT end =
aux[base+1];
1019 IT *
itr = std::find(jc + start, jc + end,
colind);
1029template<
class IT,
class NT>
1032 IT *
itr = std::lower_bound(jc, jc+nzc,
cut);
1042 std::copy(jc, jc+
pos,
A->jc);
1043 std::copy(cp, cp+
pos+1,
A->cp);
1044 std::copy(ir, ir+cp[
pos],
A->ir);
1045 std::copy(numx, numx + cp[
pos],
A->numx);
1054 std::copy(jc+
pos, jc+ nzc,
B->jc);
1056 std::copy(cp+
pos, cp+nzc+1,
B->cp);
1058 std::copy(ir+cp[
pos], ir+nz,
B->ir);
1059 std::copy(numx+cp[
pos], numx+nz,
B->numx);
1069template<
class IT,
class NT>
1073 std::vector<IT>
pos;
1088 std::copy(jc, jc+
pos[0],
parts[0]->jc);
1089 std::copy(cp, cp+
pos[0]+1,
parts[0]->cp);
1090 std::copy(ir, ir+cp[
pos[0]],
parts[0]->ir);
1091 std::copy(numx, numx + cp[
pos[0]],
parts[0]->numx);
1094 for(
int i=1; i<
ncuts; ++i)
1096 if(cp[
pos[i]] - cp[
pos[i-1]] == 0)
1106 std::copy(cp+
pos[i-1], cp+
pos[i]+1,
parts[i]->cp);
1109 std::copy(ir+cp[
pos[i-1]], ir+cp[
pos[i]],
parts[i]->ir);
1110 std::copy(numx+cp[
pos[i-1]], numx + cp[
pos[i]],
parts[i]->numx);
1133template<
class IT,
class NT>
1143 std::copy(
A->jc,
A->jc +
A->nzc, jc);
1144 std::copy(
B->jc,
B->jc +
B->nzc, jc +
A->nzc);
1147 std::copy(
A->cp,
A->cp +
A->nzc, cp);
1148 std::copy(
B->cp,
B->cp +
B->nzc +1, cp +
A->nzc);
1151 std::copy(
A->ir,
A->ir +
A->nz, ir);
1152 std::copy(
B->ir,
B->ir +
B->nz, ir +
A->nz);
1155 std::copy(
A->numx,
A->numx +
A->nz, numx);
1156 std::copy(
B->numx,
B->numx +
B->nz, numx +
A->nz);
1167template<
class IT,
class NT>
1209template<
class IT,
class NT>
1216 std::pair<IT,IT> *
isect =
new std::pair<IT,IT>[
mink];
1217 std::pair<IT,IT> *
range1 =
new std::pair<IT,IT>[nzc];
1218 std::pair<IT,IT> *
range2 =
new std::pair<IT,IT>[
nind];
1220 for(
IT i=0; i < nzc; ++i)
1222 range1[i] = std::make_pair(jc[i], i);
1224 for(
IT i=0; i <
nind; ++i)
1274template <
class IT,
class NT>
void EWiseScale(NT **scaler)
Dcsc< IT, NT > * PruneI(_UnaryOperation __unary_op, bool inPlace, GlobalIT rowOffset, GlobalIT colOffset)
void ColConcatenate(std::vector< Dcsc< IT, NT > * > &parts, std::vector< IT > &offsets)
void ColSplit(std::vector< Dcsc< IT, NT > * > &parts, std::vector< IT > &cuts)
Dcsc< IT, NT > * PruneColumn(NT *pvals, _BinaryOperation __binary_op, bool inPlace)
Dcsc< IT, NT > & operator=(const Dcsc< IT, NT > &rhs)
IT AuxIndex(const IT colind, bool &found, IT *aux, IT csize) const
IT * ir
row indices, size nz
bool operator==(const Dcsc< IT, NT > &rhs)
void Merge(const Dcsc< IT, NT > *Adcsc, const Dcsc< IT, NT > *B, IT cut)
Dcsc< IT, NT > * Prune(_UnaryOperation __unary_op, bool inPlace)
Dcsc< IT, NT > & AddAndAssign(StackEntry< NT, std::pair< IT, IT > > *multstack, IT mdim, IT ndim, IT nnz)
IT * cp
The master array, size nzc+1 (keeps column pointers)
void Resize(IT nzcnew, IT nznew)
IT nzc
number of columns with at least one non-zero in them
void Split(Dcsc< IT, NT > *&A, Dcsc< IT, NT > *&B, IT cut)
IT ConstructAux(IT ndim, IT *&aux) const
NT * numx
generic values, size nz
Dcsc< IT, NT > & operator+=(const Dcsc< IT, NT > &rhs)
void FillColInds(const VT *colnums, IT nind, std::vector< std::pair< IT, IT > > &colinds, IT *aux, IT csize) const
void UpdateDense(NT **array, _BinaryOperation __binary_op) const
IT * jc
col indices, size nzc
friend Dcsc< IU, typename promote_trait< NU1, NU2 >::T_promote > EWiseMult(const Dcsc< IU, NU1 > &A, const Dcsc< IU, NU2 > *B, bool exclude)
static void iota(_ForwardIter __first, _ForwardIter __last, T __val)
Dcsc< IU, typename promote_trait< NU1, NU2 >::T_promote > EWiseMult(const Dcsc< IU, NU1 > &A, const Dcsc< IU, NU2 > *B, bool exclude)