26 #ifndef CASADI_SX_FUNCTION_HPP
27 #define CASADI_SX_FUNCTION_HPP
29 #include "x_function.hpp"
42 struct {
int i1, i2; };
53 class CASADI_EXPORT SXFunction :
54 public XFunction<SXFunction, Matrix<SXElem>, SXNode>{
59 SXFunction(
const std::string& name,
60 const std::vector<Matrix<SXElem> >& inputv,
61 const std::vector<Matrix<SXElem> >& outputv,
62 const std::vector<std::string>& name_in,
63 const std::vector<std::string>& name_out);
68 ~SXFunction()
override;
73 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
78 int eval_sx(
const SXElem** arg, SXElem** res,
79 casadi_int* iw, SXElem* w,
void* mem)
const override;
82 bool should_inline(
bool always_inline,
bool never_inline)
const override {
89 void ad_forward(
const std::vector<std::vector<SX> >& fseed,
90 std::vector<std::vector<SX> >& fsens)
const;
95 void ad_reverse(
const std::vector<std::vector<SX> >& aseed,
96 std::vector<std::vector<SX> >& asens)
const;
101 bool is_smooth()
const;
106 void disp_more(std::ostream& stream)
const override;
111 std::string class_name()
const override {
return "SXFunction";}
116 bool is_a(
const std::string& type,
bool recursive)
const override;
122 const SX sx_in(casadi_int ind)
const override;
123 const std::vector<SX> sx_in()
const override;
127 std::vector<SX> free_sx()
const override {
128 std::vector<SX> ret(free_vars_.size());
129 std::copy(free_vars_.begin(), free_vars_.end(), ret.begin());
136 bool has_free()
const override {
return !free_vars_.empty();}
141 std::vector<std::string> get_free()
const override {
142 std::vector<std::string> ret;
143 for (
auto&& e : free_vars_) ret.push_back(e.name());
150 SX hess(casadi_int iind=0, casadi_int oind=0);
155 casadi_int n_instructions()
const override {
return algorithm_.size();}
160 casadi_int instruction_id(casadi_int k)
const override {
return algorithm_.at(k).op;}
165 std::vector<casadi_int> instruction_input(casadi_int k)
const override {
166 auto e = algorithm_.at(k);
167 if (casadi_math<double>::ndeps(e.op)==2 || e.op==OP_INPUT) {
169 }
else if (casadi_math<double>::ndeps(e.op)==1) {
179 double instruction_constant(casadi_int k)
const override {
180 return algorithm_.at(k).d;
186 std::vector<casadi_int> instruction_output(casadi_int k)
const override {
187 auto e = algorithm_.at(k);
188 if (e.op==OP_OUTPUT) {
198 casadi_int n_nodes()
const override {
return algorithm_.size() - nnz_out();}
207 typedef ScalarAtomic AlgEl;
220 std::vector<AlgEl> algorithm_;
226 std::vector<SXElem> free_vars_;
229 std::vector<SXElem> operations_;
232 std::vector<SXElem> constants_;
235 std::vector<double> default_in_;
240 void serialize_body(SerializingStream &s)
const override;
245 static ProtoFunction* deserialize(DeserializingStream& s);
251 static const Options options_;
252 const Options& get_options()
const override {
return options_;}
256 Dict generate_options(
const std::string& target=
"clone")
const override;
261 void init(
const Dict& opts)
override;
266 void codegen_declarations(CodeGenerator& g)
const override;
271 void codegen_body(CodeGenerator& g)
const override;
276 int sp_forward(
const bvec_t** arg, bvec_t** res,
277 casadi_int* iw, bvec_t* w,
void* mem)
const override;
282 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w,
void* mem)
const override;
287 SX instructions_sx()
const override;
292 double get_default_in(casadi_int ind)
const override {
return default_in_.at(ind);}
297 void export_code_body(
const std::string& lang,
298 std::ostream &stream,
const Dict& options)
const override;
301 bool just_in_time_opencl_;
304 bool just_in_time_sparsity_;
307 bool live_variables_;
313 explicit SXFunction(DeserializingStream& s);
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.