Please, help us to better know about our user community by answering the following short survey: https://forms.gle/wpyrxWi18ox9Z5ae9
 
Loading...
Searching...
No Matches
SkylineMatrixBase.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008-2009 Guillaume Saupin <guillaume.saupin@cea.fr>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_SKYLINEMATRIXBASE_H
11#define EIGEN_SKYLINEMATRIXBASE_H
12
13#include "SkylineUtil.h"
14
15namespace Eigen {
16
26template<typename Derived> class SkylineMatrixBase : public EigenBase<Derived> {
27public:
28
29 typedef typename internal::traits<Derived>::Scalar Scalar;
30 typedef typename internal::traits<Derived>::StorageKind StorageKind;
31 typedef typename internal::index<StorageKind>::type Index;
32
33 enum {
34 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
40 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
47 SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
48 internal::traits<Derived>::ColsAtCompileTime>::ret),
53 MaxRowsAtCompileTime = RowsAtCompileTime,
54 MaxColsAtCompileTime = ColsAtCompileTime,
55
56 MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime,
57 MaxColsAtCompileTime>::ret),
58
65 Flags = internal::traits<Derived>::Flags,
70 CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
75 IsRowMajor = Flags & RowMajorBit ? 1 : 0
76 };
77
78#ifndef EIGEN_PARSED_BY_DOXYGEN
85 typedef typename NumTraits<Scalar>::Real RealScalar;
86
88 typedef Matrix<Scalar, EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime),
89 EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime) > SquareMatrixType;
90
91 inline const Derived& derived() const {
92 return *static_cast<const Derived*> (this);
93 }
94
95 inline Derived& derived() {
96 return *static_cast<Derived*> (this);
97 }
98
99 inline Derived& const_cast_derived() const {
100 return *static_cast<Derived*> (const_cast<SkylineMatrixBase*> (this));
101 }
102#endif // not EIGEN_PARSED_BY_DOXYGEN
103
105 inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT {
106 return derived().rows();
107 }
108
110 inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT {
111 return derived().cols();
112 }
113
116 inline EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT {
117 return rows() * cols();
118 }
119
122 inline Index nonZeros() const {
123 return derived().nonZeros();
124 }
125
128 Index outerSize() const {
129 return (int(Flags) & RowMajorBit) ? this->rows() : this->cols();
130 }
131
134 Index innerSize() const {
135 return (int(Flags) & RowMajorBit) ? this->cols() : this->rows();
136 }
137
138 bool isRValue() const {
139 return m_isRValue;
140 }
141
142 Derived& markAsRValue() {
143 m_isRValue = true;
144 return derived();
145 }
146
147 SkylineMatrixBase() : m_isRValue(false) {
148 /* TODO check flags */
149 }
150
151 inline Derived & operator=(const Derived& other) {
152 this->operator=<Derived > (other);
153 return derived();
154 }
155
156 template<typename OtherDerived>
157 inline void assignGeneric(const OtherDerived& other) {
158 derived().resize(other.rows(), other.cols());
159 for (Index row = 0; row < rows(); row++)
160 for (Index col = 0; col < cols(); col++) {
161 if (other.coeff(row, col) != Scalar(0))
162 derived().insert(row, col) = other.coeff(row, col);
163 }
164 derived().finalize();
165 }
166
167 template<typename OtherDerived>
168 inline Derived & operator=(const SkylineMatrixBase<OtherDerived>& other) {
169 //TODO
170 }
171
172 template<typename Lhs, typename Rhs>
173 inline Derived & operator=(const SkylineProduct<Lhs, Rhs, SkylineTimeSkylineProduct>& product);
174
175 friend std::ostream & operator <<(std::ostream & s, const SkylineMatrixBase& m) {
176 s << m.derived();
177 return s;
178 }
179
180 template<typename OtherDerived>
181 const typename SkylineProductReturnType<Derived, OtherDerived>::Type
182 operator*(const MatrixBase<OtherDerived> &other) const;
183
185 template<typename DenseDerived>
186 void evalTo(MatrixBase<DenseDerived>& dst) const {
187 dst.setZero();
188 for (Index i = 0; i < rows(); i++)
189 for (Index j = 0; j < rows(); j++)
190 dst(i, j) = derived().coeff(i, j);
191 }
192
193 Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> toDense() const {
194 return derived();
195 }
196
202 EIGEN_STRONG_INLINE const typename internal::eval<Derived, IsSkyline>::type eval() const {
203 return typename internal::eval<Derived>::type(derived());
204 }
205
206protected:
207 bool m_isRValue;
208};
209
210} // end namespace Eigen
211
212#endif // EIGEN_SKYLINEMATRIXBASE_H
Base class of any skyline matrices or skyline expressions.
Definition: SkylineMatrixBase.h:26
const internal::eval< Derived, IsSkyline >::type eval() const
Definition: SkylineMatrixBase.h:202
EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT
Definition: SkylineMatrixBase.h:116
Index outerSize() const
Definition: SkylineMatrixBase.h:128
@ SizeAtCompileTime
Definition: SkylineMatrixBase.h:47
@ ColsAtCompileTime
Definition: SkylineMatrixBase.h:40
@ CoeffReadCost
Definition: SkylineMatrixBase.h:70
@ RowsAtCompileTime
Definition: SkylineMatrixBase.h:34
@ Flags
Definition: SkylineMatrixBase.h:65
@ IsVectorAtCompileTime
Definition: SkylineMatrixBase.h:59
Index innerSize() const
Definition: SkylineMatrixBase.h:134
Index nonZeros() const
Definition: SkylineMatrixBase.h:122
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: SkylineMatrixBase.h:105
EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: SkylineMatrixBase.h:110
const unsigned int RowMajorBit
Namespace containing all symbols from the Eigen library.