26 #ifndef CASADI_GETNONZEROS_HPP
27 #define CASADI_GETNONZEROS_HPP
29 #include "mx_node.hpp"
42 class CASADI_EXPORT GetNonzeros :
public MXNode {
47 static MX create(
const Sparsity& sp,
const MX& x,
const std::vector<casadi_int>& nz);
48 static MX create(
const Sparsity& sp,
const MX& x,
const Slice& s);
49 static MX create(
const Sparsity& sp,
const MX& x,
const Slice& inner,
const Slice& outer);
53 GetNonzeros(
const Sparsity& sp,
const MX& y);
56 ~GetNonzeros()
override {}
61 void eval_mx(
const std::vector<MX>& arg, std::vector<MX>& res,
62 const std::vector<bool>& unique={})
const override;
67 void eval_linear(
const std::vector<std::array<MX, 3> >& arg,
68 std::vector<std::array<MX, 3> >& res)
const override;
73 int eval_activity(
const bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override {
74 return sp_forward(arg, res, iw, w);
80 void ad_forward(
const std::vector<std::vector<MX> >& fseed,
81 std::vector<std::vector<MX> >& fsens)
const override;
86 void ad_reverse(
const std::vector<std::vector<MX> >& aseed,
87 std::vector<std::vector<MX> >& asens)
const override;
90 Matrix<casadi_int> mapping()
const override;
93 virtual std::vector<casadi_int> all()
const = 0;
98 casadi_int op()
const override {
return OP_GETNONZEROS;}
101 MX get_nzref(
const Sparsity& sp,
const std::vector<casadi_int>& nz,
102 bool unique=
false)
const override;
107 static MXNode* deserialize(DeserializingStream& s);
113 explicit GetNonzeros(DeserializingStream& s) : MXNode(s) {}
116 class CASADI_EXPORT GetNonzerosVector :
public GetNonzeros {
119 GetNonzerosVector(
const Sparsity& sp,
const MX& x,
120 const std::vector<casadi_int>& nz) : GetNonzeros(sp, x), nz_(nz) {}
123 ~GetNonzerosVector()
override {}
126 std::vector<casadi_int> all()
const override {
return nz_;}
131 int sp_forward(
const bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
136 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
141 void eval_mx(
const std::vector<MX>& arg, std::vector<MX>& res,
142 const std::vector<bool>& unique={})
const override;
146 int eval_gen(
const T*
const* arg, T*
const* res, casadi_int* iw, T* w)
const;
149 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w)
const override;
152 int eval_sx(
const SXElem** arg, SXElem** res, casadi_int* iw, SXElem* w)
const override;
157 std::string disp(
const std::vector<std::string>& arg)
const override;
162 void generate(CodeGenerator& g,
163 const std::vector<casadi_int>& arg,
164 const std::vector<casadi_int>& res,
165 const std::vector<bool>& arg_is_ref,
166 std::vector<bool>& res_is_ref)
const override;
171 bool is_equal(
const MXNode* node, casadi_int depth)
const override;
174 Dict info()
const override {
return {{
"nz", nz_}}; }
177 std::vector<casadi_int> nz_;
182 void serialize_body(SerializingStream& s)
const override;
186 void serialize_type(SerializingStream& s)
const override;
191 explicit GetNonzerosVector(DeserializingStream& s);
195 class CASADI_EXPORT GetNonzerosSlice :
public GetNonzeros {
199 GetNonzerosSlice(
const Sparsity& sp,
const MX& x,
const Slice& s) : GetNonzeros(sp, x), s_(s) {}
202 ~GetNonzerosSlice()
override {}
205 std::vector<casadi_int> all()
const override {
return s_.all(s_.stop);}
210 int sp_forward(
const bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
215 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
219 int eval_gen(
const T*
const* arg, T*
const* res, casadi_int* iw, T* w)
const;
222 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w)
const override;
225 int eval_sx(
const SXElem** arg, SXElem** res, casadi_int* iw, SXElem* w)
const override;
230 std::string disp(
const std::vector<std::string>& arg)
const override;
235 void generate(CodeGenerator& g,
236 const std::vector<casadi_int>& arg,
237 const std::vector<casadi_int>& res,
238 const std::vector<bool>& arg_is_ref,
239 std::vector<bool>& res_is_ref)
const override;
244 bool is_equal(
const MXNode* node, casadi_int depth)
const override;
247 Dict info()
const override {
return {{
"slice", s_.info()}}; }
255 void serialize_body(SerializingStream& s)
const override;
259 void serialize_type(SerializingStream& s)
const override;
264 explicit GetNonzerosSlice(DeserializingStream& s);
268 class CASADI_EXPORT GetNonzerosSlice2 :
public GetNonzeros {
272 GetNonzerosSlice2(
const Sparsity& sp,
const MX& x,
const Slice& inner,
273 const Slice& outer) : GetNonzeros(sp, x), inner_(inner), outer_(outer) {}
276 ~GetNonzerosSlice2()
override {}
279 std::vector<casadi_int> all()
const override {
return inner_.all(outer_, outer_.stop);}
284 int sp_forward(
const bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
289 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
293 int eval_gen(
const T*
const* arg, T*
const* res, casadi_int* iw, T* w)
const;
296 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w)
const override;
299 int eval_sx(
const SXElem** arg, SXElem** res, casadi_int* iw, SXElem* w)
const override;
304 std::string disp(
const std::vector<std::string>& arg)
const override;
309 void generate(CodeGenerator& g,
310 const std::vector<casadi_int>& arg,
311 const std::vector<casadi_int>& res,
312 const std::vector<bool>& arg_is_ref,
313 std::vector<bool>& res_is_ref)
const override;
318 bool is_equal(
const MXNode* node, casadi_int depth)
const override;
321 Dict info()
const override {
return {{
"inner", inner_.info()}, {
"outer", outer_.info()}}; }
324 Slice inner_, outer_;
329 void serialize_body(SerializingStream& s)
const override;
333 void serialize_type(SerializingStream& s)
const override;
338 explicit GetNonzerosSlice2(DeserializingStream& s);
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.