conservative_resize.cpp revision 7faaa9f3f0df9d23790277834d426c3d992ac3ba
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