40template <
class IT,
class NT>
43template <
class IT,
class NT>
55template <
class IT,
class NT>
65 rindex = std::numeric_limits<IT>::max();
66 cindex = std::numeric_limits<IT>::max();
71template <
class IT,
class NT>
74 if(nnz == 0)
return *
this;
88 while(i< nzc &&
cindex < std::numeric_limits<IT>::max())
109 for(
IT k = cp[i-1]; k< cp[i]; ++k)
121 while (
ii < cp[i+1] &&
cindex == jc[i])
162 for(
IT k = cp[i-1]; k< cp[i]; ++k)
169 while(
cindex < std::numeric_limits<IT>::max())
195template <
class IT,
class NT>
216 for(
IT i=1; i<
nz; ++i)
238template <
class IT,
class NT>
248 std::fill_n(
numx, nnz,
static_cast<NT>(1));
263template <
class IT,
class NT>
264template <
typename NNT>
269 for(
IT i=0; i< nz; ++i)
273 std::copy(ir, ir+nz,
convert.ir);
274 std::copy(jc, jc+nzc,
convert.jc);
275 std::copy(cp, cp+nzc+1,
convert.cp);
279template <
class IT,
class NT>
280template <
typename NIT,
typename NNT>
285 for(
IT i=0; i< nz; ++i)
287 for(
IT i=0; i< nz; ++i)
289 for(
IT i=0; i< nzc; ++i)
291 for(
IT i=0; i<= nzc; ++i)
296template <
class IT,
class NT>
328template <
class IT,
class NT>
350 std::copy(
rhs.numx,
rhs.numx + nz, numx);
351 std::copy(
rhs.ir,
rhs.ir + nz, ir);
362 std::copy(
rhs.jc,
rhs.jc + nzc, jc);
363 std::copy(
rhs.cp,
rhs.cp + nzc + 1, cp);
374template <
class IT,
class NT>
386 while(i< nzc &&
j<
rhs.nzc)
388 if(jc[i] >
rhs.jc[
j])
398 else if(jc[i] <
rhs.jc[
j])
401 for(
IT k = cp[i-1]; k< cp[i]; k++)
414 while (
ii < cp[i+1] &&
jj <
rhs.cp[
j+1])
450 for(
IT k = cp[i-1]; k< cp[i]; ++k)
472template <
class IT,
class NT>
475 if(nzc !=
rhs.nzc)
return false;
476 bool same = std::equal(cp, cp+nzc+1,
rhs.cp);
481 std::vector<NT>
error(nz);
484 for(
IT i=0; i < nz; ++i)
489 std::cout <<
"Highest 10 different entries are: " << std::endl;
490 for(
IT i=0; i < 10; ++i)
496 std::cout <<
"Highest different entries are: " << std::endl;
498 std::cout <<
"Diff: " <<
it->first <<
" on " <<
it->second << std::endl;
500 std::cout <<
"Same before num: " <<
same << std::endl;
513template <
class IT,
class NT>
525template <
class IT,
class NT>
534template <
class IT,
class NT>
535template <
typename _UnaryOperation,
typename GlobalIT>
541 for(
IT i=0; i<nzc; ++i)
544 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
567 for(
IT i=0; i<nzc; ++i)
615template <
class IT,
class NT>
616template <
typename _UnaryOperation>
622 for(
IT i=0; i<nzc; ++i)
625 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
648 for(
IT i=0; i<nzc; ++i)
697template <
class IT,
class NT>
698template <
typename _BinaryOperation>
704 for(
IT i=0; i<nzc; ++i)
707 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
731 for(
IT i=0; i<nzc; ++i)
779template <
class IT,
class NT>
791 std::vector<NT>
vnumx;
795 if (c >=
ci.size() ||
ci[c] > jc[
j])
797 vjc.push_back(jc[
j]);
800 for (
IT p = cp[
j]; p < cp[
j+1]; ++p)
802 vir.push_back(ir[p]);
803 vnumx.push_back(numx[p]);
808 else if (
ci[c] < jc[
j]) ++c;
831 std::copy(
vjc.begin(),
vjc.end(), jc);
832 std::copy(
vir.begin(),
vir.end(), ir);
838template <
class IT,
class NT>
839template <
typename _BinaryOperation>
847 for(
IT i=0; i<nzc; ++i)
853 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
884 for(
IT i=0; i<nzc; ++i)
944template <
class IT,
class NT>
947 for(
IT i=0; i<nzc; ++i)
950 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
953 numx[
j] *=
scaler[rowid][colid];
962template <
class IT,
class NT>
963template <
typename _BinaryOperation>
966 for(
IT i=0; i<nzc; ++i)
969 for(
IT j=cp[i];
j < cp[i+1]; ++
j)
972 array[rowid][colid] =
__binary_op(array[rowid][colid], numx[
j]);
982template <
class IT,
class NT>
985 float cf =
static_cast<float>(
ndim+1) /
static_cast<float>(nzc);
994 for(
IT i = 0; i< nzc; ++i)
1016template <
class IT,
class NT>
1083template<
class IT,
class NT>
1087 IT start =
aux[base];
1088 IT end =
aux[base+1];
1090 IT *
itr = std::find(jc + start, jc + end,
colind);
1100template<
class IT,
class NT>
1103 IT *
itr = std::lower_bound(jc, jc+nzc,
cut);
1113 std::copy(jc, jc+
pos,
A->jc);
1114 std::copy(cp, cp+
pos+1,
A->cp);
1115 std::copy(ir, ir+cp[
pos],
A->ir);
1116 std::copy(numx, numx + cp[
pos],
A->numx);
1125 std::copy(jc+
pos, jc+ nzc,
B->jc);
1127 std::copy(cp+
pos, cp+nzc+1,
B->cp);
1129 std::copy(ir+cp[
pos], ir+nz,
B->ir);
1130 std::copy(numx+cp[
pos], numx+nz,
B->numx);
1140template<
class IT,
class NT>
1144 std::vector<IT>
pos;
1159 std::copy(jc, jc+
pos[0],
parts[0]->jc);
1160 std::copy(cp, cp+
pos[0]+1,
parts[0]->cp);
1161 std::copy(ir, ir+cp[
pos[0]],
parts[0]->ir);
1162 std::copy(numx, numx + cp[
pos[0]],
parts[0]->numx);
1165 for(
int i=1; i<
ncuts; ++i)
1167 if(cp[
pos[i]] - cp[
pos[i-1]] == 0)
1177 std::copy(cp+
pos[i-1], cp+
pos[i]+1,
parts[i]->cp);
1180 std::copy(ir+cp[
pos[i-1]], ir+cp[
pos[i]],
parts[i]->ir);
1181 std::copy(numx+cp[
pos[i-1]], numx + cp[
pos[i]],
parts[i]->numx);
1204template<
class IT,
class NT>
1214 std::copy(
A->jc,
A->jc +
A->nzc, jc);
1215 std::copy(
B->jc,
B->jc +
B->nzc, jc +
A->nzc);
1218 std::copy(
A->cp,
A->cp +
A->nzc, cp);
1219 std::copy(
B->cp,
B->cp +
B->nzc +1, cp +
A->nzc);
1222 std::copy(
A->ir,
A->ir +
A->nz, ir);
1223 std::copy(
B->ir,
B->ir +
B->nz, ir +
A->nz);
1226 std::copy(
A->numx,
A->numx +
A->nz, numx);
1227 std::copy(
B->numx,
B->numx +
B->nz, numx +
A->nz);
1238template<
class IT,
class NT>
1280template<
class IT,
class NT>
1287 std::pair<IT,IT> *
isect =
new std::pair<IT,IT>[
mink];
1288 std::pair<IT,IT> *
range1 =
new std::pair<IT,IT>[nzc];
1289 std::pair<IT,IT> *
range2 =
new std::pair<IT,IT>[
nind];
1291 for(
IT i=0; i < nzc; ++i)
1293 range1[i] = std::make_pair(jc[i], i);
1295 for(
IT i=0; i <
nind; ++i)
1345template <
class IT,
class NT>
void convert(string ifname, string ofname, string sort="revsize")
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 PruneColumnByIndex(const std::vector< IT > &ci)
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)
friend Dcsc< IU, typename promote_trait< NU1, NU2 >::T_promote > SetDifference(const Dcsc< IU, NU1 > &A, const Dcsc< IU, NU2 > *B)
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 > SetDifference(const Dcsc< IU, NU1 > &A, const Dcsc< IU, NU2 > *B)
Dcsc< IU, typename promote_trait< NU1, NU2 >::T_promote > EWiseMult(const Dcsc< IU, NU1 > &A, const Dcsc< IU, NU2 > *B, bool exclude)