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,
228 casadi_int n_in()
const;
233 casadi_int n_out()
const;
239 casadi_int size1_in(casadi_int ind)
const;
241 casadi_int size2_in(casadi_int ind)
const;
243 std::pair<casadi_int, casadi_int> size_in(casadi_int ind)
const;
244 std::pair<casadi_int, casadi_int>
size_in(
const std::string& iname)
const {
245 return size_in(index_in(iname));
253 casadi_int size1_out(casadi_int ind)
const;
255 casadi_int size2_out(casadi_int ind)
const;
257 std::pair<casadi_int, casadi_int> size_out(casadi_int ind)
const;
258 std::pair<casadi_int, casadi_int>
size_out(
const std::string& oname)
const {
259 return size_out(index_out(oname));
269 casadi_int nnz_in()
const;
270 casadi_int nnz_in(casadi_int ind)
const;
271 casadi_int
nnz_in(
const std::string& iname)
const {
return nnz_in(index_in(iname));}
280 casadi_int nnz_out()
const;
281 casadi_int nnz_out(casadi_int ind)
const;
282 casadi_int
nnz_out(
const std::string& oname)
const {
return nnz_out(index_out(oname));}
291 casadi_int numel_in()
const;
292 casadi_int numel_in(casadi_int ind)
const;
302 casadi_int numel_out()
const;
303 casadi_int numel_out(casadi_int ind)
const;
310 const std::vector<std::string>& name_in()
const;
315 const std::vector<std::string>& name_out()
const;
320 const std::string& name_in(casadi_int ind)
const;
325 const std::string& name_out(casadi_int ind)
const;
333 casadi_int index_in(
const std::string &name)
const;
341 casadi_int index_out(
const std::string &name)
const;
346 bool has_in(
const std::string &name)
const;
350 bool has_out(
const std::string &name)
const;
355 double default_in(casadi_int ind)
const;
360 double max_in(casadi_int ind)
const;
365 double min_in(casadi_int ind)
const;
370 std::vector<double> nominal_in(casadi_int ind)
const;
375 std::vector<double> nominal_out(casadi_int ind)
const;
381 const Sparsity& sparsity_in(casadi_int ind)
const;
382 const Sparsity& sparsity_in(
const std::string& iname)
const;
389 const Sparsity& sparsity_out(casadi_int ind)
const;
390 const Sparsity& sparsity_out(
const std::string& iname)
const;
397 bool is_diff_in(casadi_int ind)
const;
398 bool is_diff_out(casadi_int ind)
const;
399 std::vector<bool> is_diff_in()
const;
400 std::vector<bool> is_diff_out()
const;
404 typedef std::map<std::string, std::vector<std::string> >
AuxOut;
407 Function factory(
const std::string& name,
408 const std::vector<std::string>& s_in,
409 const std::vector<std::string>& s_out,
434 std::vector<bool> which_depends(
const std::string& s_in,
435 const std::vector<std::string>& s_out,
436 casadi_int order=1,
bool tr=
false)
const;
441 void print_dimensions(std::ostream &stream=
casadi::uout())
const;
446 void print_options(std::ostream &stream=
casadi::uout())
const;
451 void print_option(
const std::string &name, std::ostream &stream =
casadi::uout())
const;
456 bool has_option(
const std::string &option_name)
const;
464 void change_option(
const std::string& option_name,
const GenericType& option_value);
469 bool uses_output()
const;
471 #ifdef WITH_DEPRECATED_FEATURES
475 Function jacobian_old(casadi_int iind, casadi_int oind)
const;
480 Function hessian_old(casadi_int iind, casadi_int oind)
const;
484 const Sparsity sparsity_jac(casadi_int iind, casadi_int oind,
485 bool compact=
false,
bool symmetric=
false)
const;
487 bool compact=
false,
bool symmetric=
false)
const {
488 return sparsity_jac(index_in(iind), oind, compact, symmetric);
491 bool compact=
false,
bool symmetric=
false)
const {
492 return sparsity_jac(iind, index_out(oind), compact, symmetric);
495 bool compact=
false,
bool symmetric=
false)
const {
496 return sparsity_jac(index_in(iind), index_out(oind), compact, symmetric);
523 void call(
const std::vector<DM> &arg, std::vector<DM>& SWIG_OUTPUT(res),
524 bool always_inline=
false,
bool never_inline=
false)
const;
525 void call(
const std::vector<SX> &arg, std::vector<SX>& SWIG_OUTPUT(res),
526 bool always_inline=
false,
bool never_inline=
false)
const;
527 void call(
const std::vector<MX> &arg, std::vector<MX>& SWIG_OUTPUT(res),
528 bool always_inline=
false,
bool never_inline=
false)
const;
530 bool always_inline=
false,
bool never_inline=
false)
const;
532 bool always_inline=
false,
bool never_inline=
false)
const;
534 bool always_inline=
false,
bool never_inline=
false)
const;
539 bool operator==(
const Function& f)
const;
543 std::vector<DM> operator()(
const std::vector<DM>& arg)
const;
544 std::vector<SX> operator()(
const std::vector<SX>& arg)
const;
545 std::vector<MX> operator()(
const std::vector<MX>& arg)
const;
555 void operator()(std::vector<const double*> arg, std::vector<double*> res)
const;
556 void operator()(std::vector<const bvec_t*> arg, std::vector<bvec_t*> res)
const;
557 void operator()(std::vector<const SXElem*> arg, std::vector<SXElem*> res)
const;
558 template<
typename D>
void call_gen(std::vector<const D*> arg, std::vector<D*> res)
const;
565 typedef const std::vector<std::vector<double>>&
VecArg;
566 std::vector<const double*> buf_in(
VecArg arg)
const;
567 typedef std::vector<std::vector<double>>&
VecRes;
568 std::vector<double*> buf_out(
VecRes res)
const;
569 typedef std::vector<std::vector<double>*>
VPrRes;
570 std::vector<double*> buf_out(
VPrRes res)
const;
572 typedef const std::map<std::string, std::vector<double>>&
MapArg;
573 std::vector<const double*> buf_in(
MapArg arg)
const;
574 typedef std::map<std::string, std::vector<double>>&
MapRes;
575 std::vector<double*> buf_out(
MapRes res)
const;
576 typedef std::map<std::string, std::vector<double>*>
MPrRes;
577 std::vector<double*> buf_out(
MPrRes res)
const;
598 return operator()(std::vector<DM>{arg0});
601 return operator()(std::vector<SX>{arg0});
604 return operator()(std::vector<MX>{arg0});
611 int operator()(
const double** arg,
double** res,
612 casadi_int* iw,
double* w,
int mem)
const;
617 int operator()(
const double** arg,
double** res,
618 casadi_int* iw,
double* w)
const;
626 casadi_int* iw,
SXElem* w,
int mem=0)
const;
632 casadi_int* iw,
bvec_t* w,
int mem=0)
const;
642 int rev(std::vector<bvec_t*> arg, std::vector<bvec_t*> res)
const;
651 std::vector<MX> mapsum(
const std::vector<MX > &x,
652 const std::string& parallelization=
"serial")
const;
695 Function mapaccum(
const std::string& name, casadi_int N,
const Dict& opts =
Dict())
const;
696 Function mapaccum(
const std::string& name, casadi_int N, casadi_int n_accum,
698 Function mapaccum(
const std::string& name, casadi_int n,
699 const std::vector<casadi_int>& accum_in,
700 const std::vector<casadi_int>& accum_out,
702 Function mapaccum(
const std::string& name, casadi_int n,
703 const std::vector<std::string>& accum_in,
704 const std::vector<std::string>& accum_out,
735 Function map(casadi_int n,
const std::string& parallelization=
"serial")
const;
736 Function map(casadi_int n,
const std::string& parallelization,
737 casadi_int max_num_threads)
const;
746 Function map(
const std::string& name,
const std::string& parallelization, casadi_int n,
747 const std::vector<casadi_int>& reduce_in,
748 const std::vector<casadi_int>& reduce_out,
750 Function map(
const std::string& name,
const std::string& parallelization, casadi_int n,
751 const std::vector<std::string>& reduce_in,
752 const std::vector<std::string>& reduce_out,
755 const std::vector<bool>& reduce_in,
756 const std::vector<bool>& reduce_out=std::vector<bool>(),
763 Function slice(
const std::string& name,
const std::vector<casadi_int>& order_in,
764 const std::vector<casadi_int>& order_out,
const Dict& opts=
Dict())
const;
769 static Function conditional(
const std::string& name,
const std::vector<Function>& f,
775 static Function conditional(
const std::string& name,
783 static Function bspline(
const std::string &name,
784 const std::vector< std::vector<double> >& knots,
const std::vector<double>& coeffs,
785 const std::vector<casadi_int>& degree, casadi_int m=1,
const Dict& opts=
Dict());
809 Function forward(casadi_int nfwd)
const;
834 const std::vector<Sparsity>& jac_sparsity(
bool compact =
false)
const;
839 Sparsity jac_sparsity(casadi_int oind, casadi_int iind,
bool compact =
false)
const;
844 std::string generate(
const std::string& fname,
const Dict& opts=
Dict())
const;
849 std::string generate(
const Dict& opts=
Dict())
const;
854 std::string generate_dependencies(
const std::string& fname,
const Dict& opts=
Dict())
const;
863 void generate_in(
const std::string& fname,
const std::vector<DM>& arg);
864 std::vector<DM> generate_in(
const std::string& fname);
874 void generate_out(
const std::string& fname,
const std::vector<DM>& arg);
875 std::vector<DM> generate_out(
const std::string& fname);
884 void export_code(
const std::string& lang,
885 const std::string &fname,
const Dict& options=
Dict())
const;
891 void serialize(std::ostream &stream,
const Dict& opts=
Dict())
const;
902 std::string serialize(
const Dict& opts=
Dict())
const;
909 void save(
const std::string &fname,
const Dict& opts=
Dict())
const;
911 std::string export_code(
const std::string& lang,
const Dict& options=
Dict())
const;
913 void export_code(
const std::string& lang,
914 std::ostream &stream,
const Dict& options=
Dict())
const;
925 T* ret =
dynamic_cast<T*
>(get());
926 casadi_assert_dev(ret!=
nullptr);
941 Dict stats(
int mem=0)
const;
949 const SX sx_in(casadi_int iind)
const;
950 const SX sx_in(
const std::string& iname)
const {
951 return sx_in(index_in(iname));
953 const std::vector<SX> sx_in()
const;
954 const MX mx_in(casadi_int ind)
const;
955 const MX mx_in(
const std::string & iname)
const {
956 return mx_in(index_in(iname));
958 const std::vector<MX> mx_in()
const;
967 const SX sx_out(casadi_int oind)
const;
969 return sx_out(index_out(oname));
971 const std::vector<SX> sx_out()
const;
972 const MX mx_out(casadi_int ind)
const;
974 return mx_out(index_out(oname));
976 const std::vector<MX> mx_out()
const;
983 std::vector<double> nz_from_in(
const std::vector<DM>& arg)
const;
984 std::vector<double> nz_from_out(
const std::vector<DM>& arg)
const;
985 std::vector<DM> nz_to_in(
const std::vector<double>& arg)
const;
986 std::vector<DM> nz_to_out(
const std::vector<double>& arg)
const;
996 DMDict convert_in(
const std::vector<DM>& arg)
const;
997 std::vector<DM> convert_in(
const DMDict& arg)
const;
998 DMDict convert_out(
const std::vector<DM>& arg)
const;
999 std::vector<DM> convert_out(
const DMDict& arg)
const;
1000 SXDict convert_in(
const std::vector<SX>& arg)
const;
1001 std::vector<SX> convert_in(
const SXDict& arg)
const;
1002 SXDict convert_out(
const std::vector<SX>& arg)
const;
1003 std::vector<SX> convert_out(
const SXDict& arg)
const;
1004 MXDict convert_in(
const std::vector<MX>& arg)
const;
1005 std::vector<MX> convert_in(
const MXDict& arg)
const;
1006 MXDict convert_out(
const std::vector<MX>& arg)
const;
1007 std::vector<MX> convert_out(
const MXDict& arg)
const;
1013 bool has_free()
const;
1018 std::vector<std::string> get_free()
const;
1023 std::vector<SX> free_sx()
const;
1028 std::vector<MX> free_mx()
const;
1033 void generate_lifted(
Function& SWIG_OUTPUT(vdef_fcn),
1034 Function& SWIG_OUTPUT(vinit_fcn))
const;
1039 casadi_int n_nodes()
const;
1044 casadi_int n_instructions()
const;
1049 casadi_int instruction_id(casadi_int k)
const;
1056 std::vector<casadi_int> instruction_input(casadi_int k)
const;
1061 double instruction_constant(casadi_int k)
const;
1068 std::vector<casadi_int> instruction_output(casadi_int k)
const;
1073 MX instruction_MX(casadi_int k)
const;
1081 SX instructions_sx()
const;
1087 bool has_spfwd()
const;
1088 bool has_sprev()
const;
1094 size_t sz_arg()
const;
1099 size_t sz_res()
const;
1104 size_t sz_iw()
const;
1109 size_t sz_w()
const;
1115 void sz_work(
size_t& sz_arg,
size_t& sz_res,
size_t& sz_iw,
size_t& sz_w)
const;
1120 void set_work(
const double**& arg,
double**& res,
1121 casadi_int*& iw,
double*& w,
int mem=0)
const;
1126 void set_temp(
const double** arg,
double** res,
1127 casadi_int* iw,
double* w,
int mem=0)
const;
1132 void setup(
const double** arg,
double** res, casadi_int* iw,
double* w,
int mem=0)
const;
1137 template<
typename M>
1138 void call_gen(
const std::map<std::string, M>& arg, std::map<std::string, M>& res,
1139 bool always_inline,
bool never_inline)
const;
1144 void merge(
const std::vector<MX>& arg,
1145 std::vector<MX>& subs_from, std::vector<MX>& subs_to)
const;
1152 const std::string& name()
const;
1159 bool is_a(
const std::string& type,
bool recursive=
true)
const;
1173 static bool check_name(
const std::string& name);
1181 static std::string fix_name(
const std::string& name);
1186 static Function deserialize(std::istream& stream);
1191 static Function deserialize(
const std::string& s);
1204 void assert_size_in(casadi_int i, casadi_int nrow, casadi_int ncol)
const;
1207 void assert_size_out(casadi_int i, casadi_int nrow, casadi_int ncol)
const;
1210 void assert_sparsity_out(casadi_int i,
const Sparsity& sp,
1211 casadi_int n = 1,
bool allow_all_zero_sparse =
true)
const;
1214 casadi_int checkout()
const;
1217 void release(
int mem)
const;
1221 void* memory(
int ind)
const;
1223 static std::vector<SX> order(
const std::vector<SX>& expr);
1224 static std::vector<MX> order(
const std::vector<MX>& expr);
1235 std::vector<std::string> get_function()
const;
1240 Function get_function(
const std::string &name)
const;
1245 bool has_function(
const std::string& fname)
const;
1252 std::vector<Function> find_functions(casadi_int max_depth = -1)
const;
1260 Function find_function(
const std::string &name, casadi_int max_depth=-1)
const;
1271 void construct(
const std::string& name,
1272 const std::vector<SX>& ex_in,
const std::vector<SX>& ex_out,
1273 const std::vector<std::string>& name_in,
1274 const std::vector<std::string>& name_out,
1276 void construct(
const std::string& name,
1277 const std::vector<MX>& ex_in,
const std::vector<MX>& ex_out,
1278 const std::vector<std::string>& name_in,
1279 const std::vector<std::string>& name_out,
1281 template<
typename M>
1282 void construct(
const std::string& name,
const std::map<std::string, M>& dict,
1283 const std::vector<std::string>& name_in,
1284 const std::vector<std::string>& name_out,
1289 static bool proceed_to(std::istream& file,
const std::string&
str);
1292 Function mapaccum(
const std::string& name,
const std::vector<Function>& chain,
1293 casadi_int n_accum=1,
const Dict& opts =
Dict())
const;
1295 #ifdef WITH_EXTRA_CHECKS
1299 static thread_local casadi_int call_depth_;
1315 std::vector<double> w_;
1316 std::vector<casadi_int> iw_;
1317 std::vector<const double*> arg_;
1318 std::vector<double*> res_;
1321 void *mem_internal_;
1341 void set_arg(casadi_int i,
const double* a, casadi_int size);
1350 void set_res(casadi_int i,
double* a, casadi_int size);
1363 #include "casadi_interrupt.hpp"
1364 #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.
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 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
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)