36template <
class IT,
class NT>
38:m(nRow), n(nCol), nnz(
size)
42 tuples =
new std::tuple<IT, IT, NT>[nnz];
48 isOperatorNew =
false;
51template <
class IT,
class NT>
52SpTuples<IT,NT>::SpTuples (
int64_t size,
IT nRow,
IT nCol, std::tuple<IT, IT, NT> * mytuples,
bool sorted,
bool isOpNew)
53:tuples(mytuples), m(nRow), n(nCol), nnz(
size), isOperatorNew(isOpNew)
69template <
class IT,
class NT>
70SpTuples<IT,NT>::SpTuples (
int64_t maxnnz,
IT nRow,
IT nCol, std::vector<IT> & edges,
bool removeloops):m(nRow), n(nCol)
74 tuples =
new std::tuple<IT, IT, NT>[maxnnz];
78 rowindex(i) = edges[2*i+0];
79 colindex(i) = edges[2*i+1];
82 std::vector<IT>().swap(edges);
93 while(j < maxnnz && rowindex(cnz) == rowindex(j) && colindex(cnz) == colindex(j))
95 numvalue(cnz) += numvalue(j);
99 if(removeloops && rowindex(cnz) == colindex(cnz))
109 std::tuple<IT, IT, NT> * ntuples =
new std::tuple<IT,IT,NT>[nnz];
111 for(
int64_t i=0; i<maxnnz; ++i)
115 ntuples[j++] = tuples[i];
122 isOperatorNew =
false;
131template <
class IT,
class NT>
132SpTuples<IT,NT>::SpTuples (
int64_t size,
IT nRow,
IT nCol, StackEntry<
NT, std::pair<IT,IT> > * & multstack)
133:m(nRow), n(nCol), nnz(
size)
135 isOperatorNew =
false;
138 tuples =
new std::tuple<IT, IT, NT>[nnz];
142 colindex(i) = multstack[i].key.first;
143 rowindex(i) = multstack[i].key.second;
144 numvalue(i) = multstack[i].value;
150template <
class IT,
class NT>
151SpTuples<IT,NT>::~SpTuples()
154 if((nnz > 0) && (tuples_deleted !=
true))
157 ::operator
delete(tuples);
168template <
class IT,
class NT>
169SpTuples<IT,NT>::SpTuples(
const SpTuples<IT,NT> & rhs): m(rhs.m), n(rhs.n), nnz(rhs.nnz)
171 tuples =
new std::tuple<IT, IT, NT>[nnz];
172 isOperatorNew =
false;
173 for(
IT i=0; i< nnz; ++i)
175 tuples[i] = rhs.tuples[i];
180template <
class IT,
class NT>
181SpTuples<IT,NT>::SpTuples (
const SpDCCols<IT,NT> & rhs): m(rhs.m), n(rhs.n), nnz(rhs.nnz)
185 FillTuples(rhs.dcsc);
187 isOperatorNew =
false;
192template <
class IT,
class NT>
193SpTuples<IT, NT>::SpTuples (
const SpCCols<IT, NT> &rhs) :
194 m(rhs.m), n(rhs.n), nnz(rhs.nnz)
196 isOperatorNew =
false;
199 tuples =
new std::tuple<IT, IT, NT>[nnz];
200 Csc<IT, NT> *csc = rhs.csc;
202 for (
IT i = 0; i < csc->n; ++i)
204 for (
IT j = csc->jc[i]; j < csc->jc[i + 1]; ++j)
207 rowindex(k) = csc->ir[j];
208 numvalue(k++) = csc->num[j];
216template <
class IT,
class NT>
217inline void SpTuples<IT,NT>::FillTuples (Dcsc<IT,NT> * mydcsc)
219 tuples =
new std::tuple<IT, IT, NT>[nnz];
221 for(
IT i = 0; i< mydcsc->nzc; ++i)
223 for(
IT j = mydcsc->cp[i]; j< mydcsc->cp[i+1]; ++j)
225 colindex(k) = mydcsc->jc[i];
226 rowindex(k) = mydcsc->ir[j];
227 numvalue(k++) = mydcsc->numx[j];
236template <
class IT,
class NT>
237SpTuples<IT,NT> & SpTuples<IT,NT>::operator=(
const SpTuples<IT,NT> & rhs)
245 ::operator
delete(tuples);
252 isOperatorNew =
false;
256 tuples =
new std::tuple<IT, IT, NT>[nnz];
257 for(
IT i=0; i< nnz; ++i)
259 tuples[i] = rhs.tuples[i];
269template <
class IT,
class NT>
270template <
typename BINFUNC>
271void SpTuples<IT,NT>::RemoveDuplicates(BINFUNC BinOp)
275 std::vector< std::tuple<IT, IT, NT> > summed;
276 summed.push_back(tuples[0]);
278 for(
IT i=1; i< nnz; ++i)
280 if((joker::get<0>(summed.back()) == joker::get<0>(tuples[i])) && (joker::get<1>(summed.back()) == joker::get<1>(tuples[i])))
282 joker::get<2>(summed.back()) = BinOp(joker::get<2>(summed.back()), joker::get<2>(tuples[i]));
286 summed.push_back(tuples[i]);
291 ::operator
delete(tuples);
294 tuples =
new std::tuple<IT, IT, NT>[summed.size()];
295 isOperatorNew =
false;
296 std::copy(summed.begin(), summed.end(), tuples);
304template <
class IT,
class NT>
305std::ifstream& SpTuples<IT,NT>::getstream (std::ifstream& infile)
307 std::cout <<
"Getting... SpTuples" << std::endl;
309 if (infile.is_open())
311 while ( (!infile.eof()) && cnz < nnz)
313 infile >> rowindex(cnz) >> colindex(cnz) >> numvalue(cnz);
318 if((rowindex(cnz) > m) || (colindex(cnz) > n))
320 std::cerr <<
"supplied matrix indices are beyond specified boundaries, aborting..." << std::endl;
328 std::cerr <<
"input file is not open!" << std::endl;
335template <
class IT,
class NT>
336std::ofstream& SpTuples<IT,NT>::putstream(std::ofstream& outfile)
const
338 outfile << m <<
"\t"<< n <<
"\t"<< nnz<<std::endl;
339 for (
IT i = 0; i < nnz; ++i)
341 outfile << rowindex(i)+1 <<
"\t"<< colindex(i)+1 <<
"\t"
342 << numvalue(i) << std::endl;
347template <
class IT,
class NT>
348void SpTuples<IT,NT>::PrintInfo()
350 std::cout <<
"This is a SpTuples class" << std::endl;
352 std::cout <<
"m: " << m ;
353 std::cout <<
", n: " << n ;
354 std::cout <<
", nnz: "<< nnz << std::endl;
356 for(
IT i=0; i< nnz; ++i)
358 if(rowindex(i) < 0 || colindex(i) < 0)
360 std::cout <<
"Negative index at " << i << std::endl;
363 else if(rowindex(i) >= m || colindex(i) >= n)
365 std::cout <<
"Index " << i <<
" too big with values (" << rowindex(i) <<
","<< colindex(i) <<
")" << std::endl;
371 NT **
A = SpHelper::allocate2D<NT>(m,n);
372 for(
IT i=0; i< m; ++i)
373 for(
IT j=0; j<n; ++j)
376 for(
IT i=0; i< nnz; ++i)
378 A[rowindex(i)][colindex(i)] = numvalue(i);
380 for(
IT i=0; i< m; ++i)
382 for(
IT j=0; j<n; ++j)
384 std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2) <<
A[i][j];
387 std::cout << std::endl;
389 SpHelper::deallocate2D(
A,m);