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