1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//g++ -O3 -g0 -DNDEBUG sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//g++ -O3 -g0 -DNDEBUG sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.05 -DSIZE=2000 && ./a.out 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// -DNOGMM -DNOMTL -DCSPARSE 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef SIZE 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define SIZE 100000 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef NBPERROW 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define NBPERROW 24 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef REPEAT 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define REPEAT 2 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef NBTRIES 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define NBTRIES 2 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef KK 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define KK 10 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef NOGOOGLE 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_GOOGLEHASH_SUPPORT 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <google/sparse_hash_map> 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "BenchSparseUtil.h" 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define CHECK_MEM 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// #define CHECK_MEM std/**/::cout << "check mem\n"; getchar(); 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define BENCH(X) \ 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timer.reset(); \ 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int _j=0; _j<NBTRIES; ++_j) { \ 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timer.start(); \ 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int _k=0; _k<REPEAT; ++_k) { \ 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath X \ 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } timer.stop(); } 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef std::vector<Vector2i> Coordinates; 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef std::vector<float> Values; 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setinnerrand_eigen(const Coordinates& coords, const Values& vals); 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_dynamic(const Coordinates& coords, const Values& vals); 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_compact(const Coordinates& coords, const Values& vals); 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_sumeq(const Coordinates& coords, const Values& vals); 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_gnu_hash(const Coordinates& coords, const Values& vals); 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_google_dense(const Coordinates& coords, const Values& vals); 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_google_sparse(const Coordinates& coords, const Values& vals); 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_scipy(const Coordinates& coords, const Values& vals); 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_ublas_mapped(const Coordinates& coords, const Values& vals); 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_ublas_coord(const Coordinates& coords, const Values& vals); 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_ublas_compressed(const Coordinates& coords, const Values& vals); 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_ublas_genvec(const Coordinates& coords, const Values& vals); 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_mtl(const Coordinates& coords, const Values& vals); 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint main(int argc, char *argv[]) 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int rows = SIZE; 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int cols = SIZE; 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool fullyrand = true; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BenchTimer timer; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Coordinates coords; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Values values; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(fullyrand) 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Coordinates pool; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath pool.reserve(cols*NBPERROW); 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << "fill pool" << "\n"; 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<cols*NBPERROW; ) 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// DynamicSparseMatrix<int> stencil(SIZE,SIZE); 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Vector2i ij(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1)); 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// if(stencil.coeffRef(ij.x(), ij.y())==0) 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// stencil.coeffRef(ij.x(), ij.y()) = 1; 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath pool.push_back(ij); 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ++i; 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << "pool ok" << "\n"; 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int n = cols*NBPERROW*KK; 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath coords.reserve(n); 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath values.reserve(n); 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<n; ++i) 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int i = internal::random<int>(0,pool.size()); 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath coords.push_back(pool[i]); 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath values.push_back(internal::random<Scalar>()); 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int j=0; j<cols; ++j) 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<NBPERROW; ++i) 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath coords.push_back(Vector2i(internal::random<int>(0,rows-1),j)); 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath values.push_back(internal::random<Scalar>()); 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "nnz = " << coords.size() << "\n"; 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_MEM 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // dense matrices 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifdef DENSEMATRIX 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BENCH(setrand_eigen_dense(coords,values);) 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "Eigen Dense\t" << timer.value() << "\n"; 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // eigen sparse matrices 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// if (!fullyrand) 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// { 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// BENCH(setinnerrand_eigen(coords,values);) 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cout << "Eigen fillrand\t" << timer.value() << "\n"; 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// } 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BENCH(setrand_eigen_dynamic(coords,values);) 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "Eigen dynamic\t" << timer.value() << "\n"; 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// { 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// BENCH(setrand_eigen_compact(coords,values);) 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cout << "Eigen compact\t" << timer.value() << "\n"; 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// } 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BENCH(setrand_eigen_sumeq(coords,values);) 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "Eigen sumeq\t" << timer.value() << "\n"; 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// BENCH(setrand_eigen_gnu_hash(coords,values);) 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cout << "Eigen std::map\t" << timer.value() << "\n"; 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BENCH(setrand_scipy(coords,values);) 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "scipy\t" << timer.value() << "\n"; 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef NOGOOGLE 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BENCH(setrand_eigen_google_dense(coords,values);) 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "Eigen google dense\t" << timer.value() << "\n"; 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BENCH(setrand_eigen_google_sparse(coords,values);) 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "Eigen google sparse\t" << timer.value() << "\n"; 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef NOUBLAS 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// BENCH(setrand_ublas_mapped(coords,values);) 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cout << "ublas mapped\t" << timer.value() << "\n"; 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BENCH(setrand_ublas_genvec(coords,values);) 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "ublas vecofvec\t" << timer.value() << "\n"; 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /*{ 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timer.reset(); 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timer.start(); 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int k=0; k<REPEAT; ++k) 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath setrand_ublas_compressed(coords,values); 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timer.stop(); 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "ublas comp\t" << timer.value() << "\n"; 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timer.reset(); 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timer.start(); 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int k=0; k<REPEAT; ++k) 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath setrand_ublas_coord(coords,values); 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timer.stop(); 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "ublas coord\t" << timer.value() << "\n"; 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }*/ 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // MTL4 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef NOMTL 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BENCH(setrand_mtl(coords,values)); 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "MTL\t" << timer.value() << "\n"; 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setinnerrand_eigen(const Coordinates& coords, const Values& vals) 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrix<Scalar> mat(SIZE,SIZE); 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //mat.startFill(2000000/*coords.size()*/); 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.insert(coords[i].x(), coords[i].y()) = vals[i]; 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.finalize(); 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_MEM; 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0; 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_dynamic(const Coordinates& coords, const Values& vals) 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DynamicSparseMatrix<Scalar> mat(SIZE,SIZE); 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.reserve(coords.size()/10); 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.coeffRef(coords[i].x(), coords[i].y()) += vals[i]; 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.finalize(); 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_MEM; 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return &mat.coeffRef(coords[0].x(), coords[0].y()); 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_sumeq(const Coordinates& coords, const Values& vals) 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int n = coords.size()/KK; 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DynamicSparseMatrix<Scalar> mat(SIZE,SIZE); 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int j=0; j<KK; ++j) 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DynamicSparseMatrix<Scalar> aux(SIZE,SIZE); 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.reserve(n); 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=j*n; i<(j+1)*n; ++i) 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath aux.insert(coords[i].x(), coords[i].y()) += vals[i]; 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath aux.finalize(); 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat += aux; 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return &mat.coeffRef(coords[0].x(), coords[0].y()); 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_compact(const Coordinates& coords, const Values& vals) 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DynamicSparseMatrix<Scalar> setter(SIZE,SIZE); 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath setter.reserve(coords.size()/10); 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath setter.coeffRef(coords[i].x(), coords[i].y()) += vals[i]; 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrix<Scalar> mat = setter; 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_MEM; 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return &mat.coeffRef(coords[0].x(), coords[0].y()); 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_gnu_hash(const Coordinates& coords, const Values& vals) 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrix<Scalar> mat(SIZE,SIZE); 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RandomSetter<SparseMatrix<Scalar>, StdMapTraits > setter(mat); 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath setter(coords[i].x(), coords[i].y()) += vals[i]; 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_MEM; 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return &mat.coeffRef(coords[0].x(), coords[0].y()); 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef NOGOOGLE 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_google_dense(const Coordinates& coords, const Values& vals) 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrix<Scalar> mat(SIZE,SIZE); 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RandomSetter<SparseMatrix<Scalar>, GoogleDenseHashMapTraits> setter(mat); 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath setter(coords[i].x(), coords[i].y()) += vals[i]; 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_MEM; 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return &mat.coeffRef(coords[0].x(), coords[0].y()); 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_eigen_google_sparse(const Coordinates& coords, const Values& vals) 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrix<Scalar> mat(SIZE,SIZE); 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RandomSetter<SparseMatrix<Scalar>, GoogleSparseHashMapTraits> setter(mat); 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath setter(coords[i].x(), coords[i].y()) += vals[i]; 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_MEM; 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return &mat.coeffRef(coords[0].x(), coords[0].y()); 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <class T> 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid coo_tocsr(const int n_row, 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int n_col, 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int nnz, 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Coordinates Aij, 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Values Ax, 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int Bp[], 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int Bj[], 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath T Bx[]) 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //compute number of non-zero entries per row of A coo_tocsr 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::fill(Bp, Bp + n_row, 0); 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int n = 0; n < nnz; n++){ 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Bp[Aij[n].x()]++; 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //cumsum the nnz per row to get Bp[] 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0, cumsum = 0; i < n_row; i++){ 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int temp = Bp[i]; 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Bp[i] = cumsum; 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath cumsum += temp; 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Bp[n_row] = nnz; 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //write Aj,Ax into Bj,Bx 325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int n = 0; n < nnz; n++){ 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int row = Aij[n].x(); 327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int dest = Bp[row]; 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Bj[dest] = Aij[n].y(); 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Bx[dest] = Ax[n]; 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Bp[row]++; 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0, last = 0; i <= n_row; i++){ 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int temp = Bp[i]; 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Bp[i] = last; 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath last = temp; 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //now Bp,Bj,Bx form a CSR representation (with possible duplicates) 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate< class T1, class T2 > 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool kv_pair_less(const std::pair<T1,T2>& x, const std::pair<T1,T2>& y){ 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return x.first < y.first; 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<class I, class T> 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid csr_sort_indices(const I n_row, 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const I Ap[], 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath I Aj[], 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath T Ax[]) 355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::vector< std::pair<I,T> > temp; 357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(I i = 0; i < n_row; i++){ 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath I row_start = Ap[i]; 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath I row_end = Ap[i+1]; 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp.clear(); 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(I jj = row_start; jj < row_end; jj++){ 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp.push_back(std::make_pair(Aj[jj],Ax[jj])); 366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::sort(temp.begin(),temp.end(),kv_pair_less<I,T>); 369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(I jj = row_start, n = 0; jj < row_end; jj++, n++){ 371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Aj[jj] = temp[n].first; 372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Ax[jj] = temp[n].second; 373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <class I, class T> 378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid csr_sum_duplicates(const I n_row, 379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const I n_col, 380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath I Ap[], 381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath I Aj[], 382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath T Ax[]) 383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath I nnz = 0; 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath I row_end = 0; 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(I i = 0; i < n_row; i++){ 387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath I jj = row_end; 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath row_end = Ap[i+1]; 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while( jj < row_end ){ 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath I j = Aj[jj]; 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath T x = Ax[jj]; 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath jj++; 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while( jj < row_end && Aj[jj] == j ){ 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath x += Ax[jj]; 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath jj++; 396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Aj[nnz] = j; 398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Ax[nnz] = x; 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath nnz++; 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Ap[i+1] = nnz; 402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_scipy(const Coordinates& coords, const Values& vals) 406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; 408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrix<Scalar> mat(SIZE,SIZE); 409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.resizeNonZeros(coords.size()); 410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cerr << "setrand_scipy...\n"; 411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath coo_tocsr<Scalar>(SIZE,SIZE, coords.size(), coords, vals, mat._outerIndexPtr(), mat._innerIndexPtr(), mat._valuePtr()); 412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// std::cerr << "coo_tocsr ok\n"; 413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath csr_sort_indices(SIZE, mat._outerIndexPtr(), mat._innerIndexPtr(), mat._valuePtr()); 415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath csr_sum_duplicates(SIZE, SIZE, mat._outerIndexPtr(), mat._innerIndexPtr(), mat._valuePtr()); 417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.resizeNonZeros(mat._outerIndexPtr()[SIZE]); 419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return &mat.coeffRef(coords[0].x(), coords[0].y()); 421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef NOUBLAS 425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_ublas_mapped(const Coordinates& coords, const Values& vals) 426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost; 428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost::numeric; 429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost::numeric::ublas; 430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mapped_matrix<Scalar> aux(SIZE,SIZE); 431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath aux(coords[i].x(), coords[i].y()) += vals[i]; 434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_MEM; 436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath compressed_matrix<Scalar> mat(aux); 437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0;// &mat(coords[0].x(), coords[0].y()); 438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/*EIGEN_DONT_INLINE Scalar* setrand_ublas_coord(const Coordinates& coords, const Values& vals) 440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost; 442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost::numeric; 443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost::numeric::ublas; 444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath coordinate_matrix<Scalar> aux(SIZE,SIZE); 445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath aux(coords[i].x(), coords[i].y()) = vals[i]; 448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath compressed_matrix<Scalar> mat(aux); 450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0;//&mat(coords[0].x(), coords[0].y()); 451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_ublas_compressed(const Coordinates& coords, const Values& vals) 453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost; 455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost::numeric; 456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost::numeric::ublas; 457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath compressed_matrix<Scalar> mat(SIZE,SIZE); 458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat(coords[i].x(), coords[i].y()) = vals[i]; 461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0;//&mat(coords[0].x(), coords[0].y()); 463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}*/ 464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE Scalar* setrand_ublas_genvec(const Coordinates& coords, const Values& vals) 465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost; 467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost::numeric; 468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace boost::numeric::ublas; 469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// ublas::vector<coordinate_vector<Scalar> > foo; 471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath generalized_vector_of_vector<Scalar, row_major, ublas::vector<coordinate_vector<Scalar> > > aux(SIZE,SIZE); 472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<coords.size(); ++i) 473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath aux(coords[i].x(), coords[i].y()) += vals[i]; 475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHECK_MEM; 477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath compressed_matrix<Scalar,row_major> mat(aux); 478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return 0;//&mat(coords[0].x(), coords[0].y()); 479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef NOMTL 483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DONT_INLINE void setrand_mtl(const Coordinates& coords, const Values& vals); 484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 486