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_;
102 MXFunction(
const std::string& name,
103 const std::vector<MX>& input,
const std::vector<MX>& output,
104 const std::vector<std::string>& name_in,
105 const std::vector<std::string>& name_out);
110 ~MXFunction()
override;
115 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
120 void disp_more(std::ostream& stream)
const override;
125 std::string class_name()
const override {
return "MXFunction";}
130 bool is_a(
const std::string& type,
bool recursive)
const override;
136 static const Options options_;
137 const Options& get_options()
const override {
return options_;}
141 Dict get_stats(
void* mem)
const override;
144 Dict generate_options(
const std::string& target=
"clone")
const override;
149 void init(
const Dict& opts)
override;
154 void codegen_declarations(CodeGenerator& g)
const override;
159 void codegen_incref(CodeGenerator& g)
const override;
164 void codegen_decref(CodeGenerator& g)
const override;
169 void codegen_body(CodeGenerator& g)
const override;
174 void serialize_body(SerializingStream &s)
const override;
179 static ProtoFunction* deserialize(DeserializingStream& s);
181 static std::vector<MX> order(
const std::vector<MX>& expr);
188 void generate_lifted(Function& vdef_fcn, Function& vinit_fcn)
const override;
191 bool should_inline(
bool with_sx,
bool always_inline,
bool never_inline)
const override;
196 int eval_sx(
const SXElem** arg, SXElem** res,
197 casadi_int* iw, SXElem* w,
void* mem,
198 bool always_inline,
bool never_inline)
const override;
204 bool always_inline,
bool never_inline)
const override;
209 void ad_forward(
const std::vector<std::vector<MX> >& fwdSeed,
210 std::vector<std::vector<MX> >& fwdSens)
const;
215 void ad_reverse(
const std::vector<std::vector<MX> >& adjSeed,
216 std::vector<std::vector<MX> >& adjSens)
const;
219 std::vector<MX> symbolic_output(
const std::vector<MX>& arg)
const override;
224 int sp_forward(
const bvec_t** arg, bvec_t** res,
225 casadi_int* iw, bvec_t* w,
void* mem)
const override;
230 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w,
void* mem)
const override;
233 std::string print(
const AlgEl& el)
const;
236 void print_arg(std::ostream &stream, casadi_int k,
const AlgEl& el,
const double** arg)
const;
239 void print_res(std::ostream &stream, casadi_int k,
const AlgEl& el,
double** res)
const;
245 const MX mx_in(casadi_int ind)
const override;
246 const std::vector<MX> mx_in()
const override;
250 std::vector<MX> free_mx()
const override {
return free_vars_;}
255 bool has_free()
const override {
return !free_vars_.empty();}
260 std::vector<std::string> get_free()
const override {
261 std::vector<std::string> ret;
262 for (
auto&& e : free_vars_) ret.push_back(e.name());
269 casadi_int n_nodes()
const override {
return algorithm_.size();}
271 casadi_int n_instructions()
const override {
return algorithm_.size();}
276 MX instruction_MX(casadi_int k)
const override;
281 casadi_int instruction_id(casadi_int k)
const override {
return algorithm_.at(k).op;}
286 double get_default_in(casadi_int ind)
const override {
return default_in_.at(ind);}
291 std::vector<casadi_int> instruction_input(casadi_int k)
const override;
296 std::vector<casadi_int> instruction_output(casadi_int k)
const override;
301 void export_code_body(
const std::string& lang,
302 std::ostream &stream,
const Dict& options)
const override;
305 void substitute_inplace(std::vector<MX>& vdef, std::vector<MX>& ex)
const;
308 void find(std::map<FunctionInternal*, Function>& all_fun, casadi_int max_depth)
const override;
313 void change_option(
const std::string& option_name,
const GenericType& option_value)
override;
319 explicit MXFunction(DeserializingStream& s);
std::vector< MX > MXVector
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.