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) 2017 Gael Guennebaud <[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 #ifdef EIGEN_TEST_PART_2
11*bf2c3715SXin Li // Make sure we also check c++11 max implementation
12*bf2c3715SXin Li #define EIGEN_MAX_CPP_VER 11
13*bf2c3715SXin Li #endif
14*bf2c3715SXin Li
15*bf2c3715SXin Li #ifdef EIGEN_TEST_PART_3
16*bf2c3715SXin Li // Make sure we also check c++98 max implementation
17*bf2c3715SXin Li #define EIGEN_MAX_CPP_VER 03
18*bf2c3715SXin Li
19*bf2c3715SXin Li // We need to disable this warning when compiling with c++11 while limiting Eigen to c++98
20*bf2c3715SXin Li // Ideally we would rather configure the compiler to build in c++98 mode but this needs
21*bf2c3715SXin Li // to be done at the CMakeLists.txt level.
22*bf2c3715SXin Li #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))
23*bf2c3715SXin Li #pragma GCC diagnostic ignored "-Wdeprecated"
24*bf2c3715SXin Li #endif
25*bf2c3715SXin Li
26*bf2c3715SXin Li #if defined(__GNUC__) && (__GNUC__ >=9)
27*bf2c3715SXin Li #pragma GCC diagnostic ignored "-Wdeprecated-copy"
28*bf2c3715SXin Li #endif
29*bf2c3715SXin Li #if defined(__clang__) && (__clang_major__ >= 10)
30*bf2c3715SXin Li #pragma clang diagnostic ignored "-Wdeprecated-copy"
31*bf2c3715SXin Li #endif
32*bf2c3715SXin Li
33*bf2c3715SXin Li #endif
34*bf2c3715SXin Li
35*bf2c3715SXin Li #include <valarray>
36*bf2c3715SXin Li #include <vector>
37*bf2c3715SXin Li #include "main.h"
38*bf2c3715SXin Li
39*bf2c3715SXin Li #if EIGEN_HAS_CXX11
40*bf2c3715SXin Li #include <array>
41*bf2c3715SXin Li #endif
42*bf2c3715SXin Li
43*bf2c3715SXin Li typedef std::pair<Index,Index> IndexPair;
44*bf2c3715SXin Li
encode(Index i,Index j)45*bf2c3715SXin Li int encode(Index i, Index j) {
46*bf2c3715SXin Li return int(i*100 + j);
47*bf2c3715SXin Li }
48*bf2c3715SXin Li
decode(Index ij)49*bf2c3715SXin Li IndexPair decode(Index ij) {
50*bf2c3715SXin Li return IndexPair(ij / 100, ij % 100);
51*bf2c3715SXin Li }
52*bf2c3715SXin Li
53*bf2c3715SXin Li template<typename T>
match(const T & xpr,std::string ref,std::string str_xpr="")54*bf2c3715SXin Li bool match(const T& xpr, std::string ref, std::string str_xpr = "") {
55*bf2c3715SXin Li EIGEN_UNUSED_VARIABLE(str_xpr);
56*bf2c3715SXin Li std::stringstream str;
57*bf2c3715SXin Li str << xpr;
58*bf2c3715SXin Li if(!(str.str() == ref))
59*bf2c3715SXin Li std::cout << str_xpr << "\n" << xpr << "\n\n";
60*bf2c3715SXin Li return str.str() == ref;
61*bf2c3715SXin Li }
62*bf2c3715SXin Li
63*bf2c3715SXin Li #define MATCH(X,R) match(X, R, #X)
64*bf2c3715SXin Li
65*bf2c3715SXin Li template<typename T1,typename T2>
66*bf2c3715SXin Li typename internal::enable_if<internal::is_same<T1,T2>::value,bool>::type
is_same_eq(const T1 & a,const T2 & b)67*bf2c3715SXin Li is_same_eq(const T1& a, const T2& b)
68*bf2c3715SXin Li {
69*bf2c3715SXin Li return (a == b).all();
70*bf2c3715SXin Li }
71*bf2c3715SXin Li
72*bf2c3715SXin Li template<typename T1,typename T2>
is_same_seq(const T1 & a,const T2 & b)73*bf2c3715SXin Li bool is_same_seq(const T1& a, const T2& b)
74*bf2c3715SXin Li {
75*bf2c3715SXin Li bool ok = a.first()==b.first() && a.size() == b.size() && Index(a.incrObject())==Index(b.incrObject());;
76*bf2c3715SXin Li if(!ok)
77*bf2c3715SXin Li {
78*bf2c3715SXin Li std::cerr << "seqN(" << a.first() << ", " << a.size() << ", " << Index(a.incrObject()) << ") != ";
79*bf2c3715SXin Li std::cerr << "seqN(" << b.first() << ", " << b.size() << ", " << Index(b.incrObject()) << ")\n";
80*bf2c3715SXin Li }
81*bf2c3715SXin Li return ok;
82*bf2c3715SXin Li }
83*bf2c3715SXin Li
84*bf2c3715SXin Li template<typename T1,typename T2>
85*bf2c3715SXin Li typename internal::enable_if<internal::is_same<T1,T2>::value,bool>::type
is_same_seq_type(const T1 & a,const T2 & b)86*bf2c3715SXin Li is_same_seq_type(const T1& a, const T2& b)
87*bf2c3715SXin Li {
88*bf2c3715SXin Li return is_same_seq(a,b);
89*bf2c3715SXin Li }
90*bf2c3715SXin Li
91*bf2c3715SXin Li
92*bf2c3715SXin Li
93*bf2c3715SXin Li #define VERIFY_EQ_INT(A,B) VERIFY_IS_APPROX(int(A),int(B))
94*bf2c3715SXin Li
95*bf2c3715SXin Li // C++03 does not allow local or unnamed enums as index
96*bf2c3715SXin Li enum DummyEnum { XX=0, YY=1 };
97*bf2c3715SXin Li
check_indexed_view()98*bf2c3715SXin Li void check_indexed_view()
99*bf2c3715SXin Li {
100*bf2c3715SXin Li Index n = 10;
101*bf2c3715SXin Li
102*bf2c3715SXin Li ArrayXd a = ArrayXd::LinSpaced(n,0,n-1);
103*bf2c3715SXin Li Array<double,1,Dynamic> b = a.transpose();
104*bf2c3715SXin Li
105*bf2c3715SXin Li #if EIGEN_COMP_CXXVER>=14
106*bf2c3715SXin Li ArrayXXi A = ArrayXXi::NullaryExpr(n,n, std::ref(encode));
107*bf2c3715SXin Li #else
108*bf2c3715SXin Li ArrayXXi A = ArrayXXi::NullaryExpr(n,n, std::ptr_fun(&encode));
109*bf2c3715SXin Li #endif
110*bf2c3715SXin Li
111*bf2c3715SXin Li for(Index i=0; i<n; ++i)
112*bf2c3715SXin Li for(Index j=0; j<n; ++j)
113*bf2c3715SXin Li VERIFY( decode(A(i,j)) == IndexPair(i,j) );
114*bf2c3715SXin Li
115*bf2c3715SXin Li Array4i eii(4); eii << 3, 1, 6, 5;
116*bf2c3715SXin Li std::valarray<int> vali(4); Map<ArrayXi>(&vali[0],4) = eii;
117*bf2c3715SXin Li std::vector<int> veci(4); Map<ArrayXi>(veci.data(),4) = eii;
118*bf2c3715SXin Li
119*bf2c3715SXin Li VERIFY( MATCH( A(3, seq(9,3,-1)),
120*bf2c3715SXin Li "309 308 307 306 305 304 303")
121*bf2c3715SXin Li );
122*bf2c3715SXin Li
123*bf2c3715SXin Li VERIFY( MATCH( A(seqN(2,5), seq(9,3,-1)),
124*bf2c3715SXin Li "209 208 207 206 205 204 203\n"
125*bf2c3715SXin Li "309 308 307 306 305 304 303\n"
126*bf2c3715SXin Li "409 408 407 406 405 404 403\n"
127*bf2c3715SXin Li "509 508 507 506 505 504 503\n"
128*bf2c3715SXin Li "609 608 607 606 605 604 603")
129*bf2c3715SXin Li );
130*bf2c3715SXin Li
131*bf2c3715SXin Li VERIFY( MATCH( A(seqN(2,5), 5),
132*bf2c3715SXin Li "205\n"
133*bf2c3715SXin Li "305\n"
134*bf2c3715SXin Li "405\n"
135*bf2c3715SXin Li "505\n"
136*bf2c3715SXin Li "605")
137*bf2c3715SXin Li );
138*bf2c3715SXin Li
139*bf2c3715SXin Li VERIFY( MATCH( A(seqN(last,5,-1), seq(2,last)),
140*bf2c3715SXin Li "902 903 904 905 906 907 908 909\n"
141*bf2c3715SXin Li "802 803 804 805 806 807 808 809\n"
142*bf2c3715SXin Li "702 703 704 705 706 707 708 709\n"
143*bf2c3715SXin Li "602 603 604 605 606 607 608 609\n"
144*bf2c3715SXin Li "502 503 504 505 506 507 508 509")
145*bf2c3715SXin Li );
146*bf2c3715SXin Li
147*bf2c3715SXin Li VERIFY( MATCH( A(eii, veci),
148*bf2c3715SXin Li "303 301 306 305\n"
149*bf2c3715SXin Li "103 101 106 105\n"
150*bf2c3715SXin Li "603 601 606 605\n"
151*bf2c3715SXin Li "503 501 506 505")
152*bf2c3715SXin Li );
153*bf2c3715SXin Li
154*bf2c3715SXin Li VERIFY( MATCH( A(eii, all),
155*bf2c3715SXin Li "300 301 302 303 304 305 306 307 308 309\n"
156*bf2c3715SXin Li "100 101 102 103 104 105 106 107 108 109\n"
157*bf2c3715SXin Li "600 601 602 603 604 605 606 607 608 609\n"
158*bf2c3715SXin Li "500 501 502 503 504 505 506 507 508 509")
159*bf2c3715SXin Li );
160*bf2c3715SXin Li
161*bf2c3715SXin Li // take row number 3, and repeat it 5 times
162*bf2c3715SXin Li VERIFY( MATCH( A(seqN(3,5,0), all),
163*bf2c3715SXin Li "300 301 302 303 304 305 306 307 308 309\n"
164*bf2c3715SXin Li "300 301 302 303 304 305 306 307 308 309\n"
165*bf2c3715SXin Li "300 301 302 303 304 305 306 307 308 309\n"
166*bf2c3715SXin Li "300 301 302 303 304 305 306 307 308 309\n"
167*bf2c3715SXin Li "300 301 302 303 304 305 306 307 308 309")
168*bf2c3715SXin Li );
169*bf2c3715SXin Li
170*bf2c3715SXin Li VERIFY( MATCH( a(seqN(3,3),0), "3\n4\n5" ) );
171*bf2c3715SXin Li VERIFY( MATCH( a(seq(3,5)), "3\n4\n5" ) );
172*bf2c3715SXin Li VERIFY( MATCH( a(seqN(3,3,1)), "3\n4\n5" ) );
173*bf2c3715SXin Li VERIFY( MATCH( a(seqN(5,3,-1)), "5\n4\n3" ) );
174*bf2c3715SXin Li
175*bf2c3715SXin Li VERIFY( MATCH( b(0,seqN(3,3)), "3 4 5" ) );
176*bf2c3715SXin Li VERIFY( MATCH( b(seq(3,5)), "3 4 5" ) );
177*bf2c3715SXin Li VERIFY( MATCH( b(seqN(3,3,1)), "3 4 5" ) );
178*bf2c3715SXin Li VERIFY( MATCH( b(seqN(5,3,-1)), "5 4 3" ) );
179*bf2c3715SXin Li
180*bf2c3715SXin Li VERIFY( MATCH( b(all), "0 1 2 3 4 5 6 7 8 9" ) );
181*bf2c3715SXin Li VERIFY( MATCH( b(eii), "3 1 6 5" ) );
182*bf2c3715SXin Li
183*bf2c3715SXin Li Array44i B;
184*bf2c3715SXin Li B.setRandom();
185*bf2c3715SXin Li VERIFY( (A(seqN(2,5), 5)).ColsAtCompileTime == 1);
186*bf2c3715SXin Li VERIFY( (A(seqN(2,5), 5)).RowsAtCompileTime == Dynamic);
187*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,5), 5)).InnerStrideAtCompileTime , A.InnerStrideAtCompileTime);
188*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,5), 5)).OuterStrideAtCompileTime , A.col(5).OuterStrideAtCompileTime);
189*bf2c3715SXin Li
190*bf2c3715SXin Li VERIFY_EQ_INT( (A(5,seqN(2,5))).InnerStrideAtCompileTime , A.row(5).InnerStrideAtCompileTime);
191*bf2c3715SXin Li VERIFY_EQ_INT( (A(5,seqN(2,5))).OuterStrideAtCompileTime , A.row(5).OuterStrideAtCompileTime);
192*bf2c3715SXin Li VERIFY_EQ_INT( (B(1,seqN(1,2))).InnerStrideAtCompileTime , B.row(1).InnerStrideAtCompileTime);
193*bf2c3715SXin Li VERIFY_EQ_INT( (B(1,seqN(1,2))).OuterStrideAtCompileTime , B.row(1).OuterStrideAtCompileTime);
194*bf2c3715SXin Li
195*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,5), seq(1,3))).InnerStrideAtCompileTime , A.InnerStrideAtCompileTime);
196*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,5), seq(1,3))).OuterStrideAtCompileTime , A.OuterStrideAtCompileTime);
197*bf2c3715SXin Li VERIFY_EQ_INT( (B(seqN(1,2), seq(1,3))).InnerStrideAtCompileTime , B.InnerStrideAtCompileTime);
198*bf2c3715SXin Li VERIFY_EQ_INT( (B(seqN(1,2), seq(1,3))).OuterStrideAtCompileTime , B.OuterStrideAtCompileTime);
199*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,5,2), seq(1,3,2))).InnerStrideAtCompileTime , Dynamic);
200*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,5,2), seq(1,3,2))).OuterStrideAtCompileTime , Dynamic);
201*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,5,fix<2>), seq(1,3,fix<3>))).InnerStrideAtCompileTime , 2);
202*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,5,fix<2>), seq(1,3,fix<3>))).OuterStrideAtCompileTime , Dynamic);
203*bf2c3715SXin Li VERIFY_EQ_INT( (B(seqN(1,2,fix<2>), seq(1,3,fix<3>))).InnerStrideAtCompileTime , 2);
204*bf2c3715SXin Li VERIFY_EQ_INT( (B(seqN(1,2,fix<2>), seq(1,3,fix<3>))).OuterStrideAtCompileTime , 3*4);
205*bf2c3715SXin Li
206*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,fix<5>), seqN(1,fix<3>))).RowsAtCompileTime, 5);
207*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,fix<5>), seqN(1,fix<3>))).ColsAtCompileTime, 3);
208*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,fix<5>(5)), seqN(1,fix<3>(3)))).RowsAtCompileTime, 5);
209*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,fix<5>(5)), seqN(1,fix<3>(3)))).ColsAtCompileTime, 3);
210*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,fix<Dynamic>(5)), seqN(1,fix<Dynamic>(3)))).RowsAtCompileTime, Dynamic);
211*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,fix<Dynamic>(5)), seqN(1,fix<Dynamic>(3)))).ColsAtCompileTime, Dynamic);
212*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,fix<Dynamic>(5)), seqN(1,fix<Dynamic>(3)))).rows(), 5);
213*bf2c3715SXin Li VERIFY_EQ_INT( (A(seqN(2,fix<Dynamic>(5)), seqN(1,fix<Dynamic>(3)))).cols(), 3);
214*bf2c3715SXin Li
215*bf2c3715SXin Li VERIFY( is_same_seq_type( seqN(2,5,fix<-1>), seqN(2,5,fix<-1>(-1)) ) );
216*bf2c3715SXin Li VERIFY( is_same_seq_type( seqN(2,5), seqN(2,5,fix<1>(1)) ) );
217*bf2c3715SXin Li VERIFY( is_same_seq_type( seqN(2,5,3), seqN(2,5,fix<DynamicIndex>(3)) ) );
218*bf2c3715SXin Li VERIFY( is_same_seq_type( seq(2,7,fix<3>), seqN(2,2,fix<3>) ) );
219*bf2c3715SXin Li VERIFY( is_same_seq_type( seqN(2,fix<Dynamic>(5),3), seqN(2,5,fix<DynamicIndex>(3)) ) );
220*bf2c3715SXin Li VERIFY( is_same_seq_type( seqN(2,fix<5>(5),fix<-2>), seqN(2,fix<5>,fix<-2>()) ) );
221*bf2c3715SXin Li
222*bf2c3715SXin Li VERIFY( is_same_seq_type( seq(2,fix<5>), seqN(2,4) ) );
223*bf2c3715SXin Li #if EIGEN_HAS_CXX11
224*bf2c3715SXin Li VERIFY( is_same_seq_type( seq(fix<2>,fix<5>), seqN(fix<2>,fix<4>) ) );
225*bf2c3715SXin Li VERIFY( is_same_seq( seqN(2,std::integral_constant<int,5>(),std::integral_constant<int,-2>()), seqN(2,fix<5>,fix<-2>()) ) );
226*bf2c3715SXin Li VERIFY( is_same_seq( seq(std::integral_constant<int,1>(),std::integral_constant<int,5>(),std::integral_constant<int,2>()),
227*bf2c3715SXin Li seq(fix<1>,fix<5>,fix<2>()) ) );
228*bf2c3715SXin Li VERIFY( is_same_seq_type( seqN(2,std::integral_constant<int,5>(),std::integral_constant<int,-2>()), seqN(2,fix<5>,fix<-2>()) ) );
229*bf2c3715SXin Li VERIFY( is_same_seq_type( seq(std::integral_constant<int,1>(),std::integral_constant<int,5>(),std::integral_constant<int,2>()),
230*bf2c3715SXin Li seq(fix<1>,fix<5>,fix<2>()) ) );
231*bf2c3715SXin Li
232*bf2c3715SXin Li VERIFY( is_same_seq_type( seqN(2,std::integral_constant<int,5>()), seqN(2,fix<5>) ) );
233*bf2c3715SXin Li VERIFY( is_same_seq_type( seq(std::integral_constant<int,1>(),std::integral_constant<int,5>()), seq(fix<1>,fix<5>) ) );
234*bf2c3715SXin Li #else
235*bf2c3715SXin Li // sorry, no compile-time size recovery in c++98/03
236*bf2c3715SXin Li VERIFY( is_same_seq( seq(fix<2>,fix<5>), seqN(fix<2>,fix<4>) ) );
237*bf2c3715SXin Li #endif
238*bf2c3715SXin Li
239*bf2c3715SXin Li VERIFY( (A(seqN(2,fix<5>), 5)).RowsAtCompileTime == 5);
240*bf2c3715SXin Li VERIFY( (A(4, all)).ColsAtCompileTime == Dynamic);
241*bf2c3715SXin Li VERIFY( (A(4, all)).RowsAtCompileTime == 1);
242*bf2c3715SXin Li VERIFY( (B(1, all)).ColsAtCompileTime == 4);
243*bf2c3715SXin Li VERIFY( (B(1, all)).RowsAtCompileTime == 1);
244*bf2c3715SXin Li VERIFY( (B(all,1)).ColsAtCompileTime == 1);
245*bf2c3715SXin Li VERIFY( (B(all,1)).RowsAtCompileTime == 4);
246*bf2c3715SXin Li
247*bf2c3715SXin Li VERIFY(int( (A(all, eii)).ColsAtCompileTime) == int(eii.SizeAtCompileTime));
248*bf2c3715SXin Li VERIFY_EQ_INT( (A(eii, eii)).Flags&DirectAccessBit, (unsigned int)(0));
249*bf2c3715SXin Li VERIFY_EQ_INT( (A(eii, eii)).InnerStrideAtCompileTime, 0);
250*bf2c3715SXin Li VERIFY_EQ_INT( (A(eii, eii)).OuterStrideAtCompileTime, 0);
251*bf2c3715SXin Li
252*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(n-1,2,-2), seqN(n-1-6,3,-1)), A(seq(last,2,fix<-2>), seqN(last-6,3,fix<-1>)) );
253*bf2c3715SXin Li
254*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(n-1,2,-2), seqN(n-1-6,4)), A(seq(last,2,-2), seqN(last-6,4)) );
255*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(n-1-6,n-1-2), seqN(n-1-6,4)), A(seq(last-6,last-2), seqN(6+last-6-6,4)) );
256*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq((n-1)/2,(n)/2+3), seqN(2,4)), A(seq(last/2,(last+1)/2+3), seqN(last+2-last,4)) );
257*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(n-2,2,-2), seqN(n-8,4)), A(seq(lastp1-2,2,-2), seqN(lastp1-8,4)) );
258*bf2c3715SXin Li
259*bf2c3715SXin Li // Check all combinations of seq:
260*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(1,n-1-2,2), seq(1,n-1-2,2)), A(seq(1,last-2,2), seq(1,last-2,fix<2>)) );
261*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(n-1-5,n-1-2,2), seq(n-1-5,n-1-2,2)), A(seq(last-5,last-2,2), seq(last-5,last-2,fix<2>)) );
262*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(n-1-5,7,2), seq(n-1-5,7,2)), A(seq(last-5,7,2), seq(last-5,7,fix<2>)) );
263*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(1,n-1-2), seq(n-1-5,7)), A(seq(1,last-2), seq(last-5,7)) );
264*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(n-1-5,n-1-2), seq(n-1-5,n-1-2)), A(seq(last-5,last-2), seq(last-5,last-2)) );
265*bf2c3715SXin Li
266*bf2c3715SXin Li VERIFY_IS_APPROX( A.col(A.cols()-1), A(all,last) );
267*bf2c3715SXin Li VERIFY_IS_APPROX( A(A.rows()-2, A.cols()/2), A(last-1, lastp1/2) );
268*bf2c3715SXin Li VERIFY_IS_APPROX( a(a.size()-2), a(last-1) );
269*bf2c3715SXin Li VERIFY_IS_APPROX( a(a.size()/2), a((last+1)/2) );
270*bf2c3715SXin Li
271*bf2c3715SXin Li // Check fall-back to Block
272*bf2c3715SXin Li {
273*bf2c3715SXin Li VERIFY( is_same_eq(A.col(0), A(all,0)) );
274*bf2c3715SXin Li VERIFY( is_same_eq(A.row(0), A(0,all)) );
275*bf2c3715SXin Li VERIFY( is_same_eq(A.block(0,0,2,2), A(seqN(0,2),seq(0,1))) );
276*bf2c3715SXin Li VERIFY( is_same_eq(A.middleRows(2,4), A(seqN(2,4),all)) );
277*bf2c3715SXin Li VERIFY( is_same_eq(A.middleCols(2,4), A(all,seqN(2,4))) );
278*bf2c3715SXin Li
279*bf2c3715SXin Li VERIFY( is_same_eq(A.col(A.cols()-1), A(all,last)) );
280*bf2c3715SXin Li
281*bf2c3715SXin Li const ArrayXXi& cA(A);
282*bf2c3715SXin Li VERIFY( is_same_eq(cA.col(0), cA(all,0)) );
283*bf2c3715SXin Li VERIFY( is_same_eq(cA.row(0), cA(0,all)) );
284*bf2c3715SXin Li VERIFY( is_same_eq(cA.block(0,0,2,2), cA(seqN(0,2),seq(0,1))) );
285*bf2c3715SXin Li VERIFY( is_same_eq(cA.middleRows(2,4), cA(seqN(2,4),all)) );
286*bf2c3715SXin Li VERIFY( is_same_eq(cA.middleCols(2,4), cA(all,seqN(2,4))) );
287*bf2c3715SXin Li
288*bf2c3715SXin Li VERIFY( is_same_eq(a.head(4), a(seq(0,3))) );
289*bf2c3715SXin Li VERIFY( is_same_eq(a.tail(4), a(seqN(last-3,4))) );
290*bf2c3715SXin Li VERIFY( is_same_eq(a.tail(4), a(seq(lastp1-4,last))) );
291*bf2c3715SXin Li VERIFY( is_same_eq(a.segment<4>(3), a(seqN(3,fix<4>))) );
292*bf2c3715SXin Li }
293*bf2c3715SXin Li
294*bf2c3715SXin Li ArrayXXi A1=A, A2 = ArrayXXi::Random(4,4);
295*bf2c3715SXin Li ArrayXi range25(4); range25 << 3,2,4,5;
296*bf2c3715SXin Li A1(seqN(3,4),seq(2,5)) = A2;
297*bf2c3715SXin Li VERIFY_IS_APPROX( A1.block(3,2,4,4), A2 );
298*bf2c3715SXin Li A1 = A;
299*bf2c3715SXin Li A2.setOnes();
300*bf2c3715SXin Li A1(seq(6,3,-1),range25) = A2;
301*bf2c3715SXin Li VERIFY_IS_APPROX( A1.block(3,2,4,4), A2 );
302*bf2c3715SXin Li
303*bf2c3715SXin Li // check reverse
304*bf2c3715SXin Li {
305*bf2c3715SXin Li VERIFY( is_same_seq_type( seq(3,7).reverse(), seqN(7,5,fix<-1>) ) );
306*bf2c3715SXin Li VERIFY( is_same_seq_type( seq(7,3,fix<-2>).reverse(), seqN(3,3,fix<2>) ) );
307*bf2c3715SXin Li VERIFY_IS_APPROX( a(seqN(2,last/2).reverse()), a(seqN(2+(last/2-1)*1,last/2,fix<-1>)) );
308*bf2c3715SXin Li VERIFY_IS_APPROX( a(seqN(last/2,fix<4>).reverse()),a(seqN(last/2,fix<4>)).reverse() );
309*bf2c3715SXin Li VERIFY_IS_APPROX( A(seq(last-5,last-1,2).reverse(), seqN(last-3,3,fix<-2>).reverse()),
310*bf2c3715SXin Li A(seq(last-5,last-1,2), seqN(last-3,3,fix<-2>)).reverse() );
311*bf2c3715SXin Li }
312*bf2c3715SXin Li
313*bf2c3715SXin Li #if EIGEN_HAS_CXX11
314*bf2c3715SXin Li // check lastN
315*bf2c3715SXin Li VERIFY_IS_APPROX( a(lastN(3)), a.tail(3) );
316*bf2c3715SXin Li VERIFY( MATCH( a(lastN(3)), "7\n8\n9" ) );
317*bf2c3715SXin Li VERIFY_IS_APPROX( a(lastN(fix<3>())), a.tail<3>() );
318*bf2c3715SXin Li VERIFY( MATCH( a(lastN(3,2)), "5\n7\n9" ) );
319*bf2c3715SXin Li VERIFY( MATCH( a(lastN(3,fix<2>())), "5\n7\n9" ) );
320*bf2c3715SXin Li VERIFY( a(lastN(fix<3>())).SizeAtCompileTime == 3 );
321*bf2c3715SXin Li
322*bf2c3715SXin Li VERIFY( (A(all, std::array<int,4>{{1,3,2,4}})).ColsAtCompileTime == 4);
323*bf2c3715SXin Li
324*bf2c3715SXin Li VERIFY_IS_APPROX( (A(std::array<int,3>{{1,3,5}}, std::array<int,4>{{9,6,3,0}})), A(seqN(1,3,2), seqN(9,4,-3)) );
325*bf2c3715SXin Li
326*bf2c3715SXin Li #if EIGEN_HAS_STATIC_ARRAY_TEMPLATE
327*bf2c3715SXin Li VERIFY_IS_APPROX( A({3, 1, 6, 5}, all), A(std::array<int,4>{{3, 1, 6, 5}}, all) );
328*bf2c3715SXin Li VERIFY_IS_APPROX( A(all,{3, 1, 6, 5}), A(all,std::array<int,4>{{3, 1, 6, 5}}) );
329*bf2c3715SXin Li VERIFY_IS_APPROX( A({1,3,5},{3, 1, 6, 5}), A(std::array<int,3>{{1,3,5}},std::array<int,4>{{3, 1, 6, 5}}) );
330*bf2c3715SXin Li
331*bf2c3715SXin Li VERIFY_IS_EQUAL( A({1,3,5},{3, 1, 6, 5}).RowsAtCompileTime, 3 );
332*bf2c3715SXin Li VERIFY_IS_EQUAL( A({1,3,5},{3, 1, 6, 5}).ColsAtCompileTime, 4 );
333*bf2c3715SXin Li
334*bf2c3715SXin Li VERIFY_IS_APPROX( a({3, 1, 6, 5}), a(std::array<int,4>{{3, 1, 6, 5}}) );
335*bf2c3715SXin Li VERIFY_IS_EQUAL( a({1,3,5}).SizeAtCompileTime, 3 );
336*bf2c3715SXin Li
337*bf2c3715SXin Li VERIFY_IS_APPROX( b({3, 1, 6, 5}), b(std::array<int,4>{{3, 1, 6, 5}}) );
338*bf2c3715SXin Li VERIFY_IS_EQUAL( b({1,3,5}).SizeAtCompileTime, 3 );
339*bf2c3715SXin Li #endif
340*bf2c3715SXin Li
341*bf2c3715SXin Li #endif
342*bf2c3715SXin Li
343*bf2c3715SXin Li // check mat(i,j) with weird types for i and j
344*bf2c3715SXin Li {
345*bf2c3715SXin Li VERIFY_IS_APPROX( A(B.RowsAtCompileTime-1, 1), A(3,1) );
346*bf2c3715SXin Li VERIFY_IS_APPROX( A(B.RowsAtCompileTime, 1), A(4,1) );
347*bf2c3715SXin Li VERIFY_IS_APPROX( A(B.RowsAtCompileTime-1, B.ColsAtCompileTime-1), A(3,3) );
348*bf2c3715SXin Li VERIFY_IS_APPROX( A(B.RowsAtCompileTime, B.ColsAtCompileTime), A(4,4) );
349*bf2c3715SXin Li const Index I_ = 3, J_ = 4;
350*bf2c3715SXin Li VERIFY_IS_APPROX( A(I_,J_), A(3,4) );
351*bf2c3715SXin Li }
352*bf2c3715SXin Li
353*bf2c3715SXin Li // check extended block API
354*bf2c3715SXin Li {
355*bf2c3715SXin Li VERIFY( is_same_eq( A.block<3,4>(1,1), A.block(1,1,fix<3>,fix<4>)) );
356*bf2c3715SXin Li VERIFY( is_same_eq( A.block<3,4>(1,1,3,4), A.block(1,1,fix<3>(),fix<4>(4))) );
357*bf2c3715SXin Li VERIFY( is_same_eq( A.block<3,Dynamic>(1,1,3,4), A.block(1,1,fix<3>,4)) );
358*bf2c3715SXin Li VERIFY( is_same_eq( A.block<Dynamic,4>(1,1,3,4), A.block(1,1,fix<Dynamic>(3),fix<4>)) );
359*bf2c3715SXin Li VERIFY( is_same_eq( A.block(1,1,3,4), A.block(1,1,fix<Dynamic>(3),fix<Dynamic>(4))) );
360*bf2c3715SXin Li
361*bf2c3715SXin Li VERIFY( is_same_eq( A.topLeftCorner<3,4>(), A.topLeftCorner(fix<3>,fix<4>)) );
362*bf2c3715SXin Li VERIFY( is_same_eq( A.bottomLeftCorner<3,4>(), A.bottomLeftCorner(fix<3>,fix<4>)) );
363*bf2c3715SXin Li VERIFY( is_same_eq( A.bottomRightCorner<3,4>(), A.bottomRightCorner(fix<3>,fix<4>)) );
364*bf2c3715SXin Li VERIFY( is_same_eq( A.topRightCorner<3,4>(), A.topRightCorner(fix<3>,fix<4>)) );
365*bf2c3715SXin Li
366*bf2c3715SXin Li VERIFY( is_same_eq( A.leftCols<3>(), A.leftCols(fix<3>)) );
367*bf2c3715SXin Li VERIFY( is_same_eq( A.rightCols<3>(), A.rightCols(fix<3>)) );
368*bf2c3715SXin Li VERIFY( is_same_eq( A.middleCols<3>(1), A.middleCols(1,fix<3>)) );
369*bf2c3715SXin Li
370*bf2c3715SXin Li VERIFY( is_same_eq( A.topRows<3>(), A.topRows(fix<3>)) );
371*bf2c3715SXin Li VERIFY( is_same_eq( A.bottomRows<3>(), A.bottomRows(fix<3>)) );
372*bf2c3715SXin Li VERIFY( is_same_eq( A.middleRows<3>(1), A.middleRows(1,fix<3>)) );
373*bf2c3715SXin Li
374*bf2c3715SXin Li VERIFY( is_same_eq( a.segment<3>(1), a.segment(1,fix<3>)) );
375*bf2c3715SXin Li VERIFY( is_same_eq( a.head<3>(), a.head(fix<3>)) );
376*bf2c3715SXin Li VERIFY( is_same_eq( a.tail<3>(), a.tail(fix<3>)) );
377*bf2c3715SXin Li
378*bf2c3715SXin Li const ArrayXXi& cA(A);
379*bf2c3715SXin Li VERIFY( is_same_eq( cA.block<Dynamic,4>(1,1,3,4), cA.block(1,1,fix<Dynamic>(3),fix<4>)) );
380*bf2c3715SXin Li
381*bf2c3715SXin Li VERIFY( is_same_eq( cA.topLeftCorner<3,4>(), cA.topLeftCorner(fix<3>,fix<4>)) );
382*bf2c3715SXin Li VERIFY( is_same_eq( cA.bottomLeftCorner<3,4>(), cA.bottomLeftCorner(fix<3>,fix<4>)) );
383*bf2c3715SXin Li VERIFY( is_same_eq( cA.bottomRightCorner<3,4>(), cA.bottomRightCorner(fix<3>,fix<4>)) );
384*bf2c3715SXin Li VERIFY( is_same_eq( cA.topRightCorner<3,4>(), cA.topRightCorner(fix<3>,fix<4>)) );
385*bf2c3715SXin Li
386*bf2c3715SXin Li VERIFY( is_same_eq( cA.leftCols<3>(), cA.leftCols(fix<3>)) );
387*bf2c3715SXin Li VERIFY( is_same_eq( cA.rightCols<3>(), cA.rightCols(fix<3>)) );
388*bf2c3715SXin Li VERIFY( is_same_eq( cA.middleCols<3>(1), cA.middleCols(1,fix<3>)) );
389*bf2c3715SXin Li
390*bf2c3715SXin Li VERIFY( is_same_eq( cA.topRows<3>(), cA.topRows(fix<3>)) );
391*bf2c3715SXin Li VERIFY( is_same_eq( cA.bottomRows<3>(), cA.bottomRows(fix<3>)) );
392*bf2c3715SXin Li VERIFY( is_same_eq( cA.middleRows<3>(1), cA.middleRows(1,fix<3>)) );
393*bf2c3715SXin Li }
394*bf2c3715SXin Li
395*bf2c3715SXin Li // Check compilation of enums as index type:
396*bf2c3715SXin Li a(XX) = 1;
397*bf2c3715SXin Li A(XX,YY) = 1;
398*bf2c3715SXin Li // Anonymous enums only work with C++11
399*bf2c3715SXin Li #if EIGEN_HAS_CXX11
400*bf2c3715SXin Li enum { X=0, Y=1 };
401*bf2c3715SXin Li a(X) = 1;
402*bf2c3715SXin Li A(X,Y) = 1;
403*bf2c3715SXin Li A(XX,Y) = 1;
404*bf2c3715SXin Li A(X,YY) = 1;
405*bf2c3715SXin Li #endif
406*bf2c3715SXin Li
407*bf2c3715SXin Li // Check compilation of varying integer types as index types:
408*bf2c3715SXin Li Index i = n/2;
409*bf2c3715SXin Li short i_short(i);
410*bf2c3715SXin Li std::size_t i_sizet(i);
411*bf2c3715SXin Li VERIFY_IS_EQUAL( a(i), a.coeff(i_short) );
412*bf2c3715SXin Li VERIFY_IS_EQUAL( a(i), a.coeff(i_sizet) );
413*bf2c3715SXin Li
414*bf2c3715SXin Li VERIFY_IS_EQUAL( A(i,i), A.coeff(i_short, i_short) );
415*bf2c3715SXin Li VERIFY_IS_EQUAL( A(i,i), A.coeff(i_short, i) );
416*bf2c3715SXin Li VERIFY_IS_EQUAL( A(i,i), A.coeff(i, i_short) );
417*bf2c3715SXin Li VERIFY_IS_EQUAL( A(i,i), A.coeff(i, i_sizet) );
418*bf2c3715SXin Li VERIFY_IS_EQUAL( A(i,i), A.coeff(i_sizet, i) );
419*bf2c3715SXin Li VERIFY_IS_EQUAL( A(i,i), A.coeff(i_sizet, i_short) );
420*bf2c3715SXin Li VERIFY_IS_EQUAL( A(i,i), A.coeff(5, i_sizet) );
421*bf2c3715SXin Li
422*bf2c3715SXin Li // Regression test for Max{Rows,Cols}AtCompileTime
423*bf2c3715SXin Li {
424*bf2c3715SXin Li Matrix3i A3 = Matrix3i::Random();
425*bf2c3715SXin Li ArrayXi ind(5); ind << 1,1,1,1,1;
426*bf2c3715SXin Li VERIFY_IS_EQUAL( A3(ind,ind).eval(), MatrixXi::Constant(5,5,A3(1,1)) );
427*bf2c3715SXin Li }
428*bf2c3715SXin Li
429*bf2c3715SXin Li // Regression for bug 1736
430*bf2c3715SXin Li {
431*bf2c3715SXin Li VERIFY_IS_APPROX(A(all, eii).col(0).eval(), A.col(eii(0)));
432*bf2c3715SXin Li A(all, eii).col(0) = A.col(eii(0));
433*bf2c3715SXin Li }
434*bf2c3715SXin Li
435*bf2c3715SXin Li // bug 1815: IndexedView should allow linear access
436*bf2c3715SXin Li {
437*bf2c3715SXin Li VERIFY( MATCH( b(eii)(0), "3" ) );
438*bf2c3715SXin Li VERIFY( MATCH( a(eii)(0), "3" ) );
439*bf2c3715SXin Li VERIFY( MATCH( A(1,eii)(0), "103"));
440*bf2c3715SXin Li VERIFY( MATCH( A(eii,1)(0), "301"));
441*bf2c3715SXin Li VERIFY( MATCH( A(1,all)(1), "101"));
442*bf2c3715SXin Li VERIFY( MATCH( A(all,1)(1), "101"));
443*bf2c3715SXin Li }
444*bf2c3715SXin Li
445*bf2c3715SXin Li #if EIGEN_HAS_CXX11
446*bf2c3715SXin Li //Bug IndexView with a single static row should be RowMajor:
447*bf2c3715SXin Li {
448*bf2c3715SXin Li // A(1, seq(0,2,1)).cwiseAbs().colwise().replicate(2).eval();
449*bf2c3715SXin Li STATIC_CHECK(( (internal::evaluator<decltype( A(1,seq(0,2,1)) )>::Flags & RowMajorBit) == RowMajorBit ));
450*bf2c3715SXin Li }
451*bf2c3715SXin Li #endif
452*bf2c3715SXin Li
453*bf2c3715SXin Li }
454*bf2c3715SXin Li
EIGEN_DECLARE_TEST(indexed_view)455*bf2c3715SXin Li EIGEN_DECLARE_TEST(indexed_view)
456*bf2c3715SXin Li {
457*bf2c3715SXin Li // for(int i = 0; i < g_repeat; i++) {
458*bf2c3715SXin Li CALL_SUBTEST_1( check_indexed_view() );
459*bf2c3715SXin Li CALL_SUBTEST_2( check_indexed_view() );
460*bf2c3715SXin Li CALL_SUBTEST_3( check_indexed_view() );
461*bf2c3715SXin Li // }
462*bf2c3715SXin Li
463*bf2c3715SXin Li // static checks of some internals:
464*bf2c3715SXin Li STATIC_CHECK(( internal::is_valid_index_type<int>::value ));
465*bf2c3715SXin Li STATIC_CHECK(( internal::is_valid_index_type<unsigned int>::value ));
466*bf2c3715SXin Li STATIC_CHECK(( internal::is_valid_index_type<short>::value ));
467*bf2c3715SXin Li STATIC_CHECK(( internal::is_valid_index_type<std::ptrdiff_t>::value ));
468*bf2c3715SXin Li STATIC_CHECK(( internal::is_valid_index_type<std::size_t>::value ));
469*bf2c3715SXin Li STATIC_CHECK(( !internal::valid_indexed_view_overload<int,int>::value ));
470*bf2c3715SXin Li STATIC_CHECK(( !internal::valid_indexed_view_overload<int,std::ptrdiff_t>::value ));
471*bf2c3715SXin Li STATIC_CHECK(( !internal::valid_indexed_view_overload<std::ptrdiff_t,int>::value ));
472*bf2c3715SXin Li STATIC_CHECK(( !internal::valid_indexed_view_overload<std::size_t,int>::value ));
473*bf2c3715SXin Li }
474