26 #include "symbolic_qr.hpp"
35 int CASADI_LINSOL_SYMBOLICQR_EXPORT
38 plugin->name =
"symbolicqr";
40 plugin->version = CASADI_VERSION;
49 std::vector<bool> seen(p.size(),
false);
50 casadi_int ncycle = 0;
51 for (casadi_int i=0; i<static_cast<casadi_int>(p.size()); ++i) {
54 for (casadi_int j=i; !seen[j]; j=p[j]) seen[j] =
true;
57 return (
static_cast<casadi_int
>(p.size())-ncycle) % 2 ? -1.0 : 1.0;
65 std::vector<casadi_int> prinv, pc;
73 casadi_assert(A.
is_square(),
"det: matrix must be square, got " + A.
dim() +
".");
76 for (
auto&& op : opts) {
77 if (op.first==
"amd") amd = op.second;
83 std::vector<casadi_int> rowperm, colperm, rowblock, colblock;
84 std::vector<casadi_int> coarse_rowblock, coarse_colblock;
85 casadi_int nb = A.
sparsity().
btf(rowperm, colperm, rowblock, colblock,
86 coarse_rowblock, coarse_colblock);
87 SX Aperm = A(rowperm, colperm);
89 for (casadi_int b=0; b<nb; ++b) {
90 std::vector<casadi_int> rr =
range(rowblock[b], rowblock[b+1]);
91 std::vector<casadi_int> cc =
range(colblock[b], colblock[b+1]);
93 if (rr.size()!=cc.size())
return 0;
116 "Options to be passed to generated function objects"}}
125 for (
auto&& op : opts) {
126 if (op.first==
"fopts") {
135 std::vector<casadi_int> rowperm, colperm, rowblock, colblock, coarse_rowblock, coarse_colblock;
136 sp_.
btf(rowperm, colperm, rowblock, colblock, coarse_rowblock, coarse_colblock);
139 std::vector<casadi_int> inv_colperm(colperm.size());
140 for (casadi_int k=0; k<colperm.size(); ++k)
141 inv_colperm[colperm[k]] = k;
144 std::vector<casadi_int> inv_rowperm(rowperm.size());
145 for (casadi_int k=0; k<rowperm.size(); ++k)
146 inv_rowperm[rowperm[k]] = k;
149 SX Aperm = A(rowperm, colperm);
165 SX bperm = b(rowperm,
Slice());
171 SX x = xperm(inv_colperm,
Slice());
174 std::vector<SX> solv_in = {
Q, R, b};
183 bperm = b(colperm,
Slice());
189 x = xperm(inv_rowperm,
Slice());
204 m->w.resize(m->w.size() +
sp_.
size1());
232 std::fill_n(
get_ptr(m->arg), solv.
n_in(),
nullptr);
236 for (casadi_int i=0; i<nrhs; ++i) {
248 casadi_int* iw,
SXElem* w,
void* mem,
249 bool tr, casadi_int nrhs)
const {
251 casadi_assert_dev(arg[0]!=
nullptr);
252 casadi_assert_dev(arg[1]!=
nullptr);
253 casadi_assert_dev(res[0]!=
nullptr);
257 std::copy(arg[1], arg[1]+A.
nnz(), A->begin());
267 for (casadi_int i=0; i<nrhs; ++i) {
268 std::copy(a, a+v[2].
nnz(), v[2]->begin());
269 SX rr = solv(v).at(0);
270 std::copy(rr->begin(), rr->end(), r);
279 iw.resize(std::max(
iw.size(), f.
sz_iw()));
280 w.resize(std::max(
w.size(), f.
sz_w()));
Helper class for Serialization.
void unpack(Sparsity &e)
Reconstruct an object from the input stream.
void version(const std::string &name, int v)
static const Options options_
Options.
casadi_int nnz_out() const
Get number of output nonzeros.
size_t sz_res() const
Get required length of res field.
size_t sz_iw() const
Get required length of iw field.
casadi_int n_out() const
Get the number of function outputs.
casadi_int n_in() const
Get the number of function inputs.
size_t sz_w() const
Get required length of w field.
size_t sz_arg() const
Get required length of arg field.
casadi_int nnz() const
Get the number of (structural) non-zero elements.
casadi_int size1() const
Get the first dimension (i.e. number of rows)
std::string dim(bool with_nz=false) const
Get string representation of dimensions.
static Matrix< Scalar > sym(const std::string &name, casadi_int nrow=1, casadi_int ncol=1)
Create an nrow-by-ncol symbolic primitive.
bool is_square() const
Check if the matrix expression is square.
static Matrix< Scalar > zeros(casadi_int nrow=1, casadi_int ncol=1)
Create a dense matrix or a matrix with specified sparsity with all entries zero.
bool is_scalar(bool scalar_and_dense=false) const
Check if the matrix expression is scalar.
void init(const Dict &opts) override
Initialize.
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.
casadi_int nrow() const
Get sparsity pattern.
int init_mem(void *mem) const override
Initalize memory block.
Sparse matrix class. SX and DM are specializations.
std::vector< Scalar > & nonzeros()
Matrix< Scalar > T() const
Transpose the matrix.
const Sparsity & sparsity() const
Const access the sparsity - reference to data member.
static Matrix< Scalar > solve(const Matrix< Scalar > &A, const Matrix< Scalar > &b)
static void qr_sparse(const Matrix< Scalar > &A, Matrix< Scalar > &V, Matrix< Scalar > &R, Matrix< Scalar > &beta, std::vector< casadi_int > &prinv, std::vector< casadi_int > &pc, bool amd=true)
static void registerPlugin(const Plugin &plugin, bool needs_lock=true)
Register an integrator in the factory.
void clear_mem()
Clear all memory (called from destructor)
The basic scalar symbolic class of CasADi.
Helper class for Serialization.
void version(const std::string &name, int v)
void pack(const Sparsity &e)
Serializes an object to the output stream.
Class representing a Slice.
casadi_int size1() const
Get the number of rows.
casadi_int size2() const
Get the 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
Calculate the block triangular form (BTF)
int init_mem(void *mem) const override
Initalize memory block.
static const Options options_
Options.
SymbolicQr(const std::string &name, const Sparsity &sp)
void init(const Dict &opts) override
Initialize.
static LinsolInternal * creator(const std::string &name, const Sparsity &sp)
Create a new Linsol.
virtual double det(void *mem, const double *A) const
Symbolic determinant via sparse QR factorization.
static const std::string meta_doc
A documentation string.
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.
int solve(void *mem, const double *A, double *x, casadi_int nrhs, bool tr) const override
void linsol_eval_sx(const SXElem **arg, SXElem **res, casadi_int *iw, SXElem *w, void *mem, bool tr, casadi_int nrhs) const override
Evaluate symbolically (SX)
int nfact(void *mem, const double *A) const override
Numeric factorization.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
std::vector< casadi_int > range(casadi_int start, casadi_int stop, casadi_int step, casadi_int len)
Range function.
static double permutation_sign(const std::vector< casadi_int > &p)
int CASADI_LINSOL_SYMBOLICQR_EXPORT casadi_register_linsol_symbolicqr(LinsolInternal::Plugin *plugin)
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
static SX qr_block_det(const SX &B, bool amd)
T * get_ptr(std::vector< T > &v)
Get a pointer to the data contained in the vector.
void CASADI_LINSOL_SYMBOLICQR_EXPORT casadi_load_linsol_symbolicqr()
Options metadata for a class.
void alloc(const Function &f)
std::vector< casadi_int > iw
std::vector< double * > res
std::vector< const double * > arg