mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-29 00:02:40 +08:00
Fix regression: .conjugate() was popped out but not re-introduced.
This commit is contained in:
parent
c69d0d08d0
commit
31b6e080a9
@ -430,28 +430,30 @@ struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,CoeffBasedProductMode>
|
|||||||
void eval_dynamic(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Func &func)
|
void eval_dynamic(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Func &func)
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
HasScalarFactor = blas_traits<Lhs>::HasScalarFactor || blas_traits<Rhs>::HasScalarFactor
|
HasScalarFactor = blas_traits<Lhs>::HasScalarFactor || blas_traits<Rhs>::HasScalarFactor,
|
||||||
|
ConjLhs = blas_traits<Lhs>::NeedToConjugate,
|
||||||
|
ConjRhs = blas_traits<Rhs>::NeedToConjugate
|
||||||
};
|
};
|
||||||
// FIXME: in c++11 this should be auto, and extractScalarFactor should also return auto
|
// FIXME: in c++11 this should be auto, and extractScalarFactor should also return auto
|
||||||
// this is important for real*complex_mat
|
// this is important for real*complex_mat
|
||||||
Scalar actualAlpha = blas_traits<Lhs>::extractScalarFactor(lhs)
|
Scalar actualAlpha = blas_traits<Lhs>::extractScalarFactor(lhs)
|
||||||
* blas_traits<Rhs>::extractScalarFactor(rhs);
|
* blas_traits<Rhs>::extractScalarFactor(rhs);
|
||||||
eval_dynamic_impl(dst,
|
eval_dynamic_impl(dst,
|
||||||
blas_traits<Lhs>::extract(lhs),
|
blas_traits<Lhs>::extract(lhs).template conjugateIf<ConjLhs>(),
|
||||||
blas_traits<Rhs>::extract(rhs),
|
blas_traits<Rhs>::extract(rhs).template conjugateIf<ConjRhs>(),
|
||||||
func,
|
func,
|
||||||
actualAlpha,
|
actualAlpha,
|
||||||
typename conditional<HasScalarFactor,true_type,false_type>::type());
|
typename conditional<HasScalarFactor,true_type,false_type>::type());
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
template<typename Dst, typename LhsT, typename RhsT, typename Func, typename Scalar>
|
template<typename Dst, typename LhsT, typename RhsT, typename Func, typename Scalar>
|
||||||
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
void eval_dynamic_impl(Dst& dst, const LhsT& lhs, const RhsT& rhs, const Func &func, const Scalar& /* s == 1 */, false_type)
|
void eval_dynamic_impl(Dst& dst, const LhsT& lhs, const RhsT& rhs, const Func &func, const Scalar& s /* == 1 */, false_type)
|
||||||
{
|
{
|
||||||
|
EIGEN_UNUSED_VARIABLE(s);
|
||||||
|
eigen_internal_assert(s==Scalar(1));
|
||||||
call_restricted_packet_assignment_no_alias(dst, lhs.lazyProduct(rhs), func);
|
call_restricted_packet_assignment_no_alias(dst, lhs.lazyProduct(rhs), func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ void check_scalar_multiple2(Dst &dst, const Lhs& A, const Rhs& B, S2 s2)
|
|||||||
CALL_SUBTEST( check_scalar_multiple3(dst, A, -B) );
|
CALL_SUBTEST( check_scalar_multiple3(dst, A, -B) );
|
||||||
CALL_SUBTEST( check_scalar_multiple3(dst, A, s2*B) );
|
CALL_SUBTEST( check_scalar_multiple3(dst, A, s2*B) );
|
||||||
CALL_SUBTEST( check_scalar_multiple3(dst, A, B*s2) );
|
CALL_SUBTEST( check_scalar_multiple3(dst, A, B*s2) );
|
||||||
|
CALL_SUBTEST( check_scalar_multiple3(dst, A, (B*s2).conjugate()) );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Dst, typename Lhs, typename Rhs, typename S1, typename S2>
|
template<typename Dst, typename Lhs, typename Rhs, typename S1, typename S2>
|
||||||
@ -38,6 +39,7 @@ void check_scalar_multiple1(Dst &dst, const Lhs& A, const Rhs& B, S1 s1, S2 s2)
|
|||||||
CALL_SUBTEST( check_scalar_multiple2(dst, -A, B, s2) );
|
CALL_SUBTEST( check_scalar_multiple2(dst, -A, B, s2) );
|
||||||
CALL_SUBTEST( check_scalar_multiple2(dst, s1*A, B, s2) );
|
CALL_SUBTEST( check_scalar_multiple2(dst, s1*A, B, s2) );
|
||||||
CALL_SUBTEST( check_scalar_multiple2(dst, A*s1, B, s2) );
|
CALL_SUBTEST( check_scalar_multiple2(dst, A*s1, B, s2) );
|
||||||
|
CALL_SUBTEST( check_scalar_multiple2(dst, (A*s1).conjugate(), B, s2) );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatrixType> void product_notemporary(const MatrixType& m)
|
template<typename MatrixType> void product_notemporary(const MatrixType& m)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user