aligator  0.6.1
A primal-dual augmented Lagrangian-type solver for nonlinear trajectory optimization.
Loading...
Searching...
No Matches
blk-matrix.hpp
Go to the documentation of this file.
1
3#pragma once
4
5#include "aligator/math.hpp"
6#include <array>
7#include <numeric>
8
9namespace aligator {
10
13template <typename _MatrixType, int _N, int _M = _N> class BlkMatrix {
14public:
15 using MatrixType = _MatrixType;
16 using PlainObject = typename MatrixType::PlainObject;
17 using Scalar = typename MatrixType::Scalar;
18 enum { N = _N, M = _M, Options = PlainObject::Options };
19
20 using row_dim_t = std::conditional_t<N != -1, std::array<long, size_t(N)>,
21 std::vector<long>>;
22 using col_dim_t = std::conditional_t<M != -1, std::array<long, size_t(M)>,
23 std::vector<long>>;
24
25 static_assert(N != 0 && M != 0,
26 "The BlkMatrix template class only supports nonzero numbers of "
27 "blocks in either direction.");
28
29 static_assert(!MatrixType::IsVectorAtCompileTime || (M == 1),
30 "Compile-time vector cannot have more than one column block.");
31
35
42
43 template <typename Other>
44 BlkMatrix(const Eigen::MatrixBase<Other> &data, const row_dim_t &rowDims,
45 const col_dim_t &colDims)
46 : m_data(data.derived()), //
49 initialize();
50 }
51
52 template <typename Other>
53 BlkMatrix(Eigen::MatrixBase<Other> &data, const row_dim_t &rowDims,
54 const col_dim_t &colDims)
55 : m_data(data.derived()), //
58 initialize();
59 }
60
62 template <typename Other>
63 BlkMatrix(const Eigen::MatrixBase<Other> &data, const row_dim_t &dims)
64 : BlkMatrix(data, dims, {data.cols()}) {}
65
67 template <typename Other>
68 BlkMatrix(Eigen::MatrixBase<Other> &data, const row_dim_t &dims)
69 : BlkMatrix(data, dims, {data.cols()}) {}
70
72 explicit BlkMatrix(const row_dim_t &dims) : BlkMatrix(dims, {1}) {}
73
75 inline auto operator()(size_t i, size_t j) {
76 return m_data.block(m_rowIndices[i], m_colIndices[j], m_rowDims[i],
77 m_colDims[j]);
78 }
79
81 inline auto operator()(size_t i, size_t j) const {
82 return m_data.block(m_rowIndices[i], m_colIndices[j], m_rowDims[i],
83 m_colDims[j]);
84 }
85
86 inline auto blockRow(size_t i) {
87 return m_data.middleRows(m_rowIndices[i], m_rowDims[i]);
88 }
89
90 inline auto blockRow(size_t i) const {
91 return m_data.middleRows(m_rowIndices[i], m_rowDims[i]);
92 }
93
94 inline auto blockCol(size_t j) const {
95 return m_data.middleCols(m_colIndices[j], m_colDims[j]);
96 }
97
98 inline auto blockCol(size_t j) {
99 return m_data.middleCols(m_colIndices[j], m_colDims[j]);
100 }
101
102 auto blockSegment(size_t i) {
103 EIGEN_STATIC_ASSERT_VECTOR_ONLY(MatrixType);
104 return m_data.segment(m_rowIndices[i], m_rowDims[i]);
105 }
106
107 auto blockSegment(size_t i) const {
108 EIGEN_STATIC_ASSERT_VECTOR_ONLY(MatrixType);
109 return m_data.segment(m_rowIndices[i], m_rowDims[i]);
110 }
111
112 inline auto operator[](size_t i) { return blockSegment(i); }
113
114 inline auto operator[](size_t i) const { return blockSegment(i); }
115
117 template <typename Other>
118 BlkMatrix &operator=(const Eigen::MatrixBase<Other> &other) {
119 assert(other.rows() == m_data.rows());
120 assert(other.cols() == m_data.cols());
121 m_data = other;
122 return *this;
123 }
124
125 void setZero() { m_data.setZero(); }
126
127 template <typename Other> inline void swap(BlkMatrix<Other, N, M> &other) {
128 m_data.swap(other.matrix());
129 }
130
131 MatrixType &matrix() { return m_data; }
132 const MatrixType &matrix() const { return m_data; }
133
134 const row_dim_t &rowDims() const { return m_rowDims; }
135 const row_dim_t &rowIndices() const { return m_rowIndices; }
136 const col_dim_t &colDims() const { return m_colDims; }
137 const col_dim_t &colIndices() const { return m_colIndices; }
138
139 long rows() const { return m_totalRows; }
140 long cols() const { return m_totalCols; }
141
142 auto topBlkRows(size_t n) {
143 using OutType = BlkMatrix<Eigen::Ref<MatrixType>, -1, M>;
144 std::vector<long> subRowDims;
145 subRowDims.resize(n);
146 std::copy_n(m_rowDims.cbegin(), n, subRowDims.begin());
147 long ntr = std::accumulate(subRowDims.begin(), subRowDims.end(), 0);
148 return OutType(m_data.topRows(ntr), subRowDims, m_colDims);
149 }
150
151 template <size_t n> auto topBlkRows() {
152 static_assert(n <= N,
153 "Cannot take n block rows of matrix with <n block rows.");
154 using RefType = Eigen::Ref<MatrixType>;
155 using OutType = BlkMatrix<RefType, n, M>;
156 std::array<long, n> subRowDims;
157 std::copy_n(m_rowDims.cbegin(), n, subRowDims.begin());
158 long ntr = std::accumulate(subRowDims.begin(), subRowDims.end(), 0);
159 return OutType(m_data.topRows(ntr), subRowDims, m_colDims);
160 }
161
162 friend std::ostream &operator<<(std::ostream &oss, const BlkMatrix &self) {
163 return oss << self.m_data;
164 }
165
166protected:
174
175 explicit BlkMatrix(const row_dim_t &dims, std::true_type)
176 : BlkMatrix(dims, dims) {}
177 explicit BlkMatrix(const row_dim_t &dims, std::false_type)
178 : BlkMatrix(dims, {1}) {}
179
180 void initialize() {
181 for (size_t i = 0; i < m_rowDims.size(); i++) {
184 }
185 for (size_t i = 0; i < m_colDims.size(); i++) {
188 }
190 }
191};
192
193} // namespace aligator
Block matrix class, with a fixed-size number of row and column blocks.
auto blockSegment(size_t i)
void swap(BlkMatrix< Other, N, M > &other)
friend std::ostream & operator<<(std::ostream &oss, const BlkMatrix &self)
auto blockSegment(size_t i) const
_MatrixType MatrixType
auto topBlkRows(size_t n)
typename MatrixType::PlainObject PlainObject
const row_dim_t & rowDims() const
BlkMatrix(const row_dim_t &dims, std::true_type)
BlkMatrix(const Eigen::MatrixBase< Other > &data, const row_dim_t &dims)
Only-rows constructor (only for vectors)
auto blockRow(size_t i)
MatrixType & matrix()
BlkMatrix(const row_dim_t &dims)
Only-rows constructor (only for vectors)
auto blockCol(size_t j)
auto operator()(size_t i, size_t j)
Get the block in position ( i, j )
BlkMatrix(const row_dim_t &dims, std::false_type)
BlkMatrix(const Eigen::MatrixBase< Other > &data, const row_dim_t &rowDims, const col_dim_t &colDims)
auto operator[](size_t i) const
auto blockCol(size_t j) const
auto operator()(size_t i, size_t j) const
const row_dim_t & rowIndices() const
BlkMatrix(Eigen::MatrixBase< Other > &data, const row_dim_t &dims)
Only-rows constructor (only for vectors)
typename MatrixType::Scalar Scalar
const MatrixType & matrix() const
auto blockRow(size_t i) const
const col_dim_t & colDims() const
std::conditional_t< M !=-1, std::array< long, size_t(M)>, std::vector< long > > col_dim_t
const col_dim_t & colIndices() const
BlkMatrix & operator=(const Eigen::MatrixBase< Other > &other)
Set the data to be equal to some other Eigen object.
BlkMatrix(const row_dim_t &rowDims, const col_dim_t &colDims)
std::conditional_t< N !=-1, std::array< long, size_t(N)>, std::vector< long > > row_dim_t
BlkMatrix(Eigen::MatrixBase< Other > &data, const row_dim_t &rowDims, const col_dim_t &colDims)
auto operator[](size_t i)
Math utilities.
Main package namespace.