| // This file is part of Eigen, a lightweight C++ template library |
| // for linear algebra. |
| // |
| // Copyright (C) 2008-2009 Guillaume Saupin <guillaume.saupin@cea.fr> |
| // |
| // This Source Code Form is subject to the terms of the Mozilla |
| // Public License v. 2.0. If a copy of the MPL was not distributed |
| // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| #ifndef EIGEN_SKYLINEMATRIXBASE_H |
| #define EIGEN_SKYLINEMATRIXBASE_H |
| |
| #include "SkylineUtil.h" |
| |
| namespace Eigen { |
| |
| /** \ingroup Skyline_Module |
| * |
| * \class SkylineMatrixBase |
| * |
| * \brief Base class of any skyline matrices or skyline expressions |
| * |
| * \param Derived |
| * |
| */ |
| template<typename Derived> class SkylineMatrixBase : public EigenBase<Derived> { |
| public: |
| |
| typedef typename internal::traits<Derived>::Scalar Scalar; |
| typedef typename internal::traits<Derived>::StorageKind StorageKind; |
| typedef typename internal::index<StorageKind>::type Index; |
| |
| enum { |
| RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime, |
| /**< The number of rows at compile-time. This is just a copy of the value provided |
| * by the \a Derived type. If a value is not known at compile-time, |
| * it is set to the \a Dynamic constant. |
| * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */ |
| |
| ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime, |
| /**< The number of columns at compile-time. This is just a copy of the value provided |
| * by the \a Derived type. If a value is not known at compile-time, |
| * it is set to the \a Dynamic constant. |
| * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */ |
| |
| |
| SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime, |
| internal::traits<Derived>::ColsAtCompileTime>::ret), |
| /**< This is equal to the number of coefficients, i.e. the number of |
| * rows times the number of columns, or to \a Dynamic if this is not |
| * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */ |
| |
| MaxRowsAtCompileTime = RowsAtCompileTime, |
| MaxColsAtCompileTime = ColsAtCompileTime, |
| |
| MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime, |
| MaxColsAtCompileTime>::ret), |
| |
| IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1, |
| /**< This is set to true if either the number of rows or the number of |
| * columns is known at compile-time to be equal to 1. Indeed, in that case, |
| * we are dealing with a column-vector (if there is only one column) or with |
| * a row-vector (if there is only one row). */ |
| |
| Flags = internal::traits<Derived>::Flags, |
| /**< This stores expression \ref flags flags which may or may not be inherited by new expressions |
| * constructed from this one. See the \ref flags "list of flags". |
| */ |
| |
| CoeffReadCost = internal::traits<Derived>::CoeffReadCost, |
| /**< This is a rough measure of how expensive it is to read one coefficient from |
| * this expression. |
| */ |
| |
| IsRowMajor = Flags & RowMajorBit ? 1 : 0 |
| }; |
| |
| #ifndef EIGEN_PARSED_BY_DOXYGEN |
| /** This is the "real scalar" type; if the \a Scalar type is already real numbers |
| * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If |
| * \a Scalar is \a std::complex<T> then RealScalar is \a T. |
| * |
| * \sa class NumTraits |
| */ |
| typedef typename NumTraits<Scalar>::Real RealScalar; |
| |
| /** type of the equivalent square matrix */ |
| typedef Matrix<Scalar, EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime), |
| EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime) > SquareMatrixType; |
| |
| inline const Derived& derived() const { |
| return *static_cast<const Derived*> (this); |
| } |
| |
| inline Derived& derived() { |
| return *static_cast<Derived*> (this); |
| } |
| |
| inline Derived& const_cast_derived() const { |
| return *static_cast<Derived*> (const_cast<SkylineMatrixBase*> (this)); |
| } |
| #endif // not EIGEN_PARSED_BY_DOXYGEN |
| |
| /** \returns the number of rows. \sa cols(), RowsAtCompileTime */ |
| inline Index rows() const { |
| return derived().rows(); |
| } |
| |
| /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/ |
| inline Index cols() const { |
| return derived().cols(); |
| } |
| |
| /** \returns the number of coefficients, which is \a rows()*cols(). |
| * \sa rows(), cols(), SizeAtCompileTime. */ |
| inline Index size() const { |
| return rows() * cols(); |
| } |
| |
| /** \returns the number of nonzero coefficients which is in practice the number |
| * of stored coefficients. */ |
| inline Index nonZeros() const { |
| return derived().nonZeros(); |
| } |
| |
| /** \returns the size of the storage major dimension, |
| * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */ |
| Index outerSize() const { |
| return (int(Flags) & RowMajorBit) ? this->rows() : this->cols(); |
| } |
| |
| /** \returns the size of the inner dimension according to the storage order, |
| * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */ |
| Index innerSize() const { |
| return (int(Flags) & RowMajorBit) ? this->cols() : this->rows(); |
| } |
| |
| bool isRValue() const { |
| return m_isRValue; |
| } |
| |
| Derived& markAsRValue() { |
| m_isRValue = true; |
| return derived(); |
| } |
| |
| SkylineMatrixBase() : m_isRValue(false) { |
| /* TODO check flags */ |
| } |
| |
| inline Derived & operator=(const Derived& other) { |
| this->operator=<Derived > (other); |
| return derived(); |
| } |
| |
| template<typename OtherDerived> |
| inline void assignGeneric(const OtherDerived& other) { |
| derived().resize(other.rows(), other.cols()); |
| for (Index row = 0; row < rows(); row++) |
| for (Index col = 0; col < cols(); col++) { |
| if (other.coeff(row, col) != Scalar(0)) |
| derived().insert(row, col) = other.coeff(row, col); |
| } |
| derived().finalize(); |
| } |
| |
| template<typename OtherDerived> |
| inline Derived & operator=(const SkylineMatrixBase<OtherDerived>& other) { |
| //TODO |
| } |
| |
| template<typename Lhs, typename Rhs> |
| inline Derived & operator=(const SkylineProduct<Lhs, Rhs, SkylineTimeSkylineProduct>& product); |
| |
| friend std::ostream & operator <<(std::ostream & s, const SkylineMatrixBase& m) { |
| s << m.derived(); |
| return s; |
| } |
| |
| template<typename OtherDerived> |
| const typename SkylineProductReturnType<Derived, OtherDerived>::Type |
| operator*(const MatrixBase<OtherDerived> &other) const; |
| |
| /** \internal use operator= */ |
| template<typename DenseDerived> |
| void evalTo(MatrixBase<DenseDerived>& dst) const { |
| dst.setZero(); |
| for (Index i = 0; i < rows(); i++) |
| for (Index j = 0; j < rows(); j++) |
| dst(i, j) = derived().coeff(i, j); |
| } |
| |
| Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> toDense() const { |
| return derived(); |
| } |
| |
| /** \returns the matrix or vector obtained by evaluating this expression. |
| * |
| * Notice that in the case of a plain matrix or vector (not an expression) this function just returns |
| * a const reference, in order to avoid a useless copy. |
| */ |
| EIGEN_STRONG_INLINE const typename internal::eval<Derived, IsSkyline>::type eval() const { |
| return typename internal::eval<Derived>::type(derived()); |
| } |
| |
| protected: |
| bool m_isRValue; |
| }; |
| |
| } // end namespace Eigen |
| |
| #endif // EIGEN_SkylineMatrixBase_H |