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;
98 bool dump_trace_ =
false;
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);
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;
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;
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;
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;
237 casadi_int* iw,
bvec_t* w,
void* mem)
const override;
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();}
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;
345 casadi_int max_depth)
const override;
350 void change_option(
const std::string& option_name,
const GenericType& option_value)
override;
Helper class for C code generation.
Helper class for Serialization.
Internal class for Function.
Generic data type, can hold different types such as bool, casadi_int, std::string etc.
Internal node class for MXFunction.
static const Options options_
Options.
std::vector< casadi_int > workloc_
Offsets for elements in the w_ vector.
bool live_variables_
Live variables?
std::vector< double > default_in_
Default input values.
casadi_int instruction_id(casadi_int k) const override
Get an atomic operation operator index.
double get_default_in(casadi_int ind) const override
Get default input value.
casadi_int n_nodes() const override
Number of nodes in the algorithm.
std::vector< bool > workstate_
std::vector< std::string > get_free() const override
Print free variables.
bool has_free() const override
Does the function have free variables.
bool print_instructions_
Print instructions during evaluation.
MXAlgEl AlgEl
An element of the algorithm, namely an MX node.
casadi_int n_instructions() const override
Get the number of atomic operations.
std::vector< AlgEl > algorithm_
All the runtime elements in the order of evaluation.
const Options & get_options() const override
Options.
std::vector< MX > free_mx() const override
Get free variables (MX)
std::vector< MX > free_vars_
Free variables.
std::string class_name() const override
Get type name.
Base class for FunctionInternal and LinsolInternal.
The basic scalar symbolic class of CasADi.
Helper class for Serialization.
Internal node class for the base class of SXFunction and MXFunction.
unsigned long long bvec_t
std::vector< casadi_int > find(const std::vector< T > &v)
find nonzeros
std::vector< MX > MXVector
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
An element of the algorithm, namely an MX node.
MX data
Data associated with the operation.
std::vector< casadi_int > arg
Work vector indices of the arguments.
casadi_int op
Operator index.
std::vector< casadi_int > res
Work vector indices of the results.
Options metadata for a class.