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
142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace 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  enum {
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::RowsAtCompileTime,
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::ColsAtCompileTime,
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MaxRowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::MaxRowsAtCompileTime,
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MaxColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::MaxColsAtCompileTime,
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = RowsAtCompileTime == 1 ? RowMajorBit : 0,
507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    TraversalSize = Direction==Vertical ? MatrixType::RowsAtCompileTime :  MatrixType::ColsAtCompileTime
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate< typename MatrixType, typename MemberOp, int Direction>
562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass PartialReduxExpr : public internal::dense_xpr_base< PartialReduxExpr<MatrixType, MemberOp, Direction> >::type,
572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                         internal::no_assignment_operator
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::dense_xpr_base<PartialReduxExpr>::type Base;
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(PartialReduxExpr)
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit PartialReduxExpr(const MatrixType& mat, const MemberOp& func = MemberOp())
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      : m_matrix(mat), m_functor(func) {}
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index rows() const { return (Direction==Vertical   ? 1 : m_matrix.rows()); }
702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index cols() const { return (Direction==Horizontal ? 1 : m_matrix.cols()); }
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename MatrixType::Nested nestedExpression() const { return m_matrix; }
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const MemberOp& functor() const { return m_functor; }
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename MatrixType::Nested m_matrix;
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MemberOp m_functor;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MEMBER_FUNCTOR(MEMBER,COST)                               \
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template <typename ResultType>                                        \
867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  struct member_##MEMBER {                                              \
877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER)                            \
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef ResultType result_type;                                     \
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Scalar, int Size> struct Cost                     \
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { enum { value = COST }; };                                         \
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename XprType>                                          \
922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                               \
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ResultType operator()(const XprType& mat) const                     \
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return mat.MEMBER(); } \
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(squaredNorm, Size * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(norm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(stableNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(blueNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(hypotNorm, (Size-1) * functor_traits<scalar_hypot_op<Scalar> >::Cost );
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost);
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(mean, (Size-1)*NumTraits<Scalar>::AddCost + NumTraits<Scalar>::MulCost);
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits<Scalar>::AddCost);
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits<Scalar>::AddCost);
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(count, (Size-1)*NumTraits<Scalar>::AddCost);
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MEMBER_FUNCTOR(prod, (Size-1)*NumTraits<Scalar>::MulCost);
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate <int p, typename ResultType>
1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct member_lpnorm {
1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef ResultType result_type;
1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<typename Scalar, int Size> struct Cost
1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { enum { value = (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost }; };
1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC member_lpnorm() {}
1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<typename XprType>
1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC inline ResultType operator()(const XprType& mat) const
1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { return mat.template lpNorm<p>(); }
1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename BinaryOp, typename Scalar>
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct member_redux {
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename result_of<
1272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                     BinaryOp(const Scalar&,const Scalar&)
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   >::type  result_type;
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename _Scalar, int Size> struct Cost
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  { enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };
1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit member_redux(const BinaryOp func) : m_functor(func) {}
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  template<typename Derived>
1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC inline result_type operator()(const DenseBase<Derived>& mat) const
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  { return mat.redux(m_functor); }
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const BinaryOp m_functor;
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class VectorwiseOp
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Pseudo expression providing partial reduction operations
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
1442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam ExpressionType the type of the object on which to do partial reductions
1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam Direction indicates the direction of the redux (#Vertical or #Horizontal)
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class represents a pseudo expression with partial reduction features.
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * It is the return type of DenseBase::colwise() and DenseBase::rowwise()
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and most of the time this is the only way it is used.
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_colwise.cpp
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_colwise.out
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa DenseBase::colwise(), DenseBase::rowwise(), class PartialReduxExpr
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, int Direction> class VectorwiseOp
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::Scalar Scalar;
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::RealScalar RealScalar;
1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename internal::ref_selector<ExpressionType>::non_const_type ExpressionTypeNested;
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::remove_all<ExpressionTypeNested>::type ExpressionTypeNestedCleaned;
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<template<typename _Scalar> class Functor,
1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                      typename Scalar_=Scalar> struct ReturnType
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef PartialReduxExpr<ExpressionType,
1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                               Functor<Scalar_>,
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               Direction
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                              > Type;
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename BinaryOp> struct ReduxReturnType
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef PartialReduxExpr<ExpressionType,
1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                               internal::member_redux<BinaryOp,Scalar>,
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               Direction
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                              > Type;
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
1842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      isVertical   = (Direction==Vertical) ? 1 : 0,
1852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      isHorizontal = (Direction==Horizontal) ? 1 : 0
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename internal::conditional<isVertical,
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               typename ExpressionType::ColXpr,
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               typename ExpressionType::RowXpr>::type SubVector;
1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \internal
1942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * \returns the i-th subvector according to the \c Direction */
1952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    SubVector subVector(Index i)
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return SubVector(m_matrix.derived(),i);
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \returns the number of subvectors in the direction \c Direction */
2032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index subVectors() const
2052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return isVertical?m_matrix.cols():m_matrix.rows(); }
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> struct ExtendedType {
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef Replicate<OtherDerived,
2092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                        isVertical   ? 1 : ExpressionType::RowsAtCompileTime,
2102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                        isHorizontal ? 1 : ExpressionType::ColsAtCompileTime> Type;
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Replicates a vector to match the size of \c *this */
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename ExtendedType<OtherDerived>::Type
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    extendedTo(const DenseBase<OtherDerived>& other) const
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
2202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isVertical, OtherDerived::MaxColsAtCompileTime==1),
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
2222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isHorizontal, OtherDerived::MaxRowsAtCompileTime==1),
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return typename ExtendedType<OtherDerived>::Type
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      (other.derived(),
2262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                       isVertical   ? 1 : m_matrix.rows(),
2272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                       isHorizontal ? 1 : m_matrix.cols());
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
2292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    template<typename OtherDerived> struct OppositeExtendedType {
2317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      typedef Replicate<OtherDerived,
2322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                        isHorizontal ? 1 : ExpressionType::RowsAtCompileTime,
2332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                        isVertical   ? 1 : ExpressionType::ColsAtCompileTime> Type;
2347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    };
2357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** \internal
2377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * Replicates a vector in the opposite direction to match the size of \c *this */
2387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    template<typename OtherDerived>
2392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    typename OppositeExtendedType<OtherDerived>::Type
2417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    extendedToOpposite(const DenseBase<OtherDerived>& other) const
2427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
2432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isHorizontal, OtherDerived::MaxColsAtCompileTime==1),
2447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
2452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(isVertical, OtherDerived::MaxRowsAtCompileTime==1),
2467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
2477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return typename OppositeExtendedType<OtherDerived>::Type
2487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                      (other.derived(),
2492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                       isHorizontal  ? 1 : m_matrix.rows(),
2502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                       isVertical    ? 1 : m_matrix.cols());
2517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
2542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit inline VectorwiseOp(ExpressionType& matrix) : m_matrix(matrix) {}
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal */
2582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const ExpressionType& _expression() const { return m_matrix; }
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row or column vector expression of \c *this reduxed by \a func
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * The template parameter \a BinaryOp is the type of the functor
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of the custom redux operator. Note that func must be an associative operator.
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa class VectorwiseOp, DenseBase::colwise(), DenseBase::rowwise()
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename BinaryOp>
2692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ReduxReturnType<BinaryOp>::Type
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    redux(const BinaryOp& func = BinaryOp()) const
2722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return typename ReduxReturnType<BinaryOp>::Type(_expression(), internal::member_redux<BinaryOp,Scalar>(func)); }
2732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_minCoeff>::Type MinCoeffReturnType;
2752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_maxCoeff>::Type MaxCoeffReturnType;
2762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_squaredNorm,RealScalar>::Type SquaredNormReturnType;
2772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_norm,RealScalar>::Type NormReturnType;
2782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_blueNorm,RealScalar>::Type BlueNormReturnType;
2792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_stableNorm,RealScalar>::Type StableNormReturnType;
2802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_hypotNorm,RealScalar>::Type HypotNormReturnType;
2812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_sum>::Type SumReturnType;
2822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_mean>::Type MeanReturnType;
2832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_all>::Type AllReturnType;
2842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_any>::Type AnyReturnType;
2852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef PartialReduxExpr<ExpressionType, internal::member_count<Index>, Direction> CountReturnType;
2862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename ReturnType<internal::member_prod>::Type ProdReturnType;
2872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef Reverse<const ExpressionType, Direction> ConstReverseReturnType;
2882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef Reverse<ExpressionType, Direction> ReverseReturnType;
2892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<int p> struct LpNormReturnType {
2912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      typedef PartialReduxExpr<ExpressionType, internal::member_lpnorm<p,RealScalar>,Direction> Type;
2922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    };
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the smallest coefficient
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
2962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      *
2977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \warning the result is undefined if \c *this contains NaN.
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_minCoeff.cpp
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_minCoeff.out
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::minCoeff() */
3032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const MinCoeffReturnType minCoeff() const
3052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return MinCoeffReturnType(_expression()); }
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the largest coefficient
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
3092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      *
3107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \warning the result is undefined if \c *this contains NaN.
311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_maxCoeff.cpp
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_maxCoeff.out
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::maxCoeff() */
3162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const MaxCoeffReturnType maxCoeff() const
3182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return MaxCoeffReturnType(_expression()); }
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the squared norm
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
3222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This is a vector with real entries, even if the original matrix has complex entries.
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_squaredNorm.cpp
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_squaredNorm.out
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::squaredNorm() */
3282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const SquaredNormReturnType squaredNorm() const
3302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return SquaredNormReturnType(_expression()); }
3312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \returns a row (or column) vector expression of the norm
3332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * of each column (or row) of the referenced expression.
3342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This is a vector with real entries, even if the original matrix has complex entries.
3352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      *
3362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * Example: \include PartialRedux_norm.cpp
3372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * Output: \verbinclude PartialRedux_norm.out
3382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      *
3392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * \sa DenseBase::norm() */
3402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const NormReturnType norm() const
3422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return NormReturnType(_expression()); }
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
3462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This is a vector with real entries, even if the original matrix has complex entries.
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_norm.cpp
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_norm.out
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::norm() */
3522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<int p>
3532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const typename LpNormReturnType<p>::Type lpNorm() const
3552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return typename LpNormReturnType<p>::Type(_expression()); }
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression, using
3602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * Blue's algorithm.
3612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This is a vector with real entries, even if the original matrix has complex entries.
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::blueNorm() */
3642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const BlueNormReturnType blueNorm() const
3662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return BlueNormReturnType(_expression()); }
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression, avoiding
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * underflow and overflow.
3722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This is a vector with real entries, even if the original matrix has complex entries.
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::stableNorm() */
3752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const StableNormReturnType stableNorm() const
3772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return StableNormReturnType(_expression()); }
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the norm
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression, avoiding
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * underflow and overflow using a concatenation of hypot() calls.
3832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This is a vector with real entries, even if the original matrix has complex entries.
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::hypotNorm() */
3862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const HypotNormReturnType hypotNorm() const
3882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return HypotNormReturnType(_expression()); }
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the sum
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_sum.cpp
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_sum.out
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::sum() */
3972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const SumReturnType sum() const
3992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return SumReturnType(_expression()); }
400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the mean
402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * of each column (or row) of the referenced expression.
403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    *
404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    * \sa DenseBase::mean() */
4052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const MeanReturnType mean() const
4072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return MeanReturnType(_expression()); }
408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression representing
410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * whether \b all coefficients of each respective column (or row) are \c true.
4112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This expression can be assigned to a vector with entries of type \c bool.
412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::all() */
4142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const AllReturnType all() const
4162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return AllReturnType(_expression()); }
417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression representing
419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * whether \b at \b least one coefficient of each respective column (or row) is \c true.
4202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This expression can be assigned to a vector with entries of type \c bool.
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::any() */
4232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const AnyReturnType any() const
4252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return AnyReturnType(_expression()); }
426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression representing
428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * the number of \c true coefficients of each respective column (or row).
4292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * This expression can be assigned to a vector whose entries have the same type as is used to
4302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * index entries of the original matrix; for dense matrices, this is \c std::ptrdiff_t .
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_count.cpp
433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_count.out
434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::count() */
4362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const CountReturnType count() const
4382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return CountReturnType(_expression()); }
439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a row (or column) vector expression of the product
441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * of each column (or row) of the referenced expression.
442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include PartialRedux_prod.cpp
444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude PartialRedux_prod.out
445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::prod() */
4472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const ProdReturnType prod() const
4492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return ProdReturnType(_expression()); }
450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a matrix expression
453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * where each column (or row) are reversed.
454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include Vectorwise_reverse.cpp
456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude Vectorwise_reverse.out
457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa DenseBase::reverse() */
4592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const ConstReverseReturnType reverse() const
4612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return ConstReverseReturnType( _expression() ); }
462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \returns a writable matrix expression
4642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * where each column (or row) are reversed.
4652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      *
4662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * \sa reverse() const */
4672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ReverseReturnType reverse()
4692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return ReverseReturnType( _expression() ); }
4702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef Replicate<ExpressionType,(isVertical?Dynamic:1),(isHorizontal?Dynamic:1)> ReplicateReturnType;
4722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ReplicateReturnType replicate(Index factor) const;
474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /**
476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \return an expression of the replication of each column (or row) of \c *this
477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Example: \include DirectionWise_replicate.cpp
479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Output: \verbinclude DirectionWise_replicate.out
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa VectorwiseOp::replicate(Index), DenseBase::replicate(), class Replicate
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // NOTE implemented here because of sunstudio's compilation errors
4842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // isVertical*Factor+isHorizontal instead of (isVertical?Factor:1) to handle CUDA bug with ternary operator
4852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<int Factor> const Replicate<ExpressionType,isVertical*Factor+isHorizontal,isHorizontal*Factor+isVertical>
4862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    replicate(Index factor = Factor) const
488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
4892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return Replicate<ExpressionType,(isVertical?Factor:1),(isHorizontal?Factor:1)>
4902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          (_expression(),isVertical?factor:1,isHorizontal?factor:1);
491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Artithmetic operators ///////////
494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Copies the vector \a other to each subvector of \c *this */
496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
4972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator=(const DenseBase<OtherDerived>& other)
499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      //eigen_assert((m_matrix.isNull()) == (other.isNull())); FIXME
503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix = extendedTo(other.derived()));
504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Adds the vector \a other to each subvector of \c *this */
507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
5082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator+=(const DenseBase<OtherDerived>& other)
510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix += extendedTo(other.derived()));
514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Substracts the vector \a other to each subvector of \c *this */
517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
5182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator-=(const DenseBase<OtherDerived>& other)
520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix -= extendedTo(other.derived()));
524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Multiples each subvector of \c *this by the vector \a other */
527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
5282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator*=(const DenseBase<OtherDerived>& other)
530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_matrix *= extendedTo(other.derived());
535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix);
536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Divides each subvector of \c *this by the vector \a other */
539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
5402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& operator/=(const DenseBase<OtherDerived>& other)
542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_matrix /= extendedTo(other.derived());
547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return const_cast<ExpressionType&>(m_matrix);
548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression of the sum of the vector \a other to each subvector of \c *this */
5512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
5522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CwiseBinaryOp<internal::scalar_sum_op<Scalar,typename OtherDerived::Scalar>,
553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator+(const DenseBase<OtherDerived>& other) const
556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix + extendedTo(other.derived());
560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression of the difference between each subvector of \c *this and the vector \a other */
563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
5642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
5652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CwiseBinaryOp<internal::scalar_difference_op<Scalar,typename OtherDerived::Scalar>,
566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator-(const DenseBase<OtherDerived>& other) const
569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix - extendedTo(other.derived());
573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression where each subvector is the product of the vector \a other
576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * by the corresponding subvector of \c *this */
5772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_product_op<Scalar>,
579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
5812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator*(const DenseBase<OtherDerived>& other) const
583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix * extendedTo(other.derived());
588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Returns the expression where each subvector is the quotient of the corresponding
591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * subvector of \c *this by the vector \a other */
592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
5932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const ExpressionTypeNestedCleaned,
596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  const typename ExtendedType<OtherDerived>::Type>
597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator/(const DenseBase<OtherDerived>& other) const
598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix / extendedTo(other.derived());
603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
6042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \returns an expression where each column (or row) of the referenced matrix are normalized.
6067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * The referenced matrix is \b not modified.
6077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \sa MatrixBase::normalized(), normalize()
6087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      */
6092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
6107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
6117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                  const ExpressionTypeNestedCleaned,
6127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                  const typename OppositeExtendedType<typename ReturnType<internal::member_norm,RealScalar>::Type>::Type>
6137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    normalized() const { return m_matrix.cwiseQuotient(extendedToOpposite(this->norm())); }
6142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** Normalize in-place each row or columns of the referenced matrix.
6177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \sa MatrixBase::normalize(), normalized()
6187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      */
6192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC void normalize() {
6207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      m_matrix = this->normalized();
6217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
6232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline void reverseInPlace();
6242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Geometry module ///////////
626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
6272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef Homogeneous<ExpressionType,Direction> HomogeneousReturnType;
6282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
6292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    HomogeneousReturnType homogeneous() const;
630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::PlainObject CrossReturnType;
632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
6332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const CrossReturnType cross(const MatrixBase<OtherDerived>& other) const;
635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      HNormalized_Size = Direction==Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime
638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                             : internal::traits<ExpressionType>::ColsAtCompileTime,
639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      HNormalized_SizeMinusOne = HNormalized_Size==Dynamic ? Dynamic : HNormalized_Size-1
640c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
641c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const ExpressionType,
642c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Vertical   ? int(HNormalized_SizeMinusOne)
643c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                        : int(internal::traits<ExpressionType>::RowsAtCompileTime),
644c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Horizontal ? int(HNormalized_SizeMinusOne)
645c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                        : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
646c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            HNormalized_Block;
647c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const ExpressionType,
648c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Vertical   ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime),
649c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
650c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            HNormalized_Factors;
651c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseBinaryOp<internal::scalar_quotient_op<typename internal::traits<ExpressionType>::Scalar>,
652c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const HNormalized_Block,
653c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Replicate<HNormalized_Factors,
654c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Vertical   ? HNormalized_SizeMinusOne : 1,
655c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  Direction==Horizontal ? HNormalized_SizeMinusOne : 1> >
656c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            HNormalizedReturnType;
657c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
6582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
659c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const HNormalizedReturnType hnormalized() const;
660c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
661c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
662c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionTypeNested m_matrix;
663c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
664c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
6652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//const colwise moved to DenseBase.h due to CUDA compiler bug
6662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
667c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
668c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
669c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
670c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
671c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
672c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
673c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::ColwiseReturnType
674c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::colwise()
675c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
6762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  return ColwiseReturnType(derived());
677c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
678c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
6792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//const rowwise moved to DenseBase.h due to CUDA compiler bug
6802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
681c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
682c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
683c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
684c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
685c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
686c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
687c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::RowwiseReturnType
688c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::rowwise()
689c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
6902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  return RowwiseReturnType(derived());
691c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
692c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
693c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
694c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
695c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_PARTIAL_REDUX_H
696