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 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int rows = p.rows(); 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int cols = p.cols(); 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // construct a random matrix where all coefficients are different 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType m; 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m = MatrixType::Random(rows, cols); 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < m.size(); i++) 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i2 = 0; i2 < i; i2++) 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while(m(i) == m(i2)) // yes, == 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m(i) = ei_random<Scalar>(); 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar minc = Scalar(1000), maxc = Scalar(-1000); 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int minrow=0,mincol=0,maxrow=0,maxcol=0; 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int j = 0; j < cols; j++) 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < rows; i++) 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(m(i,j) < minc) 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath minc = m(i,j); 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath minrow = i; 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mincol = j; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(m(i,j) > maxc) 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxc = m(i,j); 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxrow = i; 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxcol = j; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int eigen_minrow, eigen_mincol, eigen_maxrow, eigen_maxcol; 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar eigen_minc, eigen_maxc; 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_minc = m.minCoeff(&eigen_minrow,&eigen_mincol); 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_maxc = m.maxCoeff(&eigen_maxrow,&eigen_maxcol); 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(minrow == eigen_minrow); 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(maxrow == eigen_maxrow); 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(mincol == eigen_mincol); 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(maxcol == eigen_maxcol); 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(minc, eigen_minc); 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(maxc, eigen_maxc); 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(minc, m.minCoeff()); 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(maxc, m.maxCoeff()); 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename VectorType> void vectorVisitor(const VectorType& w) 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename VectorType::Scalar Scalar; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int size = w.size(); 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // construct a random vector where all coefficients are different 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VectorType v; 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath v = VectorType::Random(size); 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < size; i++) 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i2 = 0; i2 < i; i2++) 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while(v(i) == v(i2)) // yes, == 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath v(i) = ei_random<Scalar>(); 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar minc = Scalar(1000), maxc = Scalar(-1000); 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int minidx=0,maxidx=0; 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < size; i++) 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(v(i) < minc) 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath minc = v(i); 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath minidx = i; 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(v(i) > maxc) 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxc = v(i); 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath maxidx = i; 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int eigen_minidx, eigen_maxidx; 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar eigen_minc, eigen_maxc; 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_minc = v.minCoeff(&eigen_minidx); 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_maxc = v.maxCoeff(&eigen_maxidx); 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(minidx == eigen_minidx); 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY(maxidx == eigen_maxidx); 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(minc, eigen_minc); 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(maxc, eigen_maxc); 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(minc, v.minCoeff()); 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(maxc, v.maxCoeff()); 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_eigen2_visitor() 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < g_repeat; i++) { 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1( matrixVisitor(Matrix<float, 1, 1>()) ); 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_2( matrixVisitor(Matrix2f()) ); 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_3( matrixVisitor(Matrix4d()) ); 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_4( matrixVisitor(MatrixXd(8, 12)) ); 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_5( matrixVisitor(Matrix<double,Dynamic,Dynamic,RowMajor>(20, 20)) ); 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_6( matrixVisitor(MatrixXi(8, 12)) ); 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int i = 0; i < g_repeat; i++) { 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_7( vectorVisitor(Vector4f()) ); 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_4( vectorVisitor(VectorXd(10)) ); 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_4( vectorVisitor(RowVectorXd(10)) ); 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_8( vectorVisitor(VectorXf(33)) ); 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 117