26 #ifndef CASADI_LINSOL_INTERNAL_HPP
27 #define CASADI_LINSOL_INTERNAL_HPP
30 #include "function_internal.hpp"
31 #include "plugin_interface.hpp"
37 struct CASADI_EXPORT LinsolMemory :
public ProtoFunctionMemory {
39 bool is_sfact, is_nfact;
42 LinsolMemory() : is_sfact(false), is_nfact(false) {}
48 class CASADI_EXPORT LinsolInternal
49 :
public ProtoFunction,
public PluginInterface<LinsolInternal> {
52 LinsolInternal(
const std::string& name,
const Sparsity& sp);
55 ~LinsolInternal()
override;
60 void disp(std::ostream& stream,
bool more)
const override;
65 virtual void disp_more(std::ostream& stream)
const {}
68 void init(
const Dict& opts)
override;
73 void* alloc_mem()
const override {
return new LinsolMemory();}
78 int init_mem(
void* mem)
const override;
83 void free_mem(
void *mem)
const override {
delete static_cast<LinsolMemory*
>(mem);}
86 virtual void linsol_eval_sx(
const SXElem** arg, SXElem** res,
87 casadi_int* iw, SXElem* w,
void* mem,
88 bool tr, casadi_int nrhs)
const;
92 casadi_int factorize(
void* mem,
const double* A)
const;
95 virtual bool needs_sfact(
void* mem,
const double* A)
const;
98 virtual bool needs_nfact(
void* mem,
const double* A)
const;
102 virtual int sfact(
void* mem,
const double* A)
const {
return 0;}
105 virtual int nfact(
void* mem,
const double* A)
const;
108 virtual int solve(
void* mem,
const double* A,
double* x, casadi_int nrhs,
bool tr)
const;
111 virtual double det(
void* mem,
const double* A)
const;
114 virtual casadi_int neig(
void* mem,
const double* A)
const;
117 virtual casadi_int rank(
void* mem,
const double* A)
const;
120 virtual void generate(CodeGenerator& g,
const std::string& A,
const std::string& x,
121 casadi_int nrhs,
bool tr)
const;
124 virtual void generate_det(CodeGenerator& g,
const std::string& A,
125 const std::string& d)
const;
129 virtual size_t sz_w_fact()
const {
return 0; }
132 typedef LinsolInternal* (*Creator)(
const std::string& name,
const Sparsity& sp);
135 typedef SX (*Det)(
const SX& A,
const Dict& opts);
138 struct Exposed{ Det det; };
141 static std::map<std::string, Plugin> solvers_;
143 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
144 static std::mutex mutex_solvers_;
148 static const std::string infix_;
151 const char* plugin_name()
const override = 0;
154 casadi_int nrow()
const {
return sp_.size1();}
155 casadi_int ncol()
const {
return sp_.size2();}
156 const casadi_int* colind()
const {
return sp_.colind();}
157 const casadi_int* row()
const {
return sp_.row();}
158 casadi_int nnz()
const {
return sp_.nnz();}
163 void serialize_type(SerializingStream &s)
const override;
167 void serialize_body(SerializingStream &s)
const override;
172 static ProtoFunction* deserialize(DeserializingStream& s);
181 explicit LinsolInternal(DeserializingStream& s);
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.