8#include "proxsuite-nlp/config.hpp"
18using isize = Eigen::Index;
19using usize = std::make_unsigned<isize>::type;
48struct PROXSUITE_NLP_DLLAPI SymbolicBlockMatrix {
60 segment_lens =
new isize[usize(nsegments())];
67 : segments_count(nc), outer_stride(os) {
72 : m_data(data), segment_lens(lens), segments_count(nc), outer_stride(os) {
76 SymbolicBlockMatrix &operator=(SymbolicBlockMatrix
const &other) =
default;
77 SymbolicBlockMatrix(
const std::vector<isize> &lens)
78 : segments_count(static_cast<isize>(lens.size())) {
79 outer_stride = segments_count;
84 std::copy_n(lens.begin(), nsegments(), segment_lens);
88 SymbolicBlockMatrix
copy()
const;
90 isize nsegments() const noexcept {
return segments_count; }
91 isize size() const noexcept {
return segments_count * outer_stride; }
92 BlockKind *ptr(isize i, isize j)
noexcept {
93 return m_data + (i + j * outer_stride);
95 BlockKind
const *ptr(isize i, isize j)
const noexcept {
96 return m_data + (i + j * outer_stride);
101 SymbolicBlockMatrix
submatrix(isize i, isize n)
noexcept;
114 Eigen::ComputationInfo
117 bool check_if_symmetric() const noexcept;
118 isize count_nnz() const noexcept;
124 SymbolicBlockMatrix transpose()
const {
125 const auto &self = *
this;
126 SymbolicBlockMatrix out(self.copy());
127 for (isize i = 0; i < nsegments(); ++i) {
128 for (isize j = 0; j < nsegments(); ++j) {
129 out(i, j) =
trans(self(j, i));
136PROXSUITE_NLP_DLLAPI
void
137print_sparsity_pattern(
const SymbolicBlockMatrix &smat)
noexcept;
140PROXSUITE_NLP_DLLAPI
void
142 isize
const *perm =
nullptr) noexcept;
Specific linear algebra routines.
PROXSUITE_NLP_DLLAPI BlockKind trans(BlockKind a) noexcept
BlockKind of the transpose of a matrix.
PROXSUITE_NLP_DLLAPI BlockKind add(BlockKind a, BlockKind b) noexcept
BlockKind of the addition of two matrices - given by their BlockKind.
PROXSUITE_NLP_DLLAPI BlockKind mul(BlockKind a, BlockKind b) noexcept
BlockKind of the product of two matrices.
PROXSUITE_NLP_DLLAPI void symbolic_deep_copy(const SymbolicBlockMatrix &in, SymbolicBlockMatrix &out, isize const *perm=nullptr) noexcept
Deep copy of a SymbolicBlockMatrix, possibily with a permutation.
BlockKind
Kind of matrix block: zeros, diagonal, lower/upper triangular or dense.
@ Dense
There is no known prior structure; assume a dense block.
@ Diag
The block is diagonal.
@ Zero
All entries in the block are zero.
@ TriL
The block is lower-triangular.
@ TriU
The block is upper-triangular.
Symbolic representation of the sparsity structure of a (square) block matrix.
const BlockKind & operator()(isize i, isize j) const noexcept
SymbolicBlockMatrix(SymbolicBlockMatrix const &other)=default
Shallow copy constructor.
SymbolicBlockMatrix(isize nc, isize os)
Allocating constructor.
bool llt_in_place() noexcept
SymbolicBlockMatrix(BlockKind *data, isize *lens, isize nc, isize os)
Constructor from external data.
SymbolicBlockMatrix submatrix(isize i, isize n) noexcept
BlockKind & operator()(isize i, isize j) noexcept
Get a reference to the block in position (i, j).
Eigen::ComputationInfo brute_force_best_permutation(SymbolicBlockMatrix const &in, isize *best_perm, isize *iwork)
SymbolicBlockMatrix copy() const
Deep copy.