symbolic_index.cpp (2742B)
1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2017 Gael Guennebaud <gael.guennebaud@inria.fr> 5 // 6 // This Source Code Form is subject to the terms of the Mozilla 7 // Public License v. 2.0. If a copy of the MPL was not distributed 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10 #ifdef EIGEN_TEST_PART_2 11 #define EIGEN_MAX_CPP_VER 03 12 13 // see indexed_view.cpp 14 #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) 15 #pragma GCC diagnostic ignored "-Wdeprecated" 16 #endif 17 18 #endif 19 20 #include "main.h" 21 22 template<typename T1,typename T2> 23 bool is_same_symb(const T1& a, const T2& b, Index size) 24 { 25 return a.eval(last=size-1) == b.eval(last=size-1); 26 } 27 28 template<typename T> 29 void check_is_symbolic(const T&) { 30 STATIC_CHECK(( symbolic::is_symbolic<T>::value )) 31 } 32 33 template<typename T> 34 void check_isnot_symbolic(const T&) { 35 STATIC_CHECK(( !symbolic::is_symbolic<T>::value )) 36 } 37 38 #define VERIFY_EQ_INT(A,B) VERIFY_IS_APPROX(int(A),int(B)) 39 40 void check_symbolic_index() 41 { 42 check_is_symbolic(last); 43 check_is_symbolic(lastp1); 44 check_is_symbolic(last+1); 45 check_is_symbolic(last-lastp1); 46 check_is_symbolic(2*last-lastp1/2); 47 check_isnot_symbolic(fix<3>()); 48 49 Index size=100; 50 51 // First, let's check FixedInt arithmetic: 52 VERIFY( is_same_type( (fix<5>()-fix<3>())*fix<9>()/(-fix<3>()), fix<-(5-3)*9/3>() ) ); 53 VERIFY( is_same_type( (fix<5>()-fix<3>())*fix<9>()/fix<2>(), fix<(5-3)*9/2>() ) ); 54 VERIFY( is_same_type( fix<9>()/fix<2>(), fix<9/2>() ) ); 55 VERIFY( is_same_type( fix<9>()%fix<2>(), fix<9%2>() ) ); 56 VERIFY( is_same_type( fix<9>()&fix<2>(), fix<9&2>() ) ); 57 VERIFY( is_same_type( fix<9>()|fix<2>(), fix<9|2>() ) ); 58 VERIFY( is_same_type( fix<9>()/2, int(9/2) ) ); 59 60 VERIFY( is_same_symb( lastp1-1, last, size) ); 61 VERIFY( is_same_symb( lastp1-fix<1>, last, size) ); 62 63 VERIFY_IS_EQUAL( ( (last*5-2)/3 ).eval(last=size-1), ((size-1)*5-2)/3 ); 64 VERIFY_IS_EQUAL( ( (last*fix<5>-fix<2>)/fix<3> ).eval(last=size-1), ((size-1)*5-2)/3 ); 65 VERIFY_IS_EQUAL( ( -last*lastp1 ).eval(last=size-1), -(size-1)*size ); 66 VERIFY_IS_EQUAL( ( lastp1-3*last ).eval(last=size-1), size- 3*(size-1) ); 67 VERIFY_IS_EQUAL( ( (lastp1-3*last)/lastp1 ).eval(last=size-1), (size- 3*(size-1))/size ); 68 69 #if EIGEN_HAS_CXX14 70 { 71 struct x_tag {}; static const symbolic::SymbolExpr<x_tag> x; 72 struct y_tag {}; static const symbolic::SymbolExpr<y_tag> y; 73 struct z_tag {}; static const symbolic::SymbolExpr<z_tag> z; 74 75 VERIFY_IS_APPROX( int(((x+3)/y+z).eval(x=6,y=3,z=-13)), (6+3)/3+(-13) ); 76 } 77 #endif 78 } 79 80 EIGEN_DECLARE_TEST(symbolic_index) 81 { 82 CALL_SUBTEST_1( check_symbolic_index() ); 83 CALL_SUBTEST_2( check_symbolic_index() ); 84 }