LCOV - code coverage report
Current view: top level - Core - DenseBase.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 8 11 72.7 %
Date: 1980-01-01 00:00:00 Functions: 124 133 93.2 %
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : // This file is part of Eigen, a lightweight C++ template library
       2                 :            : // for linear algebra.
       3                 :            : //
       4                 :            : // Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
       5                 :            : // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
       6                 :            : //
       7                 :            : // This Source Code Form is subject to the terms of the Mozilla
       8                 :            : // Public License v. 2.0. If a copy of the MPL was not distributed
       9                 :            : // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
      10                 :            : 
      11                 :            : #ifndef EIGEN_DENSEBASE_H
      12                 :            : #define EIGEN_DENSEBASE_H
      13                 :            : 
      14                 :            : namespace Eigen {
      15                 :            : 
      16                 :            : namespace internal {
      17                 :            : 
      18                 :            : // The index type defined by EIGEN_DEFAULT_DENSE_INDEX_TYPE must be a signed type.
      19                 :            : // This dummy function simply aims at checking that at compile time.
      20                 :            : static inline void check_DenseIndex_is_signed() {
      21                 :            :   EIGEN_STATIC_ASSERT(NumTraits<DenseIndex>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
      22                 :            : }
      23                 :            : 
      24                 :            : } // end namespace internal
      25                 :            : 
      26                 :            : /** \class DenseBase
      27                 :            :   * \ingroup Core_Module
      28                 :            :   *
      29                 :            :   * \brief Base class for all dense matrices, vectors, and arrays
      30                 :            :   *
      31                 :            :   * This class is the base that is inherited by all dense objects (matrix, vector, arrays,
      32                 :            :   * and related expression types). The common Eigen API for dense objects is contained in this class.
      33                 :            :   *
      34                 :            :   * \tparam Derived is the derived type, e.g., a matrix type or an expression.
      35                 :            :   *
      36                 :            :   * This class can be extended with the help of the plugin mechanism described on the page
      37                 :            :   * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_DENSEBASE_PLUGIN.
      38                 :            :   *
      39                 :            :   * \sa \blank \ref TopicClassHierarchy
      40                 :            :   */
      41                 :            : template<typename Derived> class DenseBase
      42                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
      43                 :            :   : public DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value>
      44                 :            : #else
      45                 :            :   : public DenseCoeffsBase<Derived,DirectWriteAccessors>
      46                 :            : #endif // not EIGEN_PARSED_BY_DOXYGEN
      47                 :            : {
      48                 :            :   public:
      49                 :            : 
      50                 :            :     /** Inner iterator type to iterate over the coefficients of a row or column.
      51                 :            :       * \sa class InnerIterator
      52                 :            :       */
      53                 :            :     typedef Eigen::InnerIterator<Derived> InnerIterator;
      54                 :            : 
      55                 :            :     typedef typename internal::traits<Derived>::StorageKind StorageKind;
      56                 :            : 
      57                 :            :     /**
      58                 :            :       * \brief The type used to store indices
      59                 :            :       * \details This typedef is relevant for types that store multiple indices such as
      60                 :            :       *          PermutationMatrix or Transpositions, otherwise it defaults to Eigen::Index
      61                 :            :       * \sa \blank \ref TopicPreprocessorDirectives, Eigen::Index, SparseMatrixBase.
      62                 :            :      */
      63                 :            :     typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
      64                 :            : 
      65                 :            :     /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc. */
      66                 :            :     typedef typename internal::traits<Derived>::Scalar Scalar;
      67                 :            : 
      68                 :            :     /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc.
      69                 :            :       *
      70                 :            :       * It is an alias for the Scalar type */
      71                 :            :     typedef Scalar value_type;
      72                 :            : 
      73                 :            :     typedef typename NumTraits<Scalar>::Real RealScalar;
      74                 :            :     typedef DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value> Base;
      75                 :            : 
      76                 :            :     using Base::derived;
      77                 :            :     using Base::const_cast_derived;
      78                 :            :     using Base::rows;
      79                 :            :     using Base::cols;
      80                 :            :     using Base::size;
      81                 :            :     using Base::rowIndexByOuterInner;
      82                 :            :     using Base::colIndexByOuterInner;
      83                 :            :     using Base::coeff;
      84                 :            :     using Base::coeffByOuterInner;
      85                 :            :     using Base::operator();
      86                 :            :     using Base::operator[];
      87                 :            :     using Base::x;
      88                 :            :     using Base::y;
      89                 :            :     using Base::z;
      90                 :            :     using Base::w;
      91                 :            :     using Base::stride;
      92                 :            :     using Base::innerStride;
      93                 :            :     using Base::outerStride;
      94                 :            :     using Base::rowStride;
      95                 :            :     using Base::colStride;
      96                 :            :     typedef typename Base::CoeffReturnType CoeffReturnType;
      97                 :            : 
      98                 :            :     enum {
      99                 :            : 
     100                 :            :       RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
     101                 :            :         /**< The number of rows at compile-time. This is just a copy of the value provided
     102                 :            :           * by the \a Derived type. If a value is not known at compile-time,
     103                 :            :           * it is set to the \a Dynamic constant.
     104                 :            :           * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
     105                 :            : 
     106                 :            :       ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
     107                 :            :         /**< The number of columns at compile-time. This is just a copy of the value provided
     108                 :            :           * by the \a Derived type. If a value is not known at compile-time,
     109                 :            :           * it is set to the \a Dynamic constant.
     110                 :            :           * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
     111                 :            : 
     112                 :            : 
     113                 :            :       SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
     114                 :            :                                                    internal::traits<Derived>::ColsAtCompileTime>::ret),
     115                 :            :         /**< This is equal to the number of coefficients, i.e. the number of
     116                 :            :           * rows times the number of columns, or to \a Dynamic if this is not
     117                 :            :           * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
     118                 :            : 
     119                 :            :       MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
     120                 :            :         /**< This value is equal to the maximum possible number of rows that this expression
     121                 :            :           * might have. If this expression might have an arbitrarily high number of rows,
     122                 :            :           * this value is set to \a Dynamic.
     123                 :            :           *
     124                 :            :           * This value is useful to know when evaluating an expression, in order to determine
     125                 :            :           * whether it is possible to avoid doing a dynamic memory allocation.
     126                 :            :           *
     127                 :            :           * \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime
     128                 :            :           */
     129                 :            : 
     130                 :            :       MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
     131                 :            :         /**< This value is equal to the maximum possible number of columns that this expression
     132                 :            :           * might have. If this expression might have an arbitrarily high number of columns,
     133                 :            :           * this value is set to \a Dynamic.
     134                 :            :           *
     135                 :            :           * This value is useful to know when evaluating an expression, in order to determine
     136                 :            :           * whether it is possible to avoid doing a dynamic memory allocation.
     137                 :            :           *
     138                 :            :           * \sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime
     139                 :            :           */
     140                 :            : 
     141                 :            :       MaxSizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::MaxRowsAtCompileTime,
     142                 :            :                                                       internal::traits<Derived>::MaxColsAtCompileTime>::ret),
     143                 :            :         /**< This value is equal to the maximum possible number of coefficients that this expression
     144                 :            :           * might have. If this expression might have an arbitrarily high number of coefficients,
     145                 :            :           * this value is set to \a Dynamic.
     146                 :            :           *
     147                 :            :           * This value is useful to know when evaluating an expression, in order to determine
     148                 :            :           * whether it is possible to avoid doing a dynamic memory allocation.
     149                 :            :           *
     150                 :            :           * \sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime
     151                 :            :           */
     152                 :            : 
     153                 :            :       IsVectorAtCompileTime = internal::traits<Derived>::RowsAtCompileTime == 1
     154                 :            :                            || internal::traits<Derived>::ColsAtCompileTime == 1,
     155                 :            :         /**< This is set to true if either the number of rows or the number of
     156                 :            :           * columns is known at compile-time to be equal to 1. Indeed, in that case,
     157                 :            :           * we are dealing with a column-vector (if there is only one column) or with
     158                 :            :           * a row-vector (if there is only one row). */
     159                 :            : 
     160                 :            :       NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0 : bool(IsVectorAtCompileTime) ? 1 : 2,
     161                 :            :         /**< This value is equal to Tensor::NumDimensions, i.e. 0 for scalars, 1 for vectors,
     162                 :            :          * and 2 for matrices.
     163                 :            :          */
     164                 :            : 
     165                 :            :       Flags = internal::traits<Derived>::Flags,
     166                 :            :         /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
     167                 :            :           * constructed from this one. See the \ref flags "list of flags".
     168                 :            :           */
     169                 :            : 
     170                 :            :       IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */
     171                 :            : 
     172                 :            :       InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
     173                 :            :                              : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
     174                 :            : 
     175                 :            :       InnerStrideAtCompileTime = internal::inner_stride_at_compile_time<Derived>::ret,
     176                 :            :       OuterStrideAtCompileTime = internal::outer_stride_at_compile_time<Derived>::ret
     177                 :            :     };
     178                 :            : 
     179                 :            :     typedef typename internal::find_best_packet<Scalar,SizeAtCompileTime>::type PacketScalar;
     180                 :            : 
     181                 :            :     enum { IsPlainObjectBase = 0 };
     182                 :            : 
     183                 :            :     /** The plain matrix type corresponding to this expression.
     184                 :            :       * \sa PlainObject */
     185                 :            :     typedef Matrix<typename internal::traits<Derived>::Scalar,
     186                 :            :                 internal::traits<Derived>::RowsAtCompileTime,
     187                 :            :                 internal::traits<Derived>::ColsAtCompileTime,
     188                 :            :                 AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),
     189                 :            :                 internal::traits<Derived>::MaxRowsAtCompileTime,
     190                 :            :                 internal::traits<Derived>::MaxColsAtCompileTime
     191                 :            :           > PlainMatrix;
     192                 :            : 
     193                 :            :     /** The plain array type corresponding to this expression.
     194                 :            :       * \sa PlainObject */
     195                 :            :     typedef Array<typename internal::traits<Derived>::Scalar,
     196                 :            :                 internal::traits<Derived>::RowsAtCompileTime,
     197                 :            :                 internal::traits<Derived>::ColsAtCompileTime,
     198                 :            :                 AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),
     199                 :            :                 internal::traits<Derived>::MaxRowsAtCompileTime,
     200                 :            :                 internal::traits<Derived>::MaxColsAtCompileTime
     201                 :            :           > PlainArray;
     202                 :            : 
     203                 :            :     /** \brief The plain matrix or array type corresponding to this expression.
     204                 :            :       *
     205                 :            :       * This is not necessarily exactly the return type of eval(). In the case of plain matrices,
     206                 :            :       * the return type of eval() is a const reference to a matrix, not a matrix! It is however guaranteed
     207                 :            :       * that the return type of eval() is either PlainObject or const PlainObject&.
     208                 :            :       */
     209                 :            :     typedef typename internal::conditional<internal::is_same<typename internal::traits<Derived>::XprKind,MatrixXpr >::value,
     210                 :            :                                  PlainMatrix, PlainArray>::type PlainObject;
     211                 :            : 
     212                 :            :     /** \returns the number of nonzero coefficients which is in practice the number
     213                 :            :       * of stored coefficients. */
     214                 :            :     EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
     215                 :            :     inline Index nonZeros() const { return size(); }
     216                 :            : 
     217                 :            :     /** \returns the outer size.
     218                 :            :       *
     219                 :            :       * \note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension
     220                 :            :       * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of columns for a
     221                 :            :       * column-major matrix, and the number of rows for a row-major matrix. */
     222                 :            :     EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
     223                 :        914 :     Index outerSize() const
     224                 :            :     {
     225                 :        914 :       return IsVectorAtCompileTime ? 1
     226                 :        914 :            : int(IsRowMajor) ? this->rows() : this->cols();
     227                 :            :     }
     228                 :            : 
     229                 :            :     /** \returns the inner size.
     230                 :            :       *
     231                 :            :       * \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension
     232                 :            :       * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a
     233                 :            :       * column-major matrix, and the number of columns for a row-major matrix. */
     234                 :            :     EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
     235                 :      21971 :     Index innerSize() const
     236                 :            :     {
     237                 :      21971 :       return IsVectorAtCompileTime ? this->size()
     238                 :      21971 :            : int(IsRowMajor) ? this->cols() : this->rows();
     239                 :            :     }
     240                 :            : 
     241                 :            :     /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
     242                 :            :       * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
     243                 :            :       * nothing else.
     244                 :            :       */
     245                 :            :     EIGEN_DEVICE_FUNC
     246                 :            :     void resize(Index newSize)
     247                 :            :     {
     248                 :            :       EIGEN_ONLY_USED_FOR_DEBUG(newSize);
     249                 :            :       eigen_assert(newSize == this->size()
     250                 :            :                 && "DenseBase::resize() does not actually allow to resize.");
     251                 :            :     }
     252                 :            :     /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
     253                 :            :       * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
     254                 :            :       * nothing else.
     255                 :            :       */
     256                 :            :     EIGEN_DEVICE_FUNC
     257                 :          0 :     void resize(Index rows, Index cols)
     258                 :            :     {
     259                 :            :       EIGEN_ONLY_USED_FOR_DEBUG(rows);
     260                 :            :       EIGEN_ONLY_USED_FOR_DEBUG(cols);
     261                 :          0 :       eigen_assert(rows == this->rows() && cols == this->cols()
     262                 :            :                 && "DenseBase::resize() does not actually allow to resize.");
     263                 :          0 :     }
     264                 :            : 
     265                 :            : #ifndef EIGEN_PARSED_BY_DOXYGEN
     266                 :            :     /** \internal Represents a matrix with all coefficients equal to one another*/
     267                 :            :     typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,PlainObject> ConstantReturnType;
     268                 :            :     /** \internal \deprecated Represents a vector with linearly spaced coefficients that allows sequential access only. */
     269                 :            :     EIGEN_DEPRECATED typedef CwiseNullaryOp<internal::linspaced_op<Scalar>,PlainObject> SequentialLinSpacedReturnType;
     270                 :            :     /** \internal Represents a vector with linearly spaced coefficients that allows random access. */
     271                 :            :     typedef CwiseNullaryOp<internal::linspaced_op<Scalar>,PlainObject> RandomAccessLinSpacedReturnType;
     272                 :            :     /** \internal the return type of MatrixBase::eigenvalues() */
     273                 :            :     typedef Matrix<typename NumTraits<typename internal::traits<Derived>::Scalar>::Real, internal::traits<Derived>::ColsAtCompileTime, 1> EigenvaluesReturnType;
     274                 :            : 
     275                 :            : #endif // not EIGEN_PARSED_BY_DOXYGEN
     276                 :            : 
     277                 :            :     /** Copies \a other into *this. \returns a reference to *this. */
     278                 :            :     template<typename OtherDerived>
     279                 :            :     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     280                 :            :     Derived& operator=(const DenseBase<OtherDerived>& other);
     281                 :            : 
     282                 :            :     /** Special case of the template operator=, in order to prevent the compiler
     283                 :            :       * from generating a default operator= (issue hit with g++ 4.1)
     284                 :            :       */
     285                 :            :     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     286                 :            :     Derived& operator=(const DenseBase& other);
     287                 :            : 
     288                 :            :     template<typename OtherDerived>
     289                 :            :     EIGEN_DEVICE_FUNC
     290                 :            :     Derived& operator=(const EigenBase<OtherDerived> &other);
     291                 :            : 
     292                 :            :     template<typename OtherDerived>
     293                 :            :     EIGEN_DEVICE_FUNC
     294                 :            :     Derived& operator+=(const EigenBase<OtherDerived> &other);
     295                 :            : 
     296                 :            :     template<typename OtherDerived>
     297                 :            :     EIGEN_DEVICE_FUNC
     298                 :            :     Derived& operator-=(const EigenBase<OtherDerived> &other);
     299                 :            : 
     300                 :            :     template<typename OtherDerived>
     301                 :            :     EIGEN_DEVICE_FUNC
     302                 :            :     Derived& operator=(const ReturnByValue<OtherDerived>& func);
     303                 :            : 
     304                 :            :     /** \internal
     305                 :            :       * Copies \a other into *this without evaluating other. \returns a reference to *this. */
     306                 :            :     template<typename OtherDerived>
     307                 :            :     /** \deprecated */
     308                 :            :     EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
     309                 :            :     Derived& lazyAssign(const DenseBase<OtherDerived>& other);
     310                 :            : 
     311                 :            :     EIGEN_DEVICE_FUNC
     312                 :            :     CommaInitializer<Derived> operator<< (const Scalar& s);
     313                 :            : 
     314                 :            :     template<unsigned int Added,unsigned int Removed>
     315                 :            :     /** \deprecated it now returns \c *this */
     316                 :            :     EIGEN_DEPRECATED
     317                 :            :     const Derived& flagged() const
     318                 :            :     { return derived(); }
     319                 :            : 
     320                 :            :     template<typename OtherDerived>
     321                 :            :     EIGEN_DEVICE_FUNC
     322                 :            :     CommaInitializer<Derived> operator<< (const DenseBase<OtherDerived>& other);
     323                 :            : 
     324                 :            :     typedef Transpose<Derived> TransposeReturnType;
     325                 :            :     EIGEN_DEVICE_FUNC
     326                 :            :     TransposeReturnType transpose();
     327                 :            :     typedef typename internal::add_const<Transpose<const Derived> >::type ConstTransposeReturnType;
     328                 :            :     EIGEN_DEVICE_FUNC
     329                 :            :     ConstTransposeReturnType transpose() const;
     330                 :            :     EIGEN_DEVICE_FUNC
     331                 :            :     void transposeInPlace();
     332                 :            : 
     333                 :            :     EIGEN_DEVICE_FUNC static const ConstantReturnType
     334                 :            :     Constant(Index rows, Index cols, const Scalar& value);
     335                 :            :     EIGEN_DEVICE_FUNC static const ConstantReturnType
     336                 :            :     Constant(Index size, const Scalar& value);
     337                 :            :     EIGEN_DEVICE_FUNC static const ConstantReturnType
     338                 :            :     Constant(const Scalar& value);
     339                 :            : 
     340                 :            :     EIGEN_DEPRECATED EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
     341                 :            :     LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high);
     342                 :            :     EIGEN_DEPRECATED EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
     343                 :            :     LinSpaced(Sequential_t, const Scalar& low, const Scalar& high);
     344                 :            : 
     345                 :            :     EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
     346                 :            :     LinSpaced(Index size, const Scalar& low, const Scalar& high);
     347                 :            :     EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
     348                 :            :     LinSpaced(const Scalar& low, const Scalar& high);
     349                 :            : 
     350                 :            :     template<typename CustomNullaryOp> EIGEN_DEVICE_FUNC
     351                 :            :     static const CwiseNullaryOp<CustomNullaryOp, PlainObject>
     352                 :            :     NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func);
     353                 :            :     template<typename CustomNullaryOp> EIGEN_DEVICE_FUNC
     354                 :            :     static const CwiseNullaryOp<CustomNullaryOp, PlainObject>
     355                 :            :     NullaryExpr(Index size, const CustomNullaryOp& func);
     356                 :            :     template<typename CustomNullaryOp> EIGEN_DEVICE_FUNC
     357                 :            :     static const CwiseNullaryOp<CustomNullaryOp, PlainObject>
     358                 :            :     NullaryExpr(const CustomNullaryOp& func);
     359                 :            : 
     360                 :            :     EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index rows, Index cols);
     361                 :            :     EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index size);
     362                 :            :     EIGEN_DEVICE_FUNC static const ConstantReturnType Zero();
     363                 :            :     EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index rows, Index cols);
     364                 :            :     EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index size);
     365                 :            :     EIGEN_DEVICE_FUNC static const ConstantReturnType Ones();
     366                 :            : 
     367                 :            :     EIGEN_DEVICE_FUNC void fill(const Scalar& value);
     368                 :            :     EIGEN_DEVICE_FUNC Derived& setConstant(const Scalar& value);
     369                 :            :     EIGEN_DEVICE_FUNC Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high);
     370                 :            :     EIGEN_DEVICE_FUNC Derived& setLinSpaced(const Scalar& low, const Scalar& high);
     371                 :            :     EIGEN_DEVICE_FUNC Derived& setZero();
     372                 :            :     EIGEN_DEVICE_FUNC Derived& setOnes();
     373                 :            :     EIGEN_DEVICE_FUNC Derived& setRandom();
     374                 :            : 
     375                 :            :     template<typename OtherDerived> EIGEN_DEVICE_FUNC
     376                 :            :     bool isApprox(const DenseBase<OtherDerived>& other,
     377                 :            :                   const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
     378                 :            :     EIGEN_DEVICE_FUNC
     379                 :            :     bool isMuchSmallerThan(const RealScalar& other,
     380                 :            :                            const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
     381                 :            :     template<typename OtherDerived> EIGEN_DEVICE_FUNC
     382                 :            :     bool isMuchSmallerThan(const DenseBase<OtherDerived>& other,
     383                 :            :                            const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
     384                 :            : 
     385                 :            :     EIGEN_DEVICE_FUNC bool isApproxToConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
     386                 :            :     EIGEN_DEVICE_FUNC bool isConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
     387                 :            :     EIGEN_DEVICE_FUNC bool isZero(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
     388                 :            :     EIGEN_DEVICE_FUNC bool isOnes(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
     389                 :            : 
     390                 :            :     inline bool hasNaN() const;
     391                 :            :     inline bool allFinite() const;
     392                 :            : 
     393                 :            :     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     394                 :            :     Derived& operator*=(const Scalar& other);
     395                 :            :     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     396                 :            :     Derived& operator/=(const Scalar& other);
     397                 :            : 
     398                 :            :     typedef typename internal::add_const_on_value_type<typename internal::eval<Derived>::type>::type EvalReturnType;
     399                 :            :     /** \returns the matrix or vector obtained by evaluating this expression.
     400                 :            :       *
     401                 :            :       * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
     402                 :            :       * a const reference, in order to avoid a useless copy.
     403                 :            :       *
     404                 :            :       * \warning Be careful with eval() and the auto C++ keyword, as detailed in this \link TopicPitfalls_auto_keyword page \endlink.
     405                 :            :       */
     406                 :            :     EIGEN_DEVICE_FUNC
     407                 :            :     EIGEN_STRONG_INLINE EvalReturnType eval() const
     408                 :            :     {
     409                 :            :       // Even though MSVC does not honor strong inlining when the return type
     410                 :            :       // is a dynamic matrix, we desperately need strong inlining for fixed
     411                 :            :       // size types on MSVC.
     412                 :            :       return typename internal::eval<Derived>::type(derived());
     413                 :            :     }
     414                 :            : 
     415                 :            :     /** swaps *this with the expression \a other.
     416                 :            :       *
     417                 :            :       */
     418                 :            :     template<typename OtherDerived>
     419                 :            :     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     420                 :            :     void swap(const DenseBase<OtherDerived>& other)
     421                 :            :     {
     422                 :            :       EIGEN_STATIC_ASSERT(!OtherDerived::IsPlainObjectBase,THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
     423                 :            :       eigen_assert(rows()==other.rows() && cols()==other.cols());
     424                 :            :       call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op<Scalar>());
     425                 :            :     }
     426                 :            : 
     427                 :            :     /** swaps *this with the matrix or array \a other.
     428                 :            :       *
     429                 :            :       */
     430                 :            :     template<typename OtherDerived>
     431                 :            :     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     432                 :            :     void swap(PlainObjectBase<OtherDerived>& other)
     433                 :            :     {
     434                 :            :       eigen_assert(rows()==other.rows() && cols()==other.cols());
     435                 :            :       call_assignment(derived(), other.derived(), internal::swap_assign_op<Scalar>());
     436                 :            :     }
     437                 :            : 
     438                 :            :     EIGEN_DEVICE_FUNC inline const NestByValue<Derived> nestByValue() const;
     439                 :            :     EIGEN_DEVICE_FUNC inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
     440                 :            :     EIGEN_DEVICE_FUNC inline ForceAlignedAccess<Derived> forceAlignedAccess();
     441                 :            :     template<bool Enable> EIGEN_DEVICE_FUNC
     442                 :            :     inline const typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf() const;
     443                 :            :     template<bool Enable> EIGEN_DEVICE_FUNC
     444                 :            :     inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf();
     445                 :            : 
     446                 :            :     EIGEN_DEVICE_FUNC Scalar sum() const;
     447                 :            :     EIGEN_DEVICE_FUNC Scalar mean() const;
     448                 :            :     EIGEN_DEVICE_FUNC Scalar trace() const;
     449                 :            : 
     450                 :            :     EIGEN_DEVICE_FUNC Scalar prod() const;
     451                 :            : 
     452                 :            :     template<int NaNPropagation>
     453                 :            :     EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar minCoeff() const;
     454                 :            :     template<int NaNPropagation>
     455                 :            :     EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar maxCoeff() const;
     456                 :            : 
     457                 :            : 
     458                 :            :     // By default, the fastest version with undefined NaN propagation semantics is
     459                 :            :     // used.
     460                 :            :     // TODO(rmlarsen): Replace with default template argument when we move to
     461                 :            :     // c++11 or beyond.
     462                 :            :     EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff() const {
     463                 :            :       return minCoeff<PropagateFast>();
     464                 :            :     }
     465                 :            :     EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar maxCoeff() const {
     466                 :            :       return maxCoeff<PropagateFast>();
     467                 :            :     }
     468                 :            : 
     469                 :            :     template<int NaNPropagation, typename IndexType>
     470                 :            :     EIGEN_DEVICE_FUNC
     471                 :            :     typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const;
     472                 :            :     template<int NaNPropagation, typename IndexType>
     473                 :            :     EIGEN_DEVICE_FUNC
     474                 :            :     typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const;
     475                 :            :     template<int NaNPropagation, typename IndexType>
     476                 :            :     EIGEN_DEVICE_FUNC
     477                 :            :     typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const;
     478                 :            :     template<int NaNPropagation, typename IndexType>
     479                 :            :     EIGEN_DEVICE_FUNC
     480                 :            :     typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const;
     481                 :            : 
     482                 :            :     // TODO(rmlarsen): Replace these methods with a default template argument.
     483                 :            :     template<typename IndexType>
     484                 :            :     EIGEN_DEVICE_FUNC inline
     485                 :            :     typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const {
     486                 :            :       return minCoeff<PropagateFast>(row, col);
     487                 :            :     }
     488                 :            :     template<typename IndexType>
     489                 :            :     EIGEN_DEVICE_FUNC inline
     490                 :            :     typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const {
     491                 :            :       return maxCoeff<PropagateFast>(row, col);
     492                 :            :     }
     493                 :            :     template<typename IndexType>
     494                 :            :      EIGEN_DEVICE_FUNC inline
     495                 :            :     typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const {
     496                 :            :       return minCoeff<PropagateFast>(index);
     497                 :            :     }
     498                 :            :     template<typename IndexType>
     499                 :            :     EIGEN_DEVICE_FUNC inline
     500                 :            :     typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const {
     501                 :            :       return maxCoeff<PropagateFast>(index);
     502                 :            :     }
     503                 :            :   
     504                 :            :     template<typename BinaryOp>
     505                 :            :     EIGEN_DEVICE_FUNC
     506                 :            :     Scalar redux(const BinaryOp& func) const;
     507                 :            : 
     508                 :            :     template<typename Visitor>
     509                 :            :     EIGEN_DEVICE_FUNC
     510                 :            :     void visit(Visitor& func) const;
     511                 :            : 
     512                 :            :     /** \returns a WithFormat proxy object allowing to print a matrix the with given
     513                 :            :       * format \a fmt.
     514                 :            :       *
     515                 :            :       * See class IOFormat for some examples.
     516                 :            :       *
     517                 :            :       * \sa class IOFormat, class WithFormat
     518                 :            :       */
     519                 :            :     inline const WithFormat<Derived> format(const IOFormat& fmt) const
     520                 :            :     {
     521                 :            :       return WithFormat<Derived>(derived(), fmt);
     522                 :            :     }
     523                 :            : 
     524                 :            :     /** \returns the unique coefficient of a 1x1 expression */
     525                 :            :     EIGEN_DEVICE_FUNC
     526                 :            :     CoeffReturnType value() const
     527                 :            :     {
     528                 :            :       EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
     529                 :            :       eigen_assert(this->rows() == 1 && this->cols() == 1);
     530                 :            :       return derived().coeff(0,0);
     531                 :            :     }
     532                 :            : 
     533                 :            :     EIGEN_DEVICE_FUNC bool all() const;
     534                 :            :     EIGEN_DEVICE_FUNC bool any() const;
     535                 :            :     EIGEN_DEVICE_FUNC Index count() const;
     536                 :            : 
     537                 :            :     typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;
     538                 :            :     typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;
     539                 :            :     typedef VectorwiseOp<Derived, Vertical> ColwiseReturnType;
     540                 :            :     typedef const VectorwiseOp<const Derived, Vertical> ConstColwiseReturnType;
     541                 :            : 
     542                 :            :     /** \returns a VectorwiseOp wrapper of *this for broadcasting and partial reductions
     543                 :            :     *
     544                 :            :     * Example: \include MatrixBase_rowwise.cpp
     545                 :            :     * Output: \verbinclude MatrixBase_rowwise.out
     546                 :            :     *
     547                 :            :     * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
     548                 :            :     */
     549                 :            :     //Code moved here due to a CUDA compiler bug
     550                 :            :     EIGEN_DEVICE_FUNC inline ConstRowwiseReturnType rowwise() const {
     551                 :            :       return ConstRowwiseReturnType(derived());
     552                 :            :     }
     553                 :            :     EIGEN_DEVICE_FUNC RowwiseReturnType rowwise();
     554                 :            : 
     555                 :            :     /** \returns a VectorwiseOp wrapper of *this broadcasting and partial reductions
     556                 :            :     *
     557                 :            :     * Example: \include MatrixBase_colwise.cpp
     558                 :            :     * Output: \verbinclude MatrixBase_colwise.out
     559                 :            :     *
     560                 :            :     * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
     561                 :            :     */
     562                 :            :     EIGEN_DEVICE_FUNC inline ConstColwiseReturnType colwise() const {
     563                 :            :       return ConstColwiseReturnType(derived());
     564                 :            :     }
     565                 :            :     EIGEN_DEVICE_FUNC ColwiseReturnType colwise();
     566                 :            : 
     567                 :            :     typedef CwiseNullaryOp<internal::scalar_random_op<Scalar>,PlainObject> RandomReturnType;
     568                 :            :     static const RandomReturnType Random(Index rows, Index cols);
     569                 :            :     static const RandomReturnType Random(Index size);
     570                 :            :     static const RandomReturnType Random();
     571                 :            : 
     572                 :            :     template<typename ThenDerived,typename ElseDerived>
     573                 :            :     inline EIGEN_DEVICE_FUNC const Select<Derived,ThenDerived,ElseDerived>
     574                 :            :     select(const DenseBase<ThenDerived>& thenMatrix,
     575                 :            :            const DenseBase<ElseDerived>& elseMatrix) const;
     576                 :            : 
     577                 :            :     template<typename ThenDerived>
     578                 :            :     inline EIGEN_DEVICE_FUNC const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType>
     579                 :            :     select(const DenseBase<ThenDerived>& thenMatrix, const typename ThenDerived::Scalar& elseScalar) const;
     580                 :            : 
     581                 :            :     template<typename ElseDerived>
     582                 :            :     inline EIGEN_DEVICE_FUNC const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived >
     583                 :            :     select(const typename ElseDerived::Scalar& thenScalar, const DenseBase<ElseDerived>& elseMatrix) const;
     584                 :            : 
     585                 :            :     template<int p> RealScalar lpNorm() const;
     586                 :            : 
     587                 :            :     template<int RowFactor, int ColFactor>
     588                 :            :     EIGEN_DEVICE_FUNC
     589                 :            :     const Replicate<Derived,RowFactor,ColFactor> replicate() const;
     590                 :            :     /**
     591                 :            :     * \return an expression of the replication of \c *this
     592                 :            :     *
     593                 :            :     * Example: \include MatrixBase_replicate_int_int.cpp
     594                 :            :     * Output: \verbinclude MatrixBase_replicate_int_int.out
     595                 :            :     *
     596                 :            :     * \sa VectorwiseOp::replicate(), DenseBase::replicate<int,int>(), class Replicate
     597                 :            :     */
     598                 :            :     //Code moved here due to a CUDA compiler bug
     599                 :            :     EIGEN_DEVICE_FUNC
     600                 :            :     const Replicate<Derived, Dynamic, Dynamic> replicate(Index rowFactor, Index colFactor) const
     601                 :            :     {
     602                 :            :       return Replicate<Derived, Dynamic, Dynamic>(derived(), rowFactor, colFactor);
     603                 :            :     }
     604                 :            : 
     605                 :            :     typedef Reverse<Derived, BothDirections> ReverseReturnType;
     606                 :            :     typedef const Reverse<const Derived, BothDirections> ConstReverseReturnType;
     607                 :            :     EIGEN_DEVICE_FUNC ReverseReturnType reverse();
     608                 :            :     /** This is the const version of reverse(). */
     609                 :            :     //Code moved here due to a CUDA compiler bug
     610                 :            :     EIGEN_DEVICE_FUNC ConstReverseReturnType reverse() const
     611                 :            :     {
     612                 :            :       return ConstReverseReturnType(derived());
     613                 :            :     }
     614                 :            :     EIGEN_DEVICE_FUNC void reverseInPlace();
     615                 :            : 
     616                 :            :     #ifdef EIGEN_PARSED_BY_DOXYGEN
     617                 :            :     /** STL-like <a href="https://en.cppreference.com/w/cpp/named_req/RandomAccessIterator">RandomAccessIterator</a>
     618                 :            :       * iterator type as returned by the begin() and end() methods.
     619                 :            :       */
     620                 :            :     typedef random_access_iterator_type iterator;
     621                 :            :     /** This is the const version of iterator (aka read-only) */
     622                 :            :     typedef random_access_iterator_type const_iterator;
     623                 :            :     #else
     624                 :            :     typedef typename internal::conditional< (Flags&DirectAccessBit)==DirectAccessBit,
     625                 :            :                                             internal::pointer_based_stl_iterator<Derived>,
     626                 :            :                                             internal::generic_randaccess_stl_iterator<Derived>
     627                 :            :                                           >::type iterator_type;
     628                 :            : 
     629                 :            :     typedef typename internal::conditional< (Flags&DirectAccessBit)==DirectAccessBit,
     630                 :            :                                             internal::pointer_based_stl_iterator<const Derived>,
     631                 :            :                                             internal::generic_randaccess_stl_iterator<const Derived>
     632                 :            :                                           >::type const_iterator_type;
     633                 :            : 
     634                 :            :     // Stl-style iterators are supported only for vectors.
     635                 :            : 
     636                 :            :     typedef typename internal::conditional< IsVectorAtCompileTime,
     637                 :            :                                             iterator_type,
     638                 :            :                                             void
     639                 :            :                                           >::type iterator;
     640                 :            : 
     641                 :            :     typedef typename internal::conditional< IsVectorAtCompileTime,
     642                 :            :                                             const_iterator_type,
     643                 :            :                                             void
     644                 :            :                                           >::type const_iterator;
     645                 :            :     #endif
     646                 :            : 
     647                 :            :     inline iterator begin();
     648                 :            :     inline const_iterator begin() const;
     649                 :            :     inline const_iterator cbegin() const;
     650                 :            :     inline iterator end();
     651                 :            :     inline const_iterator end() const;
     652                 :            :     inline const_iterator cend() const;
     653                 :            : 
     654                 :            : #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase
     655                 :            : #define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     656                 :            : #define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
     657                 :            : #define EIGEN_DOC_UNARY_ADDONS(X,Y)
     658                 :            : #   include "../plugins/CommonCwiseUnaryOps.h"
     659                 :            : #   include "../plugins/BlockMethods.h"
     660                 :            : #   include "../plugins/IndexedViewMethods.h"
     661                 :            : #   include "../plugins/ReshapedMethods.h"
     662                 :            : #   ifdef EIGEN_DENSEBASE_PLUGIN
     663                 :            : #     include EIGEN_DENSEBASE_PLUGIN
     664                 :            : #   endif
     665                 :            : #undef EIGEN_CURRENT_STORAGE_BASE_CLASS
     666                 :            : #undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
     667                 :            : #undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF
     668                 :            : #undef EIGEN_DOC_UNARY_ADDONS
     669                 :            : 
     670                 :            :     // disable the use of evalTo for dense objects with a nice compilation error
     671                 :            :     template<typename Dest>
     672                 :            :     EIGEN_DEVICE_FUNC
     673                 :            :     inline void evalTo(Dest& ) const
     674                 :            :     {
     675                 :            :       EIGEN_STATIC_ASSERT((internal::is_same<Dest,void>::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
     676                 :            :     }
     677                 :            : 
     678                 :            :   protected:
     679                 :            :     EIGEN_DEFAULT_COPY_CONSTRUCTOR(DenseBase)
     680                 :            :     /** Default constructor. Do nothing. */
     681                 :     352363 :     EIGEN_DEVICE_FUNC DenseBase()
     682                 :            :     {
     683                 :            :       /* Just checks for self-consistency of the flags.
     684                 :            :        * Only do it when debugging Eigen, as this borders on paranoia and could slow compilation down
     685                 :            :        */
     686                 :            : #ifdef EIGEN_INTERNAL_DEBUGGING
     687                 :            :       EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
     688                 :            :                         && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, int(!IsRowMajor))),
     689                 :            :                           INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION)
     690                 :            : #endif
     691                 :     352363 :     }
     692                 :            : 
     693                 :            :   private:
     694                 :            :     EIGEN_DEVICE_FUNC explicit DenseBase(int);
     695                 :            :     EIGEN_DEVICE_FUNC DenseBase(int,int);
     696                 :            :     template<typename OtherDerived> EIGEN_DEVICE_FUNC explicit DenseBase(const DenseBase<OtherDerived>&);
     697                 :            : };
     698                 :            : 
     699                 :            : } // end namespace Eigen
     700                 :            : 
     701                 :            : #endif // EIGEN_DENSEBASE_H

Generated by: LCOV version 1.0