1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. Eigen itself is part of the KDE project.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Daniel Gomez Ferro <dgomezferro@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_TESTSPARSE_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h"
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if EIGEN_GNUC_AT_LEAST(4,0) && !defined __ICC
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <tr1/unordered_map>
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_UNORDERED_MAP_SUPPORT
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace std {
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  using std::tr1::unordered_map;
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_GOOGLEHASH_SUPPORT
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #include <google/sparse_hash_map>
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Cholesky>
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/LU>
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Sparse>
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathenum {
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  ForceNonZeroDiag = 1,
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MakeLowerTriangular = 2,
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MakeUpperTriangular = 4,
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  ForceRealDiag = 8
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* Initializes both a sparse and dense matrix with same random values,
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * and a ratio of \a density non zero entries.
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param flags is a union of ForceNonZeroDiag, MakeLowerTriangular and MakeUpperTriangular
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *        allowing to control the shape of the matrix.
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param zeroCoords and nonzeroCoords allows to get the coordinate lists of the non zero,
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *        and zero coefficients respectively.
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> void
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathinitSparse(double density,
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           Matrix<Scalar,Dynamic,Dynamic>& refMat,
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           SparseMatrix<Scalar>& sparseMat,
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           int flags = 0,
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           std::vector<Vector2i>* zeroCoords = 0,
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           std::vector<Vector2i>* nonzeroCoords = 0)
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  sparseMat.startFill(int(refMat.rows()*refMat.cols()*density));
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int j=0; j<refMat.cols(); j++)
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i=0; i<refMat.rows(); i++)
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Scalar v = (ei_random<double>(0,1) < density) ? ei_random<Scalar>() : Scalar(0);
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if ((flags&ForceNonZeroDiag) && (i==j))
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      {
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = ei_random<Scalar>()*Scalar(3.);
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = v*v + Scalar(5.);
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if ((flags & MakeLowerTriangular) && j>i)
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = Scalar(0);
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      else if ((flags & MakeUpperTriangular) && j<i)
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = Scalar(0);
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if ((flags&ForceRealDiag) && (i==j))
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = ei_real(v);
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if (v!=Scalar(0))
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      {
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        sparseMat.fill(i,j) = v;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (nonzeroCoords)
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          nonzeroCoords->push_back(Vector2i(i,j));
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      else if (zeroCoords)
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      {
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        zeroCoords->push_back(Vector2i(i,j));
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      refMat(i,j) = v;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  sparseMat.endFill();
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> void
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathinitSparse(double density,
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           Matrix<Scalar,Dynamic,Dynamic>& refMat,
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           DynamicSparseMatrix<Scalar>& sparseMat,
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           int flags = 0,
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           std::vector<Vector2i>* zeroCoords = 0,
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           std::vector<Vector2i>* nonzeroCoords = 0)
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  sparseMat.startFill(int(refMat.rows()*refMat.cols()*density));
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int j=0; j<refMat.cols(); j++)
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(int i=0; i<refMat.rows(); i++)
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Scalar v = (ei_random<double>(0,1) < density) ? ei_random<Scalar>() : Scalar(0);
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if ((flags&ForceNonZeroDiag) && (i==j))
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      {
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = ei_random<Scalar>()*Scalar(3.);
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = v*v + Scalar(5.);
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if ((flags & MakeLowerTriangular) && j>i)
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = Scalar(0);
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      else if ((flags & MakeUpperTriangular) && j<i)
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = Scalar(0);
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if ((flags&ForceRealDiag) && (i==j))
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        v = ei_real(v);
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if (v!=Scalar(0))
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      {
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        sparseMat.fill(i,j) = v;
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (nonzeroCoords)
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          nonzeroCoords->push_back(Vector2i(i,j));
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      else if (zeroCoords)
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      {
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        zeroCoords->push_back(Vector2i(i,j));
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      refMat(i,j) = v;
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  sparseMat.endFill();
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> void
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathinitSparse(double density,
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           Matrix<Scalar,Dynamic,1>& refVec,
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           SparseVector<Scalar>& sparseVec,
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           std::vector<int>* zeroCoords = 0,
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath           std::vector<int>* nonzeroCoords = 0)
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  sparseVec.reserve(int(refVec.size()*density));
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  sparseVec.setZero();
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i=0; i<refVec.size(); i++)
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Scalar v = (ei_random<double>(0,1) < density) ? ei_random<Scalar>() : Scalar(0);
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if (v!=Scalar(0))
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      sparseVec.fill(i) = v;
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if (nonzeroCoords)
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        nonzeroCoords->push_back(i);
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    else if (zeroCoords)
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        zeroCoords->push_back(i);
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    refVec[i] = v;
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_TESTSPARSE_H
155