25 #ifndef CASADI_FUNCTION_HPP
26 #define CASADI_FUNCTION_HPP
28 #include "sx_elem.hpp"
30 #include "printable.hpp"
38 class FunctionInternal;
39 class SerializingStream;
40 class DeserializingStream;
60 public SWIG_IF_ELSE(PrintableCommon, Printable<Function>) {
82 const std::vector<SX>& ex_in,
83 const std::vector<SX>& ex_out,
86 const std::vector<SX>& ex_in,
87 const std::vector<SX>& ex_out,
88 const std::vector<std::string>& name_in,
89 const std::vector<std::string>& name_out,
91 Function(
const std::string& name,
const std::map<std::string, SX>& dict,
92 const std::vector<std::string>& name_in,
93 const std::vector<std::string>& name_out,
102 const std::vector<MX>& ex_in,
103 const std::vector<MX>& ex_out,
106 const std::vector<MX>& ex_in,
107 const std::vector<MX>& ex_out,
108 const std::vector<std::string>& name_in,
109 const std::vector<std::string>& name_out,
111 Function(
const std::string& name,
const std::map<std::string, MX>& dict,
112 const std::vector<std::string>& name_in,
113 const std::vector<std::string>& name_out,
185 static Function jit(
const std::string& name,
const std::string& body,
186 const std::vector<std::string>& name_in,
187 const std::vector<std::string>& name_out,
189 static Function jit(
const std::string& name,
const std::string& body,
190 const std::vector<std::string>& name_in,
191 const std::vector<std::string>& name_out,
192 const std::vector<Sparsity>& sparsity_in,
193 const std::vector<Sparsity>& sparsity_out,
207 Function expand(
const std::string& name,
234 Function transform(
const std::string& fname,
const Dict& opts =
Dict())
const;
235 Function transform(
const std::vector<std::vector<GenericType> >& passes,
237 Function transform(
const std::string& fname,
238 const std::vector<std::vector<GenericType> >& passes,
259 casadi_int n_in()
const;
264 casadi_int n_out()
const;
270 casadi_int size1_in(casadi_int ind)
const;
272 casadi_int size2_in(casadi_int ind)
const;
274 std::pair<casadi_int, casadi_int> size_in(casadi_int ind)
const;
275 std::pair<casadi_int, casadi_int>
size_in(
const std::string& iname)
const {
276 return size_in(index_in(iname));
284 casadi_int size1_out(casadi_int ind)
const;
286 casadi_int size2_out(casadi_int ind)
const;
288 std::pair<casadi_int, casadi_int> size_out(casadi_int ind)
const;
289 std::pair<casadi_int, casadi_int>
size_out(
const std::string& oname)
const {
290 return size_out(index_out(oname));
300 casadi_int nnz_in()
const;
301 casadi_int nnz_in(casadi_int ind)
const;
302 casadi_int
nnz_in(
const std::string& iname)
const {
return nnz_in(index_in(iname));}
311 casadi_int nnz_out()
const;
312 casadi_int nnz_out(casadi_int ind)
const;
313 casadi_int
nnz_out(
const std::string& oname)
const {
return nnz_out(index_out(oname));}
326 std::vector<bool> activity(
const std::vector<bool>& arg)
const;
334 casadi_int numel_in()
const;
335 casadi_int numel_in(casadi_int ind)
const;
345 casadi_int numel_out()
const;
346 casadi_int numel_out(casadi_int ind)
const;
353 const std::vector<std::string>& name_in()
const;
358 const std::vector<std::string>& name_out()
const;
363 const std::string& name_in(casadi_int ind)
const;
368 const std::string& name_out(casadi_int ind)
const;
376 casadi_int index_in(
const std::string &name)
const;
384 casadi_int index_out(
const std::string &name)
const;
389 bool has_in(
const std::string &name)
const;
393 bool has_out(
const std::string &name)
const;
398 double default_in(casadi_int ind)
const;
403 double max_in(casadi_int ind)
const;
408 double min_in(casadi_int ind)
const;
413 std::vector<double> nominal_in(casadi_int ind)
const;
418 std::vector<double> nominal_out(casadi_int ind)
const;
424 const Sparsity& sparsity_in(casadi_int ind)
const;
425 const Sparsity& sparsity_in(
const std::string& iname)
const;
432 const Sparsity& sparsity_out(casadi_int ind)
const;
433 const Sparsity& sparsity_out(
const std::string& iname)
const;
440 bool is_diff_in(casadi_int ind)
const;
441 bool is_diff_out(casadi_int ind)
const;
442 std::vector<bool> is_diff_in()
const;
443 std::vector<bool> is_diff_out()
const;
447 typedef std::map<std::string, std::vector<std::string> >
AuxOut;
450 Function factory(
const std::string& name,
451 const std::vector<std::string>& s_in,
452 const std::vector<std::string>& s_out,
466 Function wrap(
const std::string& name)
const;
474 Function wrap_as_needed(
const std::string& name,
const Dict& opts)
const;
483 std::vector<bool> which_depends(
const std::string& s_in,
484 const std::vector<std::string>& s_out,
485 casadi_int order=1,
bool tr=
false)
const;
490 void print_dimensions(std::ostream &stream=
casadi::uout())
const;
495 void print_options(std::ostream &stream=
casadi::uout())
const;
500 void print_option(
const std::string &name, std::ostream &stream =
casadi::uout())
const;
505 bool has_option(
const std::string &option_name)
const;
513 void change_option(
const std::string& option_name,
const GenericType& option_value);
518 void reset_dump_count();
523 bool uses_output()
const;
525 #ifdef WITH_DEPRECATED_FEATURES
529 Function jacobian_old(casadi_int iind, casadi_int oind)
const;
534 Function hessian_old(casadi_int iind, casadi_int oind)
const;
538 const Sparsity sparsity_jac(casadi_int iind, casadi_int oind,
539 bool compact=
false,
bool symmetric=
false)
const;
541 bool compact=
false,
bool symmetric=
false)
const {
542 return sparsity_jac(index_in(iind), oind, compact, symmetric);
545 bool compact=
false,
bool symmetric=
false)
const {
546 return sparsity_jac(iind, index_out(oind), compact, symmetric);
549 bool compact=
false,
bool symmetric=
false)
const {
550 return sparsity_jac(index_in(iind), index_out(oind), compact, symmetric);
577 void call(
const std::vector<DM> &arg, std::vector<DM>& SWIG_OUTPUT(res),
578 bool always_inline=
false,
bool never_inline=
false)
const;
579 void call(
const std::vector<SX> &arg, std::vector<SX>& SWIG_OUTPUT(res),
580 bool always_inline=
false,
bool never_inline=
false)
const;
581 void call(
const std::vector<MX> &arg, std::vector<MX>& SWIG_OUTPUT(res),
582 bool always_inline=
false,
bool never_inline=
false)
const;
584 bool always_inline=
false,
bool never_inline=
false)
const;
586 bool always_inline=
false,
bool never_inline=
false)
const;
588 bool always_inline=
false,
bool never_inline=
false)
const;
593 bool operator==(
const Function& f)
const;
597 std::vector<DM> operator()(
const std::vector<DM>& arg)
const;
598 std::vector<SX> operator()(
const std::vector<SX>& arg)
const;
599 std::vector<MX> operator()(
const std::vector<MX>& arg)
const;
609 void operator()(std::vector<const double*> arg, std::vector<double*> res)
const;
610 void operator()(std::vector<const bvec_t*> arg, std::vector<bvec_t*> res)
const;
611 void operator()(std::vector<const SXElem*> arg, std::vector<SXElem*> res)
const;
612 template<
typename D>
void call_gen(std::vector<const D*> arg, std::vector<D*> res)
const;
619 typedef const std::vector<std::vector<double>>&
VecArg;
620 std::vector<const double*> buf_in(
VecArg arg)
const;
621 typedef std::vector<std::vector<double>>&
VecRes;
622 std::vector<double*> buf_out(
VecRes res)
const;
623 typedef std::vector<std::vector<double>*>
VPrRes;
624 std::vector<double*> buf_out(
VPrRes res)
const;
626 typedef const std::map<std::string, std::vector<double>>&
MapArg;
627 std::vector<const double*> buf_in(
MapArg arg)
const;
628 typedef std::map<std::string, std::vector<double>>&
MapRes;
629 std::vector<double*> buf_out(
MapRes res)
const;
630 typedef std::map<std::string, std::vector<double>*>
MPrRes;
631 std::vector<double*> buf_out(
MPrRes res)
const;
652 return operator()(std::vector<DM>{arg0});
655 return operator()(std::vector<SX>{arg0});
658 return operator()(std::vector<MX>{arg0});
665 int operator()(
const double** arg,
double** res,
666 casadi_int* iw,
double* w,
int mem)
const;
671 int operator()(
const double** arg,
double** res,
672 casadi_int* iw,
double* w)
const;
680 casadi_int* iw,
SXElem* w,
int mem=0)
const;
686 casadi_int* iw,
bvec_t* w,
int mem=0)
const;
692 casadi_int* iw,
bvec_t* w,
int mem=0)
const;
702 int rev(std::vector<bvec_t*> arg, std::vector<bvec_t*> res)
const;
711 std::vector<MX> mapsum(
const std::vector<MX > &x,
712 const std::string& parallelization=
"serial")
const;
755 Function mapaccum(
const std::string& name, casadi_int N,
const Dict& opts =
Dict())
const;
756 Function mapaccum(
const std::string& name, casadi_int N, casadi_int n_accum,
758 Function mapaccum(
const std::string& name, casadi_int n,
759 const std::vector<casadi_int>& accum_in,
760 const std::vector<casadi_int>& accum_out,
762 Function mapaccum(
const std::string& name, casadi_int n,
763 const std::vector<std::string>& accum_in,
764 const std::vector<std::string>& accum_out,
795 Function map(casadi_int n,
const std::string& parallelization=
"serial")
const;
796 Function map(casadi_int n,
const std::string& parallelization,
797 casadi_int max_num_threads)
const;
806 Function map(
const std::string& name,
const std::string& parallelization, casadi_int n,
807 const std::vector<casadi_int>& reduce_in,
808 const std::vector<casadi_int>& reduce_out,
810 Function map(
const std::string& name,
const std::string& parallelization, casadi_int n,
811 const std::vector<std::string>& reduce_in,
812 const std::vector<std::string>& reduce_out,
815 const std::vector<bool>& reduce_in,
816 const std::vector<bool>& reduce_out=std::vector<bool>(),
823 Function slice(
const std::string& name,
const std::vector<casadi_int>& order_in,
824 const std::vector<casadi_int>& order_out,
const Dict& opts=
Dict())
const;
829 static Function conditional(
const std::string& name,
const std::vector<Function>& f,
835 static Function conditional(
const std::string& name,
843 static Function bspline(
const std::string &name,
844 const std::vector< std::vector<double> >& knots,
const std::vector<double>& coeffs,
845 const std::vector<casadi_int>& degree, casadi_int m=1,
const Dict& opts=
Dict());
869 Function forward(casadi_int nfwd)
const;
894 const std::vector<Sparsity>& jac_sparsity(
bool compact =
false)
const;
899 Sparsity jac_sparsity(casadi_int oind, casadi_int iind,
bool compact =
false)
const;
904 std::string generate(
const std::string& fname,
const Dict& opts=
Dict())
const;
909 std::string generate(
const Dict& opts=
Dict())
const;
914 std::string generate_dependencies(
const std::string& fname,
const Dict& opts=
Dict())
const;
923 void generate_in(
const std::string& fname,
const std::vector<DM>& arg);
924 std::vector<DM> generate_in(
const std::string& fname);
934 void generate_out(
const std::string& fname,
const std::vector<DM>& arg);
935 std::vector<DM> generate_out(
const std::string& fname);
944 void export_code(
const std::string& lang,
945 const std::string &fname,
const Dict& options=
Dict())
const;
951 void serialize(std::ostream &stream,
const Dict& opts=
Dict())
const;
962 std::string serialize(
const Dict& opts=
Dict())
const;
969 void save(
const std::string &fname,
const Dict& opts=
Dict())
const;
971 std::string export_code(
const std::string& lang,
const Dict& options=
Dict())
const;
973 void export_code(
const std::string& lang,
974 std::ostream &stream,
const Dict& options=
Dict())
const;
985 T* ret =
dynamic_cast<T*
>(get());
986 casadi_assert_dev(ret!=
nullptr);
1001 Dict stats(
int mem=0)
const;
1009 const SX sx_in(casadi_int iind)
const;
1011 return sx_in(index_in(iname));
1013 const std::vector<SX> sx_in()
const;
1014 const MX mx_in(casadi_int ind)
const;
1016 return mx_in(index_in(iname));
1018 const std::vector<MX> mx_in()
const;
1020 template<
typename T>
1022 template<
typename T>
1024 return sym_in<T>(index_in(iname));
1026 template<
typename T>
1037 const SX sx_out(casadi_int oind)
const;
1039 return sx_out(index_out(oname));
1041 const std::vector<SX> sx_out()
const;
1042 const MX mx_out(casadi_int ind)
const;
1044 return mx_out(index_out(oname));
1046 const std::vector<MX> mx_out()
const;
1053 std::vector<double> nz_from_in(
const std::vector<DM>& arg)
const;
1054 std::vector<double> nz_from_out(
const std::vector<DM>& arg)
const;
1055 std::vector<DM> nz_to_in(
const std::vector<double>& arg)
const;
1056 std::vector<DM> nz_to_out(
const std::vector<double>& arg)
const;
1066 DMDict convert_in(
const std::vector<DM>& arg)
const;
1067 std::vector<DM> convert_in(
const DMDict& arg)
const;
1068 DMDict convert_out(
const std::vector<DM>& arg)
const;
1069 std::vector<DM> convert_out(
const DMDict& arg)
const;
1070 SXDict convert_in(
const std::vector<SX>& arg)
const;
1071 std::vector<SX> convert_in(
const SXDict& arg)
const;
1072 SXDict convert_out(
const std::vector<SX>& arg)
const;
1073 std::vector<SX> convert_out(
const SXDict& arg)
const;
1074 MXDict convert_in(
const std::vector<MX>& arg)
const;
1075 std::vector<MX> convert_in(
const MXDict& arg)
const;
1076 MXDict convert_out(
const std::vector<MX>& arg)
const;
1077 std::vector<MX> convert_out(
const MXDict& arg)
const;
1083 bool has_free()
const;
1088 std::vector<std::string> get_free()
const;
1093 std::vector<SX> free_sx()
const;
1098 std::vector<MX> free_mx()
const;
1103 void generate_lifted(
Function& SWIG_OUTPUT(vdef_fcn),
1104 Function& SWIG_OUTPUT(vinit_fcn))
const;
1109 casadi_int n_nodes()
const;
1114 casadi_int n_instructions()
const;
1119 casadi_int instruction_id(casadi_int k)
const;
1126 std::vector<casadi_int> instruction_input(casadi_int k)
const;
1131 double instruction_constant(casadi_int k)
const;
1138 std::vector<casadi_int> instruction_output(casadi_int k)
const;
1143 MX instruction_MX(casadi_int k)
const;
1151 SX instructions_sx()
const;
1157 bool has_spfwd()
const;
1158 bool has_sprev()
const;
1164 size_t sz_arg()
const;
1169 size_t sz_res()
const;
1174 size_t sz_iw()
const;
1179 size_t sz_w()
const;
1185 void sz_work(
size_t& sz_arg,
size_t& sz_res,
size_t& sz_iw,
size_t& sz_w)
const;
1190 void set_work(
const double**& arg,
double**& res,
1191 casadi_int*& iw,
double*& w,
int mem=0)
const;
1196 void set_temp(
const double** arg,
double** res,
1197 casadi_int* iw,
double* w,
int mem=0)
const;
1202 void setup(
const double** arg,
double** res, casadi_int* iw,
double* w,
int mem=0)
const;
1207 template<
typename M>
1208 void call_gen(
const std::map<std::string, M>& arg, std::map<std::string, M>& res,
1209 bool always_inline,
bool never_inline)
const;
1214 void merge(
const std::vector<MX>& arg,
1215 std::vector<MX>& subs_from, std::vector<MX>& subs_to)
const;
1222 const std::string& name()
const;
1229 bool is_a(
const std::string& type,
bool recursive=
true)
const;
1243 static bool check_name(
const std::string& name);
1251 static std::string fix_name(
const std::string& name);
1256 static Function deserialize(std::istream& stream);
1261 static Function deserialize(
const std::string& s);
1274 void assert_size_in(casadi_int i, casadi_int nrow, casadi_int ncol)
const;
1277 void assert_size_out(casadi_int i, casadi_int nrow, casadi_int ncol)
const;
1280 void assert_sparsity_out(casadi_int i,
const Sparsity& sp,
1281 casadi_int n = 1,
bool allow_all_zero_sparse =
true)
const;
1284 casadi_int checkout()
const;
1287 void release(
int mem)
const;
1291 void* memory(
int ind)
const;
1293 static std::vector<SX> order(
const std::vector<SX>& expr);
1294 static std::vector<MX> order(
const std::vector<MX>& expr);
1305 std::vector<std::string> get_function()
const;
1310 Function get_function(
const std::string &name)
const;
1315 bool has_function(
const std::string& fname)
const;
1323 std::vector<Function> find_functions(casadi_int max_depth = -1)
const;
1331 Function find_function(
const std::string &name, casadi_int max_depth=-1)
const;
1342 void construct(
const std::string& name,
1343 const std::vector<SX>& ex_in,
const std::vector<SX>& ex_out,
1344 const std::vector<std::string>& name_in,
1345 const std::vector<std::string>& name_out,
1347 void construct(
const std::string& name,
1348 const std::vector<MX>& ex_in,
const std::vector<MX>& ex_out,
1349 const std::vector<std::string>& name_in,
1350 const std::vector<std::string>& name_out,
1352 template<
typename M>
1353 void construct(
const std::string& name,
const std::map<std::string, M>& dict,
1354 const std::vector<std::string>& name_in,
1355 const std::vector<std::string>& name_out,
1360 static bool proceed_to(std::istream& file,
const std::string&
str);
1363 Function mapaccum(
const std::string& name,
const std::vector<Function>& chain,
1364 casadi_int n_accum=1,
const Dict& opts =
Dict())
const;
1366 #ifdef WITH_EXTRA_CHECKS
1370 static thread_local casadi_int call_depth_;
1386 std::vector<double> w_;
1387 std::vector<casadi_int> iw_;
1388 std::vector<const double*> arg_;
1389 std::vector<double*> res_;
1392 void *mem_internal_;
1412 void set_arg(casadi_int i,
const double* a, casadi_int size);
1421 void set_res(casadi_int i,
double* a, casadi_int size);
1442 #include "casadi_interrupt.hpp"
1443 #include "runtime/shared.hpp"
Helper class for Serialization.
Class to achieve minimal overhead function evaluations.
Internal class for Function.
const MX mx_in(const std::string &iname) const
Get symbolic primitives equivalent to the input expressions.
void operator()(VecArg arg, MPrRes res) const
Numerical evaluation.
const std::map< std::string, std::vector< double > > & MapArg
Supported arguments for numerical evaluation and converters.
void operator()(MapArg arg, MapRes res) const
Numerical evaluation.
std::pair< casadi_int, casadi_int > size_out(const std::string &oname) const
Get output dimension.
const std::vector< std::vector< double > > & VecArg
Supported arguments for numerical evaluation and converters.
std::vector< SX > operator()(const SX &arg0) const
std::vector< MX > operator()(const MX &arg0) const
const Sparsity sparsity_jac(const std::string &iind, casadi_int oind=0, bool compact=false, bool symmetric=false) const
casadi_int nnz_out(const std::string &oname) const
Get number of output nonzeros.
std::vector< std::vector< double > * > VPrRes
Supported arguments for numerical evaluation and converters.
void operator()(MapArg arg, MPrRes res) const
Numerical evaluation.
casadi_int size2_in(const std::string &iname) const
Get input dimension.
casadi_int numel_in(const std::string &iname) const
Get number of input elements.
casadi_int nnz_in(const std::string &iname) const
Get number of input nonzeros.
void operator()(VecArg arg, VecRes res) const
Numerical evaluation.
const T sym_in(const std::string &iname) const
Get symbolic primitives equivalent to the input expressions.
casadi_int size1_out(const std::string &oname) const
Get output dimension.
const Sparsity sparsity_jac(const std::string &iind, const std::string &oind, bool compact=false, bool symmetric=false) const
void operator()(VecArg arg, MapRes res) const
Numerical evaluation.
const T sym_in(casadi_int iind) const
Get symbolic primitives equivalent to the input expressions.
const MX mx_out(const std::string &oname) const
Get symbolic primitives equivalent to the output expressions.
const SX sx_out(const std::string &oname) const
Get symbolic primitives equivalent to the output expressions.
void operator()(VecArg arg, VPrRes res) const
Numerical evaluation.
std::map< std::string, std::vector< double > > & MapRes
Supported arguments for numerical evaluation and converters.
std::vector< DM > operator()(const DM &arg0) const
const std::vector< T > sym_in() const
Get symbolic primitives equivalent to the input expressions.
casadi_int size1_in(const std::string &iname) const
Get input dimension.
casadi_int size2_out(const std::string &oname) const
Get output dimension.
casadi_int numel_out(const std::string &oname) const
Get number of output elements.
static std::string type_name()
Get type name.
void operator()(MapArg arg, VPrRes res) const
Numerical evaluation.
std::map< std::string, std::vector< double > * > MPrRes
Supported arguments for numerical evaluation and converters.
const Sparsity sparsity_jac(casadi_int iind, const std::string &oind, bool compact=false, bool symmetric=false) const
const SX sx_in(const std::string &iname) const
Get symbolic primitives equivalent to the input expressions.
T * get() const
Get a pointer and typecast.
std::map< std::string, std::vector< std::string > > AuxOut
std::vector< std::vector< double > > & VecRes
Supported arguments for numerical evaluation and converters.
void operator()(MapArg arg, VecRes res) const
Numerical evaluation.
std::pair< casadi_int, casadi_int > size_in(const std::string &iname) const
Get input dimension.
Generic data type, can hold different types such as bool, casadi_int, std::string etc.
The basic scalar symbolic class of CasADi.
Helper class for Serialization.
GenericShared implements a reference counting framework similar for efficient and.
std::map< std::string, MX > MXDict
unsigned long long bvec_t
double if_else(double x, double y, double z)
std::vector< SX > SXVector
std::vector< MX > MXVector
std::map< std::string, SX > SXDict
std::string str(const T &v)
String representation, any type.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
std::vector< std::string > StringVector
std::initializer_list< SX > SXIList
std::initializer_list< MX > MXIList
std::vector< T > reverse(const std::vector< T > &v)
Reverse a list.
void CASADI_EXPORT _function_buffer_eval(void *raw)
std::map< std::string, DM > DMDict
std::string filename(const std::string &path)