10#ifndef EIGEN_BLASUTIL_H
11#define EIGEN_BLASUTIL_H
21template<
typename LhsScalar,
typename RhsScalar,
typename Index,
typename DataMapper,
int mr,
int nr,
bool ConjugateLhs=false,
bool ConjugateRhs=false>
24template<
typename Scalar,
typename Index,
typename DataMapper,
int nr,
int StorageOrder,
bool Conjugate = false,
bool PanelMode=false>
27template<
typename Scalar,
typename Index,
typename DataMapper,
int Pack1,
int Pack2,
int StorageOrder,
bool Conjugate = false,
bool PanelMode = false>
37template<
typename Index,
47 inline T operator()(
const T& x) {
return numext::conj(x); }
49 inline T pconj(
const T& x) {
return internal::pconj(x); }
54 inline const T& operator()(
const T& x) {
return x; }
56 inline const T& pconj(
const T& x) {
return x; }
61 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar pmadd(
const Scalar& x,
const Scalar& y,
const Scalar& c)
const {
return internal::pmadd(x,y,c); }
62 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar pmul(
const Scalar& x,
const Scalar& y)
const {
return internal::pmul(x,y); }
67 typedef std::complex<RealScalar> Scalar;
68 EIGEN_STRONG_INLINE Scalar pmadd(
const Scalar& x,
const Scalar& y,
const Scalar& c)
const
69 {
return c + pmul(x,y); }
71 EIGEN_STRONG_INLINE Scalar pmul(
const Scalar& x,
const Scalar& y)
const
72 {
return Scalar(numext::real(x)*numext::real(y) + numext::imag(x)*numext::imag(y), numext::imag(x)*numext::real(y) - numext::real(x)*numext::imag(y)); }
77 typedef std::complex<RealScalar> Scalar;
78 EIGEN_STRONG_INLINE Scalar pmadd(
const Scalar& x,
const Scalar& y,
const Scalar& c)
const
79 {
return c + pmul(x,y); }
81 EIGEN_STRONG_INLINE Scalar pmul(
const Scalar& x,
const Scalar& y)
const
82 {
return Scalar(numext::real(x)*numext::real(y) + numext::imag(x)*numext::imag(y), numext::real(x)*numext::imag(y) - numext::imag(x)*numext::real(y)); }
87 typedef std::complex<RealScalar> Scalar;
88 EIGEN_STRONG_INLINE Scalar pmadd(
const Scalar& x,
const Scalar& y,
const Scalar& c)
const
89 {
return c + pmul(x,y); }
91 EIGEN_STRONG_INLINE Scalar pmul(
const Scalar& x,
const Scalar& y)
const
92 {
return Scalar(numext::real(x)*numext::real(y) - numext::imag(x)*numext::imag(y), - numext::real(x)*numext::imag(y) - numext::imag(x)*numext::real(y)); }
97 typedef std::complex<RealScalar> Scalar;
98 EIGEN_STRONG_INLINE Scalar pmadd(
const Scalar& x,
const RealScalar& y,
const Scalar& c)
const
99 {
return padd(c, pmul(x,y)); }
100 EIGEN_STRONG_INLINE Scalar pmul(
const Scalar& x,
const RealScalar& y)
const
106 typedef std::complex<RealScalar> Scalar;
107 EIGEN_STRONG_INLINE Scalar pmadd(
const RealScalar& x,
const Scalar& y,
const Scalar& c)
const
108 {
return padd(c, pmul(x,y)); }
109 EIGEN_STRONG_INLINE Scalar pmul(
const RealScalar& x,
const Scalar& y)
const
119 static EIGEN_STRONG_INLINE
typename NumTraits<Scalar>::Real run(
const Scalar& x) {
return numext::real(x); }
123template<
typename Scalar,
typename Index>
128 EIGEN_ALWAYS_INLINE Scalar operator()(Index i)
const {
131 template <
typename Packet,
int AlignmentType>
132 EIGEN_ALWAYS_INLINE Packet load(Index i)
const {
136 template <
typename Packet>
137 bool aligned(Index i)
const {
138 return (
size_t(m_data+i)%
sizeof(Packet))==0;
145template<
typename Scalar,
typename Index,
int AlignmentType>
148 typedef typename packet_traits<Scalar>::type Packet;
149 typedef typename packet_traits<Scalar>::half HalfPacket;
153 EIGEN_ALWAYS_INLINE
void prefetch(
int i)
const {
154 internal::prefetch(&
operator()(i));
157 EIGEN_ALWAYS_INLINE Scalar& operator()(Index i)
const {
161 EIGEN_ALWAYS_INLINE Packet loadPacket(Index i)
const {
165 EIGEN_ALWAYS_INLINE HalfPacket loadHalfPacket(Index i)
const {
169 EIGEN_ALWAYS_INLINE
void storePacket(Index i,
const Packet &p)
const {
178template<
typename Scalar,
typename Index,
int StorageOrder,
int AlignmentType = Unaligned>
181 typedef typename packet_traits<Scalar>::type Packet;
182 typedef typename packet_traits<Scalar>::half HalfPacket;
187 EIGEN_ALWAYS_INLINE
blas_data_mapper(Scalar* data, Index stride) : m_data(data), m_stride(stride) {}
190 getSubMapper(Index i, Index
j)
const {
194 EIGEN_ALWAYS_INLINE
LinearMapper getLinearMapper(Index i, Index
j)
const {
198 EIGEN_ALWAYS_INLINE
VectorMapper getVectorMapper(Index i, Index
j)
const {
204 EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index
j)
const {
205 return m_data[StorageOrder==
RowMajor ?
j + i*m_stride : i +
j*m_stride];
208 EIGEN_ALWAYS_INLINE Packet loadPacket(Index i, Index
j)
const {
212 EIGEN_ALWAYS_INLINE HalfPacket loadHalfPacket(Index i, Index
j)
const {
216 template<
typename SubPacket>
217 EIGEN_ALWAYS_INLINE
void scatterPacket(Index i, Index
j,
const SubPacket &p)
const {
221 template<
typename SubPacket>
222 EIGEN_ALWAYS_INLINE
SubPacket gatherPacket(Index i, Index
j)
const {
226 const Index stride()
const {
return m_stride; }
227 const Scalar* data()
const {
return m_data; }
229 Index firstAligned(Index size)
const {
230 if (
size_t(m_data)%
sizeof(Scalar)) {
233 return internal::first_default_aligned(m_data, size);
237 Scalar* EIGEN_RESTRICT m_data;
238 const Index m_stride;
242template<
typename Scalar,
typename Index,
int StorageOrder>
259 typedef const XprType& ExtractType;
260 typedef XprType _ExtractType;
263 IsTransposed =
false,
264 NeedToConjugate =
false,
266 && (
bool(XprType::IsVectorAtCompileTime)
270 typedef typename conditional<bool(HasUsableDirectAccess),
272 typename _ExtractType::PlainObject
274 static inline ExtractType extract(
const XprType& x) {
return x; }
275 static inline const Scalar extractScalarFactor(
const XprType&) {
return Scalar(1); }
279template<
typename Scalar,
typename NestedXpr>
289 NeedToConjugate = Base::NeedToConjugate ? 0 : IsComplex
291 static inline ExtractType extract(
const XprType& x) {
return Base::extract(x.nestedExpression()); }
292 static inline Scalar extractScalarFactor(
const XprType& x) {
return conj(Base::extractScalarFactor(x.nestedExpression())); }
296template<
typename Scalar,
typename NestedXpr>
303 static inline ExtractType extract(
const XprType& x) {
return Base::extract(x.nestedExpression()); }
304 static inline Scalar extractScalarFactor(
const XprType& x)
305 {
return x.functor().m_other * Base::extractScalarFactor(x.nestedExpression()); }
309template<
typename Scalar,
typename NestedXpr>
316 static inline ExtractType extract(
const XprType& x) {
return Base::extract(x.nestedExpression()); }
317 static inline Scalar extractScalarFactor(
const XprType& x)
318 {
return - Base::extractScalarFactor(x.nestedExpression()); }
322template<
typename NestedXpr>
326 typedef typename NestedXpr::Scalar Scalar;
331 typedef typename conditional<bool(Base::HasUsableDirectAccess),
333 typename ExtractType::PlainObject
336 IsTransposed = Base::IsTransposed ? 0 : 1
339 static inline Scalar extractScalarFactor(
const XprType& x) {
return Base::extractScalarFactor(x.nestedExpression()); }
349 static const typename T::Scalar* run(
const T& m)
357 static typename T::Scalar* run(
const T&) {
return 0; }
360template<
typename T>
const typename T::Scalar* extract_data(
const T& m)
Generic expression where a coefficient-wise unary operator is applied to an expression.
Definition CwiseUnaryOp.h:57
Pseudo expression representing a solving operation.
Definition Solve.h:63
Expression of the transpose of a matrix.
Definition Transpose.h:55
Definition BlasUtil.h:146
Definition BlasUtil.h:124
Definition BlasUtil.h:179
Definition BlasUtil.h:243
@ RowMajor
Storage order is row major (see TopicStorageOrders).
Definition Constants.h:322
const unsigned int DirectAccessBit
Means that the underlying array of coefficients can be directly accessed as a plain strided array.
Definition Constants.h:149
Holds information about the various numeric (i.e.
Definition NumTraits.h:108
Definition BlasUtil.h:257
Definition ForwardDeclarations.h:179
Definition BlasUtil.h:113
Definition DenseCoeffsBase.h:631
Definition UnaryFunctors.h:109
Definition BinaryFunctors.h:358
Definition UnaryFunctors.h:22
Definition ForwardDeclarations.h:17