16 template <
typename T,
typename indexT,
bool columnMajor>
18 return (*
this)(row, col);
22 template <
typename T,
typename indexT,
bool columnMajor>
28 template <
typename T,
typename indexT,
bool columnMajor>
34 template <
typename T,
typename indexT,
bool columnMajor>
40 template <
typename T,
typename indexT,
bool columnMajor>
47 template <
typename T,
typename indexT,
bool columnMajor>
50 if (valueSizes ==
nullptr) {
53 return valueSizes[vec];
57 template <
typename T,
typename indexT,
bool columnMajor>
60 if (indexSizes ==
nullptr) {
63 return indexSizes[vec];
67 template <
typename T,
typename indexT,
bool columnMajor>
76 template <
typename T,
typename indexT,
bool columnMajor>
79 FILE *fp = fopen(filename,
"wb");
82 fwrite(metadata, 1, NUM_META_DATA *
sizeof(uint32_t), fp);
85 for (uint32_t i = 0; i < outerDim; ++i) {
86 fwrite(&valueSizes[i], 1,
sizeof(indexT), fp);
88 for (uint32_t i = 0; i < outerDim; ++i) {
89 fwrite(&indexSizes[i], 1,
sizeof(indexT), fp);
93 for (uint32_t i = 0; i < outerDim; ++i) {
94 fwrite(values[i], 1, valueSizes[i] *
sizeof(T), fp);
98 for (uint32_t i = 0; i < outerDim; ++i) {
99 fwrite(counts[i], 1, valueSizes[i] *
sizeof(indexT), fp);
103 for (uint32_t i = 0; i < outerDim; ++i) {
104 fwrite(indices[i], 1, indexSizes[i] *
sizeof(indexT), fp);
112 template <
typename T,
typename indexT,
bool columnMajor>
114 std::cout << std::endl;
115 std::cout <<
"IVSparse Matrix" << std::endl;
118 if (numRows < 100 && numCols < 100) {
120 for (uint32_t i = 0; i < numRows; i++) {
121 for (uint32_t j = 0; j < numCols; j++) {
122 std::cout <<
coeff(i, j) <<
" ";
124 std::cout << std::endl;
126 }
else if (numRows > 100 && numCols > 100) {
128 for (uint32_t i = 0; i < 100; i++) {
129 for (uint32_t j = 0; j < 100; j++) {
130 std::cout <<
coeff(i, j) <<
" ";
132 std::cout << std::endl;
136 std::cout << std::endl;
140 template <
typename T,
typename indexT,
bool columnMajor>
143 Eigen::SparseMatrix<T, columnMajor ? Eigen::ColMajor : Eigen::RowMajor>
144 eigenMatrix(numRows, numCols);
147 for (uint32_t i = 0; i < outerDim; ++i) {
151 eigenMatrix.insert(it.row(), it.col()) = it.value();
156 eigenMatrix.makeCompressed();
166 template <
typename T,
typename indexT,
bool columnMajor>
169 T *values = (T *)malloc(nnz *
sizeof(T));
170 indexT *indices = (indexT *)malloc(nnz *
sizeof(indexT));
171 indexT *colPtrs = (indexT *)malloc((outerDim + 1) *
sizeof(indexT));
176 std::map<indexT, T> dict[outerDim];
179 for (uint32_t i = 0; i < outerDim; ++i) {
183 dict[i][it.getIndex()] = it.value();
186 colPtrs[i + 1] = colPtrs[i] + count;
191 for (uint32_t i = 0; i < outerDim; ++i) {
192 for (
auto &pair : dict[i]) {
193 values[count] = pair.second;
194 indices[count] = pair.first;
211 template <
typename T,
typename indexT,
bool columnMajor>
214 #ifdef IVSPARSE_DEBUG
216 assert(outerDim > 0 &&
"Cannot convert an empty matrix to an Eigen matrix!");
220 Eigen::SparseMatrix<T, columnMajor ? Eigen::ColMajor : Eigen::RowMajor> eigenMatrix(numRows, numCols);
223 for (uint32_t i = 0; i < outerDim; ++i) {
226 eigenMatrix.insert(it.row(), it.col()) = it.value();
231 eigenMatrix.makeCompressed();
240 template <
typename T,
typename indexT,
bool columnMajor>
243 #ifdef IVSPARSE_DEBUG
245 assert((vec.getLength() == innerDim) &&
246 "The vector must be the same size as the outer dimension of the "
251 if (numRows < 1 && numCols < 1) [[unlikely]] {
264 metadata[2] = outerDim;
268 values = (T **)realloc(values, outerDim *
sizeof(T *));
269 counts = (indexT **)realloc(counts, outerDim *
sizeof(indexT *));
270 indices = (indexT **)realloc(indices, outerDim *
sizeof(indexT *));
271 valueSizes = (indexT *)realloc(valueSizes, outerDim *
sizeof(indexT));
272 indexSizes = (indexT *)realloc(indexSizes, outerDim *
sizeof(indexT));
273 }
catch (std::bad_alloc &e) {
274 std::cerr <<
"Error: " << e.what() << std::endl;
279 values[outerDim - 1] =
nullptr;
280 counts[outerDim - 1] =
nullptr;
281 indices[outerDim - 1] =
nullptr;
282 valueSizes[outerDim - 1] = 0;
283 indexSizes[outerDim - 1] = 0;
288 #ifdef IVSPARSE_DEBUG
290 if ((vec.getLength() != innerDim))
291 throw std::invalid_argument(
292 "The vector must be the same size as the outer dimension of the "
306 metadata[2] = outerDim;
311 values = (T **)realloc(values, outerDim *
sizeof(T *));
312 counts = (indexT **)realloc(counts, outerDim *
sizeof(indexT *));
313 indices = (indexT **)realloc(indices, outerDim *
sizeof(indexT *));
314 valueSizes = (indexT *)realloc(valueSizes, outerDim *
sizeof(indexT));
315 indexSizes = (indexT *)realloc(indexSizes, outerDim *
sizeof(indexT));
316 }
catch (std::bad_alloc &e) {
317 std::cerr <<
"Error: " << e.what() << std::endl;
322 valueSizes[outerDim - 1] = vec.uniqueVals();
323 indexSizes[outerDim - 1] = vec.
nonZeros();
327 values[outerDim - 1] =
328 (T *)malloc(valueSizes[outerDim - 1] *
sizeof(T));
329 counts[outerDim - 1] =
330 (indexT *)malloc(
sizeof(indexT) * valueSizes[outerDim - 1]);
331 indices[outerDim - 1] =
332 (indexT *)malloc(indexSizes[outerDim - 1] *
sizeof(indexT));
333 }
catch (std::bad_alloc &e) {
334 std::cerr <<
"Error: " << e.what() << std::endl;
339 memcpy(values[outerDim - 1], vec.getValues(),
340 valueSizes[outerDim - 1] *
sizeof(T));
341 memcpy(counts[outerDim - 1], vec.getCounts(),
342 valueSizes[outerDim - 1] *
sizeof(indexT));
343 memcpy(indices[outerDim - 1], vec.getIndices(),
344 indexSizes[outerDim - 1] *
sizeof(indexT));
354 template <
typename T,
typename indexT,
bool columnMajor>
357 std::unordered_map<T, std::vector<indexT>> mapsT[innerDim];
360 for (uint32_t i = 0; i < outerDim; ++i) {
364 if constexpr (columnMajor) {
365 mapsT[it.row()][it.value()].push_back(it.col());
367 mapsT[it.col()][it.value()].push_back(it.row());
380 template <
typename T,
typename indexT,
bool columnMajor>
383 std::unordered_map<T, std::vector<indexT>> mapsT[innerDim];
386 for (uint32_t i = 0; i < outerDim; ++i) {
390 if constexpr (columnMajor) {
391 mapsT[it.row()][it.value()].push_back(it.col());
393 mapsT[it.col()][it.value()].push_back(it.row());
404 template <
typename T,
typename indexT,
bool columnMajor>
405 std::vector<typename IVSparse::SparseMatrix<T, indexT, 2, columnMajor>::Vector>
408 #ifdef IVSPARSE_DEBUG
409 assert(start < outerDim && end <= outerDim && start < end &&
410 "Invalid start and end values!");
419 for (uint32_t i = start; i < end; ++i) {
424 vecs[i - start] = temp;
Definition: IVCSC_Iterator.hpp:25
Definition: CSC_SparseMatrix.hpp:24
Definition: VCSC_SparseMatrix.hpp:21
uint32_t nonZeros() const
Definition: IVSparse_Base_Methods.hpp:39
Definition: IVCSC_SparseMatrix.hpp:29
IVSparse::SparseMatrix< T, indexT, compressionLevel, columnMajor >::Vector getVector(uint32_t vec)
Definition: IVCSC_Methods.hpp:47
IVSparse::SparseMatrix< T, indexT, compressionLevel, columnMajor > transpose()
Definition: IVCSC_Methods.hpp:329
void append(typename SparseMatrix< T, indexT, compressionLevel, columnMajor >::Vector &vec)
Definition: IVCSC_Methods.hpp:245
IVSparse::SparseMatrix< T, indexT, 1, columnMajor > toCSC()
Definition: IVCSC_Methods.hpp:126
T coeff(uint32_t row, uint32_t col)
Definition: IVCSC_Methods.hpp:17
void write(const char *filename)
Definition: IVCSC_Methods.hpp:72
void print()
Definition: IVCSC_Methods.hpp:97
Eigen::SparseMatrix< T, columnMajor ? Eigen::ColMajor :Eigen::RowMajor > toEigen()
Definition: IVCSC_Methods.hpp:210
bool isColumnMajor() const
Definition: IVCSC_Methods.hpp:30
std::vector< typename IVSparse::SparseMatrix< T, indexT, compressionLevel, columnMajor >::Vector > slice(uint32_t start, uint32_t end)
Definition: IVCSC_Methods.hpp:416
void inPlaceTranspose()
Definition: IVCSC_Methods.hpp:374