1*bf2c3715SXin Li // This file is part of Eigen, a lightweight C++ template library
2*bf2c3715SXin Li // for linear algebra.
3*bf2c3715SXin Li //
4*bf2c3715SXin Li // Copyright (C) 2009 Hauke Heibel <[email protected]>
5*bf2c3715SXin Li //
6*bf2c3715SXin Li // This Source Code Form is subject to the terms of the Mozilla
7*bf2c3715SXin Li // Public License v. 2.0. If a copy of the MPL was not distributed
8*bf2c3715SXin Li // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9*bf2c3715SXin Li
10*bf2c3715SXin Li #include "main.h"
11*bf2c3715SXin Li
12*bf2c3715SXin Li #include <Eigen/Core>
13*bf2c3715SXin Li #include "AnnoyingScalar.h"
14*bf2c3715SXin Li
15*bf2c3715SXin Li using namespace Eigen;
16*bf2c3715SXin Li
17*bf2c3715SXin Li template <typename Scalar, int Storage>
run_matrix_tests()18*bf2c3715SXin Li void run_matrix_tests()
19*bf2c3715SXin Li {
20*bf2c3715SXin Li typedef Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, Storage> MatrixType;
21*bf2c3715SXin Li
22*bf2c3715SXin Li MatrixType m, n;
23*bf2c3715SXin Li
24*bf2c3715SXin Li // boundary cases ...
25*bf2c3715SXin Li m = n = MatrixType::Random(50,50);
26*bf2c3715SXin Li m.conservativeResize(1,50);
27*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.block(0,0,1,50));
28*bf2c3715SXin Li
29*bf2c3715SXin Li m = n = MatrixType::Random(50,50);
30*bf2c3715SXin Li m.conservativeResize(50,1);
31*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.block(0,0,50,1));
32*bf2c3715SXin Li
33*bf2c3715SXin Li m = n = MatrixType::Random(50,50);
34*bf2c3715SXin Li m.conservativeResize(50,50);
35*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.block(0,0,50,50));
36*bf2c3715SXin Li
37*bf2c3715SXin Li // random shrinking ...
38*bf2c3715SXin Li for (int i=0; i<25; ++i)
39*bf2c3715SXin Li {
40*bf2c3715SXin Li const Index rows = internal::random<Index>(1,50);
41*bf2c3715SXin Li const Index cols = internal::random<Index>(1,50);
42*bf2c3715SXin Li m = n = MatrixType::Random(50,50);
43*bf2c3715SXin Li m.conservativeResize(rows,cols);
44*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.block(0,0,rows,cols));
45*bf2c3715SXin Li }
46*bf2c3715SXin Li
47*bf2c3715SXin Li // random growing with zeroing ...
48*bf2c3715SXin Li for (int i=0; i<25; ++i)
49*bf2c3715SXin Li {
50*bf2c3715SXin Li const Index rows = internal::random<Index>(50,75);
51*bf2c3715SXin Li const Index cols = internal::random<Index>(50,75);
52*bf2c3715SXin Li m = n = MatrixType::Random(50,50);
53*bf2c3715SXin Li m.conservativeResizeLike(MatrixType::Zero(rows,cols));
54*bf2c3715SXin Li VERIFY_IS_APPROX(m.block(0,0,n.rows(),n.cols()), n);
55*bf2c3715SXin Li VERIFY( rows<=50 || m.block(50,0,rows-50,cols).sum() == Scalar(0) );
56*bf2c3715SXin Li VERIFY( cols<=50 || m.block(0,50,rows,cols-50).sum() == Scalar(0) );
57*bf2c3715SXin Li }
58*bf2c3715SXin Li }
59*bf2c3715SXin Li
60*bf2c3715SXin Li template <typename Scalar>
run_vector_tests()61*bf2c3715SXin Li void run_vector_tests()
62*bf2c3715SXin Li {
63*bf2c3715SXin Li typedef Matrix<Scalar, 1, Eigen::Dynamic> VectorType;
64*bf2c3715SXin Li
65*bf2c3715SXin Li VectorType m, n;
66*bf2c3715SXin Li
67*bf2c3715SXin Li // boundary cases ...
68*bf2c3715SXin Li m = n = VectorType::Random(50);
69*bf2c3715SXin Li m.conservativeResize(1);
70*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.segment(0,1));
71*bf2c3715SXin Li
72*bf2c3715SXin Li m = n = VectorType::Random(50);
73*bf2c3715SXin Li m.conservativeResize(50);
74*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.segment(0,50));
75*bf2c3715SXin Li
76*bf2c3715SXin Li m = n = VectorType::Random(50);
77*bf2c3715SXin Li m.conservativeResize(m.rows(),1);
78*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.segment(0,1));
79*bf2c3715SXin Li
80*bf2c3715SXin Li m = n = VectorType::Random(50);
81*bf2c3715SXin Li m.conservativeResize(m.rows(),50);
82*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.segment(0,50));
83*bf2c3715SXin Li
84*bf2c3715SXin Li // random shrinking ...
85*bf2c3715SXin Li for (int i=0; i<50; ++i)
86*bf2c3715SXin Li {
87*bf2c3715SXin Li const int size = internal::random<int>(1,50);
88*bf2c3715SXin Li m = n = VectorType::Random(50);
89*bf2c3715SXin Li m.conservativeResize(size);
90*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.segment(0,size));
91*bf2c3715SXin Li
92*bf2c3715SXin Li m = n = VectorType::Random(50);
93*bf2c3715SXin Li m.conservativeResize(m.rows(), size);
94*bf2c3715SXin Li VERIFY_IS_APPROX(m, n.segment(0,size));
95*bf2c3715SXin Li }
96*bf2c3715SXin Li
97*bf2c3715SXin Li // random growing with zeroing ...
98*bf2c3715SXin Li for (int i=0; i<50; ++i)
99*bf2c3715SXin Li {
100*bf2c3715SXin Li const int size = internal::random<int>(50,100);
101*bf2c3715SXin Li m = n = VectorType::Random(50);
102*bf2c3715SXin Li m.conservativeResizeLike(VectorType::Zero(size));
103*bf2c3715SXin Li VERIFY_IS_APPROX(m.segment(0,50), n);
104*bf2c3715SXin Li VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) );
105*bf2c3715SXin Li
106*bf2c3715SXin Li m = n = VectorType::Random(50);
107*bf2c3715SXin Li m.conservativeResizeLike(Matrix<Scalar,Dynamic,Dynamic>::Zero(1,size));
108*bf2c3715SXin Li VERIFY_IS_APPROX(m.segment(0,50), n);
109*bf2c3715SXin Li VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) );
110*bf2c3715SXin Li }
111*bf2c3715SXin Li }
112*bf2c3715SXin Li
113*bf2c3715SXin Li // Basic memory leak check with a non-copyable scalar type
noncopyable()114*bf2c3715SXin Li template<int> void noncopyable()
115*bf2c3715SXin Li {
116*bf2c3715SXin Li typedef Eigen::Matrix<AnnoyingScalar,Dynamic,1> VectorType;
117*bf2c3715SXin Li typedef Eigen::Matrix<AnnoyingScalar,Dynamic,Dynamic> MatrixType;
118*bf2c3715SXin Li
119*bf2c3715SXin Li {
120*bf2c3715SXin Li #ifndef EIGEN_TEST_ANNOYING_SCALAR_DONT_THROW
121*bf2c3715SXin Li AnnoyingScalar::dont_throw = true;
122*bf2c3715SXin Li #endif
123*bf2c3715SXin Li int n = 50;
124*bf2c3715SXin Li VectorType v0(n), v1(n);
125*bf2c3715SXin Li MatrixType m0(n,n), m1(n,n), m2(n,n);
126*bf2c3715SXin Li v0.setOnes(); v1.setOnes();
127*bf2c3715SXin Li m0.setOnes(); m1.setOnes(); m2.setOnes();
128*bf2c3715SXin Li VERIFY(m0==m1);
129*bf2c3715SXin Li m0.conservativeResize(2*n,2*n);
130*bf2c3715SXin Li VERIFY(m0.topLeftCorner(n,n) == m1);
131*bf2c3715SXin Li
132*bf2c3715SXin Li VERIFY(v0.head(n) == v1);
133*bf2c3715SXin Li v0.conservativeResize(2*n);
134*bf2c3715SXin Li VERIFY(v0.head(n) == v1);
135*bf2c3715SXin Li }
136*bf2c3715SXin Li VERIFY(AnnoyingScalar::instances==0 && "global memory leak detected in noncopyable");
137*bf2c3715SXin Li }
138*bf2c3715SXin Li
EIGEN_DECLARE_TEST(conservative_resize)139*bf2c3715SXin Li EIGEN_DECLARE_TEST(conservative_resize)
140*bf2c3715SXin Li {
141*bf2c3715SXin Li for(int i=0; i<g_repeat; ++i)
142*bf2c3715SXin Li {
143*bf2c3715SXin Li CALL_SUBTEST_1((run_matrix_tests<int, Eigen::RowMajor>()));
144*bf2c3715SXin Li CALL_SUBTEST_1((run_matrix_tests<int, Eigen::ColMajor>()));
145*bf2c3715SXin Li CALL_SUBTEST_2((run_matrix_tests<float, Eigen::RowMajor>()));
146*bf2c3715SXin Li CALL_SUBTEST_2((run_matrix_tests<float, Eigen::ColMajor>()));
147*bf2c3715SXin Li CALL_SUBTEST_3((run_matrix_tests<double, Eigen::RowMajor>()));
148*bf2c3715SXin Li CALL_SUBTEST_3((run_matrix_tests<double, Eigen::ColMajor>()));
149*bf2c3715SXin Li CALL_SUBTEST_4((run_matrix_tests<std::complex<float>, Eigen::RowMajor>()));
150*bf2c3715SXin Li CALL_SUBTEST_4((run_matrix_tests<std::complex<float>, Eigen::ColMajor>()));
151*bf2c3715SXin Li CALL_SUBTEST_5((run_matrix_tests<std::complex<double>, Eigen::RowMajor>()));
152*bf2c3715SXin Li CALL_SUBTEST_5((run_matrix_tests<std::complex<double>, Eigen::ColMajor>()));
153*bf2c3715SXin Li CALL_SUBTEST_1((run_matrix_tests<int, Eigen::RowMajor | Eigen::DontAlign>()));
154*bf2c3715SXin Li
155*bf2c3715SXin Li CALL_SUBTEST_1((run_vector_tests<int>()));
156*bf2c3715SXin Li CALL_SUBTEST_2((run_vector_tests<float>()));
157*bf2c3715SXin Li CALL_SUBTEST_3((run_vector_tests<double>()));
158*bf2c3715SXin Li CALL_SUBTEST_4((run_vector_tests<std::complex<float> >()));
159*bf2c3715SXin Li CALL_SUBTEST_5((run_vector_tests<std::complex<double> >()));
160*bf2c3715SXin Li
161*bf2c3715SXin Li #ifndef EIGEN_TEST_ANNOYING_SCALAR_DONT_THROW
162*bf2c3715SXin Li AnnoyingScalar::dont_throw = true;
163*bf2c3715SXin Li #endif
164*bf2c3715SXin Li CALL_SUBTEST_6(( run_vector_tests<AnnoyingScalar>() ));
165*bf2c3715SXin Li CALL_SUBTEST_6(( noncopyable<0>() ));
166*bf2c3715SXin Li }
167*bf2c3715SXin Li }
168