26 #ifndef CASADI_MX_FUNCTION_HPP
27 #define CASADI_MX_FUNCTION_HPP
34 #include "x_function.hpp"
35 #include "mx_node.hpp"
53 std::vector<casadi_int> arg;
56 std::vector<casadi_int> res;
66 class CASADI_EXPORT MXFunction :
67 public XFunction<MXFunction, MX, MXNode>{
72 typedef MXAlgEl AlgEl;
77 std::vector<AlgEl> algorithm_;
82 std::vector<casadi_int> workloc_;
85 std::vector<bool> workstate_;
88 std::vector<MX> free_vars_;
91 std::vector<double> default_in_;
97 bool print_instructions_;
98 bool dump_trace_ =
false;
103 MXFunction(
const std::string& name,
104 const std::vector<MX>& input,
const std::vector<MX>& output,
105 const std::vector<std::string>& name_in,
106 const std::vector<std::string>& name_out);
111 ~MXFunction()
override;
116 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
118 void trace_instruction(std::ostream& trace, casadi_int k,
const double* w,
124 void disp_more(std::ostream& stream)
const override;
129 std::string class_name()
const override {
return "MXFunction";}
134 bool is_a(
const std::string& type,
bool recursive)
const override;
140 static const Options options_;
141 const Options& get_options()
const override {
return options_;}
145 Dict get_stats(
void* mem)
const override;
148 Dict generate_options(
const std::string& target=
"clone")
const override;
153 void init(
const Dict& opts)
override;
158 void codegen_declarations(CodeGenerator& g)
const override;
163 void codegen_incref(CodeGenerator& g)
const override;
168 void codegen_decref(CodeGenerator& g)
const override;
173 void codegen_body(CodeGenerator& g)
const override;
181 size_t codegen_sz_w(
const CodeGenerator& g)
const override;
186 void serialize_body(SerializingStream &s)
const override;
191 static ProtoFunction* deserialize(DeserializingStream& s);
193 static std::vector<MX> order(
const std::vector<MX>& expr);
200 void generate_lifted(Function& vdef_fcn, Function& vinit_fcn)
const override;
203 bool should_inline(
bool with_sx,
bool always_inline,
bool never_inline)
const override;
208 int eval_sx(
const SXElem** arg, SXElem** res,
209 casadi_int* iw, SXElem* w,
void* mem,
210 bool always_inline,
bool never_inline)
const override;
216 bool always_inline,
bool never_inline)
const override;
221 void ad_forward(
const std::vector<std::vector<MX> >& fwdSeed,
222 std::vector<std::vector<MX> >& fwdSens)
const;
227 void ad_reverse(
const std::vector<std::vector<MX> >& adjSeed,
228 std::vector<std::vector<MX> >& adjSens)
const;
231 std::vector<MX> symbolic_output(
const std::vector<MX>& arg)
const override;
236 int sp_forward(
const bvec_t** arg, bvec_t** res,
237 casadi_int* iw, bvec_t* w,
void* mem)
const override;
242 int eval_activity(
const bvec_t** arg, bvec_t** res,
243 casadi_int* iw, bvec_t* w,
void* mem)
const override;
248 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w,
void* mem)
const override;
251 std::string print(
const AlgEl& el)
const;
254 void print_arg(std::ostream &stream, casadi_int k,
const AlgEl& el,
const double** arg)
const;
257 void print_arg(CodeGenerator& g, casadi_int k,
const AlgEl& el,
258 const std::vector<casadi_int>& arg,
const std::vector<bool>& arg_is_ref)
const;
261 void print_res(std::ostream &stream, casadi_int k,
const AlgEl& el,
double** res)
const;
264 void print_res(CodeGenerator& g, casadi_int k,
const AlgEl& el,
265 const std::vector<casadi_int>& res,
const std::vector<bool>& res_is_ref)
const;
271 const MX mx_in(casadi_int ind)
const override;
272 const std::vector<MX> mx_in()
const override;
276 std::vector<MX> free_mx()
const override {
return free_vars_;}
281 bool has_free()
const override {
return !free_vars_.empty();}
286 std::vector<std::string> get_free()
const override {
287 std::vector<std::string> ret;
288 for (
auto&& e : free_vars_) ret.push_back(e.name());
295 std::vector<std::string> get_function()
const override;
300 const Function& get_function(
const std::string &name)
const override;
305 casadi_int n_nodes()
const override {
return algorithm_.size();}
307 casadi_int n_instructions()
const override {
return algorithm_.size();}
312 MX instruction_MX(casadi_int k)
const override;
317 casadi_int instruction_id(casadi_int k)
const override {
return algorithm_.at(k).op;}
322 double get_default_in(casadi_int ind)
const override {
return default_in_.at(ind);}
327 std::vector<casadi_int> instruction_input(casadi_int k)
const override;
332 std::vector<casadi_int> instruction_output(casadi_int k)
const override;
337 void export_code_body(
const std::string& lang,
338 std::ostream &stream,
const Dict& options)
const override;
341 void substitute_inplace(std::vector<MX>& vdef, std::vector<MX>& ex)
const;
344 void find(std::map<FunctionInternal*, std::pair<Function, size_t> >& all_fun,
345 casadi_int max_depth)
const override;
350 void change_option(
const std::string& option_name,
const GenericType& option_value)
override;
356 explicit MXFunction(DeserializingStream& s);
std::vector< MX > MXVector
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.