From 515ecddb97da7f239747c8d547bfb9ed5d63ae0f Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Fri, 9 Oct 2015 14:29:46 +0200 Subject: [PATCH] Add unit test for nested_eval --- test/nesting_ops.cpp | 84 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 5 deletions(-) diff --git a/test/nesting_ops.cpp b/test/nesting_ops.cpp index 6e772c70f..15b231d2e 100644 --- a/test/nesting_ops.cpp +++ b/test/nesting_ops.cpp @@ -2,14 +2,35 @@ // for linear algebra. // // Copyright (C) 2010 Hauke Heibel +// Copyright (C) 2015 Gael Guennebaud // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +#define TEST_ENABLE_TEMPORARY_TRACKING + #include "main.h" -template void run_nesting_ops(const MatrixType& _m) +template +void use_n_times(const XprType &xpr) +{ + typename internal::nested_eval::type mat(xpr); + typename XprType::PlainObject res(mat.rows(), mat.cols()); + nb_temporaries--; // remove res + res.setZero(); + for(int i=0; i +bool verify_eval_type(const XprType &, const ReferenceType&) +{ + typedef typename internal::nested_eval::type EvalType; + return internal::is_same::type, typename internal::remove_all::type>::value; +} + +template void run_nesting_ops_1(const MatrixType& _m) { typename internal::nested_eval::type m(_m); @@ -24,10 +45,63 @@ template void run_nesting_ops(const MatrixType& _m) VERIFY_IS_APPROX( (m.transpose() * m).array().abs().sum(), (m.transpose() * m).array().abs().sum() ); } +template void run_nesting_ops_2(const MatrixType& _m) +{ + Index rows = _m.rows(); + Index cols = _m.cols(); + MatrixType m1 = MatrixType::Random(rows,cols); + + if((MatrixType::SizeAtCompileTime==Dynamic)) + { + + VERIFY_EVALUATION_COUNT( use_n_times<10>(m1), 0 ); + if(!NumTraits::IsComplex) + { + VERIFY_EVALUATION_COUNT( use_n_times<3>(2*m1), 0 ); + VERIFY_EVALUATION_COUNT( use_n_times<4>(2*m1), 1 ); + } + else + { + VERIFY_EVALUATION_COUNT( use_n_times<1>(2*m1), 0 ); + VERIFY_EVALUATION_COUNT( use_n_times<2>(2*m1), 1 ); + } + VERIFY_EVALUATION_COUNT( use_n_times<2>(m1+m1), 0 ); + VERIFY_EVALUATION_COUNT( use_n_times<3>(m1+m1), 1 ); + VERIFY_EVALUATION_COUNT( use_n_times<1>(m1*m1.transpose()), 1 ); + VERIFY_EVALUATION_COUNT( use_n_times<2>(m1*m1.transpose()), 1 ); + } + + { + VERIFY( verify_eval_type<10>(m1, m1) ); + if(!NumTraits::IsComplex) + { + VERIFY( verify_eval_type<3>(2*m1, 2*m1) ); + VERIFY( verify_eval_type<4>(2*m1, m1) ); + } + else + { + VERIFY( verify_eval_type<1>(2*m1, 2*m1) ); + VERIFY( verify_eval_type<2>(2*m1, m1) ); + } + VERIFY( verify_eval_type<2>(m1+m1, m1+m1) ); + VERIFY( verify_eval_type<3>(m1+m1, m1) ); + VERIFY( verify_eval_type<1>(m1*m1.transpose(), m1) ); + VERIFY( verify_eval_type<1>(m1*(m1+m1).transpose(), m1) ); + VERIFY( verify_eval_type<2>(m1*m1.transpose(), m1) ); + } +} + + void test_nesting_ops() { - CALL_SUBTEST_1(run_nesting_ops(MatrixXf::Random(25,25))); - CALL_SUBTEST_2(run_nesting_ops(MatrixXd::Random(25,25))); - CALL_SUBTEST_3(run_nesting_ops(Matrix4f::Random())); - CALL_SUBTEST_4(run_nesting_ops(Matrix4d::Random())); + CALL_SUBTEST_1(run_nesting_ops_1(MatrixXf::Random(25,25))); + CALL_SUBTEST_2(run_nesting_ops_1(MatrixXcd::Random(25,25))); + CALL_SUBTEST_3(run_nesting_ops_1(Matrix4f::Random())); + CALL_SUBTEST_4(run_nesting_ops_1(Matrix2d::Random())); + + CALL_SUBTEST_1( run_nesting_ops_2(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_2( run_nesting_ops_2(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); + CALL_SUBTEST_3( run_nesting_ops_2(Matrix4f()) ); + CALL_SUBTEST_4( run_nesting_ops_2(Matrix2d()) ); + }