function.hpp
1 /*
2  * This file is part of CasADi.
3  *
4  * CasADi -- A symbolic framework for dynamic optimization.
5  * Copyright (C) 2010-2023 Joel Andersson, Joris Gillis, Moritz Diehl,
6  * KU Leuven. All rights reserved.
7  * Copyright (C) 2011-2014 Greg Horn
8  *
9  * CasADi is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 3 of the License, or (at your option) any later version.
13  *
14  * CasADi is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with CasADi; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  *
23  */
24 
25 #ifndef CASADI_FUNCTION_HPP
26 #define CASADI_FUNCTION_HPP
27 
28 #include "sx_elem.hpp"
29 #include "mx.hpp"
30 #include "printable.hpp"
31 #include <exception>
32 #include <stack>
33 
34 namespace casadi {
35 
36 #ifndef SWIG
38  class FunctionInternal;
39  class SerializingStream;
40  class DeserializingStream;
41 #endif // SWIG
42 
58  class CASADI_EXPORT Function :
59  public SharedObject,
60  public SWIG_IF_ELSE(PrintableCommon, Printable<Function>) {
61  public:
65  static std::string type_name() {return "Function";}
66 
70  Function();
71 
75  Function(const std::string& fname);
76 
78 
81  Function(const std::string& name,
82  const std::vector<SX>& ex_in,
83  const std::vector<SX>& ex_out,
84  const Dict& opts=Dict());
85  Function(const std::string& name,
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,
90  const Dict& opts=Dict());
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,
94  const Dict& opts=Dict());
96 
98 
101  Function(const std::string& name,
102  const std::vector<MX>& ex_in,
103  const std::vector<MX>& ex_out,
104  const Dict& opts=Dict());
105  Function(const std::string& name,
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,
110  const Dict& opts=Dict());
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,
114  const Dict& opts=Dict());
116 
118 
121 #ifndef SWIG
122  Function(const std::string& name, SXIList ex_in,
123  const SXVector& ex_out, const Dict& opts=Dict());
124  Function(const std::string& name, const SXVector& ex_in,
125  SXIList ex_out, const Dict& opts=Dict());
126  Function(const std::string& name, SXIList ex_in,
127  SXIList ex_out, const Dict& opts=Dict());
128  Function(const std::string& name, SXIList ex_in, const SXVector& ex_out,
129  const StringVector& name_in, const StringVector& name_out,
130  const Dict& opts=Dict());
131  Function(const std::string& name, const SXVector& ex_in, SXIList ex_out,
132  const StringVector& name_in, const StringVector& name_out,
133  const Dict& opts=Dict());
134  Function(const std::string& name, SXIList ex_in, SXIList ex_out,
135  const StringVector& name_in, const StringVector& name_out,
136  const Dict& opts=Dict());
137  Function(const std::string& name, MXIList ex_in, const MXVector& ex_out,
138  const Dict& opts=Dict());
139  Function(const std::string& name, const MXVector& ex_in, MXIList ex_out,
140  const Dict& opts=Dict());
141  Function(const std::string& name, MXIList ex_in, MXIList ex_out,
142  const Dict& opts=Dict());
143  Function(const std::string& name, MXIList ex_in, const MXVector& ex_out,
144  const StringVector& name_in, const StringVector& name_out,
145  const Dict& opts=Dict());
146  Function(const std::string& name, const MXVector& ex_in, MXIList ex_out,
147  const StringVector& name_in, const StringVector& name_out,
148  const Dict& opts=Dict());
149  Function(const std::string& name, MXIList ex_in, MXIList ex_out,
150  const StringVector& name_in, const StringVector& name_out,
151  const Dict& opts=Dict());
152 #endif // SWIG
154 
156 
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,
188  const Dict& opts=Dict());
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,
194  const Dict& opts=Dict());
196 
200  ~Function();
201 
206  Function expand() const;
207  Function expand(const std::string& name,
208  const Dict& opts=Dict()) const;
210 
233  Function transform(const Dict& opts = Dict()) const;
234  Function transform(const std::string& fname, const Dict& opts = Dict()) const;
235  Function transform(const std::vector<std::vector<GenericType> >& passes,
236  const Dict& opts = Dict()) const;
237  Function transform(const std::string& fname,
238  const std::vector<std::vector<GenericType> >& passes,
239  const Dict& opts = Dict()) const;
241 
243 #ifndef SWIG
247  static Function create(FunctionInternal* node);
248 
252  static Function create(FunctionInternal* node, const Dict& opts);
253 #endif // SWIG
255 
259  casadi_int n_in() const;
260 
264  casadi_int n_out() const;
265 
267 
270  casadi_int size1_in(casadi_int ind) const;
271  casadi_int size1_in(const std::string& iname) const {return size1_in(index_in(iname));}
272  casadi_int size2_in(casadi_int ind) const;
273  casadi_int size2_in(const std::string& iname) const {return size2_in(index_in(iname));}
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));
277  }
279 
281 
284  casadi_int size1_out(casadi_int ind) const;
285  casadi_int size1_out(const std::string& oname) const {return size1_out(index_out(oname));}
286  casadi_int size2_out(casadi_int ind) const;
287  casadi_int size2_out(const std::string& oname) const {return size2_out(index_out(oname));}
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));
291  }
293 
295 
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));}
304 
306 
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));}
315 
326  std::vector<bool> activity(const std::vector<bool>& arg) const;
327 
329 
334  casadi_int numel_in() const;
335  casadi_int numel_in(casadi_int ind) const;
336  casadi_int numel_in(const std::string& iname) const {return numel_in(index_in(iname));}
338 
340 
345  casadi_int numel_out() const;
346  casadi_int numel_out(casadi_int ind) const;
347  casadi_int numel_out(const std::string& oname) const {return numel_out(index_out(oname));}
349 
353  const std::vector<std::string>& name_in() const;
354 
358  const std::vector<std::string>& name_out() const;
359 
363  const std::string& name_in(casadi_int ind) const;
364 
368  const std::string& name_out(casadi_int ind) const;
369 
376  casadi_int index_in(const std::string &name) const;
377 
384  casadi_int index_out(const std::string &name) const;
385 
389  bool has_in(const std::string &name) const;
393  bool has_out(const std::string &name) const;
394 
398  double default_in(casadi_int ind) const;
399 
403  double max_in(casadi_int ind) const;
404 
408  double min_in(casadi_int ind) const;
409 
413  std::vector<double> nominal_in(casadi_int ind) const;
414 
418  std::vector<double> nominal_out(casadi_int ind) const;
419 
424  const Sparsity& sparsity_in(casadi_int ind) const;
425  const Sparsity& sparsity_in(const std::string& iname) const;
427 
432  const Sparsity& sparsity_out(casadi_int ind) const;
433  const Sparsity& sparsity_out(const std::string& iname) const;
435 
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;
445 
446  // A linear combination of inputs
447  typedef std::map<std::string, std::vector<std::string> > AuxOut;
448 
449  // Factory
450  Function factory(const std::string& name,
451  const std::vector<std::string>& s_in,
452  const std::vector<std::string>& s_out,
453  const AuxOut& aux=AuxOut(),
454  const Dict& opts=Dict()) const;
455 
459  Function oracle() const;
460 
465  Function wrap() const;
466  Function wrap(const std::string& name) const;
468 
473  Function wrap_as_needed(const Dict& opts) const;
474  Function wrap_as_needed(const std::string& name, const Dict& opts) const;
476 
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;
486 
490  void print_dimensions(std::ostream &stream=casadi::uout()) const;
491 
495  void print_options(std::ostream &stream=casadi::uout()) const;
496 
500  void print_option(const std::string &name, std::ostream &stream = casadi::uout()) const;
501 
505  bool has_option(const std::string &option_name) const;
506 
513  void change_option(const std::string& option_name, const GenericType& option_value);
514 
518  void reset_dump_count();
519 
523  bool uses_output() const;
524 
525 #ifdef WITH_DEPRECATED_FEATURES
529  Function jacobian_old(casadi_int iind, casadi_int oind) const;
530 
534  Function hessian_old(casadi_int iind, casadi_int oind) const;
535 
538  const Sparsity sparsity_jac(casadi_int iind, casadi_int oind,
539  bool compact=false, bool symmetric=false) const;
540  const Sparsity sparsity_jac(const std::string &iind, casadi_int oind=0,
541  bool compact=false, bool symmetric=false) const {
542  return sparsity_jac(index_in(iind), oind, compact, symmetric);
543  }
544  const Sparsity sparsity_jac(casadi_int iind, const std::string &oind,
545  bool compact=false, bool symmetric=false) const {
546  return sparsity_jac(iind, index_out(oind), compact, symmetric);
547  }
548  const Sparsity sparsity_jac(const std::string &iind, const std::string &oind,
549  bool compact=false, bool symmetric=false) const {
550  return sparsity_jac(index_in(iind), index_out(oind), compact, symmetric);
551  }
553 #endif // WITH_DEPRECATED_FEATURES
554 
571  Function jacobian() const;
572 
574 
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;
583  void call(const DMDict& arg, DMDict& SWIG_OUTPUT(res),
584  bool always_inline=false, bool never_inline=false) const;
585  void call(const SXDict& arg, SXDict& SWIG_OUTPUT(res),
586  bool always_inline=false, bool never_inline=false) const;
587  void call(const MXDict& arg, MXDict& SWIG_OUTPUT(res),
588  bool always_inline=false, bool never_inline=false) const;
590 
591 #ifndef SWIG
593  bool operator==(const Function& f) const;
594 
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;
600  const DMDict operator()(const DMDict& arg) const;
601  const SXDict operator()(const SXDict& arg) const;
602  const MXDict operator()(const MXDict& arg) const;
604 
606 
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;
614 
616 
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;
625 
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;
633 
635 
638  void operator()(VecArg arg, VecRes res) const { (*this)(buf_in(arg), buf_out(res)); }
639  void operator()(VecArg arg, MapRes res) const { (*this)(buf_in(arg), buf_out(res)); }
640  void operator()(VecArg arg, VPrRes res) const { (*this)(buf_in(arg), buf_out(res)); }
641  void operator()(VecArg arg, MPrRes res) const { (*this)(buf_in(arg), buf_out(res)); }
642 
643  void operator()(MapArg arg, VecRes res) const { (*this)(buf_in(arg), buf_out(res)); }
644  void operator()(MapArg arg, MapRes res) const { (*this)(buf_in(arg), buf_out(res)); }
645  void operator()(MapArg arg, VPrRes res) const { (*this)(buf_in(arg), buf_out(res)); }
646  void operator()(MapArg arg, MPrRes res) const { (*this)(buf_in(arg), buf_out(res)); }
648 
651  std::vector<DM> operator()(const DM& arg0) const {
652  return operator()(std::vector<DM>{arg0});
653  }
654  std::vector<SX> operator()(const SX& arg0) const {
655  return operator()(std::vector<SX>{arg0});
656  }
657  std::vector<MX> operator()(const MX& arg0) const {
658  return operator()(std::vector<MX>{arg0});
659  }
661 
665  int operator()(const double** arg, double** res,
666  casadi_int* iw, double* w, int mem) const;
667 
671  int operator()(const double** arg, double** res,
672  casadi_int* iw, double* w) const;
673 
679  int operator()(const SXElem** arg, SXElem** res,
680  casadi_int* iw, SXElem* w, int mem=0) const;
681 
685  int operator()(const bvec_t** arg, bvec_t** res,
686  casadi_int* iw, bvec_t* w, int mem=0) const;
687 
691  int eval_activity(const bvec_t** arg, bvec_t** res,
692  casadi_int* iw, bvec_t* w, int mem=0) const;
693 
697  int rev(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w, int mem=0) const;
698 
702  int rev(std::vector<bvec_t*> arg, std::vector<bvec_t*> res) const;
703 
704 #endif // SWIG
705 
711  std::vector<MX> mapsum(const std::vector<MX > &x,
712  const std::string& parallelization="serial") const;
713 
715 
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,
757  const Dict& opts = Dict()) const;
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,
761  const Dict& opts=Dict()) const;
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,
765  const Dict& opts=Dict()) const;
766  Function mapaccum(casadi_int N, const Dict& opts = Dict()) const;
767  Function fold(casadi_int N, const Dict& opts = Dict()) const;
769 
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;
798 
800 
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,
809  const Dict& opts=Dict()) const;
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,
813  const Dict& opts=Dict()) const;
814  Function map(casadi_int n,
815  const std::vector<bool>& reduce_in,
816  const std::vector<bool>& reduce_out=std::vector<bool>(),
817  const Dict& opts=Dict()) const;
819 
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;
825 
829  static Function conditional(const std::string& name, const std::vector<Function>& f,
830  const Function& f_def, const Dict& opts=Dict());
831 
835  static Function conditional(const std::string& name,
836  const Function& f, const Dict& opts=Dict());
837 
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());
846 
850  static Function if_else(const std::string& name, const Function& f_true,
851  const Function& f_false, const Dict& opts=Dict());
852 
869  Function forward(casadi_int nfwd) const;
870 
889  Function reverse(casadi_int nadj) const;
890 
894  const std::vector<Sparsity>& jac_sparsity(bool compact = false) const;
895 
899  Sparsity jac_sparsity(casadi_int oind, casadi_int iind, bool compact = false) const;
900 
904  std::string generate(const std::string& fname, const Dict& opts=Dict()) const;
905 
909  std::string generate(const Dict& opts=Dict()) const;
910 
914  std::string generate_dependencies(const std::string& fname, const Dict& opts=Dict()) const;
915 
923  void generate_in(const std::string& fname, const std::vector<DM>& arg);
924  std::vector<DM> generate_in(const std::string& fname);
926 
934  void generate_out(const std::string& fname, const std::vector<DM>& arg);
935  std::vector<DM> generate_out(const std::string& fname);
937 
944  void export_code(const std::string& lang,
945  const std::string &fname, const Dict& options=Dict()) const;
946 
947 #ifndef SWIG
951  void serialize(std::ostream &stream, const Dict& opts=Dict()) const;
952 
956  void serialize(SerializingStream &s) const;
957 #endif
958 
962  std::string serialize(const Dict& opts=Dict()) const;
963 
978  void export_graph(const std::string& fname, const Dict& opts=Dict()) const;
979 
985  std::string export_graph(const Dict& opts=Dict()) const;
986 
992  void save(const std::string &fname, const Dict& opts=Dict()) const;
993 
994  std::string export_code(const std::string& lang, const Dict& options=Dict()) const;
995 #ifndef SWIG
996  void export_code(const std::string& lang,
997  std::ostream &stream, const Dict& options=Dict()) const;
998 #endif // SWIG
1000 #ifndef SWIG
1003  FunctionInternal* get() const;
1004 
1006  template<typename T>
1007  T* get() const {
1008  T* ret = dynamic_cast<T*>(get());
1009  casadi_assert_dev(ret!=nullptr);
1010  return ret;
1011  }
1012 
1016  FunctionInternal* operator->() const;
1017 
1019  static bool test_cast(const SharedObjectInternal* ptr);
1021 #endif // SWIG
1022 
1024  Dict stats(int mem=0) const;
1025 
1027 
1032  const SX sx_in(casadi_int iind) const;
1033  const SX sx_in(const std::string& iname) const {
1034  return sx_in(index_in(iname));
1035  }
1036  const std::vector<SX> sx_in() const;
1037  const MX mx_in(casadi_int ind) const;
1038  const MX mx_in(const std::string & iname) const {
1039  return mx_in(index_in(iname));
1040  }
1041  const std::vector<MX> mx_in() const;
1042 #ifndef SWIG
1043  template<typename T>
1044  const T sym_in(casadi_int iind) const;
1045  template<typename T>
1046  const T sym_in(const std::string& iname) const {
1047  return sym_in<T>(index_in(iname));
1048  }
1049  template<typename T>
1050  const std::vector<T> sym_in() const;
1051 #endif // SWIG
1053 
1055 
1060  const SX sx_out(casadi_int oind) const;
1061  const SX sx_out(const std::string& oname) const {
1062  return sx_out(index_out(oname));
1063  }
1064  const std::vector<SX> sx_out() const;
1065  const MX mx_out(casadi_int ind) const;
1066  const MX mx_out(const std::string& oname) const {
1067  return mx_out(index_out(oname));
1068  }
1069  const std::vector<MX> mx_out() const;
1071 
1076  std::vector<double> nz_from_in(const std::vector<DM>& arg) const;
1077  std::vector<double> nz_from_out(const std::vector<DM>& arg) const;
1078  std::vector<DM> nz_to_in(const std::vector<double>& arg) const;
1079  std::vector<DM> nz_to_out(const std::vector<double>& arg) const;
1081 
1089  DMDict convert_in(const std::vector<DM>& arg) const;
1090  std::vector<DM> convert_in(const DMDict& arg) const;
1091  DMDict convert_out(const std::vector<DM>& arg) const;
1092  std::vector<DM> convert_out(const DMDict& arg) const;
1093  SXDict convert_in(const std::vector<SX>& arg) const;
1094  std::vector<SX> convert_in(const SXDict& arg) const;
1095  SXDict convert_out(const std::vector<SX>& arg) const;
1096  std::vector<SX> convert_out(const SXDict& arg) const;
1097  MXDict convert_in(const std::vector<MX>& arg) const;
1098  std::vector<MX> convert_in(const MXDict& arg) const;
1099  MXDict convert_out(const std::vector<MX>& arg) const;
1100  std::vector<MX> convert_out(const MXDict& arg) const;
1102 
1106  bool has_free() const;
1107 
1111  std::vector<std::string> get_free() const;
1112 
1116  std::vector<SX> free_sx() const;
1117 
1121  std::vector<MX> free_mx() const;
1122 
1126  void generate_lifted(Function& SWIG_OUTPUT(vdef_fcn),
1127  Function& SWIG_OUTPUT(vinit_fcn)) const;
1128 
1132  casadi_int n_nodes() const;
1133 
1137  casadi_int n_instructions() const;
1138 
1142  casadi_int instruction_id(casadi_int k) const;
1143 
1149  std::vector<casadi_int> instruction_input(casadi_int k) const;
1150 
1154  double instruction_constant(casadi_int k) const;
1155 
1161  std::vector<casadi_int> instruction_output(casadi_int k) const;
1162 
1166  MX instruction_MX(casadi_int k) const;
1167 
1174  SX instructions_sx() const;
1175 
1177 
1180  bool has_spfwd() const;
1181  bool has_sprev() const;
1183 
1187  size_t sz_arg() const;
1188 
1192  size_t sz_res() const;
1193 
1197  size_t sz_iw() const;
1198 
1202  size_t sz_w() const;
1203 
1204 #ifndef SWIG
1208  void sz_work(size_t& sz_arg, size_t& sz_res, size_t& sz_iw, size_t& sz_w) const;
1209 
1213  void set_work(const double**& arg, double**& res,
1214  casadi_int*& iw, double*& w, int mem=0) const;
1215 
1219  void set_temp(const double** arg, double** res,
1220  casadi_int* iw, double* w, int mem=0) const;
1221 
1225  void setup(const double** arg, double** res, casadi_int* iw, double* w, int mem=0) const;
1226 
1230  template<typename M>
1231  void call_gen(const std::map<std::string, M>& arg, std::map<std::string, M>& res,
1232  bool always_inline, bool never_inline) const;
1233 
1237  void merge(const std::vector<MX>& arg,
1238  std::vector<MX>& subs_from, std::vector<MX>& subs_to) const;
1239 #endif // SWIG
1241 
1245  const std::string& name() const;
1246 
1252  bool is_a(const std::string& type, bool recursive=true) const;
1253 
1266  static bool check_name(const std::string& name);
1267 
1274  static std::string fix_name(const std::string& name);
1275 
1279  static Function deserialize(std::istream& stream);
1280 
1284  static Function deserialize(const std::string& s);
1285 
1289  static Function load(const std::string& filename);
1290 
1294  static Function deserialize(DeserializingStream& s);
1295 
1297  void assert_size_in(casadi_int i, casadi_int nrow, casadi_int ncol) const;
1298 
1300  void assert_size_out(casadi_int i, casadi_int nrow, casadi_int ncol) const;
1301 
1303  void assert_sparsity_out(casadi_int i, const Sparsity& sp,
1304  casadi_int n = 1, bool allow_all_zero_sparse = true) const;
1305 
1307  casadi_int checkout() const;
1308 
1310  void release(int mem) const;
1311 
1312 #ifndef SWIG
1314  void* memory(int ind) const;
1315 
1316  static std::vector<SX> order(const std::vector<SX>& expr);
1317  static std::vector<MX> order(const std::vector<MX>& expr);
1318 #endif // SWIG
1319 
1323  Dict cache() const;
1324 
1328  std::vector<std::string> get_function() const;
1329 
1333  Function get_function(const std::string &name) const;
1334 
1338  bool has_function(const std::string& fname) const;
1339 
1346  std::vector<Function> find_functions(casadi_int max_depth = -1) const;
1347 
1354  Function find_function(const std::string &name, casadi_int max_depth=-1) const;
1355 
1357  Dict info() const;
1358 
1359 #ifndef SWIG
1360  protected:
1362 
1365  void construct(const std::string& name,
1366  const std::vector<SX>& ex_in, const std::vector<SX>& ex_out,
1367  const std::vector<std::string>& name_in,
1368  const std::vector<std::string>& name_out,
1369  const Dict& opts);
1370  void construct(const std::string& name,
1371  const std::vector<MX>& ex_in, const std::vector<MX>& ex_out,
1372  const std::vector<std::string>& name_in,
1373  const std::vector<std::string>& name_out,
1374  const Dict& opts);
1375  template<typename M>
1376  void construct(const std::string& name, const std::map<std::string, M>& dict,
1377  const std::vector<std::string>& name_in,
1378  const std::vector<std::string>& name_out,
1379  const Dict& opts);
1381 
1383  static bool proceed_to(std::istream& file, const std::string& str);
1384 
1386  Function mapaccum(const std::string& name, const std::vector<Function>& chain,
1387  casadi_int n_accum=1, const Dict& opts = Dict()) const;
1388 
1389 #ifdef WITH_EXTRA_CHECKS
1390  public:
1391  // How many times have we passed through
1392  // operator()(const double** arg, double** res, casadi_int* iw, double* w, int mem)?
1393  static thread_local casadi_int call_depth_;
1394 #endif
1395 
1396 
1397 #endif // SWIG
1398 
1399 
1400 
1401  };
1402 
1403 
1407 class CASADI_EXPORT FunctionBuffer {
1408  Function f_;
1409  std::vector<double> w_;
1410  std::vector<casadi_int> iw_;
1411  std::vector<const double*> arg_;
1412  std::vector<double*> res_;
1413  FunctionInternal* f_node_;
1414  casadi_int mem_;
1415  void *mem_internal_;
1416  int ret_;
1417 public:
1421  FunctionBuffer(const Function& f);
1422 #ifndef SWIG
1423  ~FunctionBuffer();
1424  FunctionBuffer(const FunctionBuffer& f);
1425  FunctionBuffer& operator=(const FunctionBuffer& f);
1426 #endif // SWIG
1427 
1435  void set_arg(casadi_int i, const double* a, casadi_int size);
1436 
1444  void set_res(casadi_int i, double* a, casadi_int size);
1446  int ret();
1447  void _eval();
1448  void* _self() { return this; }
1449  Dict stats() const;
1450 };
1451 
1452 void CASADI_EXPORT _function_buffer_eval(void* raw);
1453 
1454 template<>
1455 const SX CASADI_EXPORT Function::sym_in(casadi_int iind) const;
1456 template<>
1457 const MX CASADI_EXPORT Function::sym_in(casadi_int iind) const;
1458 template<>
1459 const std::vector<SX> CASADI_EXPORT Function::sym_in() const;
1460 template<>
1461 const std::vector<MX> CASADI_EXPORT Function::sym_in() const;
1462 
1463 } // namespace casadi
1464 
1465 #include "casadi_interrupt.hpp"
1466 #include "runtime/shared.hpp"
1467 
1468 #endif // CASADI_FUNCTION_HPP
Helper class for Serialization.
Class to achieve minimal overhead function evaluations.
Definition: function.hpp:1407
Internal class for Function.
Function object.
Definition: function.hpp:60
const MX mx_in(const std::string &iname) const
Get symbolic primitives equivalent to the input expressions.
Definition: function.hpp:1038
void operator()(VecArg arg, MPrRes res) const
Numerical evaluation.
Definition: function.hpp:641
const std::map< std::string, std::vector< double > > & MapArg
Supported arguments for numerical evaluation and converters.
Definition: function.hpp:626
void operator()(MapArg arg, MapRes res) const
Numerical evaluation.
Definition: function.hpp:644
std::pair< casadi_int, casadi_int > size_out(const std::string &oname) const
Get output dimension.
Definition: function.hpp:289
const std::vector< std::vector< double > > & VecArg
Supported arguments for numerical evaluation and converters.
Definition: function.hpp:619
std::vector< SX > operator()(const SX &arg0) const
Definition: function.hpp:654
std::vector< MX > operator()(const MX &arg0) const
Definition: function.hpp:657
const Sparsity sparsity_jac(const std::string &iind, casadi_int oind=0, bool compact=false, bool symmetric=false) const
Definition: function.hpp:540
casadi_int nnz_out(const std::string &oname) const
Get number of output nonzeros.
Definition: function.hpp:313
std::vector< std::vector< double > * > VPrRes
Supported arguments for numerical evaluation and converters.
Definition: function.hpp:623
void operator()(MapArg arg, MPrRes res) const
Numerical evaluation.
Definition: function.hpp:646
casadi_int size2_in(const std::string &iname) const
Get input dimension.
Definition: function.hpp:273
casadi_int numel_in(const std::string &iname) const
Get number of input elements.
Definition: function.hpp:336
casadi_int nnz_in(const std::string &iname) const
Get number of input nonzeros.
Definition: function.hpp:302
void operator()(VecArg arg, VecRes res) const
Numerical evaluation.
Definition: function.hpp:638
const T sym_in(const std::string &iname) const
Get symbolic primitives equivalent to the input expressions.
Definition: function.hpp:1046
casadi_int size1_out(const std::string &oname) const
Get output dimension.
Definition: function.hpp:285
const Sparsity sparsity_jac(const std::string &iind, const std::string &oind, bool compact=false, bool symmetric=false) const
Definition: function.hpp:548
void operator()(VecArg arg, MapRes res) const
Numerical evaluation.
Definition: function.hpp:639
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.
Definition: function.hpp:1066
const SX sx_out(const std::string &oname) const
Get symbolic primitives equivalent to the output expressions.
Definition: function.hpp:1061
void operator()(VecArg arg, VPrRes res) const
Numerical evaluation.
Definition: function.hpp:640
std::map< std::string, std::vector< double > > & MapRes
Supported arguments for numerical evaluation and converters.
Definition: function.hpp:628
std::vector< DM > operator()(const DM &arg0) const
Definition: function.hpp:651
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.
Definition: function.hpp:271
casadi_int size2_out(const std::string &oname) const
Get output dimension.
Definition: function.hpp:287
casadi_int numel_out(const std::string &oname) const
Get number of output elements.
Definition: function.hpp:347
static std::string type_name()
Get type name.
Definition: function.hpp:65
void operator()(MapArg arg, VPrRes res) const
Numerical evaluation.
Definition: function.hpp:645
std::map< std::string, std::vector< double > * > MPrRes
Supported arguments for numerical evaluation and converters.
Definition: function.hpp:630
const Sparsity sparsity_jac(casadi_int iind, const std::string &oind, bool compact=false, bool symmetric=false) const
Definition: function.hpp:544
const SX sx_in(const std::string &iname) const
Get symbolic primitives equivalent to the input expressions.
Definition: function.hpp:1033
T * get() const
Get a pointer and typecast.
Definition: function.hpp:1007
std::map< std::string, std::vector< std::string > > AuxOut
Definition: function.hpp:447
std::vector< std::vector< double > > & VecRes
Supported arguments for numerical evaluation and converters.
Definition: function.hpp:621
void operator()(MapArg arg, VecRes res) const
Numerical evaluation.
Definition: function.hpp:643
std::pair< casadi_int, casadi_int > size_in(const std::string &iname) const
Get input dimension.
Definition: function.hpp:275
Generic data type, can hold different types such as bool, casadi_int, std::string etc.
MX - Matrix expression.
Definition: mx.hpp:92
The basic scalar symbolic class of CasADi.
Definition: sx_elem.hpp:75
Helper class for Serialization.
GenericShared implements a reference counting framework similar for efficient and.
General sparsity class.
Definition: sparsity.hpp:106
The casadi namespace.
Definition: archiver.cpp:28
std::map< std::string, MX > MXDict
Definition: mx.hpp:1110
unsigned long long bvec_t
double if_else(double x, double y, double z)
Definition: calculus.hpp:296
std::vector< SX > SXVector
Definition: sx_fwd.hpp:37
std::vector< MX > MXVector
Definition: mx.hpp:1107
std::map< std::string, SX > SXDict
Definition: sx_fwd.hpp:40
Matrix< SXElem > SX
Definition: sx_fwd.hpp:32
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.
Definition: visualizer.cpp:673
std::initializer_list< SX > SXIList
Definition: sx_fwd.hpp:38
std::initializer_list< MX > MXIList
Definition: mx.hpp:1108
std::vector< T > reverse(const std::vector< T > &v)
Reverse a list.
void CASADI_EXPORT _function_buffer_eval(void *raw)
Definition: function.cpp:2227
std::ostream & uout()
std::map< std::string, DM > DMDict
Definition: dm_fwd.hpp:36
std::string filename(const std::string &path)
Definition: ghc.cpp:55