1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009 Hauke Heibel <hauke.heibel@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 Kamath#include <Eigen/Core> 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathusing namespace Eigen; 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar, int Storage> 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid run_matrix_tests() 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, Storage> MatrixType; 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Index Index; 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType m, n; 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // boundary cases ... 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m = n = MatrixType::Random(50,50); 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m.conservativeResize(1,50); 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m, n.block(0,0,1,50)); 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m = n = MatrixType::Random(50,50); 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m.conservativeResize(50,1); 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m, n.block(0,0,50,1)); 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m = n = MatrixType::Random(50,50); 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m.conservativeResize(50,50); 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m, n.block(0,0,50,50)); 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // random shrinking ... 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<25; ++i) 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index rows = internal::random<Index>(1,50); 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index cols = internal::random<Index>(1,50); 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m = n = MatrixType::Random(50,50); 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m.conservativeResize(rows,cols); 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m, n.block(0,0,rows,cols)); 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // random growing with zeroing ... 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<25; ++i) 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index rows = internal::random<Index>(50,75); 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index cols = internal::random<Index>(50,75); 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m = n = MatrixType::Random(50,50); 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m.conservativeResizeLike(MatrixType::Zero(rows,cols)); 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m.block(0,0,n.rows(),n.cols()), n); 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY( rows<=50 || m.block(50,0,rows-50,cols).sum() == Scalar(0) ); 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY( cols<=50 || m.block(0,50,rows,cols-50).sum() == Scalar(0) ); 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar> 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid run_vector_tests() 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef Matrix<Scalar, 1, Eigen::Dynamic> VectorType; 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VectorType m, n; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // boundary cases ... 687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m = n = VectorType::Random(50); 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m.conservativeResize(1); 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m, n.segment(0,1)); 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m = n = VectorType::Random(50); 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m.conservativeResize(50); 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m, n.segment(0,50)); 757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m = n = VectorType::Random(50); 777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m.conservativeResize(m.rows(),1); 787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m, n.segment(0,1)); 797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m = n = VectorType::Random(50); 817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m.conservativeResize(m.rows(),50); 827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m, n.segment(0,50)); 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // random shrinking ... 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<50; ++i) 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int size = internal::random<int>(1,50); 887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m = n = VectorType::Random(50); 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m.conservativeResize(size); 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m, n.segment(0,size)); 917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m = n = VectorType::Random(50); 937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m.conservativeResize(m.rows(), size); 947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m, n.segment(0,size)); 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // random growing with zeroing ... 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i<50; ++i) 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int size = internal::random<int>(50,100); 1017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m = n = VectorType::Random(50); 1027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m.conservativeResizeLike(VectorType::Zero(size)); 1037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY_IS_APPROX(m.segment(0,50), n); 1047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) ); 1057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 1067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m = n = VectorType::Random(50); 1077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m.conservativeResizeLike(Matrix<Scalar,Dynamic,Dynamic>::Zero(1,size)); 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(m.segment(0,50), n); 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) ); 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_conservative_resize() 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 1157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for(int i=0; i<g_repeat; ++i) 1167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 1177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_1((run_matrix_tests<int, Eigen::RowMajor>())); 1187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_1((run_matrix_tests<int, Eigen::ColMajor>())); 1197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_2((run_matrix_tests<float, Eigen::RowMajor>())); 1207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_2((run_matrix_tests<float, Eigen::ColMajor>())); 1217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_3((run_matrix_tests<double, Eigen::RowMajor>())); 1227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_3((run_matrix_tests<double, Eigen::ColMajor>())); 1237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_4((run_matrix_tests<std::complex<float>, Eigen::RowMajor>())); 1247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_4((run_matrix_tests<std::complex<float>, Eigen::ColMajor>())); 1257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_5((run_matrix_tests<std::complex<double>, Eigen::RowMajor>())); 1267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_6((run_matrix_tests<std::complex<double>, Eigen::ColMajor>())); 1277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 1287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_1((run_vector_tests<int>())); 1297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_2((run_vector_tests<float>())); 1307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_3((run_vector_tests<double>())); 1317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_4((run_vector_tests<std::complex<float> >())); 1327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez CALL_SUBTEST_5((run_vector_tests<std::complex<double> >())); 1337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 135