1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_REPLICATE_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_REPLICATE_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType,int RowFactor,int ColFactor>
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<Replicate<MatrixType,RowFactor,ColFactor> >
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : traits<MatrixType>
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Scalar Scalar;
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename traits<MatrixType>::StorageKind StorageKind;
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename traits<MatrixType>::XprKind XprKind;
232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename ref_selector<MatrixType>::type MatrixTypeNested;
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RowsAtCompileTime = RowFactor==Dynamic || int(MatrixType::RowsAtCompileTime)==Dynamic
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      ? Dynamic
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      : RowFactor * MatrixType::RowsAtCompileTime,
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ColsAtCompileTime = ColFactor==Dynamic || int(MatrixType::ColsAtCompileTime)==Dynamic
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      ? Dynamic
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      : ColFactor * MatrixType::ColsAtCompileTime,
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   //FIXME we don't propagate the max sizes !!!
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MaxRowsAtCompileTime = RowsAtCompileTime,
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MaxColsAtCompileTime = ColsAtCompileTime,
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    IsRowMajor = MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1 ? 1
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath               : MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1 ? 0
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath               : (MatrixType::Flags & RowMajorBit) ? 1 : 0,
382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // FIXME enable DirectAccess with negative strides?
402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = IsRowMajor ? RowMajorBit : 0
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/**
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \class Replicate
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \ingroup Core_Module
482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \brief Expression of the multiple replication of a matrix or vector
502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam MatrixType the type of the object we are replicating
522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam RowFactor number of repetitions at compile time along the vertical direction, can be Dynamic.
532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam ColFactor number of repetitions at compile time along the horizontal direction, can be Dynamic.
542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * This class represents an expression of the multiple replication of a matrix or vector.
562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * It is the return type of DenseBase::replicate() and most of the time
572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * this is the only way it is used.
582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \sa DenseBase::replicate()
602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  */
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType,int RowFactor,int ColFactor> class Replicate
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public internal::dense_xpr_base< Replicate<MatrixType,RowFactor,ColFactor> >::type
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<Replicate>::MatrixTypeNested MatrixTypeNested;
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<Replicate>::_MatrixTypeNested _MatrixTypeNested;
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::dense_xpr_base<Replicate>::type Base;
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(Replicate)
702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename internal::remove_all<MatrixType>::type NestedExpression;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OriginalMatrixType>
732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline explicit Replicate(const OriginalMatrixType& matrix)
752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      : m_matrix(matrix), m_rowFactor(RowFactor), m_colFactor(ColFactor)
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value),
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_assert(RowFactor!=Dynamic && ColFactor!=Dynamic);
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OriginalMatrixType>
832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Replicate(const OriginalMatrixType& matrix, Index rowFactor, Index colFactor)
852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      : m_matrix(matrix), m_rowFactor(rowFactor), m_colFactor(colFactor)
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value),
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); }
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); }
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const _MatrixTypeNested& nestedExpression() const
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix;
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MatrixTypeNested m_matrix;
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const internal::variable_if_dynamic<Index, RowFactor> m_rowFactor;
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const internal::variable_if_dynamic<Index, ColFactor> m_colFactor;
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \return an expression of the replication of \c *this
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_replicate.cpp
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_replicate.out
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa VectorwiseOp::replicate(), DenseBase::replicate(Index,Index), class Replicate
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int RowFactor, int ColFactor>
118615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murrayconst Replicate<Derived,RowFactor,ColFactor>
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::replicate() const
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return Replicate<Derived,RowFactor,ColFactor>(derived());
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \return an expression of the replication of each column (or row) of \c *this
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include DirectionWise_replicate_int.cpp
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude DirectionWise_replicate_int.out
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, int Direction>
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathconst typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathVectorwiseOp<ExpressionType,Direction>::replicate(Index factor) const
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_REPLICATE_H
143