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-2009 Guillaume Saupin <guillaume.saupin@cea.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_SKYLINEMATRIX_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_SKYLINEMATRIX_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "SkylineStorage.h"
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "SkylineMatrixBase.h"
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup Skyline_Module
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \class SkylineMatrix
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief The main skyline matrix class
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class implements a skyline matrix using the very uncommon storage
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * scheme.
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Scalar the scalar type, i.e. the type of the coefficients
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Options Union of bit flags controlling the storage scheme. Currently the only possibility
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *                 is RowMajor. The default is 0 which means column-major.
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Options>
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<SkylineMatrix<_Scalar, _Options> > {
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef _Scalar Scalar;
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Sparse StorageKind;
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        RowsAtCompileTime = Dynamic,
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        ColsAtCompileTime = Dynamic,
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        MaxRowsAtCompileTime = Dynamic,
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        MaxColsAtCompileTime = Dynamic,
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        Flags = SkylineBit | _Options,
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        CoeffReadCost = NumTraits<Scalar>::ReadCost,
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Options>
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass SkylineMatrix
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath: public SkylineMatrixBase<SkylineMatrix<_Scalar, _Options> > {
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE(SkylineMatrix)
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(SkylineMatrix, +=)
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(SkylineMatrix, -=)
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::IsRowMajor;
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected:
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef SkylineMatrix<Scalar, (Flags&~RowMajorBit) | (IsRowMajor ? RowMajorBit : 0) > TransposedSkylineMatrix;
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index m_outerSize;
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index m_innerSize;
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index* m_colStartIndex;
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index* m_rowStartIndex;
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    SkylineStorage<Scalar> m_data;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index rows() const {
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return IsRowMajor ? m_outerSize : m_innerSize;
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index cols() const {
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return IsRowMajor ? m_innerSize : m_outerSize;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index innerSize() const {
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_innerSize;
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index outerSize() const {
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_outerSize;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index upperNonZeros() const {
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_data.upperSize();
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index lowerNonZeros() const {
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_data.lowerSize();
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index upperNonZeros(Index j) const {
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_colStartIndex[j + 1] - m_colStartIndex[j];
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index lowerNonZeros(Index j) const {
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_rowStartIndex[j + 1] - m_rowStartIndex[j];
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar* _diagPtr() const {
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.diag(0);
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar* _diagPtr() {
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.diag(0);
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar* _upperPtr() const {
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.upper(0);
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar* _upperPtr() {
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.upper(0);
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar* _lowerPtr() const {
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.lower(0);
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar* _lowerPtr() {
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.lower(0);
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Index* _upperProfilePtr() const {
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.upperProfile(0);
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index* _upperProfilePtr() {
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.upperProfile(0);
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Index* _lowerProfilePtr() const {
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.lowerProfile(0);
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index* _lowerProfilePtr() {
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return &m_data.lowerProfile(0);
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar coeff(Index row, Index col) const {
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index outer = IsRowMajor ? row : col;
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index inner = IsRowMajor ? col : row;
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(outer < outerSize());
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner < innerSize());
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (outer == inner)
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return this->m_data.diag(outer);
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (inner > outer) //upper matrix
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index minOuterIndex = inner - m_data.upperProfile(inner);
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                if (outer >= minOuterIndex)
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                else
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return Scalar(0);
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (inner < outer) //lower matrix
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index minInnerIndex = outer - m_data.lowerProfile(outer);
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                if (inner >= minInnerIndex)
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                else
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return Scalar(0);
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return m_data.upper(m_colStartIndex[inner] + outer - inner);
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer > inner) //upper matrix
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index maxOuterIndex = inner + m_data.upperProfile(inner);
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                if (outer <= maxOuterIndex)
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                else
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return Scalar(0);
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer < inner) //lower matrix
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                if (inner <= maxInnerIndex)
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                else
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return Scalar(0);
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRef(Index row, Index col) {
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index outer = IsRowMajor ? row : col;
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index inner = IsRowMajor ? col : row;
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(outer < outerSize());
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner < innerSize());
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (outer == inner)
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return this->m_data.diag(outer);
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (col > row) //upper matrix
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index minOuterIndex = inner - m_data.upperProfile(inner);
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                eigen_assert(outer >= minOuterIndex && "you try to acces a coeff that do not exist in the storage");
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (col < row) //lower matrix
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index minInnerIndex = outer - m_data.lowerProfile(outer);
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                eigen_assert(inner >= minInnerIndex && "you try to acces a coeff that do not exist in the storage");
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer > inner) //upper matrix
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index maxOuterIndex = inner + m_data.upperProfile(inner);
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                eigen_assert(outer <= maxOuterIndex && "you try to acces a coeff that do not exist in the storage");
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer < inner) //lower matrix
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                eigen_assert(inner <= maxInnerIndex && "you try to acces a coeff that do not exist in the storage");
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar coeffDiag(Index idx) const {
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(idx < outerSize());
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(idx < innerSize());
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return this->m_data.diag(idx);
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar coeffLower(Index row, Index col) const {
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index outer = IsRowMajor ? row : col;
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index inner = IsRowMajor ? col : row;
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(outer < outerSize());
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner < innerSize());
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner != outer);
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index minInnerIndex = outer - m_data.lowerProfile(outer);
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (inner >= minInnerIndex)
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            else
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return Scalar(0);
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (inner <= maxInnerIndex)
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            else
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return Scalar(0);
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar coeffUpper(Index row, Index col) const {
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index outer = IsRowMajor ? row : col;
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index inner = IsRowMajor ? col : row;
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(outer < outerSize());
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner < innerSize());
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner != outer);
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index minOuterIndex = inner - m_data.upperProfile(inner);
274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer >= minOuterIndex)
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            else
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return Scalar(0);
278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index maxOuterIndex = inner + m_data.upperProfile(inner);
280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer <= maxOuterIndex)
281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            else
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                return Scalar(0);
284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRefDiag(Index idx) {
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(idx < outerSize());
289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(idx < innerSize());
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return this->m_data.diag(idx);
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRefLower(Index row, Index col) {
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index outer = IsRowMajor ? row : col;
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index inner = IsRowMajor ? col : row;
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(outer < outerSize());
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner < innerSize());
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner != outer);
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index minInnerIndex = outer - m_data.lowerProfile(outer);
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            eigen_assert(inner >= minInnerIndex && "you try to acces a coeff that do not exist in the storage");
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            eigen_assert(inner <= maxInnerIndex && "you try to acces a coeff that do not exist in the storage");
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline bool coeffExistLower(Index row, Index col) {
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index outer = IsRowMajor ? row : col;
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index inner = IsRowMajor ? col : row;
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(outer < outerSize());
317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner < innerSize());
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner != outer);
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index minInnerIndex = outer - m_data.lowerProfile(outer);
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return inner >= minInnerIndex;
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return inner <= maxInnerIndex;
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRefUpper(Index row, Index col) {
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index outer = IsRowMajor ? row : col;
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index inner = IsRowMajor ? col : row;
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(outer < outerSize());
334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner < innerSize());
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner != outer);
336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index minOuterIndex = inner - m_data.upperProfile(inner);
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            eigen_assert(outer >= minOuterIndex && "you try to acces a coeff that do not exist in the storage");
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index maxOuterIndex = inner + m_data.upperProfile(inner);
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            eigen_assert(outer <= maxOuterIndex && "you try to acces a coeff that do not exist in the storage");
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline bool coeffExistUpper(Index row, Index col) {
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index outer = IsRowMajor ? row : col;
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index inner = IsRowMajor ? col : row;
351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(outer < outerSize());
353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner < innerSize());
354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner != outer);
355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index minOuterIndex = inner - m_data.upperProfile(inner);
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return outer >= minOuterIndex;
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index maxOuterIndex = inner + m_data.upperProfile(inner);
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return outer <= maxOuterIndex;
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected:
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    class InnerUpperIterator;
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    class InnerLowerIterator;
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    class OuterUpperIterator;
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    class OuterLowerIterator;
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Removes all non zeros */
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void setZero() {
377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_data.clear();
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        memset(m_colStartIndex, 0, (m_outerSize + 1) * sizeof (Index));
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        memset(m_rowStartIndex, 0, (m_outerSize + 1) * sizeof (Index));
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the number of non zero coefficients */
383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index nonZeros() const {
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_data.diagSize() + m_data.upperSize() + m_data.lowerSize();
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Preallocates \a reserveSize non zeros */
388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void reserve(Index reserveSize, Index reserveUpperSize, Index reserveLowerSize) {
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_data.reserve(reserveSize, reserveUpperSize, reserveLowerSize);
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns a reference to a novel non zero coefficient with coordinates \a row x \a col.
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     *
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     * \warning This function can be extremely slow if the non zero coefficients
396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     * are not inserted in a coherent order.
397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     *
398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     * After an insertion session, you should call the finalize() function.
399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     */
400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DONT_INLINE Scalar & insert(Index row, Index col) {
401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index outer = IsRowMajor ? row : col;
402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index inner = IsRowMajor ? col : row;
403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(outer < outerSize());
405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(inner < innerSize());
406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (outer == inner)
408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return m_data.diag(col);
409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer < inner) //upper matrix
412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                Index minOuterIndex = 0;
414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                minOuterIndex = inner - m_data.upperProfile(inner);
415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                if (outer < minOuterIndex) //The value does not yet exist
417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                {
418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index previousProfile = m_data.upperProfile(inner);
419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    m_data.upperProfile(inner) = inner - outer;
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index bandIncrement = m_data.upperProfile(inner) - previousProfile;
424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    //shift data stored after this new one
425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index stop = m_colStartIndex[cols()];
426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index start = m_colStartIndex[inner];
427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        m_data.upper(innerIdx + bandIncrement) = m_data.upper(innerIdx);
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    }
432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    for (Index innerIdx = cols(); innerIdx > inner; innerIdx--) {
434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        m_colStartIndex[innerIdx] += bandIncrement;
435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    }
436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    //zeros new data
438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    memset(this->_upperPtr() + start, 0, (bandIncrement - 1) * sizeof (Scalar));
439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return m_data.upper(m_colStartIndex[inner]);
441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                } else {
442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                }
444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer > inner) //lower matrix
447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index minInnerIndex = outer - m_data.lowerProfile(outer);
449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                if (inner < minInnerIndex) //The value does not yet exist
450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                {
451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index previousProfile = m_data.lowerProfile(outer);
452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    m_data.lowerProfile(outer) = outer - inner;
453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index bandIncrement = m_data.lowerProfile(outer) - previousProfile;
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    //shift data stored after this new one
456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index stop = m_rowStartIndex[rows()];
457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index start = m_rowStartIndex[outer];
458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        m_data.lower(innerIdx + bandIncrement) = m_data.lower(innerIdx);
462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    }
463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    for (Index innerIdx = rows(); innerIdx > outer; innerIdx--) {
465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        m_rowStartIndex[innerIdx] += bandIncrement;
466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    }
467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    //zeros new data
469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    memset(this->_lowerPtr() + start, 0, (bandIncrement - 1) * sizeof (Scalar));
470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return m_data.lower(m_rowStartIndex[outer]);
471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                } else {
472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                }
474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer > inner) //upper matrix
477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index maxOuterIndex = inner + m_data.upperProfile(inner);
479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                if (outer > maxOuterIndex) //The value does not yet exist
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                {
481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index previousProfile = m_data.upperProfile(inner);
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    m_data.upperProfile(inner) = outer - inner;
483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index bandIncrement = m_data.upperProfile(inner) - previousProfile;
485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    //shift data stored after this new one
486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index stop = m_rowStartIndex[rows()];
487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index start = m_rowStartIndex[inner + 1];
488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        m_data.upper(innerIdx + bandIncrement) = m_data.upper(innerIdx);
491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    }
492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    for (Index innerIdx = inner + 1; innerIdx < outerSize() + 1; innerIdx++) {
494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        m_rowStartIndex[innerIdx] += bandIncrement;
495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    }
496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    memset(this->_upperPtr() + m_rowStartIndex[inner] + previousProfile + 1, 0, (bandIncrement - 1) * sizeof (Scalar));
497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return m_data.upper(m_rowStartIndex[inner] + m_data.upperProfile(inner));
498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                } else {
499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return m_data.upper(m_rowStartIndex[inner] + (outer - inner));
500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                }
501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (outer < inner) //lower matrix
504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            {
505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                if (inner > maxInnerIndex) //The value does not yet exist
507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                {
508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index previousProfile = m_data.lowerProfile(outer);
509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    m_data.lowerProfile(outer) = inner - outer;
510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index bandIncrement = m_data.lowerProfile(outer) - previousProfile;
512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    //shift data stored after this new one
513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index stop = m_colStartIndex[cols()];
514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    const Index start = m_colStartIndex[outer + 1];
515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        m_data.lower(innerIdx + bandIncrement) = m_data.lower(innerIdx);
518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    }
519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    for (Index innerIdx = outer + 1; innerIdx < outerSize() + 1; innerIdx++) {
521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        m_colStartIndex[innerIdx] += bandIncrement;
522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    }
523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    memset(this->_lowerPtr() + m_colStartIndex[outer] + previousProfile + 1, 0, (bandIncrement - 1) * sizeof (Scalar));
524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return m_data.lower(m_colStartIndex[outer] + m_data.lowerProfile(outer));
525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                } else {
526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    return m_data.lower(m_colStartIndex[outer] + (inner - outer));
527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                }
528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Must be called after inserting a set of non zero entries.
533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     */
534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void finalize() {
535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (IsRowMajor) {
536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (rows() > cols())
537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                m_data.resize(cols(), cols(), rows(), m_colStartIndex[cols()] + 1, m_rowStartIndex[rows()] + 1);
538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            else
539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                m_data.resize(rows(), cols(), rows(), m_colStartIndex[cols()] + 1, m_rowStartIndex[rows()] + 1);
540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            eigen_assert(rows() == cols() && "memory reorganisatrion only works with suare matrix");
542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //
543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            Scalar* newArray = new Scalar[m_colStartIndex[cols()] + 1 + m_rowStartIndex[rows()] + 1];
544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            Index dataIdx = 0;
545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            for (Index row = 0; row < rows(); row++) {
546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //
547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //                const Index nbLowerElts = m_rowStartIndex[row + 1] - m_rowStartIndex[row];
548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //                //                std::cout << "nbLowerElts" << nbLowerElts << std::endl;
549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //                memcpy(newArray + dataIdx, m_data.m_lower + m_rowStartIndex[row], nbLowerElts * sizeof (Scalar));
550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //                m_rowStartIndex[row] = dataIdx;
551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //                dataIdx += nbLowerElts;
552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //
553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //                const Index nbUpperElts = m_colStartIndex[row + 1] - m_colStartIndex[row];
554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //                memcpy(newArray + dataIdx, m_data.m_upper + m_colStartIndex[row], nbUpperElts * sizeof (Scalar));
555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //                m_colStartIndex[row] = dataIdx;
556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //                dataIdx += nbUpperElts;
557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //
558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //
559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            }
560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            //todo : don't access m_data profile directly : add an accessor from SkylineMatrix
561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            m_rowStartIndex[rows()] = m_rowStartIndex[rows()-1] + m_data.lowerProfile(rows()-1);
562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            m_colStartIndex[cols()] = m_colStartIndex[cols()-1] + m_data.upperProfile(cols()-1);
563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //
564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            delete[] m_data.m_lower;
565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            delete[] m_data.m_upper;
566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //
567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            m_data.m_lower = newArray;
568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            m_data.m_upper = newArray;
569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            if (rows() > cols())
571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                m_data.resize(cols(), rows(), cols(), m_rowStartIndex[cols()] + 1, m_colStartIndex[cols()] + 1);
572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            else
573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                m_data.resize(rows(), rows(), cols(), m_rowStartIndex[rows()] + 1, m_colStartIndex[rows()] + 1);
574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void squeeze() {
578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        finalize();
579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_data.squeeze();
580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void prune(Scalar reference, RealScalar epsilon = dummy_precision<RealScalar > ()) {
583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        //TODO
584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Resizes the matrix to a \a rows x \a cols matrix and initializes it to zero
587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     * \sa resizeNonZeros(Index), reserve(), setZero()
588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     */
589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void resize(size_t rows, size_t cols) {
590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const Index diagSize = rows > cols ? cols : rows;
591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_innerSize = IsRowMajor ? cols : rows;
592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        eigen_assert(rows == cols && "Skyline matrix must be square matrix");
594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (diagSize % 2) { // diagSize is odd
596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index k = (diagSize - 1) / 2;
597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            m_data.resize(diagSize, IsRowMajor ? cols : rows, IsRowMajor ? rows : cols,
599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    2 * k * k + k + 1,
600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    2 * k * k + k + 1);
601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else // diagSize is even
603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        {
604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            const Index k = diagSize / 2;
605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            m_data.resize(diagSize, IsRowMajor ? cols : rows, IsRowMajor ? rows : cols,
606c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    2 * k * k - k + 1,
607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    2 * k * k - k + 1);
608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (m_colStartIndex && m_rowStartIndex) {
611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            delete[] m_colStartIndex;
612c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            delete[] m_rowStartIndex;
613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
614c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_colStartIndex = new Index [cols + 1];
615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_rowStartIndex = new Index [rows + 1];
616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_outerSize = diagSize;
617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_data.reset();
619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_data.clear();
620c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
621c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_outerSize = diagSize;
622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        memset(m_colStartIndex, 0, (cols + 1) * sizeof (Index));
623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        memset(m_rowStartIndex, 0, (rows + 1) * sizeof (Index));
624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void resizeNonZeros(Index size) {
627c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_data.resize(size);
628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
629c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline SkylineMatrix()
631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    : m_outerSize(-1), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        resize(0, 0);
633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline SkylineMatrix(size_t rows, size_t cols)
636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    : m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        resize(rows, cols);
638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
640c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
641c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline SkylineMatrix(const SkylineMatrixBase<OtherDerived>& other)
642c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    : m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
643c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        *this = other.derived();
644c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
645c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
646c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline SkylineMatrix(const SkylineMatrix & other)
647c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    : Base(), m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
648c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        *this = other.derived();
649c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
650c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
651c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void swap(SkylineMatrix & other) {
652c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        //EIGEN_DBG_SKYLINE(std::cout << "SkylineMatrix:: swap\n");
653c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::swap(m_colStartIndex, other.m_colStartIndex);
654c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::swap(m_rowStartIndex, other.m_rowStartIndex);
655c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::swap(m_innerSize, other.m_innerSize);
656c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::swap(m_outerSize, other.m_outerSize);
657c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_data.swap(other.m_data);
658c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
659c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
660c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline SkylineMatrix & operator=(const SkylineMatrix & other) {
661c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << "SkylineMatrix& operator=(const SkylineMatrix& other)\n";
662c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (other.isRValue()) {
663c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            swap(other.const_cast_derived());
664c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
665c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            resize(other.rows(), other.cols());
666c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            memcpy(m_colStartIndex, other.m_colStartIndex, (m_outerSize + 1) * sizeof (Index));
667c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            memcpy(m_rowStartIndex, other.m_rowStartIndex, (m_outerSize + 1) * sizeof (Index));
668c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            m_data = other.m_data;
669c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
670c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return *this;
671c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
672c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
673c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
674c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            inline SkylineMatrix & operator=(const SkylineMatrixBase<OtherDerived>& other) {
675c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        const bool needToTranspose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);
676c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if (needToTranspose) {
677c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //         TODO
678c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            //            return *this;
679c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        } else {
680c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            // there is no special optimization
681c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            return SkylineMatrixBase<SkylineMatrix>::operator=(other.derived());
682c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
683c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
684c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
685c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    friend std::ostream & operator <<(std::ostream & s, const SkylineMatrix & m) {
686c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
687c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        EIGEN_DBG_SKYLINE(
688c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << "upper elements : " << std::endl;
689c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for (Index i = 0; i < m.m_data.upperSize(); i++)
690c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            std::cout << m.m_data.upper(i) << "\t";
691c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << std::endl;
692c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << "upper profile : " << std::endl;
693c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for (Index i = 0; i < m.m_data.upperProfileSize(); i++)
694c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            std::cout << m.m_data.upperProfile(i) << "\t";
695c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << std::endl;
696c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << "lower startIdx : " << std::endl;
697c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for (Index i = 0; i < m.m_data.upperProfileSize(); i++)
698c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            std::cout << (IsRowMajor ? m.m_colStartIndex[i] : m.m_rowStartIndex[i]) << "\t";
699c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << std::endl;
700c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
701c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
702c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << "lower elements : " << std::endl;
703c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for (Index i = 0; i < m.m_data.lowerSize(); i++)
704c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            std::cout << m.m_data.lower(i) << "\t";
705c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << std::endl;
706c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << "lower profile : " << std::endl;
707c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for (Index i = 0; i < m.m_data.lowerProfileSize(); i++)
708c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            std::cout << m.m_data.lowerProfile(i) << "\t";
709c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << std::endl;
710c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << "lower startIdx : " << std::endl;
711c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for (Index i = 0; i < m.m_data.lowerProfileSize(); i++)
712c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            std::cout << (IsRowMajor ? m.m_rowStartIndex[i] : m.m_colStartIndex[i]) << "\t";
713c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        std::cout << std::endl;
714c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        );
715c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        for (Index rowIdx = 0; rowIdx < m.rows(); rowIdx++) {
716c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            for (Index colIdx = 0; colIdx < m.cols(); colIdx++) {
717c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                s << m.coeff(rowIdx, colIdx) << "\t";
718c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            }
719c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            s << std::endl;
720c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        }
721c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return s;
722c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
723c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
724c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Destructor */
725c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline ~SkylineMatrix() {
726c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        delete[] m_colStartIndex;
727c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        delete[] m_rowStartIndex;
728c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
729c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
730c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Overloaded for performance */
731c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Scalar sum() const;
732c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
733c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
734c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int _Options>
735c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass SkylineMatrix<Scalar, _Options>::InnerUpperIterator {
736c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
737c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
738c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    InnerUpperIterator(const SkylineMatrix& mat, Index outer)
739c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    : m_matrix(mat), m_outer(outer),
740c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_id(_Options == RowMajor ? mat.m_colStartIndex[outer] : mat.m_rowStartIndex[outer] + 1),
741c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_start(m_id),
742c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_end(_Options == RowMajor ? mat.m_colStartIndex[outer + 1] : mat.m_rowStartIndex[outer + 1] + 1) {
743c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
744c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
745c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline InnerUpperIterator & operator++() {
746c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_id++;
747c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return *this;
748c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
749c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
750c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline InnerUpperIterator & operator+=(Index shift) {
751c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_id += shift;
752c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return *this;
753c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
754c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
755c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar value() const {
756c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_matrix.m_data.upper(m_id);
757c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
758c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
759c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar* valuePtr() {
760c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return const_cast<Scalar*> (&(m_matrix.m_data.upper(m_id)));
761c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
762c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
763c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& valueRef() {
764c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return const_cast<Scalar&> (m_matrix.m_data.upper(m_id));
765c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
766c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
767c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index index() const {
768c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return IsRowMajor ? m_outer - m_matrix.m_data.upperProfile(m_outer) + (m_id - m_start) :
769c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                m_outer + (m_id - m_start) + 1;
770c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
771c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
772c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index row() const {
773c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return IsRowMajor ? index() : m_outer;
774c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
775c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
776c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index col() const {
777c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return IsRowMajor ? m_outer : index();
778c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
779c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
780c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline size_t size() const {
781c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_matrix.m_data.upperProfile(m_outer);
782c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
783c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
784c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline operator bool() const {
785c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return (m_id < m_end) && (m_id >= m_start);
786c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
787c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
788c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected:
789c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const SkylineMatrix& m_matrix;
790c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Index m_outer;
791c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index m_id;
792c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Index m_start;
793c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Index m_end;
794c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
795c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
796c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int _Options>
797c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass SkylineMatrix<Scalar, _Options>::InnerLowerIterator {
798c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic:
799c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
800c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    InnerLowerIterator(const SkylineMatrix& mat, Index outer)
801c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    : m_matrix(mat),
802c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_outer(outer),
803c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_id(_Options == RowMajor ? mat.m_rowStartIndex[outer] : mat.m_colStartIndex[outer] + 1),
804c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_start(m_id),
805c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_end(_Options == RowMajor ? mat.m_rowStartIndex[outer + 1] : mat.m_colStartIndex[outer + 1] + 1) {
806c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
807c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
808c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline InnerLowerIterator & operator++() {
809c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_id++;
810c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return *this;
811c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
812c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
813c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline InnerLowerIterator & operator+=(Index shift) {
814c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        m_id += shift;
815c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return *this;
816c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
817c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
818c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar value() const {
819c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_matrix.m_data.lower(m_id);
820c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
821c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
822c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar* valuePtr() {
823c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return const_cast<Scalar*> (&(m_matrix.m_data.lower(m_id)));
824c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
825c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
826c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& valueRef() {
827c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return const_cast<Scalar&> (m_matrix.m_data.lower(m_id));
828c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
829c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
830c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index index() const {
831c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return IsRowMajor ? m_outer - m_matrix.m_data.lowerProfile(m_outer) + (m_id - m_start) :
832c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                m_outer + (m_id - m_start) + 1;
833c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        ;
834c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
835c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
836c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index row() const {
837c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return IsRowMajor ? m_outer : index();
838c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
839c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
840c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index col() const {
841c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return IsRowMajor ? index() : m_outer;
842c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
843c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
844c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline size_t size() const {
845c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return m_matrix.m_data.lowerProfile(m_outer);
846c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
847c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
848c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline operator bool() const {
849c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return (m_id < m_end) && (m_id >= m_start);
850c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
851c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
852c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected:
853c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const SkylineMatrix& m_matrix;
854c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Index m_outer;
855c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index m_id;
856c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Index m_start;
857c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Index m_end;
858c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
859c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
860c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
861c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
862c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_SkylineMatrix_H
863