| 36 | VERIFY( g_called && #XPR" not properly optimized"); |
| 37 | |
| 38 | template<int SizeAtCompileType> void mixingtypes(int size = SizeAtCompileType) |
| 39 | { |
| 40 | typedef std::complex<float> CF; |
| 41 | typedef std::complex<double> CD; |
| 42 | typedef Matrix<float, SizeAtCompileType, SizeAtCompileType> Mat_f; |
| 43 | typedef Matrix<double, SizeAtCompileType, SizeAtCompileType> Mat_d; |
| 44 | typedef Matrix<std::complex<float>, SizeAtCompileType, SizeAtCompileType> Mat_cf; |
| 45 | typedef Matrix<std::complex<double>, SizeAtCompileType, SizeAtCompileType> Mat_cd; |
| 46 | typedef Matrix<float, SizeAtCompileType, 1> Vec_f; |
| 47 | typedef Matrix<double, SizeAtCompileType, 1> Vec_d; |
| 48 | typedef Matrix<std::complex<float>, SizeAtCompileType, 1> Vec_cf; |
| 49 | typedef Matrix<std::complex<double>, SizeAtCompileType, 1> Vec_cd; |
| 50 | |
| 51 | Mat_f mf = Mat_f::Random(size,size); |
| 52 | Mat_d md = mf.template cast<double>(); |
| 53 | //Mat_d rd = md; |
| 54 | Mat_cf mcf = Mat_cf::Random(size,size); |
| 55 | Mat_cd mcd = mcf.template cast<complex<double> >(); |
| 56 | Mat_cd rcd = mcd; |
| 57 | Vec_f vf = Vec_f::Random(size,1); |
| 58 | Vec_d vd = vf.template cast<double>(); |
| 59 | Vec_cf vcf = Vec_cf::Random(size,1); |
| 60 | Vec_cd vcd = vcf.template cast<complex<double> >(); |
| 61 | float sf = internal::random<float>(); |
| 62 | double sd = internal::random<double>(); |
| 63 | complex<float> scf = internal::random<complex<float> >(); |
| 64 | complex<double> scd = internal::random<complex<double> >(); |
| 65 | |
| 66 | mf+mf; |
| 67 | |
| 68 | float epsf = std::sqrt(std::numeric_limits<float> ::min EIGEN_EMPTY ()); |
| 69 | double epsd = std::sqrt(std::numeric_limits<double>::min EIGEN_EMPTY ()); |
| 70 | |
| 71 | while(std::abs(sf )<epsf) sf = internal::random<float>(); |
| 72 | while(std::abs(sd )<epsd) sf = internal::random<double>(); |
| 73 | while(std::abs(scf)<epsf) scf = internal::random<CF>(); |
| 74 | while(std::abs(scd)<epsd) scd = internal::random<CD>(); |
| 75 | |
| 76 | // VERIFY_RAISES_ASSERT(mf+md); // does not even compile |
| 77 | |
| 78 | #ifdef EIGEN_DONT_VECTORIZE |
| 79 | VERIFY_RAISES_ASSERT(vf=vd); |
| 80 | VERIFY_RAISES_ASSERT(vf+=vd); |
| 81 | #endif |
| 82 | |
| 83 | // check scalar products |
| 84 | VERIFY_MIX_SCALAR(vcf * sf , vcf * complex<float>(sf)); |
| 85 | VERIFY_MIX_SCALAR(sd * vcd , complex<double>(sd) * vcd); |
| 86 | VERIFY_MIX_SCALAR(vf * scf , vf.template cast<complex<float> >() * scf); |
| 87 | VERIFY_MIX_SCALAR(scd * vd , scd * vd.template cast<complex<double> >()); |
| 88 | |
| 89 | VERIFY_MIX_SCALAR(vcf * 2 , vcf * complex<float>(2)); |
| 90 | VERIFY_MIX_SCALAR(vcf * 2.1 , vcf * complex<float>(2.1)); |
| 91 | VERIFY_MIX_SCALAR(2 * vcf, vcf * complex<float>(2)); |
| 92 | VERIFY_MIX_SCALAR(2.1 * vcf , vcf * complex<float>(2.1)); |
| 93 | |
| 94 | // check scalar quotients |
| 95 | VERIFY_MIX_SCALAR(vcf / sf , vcf / complex<float>(sf)); |