26 #ifndef CASADI_SETNONZEROS_HPP
27 #define CASADI_SETNONZEROS_HPP
29 #include "mx_node.hpp"
44 class CASADI_EXPORT SetNonzeros :
public MXNode {
52 static MX create(
const MX& y,
const MX& x,
const std::vector<casadi_int>& nz);
53 static MX create(
const MX& y,
const MX& x,
const Slice& s);
54 static MX create(
const MX& y,
const MX& x,
const Slice& inner,
const Slice& outer);
58 SetNonzeros(
const MX& y,
const MX& x);
61 ~SetNonzeros()
override = 0;
64 virtual std::vector<casadi_int> all()
const = 0;
69 void eval_mx(
const std::vector<MX>& arg, std::vector<MX>& res,
70 const std::vector<bool>& unique={})
const override;
75 void eval_linear(
const std::vector<std::array<MX, 3> >& arg,
76 std::vector<std::array<MX, 3> >& res)
const override {
77 eval_linear_rearrange(arg, res);
83 int eval_activity(
const bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override {
84 return sp_forward(arg, res, iw, w);
90 void ad_forward(
const std::vector<std::vector<MX> >& fseed,
91 std::vector<std::vector<MX> >& fsens)
const override;
96 void ad_reverse(
const std::vector<std::vector<MX> >& aseed,
97 std::vector<std::vector<MX> >& asens)
const override;
102 casadi_int op()
const override {
return Add ? OP_ADDNONZEROS : OP_SETNONZEROS;}
105 Matrix<casadi_int> mapping()
const override;
108 casadi_int n_inplace()
const override {
return 1;}
113 static MXNode* deserialize(DeserializingStream& s);
119 explicit SetNonzeros(DeserializingStream& s) : MXNode(s) {}
130 class CASADI_EXPORT SetNonzerosVector :
public SetNonzeros<Add>{
134 SetNonzerosVector(
const MX& y,
const MX& x,
const std::vector<casadi_int>& nz);
137 ~SetNonzerosVector()
override {}
140 std::vector<casadi_int> all()
const override {
return nz_;}
145 void eval_mx(
const std::vector<MX>& arg, std::vector<MX>& res,
146 const std::vector<bool>& unique={})
const override;
150 int eval_gen(
const T** arg, T** res, casadi_int* iw, T* w)
const;
153 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w)
const override;
156 int eval_sx(
const SXElem** arg, SXElem** res, casadi_int* iw, SXElem* w)
const override;
161 int sp_forward(
const bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
166 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
171 std::string disp(
const std::vector<std::string>& arg)
const override;
176 void generate(CodeGenerator& g,
177 const std::vector<casadi_int>& arg,
178 const std::vector<casadi_int>& res,
179 const std::vector<bool>& arg_is_ref,
180 std::vector<bool>& res_is_ref)
const override;
185 bool is_equal(
const MXNode* node, casadi_int depth)
const override;
188 Dict info()
const override {
return {{
"nz", nz_}, {
"add", Add}}; }
191 std::vector<casadi_int> nz_;
196 void serialize_body(SerializingStream& s)
const override;
200 void serialize_type(SerializingStream& s)
const override;
205 explicit SetNonzerosVector(DeserializingStream& s);
210 class CASADI_EXPORT SetNonzerosSlice :
public SetNonzeros<Add>{
214 SetNonzerosSlice(
const MX& y,
const MX& x,
const Slice& s) : SetNonzeros<Add>(y, x), s_(s) {}
217 ~SetNonzerosSlice()
override {}
220 std::vector<casadi_int> all()
const override {
return s_.all(s_.stop);}
225 int sp_forward(
const bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
230 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
235 void eval_mx(
const std::vector<MX>& arg, std::vector<MX>& res,
236 const std::vector<bool>& unique={})
const override;
240 int eval_gen(
const T** arg, T** res, casadi_int* iw, T* w)
const;
243 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w)
const override;
246 int eval_sx(
const SXElem** arg, SXElem** res, casadi_int* iw, SXElem* w)
const override;
251 std::string disp(
const std::vector<std::string>& arg)
const override;
256 void generate(CodeGenerator& g,
257 const std::vector<casadi_int>& arg,
258 const std::vector<casadi_int>& res,
259 const std::vector<bool>& arg_is_ref,
260 std::vector<bool>& res_is_ref)
const override;
265 bool is_equal(
const MXNode* node, casadi_int depth)
const override;
268 Dict info()
const override {
return {{
"slice", s_.info()}, {
"add", Add}}; }
276 void serialize_body(SerializingStream& s)
const override;
280 void serialize_type(SerializingStream& s)
const override;
285 explicit SetNonzerosSlice(DeserializingStream& s);
290 class CASADI_EXPORT SetNonzerosSlice2 :
public SetNonzeros<Add>{
294 SetNonzerosSlice2(
const MX& y,
const MX& x,
const Slice& inner,
const Slice& outer) :
295 SetNonzeros<Add>(y, x), inner_(inner), outer_(outer) {}
298 ~SetNonzerosSlice2()
override {}
301 std::vector<casadi_int> all()
const override {
return inner_.all(outer_, outer_.stop);}
306 int sp_forward(
const bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
311 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w)
const override;
316 void eval_mx(
const std::vector<MX>& arg, std::vector<MX>& res,
317 const std::vector<bool>& unique={})
const override;
321 int eval_gen(
const T** arg, T** res, casadi_int* iw, T* w)
const;
324 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w)
const override;
327 int eval_sx(
const SXElem** arg, SXElem** res, casadi_int* iw, SXElem* w)
const override;
332 std::string disp(
const std::vector<std::string>& arg)
const override;
337 void generate(CodeGenerator& g,
338 const std::vector<casadi_int>& arg,
339 const std::vector<casadi_int>& res,
340 const std::vector<bool>& arg_is_ref,
341 std::vector<bool>& res_is_ref)
const override;
346 bool is_equal(
const MXNode* node, casadi_int depth)
const override;
349 Dict info()
const override {
return {{
"inner", inner_.info()}, {
"outer", outer_.info()},
353 Slice inner_, outer_;
358 void serialize_body(SerializingStream& s)
const override;
362 void serialize_type(SerializingStream& s)
const override;
367 explicit SetNonzerosSlice2(DeserializingStream& s);
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.