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;
126 public SWIG_IF_ELSE(PrintableCommon, Printable<Function>) {
317 const std::vector<SX>& ex_in,
318 const std::vector<SX>& ex_out,
321 const std::vector<SX>& ex_in,
322 const std::vector<SX>& ex_out,
323 const std::vector<std::string>& name_in,
324 const std::vector<std::string>& name_out,
326 Function(
const std::string& name,
const std::map<std::string, SX>& dict,
327 const std::vector<std::string>& name_in,
328 const std::vector<std::string>& name_out,
401 const std::vector<MX>& ex_in,
402 const std::vector<MX>& ex_out,
405 const std::vector<MX>& ex_in,
406 const std::vector<MX>& ex_out,
407 const std::vector<std::string>& name_in,
408 const std::vector<std::string>& name_out,
410 Function(
const std::string& name,
const std::map<std::string, MX>& dict,
411 const std::vector<std::string>& name_in,
412 const std::vector<std::string>& name_out,
492 static Function jit(
const std::string& name,
const std::string& body,
493 const std::vector<std::string>& name_in,
494 const std::vector<std::string>& name_out,
496 static Function jit(
const std::string& name,
const std::string& body,
497 const std::vector<std::string>& name_in,
498 const std::vector<std::string>& name_out,
499 const std::vector<Sparsity>& sparsity_in,
500 const std::vector<Sparsity>& sparsity_out,
609 Function expand(
const std::string& name,
714 Function transform(
const std::string& fname,
const Dict& opts =
Dict())
const;
715 Function transform(
const std::vector<std::vector<GenericType> >& passes,
717 Function transform(
const std::string& fname,
718 const std::vector<std::vector<GenericType> >& passes,
774 casadi_int n_in()
const;
805 casadi_int n_out()
const;
863 casadi_int size1_in(casadi_int ind)
const;
865 casadi_int size2_in(casadi_int ind)
const;
867 std::pair<casadi_int, casadi_int> size_in(casadi_int ind)
const;
868 std::pair<casadi_int, casadi_int>
size_in(
const std::string& iname)
const {
869 return size_in(index_in(iname));
911 casadi_int size1_out(casadi_int ind)
const;
913 casadi_int size2_out(casadi_int ind)
const;
915 std::pair<casadi_int, casadi_int> size_out(casadi_int ind)
const;
916 std::pair<casadi_int, casadi_int>
size_out(
const std::string& oname)
const {
917 return size_out(index_out(oname));
961 casadi_int nnz_in()
const;
962 casadi_int nnz_in(casadi_int ind)
const;
963 casadi_int
nnz_in(
const std::string& iname)
const {
return nnz_in(index_in(iname));}
1001 casadi_int nnz_out()
const;
1002 casadi_int nnz_out(casadi_int ind)
const;
1003 casadi_int
nnz_out(
const std::string& oname)
const {
return nnz_out(index_out(oname));}
1016 std::vector<bool> activity(
const std::vector<bool>& arg)
const;
1050 casadi_int numel_in()
const;
1051 casadi_int numel_in(casadi_int ind)
const;
1088 casadi_int numel_out()
const;
1089 casadi_int numel_out(casadi_int ind)
const;
1141 const std::vector<std::string>& name_in()
const;
1177 const std::vector<std::string>& name_out()
const;
1182 const std::string& name_in(casadi_int ind)
const;
1187 const std::string& name_out(casadi_int ind)
const;
1236 casadi_int index_in(
const std::string &name)
const;
1243 casadi_int index_out(
const std::string &name)
const;
1274 bool has_in(
const std::string &name)
const;
1280 bool has_out(
const std::string &name)
const;
1334 double default_in(casadi_int ind)
const;
1367 double max_in(casadi_int ind)
const;
1376 double min_in(casadi_int ind)
const;
1413 std::vector<double> nominal_in(casadi_int ind)
const;
1420 std::vector<double> nominal_out(casadi_int ind)
const;
1469 const Sparsity& sparsity_in(casadi_int ind)
const;
1470 const Sparsity& sparsity_in(
const std::string& iname)
const;
1481 const Sparsity& sparsity_out(casadi_int ind)
const;
1482 const Sparsity& sparsity_out(
const std::string& iname)
const;
1539 bool is_diff_in(casadi_int ind)
const;
1540 bool is_diff_out(casadi_int ind)
const;
1541 std::vector<bool> is_diff_in()
const;
1542 std::vector<bool> is_diff_out()
const;
1546 typedef std::map<std::string, std::vector<std::string> >
AuxOut;
1667 Function factory(
const std::string& name,
1668 const std::vector<std::string>& s_in,
1669 const std::vector<std::string>& s_out,
1781 Function wrap(
const std::string& name)
const;
1833 Function wrap_as_needed(
const std::string& name,
const Dict& opts)
const;
1905 std::vector<bool> which_depends(
const std::string& s_in,
1906 const std::vector<std::string>& s_out,
1907 casadi_int order=1,
bool tr=
false)
const;
1951 void print_dimensions(std::ostream &stream=
casadi::uout())
const;
1962 void print_options(std::ostream &stream=
casadi::uout())
const;
1995 void print_option(
const std::string &name, std::ostream &stream =
casadi::uout())
const;
2026 bool has_option(
const std::string &option_name)
const;
2074 void change_option(
const std::string& option_name,
const GenericType& option_value);
2081 void reset_dump_count();
2117 bool uses_output()
const;
2119 #ifdef WITH_DEPRECATED_FEATURES
2125 Function jacobian_old(casadi_int iind, casadi_int oind)
const;
2132 Function hessian_old(casadi_int iind, casadi_int oind)
const;
2137 const Sparsity sparsity_jac(casadi_int iind, casadi_int oind,
2138 bool compact=
false,
bool symmetric=
false)
const;
2140 bool compact=
false,
bool symmetric=
false)
const {
2141 return sparsity_jac(index_in(iind), oind, compact, symmetric);
2144 bool compact=
false,
bool symmetric=
false)
const {
2145 return sparsity_jac(iind, index_out(oind), compact, symmetric);
2148 bool compact=
false,
bool symmetric=
false)
const {
2149 return sparsity_jac(index_in(iind), index_out(oind), compact, symmetric);
2410 void call(
const std::vector<DM> &arg, std::vector<DM>& SWIG_OUTPUT(res),
2411 bool always_inline=
false,
bool never_inline=
false)
const;
2412 void call(
const std::vector<SX> &arg, std::vector<SX>& SWIG_OUTPUT(res),
2413 bool always_inline=
false,
bool never_inline=
false)
const;
2414 void call(
const std::vector<MX> &arg, std::vector<MX>& SWIG_OUTPUT(res),
2415 bool always_inline=
false,
bool never_inline=
false)
const;
2417 bool always_inline=
false,
bool never_inline=
false)
const;
2419 bool always_inline=
false,
bool never_inline=
false)
const;
2421 bool always_inline=
false,
bool never_inline=
false)
const;
2426 bool operator==(
const Function& f)
const;
2430 std::vector<DM> operator()(
const std::vector<DM>& arg)
const;
2431 std::vector<SX> operator()(
const std::vector<SX>& arg)
const;
2432 std::vector<MX> operator()(
const std::vector<MX>& arg)
const;
2442 void operator()(std::vector<const double*> arg, std::vector<double*> res)
const;
2443 void operator()(std::vector<const bvec_t*> arg, std::vector<bvec_t*> res)
const;
2444 void operator()(std::vector<const SXElem*> arg, std::vector<SXElem*> res)
const;
2445 template<
typename D>
void call_gen(std::vector<const D*> arg, std::vector<D*> res)
const;
2452 typedef const std::vector<std::vector<double>>&
VecArg;
2453 std::vector<const double*> buf_in(
VecArg arg)
const;
2454 typedef std::vector<std::vector<double>>&
VecRes;
2455 std::vector<double*> buf_out(
VecRes res)
const;
2456 typedef std::vector<std::vector<double>*>
VPrRes;
2457 std::vector<double*> buf_out(
VPrRes res)
const;
2459 typedef const std::map<std::string, std::vector<double>>&
MapArg;
2460 std::vector<const double*> buf_in(
MapArg arg)
const;
2461 typedef std::map<std::string, std::vector<double>>&
MapRes;
2462 std::vector<double*> buf_out(
MapRes res)
const;
2463 typedef std::map<std::string, std::vector<double>*>
MPrRes;
2464 std::vector<double*> buf_out(
MPrRes res)
const;
2485 return operator()(std::vector<DM>{arg0});
2488 return operator()(std::vector<SX>{arg0});
2491 return operator()(std::vector<MX>{arg0});
2498 int operator()(
const double** arg,
double** res,
2499 casadi_int* iw,
double* w,
int mem)
const;
2504 int operator()(
const double** arg,
double** res,
2505 casadi_int* iw,
double* w)
const;
2513 casadi_int* iw,
SXElem* w,
int mem=0)
const;
2519 casadi_int* iw,
bvec_t* w,
int mem=0)
const;
2525 casadi_int* iw,
bvec_t* w,
int mem=0)
const;
2535 int rev(std::vector<bvec_t*> arg, std::vector<bvec_t*> res)
const;
2597 std::vector<MX> mapsum(
const std::vector<MX > &x,
2598 const std::string& parallelization=
"serial")
const;
2702 Function mapaccum(
const std::string& name, casadi_int N,
const Dict& opts =
Dict())
const;
2703 Function mapaccum(
const std::string& name, casadi_int N, casadi_int n_accum,
2705 Function mapaccum(
const std::string& name, casadi_int n,
2706 const std::vector<casadi_int>& accum_in,
2707 const std::vector<casadi_int>& accum_out,
2709 Function mapaccum(
const std::string& name, casadi_int n,
2710 const std::vector<std::string>& accum_in,
2711 const std::vector<std::string>& accum_out,
2792 Function map(casadi_int n,
const std::string& parallelization=
"serial")
const;
2793 Function map(casadi_int n,
const std::string& parallelization,
2794 casadi_int max_num_threads)
const;
2854 Function map(
const std::string& name,
const std::string& parallelization, casadi_int n,
2855 const std::vector<casadi_int>& reduce_in,
2856 const std::vector<casadi_int>& reduce_out,
2858 Function map(
const std::string& name,
const std::string& parallelization, casadi_int n,
2859 const std::vector<std::string>& reduce_in,
2860 const std::vector<std::string>& reduce_out,
2863 const std::vector<bool>& reduce_in,
2864 const std::vector<bool>& reduce_out=std::vector<bool>(),
2923 Function slice(
const std::string& name,
const std::vector<casadi_int>& order_in,
2924 const std::vector<casadi_int>& order_out,
const Dict& opts=
Dict())
const;
2989 static Function conditional(
const std::string& name,
const std::vector<Function>& f,
3034 static Function conditional(
const std::string& name,
3110 static Function bspline(
const std::string &name,
3111 const std::vector< std::vector<double> >& knots,
const std::vector<double>& coeffs,
3112 const std::vector<casadi_int>& degree, casadi_int m=1,
const Dict& opts=
Dict());
3220 Function forward(casadi_int nfwd)
const;
3332 const std::vector<Sparsity>& jac_sparsity(
bool compact =
false)
const;
3370 Sparsity jac_sparsity(casadi_int oind, casadi_int iind,
bool compact =
false)
const;
3456 std::string generate(
const std::string& fname,
const Dict& opts=
Dict())
const;
3461 std::string generate(
const Dict& opts=
Dict())
const;
3477 std::string generate_dependencies(
const std::string& fname,
const Dict& opts=
Dict())
const;
3536 void generate_in(
const std::string& fname,
const std::vector<DM>& arg);
3537 std::vector<DM> generate_in(
const std::string& fname);
3586 void generate_out(
const std::string& fname,
const std::vector<DM>& arg);
3587 std::vector<DM> generate_out(
const std::string& fname);
3645 void export_code(
const std::string& lang,
3646 const std::string &fname,
const Dict& options=
Dict())
const;
3652 void serialize(std::ostream &stream,
const Dict& opts=
Dict())
const;
3705 std::string serialize(
const Dict& opts=
Dict())
const;
3781 void save(
const std::string &fname,
const Dict& opts=
Dict())
const;
3783 std::string export_code(
const std::string& lang,
const Dict& options=
Dict())
const;
3785 void export_code(
const std::string& lang,
3786 std::ostream &stream,
const Dict& options=
Dict())
const;
3795 template<
typename T>
3797 T* ret =
dynamic_cast<T*
>(get());
3798 casadi_assert_dev(ret!=
nullptr);
3870 Dict stats(
int mem=0)
const;
3933 const SX sx_in(casadi_int iind)
const;
3935 return sx_in(index_in(iname));
3937 const std::vector<SX> sx_in()
const;
3938 const MX mx_in(casadi_int ind)
const;
3940 return mx_in(index_in(iname));
3942 const std::vector<MX> mx_in()
const;
3944 template<
typename T>
3946 template<
typename T>
3948 return sym_in<T>(index_in(iname));
3950 template<
typename T>
3961 const SX sx_out(casadi_int oind)
const;
3963 return sx_out(index_out(oname));
3965 const std::vector<SX> sx_out()
const;
3966 const MX mx_out(casadi_int ind)
const;
3968 return mx_out(index_out(oname));
3970 const std::vector<MX> mx_out()
const;
4043 std::vector<double> nz_from_in(
const std::vector<DM>& arg)
const;
4044 std::vector<double> nz_from_out(
const std::vector<DM>& arg)
const;
4045 std::vector<DM> nz_to_in(
const std::vector<double>& arg)
const;
4046 std::vector<DM> nz_to_out(
const std::vector<double>& arg)
const;
4118 DMDict convert_in(
const std::vector<DM>& arg)
const;
4119 std::vector<DM> convert_in(
const DMDict& arg)
const;
4120 DMDict convert_out(
const std::vector<DM>& arg)
const;
4121 std::vector<DM> convert_out(
const DMDict& arg)
const;
4122 SXDict convert_in(
const std::vector<SX>& arg)
const;
4123 std::vector<SX> convert_in(
const SXDict& arg)
const;
4124 SXDict convert_out(
const std::vector<SX>& arg)
const;
4125 std::vector<SX> convert_out(
const SXDict& arg)
const;
4126 MXDict convert_in(
const std::vector<MX>& arg)
const;
4127 std::vector<MX> convert_in(
const MXDict& arg)
const;
4128 MXDict convert_out(
const std::vector<MX>& arg)
const;
4129 std::vector<MX> convert_out(
const MXDict& arg)
const;
4195 bool has_free()
const;
4202 std::vector<std::string> get_free()
const;
4209 std::vector<SX> free_sx()
const;
4244 std::vector<MX> free_mx()
const;
4252 void generate_lifted(
Function& SWIG_OUTPUT(vdef_fcn),
4253 Function& SWIG_OUTPUT(vinit_fcn))
const;
4287 casadi_int n_nodes()
const;
4356 casadi_int n_instructions()
const;
4366 casadi_int instruction_id(casadi_int k)
const;
4376 std::vector<casadi_int> instruction_input(casadi_int k)
const;
4385 double instruction_constant(casadi_int k)
const;
4395 std::vector<casadi_int> instruction_output(casadi_int k)
const;
4438 MX instruction_MX(casadi_int k)
const;
4475 SX instructions_sx()
const;
4512 bool has_spfwd()
const;
4513 bool has_sprev()
const;
4548 size_t sz_arg()
const;
4555 size_t sz_res()
const;
4560 size_t sz_iw()
const;
4565 size_t sz_w()
const;
4571 void sz_work(
size_t& sz_arg,
size_t& sz_res,
size_t& sz_iw,
size_t& sz_w)
const;
4576 void set_work(
const double**& arg,
double**& res,
4577 casadi_int*& iw,
double*& w,
int mem=0)
const;
4582 void set_temp(
const double** arg,
double** res,
4583 casadi_int* iw,
double* w,
int mem=0)
const;
4588 void setup(
const double** arg,
double** res, casadi_int* iw,
double* w,
int mem=0)
const;
4593 template<
typename M>
4594 void call_gen(
const std::map<std::string, M>& arg, std::map<std::string, M>& res,
4595 bool always_inline,
bool never_inline)
const;
4600 void merge(
const std::vector<MX>& arg,
4601 std::vector<MX>& subs_from, std::vector<MX>& subs_to)
const;
4631 const std::string& name()
const;
4675 bool is_a(
const std::string& type,
bool recursive=
true)
const;
4717 static bool check_name(
const std::string& name);
4760 static std::string fix_name(
const std::string& name);
4765 static Function deserialize(std::istream& stream);
4816 static Function deserialize(
const std::string& s);
4874 void assert_size_in(casadi_int i, casadi_int nrow, casadi_int ncol)
const;
4877 void assert_size_out(casadi_int i, casadi_int nrow, casadi_int ncol)
const;
4887 void assert_sparsity_out(casadi_int i,
const Sparsity& sp,
4888 casadi_int n = 1,
bool allow_all_zero_sparse =
true)
const;
4928 casadi_int checkout()
const;
4931 void release(
int mem)
const;
4935 void* memory(
int ind)
const;
4937 static std::vector<SX> order(
const std::vector<SX>& expr);
4938 static std::vector<MX> order(
const std::vector<MX>& expr);
5052 std::vector<std::string> get_function()
const;
5059 Function get_function(
const std::string &name)
const;
5068 bool has_function(
const std::string& fname)
const;
5138 std::vector<Function> find_functions(casadi_int max_depth = -1)
const;
5148 Function find_function(
const std::string &name, casadi_int max_depth=-1)
const;
5188 void construct(
const std::string& name,
5189 const std::vector<SX>& ex_in,
const std::vector<SX>& ex_out,
5190 const std::vector<std::string>& name_in,
5191 const std::vector<std::string>& name_out,
5193 void construct(
const std::string& name,
5194 const std::vector<MX>& ex_in,
const std::vector<MX>& ex_out,
5195 const std::vector<std::string>& name_in,
5196 const std::vector<std::string>& name_out,
5198 template<
typename M>
5199 void construct(
const std::string& name,
const std::map<std::string, M>& dict,
5200 const std::vector<std::string>& name_in,
5201 const std::vector<std::string>& name_out,
5206 static bool proceed_to(std::istream& file,
const std::string&
str);
5209 Function mapaccum(
const std::string& name,
const std::vector<Function>& chain,
5210 casadi_int n_accum=1,
const Dict& opts =
Dict())
const;
5212 #ifdef WITH_EXTRA_CHECKS
5216 static thread_local casadi_int call_depth_;
5265 std::vector<double> w_;
5266 std::vector<casadi_int> iw_;
5267 std::vector<const double*> arg_;
5268 std::vector<double*> res_;
5271 void *mem_internal_;
5295 void set_arg(casadi_int i,
const double* a, casadi_int size);
5307 void set_res(casadi_int i,
double* a, casadi_int size);
5329 #include "casadi_interrupt.hpp"
5330 #include "runtime/shared.hpp"
Helper class for Serialization.
Evaluate a Function repeatedly with minimal overhead.
Internal class for Function.
const MX mx_in(const std::string &iname) const
Create fresh symbols with the names and sparsity patterns of the inputs.
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 the shape of an output: rows, columns or both.
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 the number of structural nonzeros of one output, or of all outputs.
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 the shape of an input: rows, columns or both.
casadi_int numel_in(const std::string &iname) const
Get the number of elements (rows times columns) of one input, or of all.
casadi_int nnz_in(const std::string &iname) const
Get the number of structural nonzeros of one input, or of all inputs.
void operator()(VecArg arg, VecRes res) const
Numerical evaluation.
const T sym_in(const std::string &iname) const
Create fresh symbols with the names and sparsity patterns of the inputs.
casadi_int size1_out(const std::string &oname) const
Get the shape of an output: rows, columns or both.
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
Create fresh symbols with the names and sparsity patterns of the inputs.
const MX mx_out(const std::string &oname) const
Create fresh symbols with the names and sparsity patterns of the outputs.
const SX sx_out(const std::string &oname) const
Create fresh symbols with the names and sparsity patterns of the outputs.
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
Create fresh symbols with the names and sparsity patterns of the inputs.
casadi_int size1_in(const std::string &iname) const
Get the shape of an input: rows, columns or both.
casadi_int size2_out(const std::string &oname) const
Get the shape of an output: rows, columns or both.
casadi_int numel_out(const std::string &oname) const
Get the number of elements (rows times columns) of one output, or of all.
static std::string type_name()
Get the type name, always "Function".
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
Create fresh symbols with the names and sparsity patterns of the inputs.
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 the shape of an input: rows, columns or both.
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
CASADI_EXPORT std::string export_graph(const MX &expression, const Dict &opts=Dict())
Export expressions as .html, .dot, or .casadi_viz, defaulting to expression view.
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)