You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							485 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							485 lines
						
					
					
						
							13 KiB
						
					
					
				
								
							 | 
						|
								//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out
							 | 
						|
								//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.05 -DSIZE=2000 && ./a.out
							 | 
						|
								// -DNOGMM -DNOMTL -DCSPARSE
							 | 
						|
								// -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a
							 | 
						|
								#ifndef SIZE
							 | 
						|
								#define SIZE 100000
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#ifndef NBPERROW
							 | 
						|
								#define NBPERROW 24
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#ifndef REPEAT
							 | 
						|
								#define REPEAT 2
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#ifndef NBTRIES
							 | 
						|
								#define NBTRIES 2
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#ifndef KK
							 | 
						|
								#define KK 10
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#ifndef NOGOOGLE
							 | 
						|
								#define EIGEN_GOOGLEHASH_SUPPORT
							 | 
						|
								#include <google/sparse_hash_map>
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#include "BenchSparseUtil.h"
							 | 
						|
								
							 | 
						|
								#define CHECK_MEM
							 | 
						|
								// #define CHECK_MEM  std/**/::cout << "check mem\n"; getchar();
							 | 
						|
								
							 | 
						|
								#define BENCH(X) \
							 | 
						|
								  timer.reset(); \
							 | 
						|
								  for (int _j=0; _j<NBTRIES; ++_j) { \
							 | 
						|
								    timer.start(); \
							 | 
						|
								    for (int _k=0; _k<REPEAT; ++_k) { \
							 | 
						|
								        X  \
							 | 
						|
								  } timer.stop(); }
							 | 
						|
								
							 | 
						|
								typedef std::vector<Vector2i> Coordinates;
							 | 
						|
								typedef std::vector<float> Values;
							 | 
						|
								
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setinnerrand_eigen(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_dynamic(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_compact(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_sumeq(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_gnu_hash(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_google_dense(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_google_sparse(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_scipy(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_ublas_mapped(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_ublas_coord(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_ublas_compressed(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_ublas_genvec(const Coordinates& coords, const Values& vals);
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_mtl(const Coordinates& coords, const Values& vals);
							 | 
						|
								
							 | 
						|
								int main(int argc, char *argv[])
							 | 
						|
								{
							 | 
						|
								  int rows = SIZE;
							 | 
						|
								  int cols = SIZE;
							 | 
						|
								  bool fullyrand = true;
							 | 
						|
								
							 | 
						|
								  BenchTimer timer;
							 | 
						|
								  Coordinates coords;
							 | 
						|
								  Values values;
							 | 
						|
								  if(fullyrand)
							 | 
						|
								  {
							 | 
						|
								    Coordinates pool;
							 | 
						|
								    pool.reserve(cols*NBPERROW);
							 | 
						|
								    std::cerr << "fill pool" << "\n";
							 | 
						|
								    for (int i=0; i<cols*NBPERROW; )
							 | 
						|
								    {
							 | 
						|
								//       DynamicSparseMatrix<int> stencil(SIZE,SIZE);
							 | 
						|
								      Vector2i ij(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1));
							 | 
						|
								//       if(stencil.coeffRef(ij.x(), ij.y())==0)
							 | 
						|
								      {
							 | 
						|
								//         stencil.coeffRef(ij.x(), ij.y()) = 1;
							 | 
						|
								        pool.push_back(ij);
							 | 
						|
								
							 | 
						|
								      }
							 | 
						|
								      ++i;
							 | 
						|
								    }
							 | 
						|
								    std::cerr << "pool ok" << "\n";
							 | 
						|
								    int n = cols*NBPERROW*KK;
							 | 
						|
								    coords.reserve(n);
							 | 
						|
								    values.reserve(n);
							 | 
						|
								    for (int i=0; i<n; ++i)
							 | 
						|
								    {
							 | 
						|
								      int i = internal::random<int>(0,pool.size());
							 | 
						|
								      coords.push_back(pool[i]);
							 | 
						|
								      values.push_back(internal::random<Scalar>());
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								  else
							 | 
						|
								  {
							 | 
						|
								    for (int j=0; j<cols; ++j)
							 | 
						|
								    for (int i=0; i<NBPERROW; ++i)
							 | 
						|
								    {
							 | 
						|
								      coords.push_back(Vector2i(internal::random<int>(0,rows-1),j));
							 | 
						|
								      values.push_back(internal::random<Scalar>());
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								  std::cout << "nnz = " << coords.size()  << "\n";
							 | 
						|
								  CHECK_MEM
							 | 
						|
								
							 | 
						|
								    // dense matrices
							 | 
						|
								    #ifdef DENSEMATRIX
							 | 
						|
								    {
							 | 
						|
								      BENCH(setrand_eigen_dense(coords,values);)
							 | 
						|
								      std::cout << "Eigen Dense\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    #endif
							 | 
						|
								
							 | 
						|
								    // eigen sparse matrices
							 | 
						|
								//     if (!fullyrand)
							 | 
						|
								//     {
							 | 
						|
								//       BENCH(setinnerrand_eigen(coords,values);)
							 | 
						|
								//       std::cout << "Eigen fillrand\t" << timer.value() << "\n";
							 | 
						|
								//     }
							 | 
						|
								    {
							 | 
						|
								      BENCH(setrand_eigen_dynamic(coords,values);)
							 | 
						|
								      std::cout << "Eigen dynamic\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								//     {
							 | 
						|
								//       BENCH(setrand_eigen_compact(coords,values);)
							 | 
						|
								//       std::cout << "Eigen compact\t" << timer.value() << "\n";
							 | 
						|
								//     }
							 | 
						|
								    {
							 | 
						|
								      BENCH(setrand_eigen_sumeq(coords,values);)
							 | 
						|
								      std::cout << "Eigen sumeq\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    {
							 | 
						|
								//       BENCH(setrand_eigen_gnu_hash(coords,values);)
							 | 
						|
								//       std::cout << "Eigen std::map\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    {
							 | 
						|
								      BENCH(setrand_scipy(coords,values);)
							 | 
						|
								      std::cout << "scipy\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    #ifndef NOGOOGLE
							 | 
						|
								    {
							 | 
						|
								      BENCH(setrand_eigen_google_dense(coords,values);)
							 | 
						|
								      std::cout << "Eigen google dense\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    {
							 | 
						|
								      BENCH(setrand_eigen_google_sparse(coords,values);)
							 | 
						|
								      std::cout << "Eigen google sparse\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    #endif
							 | 
						|
								
							 | 
						|
								    #ifndef NOUBLAS
							 | 
						|
								    {
							 | 
						|
								//       BENCH(setrand_ublas_mapped(coords,values);)
							 | 
						|
								//       std::cout << "ublas mapped\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    {
							 | 
						|
								      BENCH(setrand_ublas_genvec(coords,values);)
							 | 
						|
								      std::cout << "ublas vecofvec\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    /*{
							 | 
						|
								      timer.reset();
							 | 
						|
								      timer.start();
							 | 
						|
								      for (int k=0; k<REPEAT; ++k)
							 | 
						|
								        setrand_ublas_compressed(coords,values);
							 | 
						|
								      timer.stop();
							 | 
						|
								      std::cout << "ublas comp\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    {
							 | 
						|
								      timer.reset();
							 | 
						|
								      timer.start();
							 | 
						|
								      for (int k=0; k<REPEAT; ++k)
							 | 
						|
								        setrand_ublas_coord(coords,values);
							 | 
						|
								      timer.stop();
							 | 
						|
								      std::cout << "ublas coord\t" << timer.value() << "\n";
							 | 
						|
								    }*/
							 | 
						|
								    #endif
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    // MTL4
							 | 
						|
								    #ifndef NOMTL
							 | 
						|
								    {
							 | 
						|
								      BENCH(setrand_mtl(coords,values));
							 | 
						|
								      std::cout << "MTL\t" << timer.value() << "\n";
							 | 
						|
								    }
							 | 
						|
								    #endif
							 | 
						|
								
							 | 
						|
								  return 0;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setinnerrand_eigen(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace Eigen;
							 | 
						|
								  SparseMatrix<Scalar> mat(SIZE,SIZE);
							 | 
						|
								  //mat.startFill(2000000/*coords.size()*/);
							 | 
						|
								  for (int i=0; i<coords.size(); ++i)
							 | 
						|
								  {
							 | 
						|
								    mat.insert(coords[i].x(), coords[i].y()) = vals[i];
							 | 
						|
								  }
							 | 
						|
								  mat.finalize();
							 | 
						|
								  CHECK_MEM;
							 | 
						|
								  return 0;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_dynamic(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace Eigen;
							 | 
						|
								  DynamicSparseMatrix<Scalar> mat(SIZE,SIZE);
							 | 
						|
								  mat.reserve(coords.size()/10);
							 | 
						|
								  for (int i=0; i<coords.size(); ++i)
							 | 
						|
								  {
							 | 
						|
								    mat.coeffRef(coords[i].x(), coords[i].y()) += vals[i];
							 | 
						|
								  }
							 | 
						|
								  mat.finalize();
							 | 
						|
								  CHECK_MEM;
							 | 
						|
								  return &mat.coeffRef(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_sumeq(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace Eigen;
							 | 
						|
								  int n = coords.size()/KK;
							 | 
						|
								  DynamicSparseMatrix<Scalar> mat(SIZE,SIZE);
							 | 
						|
								  for (int j=0; j<KK; ++j)
							 | 
						|
								  {
							 | 
						|
								    DynamicSparseMatrix<Scalar> aux(SIZE,SIZE);
							 | 
						|
								    mat.reserve(n);
							 | 
						|
								    for (int i=j*n; i<(j+1)*n; ++i)
							 | 
						|
								    {
							 | 
						|
								      aux.insert(coords[i].x(), coords[i].y()) += vals[i];
							 | 
						|
								    }
							 | 
						|
								    aux.finalize();
							 | 
						|
								    mat += aux;
							 | 
						|
								  }
							 | 
						|
								  return &mat.coeffRef(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_compact(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace Eigen;
							 | 
						|
								  DynamicSparseMatrix<Scalar> setter(SIZE,SIZE);
							 | 
						|
								  setter.reserve(coords.size()/10);
							 | 
						|
								  for (int i=0; i<coords.size(); ++i)
							 | 
						|
								  {
							 | 
						|
								    setter.coeffRef(coords[i].x(), coords[i].y()) += vals[i];
							 | 
						|
								  }
							 | 
						|
								  SparseMatrix<Scalar> mat = setter;
							 | 
						|
								  CHECK_MEM;
							 | 
						|
								  return &mat.coeffRef(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_gnu_hash(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace Eigen;
							 | 
						|
								  SparseMatrix<Scalar> mat(SIZE,SIZE);
							 | 
						|
								  {
							 | 
						|
								    RandomSetter<SparseMatrix<Scalar>, StdMapTraits > setter(mat);
							 | 
						|
								    for (int i=0; i<coords.size(); ++i)
							 | 
						|
								    {
							 | 
						|
								      setter(coords[i].x(), coords[i].y()) += vals[i];
							 | 
						|
								    }
							 | 
						|
								    CHECK_MEM;
							 | 
						|
								  }
							 | 
						|
								  return &mat.coeffRef(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#ifndef NOGOOGLE
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_google_dense(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace Eigen;
							 | 
						|
								  SparseMatrix<Scalar> mat(SIZE,SIZE);
							 | 
						|
								  {
							 | 
						|
								    RandomSetter<SparseMatrix<Scalar>, GoogleDenseHashMapTraits> setter(mat);
							 | 
						|
								    for (int i=0; i<coords.size(); ++i)
							 | 
						|
								      setter(coords[i].x(), coords[i].y()) += vals[i];
							 | 
						|
								    CHECK_MEM;
							 | 
						|
								  }
							 | 
						|
								  return &mat.coeffRef(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_eigen_google_sparse(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace Eigen;
							 | 
						|
								  SparseMatrix<Scalar> mat(SIZE,SIZE);
							 | 
						|
								  {
							 | 
						|
								    RandomSetter<SparseMatrix<Scalar>, GoogleSparseHashMapTraits> setter(mat);
							 | 
						|
								    for (int i=0; i<coords.size(); ++i)
							 | 
						|
								      setter(coords[i].x(), coords[i].y()) += vals[i];
							 | 
						|
								    CHECK_MEM;
							 | 
						|
								  }
							 | 
						|
								  return &mat.coeffRef(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								template <class T>
							 | 
						|
								void coo_tocsr(const int n_row,
							 | 
						|
								               const int n_col,
							 | 
						|
								               const int nnz,
							 | 
						|
								               const Coordinates Aij,
							 | 
						|
								               const Values Ax,
							 | 
						|
								                     int Bp[],
							 | 
						|
								                     int Bj[],
							 | 
						|
								                     T Bx[])
							 | 
						|
								{
							 | 
						|
								    //compute number of non-zero entries per row of A coo_tocsr
							 | 
						|
								    std::fill(Bp, Bp + n_row, 0);
							 | 
						|
								
							 | 
						|
								    for (int n = 0; n < nnz; n++){
							 | 
						|
								        Bp[Aij[n].x()]++;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    //cumsum the nnz per row to get Bp[]
							 | 
						|
								    for(int i = 0, cumsum = 0; i < n_row; i++){
							 | 
						|
								        int temp = Bp[i];
							 | 
						|
								        Bp[i] = cumsum;
							 | 
						|
								        cumsum += temp;
							 | 
						|
								    }
							 | 
						|
								    Bp[n_row] = nnz;
							 | 
						|
								
							 | 
						|
								    //write Aj,Ax into Bj,Bx
							 | 
						|
								    for(int n = 0; n < nnz; n++){
							 | 
						|
								        int row  = Aij[n].x();
							 | 
						|
								        int dest = Bp[row];
							 | 
						|
								
							 | 
						|
								        Bj[dest] = Aij[n].y();
							 | 
						|
								        Bx[dest] = Ax[n];
							 | 
						|
								
							 | 
						|
								        Bp[row]++;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    for(int i = 0, last = 0; i <= n_row; i++){
							 | 
						|
								        int temp = Bp[i];
							 | 
						|
								        Bp[i]  = last;
							 | 
						|
								        last   = temp;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    //now Bp,Bj,Bx form a CSR representation (with possible duplicates)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template< class T1, class T2 >
							 | 
						|
								bool kv_pair_less(const std::pair<T1,T2>& x, const std::pair<T1,T2>& y){
							 | 
						|
								    return x.first < y.first;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								template<class I, class T>
							 | 
						|
								void csr_sort_indices(const I n_row,
							 | 
						|
								                      const I Ap[],
							 | 
						|
								                            I Aj[],
							 | 
						|
								                            T Ax[])
							 | 
						|
								{
							 | 
						|
								    std::vector< std::pair<I,T> > temp;
							 | 
						|
								
							 | 
						|
								    for(I i = 0; i < n_row; i++){
							 | 
						|
								        I row_start = Ap[i];
							 | 
						|
								        I row_end   = Ap[i+1];
							 | 
						|
								
							 | 
						|
								        temp.clear();
							 | 
						|
								
							 | 
						|
								        for(I jj = row_start; jj < row_end; jj++){
							 | 
						|
								            temp.push_back(std::make_pair(Aj[jj],Ax[jj]));
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        std::sort(temp.begin(),temp.end(),kv_pair_less<I,T>);
							 | 
						|
								
							 | 
						|
								        for(I jj = row_start, n = 0; jj < row_end; jj++, n++){
							 | 
						|
								            Aj[jj] = temp[n].first;
							 | 
						|
								            Ax[jj] = temp[n].second;
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template <class I, class T>
							 | 
						|
								void csr_sum_duplicates(const I n_row,
							 | 
						|
								                        const I n_col,
							 | 
						|
								                              I Ap[],
							 | 
						|
								                              I Aj[],
							 | 
						|
								                              T Ax[])
							 | 
						|
								{
							 | 
						|
								    I nnz = 0;
							 | 
						|
								    I row_end = 0;
							 | 
						|
								    for(I i = 0; i < n_row; i++){
							 | 
						|
								        I jj = row_end;
							 | 
						|
								        row_end = Ap[i+1];
							 | 
						|
								        while( jj < row_end ){
							 | 
						|
								            I j = Aj[jj];
							 | 
						|
								            T x = Ax[jj];
							 | 
						|
								            jj++;
							 | 
						|
								            while( jj < row_end && Aj[jj] == j ){
							 | 
						|
								                x += Ax[jj];
							 | 
						|
								                jj++;
							 | 
						|
								            }
							 | 
						|
								            Aj[nnz] = j;
							 | 
						|
								            Ax[nnz] = x;
							 | 
						|
								            nnz++;
							 | 
						|
								        }
							 | 
						|
								        Ap[i+1] = nnz;
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_scipy(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace Eigen;
							 | 
						|
								  SparseMatrix<Scalar> mat(SIZE,SIZE);
							 | 
						|
								  mat.resizeNonZeros(coords.size());
							 | 
						|
								//   std::cerr << "setrand_scipy...\n";
							 | 
						|
								  coo_tocsr<Scalar>(SIZE,SIZE, coords.size(), coords, vals, mat._outerIndexPtr(), mat._innerIndexPtr(), mat._valuePtr());
							 | 
						|
								//   std::cerr << "coo_tocsr ok\n";
							 | 
						|
								
							 | 
						|
								  csr_sort_indices(SIZE, mat._outerIndexPtr(), mat._innerIndexPtr(), mat._valuePtr());
							 | 
						|
								
							 | 
						|
								  csr_sum_duplicates(SIZE, SIZE, mat._outerIndexPtr(), mat._innerIndexPtr(), mat._valuePtr());
							 | 
						|
								
							 | 
						|
								  mat.resizeNonZeros(mat._outerIndexPtr()[SIZE]);
							 | 
						|
								
							 | 
						|
								  return &mat.coeffRef(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#ifndef NOUBLAS
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_ublas_mapped(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace boost;
							 | 
						|
								  using namespace boost::numeric;
							 | 
						|
								  using namespace boost::numeric::ublas;
							 | 
						|
								  mapped_matrix<Scalar> aux(SIZE,SIZE);
							 | 
						|
								  for (int i=0; i<coords.size(); ++i)
							 | 
						|
								  {
							 | 
						|
								    aux(coords[i].x(), coords[i].y()) += vals[i];
							 | 
						|
								  }
							 | 
						|
								  CHECK_MEM;
							 | 
						|
								  compressed_matrix<Scalar> mat(aux);
							 | 
						|
								  return 0;// &mat(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								/*EIGEN_DONT_INLINE Scalar* setrand_ublas_coord(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace boost;
							 | 
						|
								  using namespace boost::numeric;
							 | 
						|
								  using namespace boost::numeric::ublas;
							 | 
						|
								  coordinate_matrix<Scalar> aux(SIZE,SIZE);
							 | 
						|
								  for (int i=0; i<coords.size(); ++i)
							 | 
						|
								  {
							 | 
						|
								    aux(coords[i].x(), coords[i].y()) = vals[i];
							 | 
						|
								  }
							 | 
						|
								  compressed_matrix<Scalar> mat(aux);
							 | 
						|
								  return 0;//&mat(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_ublas_compressed(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace boost;
							 | 
						|
								  using namespace boost::numeric;
							 | 
						|
								  using namespace boost::numeric::ublas;
							 | 
						|
								  compressed_matrix<Scalar> mat(SIZE,SIZE);
							 | 
						|
								  for (int i=0; i<coords.size(); ++i)
							 | 
						|
								  {
							 | 
						|
								    mat(coords[i].x(), coords[i].y()) = vals[i];
							 | 
						|
								  }
							 | 
						|
								  return 0;//&mat(coords[0].x(), coords[0].y());
							 | 
						|
								}*/
							 | 
						|
								EIGEN_DONT_INLINE Scalar* setrand_ublas_genvec(const Coordinates& coords, const Values& vals)
							 | 
						|
								{
							 | 
						|
								  using namespace boost;
							 | 
						|
								  using namespace boost::numeric;
							 | 
						|
								  using namespace boost::numeric::ublas;
							 | 
						|
								
							 | 
						|
								//   ublas::vector<coordinate_vector<Scalar> > foo;
							 | 
						|
								  generalized_vector_of_vector<Scalar, row_major, ublas::vector<coordinate_vector<Scalar> > > aux(SIZE,SIZE);
							 | 
						|
								  for (int i=0; i<coords.size(); ++i)
							 | 
						|
								  {
							 | 
						|
								    aux(coords[i].x(), coords[i].y()) += vals[i];
							 | 
						|
								  }
							 | 
						|
								  CHECK_MEM;
							 | 
						|
								  compressed_matrix<Scalar,row_major> mat(aux);
							 | 
						|
								  return 0;//&mat(coords[0].x(), coords[0].y());
							 | 
						|
								}
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#ifndef NOMTL
							 | 
						|
								EIGEN_DONT_INLINE void setrand_mtl(const Coordinates& coords, const Values& vals);
							 | 
						|
								#endif
							 | 
						|
								
							 |