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