1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARTIAL_REDUX_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_PARTIAL_REDUX_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class PartialReduxExpr
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Generic expression of a partially reduxed matrix
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \tparam MatrixType the type of the matrix we are applying the redux operation
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \tparam MemberOp type of the member functor
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \tparam Direction indicates the direction of the redux (#Vertical or #Horizontal)
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class represents an expression of a partial redux operator of a matrix.
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * It is the return type of some VectorwiseOp functions,
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and most of the time this is the only way it is used.
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class VectorwiseOp
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate< typename MatrixType, typename MemberOp, int Direction>
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass PartialReduxExpr;
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, typename MemberOp, int Direction>
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<PartialReduxExpr<MatrixType, MemberOp, Direction> >
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : traits<MatrixType>
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MemberOp::result_type Scalar;
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename traits<MatrixType>::StorageKind StorageKind;
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename traits<MatrixType>::XprKind XprKind;
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Scalar InputScalar;
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename nested<MatrixType>::type MatrixTypeNested;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::RowsAtCompileTime,
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::ColsAtCompileTime,
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MaxRowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::MaxRowsAtCompileTime,
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MaxColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::MaxColsAtCompileTime,
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Flags0 = (unsigned int)_MatrixTypeNested::Flags & HereditaryBits,
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Flags = (Flags0 & ~RowMajorBit) | (RowsAtCompileTime == 1 ? RowMajorBit : 0),
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    TraversalSize = Direction==Vertical ? RowsAtCompileTime : ColsAtCompileTime
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #if EIGEN_GNUC_AT_LEAST(3,4)
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MemberOp::template Cost<InputScalar,int(TraversalSize)> CostOpType;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #else
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MemberOp::template Cost<InputScalar,TraversalSize> CostOpType;
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CoeffReadCost = TraversalSize * traits<_MatrixTypeNested>::CoeffReadCost + int(CostOpType::value)
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate< typename MatrixType, typename MemberOp, int Direction>
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass PartialReduxExpr : internal::no_assignment_operator,
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public internal::dense_xpr_base< PartialReduxExpr<MatrixType, MemberOp, Direction> >::type
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::dense_xpr_base<PartialReduxExpr>::type Base;
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(PartialReduxExpr)
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<PartialReduxExpr>::MatrixTypeNested MatrixTypeNested;
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<PartialReduxExpr>::_MatrixTypeNested _MatrixTypeNested;
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    PartialReduxExpr(const MatrixType& mat, const MemberOp& func = MemberOp())
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      : m_matrix(mat), m_functor(func) {}
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index rows() const { return (Direction==Vertical   ? 1 : m_matrix.rows()); }
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index cols() const { return (Direction==Horizontal ? 1 : m_matrix.cols()); }
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE const Scalar coeff(Index i, Index j) const
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if (Direction==Vertical)
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_functor(m_matrix.col(j));
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      else
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_functor(m_matrix.row(i));
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Scalar coeff(Index index) const
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if (Direction==Vertical)
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_functor(m_matrix.col(index));
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      else
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_functor(m_matrix.row(index));
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MatrixTypeNested m_matrix;
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MemberOp m_functor;
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MEMBER_FUNCTOR(MEMBER,COST)                               \
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template <typename ResultType>                                        \
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  struct member_##MEMBER {                                           \
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER)                         \
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef ResultType result_type;                                     \
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Scalar, int Size> struct Cost                     \
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { enum { value = COST }; };                                         \
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename XprType>                                          \
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE ResultType operator()(const XprType& mat) const \
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return mat.MEMBER(); } \
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(squaredNorm, Size * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(norm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(stableNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(blueNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(hypotNorm, (Size-1) * functor_traits<scalar_hypot_op<Scalar> >::Cost );
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost);
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(mean, (Size-1)*NumTraits<Scalar>::AddCost + NumTraits<Scalar>::MulCost);
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits<Scalar>::AddCost);
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits<Scalar>::AddCost);
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(count, (Size-1)*NumTraits<Scalar>::AddCost);
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(prod, (Size-1)*NumTraits<Scalar>::MulCost);
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename BinaryOp, typename Scalar>
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct member_redux {
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename result_of<
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                     BinaryOp(Scalar)
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   >::type  result_type;
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename _Scalar, int Size> struct Cost
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  { enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  member_redux(const BinaryOp func) : m_functor(func) {}
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename Derived>
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  inline result_type operator()(const DenseBase<Derived>& mat) const
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  { return mat.redux(m_functor); }
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const BinaryOp m_functor;
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class VectorwiseOp
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Pseudo expression providing partial reduction operations
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param ExpressionType the type of the object on which to do partial reductions
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param Direction indicates the direction of the redux (#Vertical or #Horizontal)
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class represents a pseudo expression with partial reduction features.
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * It is the return type of DenseBase::colwise() and DenseBase::rowwise()
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and most of the time this is the only way it is used.
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_colwise.cpp
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_colwise.out
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa DenseBase::colwise(), DenseBase::rowwise(), class PartialReduxExpr
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, int Direction> class VectorwiseOp
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::Scalar Scalar;
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::RealScalar RealScalar;
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::Index Index;
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        ExpressionType, ExpressionType&>::type ExpressionTypeNested;
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::remove_all<ExpressionTypeNested>::type ExpressionTypeNestedCleaned;
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<template<typename _Scalar> class Functor,
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      typename Scalar=typename internal::traits<ExpressionType>::Scalar> struct ReturnType
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef PartialReduxExpr<ExpressionType,
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               Functor<Scalar>,
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               Direction
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                              > Type;
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename BinaryOp> struct ReduxReturnType
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef PartialReduxExpr<ExpressionType,
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               internal::member_redux<BinaryOp,typename internal::traits<ExpressionType>::Scalar>,
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               Direction
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                              > Type;
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      IsVertical   = (Direction==Vertical) ? 1 : 0,
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      IsHorizontal = (Direction==Horizontal) ? 1 : 0
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \returns the i-th subvector according to the \c Direction */
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<Direction==Vertical,
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               typename ExpressionType::ColXpr,
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               typename ExpressionType::RowXpr>::type SubVector;
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    SubVector subVector(Index i)
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return SubVector(m_matrix.derived(),i);
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \returns the number of subvectors in the direction \c Direction */
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index subVectors() const
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return Direction==Vertical?m_matrix.cols():m_matrix.rows(); }
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> struct ExtendedType {
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef Replicate<OtherDerived,
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        Direction==Vertical   ? 1 : ExpressionType::RowsAtCompileTime,
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        Direction==Horizontal ? 1 : ExpressionType::ColsAtCompileTime> Type;
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Replicates a vector to match the size of \c *this */
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename ExtendedType<OtherDerived>::Type
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    extendedTo(const DenseBase<OtherDerived>& other) const
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Vertical, OtherDerived::MaxColsAtCompileTime==1),
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Horizontal, OtherDerived::MaxRowsAtCompileTime==1),
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return typename ExtendedType<OtherDerived>::Type
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      (other.derived(),
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       Direction==Vertical   ? 1 : m_matrix.rows(),
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       Direction==Horizontal ? 1 : m_matrix.cols());
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline VectorwiseOp(ExpressionType& matrix) : m_matrix(matrix) {}
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal */
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const ExpressionType& _expression() const { return m_matrix; }
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row or column vector expression of \c *this reduxed by \a func
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * The template parameter \a BinaryOp is the type of the functor
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of the custom redux operator. Note that func must be an associative operator.
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa class VectorwiseOp, DenseBase::colwise(), DenseBase::rowwise()
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename BinaryOp>
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReduxReturnType<BinaryOp>::Type
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    redux(const BinaryOp& func = BinaryOp()) const
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return typename ReduxReturnType<BinaryOp>::Type(_expression(), func); }
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the smallest coefficient
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_minCoeff.cpp
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_minCoeff.out
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::minCoeff() */
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_minCoeff>::Type minCoeff() const
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the largest coefficient
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_maxCoeff.cpp
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_maxCoeff.out
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::maxCoeff() */
273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_maxCoeff>::Type maxCoeff() const
274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the squared norm
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_squaredNorm.cpp
280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_squaredNorm.out
281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::squaredNorm() */
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_squaredNorm,RealScalar>::Type squaredNorm() const
284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_norm.cpp
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_norm.out
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::norm() */
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_norm,RealScalar>::Type norm() const
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression, using
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * blue's algorithm.
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::blueNorm() */
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_blueNorm,RealScalar>::Type blueNorm() const
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression, avoiding
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * underflow and overflow.
309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::stableNorm() */
311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_stableNorm,RealScalar>::Type stableNorm() const
312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression, avoiding
317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * underflow and overflow using a concatenation of hypot() calls.
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::hypotNorm() */
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_hypotNorm,RealScalar>::Type hypotNorm() const
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the sum
324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_sum.cpp
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_sum.out
328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::sum() */
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_sum>::Type sum() const
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the mean
334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * of each column (or row) of the referenced expression.
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    *
336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * \sa DenseBase::mean() */
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_mean>::Type mean() const
338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression representing
341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * whether \b all coefficients of each respective column (or row) are \c true.
342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::all() */
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_all>::Type all() const
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression representing
348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * whether \b at \b least one coefficient of each respective column (or row) is \c true.
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::any() */
351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_any>::Type any() const
352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression representing
355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * the number of \c true coefficients of each respective column (or row).
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_count.cpp
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_count.out
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::count() */
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const PartialReduxExpr<ExpressionType, internal::member_count<Index>, Direction> count() const
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the product
365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_prod.cpp
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_prod.out
369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::prod() */
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReturnType<internal::member_prod>::Type prod() const
372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return _expression(); }
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a matrix expression
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * where each column (or row) are reversed.
377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include Vectorwise_reverse.cpp
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude Vectorwise_reverse.out
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::reverse() */
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Reverse<ExpressionType, Direction> reverse() const
383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return Reverse<ExpressionType, Direction>( _expression() ); }
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Replicate<ExpressionType,Direction==Vertical?Dynamic:1,Direction==Horizontal?Dynamic:1> ReplicateReturnType;
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ReplicateReturnType replicate(Index factor) const;
387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /**
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \return an expression of the replication of each column (or row) of \c *this
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include DirectionWise_replicate.cpp
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude DirectionWise_replicate.out
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa VectorwiseOp::replicate(Index), DenseBase::replicate(), class Replicate
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // NOTE implemented here because of sunstudio's compilation errors
397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Factor> const Replicate<ExpressionType,(IsVertical?Factor:1),(IsHorizontal?Factor:1)>
398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    replicate(Index factor = Factor) const
399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Replicate<ExpressionType,Direction==Vertical?Factor:1,Direction==Horizontal?Factor:1>
401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);
402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Artithmetic operators ///////////
405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Copies the vector \a other to each subvector of \c *this */
407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator=(const DenseBase<OtherDerived>& other)
409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      //eigen_assert((m_matrix.isNull()) == (other.isNull())); FIXME
413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix = extendedTo(other.derived()));
414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Adds the vector \a other to each subvector of \c *this */
417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator+=(const DenseBase<OtherDerived>& other)
419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix += extendedTo(other.derived()));
423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Substracts the vector \a other to each subvector of \c *this */
426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator-=(const DenseBase<OtherDerived>& other)
428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix -= extendedTo(other.derived()));
432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Multiples each subvector of \c *this by the vector \a other */
435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator*=(const DenseBase<OtherDerived>& other)
437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_matrix *= extendedTo(other.derived());
442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix);
443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Divides each subvector of \c *this by the vector \a other */
446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator/=(const DenseBase<OtherDerived>& other)
448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_matrix /= extendedTo(other.derived());
453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix);
454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression of the sum of the vector \a other to each subvector of \c *this */
457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> EIGEN_STRONG_INLINE
458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_sum_op<Scalar>,
459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator+(const DenseBase<OtherDerived>& other) const
462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix + extendedTo(other.derived());
466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression of the difference between each subvector of \c *this and the vector \a other */
469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_difference_op<Scalar>,
471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator-(const DenseBase<OtherDerived>& other) const
474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix - extendedTo(other.derived());
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression where each subvector is the product of the vector \a other
481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * by the corresponding subvector of \c *this */
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> EIGEN_STRONG_INLINE
483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_product_op<Scalar>,
484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator*(const DenseBase<OtherDerived>& other) const
487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix * extendedTo(other.derived());
492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression where each subvector is the quotient of the corresponding
495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * subvector of \c *this by the vector \a other */
496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator/(const DenseBase<OtherDerived>& other) const
501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix / extendedTo(other.derived());
506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Geometry module ///////////
509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Homogeneous<ExpressionType,Direction> homogeneous() const;
512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::PlainObject CrossReturnType;
515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const CrossReturnType cross(const MatrixBase<OtherDerived>& other) const;
517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      HNormalized_Size = Direction==Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime
520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                             : internal::traits<ExpressionType>::ColsAtCompileTime,
521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      HNormalized_SizeMinusOne = HNormalized_Size==Dynamic ? Dynamic : HNormalized_Size-1
522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const ExpressionType,
524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Vertical   ? int(HNormalized_SizeMinusOne)
525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                        : int(internal::traits<ExpressionType>::RowsAtCompileTime),
526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Horizontal ? int(HNormalized_SizeMinusOne)
527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                        : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            HNormalized_Block;
529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const ExpressionType,
530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Vertical   ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime),
531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            HNormalized_Factors;
533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseBinaryOp<internal::scalar_quotient_op<typename internal::traits<ExpressionType>::Scalar>,
534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const HNormalized_Block,
535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Replicate<HNormalized_Factors,
536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Vertical   ? HNormalized_SizeMinusOne : 1,
537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Horizontal ? HNormalized_SizeMinusOne : 1> >
538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            HNormalizedReturnType;
539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const HNormalizedReturnType hnormalized() const;
541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionTypeNested m_matrix;
544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations
547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_colwise.cpp
549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_colwise.out
550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename DenseBase<Derived>::ConstColwiseReturnType
555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::colwise() const
556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::ColwiseReturnType
566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::colwise()
567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations
572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_rowwise.cpp
574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_rowwise.out
575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename DenseBase<Derived>::ConstRowwiseReturnType
580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::rowwise() const
581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::RowwiseReturnType
591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::rowwise()
592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_PARTIAL_REDUX_H
599