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