From a2087cd7a3674c3d3ef74a474e417a3ea1f1e82b Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Sat, 11 Jul 2009 21:14:59 +0200 Subject: Add an efficient rank2 update function (like the level2 blas xSYR2 routine). Note that it is already used in Tridiagonalization. --- Eigen/src/Core/Product.h | 58 ++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 27 deletions(-) (limited to 'Eigen/src/Core/Product.h') diff --git a/Eigen/src/Core/Product.h b/Eigen/src/Core/Product.h index bd99bfee8..44e3f606e 100644 --- a/Eigen/src/Core/Product.h +++ b/Eigen/src/Core/Product.h @@ -76,7 +76,7 @@ struct ProductReturnType /* Helper class to analyze the factors of a Product expression. * In particular it allows to pop out operator-, scalar multiples, * and conjugate */ -template struct ei_product_factor_traits +template struct ei_blas_traits { typedef typename ei_traits::Scalar Scalar; typedef XprType ActualXprType; @@ -85,15 +85,19 @@ template struct ei_product_factor_traits NeedToConjugate = false, ActualAccess = int(ei_traits::Flags)&DirectAccessBit ? HasDirectAccess : NoDirectAccess }; + typedef typename ei_meta_if::ret DirectLinearAccessType; static inline const ActualXprType& extract(const XprType& x) { return x; } static inline Scalar extractScalarFactor(const XprType&) { return Scalar(1); } }; // pop conjugate -template struct ei_product_factor_traits, NestedXpr> > - : ei_product_factor_traits +template struct ei_blas_traits, NestedXpr> > + : ei_blas_traits { - typedef ei_product_factor_traits Base; + typedef ei_blas_traits Base; typedef CwiseUnaryOp, NestedXpr> XprType; typedef typename Base::ActualXprType ActualXprType; @@ -106,10 +110,10 @@ template struct ei_product_factor_traits struct ei_product_factor_traits, NestedXpr> > - : ei_product_factor_traits +template struct ei_blas_traits, NestedXpr> > + : ei_blas_traits { - typedef ei_product_factor_traits Base; + typedef ei_blas_traits Base; typedef CwiseUnaryOp, NestedXpr> XprType; typedef typename Base::ActualXprType ActualXprType; static inline const ActualXprType& extract(const XprType& x) { return Base::extract(x._expression()); } @@ -118,10 +122,10 @@ template struct ei_product_factor_traits struct ei_product_factor_traits, NestedXpr> > - : ei_product_factor_traits +template struct ei_blas_traits, NestedXpr> > + : ei_blas_traits { - typedef ei_product_factor_traits Base; + typedef ei_blas_traits Base; typedef CwiseUnaryOp, NestedXpr> XprType; typedef typename Base::ActualXprType ActualXprType; static inline const ActualXprType& extract(const XprType& x) { return Base::extract(x._expression()); } @@ -130,11 +134,11 @@ template struct ei_product_factor_traits struct ei_product_factor_traits > - : ei_product_factor_traits +template struct ei_blas_traits > + : ei_blas_traits { typedef typename NestedXpr::Scalar Scalar; - typedef ei_product_factor_traits Base; + typedef ei_blas_traits Base; typedef NestByValue XprType; typedef typename Base::ActualXprType ActualXprType; static inline const ActualXprType& extract(const XprType& x) { return Base::extract(static_cast(x)); } @@ -148,8 +152,8 @@ template struct ei_product_factor_traits struct ei_product_mode { - typedef typename ei_product_factor_traits::ActualXprType ActualLhs; - typedef typename ei_product_factor_traits::ActualXprType ActualRhs; + typedef typename ei_blas_traits::ActualXprType ActualLhs; + typedef typename ei_blas_traits::ActualXprType ActualRhs; enum{ value = Lhs::MaxColsAtCompileTime == Dynamic @@ -600,10 +604,10 @@ static void ei_cache_friendly_product_rowmajor_times_vector( template::RowsAtCompileTime, int LhsOrder = int(ei_traits::LhsFlags)&RowMajorBit ? RowMajor : ColMajor, - int LhsHasDirectAccess = ei_product_factor_traits::_LhsNested>::ActualAccess, + int LhsHasDirectAccess = ei_blas_traits::_LhsNested>::ActualAccess, int RhsCols = ei_traits::ColsAtCompileTime, int RhsOrder = int(ei_traits::RhsFlags)&RowMajorBit ? RowMajor : ColMajor, - int RhsHasDirectAccess = ei_product_factor_traits::_RhsNested>::ActualAccess> + int RhsHasDirectAccess = ei_blas_traits::_RhsNested>::ActualAccess> struct ei_cache_friendly_product_selector { template @@ -633,8 +637,8 @@ template struct ei_cache_friendly_product_selector { typedef typename ProductType::Scalar Scalar; - typedef ei_product_factor_traits::_LhsNested> LhsProductTraits; - typedef ei_product_factor_traits::_RhsNested> RhsProductTraits; + typedef ei_blas_traits::_LhsNested> LhsProductTraits; + typedef ei_blas_traits::_RhsNested> RhsProductTraits; typedef typename LhsProductTraits::ActualXprType ActualLhsType; typedef typename RhsProductTraits::ActualXprType ActualRhsType; @@ -694,8 +698,8 @@ template struct ei_cache_friendly_product_selector { typedef typename ProductType::Scalar Scalar; - typedef ei_product_factor_traits::_LhsNested> LhsProductTraits; - typedef ei_product_factor_traits::_RhsNested> RhsProductTraits; + typedef ei_blas_traits::_LhsNested> LhsProductTraits; + typedef ei_blas_traits::_RhsNested> RhsProductTraits; typedef typename LhsProductTraits::ActualXprType ActualLhsType; typedef typename RhsProductTraits::ActualXprType ActualRhsType; @@ -740,8 +744,8 @@ struct ei_cache_friendly_product_selector::_LhsNested> LhsProductTraits; - typedef ei_product_factor_traits::_RhsNested> RhsProductTraits; + typedef ei_blas_traits::_LhsNested> LhsProductTraits; + typedef ei_blas_traits::_RhsNested> RhsProductTraits; typedef typename LhsProductTraits::ActualXprType ActualLhsType; typedef typename RhsProductTraits::ActualXprType ActualRhsType; @@ -783,8 +787,8 @@ struct ei_cache_friendly_product_selector::_LhsNested> LhsProductTraits; - typedef ei_product_factor_traits::_RhsNested> RhsProductTraits; + typedef ei_blas_traits::_LhsNested> LhsProductTraits; + typedef ei_blas_traits::_RhsNested> RhsProductTraits; typedef typename LhsProductTraits::ActualXprType ActualLhsType; typedef typename RhsProductTraits::ActualXprType ActualRhsType; @@ -903,8 +907,8 @@ template template inline void Product::_cacheFriendlyEvalAndAdd(DestDerived& res, Scalar alpha) const { - typedef ei_product_factor_traits<_LhsNested> LhsProductTraits; - typedef ei_product_factor_traits<_RhsNested> RhsProductTraits; + typedef ei_blas_traits<_LhsNested> LhsProductTraits; + typedef ei_blas_traits<_RhsNested> RhsProductTraits; typedef typename LhsProductTraits::ActualXprType ActualLhsType; typedef typename RhsProductTraits::ActualXprType ActualRhsType; -- cgit v1.2.3