1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Daniel Gomez Ferro <dgomezferro@gmail.com> 67faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// Copyright (C) 2013 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr> 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "sparse.h" 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& ref) 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename SparseMatrixType::Index Index; 177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef Matrix<Index,2,1> Vector2; 187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index rows = ref.rows(); 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index cols = ref.cols(); 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename SparseMatrixType::Scalar Scalar; 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Flags = SparseMatrixType::Flags }; 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath double density = (std::max)(8./(rows*cols), 0.01); 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix; 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,Dynamic,1> DenseVector; 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar eps = 1e-6; 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar s1 = internal::random<Scalar>(); 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SparseMatrixType m(rows, cols); 327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez DenseMatrix refMat = DenseMatrix::Zero(rows, cols); 337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez DenseVector vec1 = DenseVector::Random(rows); 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez std::vector<Vector2> zeroCoords; 367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez std::vector<Vector2> nonzeroCoords; 377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez initSparse<Scalar>(density, refMat, m, 0, &zeroCoords, &nonzeroCoords); 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (zeroCoords.size()==0 || nonzeroCoords.size()==0) 407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // test coeff and coeffRef 437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (int i=0; i<(int)zeroCoords.size(); ++i) 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_MUCH_SMALLER_THAN( m.coeff(zeroCoords[i].x(),zeroCoords[i].y()), eps ); 467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(internal::is_same<SparseMatrixType,SparseMatrix<Scalar,Flags> >::value) 477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_RAISES_ASSERT( m.coeffRef(zeroCoords[0].x(),zeroCoords[0].y()) = 5 ); 487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m, refMat); 507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5); 527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5); 537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m, refMat); 557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /* 567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // test InnerIterators and Block expressions 577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (int t=0; t<10; ++t) 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int j = internal::random<int>(0,cols-1); 607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int i = internal::random<int>(0,rows-1); 617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int w = internal::random<int>(1,cols-j-1); 627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int h = internal::random<int>(1,rows-i-1); 637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // VERIFY_IS_APPROX(m.block(i,j,h,w), refMat.block(i,j,h,w)); 657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(int c=0; c<w; c++) 667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m.block(i,j,h,w).col(c), refMat.block(i,j,h,w).col(c)); 687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(int r=0; r<h; r++) 697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // VERIFY_IS_APPROX(m.block(i,j,h,w).col(c).coeff(r), refMat.block(i,j,h,w).col(c).coeff(r)); 717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // for(int r=0; r<h; r++) 747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // { 757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // VERIFY_IS_APPROX(m.block(i,j,h,w).row(r), refMat.block(i,j,h,w).row(r)); 767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // for(int c=0; c<w; c++) 777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // { 787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // VERIFY_IS_APPROX(m.block(i,j,h,w).row(r).coeff(c), refMat.block(i,j,h,w).row(r).coeff(c)); 797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // } 807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // } 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(int c=0; c<cols; c++) 847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m.col(c) + m.col(c), (m + m).col(c)); 867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m.col(c) + m.col(c), refMat.col(c) + refMat.col(c)); 877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(int r=0; r<rows; r++) 907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m.row(r) + m.row(r), (m + m).row(r)); 927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m.row(r) + m.row(r), refMat.row(r) + refMat.row(r)); 937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez */ 957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // test assertion 977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_RAISES_ASSERT( m.coeffRef(-1,1) = 0 ); 987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_RAISES_ASSERT( m.coeffRef(0,m.cols()) = 0 ); 997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test insert (inner random) 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix m1(rows,cols); 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m1.setZero(); 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows,cols); 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(internal::random<int>()%2) 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.reserve(VectorXi::Constant(m2.outerSize(), 2)); 1087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (Index j=0; j<cols; ++j) 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (Index k=0; k<rows/2; ++k) 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index i = internal::random<Index>(0,rows-1); 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (m1.coeff(i,j)==Scalar(0)) 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.insert(i,j) = m1(i,j) = internal::random<Scalar>(); 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.finalize(); 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m2,m1); 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test insert (fully random) 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix m1(rows,cols); 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m1.setZero(); 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows,cols); 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(internal::random<int>()%2) 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.reserve(VectorXi::Constant(m2.outerSize(), 2)); 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int k=0; k<rows*cols; ++k) 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index i = internal::random<Index>(0,rows-1); 1317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index j = internal::random<Index>(0,cols-1); 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if ((m1.coeff(i,j)==Scalar(0)) && (internal::random<int>()%2)) 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.insert(i,j) = m1(i,j) = internal::random<Scalar>(); 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar v = internal::random<Scalar>(); 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.coeffRef(i,j) += v; 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m1(i,j) += v; 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m2,m1); 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test insert (un-compressed) 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int mode=0;mode<4;++mode) 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix m1(rows,cols); 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m1.setZero(); 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows,cols); 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VectorXi r(VectorXi::Constant(m2.outerSize(), ((mode%2)==0) ? m2.innerSize() : std::max<int>(1,m2.innerSize()/8))); 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.reserve(r); 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int k=0; k<rows*cols; ++k) 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 1547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index i = internal::random<Index>(0,rows-1); 1557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index j = internal::random<Index>(0,cols-1); 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (m1.coeff(i,j)==Scalar(0)) 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.insert(i,j) = m1(i,j) = internal::random<Scalar>(); 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(mode==3) 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.reserve(r); 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(internal::random<int>()%2) 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.makeCompressed(); 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m2,m1); 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // test innerVector() 1677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 1687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); 1697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SparseMatrixType m2(rows, rows); 1707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez initSparse<Scalar>(density, refMat2, m2); 1717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index j0 = internal::random<Index>(0,rows-1); 1727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index j1 = internal::random<Index>(0,rows-1); 1737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(SparseMatrixType::IsRowMajor) 1747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.row(j0)); 1757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else 1767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.col(j0)); 1777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 1787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(SparseMatrixType::IsRowMajor) 1797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.row(j0)+refMat2.row(j1)); 1807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else 1817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.col(j0)+refMat2.col(j1)); 1827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 1837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SparseMatrixType m3(rows,rows); 1847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m3.reserve(VectorXi::Constant(rows,rows/2)); 1857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(Index j=0; j<rows; ++j) 1867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(Index k=0; k<j; ++k) 1877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m3.insertByOuterInner(j,k) = k+1; 1887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(Index j=0; j<rows; ++j) 1897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 1907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY(j==numext::real(m3.innerVector(j).nonZeros())); 1917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(j>0) 1927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY(j==numext::real(m3.innerVector(j).lastCoeff())); 1937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 1947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m3.makeCompressed(); 1957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(Index j=0; j<rows; ++j) 1967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 1977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY(j==numext::real(m3.innerVector(j).nonZeros())); 1987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(j>0) 1997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY(j==numext::real(m3.innerVector(j).lastCoeff())); 2007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 2017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez //m2.innerVector(j0) = 2*m2.innerVector(j1); 2037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez //refMat2.col(j0) = 2*refMat2.col(j1); 2047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez //VERIFY_IS_APPROX(m2, refMat2); 2057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 2067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // test innerVectors() 2087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 2097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); 2107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SparseMatrixType m2(rows, rows); 2117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez initSparse<Scalar>(density, refMat2, m2); 2127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(internal::random<float>(0,1)>0.5) m2.makeCompressed(); 2137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index j0 = internal::random<Index>(0,rows-2); 2157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index j1 = internal::random<Index>(0,rows-2); 2167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index n0 = internal::random<Index>(1,rows-(std::max)(j0,j1)); 2177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(SparseMatrixType::IsRowMajor) 2187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(j0,0,n0,cols)); 2197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else 2207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(0,j0,rows,n0)); 2217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(SparseMatrixType::IsRowMajor) 2227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), 2237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat2.middleRows(j0,n0)+refMat2.middleRows(j1,n0)); 2247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else 2257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), 2267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0)); 2277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2, refMat2); 2297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m2.innerVectors(j0,n0) = m2.innerVectors(j0,n0) + m2.innerVectors(j1,n0); 2317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(SparseMatrixType::IsRowMajor) 2327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat2.middleRows(j0,n0) = (refMat2.middleRows(j0,n0) + refMat2.middleRows(j1,n0)).eval(); 2337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else 2347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat2.middleCols(j0,n0) = (refMat2.middleCols(j0,n0) + refMat2.middleCols(j1,n0)).eval(); 2357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2, refMat2); 2377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 2397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test basic computations 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refM1 = DenseMatrix::Zero(rows, rows); 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refM2 = DenseMatrix::Zero(rows, rows); 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refM3 = DenseMatrix::Zero(rows, rows); 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refM4 = DenseMatrix::Zero(rows, rows); 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m1(rows, rows); 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows, rows); 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m3(rows, rows); 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m4(rows, rows); 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refM1, m1); 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refM2, m2); 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refM3, m3); 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refM4, m4); 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1+m2, refM1+refM2); 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1+m2+m3, refM1+refM2+refM3); 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m3.cwiseProduct(m1+m2), refM3.cwiseProduct(refM1+refM2)); 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1*s1-m2, refM1*s1-refM2); 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1*=s1, refM1*=s1); 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1/=s1, refM1/=s1); 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1+=m2, refM1+=refM2); 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1-=m2, refM1-=refM2); 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(SparseMatrixType::IsRowMajor) 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.row(0).dot(refM2.row(0))); 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.col(0).dot(refM2.row(0))); 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1.conjugate(), refM1.conjugate()); 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m1.real(), refM1.real()); 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refM4.setRandom(); 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // sparse cwise* dense 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m3.cwiseProduct(refM4), refM3.cwiseProduct(refM4)); 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// VERIFY_IS_APPROX(m3.cwise()/refM4, refM3.cwise()/refM4); 2787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // test aliasing 2807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX((m1 = -m1), (refM1 = -refM1)); 2817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX((m1 = m1.transpose()), (refM1 = refM1.transpose().eval())); 2827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX((m1 = -m1.transpose()), (refM1 = -refM1.transpose().eval())); 2837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX((m1 += -m1), (refM1 += -refM1)); 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test transpose 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows, rows); 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refMat2, m2); 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m2.transpose().eval(), refMat2.transpose().eval()); 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m2.transpose(), refMat2.transpose()); 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(SparseMatrixType(m2.adjoint()), refMat2.adjoint()); 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // test generic blocks 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows, rows); 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refMat2, m2); 3047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index j0 = internal::random<Index>(0,rows-2); 3057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index j1 = internal::random<Index>(0,rows-2); 3067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index n0 = internal::random<Index>(1,rows-(std::max)(j0,j1)); 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(SparseMatrixType::IsRowMajor) 3087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.block(j0,0,n0,cols), refMat2.block(j0,0,n0,cols)); 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 3107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.block(0,j0,rows,n0), refMat2.block(0,j0,rows,n0)); 3117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(SparseMatrixType::IsRowMajor) 3137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.block(j0,0,n0,cols)+m2.block(j1,0,n0,cols), 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refMat2.block(j0,0,n0,cols)+refMat2.block(j1,0,n0,cols)); 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 3167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2.block(0,j0,rows,n0)+m2.block(0,j1,rows,n0), 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0)); 3187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 3197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index i = internal::random<Index>(0,m2.outerSize()-1); 3207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if(SparseMatrixType::IsRowMajor) { 3217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m2.innerVector(i) = m2.innerVector(i) * s1; 3227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat2.row(i) = refMat2.row(i) * s1; 3237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2,refMat2); 3247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } else { 3257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m2.innerVector(i) = m2.innerVector(i) * s1; 3267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat2.col(i) = refMat2.col(i) * s1; 3277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m2,refMat2); 3287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test prune 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows, rows); 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refM2(rows, rows); 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refM2.setZero(); 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int countFalseNonZero = 0; 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int countTrueNonZero = 0; 3387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (Index j=0; j<m2.outerSize(); ++j) 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.startVec(j); 3417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (Index i=0; i<m2.innerSize(); ++i) 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath float x = internal::random<float>(0,1); 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (x<0.1) 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // do nothing 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (x<0.5) 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath countFalseNonZero++; 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.insertBackByOuterInner(j,i) = Scalar(0); 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath countTrueNonZero++; 356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.insertBackByOuterInner(j,i) = Scalar(1); 357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(SparseMatrixType::IsRowMajor) 358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refM2(j,i) = Scalar(1); 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refM2(i,j) = Scalar(1); 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.finalize(); 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(countFalseNonZero+countTrueNonZero == m2.nonZeros()); 366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m2, refM2); 367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m2.prune(Scalar(1)); 368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(countTrueNonZero==m2.nonZeros()); 369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m2, refM2); 370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test setFromTriplets 373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Triplet<Scalar,Index> TripletType; 375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::vector<TripletType> triplets; 376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int ntriplets = rows*cols; 377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath triplets.reserve(ntriplets); 378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refMat(rows,cols); 379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refMat.setZero(); 380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i=0;i<ntriplets;++i) 381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 3827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index r = internal::random<Index>(0,rows-1); 3837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index c = internal::random<Index>(0,cols-1); 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar v = internal::random<Scalar>(); 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath triplets.push_back(TripletType(r,c,v)); 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refMat(r,c) += v; 387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m(rows,cols); 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m.setFromTriplets(triplets.begin(), triplets.end()); 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m, refMat); 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test triangularView 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refMat2(rows, rows), refMat3(rows, rows); 396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows, rows), m3(rows, rows); 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refMat2, m2); 398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refMat3 = refMat2.template triangularView<Lower>(); 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m3 = m2.template triangularView<Lower>(); 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m3, refMat3); 401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refMat3 = refMat2.template triangularView<Upper>(); 403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m3 = m2.template triangularView<Upper>(); 404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m3, refMat3); 405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refMat3 = refMat2.template triangularView<UnitUpper>(); 407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m3 = m2.template triangularView<UnitUpper>(); 408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m3, refMat3); 409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refMat3 = refMat2.template triangularView<UnitLower>(); 411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m3 = m2.template triangularView<UnitLower>(); 412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m3, refMat3); 4137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat3 = refMat2.template triangularView<StrictlyUpper>(); 4157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m3 = m2.template triangularView<StrictlyUpper>(); 4167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m3, refMat3); 4177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat3 = refMat2.template triangularView<StrictlyLower>(); 4197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m3 = m2.template triangularView<StrictlyLower>(); 4207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m3, refMat3); 421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test selfadjointView 424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!SparseMatrixType::IsRowMajor) 425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refMat2(rows, rows), refMat3(rows, rows); 427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows, rows), m3(rows, rows); 428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refMat2, m2); 429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath refMat3 = refMat2.template selfadjointView<Lower>(); 430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m3 = m2.template selfadjointView<Lower>(); 431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m3, refMat3); 432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test sparseView 435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); 437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows, rows); 438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refMat2, m2); 439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m2.eval(), refMat2.sparseView().eval()); 440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // test diagonal 443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); 445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixType m2(rows, rows); 446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath initSparse<Scalar>(density, refMat2, m2); 447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m2.diagonal(), refMat2.diagonal().eval()); 448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 4497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // test conservative resize 4517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 4527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez std::vector< std::pair<Index,Index> > inc; 4537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inc.push_back(std::pair<Index,Index>(-3,-2)); 4547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inc.push_back(std::pair<Index,Index>(0,0)); 4557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inc.push_back(std::pair<Index,Index>(3,2)); 4567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inc.push_back(std::pair<Index,Index>(3,0)); 4577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inc.push_back(std::pair<Index,Index>(0,3)); 4587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(size_t i = 0; i< inc.size(); i++) { 4607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index incRows = inc[i].first; 4617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index incCols = inc[i].second; 4627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SparseMatrixType m1(rows, cols); 4637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez DenseMatrix refMat1 = DenseMatrix::Zero(rows, cols); 4647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez initSparse<Scalar>(density, refMat1, m1); 4657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m1.conservativeResize(rows+incRows, cols+incCols); 4677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez refMat1.conservativeResize(rows+incRows, cols+incCols); 4687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (incRows > 0) refMat1.bottomRows(incRows).setZero(); 4697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (incCols > 0) refMat1.rightCols(incCols).setZero(); 4707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m1, refMat1); 4727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // Insert new values 4747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (incRows > 0) 4757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m1.insert(m1.rows()-1, 0) = refMat1(refMat1.rows()-1, 0) = 1; 4767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (incCols > 0) 4777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m1.insert(0, m1.cols()-1) = refMat1(0, refMat1.cols()-1) = 1; 4787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m1, refMat1); 4807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 4837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 4847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 4857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // test Identity matrix 4867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 4877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez DenseMatrix refMat1 = DenseMatrix::Identity(rows, rows); 4887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez SparseMatrixType m1(rows, rows); 4897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m1.setIdentity(); 4907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m1, refMat1); 4917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_sparse_basic() 495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < g_repeat; i++) { 497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int s = Eigen::internal::random<int>(1,50); 4987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_UNUSED_VARIABLE(s); 499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double>(8, 8)) )); 500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_2(( sparse_basic(SparseMatrix<std::complex<double>, ColMajor>(s, s)) )); 501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_2(( sparse_basic(SparseMatrix<std::complex<double>, RowMajor>(s, s)) )); 502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double>(s, s)) )); 503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double,ColMajor,long int>(s, s)) )); 504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double,RowMajor,long int>(s, s)) )); 5057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 5067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double,ColMajor,short int>(short(s), short(s))) )); 5077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double,RowMajor,short int>(short(s), short(s))) )); 508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 510