diff options
author | Gael Guennebaud <g.gael@free.fr> | 2008-05-28 22:56:19 +0000 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2008-05-28 22:56:19 +0000 |
commit | c1559d30791f2aff2511d65bf1dac6f16946c801 (patch) | |
tree | 78de6273e811dda4c81e912dedc70f7c54025f38 /Eigen/src/Core | |
parent | 8711e26c8a691818c5aa2f3a024f8ada4b7129dc (diff) |
* updated the assignement operator macro so that overloads
in MatrixBase work
* removed product_selector and cleaned Product.h a bit
* cleaned Assign.h a bit
Diffstat (limited to 'Eigen/src/Core')
-rw-r--r-- | Eigen/src/Core/Assign.h | 8 | ||||
-rw-r--r-- | Eigen/src/Core/Product.h | 134 | ||||
-rw-r--r-- | Eigen/src/Core/util/Macros.h | 2 |
3 files changed, 16 insertions, 128 deletions
diff --git a/Eigen/src/Core/Assign.h b/Eigen/src/Core/Assign.h index bf5ede1bc..fa64cb790 100644 --- a/Eigen/src/Core/Assign.h +++ b/Eigen/src/Core/Assign.h @@ -112,9 +112,6 @@ template<typename OtherDerived> inline Derived& MatrixBase<Derived> ::lazyAssign(const MatrixBase<OtherDerived>& other) { -// std::cout << typeid(OtherDerived).name() << "\n"; -// std::cout << "lazyAssign = " << (Derived::Flags&VectorizableBit) << " " << (OtherDerived::Flags&VectorizableBit) << "\n"; -// std::cout << __PRETTY_FUNCTION__ << std::endl; ei_assignment_impl<Derived, OtherDerived>::execute(derived(),other.derived()); return derived(); } @@ -186,7 +183,6 @@ struct ei_assignment_impl<Derived, OtherDerived, true> const bool unroll = Derived::SizeAtCompileTime * OtherDerived::CoeffReadCost <= EIGEN_UNROLLING_LIMIT; if(unroll) { -// std::cout << "vectorized unrolled\n"; ei_matrix_assignment_packet_unroller <Derived, OtherDerived, unroll && int(Derived::SizeAtCompileTime)>=int(ei_packet_traits<typename Derived::Scalar>::size) @@ -201,7 +197,6 @@ struct ei_assignment_impl<Derived, OtherDerived, true> && (Derived::ColsAtCompileTime==Dynamic || Derived::ColsAtCompileTime%ei_packet_traits<typename Derived::Scalar>::size!=0)) { -// std::cout << "vectorized linear row major\n"; const int size = dst.rows() * dst.cols(); const int alignedSize = (size/ei_packet_traits<typename Derived::Scalar>::size)*ei_packet_traits<typename Derived::Scalar>::size; int index = 0; @@ -218,7 +213,6 @@ struct ei_assignment_impl<Derived, OtherDerived, true> } else { -// std::cout << "vectorized normal row major\n"; for(int i = 0; i < dst.rows(); i++) for(int j = 0; j < dst.cols(); j+=ei_packet_traits<typename Derived::Scalar>::size) dst.template writePacketCoeff<Aligned>(i, j, src.template packetCoeff<Aligned>(i, j)); @@ -230,7 +224,6 @@ struct ei_assignment_impl<Derived, OtherDerived, true> && ( Derived::RowsAtCompileTime==Dynamic || Derived::RowsAtCompileTime%ei_packet_traits<typename Derived::Scalar>::size!=0)) { -// std::cout << "vectorized linear col major\n"; const int size = dst.rows() * dst.cols(); const int alignedSize = (size/ei_packet_traits<typename Derived::Scalar>::size)*ei_packet_traits<typename Derived::Scalar>::size; int index = 0; @@ -247,7 +240,6 @@ struct ei_assignment_impl<Derived, OtherDerived, true> } else { -// std::cout << "vectorized normal col major\n"; for(int j = 0; j < dst.cols(); j++) for(int i = 0; i < dst.rows(); i+=ei_packet_traits<typename Derived::Scalar>::size) dst.template writePacketCoeff<Aligned>(i, j, src.template packetCoeff<Aligned>(i, j)); diff --git a/Eigen/src/Core/Product.h b/Eigen/src/Core/Product.h index 2c8c73c88..1b62e0750 100644 --- a/Eigen/src/Core/Product.h +++ b/Eigen/src/Core/Product.h @@ -134,8 +134,6 @@ template<typename Product> struct ProductPacketCoeffImpl<Product, false> { * This class represents an expression of the product of two matrices. * It is the return type of the operator* between matrices, and most of the time * this is the only way it is used. - * - * \sa class Sum, class Difference */ template<typename Lhs, typename Rhs> struct ei_product_eval_mode { @@ -162,6 +160,7 @@ template<typename T> class ei_product_eval_to_column_major ei_traits<T>::MaxColsAtCompileTime> type; }; +// as ei_nested, but evaluate to a column-major matrix if an evaluation is required template<typename T, int n=1> struct ei_product_nested_rhs { typedef typename ei_meta_if< @@ -176,51 +175,11 @@ template<typename T, int n=1> struct ei_product_nested_rhs >::ret type; }; -// template<typename T, int n=1> struct ei_product_nested_lhs -// { -// typedef typename ei_meta_if< -// ei_must_nest_by_value<T>::ret && (int(ei_traits<T>::Flags) & DirectAccessBit), -// T, -// typename ei_meta_if< -// int(ei_traits<T>::Flags) & EvalBeforeNestingBit -// || (!(int(ei_traits<T>::Flags) & DirectAccessBit)) -// || (n+1) * int(NumTraits<typename ei_traits<T>::Scalar>::ReadCost) < (n-1) * int(T::CoeffReadCost), -// typename ei_eval<T>::type, -// const T& -// >::ret -// >::ret type; -// }; - -template<typename T> struct ei_product_copy_rhs -{ - typedef typename ei_meta_if< - (ei_traits<T>::Flags & RowMajorBit) - || (!(ei_traits<T>::Flags & DirectAccessBit)), - typename ei_product_eval_to_column_major<T>::type, - const T& - >::ret type; -}; - -template<typename T> struct ei_product_copy_lhs -{ - typedef typename ei_meta_if< - (!(int(ei_traits<T>::Flags) & DirectAccessBit)), - typename ei_eval<T>::type, - const T& - >::ret type; -}; - template<typename Lhs, typename Rhs, int EvalMode> struct ei_traits<Product<Lhs, Rhs, EvalMode> > { typedef typename Lhs::Scalar Scalar; - // the cache friendly product evals lhs once only - // FIXME what to do if we chose to dynamically call the normal product from the cache friendly one for small matrices ? - typedef /*typename ei_meta_if<EvalMode==CacheFriendlyProduct,*/ -// typename ei_product_nested_lhs<Lhs,1>::type, - typename ei_nested<Lhs,Rhs::ColsAtCompileTime>::type/*>::ret*/ LhsNested; - - // NOTE that rhs must be ColumnMajor, so we might need a special nested type calculation + typedef typename ei_nested<Lhs,Rhs::ColsAtCompileTime>::type LhsNested; typedef typename ei_meta_if<EvalMode==CacheFriendlyProduct, typename ei_product_nested_rhs<Rhs,Lhs::RowsAtCompileTime>::type, typename ei_nested<Rhs,Lhs::RowsAtCompileTime>::type>::ret RhsNested; @@ -385,7 +344,6 @@ template<typename Lhs,typename Rhs> inline Derived& MatrixBase<Derived>::operator+=(const Flagged<Product<Lhs,Rhs,CacheFriendlyProduct>, 0, EvalBeforeNestingBit | EvalBeforeAssigningBit>& other) { - std::cout << "_cacheFriendlyEvalAndAdd\n"; other._expression()._cacheFriendlyEvalAndAdd(const_cast_derived()); return derived(); } @@ -398,92 +356,35 @@ inline Derived& MatrixBase<Derived>::lazyAssign(const Product<Lhs,Rhs,CacheFrien return derived(); } -template<typename Lhs, typename Rhs, int EvalMode, typename DestDerived, bool DirectAccess> -struct ei_cache_friendly_selector +template<typename T> struct ei_product_copy_rhs { - typedef Product<Lhs,Rhs,EvalMode> Prod; - typedef typename Prod::_LhsNested _LhsNested; - typedef typename Prod::_RhsNested _RhsNested; - typedef typename Prod::Scalar Scalar; - static inline void eval(const Prod& product, DestDerived& res) - { - if ( product._rows()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD - && product._cols()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD - && product.m_lhs.cols()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD - ) - { - res.setZero(); -// typename ei_product_copy_lhs<>::type - ei_cache_friendly_product<Scalar>( - product._rows(), product._cols(), product.m_lhs.cols(), - _LhsNested::Flags&RowMajorBit, &(product.m_lhs.const_cast_derived().coeffRef(0,0)), product.m_lhs.stride(), - _RhsNested::Flags&RowMajorBit, &(product.m_rhs.const_cast_derived().coeffRef(0,0)), product.m_rhs.stride(), - Prod::Flags&RowMajorBit, &(res.coeffRef(0,0)), res.stride() - ); - } - else - { - res = Product<_LhsNested,_RhsNested,NormalProduct>(product.m_lhs, product.m_rhs).lazy(); - } - } - - static inline void eval_and_add(const Prod& product, DestDerived& res) - { - if ( product._rows()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD - && product._cols()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD - && product.m_lhs.cols()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD - ) - { - ei_cache_friendly_product<Scalar>( - product._rows(), product._cols(), product.m_lhs.cols(), - _LhsNested::Flags&RowMajorBit, &(product.m_lhs.const_cast_derived().coeffRef(0,0)), product.m_lhs.stride(), - _RhsNested::Flags&RowMajorBit, &(product.m_rhs.const_cast_derived().coeffRef(0,0)), product.m_rhs.stride(), - Prod::Flags&RowMajorBit, &(res.coeffRef(0,0)), res.stride() - ); - } - else - { - res += Product<_LhsNested,_RhsNested,NormalProduct>(product.m_lhs, product.m_rhs).lazy(); - } - } + typedef typename ei_meta_if< + (ei_traits<T>::Flags & RowMajorBit) + || (!(ei_traits<T>::Flags & DirectAccessBit)), + typename ei_product_eval_to_column_major<T>::type, + const T& + >::ret type; }; -template<typename Lhs, typename Rhs, int EvalMode, typename DestDerived> -struct ei_cache_friendly_selector<Lhs,Rhs,EvalMode,DestDerived,false> +template<typename T> struct ei_product_copy_lhs { - typedef Product<Lhs,Rhs,EvalMode> Prod; - typedef typename Prod::_LhsNested _LhsNested; - typedef typename Prod::_RhsNested _RhsNested; - typedef typename Prod::Scalar Scalar; - static inline void eval(const Prod& product, DestDerived& res) - { - res = Product<_LhsNested,_RhsNested,NormalProduct>(product.m_lhs, product.m_rhs).lazy(); - } - - static inline void eval_and_add(const Prod& product, DestDerived& res) - { - res += Product<_LhsNested,_RhsNested,NormalProduct>(product.m_lhs, product.m_rhs).lazy(); - } + typedef typename ei_meta_if< + (!(int(ei_traits<T>::Flags) & DirectAccessBit)), + typename ei_eval<T>::type, + const T& + >::ret type; }; template<typename Lhs, typename Rhs, int EvalMode> template<typename DestDerived> inline void Product<Lhs,Rhs,EvalMode>::_cacheFriendlyEval(DestDerived& res) const { -// ei_cache_friendly_selector<Lhs,Rhs,EvalMode,DestDerived, -// _LhsNested::Flags&_RhsNested::Flags&DirectAccessBit> -// ::eval(*this, res); - if ( _rows()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD && _cols()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD && m_lhs.cols()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD ) { res.setZero(); - - -// typedef typename ei_eval<_LhsNested>::type LhsCopy; -// typedef typename ei_product_eval_to_column_major<_RhsNested>::type RhsCopy; typedef typename ei_product_copy_lhs<_LhsNested>::type LhsCopy; typedef typename ei_unref<LhsCopy>::type _LhsCopy; typedef typename ei_product_copy_rhs<_RhsNested>::type RhsCopy; @@ -501,17 +402,12 @@ inline void Product<Lhs,Rhs,EvalMode>::_cacheFriendlyEval(DestDerived& res) cons { res = Product<_LhsNested,_RhsNested,NormalProduct>(m_lhs, m_rhs).lazy(); } - } template<typename Lhs, typename Rhs, int EvalMode> template<typename DestDerived> inline void Product<Lhs,Rhs,EvalMode>::_cacheFriendlyEvalAndAdd(DestDerived& res) const { - std::cout << "_cacheFriendlyEvalAndAdd\n"; -// ei_cache_friendly_selector<Lhs,Rhs,EvalMode,DestDerived, -// _LhsNested::Flags&_RhsNested::Flags&DirectAccessBit> -// ::eval_and_add(*this, res); if ( _rows()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD && _cols()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD && m_lhs.cols()>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index 306144218..a31e73bb9 100644 --- a/Eigen/src/Core/util/Macros.h +++ b/Eigen/src/Core/util/Macros.h @@ -107,7 +107,7 @@ using Eigen::MatrixBase; template<typename OtherDerived> \ Derived& operator Op(const MatrixBase<OtherDerived>& other) \ { \ - return Eigen::MatrixBase<Derived>::operator Op(other); \ + return Eigen::MatrixBase<Derived>::operator Op(other.derived()); \ } \ Derived& operator Op(const Derived& other) \ { \ |