23template <
typename Mat>
37 if (
this == &values) {
41 if (m_mat ==
nullptr) {
43 m_row_slice = values.m_row_slice;
44 m_row_slice_length = values.m_row_slice_length;
45 m_col_slice = values.m_col_slice;
46 m_col_slice_length = values.m_col_slice_length;
68 if (
this == &values) {
72 if (m_mat ==
nullptr) {
74 m_row_slice = values.m_row_slice;
75 m_row_slice_length = values.m_row_slice_length;
76 m_col_slice = values.m_col_slice;
77 m_col_slice_length = values.m_col_slice_length;
107 m_row_slice{row_offset, row_offset + block_rows, 1},
108 m_row_slice_length{m_row_slice.adjust(mat.
rows())},
109 m_col_slice{col_offset, col_offset + block_cols, 1},
110 m_col_slice_length{m_col_slice.adjust(mat.
cols())} {}
122 Slice col_slice,
int col_slice_length)
124 m_row_slice{
std::move(row_slice)},
125 m_row_slice_length{row_slice_length},
126 m_col_slice{
std::move(col_slice)},
127 m_col_slice_length{col_slice_length} {}
138 (*this)(0, 0) =
value;
158 template <
typename Derived>
174 template <
typename Derived>
175 requires std::same_as<typename Derived::Scalar, Scalar>
176 void set_value(
const Eigen::MatrixBase<Derived>& values) {
222 requires(!std::is_const_v<Mat>)
226 return (*m_mat)(m_row_slice.start +
row * m_row_slice.step,
227 m_col_slice.start +
col * m_col_slice.step);
238 return (*m_mat)(m_row_slice.start +
row * m_row_slice.step,
239 m_col_slice.start +
col * m_col_slice.step);
247 requires(!std::is_const_v<Mat>)
275 return (*
this)({row_offset, row_offset + block_rows, 1},
276 {col_offset, col_offset + block_cols, 1});
287 int block_rows,
int block_cols)
const {
292 return (*
this)({row_offset, row_offset + block_rows, 1},
293 {col_offset, col_offset + block_cols, 1});
302 int row_slice_length = row_slice.
adjust(m_row_slice_length);
303 int col_slice_length = col_slice.
adjust(m_col_slice_length);
304 return (*
this)(row_slice, row_slice_length, col_slice, col_slice_length);
313 Slice col_slice)
const {
314 int row_slice_length = row_slice.
adjust(m_row_slice_length);
315 int col_slice_length = col_slice.
adjust(m_col_slice_length);
316 return (*
this)(row_slice, row_slice_length, col_slice, col_slice_length);
330 Slice col_slice,
int col_slice_length) {
333 {m_row_slice.start + row_slice.
start * m_row_slice.step,
334 m_row_slice.start + row_slice.
stop * m_row_slice.step,
335 row_slice.
step * m_row_slice.step},
337 {m_col_slice.start + col_slice.
start * m_col_slice.step,
338 m_col_slice.start + col_slice.
stop * m_col_slice.step,
339 col_slice.
step * m_col_slice.step},
354 int row_slice_length,
356 int col_slice_length)
const {
359 {m_row_slice.start + row_slice.
start * m_row_slice.step,
360 m_row_slice.start + row_slice.
stop * m_row_slice.step,
361 row_slice.
step * m_row_slice.step},
363 {m_col_slice.start + col_slice.
start * m_col_slice.step,
364 m_col_slice.start + col_slice.
stop * m_col_slice.step,
365 col_slice.
step * m_col_slice.step},
378 return block(offset, 0, length, 1);
390 return block(offset, 0, length, 1);
436 for (
int i = 0; i <
rows(); ++i) {
437 for (
int j = 0; j < rhs.cols(); ++j) {
439 for (
int k = 0; k <
cols(); ++k) {
440 sum += (*this)(i, k) * rhs(k, j);
468 slp_assert(rhs.rows() == 1 && rhs.cols() == 1);
472 (*this)(
row,
col) /= rhs(0, 0);
561 return (*
this)(0, 0);
567 std::remove_cv_t<Mat>
T()
const {
582 int rows()
const {
return m_row_slice_length; }
587 int cols()
const {
return m_col_slice_length; }
608 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>
value() {
609 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> result{
rows(),
639#ifndef DOXYGEN_SHOULD_SKIP_THIS
652 : m_mat{mat}, m_index{
index} {}
696 : m_mat{mat}, m_index{
index} {}
723 return (*m_mat)[m_index];
810 Mat* m_mat =
nullptr;
813 int m_row_slice_length = 0;
816 int m_col_slice_length = 0;
#define slp_assert(condition)
Abort in C++.
Definition assert.hpp:25
@ index
Definition base.h:690
Marker interface for concepts to determine whether a given scalar or matrix type belongs to Sleipnir.
Definition sleipnir_base.hpp:9
Represents a sequence of elements in an iterable object.
Definition slice.hpp:25
int step
Step.
Definition slice.hpp:34
int stop
Stop index (exclusive).
Definition slice.hpp:31
constexpr int adjust(int length)
Adjusts start and end slice indices assuming a sequence of the specified length.
Definition slice.hpp:118
int start
Start index (inclusive).
Definition slice.hpp:28
Definition variable_block.hpp:685
Variable< Scalar > * pointer
Definition variable_block.hpp:690
constexpr bool operator==(const const_iterator &) const noexcept=default
constexpr const_iterator() noexcept=default
Variable< Scalar > value_type
Definition variable_block.hpp:688
std::bidirectional_iterator_tag iterator_category
Definition variable_block.hpp:687
constexpr const_iterator & operator--() noexcept
Definition variable_block.hpp:709
const Variable< Scalar > & const_reference
Definition variable_block.hpp:691
constexpr const_reference operator*() const noexcept
Definition variable_block.hpp:722
std::ptrdiff_t difference_type
Definition variable_block.hpp:689
constexpr const_iterator operator--(int) noexcept
Definition variable_block.hpp:714
constexpr const_iterator operator++(int) noexcept
Definition variable_block.hpp:703
constexpr const_iterator & operator++() noexcept
Definition variable_block.hpp:698
Definition variable_block.hpp:641
Variable< Scalar > * pointer
Definition variable_block.hpp:646
std::bidirectional_iterator_tag iterator_category
Definition variable_block.hpp:643
constexpr iterator operator++(int) noexcept
Definition variable_block.hpp:659
constexpr bool operator==(const iterator &) const noexcept=default
std::ptrdiff_t difference_type
Definition variable_block.hpp:645
constexpr iterator & operator--() noexcept
Definition variable_block.hpp:665
constexpr iterator & operator++() noexcept
Definition variable_block.hpp:654
Variable< Scalar > value_type
Definition variable_block.hpp:644
constexpr iterator() noexcept=default
Variable< Scalar > & reference
Definition variable_block.hpp:647
constexpr reference operator*() const noexcept
Definition variable_block.hpp:678
constexpr iterator operator--(int) noexcept
Definition variable_block.hpp:670
VariableBlock< Mat > & operator=(const Mat &values)
Assigns a VariableMatrix to the block.
Definition variable_block.hpp:190
VariableBlock< Mat > & operator*=(const ScalarLike auto &rhs)
Compound matrix multiplication-assignment operator.
Definition variable_block.hpp:453
const_iterator begin() const
Returns begin iterator.
Definition variable_block.hpp:749
const_iterator end() const
Returns end iterator.
Definition variable_block.hpp:754
void set_value(const Eigen::MatrixBase< Derived > &values)
Sets block's internal values.
Definition variable_block.hpp:176
const_iterator cbegin() const
Returns const begin iterator.
Definition variable_block.hpp:759
void set_value(Scalar value)
Assigns a scalar to the block.
Definition variable_block.hpp:148
VariableBlock< Mat > row(int row)
Returns a row slice of the variable matrix.
Definition variable_block.hpp:397
VariableBlock< Mat > & operator=(ScalarLike auto value)
Assigns a scalar to the block.
Definition variable_block.hpp:135
Variable< Scalar > & operator[](int index)
Returns a scalar subblock at the given index.
Definition variable_block.hpp:246
VariableBlock< Mat > & operator+=(const MatrixLike auto &rhs)
Compound addition-assignment operator.
Definition variable_block.hpp:497
VariableBlock< Mat > & operator*=(const MatrixLike auto &rhs)
Compound matrix multiplication-assignment operator.
Definition variable_block.hpp:433
iterator begin()
Returns begin iterator.
Definition variable_block.hpp:739
VariableBlock(VariableBlock< Mat > &&)=default
Move constructor.
VariableBlock< Mat > & operator=(const VariableBlock< Mat > &values)
Assigns a VariableBlock to the block.
Definition variable_block.hpp:36
const Variable< Scalar > & operator[](int index) const
Returns a scalar subblock at the given index.
Definition variable_block.hpp:257
VariableBlock< const Mat > col(int col) const
Returns a column slice of the variable matrix.
Definition variable_block.hpp:424
int rows() const
Returns the number of rows in the matrix.
Definition variable_block.hpp:582
const VariableBlock< const Mat > operator()(Slice row_slice, int row_slice_length, Slice col_slice, int col_slice_length) const
Returns a slice of the variable matrix.
Definition variable_block.hpp:353
VariableBlock< Mat > col(int col)
Returns a column slice of the variable matrix.
Definition variable_block.hpp:415
VariableBlock< Mat > & operator=(const Eigen::MatrixBase< Derived > &values)
Assigns an Eigen matrix to the block.
Definition variable_block.hpp:159
Scalar value(int index)
Returns an element of the variable block.
Definition variable_block.hpp:600
VariableBlock< Mat > operator()(Slice row_slice, int row_slice_length, Slice col_slice, int col_slice_length)
Returns a slice of the variable matrix.
Definition variable_block.hpp:329
reverse_iterator rbegin()
Returns reverse begin iterator.
Definition variable_block.hpp:769
VariableBlock< Mat > & operator=(Mat &&values)
Assigns a VariableMatrix to the block.
Definition variable_block.hpp:205
const_iterator cend() const
Returns const end iterator.
Definition variable_block.hpp:764
const Variable< Scalar > & operator()(int row, int col) const
Returns a scalar subblock at the given row and column.
Definition variable_block.hpp:235
VariableBlock< Mat > & operator/=(const MatrixLike auto &rhs)
Compound matrix division-assignment operator.
Definition variable_block.hpp:467
const_reverse_iterator crbegin() const
Returns const reverse begin iterator.
Definition variable_block.hpp:793
VariableBlock< Mat > & operator-=(const ScalarLike auto &rhs)
Compound subtraction-assignment operator.
Definition variable_block.hpp:545
VariableBlock(Mat &mat, int row_offset, int col_offset, int block_rows, int block_cols)
Constructs a Variable block pointing to a subset of the given matrix.
Definition variable_block.hpp:104
VariableBlock< Mat > & operator/=(const ScalarLike auto &rhs)
Compound matrix division-assignment operator.
Definition variable_block.hpp:483
VariableBlock< Mat > segment(int offset, int length)
Returns a segment of the variable vector.
Definition variable_block.hpp:374
const_reverse_iterator rend() const
Returns const reverse end iterator.
Definition variable_block.hpp:786
VariableBlock< Mat > & operator-=(const MatrixLike auto &rhs)
Compound subtraction-assignment operator.
Definition variable_block.hpp:529
VariableBlock< Mat > & operator+=(const ScalarLike auto &rhs)
Compound addition-assignment operator.
Definition variable_block.hpp:513
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > value()
Returns the contents of the variable matrix.
Definition variable_block.hpp:608
iterator end()
Returns end iterator.
Definition variable_block.hpp:744
VariableBlock(Mat &mat)
Constructs a Variable block pointing to all of the given matrix.
Definition variable_block.hpp:95
VariableBlock< const Mat > row(int row) const
Returns a row slice of the variable matrix.
Definition variable_block.hpp:406
const VariableBlock< const Mat > operator()(Slice row_slice, Slice col_slice) const
Returns a slice of the variable matrix.
Definition variable_block.hpp:312
const VariableBlock< Mat > segment(int offset, int length) const
Returns a segment of the variable vector.
Definition variable_block.hpp:386
Scalar value(int row, int col)
Returns an element of the variable matrix.
Definition variable_block.hpp:594
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition variable_block.hpp:732
int cols() const
Returns the number of columns in the matrix.
Definition variable_block.hpp:587
VariableBlock< Mat > block(int row_offset, int col_offset, int block_rows, int block_cols)
Returns a block of the variable matrix.
Definition variable_block.hpp:269
reverse_iterator rend()
Returns reverse end iterator.
Definition variable_block.hpp:774
size_t size() const
Returns number of elements in matrix.
Definition variable_block.hpp:807
std::remove_cv_t< Mat > T() const
Returns the transpose of the variable matrix.
Definition variable_block.hpp:567
VariableBlock(const VariableBlock< Mat > &)=default
Copy constructor.
std::remove_cv_t< Mat > cwise_transform(function_ref< Variable< Scalar >(const Variable< Scalar > &x)> unary_op) const
Transforms the matrix coefficient-wise with an unary operator.
Definition variable_block.hpp:625
VariableBlock< Mat > & operator=(VariableBlock< Mat > &&values)
Assigns a VariableBlock to the block.
Definition variable_block.hpp:67
Variable< Scalar > & operator()(int row, int col)
Returns a scalar subblock at the given row and column.
Definition variable_block.hpp:221
VariableBlock(Mat &mat, Slice row_slice, int row_slice_length, Slice col_slice, int col_slice_length)
Constructs a Variable block pointing to a subset of the given matrix.
Definition variable_block.hpp:121
const_reverse_iterator crend() const
Returns const reverse end iterator.
Definition variable_block.hpp:800
VariableBlock< Mat > operator()(Slice row_slice, Slice col_slice)
Returns a slice of the variable matrix.
Definition variable_block.hpp:301
const_reverse_iterator rbegin() const
Returns const reverse begin iterator.
Definition variable_block.hpp:779
const VariableBlock< const Mat > block(int row_offset, int col_offset, int block_rows, int block_cols) const
Returns a block slice of the variable matrix.
Definition variable_block.hpp:286
typename Mat::Scalar Scalar
Scalar type alias.
Definition variable_block.hpp:27
std::reverse_iterator< iterator > reverse_iterator
Definition variable_block.hpp:731
An autodiff variable pointing to an expression node.
Definition variable.hpp:47
Definition function_ref.hpp:13
Definition concepts.hpp:18
Definition concepts.hpp:24
static constexpr empty_t empty
Designates an uninitialized VariableMatrix.
Definition empty.hpp:11
Definition expression_graph.hpp:11
Definition StringMap.hpp:773