mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 11:49:02 +08:00
Pulled latest updates from trunk
This commit is contained in:
commit
099b354ca7
@ -324,19 +324,19 @@ struct generic_product_impl_base
|
|||||||
typedef typename Product<Lhs,Rhs>::Scalar Scalar;
|
typedef typename Product<Lhs,Rhs>::Scalar Scalar;
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{ dst.setZero(); scaleAndAddTo(dst, lhs, rhs, Scalar(1)); }
|
{ dst.setZero(); scaleAndAddTo(dst, lhs, rhs, Scalar(1)); }
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{ scaleAndAddTo(dst,lhs, rhs, Scalar(1)); }
|
{ scaleAndAddTo(dst,lhs, rhs, Scalar(1)); }
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{ scaleAndAddTo(dst, lhs, rhs, Scalar(-1)); }
|
{ scaleAndAddTo(dst, lhs, rhs, Scalar(-1)); }
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
|
static EIGEN_STRONG_INLINE void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
|
||||||
{ Derived::scaleAndAddTo(dst,lhs,rhs,alpha); }
|
{ Derived::scaleAndAddTo(dst,lhs,rhs,alpha); }
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -350,7 +350,7 @@ struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,GemvProduct>
|
|||||||
typedef typename internal::conditional<int(Side)==OnTheRight,Lhs,Rhs>::type MatrixType;
|
typedef typename internal::conditional<int(Side)==OnTheRight,Lhs,Rhs>::type MatrixType;
|
||||||
|
|
||||||
template<typename Dest>
|
template<typename Dest>
|
||||||
static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
|
static EIGEN_STRONG_INLINE void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
|
||||||
{
|
{
|
||||||
internal::gemv_dense_selector<Side,
|
internal::gemv_dense_selector<Side,
|
||||||
(int(MatrixType::Flags)&RowMajorBit) ? RowMajor : ColMajor,
|
(int(MatrixType::Flags)&RowMajorBit) ? RowMajor : ColMajor,
|
||||||
@ -365,7 +365,7 @@ struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,CoeffBasedProductMode>
|
|||||||
typedef typename Product<Lhs,Rhs>::Scalar Scalar;
|
typedef typename Product<Lhs,Rhs>::Scalar Scalar;
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static inline void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{
|
{
|
||||||
// Same as: dst.noalias() = lhs.lazyProduct(rhs);
|
// Same as: dst.noalias() = lhs.lazyProduct(rhs);
|
||||||
// but easier on the compiler side
|
// but easier on the compiler side
|
||||||
@ -373,14 +373,14 @@ struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,CoeffBasedProductMode>
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static inline void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{
|
{
|
||||||
// dst.noalias() += lhs.lazyProduct(rhs);
|
// dst.noalias() += lhs.lazyProduct(rhs);
|
||||||
call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::add_assign_op<Scalar>());
|
call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::add_assign_op<Scalar>());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static inline void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{
|
{
|
||||||
// dst.noalias() -= lhs.lazyProduct(rhs);
|
// dst.noalias() -= lhs.lazyProduct(rhs);
|
||||||
call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::sub_assign_op<Scalar>());
|
call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::sub_assign_op<Scalar>());
|
||||||
|
@ -27,9 +27,11 @@ namespace internal {
|
|||||||
* we however don't want to add a dependency to Boost.
|
* we however don't want to add a dependency to Boost.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if EIGEN_COMP_ICC
|
// Only recent versions of ICC complain about using ptrdiff_t to hold pointers,
|
||||||
typedef intptr_t IntPtr;
|
// and older versions do not provide *intptr_t types.
|
||||||
typedef uintptr_t UIntPtr;
|
#if EIGEN_COMP_ICC>=1600
|
||||||
|
typedef std::intptr_t IntPtr;
|
||||||
|
typedef std::uintptr_t UIntPtr;
|
||||||
#else
|
#else
|
||||||
typedef std::ptrdiff_t IntPtr;
|
typedef std::ptrdiff_t IntPtr;
|
||||||
typedef std::size_t UIntPtr;
|
typedef std::size_t UIntPtr;
|
||||||
|
@ -67,9 +67,9 @@ template<typename T, int Value> class variable_if_dynamic
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamic)
|
EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamic)
|
||||||
EIGEN_DEVICE_FUNC explicit variable_if_dynamic(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamic(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
|
||||||
EIGEN_DEVICE_FUNC static T value() { return T(Value); }
|
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T value() { return T(Value); }
|
||||||
EIGEN_DEVICE_FUNC void setValue(T) {}
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T> class variable_if_dynamic<T, Dynamic>
|
template<typename T> class variable_if_dynamic<T, Dynamic>
|
||||||
@ -77,9 +77,9 @@ template<typename T> class variable_if_dynamic<T, Dynamic>
|
|||||||
T m_value;
|
T m_value;
|
||||||
EIGEN_DEVICE_FUNC variable_if_dynamic() { eigen_assert(false); }
|
EIGEN_DEVICE_FUNC variable_if_dynamic() { eigen_assert(false); }
|
||||||
public:
|
public:
|
||||||
EIGEN_DEVICE_FUNC explicit variable_if_dynamic(T value) : m_value(value) {}
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamic(T value) : m_value(value) {}
|
||||||
EIGEN_DEVICE_FUNC T value() const { return m_value; }
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T value() const { return m_value; }
|
||||||
EIGEN_DEVICE_FUNC void setValue(T value) { m_value = value; }
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T value) { m_value = value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/** \internal like variable_if_dynamic but for DynamicIndex
|
/** \internal like variable_if_dynamic but for DynamicIndex
|
||||||
@ -88,9 +88,9 @@ template<typename T, int Value> class variable_if_dynamicindex
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamicindex)
|
EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamicindex)
|
||||||
EIGEN_DEVICE_FUNC explicit variable_if_dynamicindex(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamicindex(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
|
||||||
EIGEN_DEVICE_FUNC static T value() { return T(Value); }
|
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T value() { return T(Value); }
|
||||||
EIGEN_DEVICE_FUNC void setValue(T) {}
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T> class variable_if_dynamicindex<T, DynamicIndex>
|
template<typename T> class variable_if_dynamicindex<T, DynamicIndex>
|
||||||
@ -98,9 +98,9 @@ template<typename T> class variable_if_dynamicindex<T, DynamicIndex>
|
|||||||
T m_value;
|
T m_value;
|
||||||
EIGEN_DEVICE_FUNC variable_if_dynamicindex() { eigen_assert(false); }
|
EIGEN_DEVICE_FUNC variable_if_dynamicindex() { eigen_assert(false); }
|
||||||
public:
|
public:
|
||||||
EIGEN_DEVICE_FUNC explicit variable_if_dynamicindex(T value) : m_value(value) {}
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamicindex(T value) : m_value(value) {}
|
||||||
EIGEN_DEVICE_FUNC T value() const { return m_value; }
|
EIGEN_DEVICE_FUNC T EIGEN_STRONG_INLINE value() const { return m_value; }
|
||||||
EIGEN_DEVICE_FUNC void setValue(T value) { m_value = value; }
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T value) { m_value = value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T> struct functor_traits
|
template<typename T> struct functor_traits
|
||||||
|
@ -30,7 +30,10 @@ typename internal::traits<SparseMatrix<_Scalar,_Options,_Index> >::Scalar
|
|||||||
SparseMatrix<_Scalar,_Options,_Index>::sum() const
|
SparseMatrix<_Scalar,_Options,_Index>::sum() const
|
||||||
{
|
{
|
||||||
eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
|
eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
|
||||||
return Matrix<Scalar,1,Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();
|
if(this->isCompressed())
|
||||||
|
return Matrix<Scalar,1,Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();
|
||||||
|
else
|
||||||
|
return Base::sum();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename _Scalar, int _Options, typename _Index>
|
template<typename _Scalar, int _Options, typename _Index>
|
||||||
|
@ -157,18 +157,15 @@ template<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& re
|
|||||||
initSparse<Scalar>(density, refM3, m3);
|
initSparse<Scalar>(density, refM3, m3);
|
||||||
initSparse<Scalar>(density, refM4, m4);
|
initSparse<Scalar>(density, refM4, m4);
|
||||||
|
|
||||||
|
if(internal::random<bool>())
|
||||||
|
m1.makeCompressed();
|
||||||
|
|
||||||
VERIFY_IS_APPROX(m1*s1, refM1*s1);
|
VERIFY_IS_APPROX(m1*s1, refM1*s1);
|
||||||
VERIFY_IS_APPROX(m1+m2, refM1+refM2);
|
VERIFY_IS_APPROX(m1+m2, refM1+refM2);
|
||||||
VERIFY_IS_APPROX(m1+m2+m3, refM1+refM2+refM3);
|
VERIFY_IS_APPROX(m1+m2+m3, refM1+refM2+refM3);
|
||||||
VERIFY_IS_APPROX(m3.cwiseProduct(m1+m2), refM3.cwiseProduct(refM1+refM2));
|
VERIFY_IS_APPROX(m3.cwiseProduct(m1+m2), refM3.cwiseProduct(refM1+refM2));
|
||||||
VERIFY_IS_APPROX(m1*s1-m2, refM1*s1-refM2);
|
VERIFY_IS_APPROX(m1*s1-m2, refM1*s1-refM2);
|
||||||
|
|
||||||
VERIFY_IS_APPROX(m1*=s1, refM1*=s1);
|
|
||||||
VERIFY_IS_APPROX(m1/=s1, refM1/=s1);
|
|
||||||
|
|
||||||
VERIFY_IS_APPROX(m1+=m2, refM1+=refM2);
|
|
||||||
VERIFY_IS_APPROX(m1-=m2, refM1-=refM2);
|
|
||||||
|
|
||||||
if(SparseMatrixType::IsRowMajor)
|
if(SparseMatrixType::IsRowMajor)
|
||||||
VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.row(0).dot(refM2.row(0)));
|
VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.row(0).dot(refM2.row(0)));
|
||||||
else
|
else
|
||||||
@ -197,6 +194,14 @@ template<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& re
|
|||||||
VERIFY_IS_APPROX(refM4 - m3, refM4 - refM3);
|
VERIFY_IS_APPROX(refM4 - m3, refM4 - refM3);
|
||||||
VERIFY_IS_APPROX(m3 - refM4, refM3 - refM4);
|
VERIFY_IS_APPROX(m3 - refM4, refM3 - refM4);
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(m1.sum(), refM1.sum());
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(m1*=s1, refM1*=s1);
|
||||||
|
VERIFY_IS_APPROX(m1/=s1, refM1/=s1);
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(m1+=m2, refM1+=refM2);
|
||||||
|
VERIFY_IS_APPROX(m1-=m2, refM1-=refM2);
|
||||||
|
|
||||||
// test aliasing
|
// test aliasing
|
||||||
VERIFY_IS_APPROX((m1 = -m1), (refM1 = -refM1));
|
VERIFY_IS_APPROX((m1 = -m1), (refM1 = -refM1));
|
||||||
VERIFY_IS_APPROX((m1 = m1.transpose()), (refM1 = refM1.transpose().eval()));
|
VERIFY_IS_APPROX((m1 = m1.transpose()), (refM1 = refM1.transpose().eval()));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user