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"
23template <
typename Mat>
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;
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;
108 m_row_slice_length{m_row_slice.adjust(
mat.
rows())},
110 m_col_slice_length{m_col_slice.adjust(
mat.
cols())} {}
136 slp_assert(
rows() == 1 &&
cols() == 1);
138 (*this)[0, 0] =
value;
149 slp_assert(
rows() == 1 &&
cols() == 1);
151 (*this)[0, 0].set_value(
value);
158 template <
typename Derived>
174 template <
typename Derived>
175 requires std::same_as<typename Derived::Scalar, Scalar>
222 requires(!std::is_const_v<Mat>)
226 return (*m_mat)[m_row_slice.
start +
row * m_row_slice.
step,
238 return (*m_mat)[m_row_slice.
start +
row * m_row_slice.
step,
247 requires(!std::is_const_v<Mat>)
249 slp_assert(index >= 0 && index <
rows() *
cols());
250 return (*
this)[index /
cols(), index %
cols()];
258 slp_assert(index >= 0 && index <
rows() *
cols());
259 return (*
this)[index /
cols(), index %
cols()];
375 slp_assert(
cols() == 1);
387 slp_assert(
cols() == 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) {
468 slp_assert(
rhs.rows() == 1 &&
rhs.cols() == 1);
514 slp_assert(
rows() == 1 &&
cols() == 1);
546 slp_assert(
rows() == 1 &&
cols() == 1);
560 slp_assert(
rows() == 1 &&
cols() == 1);
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; }
601 slp_assert(index >= 0 && index <
rows() *
cols());
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} {}
654 constexpr iterator& operator++() noexcept {
659 constexpr iterator operator++(
int)
noexcept {
660 iterator retval = *
this;
665 constexpr iterator& operator--() noexcept {
670 constexpr iterator operator--(
int)
noexcept {
671 iterator retval = *
this;
676 constexpr bool operator==(
const iterator&)
const noexcept =
default;
678 constexpr reference operator*() const noexcept {
return (*m_mat)[m_index]; }
681 VariableBlock<Mat>* m_mat =
nullptr;
685 class const_iterator {
687 using iterator_category = std::bidirectional_iterator_tag;
688 using value_type = Variable<Scalar>;
689 using difference_type = std::ptrdiff_t;
690 using pointer = Variable<Scalar>*;
691 using const_reference =
const Variable<Scalar>&;
693 constexpr const_iterator() noexcept = default;
695 constexpr const_iterator(const VariableBlock<Mat>* mat,
int index) noexcept
696 : m_mat{mat}, m_index{index} {}
698 constexpr const_iterator& operator++() noexcept {
703 constexpr const_iterator operator++(
int)
noexcept {
704 const_iterator retval = *
this;
709 constexpr const_iterator& operator--() noexcept {
714 constexpr const_iterator operator--(
int)
noexcept {
715 iterator retval = *
this;
720 constexpr bool operator==(
const const_iterator&)
const noexcept =
default;
722 constexpr const_reference operator*() const noexcept {
723 return (*m_mat)[m_index];
727 const VariableBlock<Mat>* m_mat =
nullptr;
731 using reverse_iterator = std::reverse_iterator<iterator>;
732 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
739 iterator
begin() {
return iterator(
this, 0); }
749 const_iterator
begin()
const {
return const_iterator(
this, 0); }
754 const_iterator
end()
const {
return const_iterator(
this,
rows() *
cols()); }
759 const_iterator
cbegin()
const {
return const_iterator(
this, 0); }
764 const_iterator
cend()
const {
return const_iterator(
this,
rows() *
cols()); }
769 reverse_iterator
rbegin() {
return reverse_iterator{
end()}; }
774 reverse_iterator
rend() {
return reverse_iterator{
begin()}; }
780 return const_reverse_iterator{
end()};
786 const_reverse_iterator
rend()
const {
787 return const_reverse_iterator{
begin()};
794 return const_reverse_iterator{
cend()};
800 const_reverse_iterator
crend()
const {
801 return const_reverse_iterator{
cbegin()};
810 Mat* m_mat =
nullptr;
813 int m_row_slice_length = 0;
816 int m_col_slice_length = 0;
Definition intrusive_shared_ptr.hpp:27
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 start
Start index (inclusive).
Definition slice.hpp:28
Definition variable_block.hpp:24
VariableBlock< Mat > & operator=(const Mat &values)
Definition variable_block.hpp:190
VariableBlock< Mat > & operator*=(const ScalarLike auto &rhs)
Definition variable_block.hpp:453
const_iterator begin() const
Definition variable_block.hpp:749
const_iterator end() const
Definition variable_block.hpp:754
void set_value(const Eigen::MatrixBase< Derived > &values)
Definition variable_block.hpp:176
const_iterator cbegin() const
Definition variable_block.hpp:759
void set_value(Scalar value)
Definition variable_block.hpp:148
VariableBlock< Mat > row(int row)
Definition variable_block.hpp:397
VariableBlock< Mat > operator[](Slice row_slice, int row_slice_length, Slice col_slice, int col_slice_length)
Definition variable_block.hpp:329
VariableBlock< Mat > & operator=(ScalarLike auto value)
Definition variable_block.hpp:135
Variable< Scalar > & operator[](int index)
Definition variable_block.hpp:246
Variable< Scalar > & operator[](int row, int col)
Definition variable_block.hpp:221
VariableBlock< Mat > & operator+=(const MatrixLike auto &rhs)
Definition variable_block.hpp:497
VariableBlock< Mat > & operator*=(const MatrixLike auto &rhs)
Definition variable_block.hpp:433
iterator begin()
Definition variable_block.hpp:739
VariableBlock(VariableBlock< Mat > &&)=default
Move constructor.
VariableBlock< Mat > & operator=(const VariableBlock< Mat > &values)
Definition variable_block.hpp:36
const Variable< Scalar > & operator[](int index) const
Definition variable_block.hpp:257
VariableBlock< const Mat > col(int col) const
Definition variable_block.hpp:424
int rows() const
Definition variable_block.hpp:582
VariableBlock< Mat > operator[](Slice row_slice, Slice col_slice)
Definition variable_block.hpp:301
VariableBlock< Mat > col(int col)
Definition variable_block.hpp:415
const VariableBlock< const Mat > operator[](Slice row_slice, Slice col_slice) const
Definition variable_block.hpp:312
VariableBlock< Mat > & operator=(const Eigen::MatrixBase< Derived > &values)
Definition variable_block.hpp:159
Scalar value(int index)
Definition variable_block.hpp:600
reverse_iterator rbegin()
Definition variable_block.hpp:769
VariableBlock< Mat > & operator=(Mat &&values)
Definition variable_block.hpp:205
const_iterator cend() const
Definition variable_block.hpp:764
VariableBlock< Mat > & operator/=(const MatrixLike auto &rhs)
Definition variable_block.hpp:467
const Variable< Scalar > & operator[](int row, int col) const
Definition variable_block.hpp:235
const_reverse_iterator crbegin() const
Definition variable_block.hpp:793
VariableBlock< Mat > & operator-=(const ScalarLike auto &rhs)
Definition variable_block.hpp:545
VariableBlock(Mat &mat, int row_offset, int col_offset, int block_rows, int block_cols)
Definition variable_block.hpp:104
VariableBlock< Mat > & operator/=(const ScalarLike auto &rhs)
Definition variable_block.hpp:483
VariableBlock< Mat > segment(int offset, int length)
Definition variable_block.hpp:374
const_reverse_iterator rend() const
Definition variable_block.hpp:786
VariableBlock< Mat > & operator-=(const MatrixLike auto &rhs)
Definition variable_block.hpp:529
VariableBlock< Mat > & operator+=(const ScalarLike auto &rhs)
Definition variable_block.hpp:513
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > value()
Definition variable_block.hpp:608
iterator end()
Definition variable_block.hpp:744
VariableBlock(Mat &mat)
Definition variable_block.hpp:95
VariableBlock< const Mat > row(int row) const
Definition variable_block.hpp:406
const VariableBlock< Mat > segment(int offset, int length) const
Definition variable_block.hpp:386
Scalar value(int row, int col)
Definition variable_block.hpp:594
int cols() const
Definition variable_block.hpp:587
VariableBlock< Mat > block(int row_offset, int col_offset, int block_rows, int block_cols)
Definition variable_block.hpp:269
reverse_iterator rend()
Definition variable_block.hpp:774
size_t size() const
Definition variable_block.hpp:807
std::remove_cv_t< Mat > T() const
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
Definition variable_block.hpp:625
VariableBlock< Mat > & operator=(VariableBlock< Mat > &&values)
Definition variable_block.hpp:67
VariableBlock(Mat &mat, Slice row_slice, int row_slice_length, Slice col_slice, int col_slice_length)
Definition variable_block.hpp:121
const VariableBlock< const Mat > operator[](Slice row_slice, int row_slice_length, Slice col_slice, int col_slice_length) const
Definition variable_block.hpp:353
const_reverse_iterator crend() const
Definition variable_block.hpp:800
const_reverse_iterator rbegin() const
Definition variable_block.hpp:779
const VariableBlock< const Mat > block(int row_offset, int col_offset, int block_rows, int block_cols) const
Definition variable_block.hpp:286
typename Mat::Scalar Scalar
Scalar type alias.
Definition variable_block.hpp:27
Definition variable.hpp:47
Definition function_ref.hpp:13
Definition concepts.hpp:18
Definition concepts.hpp:24