mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 19:59:05 +08:00
Set cost of conjugate to 0 (in practice it boils down to a no-op).
This is also important to make sure that A.conjugate() * B.conjugate() does not evaluate its arguments into temporaries (e.g., if A and B are fixed and small, or * fall back to lazyProduct)
This commit is contained in:
parent
512b74aaa1
commit
c69d0d08d0
@ -117,7 +117,15 @@ template<typename Scalar>
|
|||||||
struct functor_traits<scalar_conjugate_op<Scalar> >
|
struct functor_traits<scalar_conjugate_op<Scalar> >
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0,
|
Cost = 0,
|
||||||
|
// Yes the cost is zero even for complexes because in most cases for which
|
||||||
|
// the cost is used, conjugation turns to be a no-op. Some examples:
|
||||||
|
// cost(a*conj(b)) == cost(a*b)
|
||||||
|
// cost(a+conj(b)) == cost(a+b)
|
||||||
|
// <etc.
|
||||||
|
// If we don't set it to zero, then:
|
||||||
|
// A.conjugate().lazyProduct(B.conjugate())
|
||||||
|
// will bake its operands. We definitely don't want that!
|
||||||
PacketAccess = packet_traits<Scalar>::HasConj
|
PacketAccess = packet_traits<Scalar>::HasConj
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -134,7 +134,9 @@ template<typename MatrixType> void product_notemporary(const MatrixType& m)
|
|||||||
VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template triangularView<UnitUpper>() * m2.block(r0,c0,r1,c1), 1);
|
VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template triangularView<UnitUpper>() * m2.block(r0,c0,r1,c1), 1);
|
||||||
|
|
||||||
// Zero temporaries for lazy products ...
|
// Zero temporaries for lazy products ...
|
||||||
|
m3.setRandom(rows,cols);
|
||||||
VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose().lazyProduct(m3)).diagonal().sum(), 0 );
|
VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose().lazyProduct(m3)).diagonal().sum(), 0 );
|
||||||
|
VERIFY_EVALUATION_COUNT( m3.noalias() = m1.conjugate().lazyProduct(m2.conjugate()), 0);
|
||||||
|
|
||||||
// ... and even no temporary for even deeply (>=2) nested products
|
// ... and even no temporary for even deeply (>=2) nested products
|
||||||
VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose() * m3).diagonal().sum(), 0 );
|
VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose() * m3).diagonal().sum(), 0 );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user