mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-16 13:45:58 +08:00
fix mixing types in DiagonalProduct
This commit is contained in:
parent
bfa606d16f
commit
f8d3b4c060
@ -36,8 +36,16 @@ struct ei_traits<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >
|
|||||||
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
||||||
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
||||||
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
||||||
Flags = (HereditaryBits & (unsigned int)(MatrixType::Flags))
|
|
||||||
| (PacketAccessBit & (unsigned int)(MatrixType::Flags) & (unsigned int)(DiagonalType::DiagonalVectorType::Flags)),
|
_StorageOrder = MatrixType::Flags & RowMajorBit ? RowMajor : ColMajor,
|
||||||
|
_PacketOnDiag = !((int(_StorageOrder) == RowMajor && int(ProductOrder) == OnTheLeft)
|
||||||
|
||(int(_StorageOrder) == ColMajor && int(ProductOrder) == OnTheRight)),
|
||||||
|
_SameTypes = ei_is_same_type<typename MatrixType::Scalar, typename DiagonalType::Scalar>::ret,
|
||||||
|
// FIXME currently we need same types, but in the future the next rule should be the one
|
||||||
|
//_Vectorizable = bool(int(MatrixType::Flags)&PacketAccessBit) && ((!_PacketOnDiag) || _SameTypes),
|
||||||
|
_Vectorizable = bool(int(MatrixType::Flags)&PacketAccessBit) && _SameTypes,
|
||||||
|
|
||||||
|
Flags = (HereditaryBits & (unsigned int)(MatrixType::Flags)) | (_Vectorizable ? PacketAccessBit : 0),
|
||||||
CoeffReadCost = NumTraits<Scalar>::MulCost + MatrixType::CoeffReadCost + DiagonalType::DiagonalVectorType::CoeffReadCost
|
CoeffReadCost = NumTraits<Scalar>::MulCost + MatrixType::CoeffReadCost + DiagonalType::DiagonalVectorType::CoeffReadCost
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -69,26 +77,34 @@ class DiagonalProduct : ei_no_assignment_operator,
|
|||||||
EIGEN_STRONG_INLINE PacketScalar packet(Index row, Index col) const
|
EIGEN_STRONG_INLINE PacketScalar packet(Index row, Index col) const
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
StorageOrder = Flags & RowMajorBit ? RowMajor : ColMajor,
|
StorageOrder = Flags & RowMajorBit ? RowMajor : ColMajor
|
||||||
InnerSize = (MatrixType::Flags & RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime,
|
|
||||||
DiagonalVectorPacketLoadMode = (LoadMode == Aligned && ((InnerSize%16) == 0)) ? Aligned : Unaligned
|
|
||||||
};
|
};
|
||||||
const Index indexInDiagonalVector = ProductOrder == OnTheLeft ? row : col;
|
const Index indexInDiagonalVector = ProductOrder == OnTheLeft ? row : col;
|
||||||
|
|
||||||
if((int(StorageOrder) == RowMajor && int(ProductOrder) == OnTheLeft)
|
return packet_impl<LoadMode>(row,col,indexInDiagonalVector,typename ei_meta_if<
|
||||||
||(int(StorageOrder) == ColMajor && int(ProductOrder) == OnTheRight))
|
((int(StorageOrder) == RowMajor && int(ProductOrder) == OnTheLeft)
|
||||||
{
|
||(int(StorageOrder) == ColMajor && int(ProductOrder) == OnTheRight)), ei_meta_true, ei_meta_false>::ret());
|
||||||
return ei_pmul(m_matrix.template packet<LoadMode>(row, col),
|
|
||||||
ei_pset1(m_diagonal.diagonal().coeff(indexInDiagonalVector)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return ei_pmul(m_matrix.template packet<LoadMode>(row, col),
|
|
||||||
m_diagonal.diagonal().template packet<DiagonalVectorPacketLoadMode>(indexInDiagonalVector));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
template<int LoadMode>
|
||||||
|
EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index id, ei_meta_true) const
|
||||||
|
{
|
||||||
|
return ei_pmul(m_matrix.template packet<LoadMode>(row, col),
|
||||||
|
ei_pset1(m_diagonal.diagonal().coeff(id)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<int LoadMode>
|
||||||
|
EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index id, ei_meta_false) const
|
||||||
|
{
|
||||||
|
enum {
|
||||||
|
InnerSize = (MatrixType::Flags & RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime,
|
||||||
|
DiagonalVectorPacketLoadMode = (LoadMode == Aligned && ((InnerSize%16) == 0)) ? Aligned : Unaligned
|
||||||
|
};
|
||||||
|
return ei_pmul(m_matrix.template packet<LoadMode>(row, col),
|
||||||
|
m_diagonal.diagonal().template packet<DiagonalVectorPacketLoadMode>(id));
|
||||||
|
}
|
||||||
|
|
||||||
const typename MatrixType::Nested m_matrix;
|
const typename MatrixType::Nested m_matrix;
|
||||||
const typename DiagonalType::Nested m_diagonal;
|
const typename DiagonalType::Nested m_diagonal;
|
||||||
};
|
};
|
||||||
|
@ -292,7 +292,7 @@ template<> EIGEN_STRONG_INLINE std::complex<double> ei_predux_mul<Packet1cd>(con
|
|||||||
template<int Offset>
|
template<int Offset>
|
||||||
struct ei_palign_impl<Offset,Packet1cd>
|
struct ei_palign_impl<Offset,Packet1cd>
|
||||||
{
|
{
|
||||||
EIGEN_STRONG_INLINE static void run(Packet1cd& first, const Packet1cd& second)
|
EIGEN_STRONG_INLINE static void run(Packet1cd& /*first*/, const Packet1cd& /*second*/)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user