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 Benoit Jacob <jacob.benoit.1@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#include "main.h" 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void matrixVisitor(const MatrixType& p) 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Scalar Scalar; 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Index Index; 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index rows = p.rows(); 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index cols = p.cols(); 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // construct a random matrix where all coefficients are different 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType m; 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m = MatrixType::Random(rows, cols); 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < m.size(); i++) 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i2 = 0; i2 < i; i2++) 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while(m(i) == m(i2)) // yes, == 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m(i) = internal::random<Scalar>(); 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar minc = Scalar(1000), maxc = Scalar(-1000); 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index minrow=0,mincol=0,maxrow=0,maxcol=0; 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index j = 0; j < cols; j++) 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < rows; i++) 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(m(i,j) < minc) 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath minc = m(i,j); 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath minrow = i; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mincol = j; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(m(i,j) > maxc) 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxc = m(i,j); 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxrow = i; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxcol = j; 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index eigen_minrow, eigen_mincol, eigen_maxrow, eigen_maxcol; 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar eigen_minc, eigen_maxc; 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_minc = m.minCoeff(&eigen_minrow,&eigen_mincol); 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_maxc = m.maxCoeff(&eigen_maxrow,&eigen_maxcol); 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(minrow == eigen_minrow); 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(maxrow == eigen_maxrow); 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(mincol == eigen_mincol); 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(maxcol == eigen_maxcol); 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(minc, eigen_minc); 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(maxc, eigen_maxc); 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(minc, m.minCoeff()); 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(maxc, m.maxCoeff()); 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename VectorType> void vectorVisitor(const VectorType& w) 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename VectorType::Scalar Scalar; 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename VectorType::Index Index; 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index size = w.size(); 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // construct a random vector where all coefficients are different 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VectorType v; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath v = VectorType::Random(size); 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < size; i++) 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i2 = 0; i2 < i; i2++) 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while(v(i) == v(i2)) // yes, == 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath v(i) = internal::random<Scalar>(); 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Scalar minc = v(0), maxc = v(0); 767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index minidx=0, maxidx=0; 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < size; i++) 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(v(i) < minc) 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath minc = v(i); 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath minidx = i; 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(v(i) > maxc) 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxc = v(i); 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxidx = i; 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index eigen_minidx, eigen_maxidx; 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar eigen_minc, eigen_maxc; 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_minc = v.minCoeff(&eigen_minidx); 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_maxc = v.maxCoeff(&eigen_maxidx); 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(minidx == eigen_minidx); 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(maxidx == eigen_maxidx); 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(minc, eigen_minc); 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(maxc, eigen_maxc); 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(minc, v.minCoeff()); 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(maxc, v.maxCoeff()); 1007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 1017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index idx0 = internal::random<Index>(0,size-1); 1027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index idx1 = eigen_minidx; 1037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Index idx2 = eigen_maxidx; 1047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VectorType v1(v), v2(v); 1057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez v1(idx0) = v1(idx1); 1067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez v2(idx0) = v2(idx2); 1077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez v1.minCoeff(&eigen_minidx); 1087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez v2.maxCoeff(&eigen_maxidx); 1097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY(eigen_minidx == (std::min)(idx0,idx1)); 1107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY(eigen_maxidx == (std::min)(idx0,idx2)); 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_visitor() 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < g_repeat; i++) { 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1( matrixVisitor(Matrix<float, 1, 1>()) ); 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_2( matrixVisitor(Matrix2f()) ); 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_3( matrixVisitor(Matrix4d()) ); 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_4( matrixVisitor(MatrixXd(8, 12)) ); 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_5( matrixVisitor(Matrix<double,Dynamic,Dynamic,RowMajor>(20, 20)) ); 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_6( matrixVisitor(MatrixXi(8, 12)) ); 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < g_repeat; i++) { 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_7( vectorVisitor(Vector4f()) ); 1257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_7( vectorVisitor(Matrix<int,12,1>()) ); 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_8( vectorVisitor(VectorXd(10)) ); 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_9( vectorVisitor(RowVectorXd(10)) ); 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_10( vectorVisitor(VectorXf(33)) ); 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 131