11#include "sleipnir/autodiff/sleipnir_base.hpp"
12#include "sleipnir/autodiff/slice.hpp"
13#include "sleipnir/autodiff/variable.hpp"
14#include "sleipnir/util/assert.hpp"
15#include "sleipnir/util/empty.hpp"
16#include "sleipnir/util/function_ref.hpp"
25template <
typename Mat>
49 if (m_mat ==
nullptr) {
51 m_row_slice =
values.m_row_slice;
52 m_row_slice_length =
values.m_row_slice_length;
53 m_col_slice =
values.m_col_slice;
54 m_col_slice_length =
values.m_col_slice_length;
84 if (m_mat ==
nullptr) {
86 m_row_slice =
values.m_row_slice;
87 m_row_slice_length =
values.m_row_slice_length;
88 m_col_slice =
values.m_col_slice;
89 m_col_slice_length =
values.m_col_slice_length;
124 m_row_slice_length{m_row_slice.adjust(
mat.
rows())},
126 m_col_slice_length{m_col_slice.adjust(
mat.
cols())} {}
156 slp_assert(
rows() == 1 &&
cols() == 1);
158 (*this)[0, 0] =
value;
171 slp_assert(
rows() == 1 &&
cols() == 1);
173 (*this)[0, 0].set_value(
value);
182 template <
typename Derived>
200 template <
typename Derived>
201 requires std::same_as<typename Derived::Scalar, Scalar>
254 requires(!std::is_const_v<Mat>)
258 return (*m_mat)[m_row_slice.
start +
row * m_row_slice.
step,
272 return (*m_mat)[m_row_slice.
start +
row * m_row_slice.
step,
283 requires(!std::is_const_v<Mat>)
285 slp_assert(index >= 0 && index <
rows() *
cols());
286 return (*
this)[index /
cols(), index %
cols()];
296 slp_assert(index >= 0 && index <
rows() *
cols());
297 return (*
this)[index /
cols(), index %
cols()];
427 slp_assert(
cols() == 1);
441 slp_assert(
cols() == 1);
500 for (
int i = 0;
i <
rows(); ++
i) {
501 for (
int j = 0;
j <
rhs.cols(); ++
j) {
503 for (
int k = 0;
k <
cols(); ++
k) {
536 slp_assert(
rhs.rows() == 1 &&
rhs.cols() == 1);
588 slp_assert(
rows() == 1 &&
cols() == 1);
624 slp_assert(
rows() == 1 &&
cols() == 1);
640 slp_assert(
rows() == 1 &&
cols() == 1);
641 return (*
this)(0, 0);
649 std::remove_cv_t<Mat>
T()
const {
666 int rows()
const {
return m_row_slice_length; }
673 int cols()
const {
return m_col_slice_length; }
691 slp_assert(index >= 0 && index <
rows() *
cols());
700 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>
value() {
701 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>
result{
rows(),
733#ifndef DOXYGEN_SHOULD_SKIP_THIS
746 : m_mat{
mat}, m_index{index} {}
748 constexpr iterator& operator++() noexcept {
753 constexpr iterator operator++(
int)
noexcept {
754 iterator retval = *
this;
759 constexpr iterator& operator--() noexcept {
764 constexpr iterator operator--(
int)
noexcept {
765 iterator retval = *
this;
770 constexpr bool operator==(
const iterator&)
const noexcept =
default;
772 constexpr reference operator*() const noexcept {
return (*m_mat)[m_index]; }
775 VariableBlock<Mat>* m_mat =
nullptr;
779 class const_iterator {
781 using iterator_category = std::bidirectional_iterator_tag;
782 using value_type = Variable<Scalar>;
783 using difference_type = std::ptrdiff_t;
784 using pointer = Variable<Scalar>*;
785 using const_reference =
const Variable<Scalar>&;
787 constexpr const_iterator() noexcept = default;
789 constexpr const_iterator(const VariableBlock<Mat>* mat,
int index) noexcept
790 : m_mat{mat}, m_index{index} {}
792 constexpr const_iterator& operator++() noexcept {
797 constexpr const_iterator operator++(
int)
noexcept {
798 const_iterator retval = *
this;
803 constexpr const_iterator& operator--() noexcept {
808 constexpr const_iterator operator--(
int)
noexcept {
809 iterator retval = *
this;
814 constexpr bool operator==(
const const_iterator&)
const noexcept =
default;
816 constexpr const_reference operator*() const noexcept {
817 return (*m_mat)[m_index];
821 const VariableBlock<Mat>* m_mat =
nullptr;
825 using reverse_iterator = std::reverse_iterator<iterator>;
826 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
930 Mat* m_mat =
nullptr;
933 int m_row_slice_length = 0;
936 int m_col_slice_length = 0;
Definition intrusive_shared_ptr.hpp:29
Definition sleipnir_base.hpp:11
int step
Step.
Definition slice.hpp:40
int start
Start index (inclusive).
Definition slice.hpp:34
Definition variable_block.hpp:26
VariableBlock< Mat > & operator=(const Mat &values)
Definition variable_block.hpp:218
VariableBlock< Mat > & operator*=(const ScalarLike auto &rhs)
Definition variable_block.hpp:519
const_iterator begin() const
Definition variable_block.hpp:849
const_iterator end() const
Definition variable_block.hpp:856
void set_value(const Eigen::MatrixBase< Derived > &values)
Definition variable_block.hpp:202
const_iterator cbegin() const
Definition variable_block.hpp:863
void set_value(Scalar value)
Definition variable_block.hpp:170
VariableBlock< Mat > row(int row)
Definition variable_block.hpp:453
VariableBlock< Mat > operator[](Slice row_slice, int row_slice_length, Slice col_slice, int col_slice_length)
Definition variable_block.hpp:377
VariableBlock< Mat > & operator=(ScalarLike auto value)
Definition variable_block.hpp:155
Variable< Scalar > & operator[](int index)
Definition variable_block.hpp:282
Variable< Scalar > & operator[](int row, int col)
Definition variable_block.hpp:253
VariableBlock< Mat > & operator+=(const MatrixLike auto &rhs)
Definition variable_block.hpp:569
VariableBlock< Mat > & operator*=(const MatrixLike auto &rhs)
Definition variable_block.hpp:497
iterator begin()
Definition variable_block.hpp:835
VariableBlock(VariableBlock< Mat > &&)=default
VariableBlock< Mat > & operator=(const VariableBlock< Mat > &values)
Definition variable_block.hpp:44
const Variable< Scalar > & operator[](int index) const
Definition variable_block.hpp:295
VariableBlock< const Mat > col(int col) const
Definition variable_block.hpp:486
int rows() const
Definition variable_block.hpp:666
VariableBlock< Mat > operator[](Slice row_slice, Slice col_slice)
Definition variable_block.hpp:345
VariableBlock< Mat > col(int col)
Definition variable_block.hpp:475
const VariableBlock< const Mat > operator[](Slice row_slice, Slice col_slice) const
Definition variable_block.hpp:358
VariableBlock< Mat > & operator=(const Eigen::MatrixBase< Derived > &values)
Definition variable_block.hpp:183
Scalar value(int index)
Definition variable_block.hpp:690
reverse_iterator rbegin()
Definition variable_block.hpp:877
VariableBlock< Mat > & operator=(Mat &&values)
Definition variable_block.hpp:235
const_iterator cend() const
Definition variable_block.hpp:870
VariableBlock< Mat > & operator/=(const MatrixLike auto &rhs)
Definition variable_block.hpp:535
const Variable< Scalar > & operator[](int row, int col) const
Definition variable_block.hpp:269
const_reverse_iterator crbegin() const
Definition variable_block.hpp:909
VariableBlock< Mat > & operator-=(const ScalarLike auto &rhs)
Definition variable_block.hpp:623
VariableBlock(Mat &mat, int row_offset, int col_offset, int block_rows, int block_cols)
Definition variable_block.hpp:120
VariableBlock< Mat > & operator/=(const ScalarLike auto &rhs)
Definition variable_block.hpp:553
VariableBlock< Mat > segment(int offset, int length)
Definition variable_block.hpp:426
const_reverse_iterator rend() const
Definition variable_block.hpp:900
VariableBlock< Mat > & operator-=(const MatrixLike auto &rhs)
Definition variable_block.hpp:605
VariableBlock< Mat > & operator+=(const ScalarLike auto &rhs)
Definition variable_block.hpp:587
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > value()
Definition variable_block.hpp:700
iterator end()
Definition variable_block.hpp:842
VariableBlock(Mat &mat)
Definition variable_block.hpp:109
VariableBlock< const Mat > row(int row) const
Definition variable_block.hpp:464
const VariableBlock< Mat > segment(int offset, int length) const
Definition variable_block.hpp:440
Scalar value(int row, int col)
Definition variable_block.hpp:682
int cols() const
Definition variable_block.hpp:673
VariableBlock< Mat > block(int row_offset, int col_offset, int block_rows, int block_cols)
Definition variable_block.hpp:309
reverse_iterator rend()
Definition variable_block.hpp:884
size_t size() const
Definition variable_block.hpp:927
std::remove_cv_t< Mat > T() const
Definition variable_block.hpp:649
VariableBlock(const VariableBlock< Mat > &)=default
std::remove_cv_t< Mat > cwise_transform(function_ref< Variable< Scalar >(const Variable< Scalar > &x)> unary_op) const
Definition variable_block.hpp:719
VariableBlock< Mat > & operator=(VariableBlock< Mat > &&values)
Definition variable_block.hpp:79
VariableBlock(Mat &mat, Slice row_slice, int row_slice_length, Slice col_slice, int col_slice_length)
Definition variable_block.hpp:139
const VariableBlock< const Mat > operator[](Slice row_slice, int row_slice_length, Slice col_slice, int col_slice_length) const
Definition variable_block.hpp:403
const_reverse_iterator crend() const
Definition variable_block.hpp:918
const_reverse_iterator rbegin() const
Definition variable_block.hpp:891
const VariableBlock< const Mat > block(int row_offset, int col_offset, int block_rows, int block_cols) const
Definition variable_block.hpp:328
typename Mat::Scalar Scalar
Definition variable_block.hpp:31
Definition variable.hpp:49
Definition function_ref.hpp:13
Definition concepts.hpp:18
Definition concepts.hpp:24