[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/work/eigen2/Eigen/src
From:       Gael Guennebaud <g.gael () free ! fr>
Date:       2008-05-31 21:35:12
Message-ID: 1212269712.065165.18449.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 815004 by ggael:

added optimized matrix times diagonal matrix product via Diagonal flag shortcut.


 M  +8 -0      Array/CwiseOperators.h  
 M  +13 -0     Array/Functors.h  
 M  +1 -1      Core/DiagonalMatrix.h  
 M  +1 -0      Core/MatrixBase.h  
 M  +30 -14    Core/Product.h  
 M  +1 -0      Core/util/Constants.h  
 M  +1 -0      Core/util/ForwardDeclarations.h  
 M  +1 -2      Core/util/Meta.h  


--- branches/work/eigen2/Eigen/src/Array/CwiseOperators.h #815003:815004
@@ -76,6 +76,14 @@
     (derived(), ei_scalar_pow_op<Scalar>(exponent));
 }
 
+/** \returns an expression of the coefficient-wise reciprocal of *this. */
+template<typename Derived>
+inline const CwiseUnaryOp<ei_scalar_inverse_op<typename ei_traits<Derived>::Scalar>, Derived>
+MatrixBase<Derived>::cwiseInverse() const
+{
+  return derived();
+}
+
 // -- binary operators --
 
 /** \returns an expression of the coefficient-wise \< operator of *this and \a other
--- branches/work/eigen2/Eigen/src/Array/Functors.h #815003:815004
@@ -100,6 +100,19 @@
 struct ei_functor_traits<ei_scalar_pow_op<Scalar> >
 { enum { Cost = 5 * NumTraits<Scalar>::MulCost, IsVectorizable = false }; };
 
+/** \internal
+  * \brief Template functor to compute the reciprocal of a scalar
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::cwiseInverse
+  */
+template<typename Scalar>
+struct ei_scalar_inverse_op {
+  inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; }
+};
+template<typename Scalar>
+struct ei_functor_traits<ei_scalar_inverse_op<Scalar> >
+{ enum { Cost = NumTraits<Scalar>::MulCost, IsVectorizable = false }; };
+
 // default ei_functor_traits for STL functors:
 
 template<typename T>
--- branches/work/eigen2/Eigen/src/Core/DiagonalMatrix.h #815003:815004
@@ -49,7 +49,7 @@
     ColsAtCompileTime = CoeffsVectorType::SizeAtCompileTime,
     MaxRowsAtCompileTime = CoeffsVectorType::MaxSizeAtCompileTime,
     MaxColsAtCompileTime = CoeffsVectorType::MaxSizeAtCompileTime,
-    Flags = _CoeffsVectorTypeTypeNested::Flags & HereditaryBits,
+    Flags = _CoeffsVectorTypeTypeNested::Flags & HereditaryBits | Diagonal,
     CoeffReadCost = _CoeffsVectorTypeTypeNested::CoeffReadCost
   };
 };
--- branches/work/eigen2/Eigen/src/Core/MatrixBase.h #815003:815004
@@ -544,6 +544,7 @@
     const CwiseUnaryOp<ei_scalar_sin_op<typename ei_traits<Derived>::Scalar>, Derived> cwiseSin() const;
     const CwiseUnaryOp<ei_scalar_pow_op<typename ei_traits<Derived>::Scalar>, Derived>
     cwisePow(const Scalar& exponent) const;
+    const CwiseUnaryOp<ei_scalar_inverse_op<typename ei_traits<Derived>::Scalar>, Derived> cwiseInverse() const;
 
     template<typename OtherDerived>
     const CwiseBinaryOp<std::less<typename ei_traits<Derived>::Scalar>, Derived, OtherDerived>
--- branches/work/eigen2/Eigen/src/Core/Product.h #815003:815004
@@ -147,6 +147,7 @@
   enum{ value =  Lhs::MaxRowsAtCompileTime >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
               && Rhs::MaxColsAtCompileTime >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
               && Lhs::MaxColsAtCompileTime >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
+              && Rhs::Flags&Diagonal!=Diagonal
               ? CacheFriendlyProduct : NormalProduct };
 };
 
@@ -259,25 +260,40 @@
 
     const Scalar _coeff(int row, int col) const
     {
-      Scalar res;
-      const bool unroll = CoeffReadCost <= EIGEN_UNROLLING_LIMIT;
-      ei_product_impl<Lhs::ColsAtCompileTime-1,
-                          unroll ? Lhs::ColsAtCompileTime : Dynamic,
-                          _LhsNested, _RhsNested>
-        ::run(row, col, m_lhs, m_rhs, res);
-      return res;
+      if ((Rhs::Flags&Diagonal)==Diagonal)
+      {
+        return  m_lhs.coeff(row, col) * m_rhs.coeff(col, col);
+      }
+      else
+      {
+        Scalar res;
+        const bool unroll = CoeffReadCost <= EIGEN_UNROLLING_LIMIT;
+        ei_product_impl<Lhs::ColsAtCompileTime-1,
+                            unroll ? Lhs::ColsAtCompileTime : Dynamic,
+                            _LhsNested, _RhsNested>
+          ::run(row, col, m_lhs, m_rhs, res);
+        return res;
+      }
     }
 
     template<int LoadMode>
     const PacketScalar _packetCoeff(int row, int col) const
     {
-      const bool unroll = CoeffReadCost <= EIGEN_UNROLLING_LIMIT;
-      PacketScalar res;
-      ei_packet_product_impl<Flags&RowMajorBit ? true : false, Lhs::ColsAtCompileTime-1,
-                          unroll ? Lhs::ColsAtCompileTime : Dynamic,
-                          _LhsNested, _RhsNested, PacketScalar>
-        ::run(row, col, m_lhs, m_rhs, res);
-      return res;
+      if ((Rhs::Flags&Diagonal)==Diagonal)
+      {
+        assert(_LhsNested::Flags&RowMajorBit==0);
+        return ei_pmul(m_lhs.template packetCoeff<LoadMode>(row, col), ei_pset1(m_rhs.coeff(col, col)));
+      }
+      else
+      {
+        const bool unroll = CoeffReadCost <= EIGEN_UNROLLING_LIMIT;
+        PacketScalar res;
+        ei_packet_product_impl<Flags&RowMajorBit ? true : false, Lhs::ColsAtCompileTime-1,
+                            unroll ? Lhs::ColsAtCompileTime : Dynamic,
+                            _LhsNested, _RhsNested, PacketScalar>
+          ::run(row, col, m_lhs, m_rhs, res);
+        return res;
+      }
     }
 
     template<typename Lhs_, typename Rhs_, int EvalMode_, typename DestDerived_, bool DirectAccess_>
--- branches/work/eigen2/Eigen/src/Core/util/Constants.h #815003:815004
@@ -66,6 +66,7 @@
 // additional possible values for the Mode parameter of extract()
 const unsigned int UnitUpper = UpperTriangularBit | UnitDiagBit;
 const unsigned int UnitLower = LowerTriangularBit | UnitDiagBit;
+const unsigned int Diagonal = Upper | Lower;
 
 
 
--- branches/work/eigen2/Eigen/src/Core/util/ForwardDeclarations.h #815003:815004
@@ -67,6 +67,7 @@
 template<typename Scalar> struct ei_scalar_cos_op;
 template<typename Scalar> struct ei_scalar_sin_op;
 template<typename Scalar> struct ei_scalar_pow_op;
+template<typename Scalar> struct ei_scalar_inverse_op;
 template<typename Scalar, typename NewType> struct ei_scalar_cast_op;
 template<typename Scalar, bool IsVectorizable> struct ei_scalar_multiple_op;
 template<typename Scalar> struct ei_scalar_quotient1_op;
--- branches/work/eigen2/Eigen/src/Core/util/Meta.h #815003:815004
@@ -212,8 +212,7 @@
 
 template<unsigned int Flags> struct ei_are_flags_consistent
 {
-  enum { ret = !( (Flags&UnitDiagBit && Flags&ZeroDiagBit)
-                  || (Flags&UpperTriangularBit && Flags&LowerTriangularBit) )
+  enum { ret = !( (Flags&UnitDiagBit && Flags&ZeroDiagBit) )
   };
 };
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic