1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. Eigen itself is part of the KDE project.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_NO_STATIC_ASSERT
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_NO_STATIC_ASSERT // turn static asserts into runtime asserts in order to check them
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_DONT_VECTORIZE
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_DONT_VECTORIZE // SSE intrinsics aren't designed to allow mixing types
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h"
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int SizeAtCompileType> void mixingtypes(int size = SizeAtCompileType)
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<float, SizeAtCompileType, SizeAtCompileType> Mat_f;
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<double, SizeAtCompileType, SizeAtCompileType> Mat_d;
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<std::complex<float>, SizeAtCompileType, SizeAtCompileType> Mat_cf;
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<std::complex<double>, SizeAtCompileType, SizeAtCompileType> Mat_cd;
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<float, SizeAtCompileType, 1> Vec_f;
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<double, SizeAtCompileType, 1> Vec_d;
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<std::complex<float>, SizeAtCompileType, 1> Vec_cf;
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<std::complex<double>, SizeAtCompileType, 1> Vec_cd;
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Mat_f mf(size,size);
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Mat_d md(size,size);
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Mat_cf mcf(size,size);
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Mat_cd mcd(size,size);
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Vec_f vf(size,1);
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Vec_d vd(size,1);
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Vec_cf vcf(size,1);
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Vec_cd vcd(size,1);
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mf+mf;
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(mf+md);
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(mf+mcf);
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(vf=vd);
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(vf+=vd);
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(mcd=md);
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mf*mf;
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  md*mcd;
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mcd*md;
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mf*vcf;
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mcf*vf;
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mcf *= mf;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  vcd = md*vcd;
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  vcf = mcf*vf;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if 0
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // these are know generating hard build errors in eigen3
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(mf*md);
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(mcf*mcd);
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(mcf*vcd);
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(vcf = mf*vf);
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  vf.eigen2_dot(vf);
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(vd.eigen2_dot(vf));
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(vcf.eigen2_dot(vf)); // yeah eventually we should allow this but i'm too lazy to make that change now in Dot.h
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // especially as that might be rewritten as cwise product .sum() which would make that automatic.
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_eigen2_mixingtypes()
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // check that our operator new is indeed called:
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(mixingtypes<3>());
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_2(mixingtypes<4>());
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(mixingtypes<Dynamic>(20));
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
78