27 #ifndef CASADI_SPARSITY_HPP
28 #define CASADI_SPARSITY_HPP
30 #include "shared_object.hpp"
31 #include "printable.hpp"
32 #include "casadi_common.hpp"
33 #include "sparsity_interface.hpp"
34 #include "generic_type.hpp"
38 #include <unordered_map>
39 #ifdef CASADI_WITH_THREAD
40 #ifdef CASADI_WITH_THREAD_MINGW
41 #include <mingw.mutex.h>
49 class SparsityInternal;
50 class SerializingStream;
51 class DeserializingStream;
57 struct CASADI_EXPORT SparsityStruct {
60 const casadi_int* colind;
61 const casadi_int* row;
199 public SWIG_IF_ELSE(SparsityInterfaceCommon, SparsityInterface<Sparsity>),
200 public SWIG_IF_ELSE(PrintableCommon, Printable<Sparsity>) {
380 const std::vector<casadi_int>& colind,
const std::vector<casadi_int>& row,
381 bool order_rows=
false);
386 explicit Sparsity(
const std::pair<casadi_int, casadi_int>& rc);
390 Sparsity(casadi_int nrow, casadi_int ncol,
const casadi_int* colind,
const casadi_int* row,
391 bool order_rows=
false);
396 static Sparsity create(SparsityInternal *node);
399 typedef SparsityInterface<Sparsity> B;
407 SparsityInternal* get()
const;
455 {
return dense_scalar ? dense(1, 1) :
Sparsity(1, 1); }
522 return dense(rc.first, rc.second);
726 return diag(rc.first, rc.second);
900 const std::vector<casadi_int>& col,
901 casadi_int nrow, casadi_int ncol);
993 const std::vector<casadi_int>& row,
const std::vector<casadi_int>& col,
994 std::vector<casadi_int>& SWIG_OUTPUT(mapping),
bool invert_mapping);
995 static Sparsity triplet(casadi_int nrow, casadi_int ncol,
const std::vector<casadi_int>& row,
996 const std::vector<casadi_int>& col);
1058 bool ind1=SWIG_IND1);
1121 static Sparsity compressed(
const casadi_int* v,
bool order_rows=
false);
1366 std::vector<casadi_int>
compress(
bool canonical=
true)
const;
1370 const SparsityInternal* operator->()
const;
1373 const SparsityInternal& operator*()
const;
1430 bool is_equal(const Sparsity& y) const;
1432 bool is_equal(casadi_int nrow, casadi_int ncol,
const std::vector<casadi_int>& colind,
1433 const std::vector<casadi_int>& row)
const;
1435 bool is_equal(casadi_int nrow, casadi_int ncol,
1436 const casadi_int* colind,
const casadi_int* row)
const;
1495 operator const casadi_int*()
const;
1500 operator const std::vector<casadi_int>&()
const;
1505 operator SparsityStruct()
const;
1543 casadi_int
rows()
const {
return size1();}
1867 std::pair<casadi_int, casadi_int>
size()
const;
1875 casadi_int
size(casadi_int axis)
const;
1998 void to_file(
const std::string& filename,
const std::string& format_hint=
"")
const;
2014 void serialize(std::ostream &stream)
const;
2090 const casadi_int* row()
const;
2095 const casadi_int* colind()
const;
2221 casadi_int
row(casadi_int el)
const;
2289 void resize(casadi_int nrow, casadi_int ncol);
2351 casadi_int
add_nz(casadi_int rr, casadi_int cc);
2397 casadi_int
get_nz(casadi_int rr, casadi_int cc)
const;
2430 bool has_nz(casadi_int rr, casadi_int cc)
const;
2465 std::vector<casadi_int>
get_nz(
const std::vector<casadi_int>& rr,
2466 const std::vector<casadi_int>& cc)
const;
2514 void get_nz(std::vector<casadi_int>& SWIG_INOUT(indices))
const;
2594 void get_ccs(std::vector<casadi_int>& SWIG_OUTPUT(colind),
2595 std::vector<casadi_int>& SWIG_OUTPUT(row))
const;
2633 void get_crs(std::vector<casadi_int>& SWIG_OUTPUT(rowind),
2634 std::vector<casadi_int>& SWIG_OUTPUT(col))
const;
2671 std::vector<casadi_int>& SWIG_OUTPUT(col))
const;
2746 const std::vector<casadi_int>& cc,
2747 std::vector<casadi_int>& SWIG_OUTPUT(mapping),
bool ind1=
false)
const;
2816 std::vector<casadi_int>& SWIG_OUTPUT(mapping),
bool ind1=
false)
const;
2915 bool invert_mapping=
false)
const;
3047 std::vector<casadi_int>& SWIG_OUTPUT(col))
const;
3122 Sparsity combine(
const Sparsity& y,
bool f0x_is_zero,
bool function0_is_zero,
3123 std::vector<unsigned char>& mapping)
const;
3186 Sparsity unite(
const Sparsity& y, std::vector<unsigned char>& mapping)
const;
3236 std::vector<unsigned char>& mapping)
const;
3388 static void mul_sparsityF(
const bvec_t* x,
const Sparsity& x_sp,
3389 const bvec_t* y,
const Sparsity& y_sp,
3400 static void mul_activityF(
const bvec_t* x,
const Sparsity& x_sp,
3401 const bvec_t* y,
const Sparsity& y_sp,
3411 static void mul_sparsityR(bvec_t* x,
const Sparsity& x_sp,
3421 static Sparsity horzcat(
const std::vector<Sparsity> & sp);
3422 static Sparsity vertcat(
const std::vector<Sparsity> & sp);
3423 static Sparsity blockcat(
const std::vector< std::vector< Sparsity > > &v);
3424 static Sparsity diagcat(
const std::vector< Sparsity > &v);
3425 static std::vector<Sparsity>
3426 horzsplit(
const Sparsity& x,
const std::vector<casadi_int>& offset);
3427 static std::vector<Sparsity>
3428 vertsplit(
const Sparsity& x,
const std::vector<casadi_int>& offset);
3429 static std::vector<Sparsity>
3431 const std::vector<casadi_int>& offset1,
3432 const std::vector<casadi_int>& offset2);
3434 const std::string& blas =
"reference");
3436 const std::string& =
"reference") {
return z;}
3437 static Sparsity reshape(
const Sparsity& x, casadi_int nrow, casadi_int ncol);
3440 static casadi_int sprank(
const Sparsity& x);
3539 const std::vector<casadi_int>& rr,
3540 const std::vector<casadi_int>& cc,
bool ind1=
false);
3581 void enlargeRows(casadi_int nrow,
const std::vector<casadi_int>& rr,
bool ind1=
false);
3619 void enlargeColumns(casadi_int ncol,
const std::vector<casadi_int>& cc,
bool ind1=
false);
3711 std::vector<casadi_int>
erase(
const std::vector<casadi_int>& rr,
3712 const std::vector<casadi_int>& cc,
bool ind1=
false);
3777 std::vector<casadi_int>
erase(
const std::vector<casadi_int>& rr,
bool ind1=
false);
4620 typedef std::unordered_multimap<std::size_t, WeakRef> CachingMap;
4623 static CachingMap& getCache();
4625 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
4627 static std::mutex cachingmap_mtx;
4631 static const Sparsity& getScalar();
4634 static const Sparsity& getScalarSparse();
4684 std::vector<casadi_int>
etree(
bool ata=
false)
const;
4757 Sparsity ldl(std::vector<casadi_int>& SWIG_OUTPUT(p),
bool amd=
true)
const;
4818 std::vector<casadi_int>& SWIG_OUTPUT(prinv),
4819 std::vector<casadi_int>& SWIG_OUTPUT(pc),
bool amd=
true)
const;
4866 casadi_int
dfs(casadi_int j, casadi_int top, std::vector<casadi_int>& SWIG_INOUT1(xi),
4867 std::vector<casadi_int>& SWIG_INOUT2(pstack),
4868 const std::vector<casadi_int>& pinv, std::vector<bool>& SWIG_INOUT3(marked))
const;
4963 casadi_int
scc(std::vector<casadi_int>& SWIG_OUTPUT(index),
4964 std::vector<casadi_int>& SWIG_OUTPUT(offset))
const;
5059 casadi_int
btf(std::vector<casadi_int>& SWIG_OUTPUT(rowperm),
5060 std::vector<casadi_int>& SWIG_OUTPUT(colperm),
5061 std::vector<casadi_int>& SWIG_OUTPUT(rowblock),
5062 std::vector<casadi_int>& SWIG_OUTPUT(colblock),
5063 std::vector<casadi_int>& SWIG_OUTPUT(coarse_rowblock),
5064 std::vector<casadi_int>& SWIG_OUTPUT(coarse_colblock))
const;
5117 std::vector<casadi_int>
amd()
const;
5123 void spsolve(bvec_t* X, bvec_t* B,
bool tr)
const;
5173 std::vector<casadi_int>
find(
bool ind1=SWIG_IND1)
const;
5177 void find(std::vector<casadi_int>& loc,
bool ind1=
false)
const;
5275 casadi_int cutoff = std::numeric_limits<casadi_int>::max())
const;
5427 casadi_int cutoff = std::numeric_limits<casadi_int>::max())
const;
5474 casadi_int cutoff = std::numeric_limits<casadi_int>::max())
const;
5607 bool permute_rows=
true,
bool permute_columns=
true,
5608 bool invert_permutation=
false)
const;
5658 std::string
dim(
bool with_nz=
false)
const;
6039 bool with_x_diag=
true,
bool with_lam_g_diag=
true);
6047 template<
typename T>
6048 void set(T* data,
const T* val_data,
const Sparsity& val_sp)
const;
6055 template<
typename T>
6056 void add(T* data,
const T* val_data,
const Sparsity& val_sp)
const;
6063 template<
typename T>
6064 void bor(T* data,
const T* val_data,
const Sparsity& val_sp)
const;
6066 static std::string file_format(
const std::string& filename,
6067 const std::string& format_hint,
const std::set<std::string>& file_formats);
6068 static std::set<std::string> file_formats;
6072 void assign_cached(casadi_int nrow, casadi_int ncol,
const std::vector<casadi_int>& colind,
6073 const std::vector<casadi_int>& row,
bool order_rows=
false);
6076 void assign_cached(casadi_int nrow, casadi_int ncol,
6077 const casadi_int* colind,
const casadi_int* row,
bool order_rows=
false);
6086 const std::vector<casadi_int>& colind,
6087 const std::vector<casadi_int>& row);
6090 const casadi_int* colind,
6091 const casadi_int* row);
6095 template<
typename DataType>
6096 void Sparsity::set(DataType* data,
const DataType* val_data,
const Sparsity& val_sp)
const {
6098 const casadi_int sz =
nnz();
6099 const casadi_int sz1 =
size1();
6100 const casadi_int sz2 =
size2();
6103 const casadi_int val_sz = val_sp.
nnz();
6104 const casadi_int val_sz1 = val_sp.
size1();
6105 const casadi_int val_sz2 = val_sp.
size2();
6106 const casadi_int val_nel = val_sz1*val_sz2;
6109 if (val_sp==*
this) {
6110 std::copy(val_data, val_data+sz, data);
6117 }
else if (val_nel==1) {
6118 std::fill(data, data+sz, val_sz==0 ? DataType(0) : val_data[0]);
6119 }
else if (sz2==val_sz2 && sz1==val_sz1) {
6122 const casadi_int* c =
row();
6123 const casadi_int* rind =
colind();
6124 const casadi_int* v_c = val_sp.
row();
6125 const casadi_int* v_rind = val_sp.
colind();
6128 for (casadi_int i=0; i<sz2; ++i) {
6131 casadi_int v_el = v_rind[i];
6134 casadi_int v_el_end = v_rind[i+1];
6137 casadi_int v_j = v_el<v_el_end ? v_c[v_el] : sz1;
6140 for (casadi_int el=rind[i]; el!=rind[i+1]; ++el) {
6148 v_j = v_el<v_el_end ? v_c[v_el] : sz1;
6153 data[el] = val_data[v_el++];
6154 v_j = v_el<v_el_end ? v_c[v_el] : sz1;
6160 }
else if (sz1==val_sz2 && sz2==val_sz1 && sz2 == 1) {
6162 const casadi_int* v_cind = val_sp.
colind();
6163 const casadi_int* r =
row();
6164 for (casadi_int el=0; el<sz; ++el) {
6165 casadi_int rr=r[el];
6166 data[el] = v_cind[rr]==v_cind[rr+1] ? 0 : val_data[v_cind[rr]];
6168 }
else if (sz1==val_sz2 && sz2==val_sz1 && sz1 == 1) {
6170 for (casadi_int el=0; el<sz; ++el) data[el] = 0;
6171 const casadi_int* cind =
colind();
6172 const casadi_int* v_r = val_sp.
row();
6173 for (casadi_int el=0; el<val_sz; ++el) {
6174 casadi_int rr=v_r[el];
6175 if (cind[rr]!=cind[rr+1]) {
6176 data[cind[rr]] = val_data[el];
6181 casadi_error(
"Sparsity::set<DataType>: shape mismatch. lhs is "
6182 +
dim() +
", while rhs is " + val_sp.
dim() +
".");
6186 template<
typename DataType>
6187 void Sparsity::add(DataType* data,
const DataType* val_data,
const Sparsity& val_sp)
const {
6189 const casadi_int sz =
nnz();
6190 const casadi_int sz1 =
size1();
6191 const casadi_int sz2 =
size2();
6192 const casadi_int nel = sz1*sz2;
6195 const casadi_int val_sz = val_sp.nnz();
6196 const casadi_int val_sz1 = val_sp.size1();
6197 const casadi_int val_sz2 = val_sp.size2();
6198 const casadi_int val_nel = val_sz1*val_sz2;
6201 if (val_sp==*
this) {
6202 for (casadi_int k=0; k<sz; ++k) {
6203 data[k] += val_data[k];
6208 }
else if (val_sp.is_empty()) {
6211 }
else if (val_nel==1) {
6213 for (casadi_int k=0; k<sz; ++k) {
6214 data[k] += val_data[0];
6219 if (nel==0 && val_nel==0)
return;
6222 casadi_assert(sz2==val_sz2 && sz1==val_sz1,
6223 "Sparsity::add<DataType>: shape mismatch. lhs is "
6224 +
dim() +
", while rhs is " + val_sp.dim() +
".");
6227 const casadi_int* c =
row();
6228 const casadi_int* rind =
colind();
6229 const casadi_int* v_c = val_sp.row();
6230 const casadi_int* v_rind = val_sp.colind();
6233 for (casadi_int i=0; i<sz2; ++i) {
6236 casadi_int v_el = v_rind[i];
6239 casadi_int v_el_end = v_rind[i+1];
6242 casadi_int v_j = v_el<v_el_end ? v_c[v_el] : sz1;
6245 for (casadi_int el=rind[i]; el!=rind[i+1]; ++el) {
6253 v_j = v_el<v_el_end ? v_c[v_el] : sz1;
6258 data[el] += val_data[v_el++];
6259 v_j = v_el<v_el_end ? v_c[v_el] : sz1;
6266 template<
typename DataType>
6267 void Sparsity::bor(DataType* data,
const DataType* val_data,
const Sparsity& val_sp)
const {
6269 const casadi_int sz =
nnz();
6270 const casadi_int sz1 =
size1();
6271 const casadi_int sz2 =
size2();
6272 const casadi_int nel = sz1*sz2;
6275 const casadi_int val_sz = val_sp.nnz();
6276 const casadi_int val_sz1 = val_sp.size1();
6277 const casadi_int val_sz2 = val_sp.size2();
6278 const casadi_int val_nel = val_sz1*val_sz2;
6281 if (val_sp==*
this) {
6282 for (casadi_int k=0; k<sz; ++k) {
6283 data[k] |= val_data[k];
6288 }
else if (val_sp.is_empty()) {
6291 }
else if (val_nel==1) {
6293 for (casadi_int k=0; k<sz; ++k) {
6294 data[k] |= val_data[0];
6299 if (nel==0 && val_nel==0)
return;
6302 casadi_assert(sz2==val_sz2 && sz1==val_sz1,
6303 "Sparsity::add<DataType>: shape mismatch. lhs is "
6304 +
dim() +
", while rhs is " + val_sp.dim() +
".");
6307 const casadi_int* c =
row();
6308 const casadi_int* rind =
colind();
6309 const casadi_int* v_c = val_sp.row();
6310 const casadi_int* v_rind = val_sp.colind();
6313 for (casadi_int i=0; i<sz2; ++i) {
6316 casadi_int v_el = v_rind[i];
6319 casadi_int v_el_end = v_rind[i+1];
6322 casadi_int v_j = v_el<v_el_end ? v_c[v_el] : sz1;
6325 for (casadi_int el=rind[i]; el!=rind[i+1]; ++el) {
6333 v_j = v_el<v_el_end ? v_c[v_el] : sz1;
6338 data[el] |= val_data[v_el++];
6339 v_j = v_el<v_el_end ? v_c[v_el] : sz1;
6350 typedef std::map<std::string, Sparsity>
SpDict;
Helper class for Serialization.
Helper class for Serialization.
GenericShared implements a reference counting framework similar for efficient and.
static Sparsity upper(casadi_int n)
Create an upper triangular square sparsity pattern.
static Sparsity kkt(const Sparsity &H, const Sparsity &J, bool with_x_diag=true, bool with_lam_g_diag=true)
Pattern of a KKT system [H + I1, J'; J, I2].
void get_nz(std::vector< casadi_int > &indices) const
Map flat (column-major) element indices to nonzero indices.
casadi_int get_nz(casadi_int rr, casadi_int cc) const
Nonzero index of entry (rr, cc), or -1 if it is a structural zero.
std::vector< casadi_int > find(bool ind1=SWIG_IND1) const
Flat (column-major) element index of every nonzero.
casadi_int columns() const
Number of columns, Octave-style alias of size2.
casadi_int colind(casadi_int cc) const
Index of the first nonzero of column cc.
Sparsity combine(const Sparsity &y, bool f0x_is_zero, bool function0_is_zero) const
Combine two patterns of the same shape, as the result of a binary operation.
Sparsity pmult(const std::vector< casadi_int > &p, bool permute_rows=true, bool permute_columns=true, bool invert_permutation=false) const
Permute the rows and/or columns of the pattern.
Sparsity(casadi_int dummy=0)
Default constructor: a null object that holds no pattern.
std::vector< casadi_int > get_upper() const
Nonzero indices of the entries in the upper triangular part (row <= col)
std::vector< casadi_int > erase(const std::vector< casadi_int > &rr, bool ind1=false)
Turn the entries with flat (column-major) indices rr into structural zeros.
bool is_subset(const Sparsity &rhs) const
Check whether every nonzero of this pattern is also a nonzero of rhs.
static Sparsity band(casadi_int n, casadi_int p)
Create a single band in a square sparsity pattern.
static Sparsity permutation(const std::vector< casadi_int > &p, bool invert=false)
Construct the pattern of a permutation matrix P from a permutation vector p.
std::vector< casadi_int > etree(bool ata=false) const
Elimination tree of the pattern.
bool is_stacked(const Sparsity &y, casadi_int n) const
Check whether the pattern is n copies of y placed side by side.
Sparsity makeDense(std::vector< casadi_int > &mapping) const
Dense pattern of the same shape, with the flat index of every nonzero.
static bool test_cast(const SharedObjectInternal *ptr)
Check if a particular cast is allowed.
static std::string type_name()
Readable name of the public class.
bool is_vector() const
Check whether the pattern is a row or a column vector.
static Sparsity unit(casadi_int n, casadi_int el)
Create the pattern of a unit vector: a column of length n with one nonzero.
std::vector< casadi_int > get_lower() const
Nonzero indices of the entries in the lower triangular part (row >= col)
Sparsity sub(const std::vector< casadi_int > &rr, const std::vector< casadi_int > &cc, std::vector< casadi_int > &mapping, bool ind1=false) const
Pattern of the submatrix with rows rr and columns cc.
casadi_int numel() const
Total number of entries, structural zeros included, i.e. size1()*size2()
casadi_int size1() const
Number of rows.
void enlarge(casadi_int nrow, casadi_int ncol, const std::vector< casadi_int > &rr, const std::vector< casadi_int > &cc, bool ind1=false)
Enlarge the pattern in place by inserting empty rows and columns.
static Sparsity dense(casadi_int nrow, casadi_int ncol=1)
Create a dense rectangular sparsity pattern.
Sparsity(casadi_int nrow, casadi_int ncol)
Pattern of the given shape with all structural zeros.
Sparsity operator*(const Sparsity &b) const
Intersection of two sparsity patterns of the same shape (also the * operator)
Dict info() const
The pattern as a dictionary with entries nrow, ncol, colind and row.
std::vector< casadi_int > largest_first() const
Column indices ordered by decreasing number of nonzeros.
Sparsity star_coloring(casadi_int ordering=1, casadi_int cutoff=std::numeric_limits< casadi_int >::max()) const
Star coloring of a symmetric pattern (greedy distance-2 coloring)
std::vector< casadi_int > get_colind() const
Column offsets of the compressed column storage.
static Sparsity dense(const std::pair< casadi_int, casadi_int > &rc)
Create a dense rectangular sparsity pattern.
Sparsity pattern_inverse() const
Complement of the pattern: structural zeros become nonzeros and vice versa.
static Sparsity diag(casadi_int nrow)
Create a diagonal sparsity pattern.
casadi_int dfs(casadi_int j, casadi_int top, std::vector< casadi_int > &SWIG_INOUT1(xi), std::vector< casadi_int > &SWIG_INOUT2(pstack), const std::vector< casadi_int > &pinv, std::vector< bool > &SWIG_INOUT3(marked)) const
Depth-first search on the adjacency graph of the sparsity.
static Sparsity diag(const std::pair< casadi_int, casadi_int > &rc)
Create a diagonal sparsity pattern.
static Sparsity from_file(const std::string &filename, const std::string &format_hint="")
Read a pattern from a file written by to_file (Matrix Market pattern format)
bool is_orthonormal(bool allow_empty=false) const
Check whether every row and every column has at most one nonzero.
static Sparsity deserialize(DeserializingStream &s)
Deserialize.
casadi_int nnz_lower(bool strictly=false) const
Number of nonzeros in the lower triangular part, i.e. entries (i, j) with i >= j.
casadi_int scc(std::vector< casadi_int > &index, std::vector< casadi_int > &offset) const
Strongly connected components of the directed graph of a square pattern.
Sparsity(casadi_int nrow, casadi_int ncol, const std::vector< casadi_int > &colind, const std::vector< casadi_int > &row, bool order_rows=false)
Construct from compressed column storage vectors.
std::string dim(bool with_nz=false) const
Dimensions as a string "nrow x ncol", optionally with the number of nonzeros.
std::vector< casadi_int > amd() const
Approximate minimum degree (AMD) ordering of a symmetric pattern.
Sparsity transpose(std::vector< casadi_int > &mapping, bool invert_mapping=false) const
Transposed pattern together with the reordering of the nonzeros.
Sparsity T() const
Transposed pattern.
bool is_column() const
Check whether the pattern is a column vector, i.e. size2() == 1.
void spy(std::ostream &stream=casadi::uout()) const
Print a textual picture of the pattern.
bool is_compactible(std::vector< casadi_int > &row, std::vector< casadi_int > &col) const
Check if the nonzero pattern is the Cartesian product of a row and a column subset.
bool is_reshape(const Sparsity &y) const
Check whether y is a reshape of this pattern.
void get_crs(std::vector< casadi_int > &rowind, std::vector< casadi_int > &col) const
The pattern in compressed row storage: the rowind and col vectors.
void removeDuplicates(std::vector< casadi_int > &mapping)
Remove duplicate entries, in place.
bool is_scalar(bool scalar_and_dense=false) const
Check whether the pattern is 1-by-1.
static Sparsity nonzeros(casadi_int nrow, casadi_int ncol, const std::vector< casadi_int > &nz, bool ind1=SWIG_IND1)
Create a sparsity pattern from the flat (column-major) index of every nonzero.
void serialize(SerializingStream &s) const
Serialize an object.
Sparsity(const std::pair< casadi_int, casadi_int > &rc)
Pattern with all structural zeros, shape given as a pair (nrow, ncol)
Sparsity unite(const Sparsity &y) const
Union of two sparsity patterns of the same shape (also available as the + operator)
static Sparsity triplet(casadi_int nrow, casadi_int ncol, const std::vector< casadi_int > &row, const std::vector< casadi_int > &col, std::vector< casadi_int > &mapping, bool invert_mapping)
Create a sparsity pattern from the (row, col) index of every nonzero.
bool has_nz(casadi_int rr, casadi_int cc) const
Check whether entry (rr, cc) is a structural nonzero.
bool is_orthonormal_rows(bool allow_empty=false) const
Check whether the rows are orthonormal: one nonzero per row, at most one per column.
static Sparsity rowcol(const std::vector< casadi_int > &row, const std::vector< casadi_int > &col, casadi_int nrow, casadi_int ncol)
Create the pattern of a block: all entries (i, j) with i in row and j in col.
void enlargeColumns(casadi_int ncol, const std::vector< casadi_int > &cc, bool ind1=false)
Enlarge the pattern in place by inserting empty columns.
void append(const Sparsity &sp)
Append a pattern below this one, in place (vertical concatenation)
casadi_int add_nz(casadi_int rr, casadi_int cc)
Nonzero index of entry (rr, cc), inserting the entry into the pattern if needed.
bool is_row() const
Check whether the pattern is a row vector, i.e. size1() == 1.
const std::vector< casadi_int > permutation_vector(bool invert=false) const
Recover the permutation vector p from the pattern of a permutation matrix.
casadi_int size(casadi_int axis) const
Size along one dimension.
Sparsity get_diag(std::vector< casadi_int > &mapping) const
Pattern of the diagonal of a matrix, or of the diagonal matrix built from a vector.
std::vector< casadi_int > get_nz(const std::vector< casadi_int > &rr, const std::vector< casadi_int > &cc) const
Nonzero indices of the block of entries with rows rr and columns cc.
Sparsity sub(const std::vector< casadi_int > &rr, const Sparsity &sp, std::vector< casadi_int > &mapping, bool ind1=false) const
Pattern of a set of elements, arranged according to a given pattern.
bool is_diag() const
Check whether the pattern is square with exactly the full diagonal as nonzeros.
Sparsity intersect(const Sparsity &y) const
Intersection of two sparsity patterns of the same shape (also the * operator)
Sparsity star_coloring_new(std::vector< casadi_int > &which_color, const Dict &opts=Dict()) const
Star coloring of a symmetric pattern, with the color that recovers each nonzero.
static Sparsity banded(casadi_int n, casadi_int p)
Create a banded square sparsity pattern.
void enlargeRows(casadi_int nrow, const std::vector< casadi_int > &rr, bool ind1=false)
Enlarge the pattern in place by inserting empty rows.
bool is_tril(bool strictly=false) const
Check whether all nonzeros are on or below the diagonal (row >= col)
casadi_int rows() const
Number of rows, Octave-style alias of size1.
void spy_matlab(const std::string &mfile) const
Write a MATLAB/Octave script that builds the pattern as a sparse matrix and calls spy.
casadi_int nnz_upper(bool strictly=false) const
Number of nonzeros in the upper triangular part, i.e. entries (i, j) with i <= j.
casadi_int nnz() const
Number of structural nonzeros.
std::vector< casadi_int > erase(const std::vector< casadi_int > &rr, const std::vector< casadi_int > &cc, bool ind1=false)
Turn the entries with rows rr and columns cc into structural zeros, in place.
casadi_int size2() const
Number of columns.
casadi_int btf(std::vector< casadi_int > &rowperm, std::vector< casadi_int > &colperm, std::vector< casadi_int > &rowblock, std::vector< casadi_int > &colblock, std::vector< casadi_int > &coarse_rowblock, std::vector< casadi_int > &coarse_colblock) const
Block triangular form (BTF) through the Dulmage-Mendelsohn decomposition.
std::string serialize() const
Serialize the pattern to a string.
bool is_equal(casadi_int nrow, casadi_int ncol, const std::vector< casadi_int > &colind, const std::vector< casadi_int > &row) const
Check whether two sparsity patterns are identical.
bool is_selection(bool allow_empty=false) const
Check whether the pattern is that of a selection matrix.
Sparsity sparsity_cast_mod(const Sparsity &X, const Sparsity &Y) const
Propagate a subset of a pattern through a sparsity cast.
bool is_permutation() const
Check whether the pattern is that of a permutation matrix.
casadi_int row(casadi_int el) const
Row index of nonzero el.
Sparsity ldl(std::vector< casadi_int > &p, bool amd=true) const
Symbolic LDL factorization of a symmetric pattern.
static Sparsity scalar(bool dense_scalar=true)
Create a 1-by-1 sparsity pattern.
bool is_empty(bool both=false) const
Check whether the pattern has a zero dimension.
std::vector< casadi_int > compress(bool canonical=true) const
Compact single-vector representation of the pattern.
casadi_int bw_upper() const
Upper half-bandwidth: the largest j - i over all nonzeros (i, j) with j > i.
bool is_singular() const
Check whether a square pattern is structurally singular.
void export_code(const std::string &lang, std::ostream &stream=casadi::uout(), const Dict &options=Dict()) const
Write code that reconstructs the pattern in another language.
void to_file(const std::string &filename, const std::string &format_hint="") const
Write the pattern to a file.
bool operator!=(const Sparsity &y) const
Check whether two sparsity patterns differ (negation of is_equal)
static Sparsity triplet(casadi_int nrow, casadi_int ncol, const std::vector< casadi_int > &row, const std::vector< casadi_int > &col)
Create a sparsity pattern from the (row, col) index of every nonzero.
static Sparsity lower(casadi_int n)
Create a lower triangular square sparsity pattern.
void get_triplet(std::vector< casadi_int > &row, std::vector< casadi_int > &col) const
The pattern in sparse triplet format: the row and column of every nonzero.
double density() const
Percentage of nonzeros: 100*nnz()/numel()
Sparsity uni_coloring(const Sparsity &AT=Sparsity(), casadi_int cutoff=std::numeric_limits< casadi_int >::max()) const
Unidirectional (column) coloring for compressed Jacobian evaluation.
Sparsity operator+(const Sparsity &b) const
Union of two sparsity patterns of the same shape (also available as the + operator)
casadi_int nnz_diag() const
Number of nonzeros on the main diagonal, i.e. entries (i, i)
bool is_transpose(const Sparsity &y) const
Check whether y is the transpose of this pattern.
std::size_t hash() const
Hash of the pattern (dimensions, colind and row)
static Sparsity diag(casadi_int nrow, casadi_int ncol)
Create a diagonal sparsity pattern.
void appendColumns(const Sparsity &sp)
Append a pattern to the right of this one, in place (horizontal concatenation)
void get_ccs(std::vector< casadi_int > &colind, std::vector< casadi_int > &row) const
The pattern in compressed column storage: the colind and row vectors.
bool is_dense() const
Check whether every entry is a structural nonzero, i.e. nnz() == numel()
bool is_orthonormal_columns(bool allow_empty=false) const
Check whether the columns are orthonormal (see is_orthonormal_rows)
static Sparsity compressed(const std::vector< casadi_int > &v, bool order_rows=false)
Create from the compact single-vector representation of a pattern.
void resize(casadi_int nrow, casadi_int ncol)
Change the shape in place, keeping the nonzeros that still fit.
std::string postfix_dim() const
Dimension string to append to a name, as used when printing symbolic primitives.
bool operator==(const Sparsity &y) const
Check whether two sparsity patterns are identical.
static Sparsity deserialize(std::istream &stream)
Build a Sparsity from a serialized stream.
bool is_square() const
Check whether the number of rows equals the number of columns.
void qr_sparse(Sparsity &V, Sparsity &R, std::vector< casadi_int > &prinv, std::vector< casadi_int > &pc, bool amd=true) const
Symbolic QR factorization.
bool rowsSequential(bool strictly=true) const
Check whether the row indices are increasing within every column.
bool is_triu(bool strictly=false) const
Check whether all nonzeros are on or above the diagonal (row <= col)
std::pair< casadi_int, casadi_int > size() const
Shape as a pair (number of rows, number of columns)
std::vector< casadi_int > get_row() const
Row index of every nonzero, in nonzero (column-major) order.
std::string repr_el(casadi_int k) const
Describe the position of nonzero k as a string.
Sparsity star_coloring2(casadi_int ordering=1, casadi_int cutoff=std::numeric_limits< casadi_int >::max()) const
Star coloring of a symmetric pattern with the newer algorithm.
bool is_symmetric() const
Check whether the pattern equals its transpose.
casadi_int bw_lower() const
Lower half-bandwidth: the largest i - j over all nonzeros (i, j) with i > j.
std::vector< casadi_int > get_col() const
Column index of every nonzero, in nonzero (column-major) order.
static Sparsity deserialize(const std::string &s)
Build a Sparsity from a string produced by serialize()
CASADI_EXPORT std::ostream & uout()
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
CASADI_EXPORT std::size_t hash_sparsity(casadi_int nrow, casadi_int ncol, const std::vector< casadi_int > &colind, const std::vector< casadi_int > &row)
Hash a sparsity pattern.
std::map< std::string, Sparsity > SpDict
MX kron_contract(const MX &m, const MX &x, bool inner)
Kronecker contraction, the adjoint of kron.