xref: /aosp_15_r20/external/eigen/test/product_small.cpp (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
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) 2006-2008 Benoit Jacob <[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 #define EIGEN_NO_STATIC_ASSERT
11*bf2c3715SXin Li #include "product.h"
12*bf2c3715SXin Li #include <Eigen/LU>
13*bf2c3715SXin Li 
14*bf2c3715SXin Li // regression test for bug 447
15*bf2c3715SXin Li template<int>
product1x1()16*bf2c3715SXin Li void product1x1()
17*bf2c3715SXin Li {
18*bf2c3715SXin Li   Matrix<float,1,3> matAstatic;
19*bf2c3715SXin Li   Matrix<float,3,1> matBstatic;
20*bf2c3715SXin Li   matAstatic.setRandom();
21*bf2c3715SXin Li   matBstatic.setRandom();
22*bf2c3715SXin Li   VERIFY_IS_APPROX( (matAstatic * matBstatic).coeff(0,0),
23*bf2c3715SXin Li                     matAstatic.cwiseProduct(matBstatic.transpose()).sum() );
24*bf2c3715SXin Li 
25*bf2c3715SXin Li   MatrixXf matAdynamic(1,3);
26*bf2c3715SXin Li   MatrixXf matBdynamic(3,1);
27*bf2c3715SXin Li   matAdynamic.setRandom();
28*bf2c3715SXin Li   matBdynamic.setRandom();
29*bf2c3715SXin Li   VERIFY_IS_APPROX( (matAdynamic * matBdynamic).coeff(0,0),
30*bf2c3715SXin Li                     matAdynamic.cwiseProduct(matBdynamic.transpose()).sum() );
31*bf2c3715SXin Li }
32*bf2c3715SXin Li 
33*bf2c3715SXin Li template<typename TC, typename TA, typename TB>
ref_prod(TC & C,const TA & A,const TB & B)34*bf2c3715SXin Li const TC& ref_prod(TC &C, const TA &A, const TB &B)
35*bf2c3715SXin Li {
36*bf2c3715SXin Li   for(Index i=0;i<C.rows();++i)
37*bf2c3715SXin Li     for(Index j=0;j<C.cols();++j)
38*bf2c3715SXin Li       for(Index k=0;k<A.cols();++k)
39*bf2c3715SXin Li         C.coeffRef(i,j) += A.coeff(i,k) * B.coeff(k,j);
40*bf2c3715SXin Li   return C;
41*bf2c3715SXin Li }
42*bf2c3715SXin Li 
43*bf2c3715SXin Li template<typename T, int Rows, int Cols, int Depth, int OC, int OA, int OB>
44*bf2c3715SXin Li typename internal::enable_if<! ( (Rows ==1&&Depth!=1&&OA==ColMajor)
45*bf2c3715SXin Li                               || (Depth==1&&Rows !=1&&OA==RowMajor)
46*bf2c3715SXin Li                               || (Cols ==1&&Depth!=1&&OB==RowMajor)
47*bf2c3715SXin Li                               || (Depth==1&&Cols !=1&&OB==ColMajor)
48*bf2c3715SXin Li                               || (Rows ==1&&Cols !=1&&OC==ColMajor)
49*bf2c3715SXin Li                               || (Cols ==1&&Rows !=1&&OC==RowMajor)),void>::type
test_lazy_single(int rows,int cols,int depth)50*bf2c3715SXin Li test_lazy_single(int rows, int cols, int depth)
51*bf2c3715SXin Li {
52*bf2c3715SXin Li   Matrix<T,Rows,Depth,OA> A(rows,depth); A.setRandom();
53*bf2c3715SXin Li   Matrix<T,Depth,Cols,OB> B(depth,cols); B.setRandom();
54*bf2c3715SXin Li   Matrix<T,Rows,Cols,OC>  C(rows,cols);  C.setRandom();
55*bf2c3715SXin Li   Matrix<T,Rows,Cols,OC>  D(C);
56*bf2c3715SXin Li   VERIFY_IS_APPROX(C+=A.lazyProduct(B), ref_prod(D,A,B));
57*bf2c3715SXin Li }
58*bf2c3715SXin Li 
test_dynamic_bool()59*bf2c3715SXin Li void test_dynamic_bool()
60*bf2c3715SXin Li {
61*bf2c3715SXin Li   int rows = internal::random<int>(1,64);
62*bf2c3715SXin Li   int cols = internal::random<int>(1,64);
63*bf2c3715SXin Li   int depth = internal::random<int>(1,65);
64*bf2c3715SXin Li 
65*bf2c3715SXin Li   typedef Matrix<bool,Dynamic,Dynamic> MatrixX;
66*bf2c3715SXin Li   MatrixX A(rows,depth); A.setRandom();
67*bf2c3715SXin Li   MatrixX B(depth,cols); B.setRandom();
68*bf2c3715SXin Li   MatrixX C(rows,cols);  C.setRandom();
69*bf2c3715SXin Li   MatrixX D(C);
70*bf2c3715SXin Li   for(Index i=0;i<C.rows();++i)
71*bf2c3715SXin Li     for(Index j=0;j<C.cols();++j)
72*bf2c3715SXin Li       for(Index k=0;k<A.cols();++k)
73*bf2c3715SXin Li        D.coeffRef(i,j) |= A.coeff(i,k) & B.coeff(k,j);
74*bf2c3715SXin Li   C += A * B;
75*bf2c3715SXin Li   VERIFY_IS_EQUAL(C, D);
76*bf2c3715SXin Li 
77*bf2c3715SXin Li   MatrixX E = B.transpose();
78*bf2c3715SXin Li   for(Index i=0;i<B.rows();++i)
79*bf2c3715SXin Li     for(Index j=0;j<B.cols();++j)
80*bf2c3715SXin Li       VERIFY_IS_EQUAL(B(i,j), E(j,i));
81*bf2c3715SXin Li }
82*bf2c3715SXin Li 
83*bf2c3715SXin Li template<typename T, int Rows, int Cols, int Depth, int OC, int OA, int OB>
84*bf2c3715SXin Li typename internal::enable_if<  ( (Rows ==1&&Depth!=1&&OA==ColMajor)
85*bf2c3715SXin Li                               || (Depth==1&&Rows !=1&&OA==RowMajor)
86*bf2c3715SXin Li                               || (Cols ==1&&Depth!=1&&OB==RowMajor)
87*bf2c3715SXin Li                               || (Depth==1&&Cols !=1&&OB==ColMajor)
88*bf2c3715SXin Li                               || (Rows ==1&&Cols !=1&&OC==ColMajor)
89*bf2c3715SXin Li                               || (Cols ==1&&Rows !=1&&OC==RowMajor)),void>::type
test_lazy_single(int,int,int)90*bf2c3715SXin Li test_lazy_single(int, int, int)
91*bf2c3715SXin Li {
92*bf2c3715SXin Li }
93*bf2c3715SXin Li 
94*bf2c3715SXin Li template<typename T, int Rows, int Cols, int Depth>
test_lazy_all_layout(int rows=Rows,int cols=Cols,int depth=Depth)95*bf2c3715SXin Li void test_lazy_all_layout(int rows=Rows, int cols=Cols, int depth=Depth)
96*bf2c3715SXin Li {
97*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_single<T,Rows,Cols,Depth,ColMajor,ColMajor,ColMajor>(rows,cols,depth) ));
98*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_single<T,Rows,Cols,Depth,RowMajor,ColMajor,ColMajor>(rows,cols,depth) ));
99*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_single<T,Rows,Cols,Depth,ColMajor,RowMajor,ColMajor>(rows,cols,depth) ));
100*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_single<T,Rows,Cols,Depth,RowMajor,RowMajor,ColMajor>(rows,cols,depth) ));
101*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_single<T,Rows,Cols,Depth,ColMajor,ColMajor,RowMajor>(rows,cols,depth) ));
102*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_single<T,Rows,Cols,Depth,RowMajor,ColMajor,RowMajor>(rows,cols,depth) ));
103*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_single<T,Rows,Cols,Depth,ColMajor,RowMajor,RowMajor>(rows,cols,depth) ));
104*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_single<T,Rows,Cols,Depth,RowMajor,RowMajor,RowMajor>(rows,cols,depth) ));
105*bf2c3715SXin Li }
106*bf2c3715SXin Li 
107*bf2c3715SXin Li template<typename T>
test_lazy_l1()108*bf2c3715SXin Li void test_lazy_l1()
109*bf2c3715SXin Li {
110*bf2c3715SXin Li   int rows = internal::random<int>(1,12);
111*bf2c3715SXin Li   int cols = internal::random<int>(1,12);
112*bf2c3715SXin Li   int depth = internal::random<int>(1,12);
113*bf2c3715SXin Li 
114*bf2c3715SXin Li   // Inner
115*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,1,1>() ));
116*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,1,2>() ));
117*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,1,3>() ));
118*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,1,8>() ));
119*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,1,9>() ));
120*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,1,-1>(1,1,depth) ));
121*bf2c3715SXin Li 
122*bf2c3715SXin Li   // Outer
123*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,2,1,1>() ));
124*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,2,1>() ));
125*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,2,2,1>() ));
126*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,3,3,1>() ));
127*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,4,1>() ));
128*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,8,1>() ));
129*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,-1,1>(4,cols) ));
130*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,7,-1,1>(7,cols) ));
131*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,-1,8,1>(rows) ));
132*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,-1,3,1>(rows) ));
133*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,-1,-1,1>(rows,cols) ));
134*bf2c3715SXin Li }
135*bf2c3715SXin Li 
136*bf2c3715SXin Li template<typename T>
test_lazy_l2()137*bf2c3715SXin Li void test_lazy_l2()
138*bf2c3715SXin Li {
139*bf2c3715SXin Li   int rows = internal::random<int>(1,12);
140*bf2c3715SXin Li   int cols = internal::random<int>(1,12);
141*bf2c3715SXin Li   int depth = internal::random<int>(1,12);
142*bf2c3715SXin Li 
143*bf2c3715SXin Li   // mat-vec
144*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,2,1,2>() ));
145*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,2,1,4>() ));
146*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,1,2>() ));
147*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,1,4>() ));
148*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,5,1,4>() ));
149*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,1,5>() ));
150*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,1,6>() ));
151*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,6,1,4>() ));
152*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,8,1,8>() ));
153*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,-1,1,4>(rows) ));
154*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,1,-1>(4,1,depth) ));
155*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,-1,1,-1>(rows,1,depth) ));
156*bf2c3715SXin Li 
157*bf2c3715SXin Li   // vec-mat
158*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,2,2>() ));
159*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,2,4>() ));
160*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,4,2>() ));
161*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,4,4>() ));
162*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,5,4>() ));
163*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,4,5>() ));
164*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,4,6>() ));
165*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,6,4>() ));
166*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,8,8>() ));
167*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,-1, 4>(1,cols) ));
168*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1, 4,-1>(1,4,depth) ));
169*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,1,-1,-1>(1,cols,depth) ));
170*bf2c3715SXin Li }
171*bf2c3715SXin Li 
172*bf2c3715SXin Li template<typename T>
test_lazy_l3()173*bf2c3715SXin Li void test_lazy_l3()
174*bf2c3715SXin Li {
175*bf2c3715SXin Li   int rows = internal::random<int>(1,12);
176*bf2c3715SXin Li   int cols = internal::random<int>(1,12);
177*bf2c3715SXin Li   int depth = internal::random<int>(1,12);
178*bf2c3715SXin Li   // mat-mat
179*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,2,4,2>() ));
180*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,2,6,4>() ));
181*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,3,2>() ));
182*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,8,4>() ));
183*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,5,6,4>() ));
184*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,2,5>() ));
185*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,7,6>() ));
186*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,6,8,4>() ));
187*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,8,3,8>() ));
188*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,-1,6,4>(rows) ));
189*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,3,-1>(4,3,depth) ));
190*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,-1,6,-1>(rows,6,depth) ));
191*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,8,2,2>() ));
192*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,5,2,4>() ));
193*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,4,2>() ));
194*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,8,4,4>() ));
195*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,6,5,4>() ));
196*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,4,5>() ));
197*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,3,4,6>() ));
198*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,2,6,4>() ));
199*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,7,8,8>() ));
200*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,8,-1, 4>(8,cols) ));
201*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,3, 4,-1>(3,4,depth) ));
202*bf2c3715SXin Li   CALL_SUBTEST(( test_lazy_all_layout<T,4,-1,-1>(4,cols,depth) ));
203*bf2c3715SXin Li }
204*bf2c3715SXin Li 
205*bf2c3715SXin Li template<typename T,int N,int M,int K>
test_linear_but_not_vectorizable()206*bf2c3715SXin Li void test_linear_but_not_vectorizable()
207*bf2c3715SXin Li {
208*bf2c3715SXin Li   // Check tricky cases for which the result of the product is a vector and thus must exhibit the LinearBit flag,
209*bf2c3715SXin Li   // but is not vectorizable along the linear dimension.
210*bf2c3715SXin Li   Index n = N==Dynamic ? internal::random<Index>(1,32) : N;
211*bf2c3715SXin Li   Index m = M==Dynamic ? internal::random<Index>(1,32) : M;
212*bf2c3715SXin Li   Index k = K==Dynamic ? internal::random<Index>(1,32) : K;
213*bf2c3715SXin Li 
214*bf2c3715SXin Li   {
215*bf2c3715SXin Li     Matrix<T,N,M+1> A; A.setRandom(n,m+1);
216*bf2c3715SXin Li     Matrix<T,M*2,K> B; B.setRandom(m*2,k);
217*bf2c3715SXin Li     Matrix<T,1,K> C;
218*bf2c3715SXin Li     Matrix<T,1,K> R;
219*bf2c3715SXin Li 
220*bf2c3715SXin Li     C.noalias() = A.template topLeftCorner<1,M>() * (B.template topRows<M>()+B.template bottomRows<M>());
221*bf2c3715SXin Li     R.noalias() = A.template topLeftCorner<1,M>() * (B.template topRows<M>()+B.template bottomRows<M>()).eval();
222*bf2c3715SXin Li     VERIFY_IS_APPROX(C,R);
223*bf2c3715SXin Li   }
224*bf2c3715SXin Li 
225*bf2c3715SXin Li   {
226*bf2c3715SXin Li     Matrix<T,M+1,N,RowMajor> A; A.setRandom(m+1,n);
227*bf2c3715SXin Li     Matrix<T,K,M*2,RowMajor> B; B.setRandom(k,m*2);
228*bf2c3715SXin Li     Matrix<T,K,1> C;
229*bf2c3715SXin Li     Matrix<T,K,1> R;
230*bf2c3715SXin Li 
231*bf2c3715SXin Li     C.noalias() = (B.template leftCols<M>()+B.template rightCols<M>())        * A.template topLeftCorner<M,1>();
232*bf2c3715SXin Li     R.noalias() = (B.template leftCols<M>()+B.template rightCols<M>()).eval() * A.template topLeftCorner<M,1>();
233*bf2c3715SXin Li     VERIFY_IS_APPROX(C,R);
234*bf2c3715SXin Li   }
235*bf2c3715SXin Li }
236*bf2c3715SXin Li 
237*bf2c3715SXin Li template<int Rows>
bug_1311()238*bf2c3715SXin Li void bug_1311()
239*bf2c3715SXin Li {
240*bf2c3715SXin Li   Matrix< double, Rows, 2 > A;  A.setRandom();
241*bf2c3715SXin Li   Vector2d b = Vector2d::Random() ;
242*bf2c3715SXin Li   Matrix<double,Rows,1> res;
243*bf2c3715SXin Li   res.noalias() = 1. * (A * b);
244*bf2c3715SXin Li   VERIFY_IS_APPROX(res, A*b);
245*bf2c3715SXin Li   res.noalias() = 1.*A * b;
246*bf2c3715SXin Li   VERIFY_IS_APPROX(res, A*b);
247*bf2c3715SXin Li   res.noalias() = (1.*A).lazyProduct(b);
248*bf2c3715SXin Li   VERIFY_IS_APPROX(res, A*b);
249*bf2c3715SXin Li   res.noalias() = (1.*A).lazyProduct(1.*b);
250*bf2c3715SXin Li   VERIFY_IS_APPROX(res, A*b);
251*bf2c3715SXin Li   res.noalias() = (A).lazyProduct(1.*b);
252*bf2c3715SXin Li   VERIFY_IS_APPROX(res, A*b);
253*bf2c3715SXin Li }
254*bf2c3715SXin Li 
255*bf2c3715SXin Li template<int>
product_small_regressions()256*bf2c3715SXin Li void product_small_regressions()
257*bf2c3715SXin Li {
258*bf2c3715SXin Li   {
259*bf2c3715SXin Li     // test compilation of (outer_product) * vector
260*bf2c3715SXin Li     Vector3f v = Vector3f::Random();
261*bf2c3715SXin Li     VERIFY_IS_APPROX( (v * v.transpose()) * v, (v * v.transpose()).eval() * v);
262*bf2c3715SXin Li   }
263*bf2c3715SXin Li 
264*bf2c3715SXin Li   {
265*bf2c3715SXin Li     // regression test for pull-request #93
266*bf2c3715SXin Li     Eigen::Matrix<double, 1, 1> A;  A.setRandom();
267*bf2c3715SXin Li     Eigen::Matrix<double, 18, 1> B; B.setRandom();
268*bf2c3715SXin Li     Eigen::Matrix<double, 1, 18> C; C.setRandom();
269*bf2c3715SXin Li     VERIFY_IS_APPROX(B * A.inverse(), B * A.inverse()[0]);
270*bf2c3715SXin Li     VERIFY_IS_APPROX(A.inverse() * C, A.inverse()[0] * C);
271*bf2c3715SXin Li   }
272*bf2c3715SXin Li 
273*bf2c3715SXin Li   {
274*bf2c3715SXin Li     Eigen::Matrix<double, 10, 10> A, B, C;
275*bf2c3715SXin Li     A.setRandom();
276*bf2c3715SXin Li     C = A;
277*bf2c3715SXin Li     for(int k=0; k<79; ++k)
278*bf2c3715SXin Li       C = C * A;
279*bf2c3715SXin Li     B.noalias() = (((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A)) * ((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A)))
280*bf2c3715SXin Li                 * (((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A)) * ((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A)));
281*bf2c3715SXin Li     VERIFY_IS_APPROX(B,C);
282*bf2c3715SXin Li   }
283*bf2c3715SXin Li }
284*bf2c3715SXin Li 
EIGEN_DECLARE_TEST(product_small)285*bf2c3715SXin Li EIGEN_DECLARE_TEST(product_small)
286*bf2c3715SXin Li {
287*bf2c3715SXin Li   for(int i = 0; i < g_repeat; i++) {
288*bf2c3715SXin Li     CALL_SUBTEST_1( product(Matrix<float, 3, 2>()) );
289*bf2c3715SXin Li     CALL_SUBTEST_2( product(Matrix<int, 3, 17>()) );
290*bf2c3715SXin Li     CALL_SUBTEST_8( product(Matrix<double, 3, 17>()) );
291*bf2c3715SXin Li     CALL_SUBTEST_3( product(Matrix3d()) );
292*bf2c3715SXin Li     CALL_SUBTEST_4( product(Matrix4d()) );
293*bf2c3715SXin Li     CALL_SUBTEST_5( product(Matrix4f()) );
294*bf2c3715SXin Li     CALL_SUBTEST_6( product1x1<0>() );
295*bf2c3715SXin Li 
296*bf2c3715SXin Li     CALL_SUBTEST_11( test_lazy_l1<float>() );
297*bf2c3715SXin Li     CALL_SUBTEST_12( test_lazy_l2<float>() );
298*bf2c3715SXin Li     CALL_SUBTEST_13( test_lazy_l3<float>() );
299*bf2c3715SXin Li 
300*bf2c3715SXin Li     CALL_SUBTEST_21( test_lazy_l1<double>() );
301*bf2c3715SXin Li     CALL_SUBTEST_22( test_lazy_l2<double>() );
302*bf2c3715SXin Li     CALL_SUBTEST_23( test_lazy_l3<double>() );
303*bf2c3715SXin Li 
304*bf2c3715SXin Li     CALL_SUBTEST_31( test_lazy_l1<std::complex<float> >() );
305*bf2c3715SXin Li     CALL_SUBTEST_32( test_lazy_l2<std::complex<float> >() );
306*bf2c3715SXin Li     CALL_SUBTEST_33( test_lazy_l3<std::complex<float> >() );
307*bf2c3715SXin Li 
308*bf2c3715SXin Li     CALL_SUBTEST_41( test_lazy_l1<std::complex<double> >() );
309*bf2c3715SXin Li     CALL_SUBTEST_42( test_lazy_l2<std::complex<double> >() );
310*bf2c3715SXin Li     CALL_SUBTEST_43( test_lazy_l3<std::complex<double> >() );
311*bf2c3715SXin Li 
312*bf2c3715SXin Li     CALL_SUBTEST_7(( test_linear_but_not_vectorizable<float,2,1,Dynamic>() ));
313*bf2c3715SXin Li     CALL_SUBTEST_7(( test_linear_but_not_vectorizable<float,3,1,Dynamic>() ));
314*bf2c3715SXin Li     CALL_SUBTEST_7(( test_linear_but_not_vectorizable<float,2,1,16>() ));
315*bf2c3715SXin Li 
316*bf2c3715SXin Li     CALL_SUBTEST_6( bug_1311<3>() );
317*bf2c3715SXin Li     CALL_SUBTEST_6( bug_1311<5>() );
318*bf2c3715SXin Li 
319*bf2c3715SXin Li     CALL_SUBTEST_9( test_dynamic_bool() );
320*bf2c3715SXin Li   }
321*bf2c3715SXin Li 
322*bf2c3715SXin Li   CALL_SUBTEST_6( product_small_regressions<0>() );
323*bf2c3715SXin Li }
324