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 
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 
201 
206  Function expand() const;
207  Function expand(const std::string& name,
208  const Dict& opts=Dict()) const;
210 
212 #ifndef SWIG
216  static Function create(FunctionInternal* node);
217 
221  static Function create(FunctionInternal* node, const Dict& opts);
222 #endif // SWIG
224 
228  casadi_int n_in() const;
229 
233  casadi_int n_out() const;
234 
236 
239  casadi_int size1_in(casadi_int ind) const;
240  casadi_int size1_in(const std::string& iname) const {return size1_in(index_in(iname));}
241  casadi_int size2_in(casadi_int ind) const;
242  casadi_int size2_in(const std::string& iname) const {return size2_in(index_in(iname));}
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));
246  }
248 
250 
253  casadi_int size1_out(casadi_int ind) const;
254  casadi_int size1_out(const std::string& oname) const {return size1_out(index_out(oname));}
255  casadi_int size2_out(casadi_int ind) const;
256  casadi_int size2_out(const std::string& oname) const {return size2_out(index_out(oname));}
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));
260  }
262 
264 
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));}
273 
275 
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));}
284 
286 
291  casadi_int numel_in() const;
292  casadi_int numel_in(casadi_int ind) const;
293  casadi_int numel_in(const std::string& iname) const {return numel_in(index_in(iname));}
295 
297 
302  casadi_int numel_out() const;
303  casadi_int numel_out(casadi_int ind) const;
304  casadi_int numel_out(const std::string& oname) const {return numel_out(index_out(oname));}
306 
310  const std::vector<std::string>& name_in() const;
311 
315  const std::vector<std::string>& name_out() const;
316 
320  const std::string& name_in(casadi_int ind) const;
321 
325  const std::string& name_out(casadi_int ind) const;
326 
333  casadi_int index_in(const std::string &name) const;
334 
341  casadi_int index_out(const std::string &name) const;
342 
346  bool has_in(const std::string &name) const;
350  bool has_out(const std::string &name) const;
351 
355  double default_in(casadi_int ind) const;
356 
360  double max_in(casadi_int ind) const;
361 
365  double min_in(casadi_int ind) const;
366 
370  std::vector<double> nominal_in(casadi_int ind) const;
371 
375  std::vector<double> nominal_out(casadi_int ind) const;
376 
381  const Sparsity& sparsity_in(casadi_int ind) const;
382  const Sparsity& sparsity_in(const std::string& iname) const;
384 
389  const Sparsity& sparsity_out(casadi_int ind) const;
390  const Sparsity& sparsity_out(const std::string& iname) const;
392 
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;
402 
403  // A linear combination of inputs
404  typedef std::map<std::string, std::vector<std::string> > AuxOut;
405 
406  // Factory
407  Function factory(const std::string& name,
408  const std::vector<std::string>& s_in,
409  const std::vector<std::string>& s_out,
410  const AuxOut& aux=AuxOut(),
411  const Dict& opts=Dict()) const;
412 
416  Function oracle() const;
417 
421  Function wrap() const;
422 
426  Function wrap_as_needed(const Dict& opts) const;
427 
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;
437 
441  void print_dimensions(std::ostream &stream=casadi::uout()) const;
442 
446  void print_options(std::ostream &stream=casadi::uout()) const;
447 
451  void print_option(const std::string &name, std::ostream &stream = casadi::uout()) const;
452 
456  bool has_option(const std::string &option_name) const;
457 
464  void change_option(const std::string& option_name, const GenericType& option_value);
465 
470 
474  bool uses_output() const;
475 
476 #ifdef WITH_DEPRECATED_FEATURES
480  Function jacobian_old(casadi_int iind, casadi_int oind) const;
481 
485  Function hessian_old(casadi_int iind, casadi_int oind) const;
486 
489  const Sparsity sparsity_jac(casadi_int iind, casadi_int oind,
490  bool compact=false, bool symmetric=false) const;
491  const Sparsity sparsity_jac(const std::string &iind, casadi_int oind=0,
492  bool compact=false, bool symmetric=false) const {
493  return sparsity_jac(index_in(iind), oind, compact, symmetric);
494  }
495  const Sparsity sparsity_jac(casadi_int iind, const std::string &oind,
496  bool compact=false, bool symmetric=false) const {
497  return sparsity_jac(iind, index_out(oind), compact, symmetric);
498  }
499  const Sparsity sparsity_jac(const std::string &iind, const std::string &oind,
500  bool compact=false, bool symmetric=false) const {
501  return sparsity_jac(index_in(iind), index_out(oind), compact, symmetric);
502  }
504 #endif // WITH_DEPRECATED_FEATURES
505 
523 
525 
528  void call(const std::vector<DM> &arg, std::vector<DM>& SWIG_OUTPUT(res),
529  bool always_inline=false, bool never_inline=false) const;
530  void call(const std::vector<SX> &arg, std::vector<SX>& SWIG_OUTPUT(res),
531  bool always_inline=false, bool never_inline=false) const;
532  void call(const std::vector<MX> &arg, std::vector<MX>& SWIG_OUTPUT(res),
533  bool always_inline=false, bool never_inline=false) const;
534  void call(const DMDict& arg, DMDict& SWIG_OUTPUT(res),
535  bool always_inline=false, bool never_inline=false) const;
536  void call(const SXDict& arg, SXDict& SWIG_OUTPUT(res),
537  bool always_inline=false, bool never_inline=false) const;
538  void call(const MXDict& arg, MXDict& SWIG_OUTPUT(res),
539  bool always_inline=false, bool never_inline=false) const;
541 
542 #ifndef SWIG
544  bool operator==(const Function& f) const;
545 
548  std::vector<DM> operator()(const std::vector<DM>& arg) const;
549  std::vector<SX> operator()(const std::vector<SX>& arg) const;
550  std::vector<MX> operator()(const std::vector<MX>& arg) const;
551  const DMDict operator()(const DMDict& arg) const;
552  const SXDict operator()(const SXDict& arg) const;
553  const MXDict operator()(const MXDict& arg) const;
555 
557 
560  void operator()(std::vector<const double*> arg, std::vector<double*> res) const;
561  void operator()(std::vector<const bvec_t*> arg, std::vector<bvec_t*> res) const;
562  void operator()(std::vector<const SXElem*> arg, std::vector<SXElem*> res) const;
563  template<typename D> void call_gen(std::vector<const D*> arg, std::vector<D*> res) const;
565 
567 
570  typedef const std::vector<std::vector<double>>& VecArg;
571  std::vector<const double*> buf_in(VecArg arg) const;
572  typedef std::vector<std::vector<double>>& VecRes;
573  std::vector<double*> buf_out(VecRes res) const;
574  typedef std::vector<std::vector<double>*> VPrRes;
575  std::vector<double*> buf_out(VPrRes res) const;
576 
577  typedef const std::map<std::string, std::vector<double>>& MapArg;
578  std::vector<const double*> buf_in(MapArg arg) const;
579  typedef std::map<std::string, std::vector<double>>& MapRes;
580  std::vector<double*> buf_out(MapRes res) const;
581  typedef std::map<std::string, std::vector<double>*> MPrRes;
582  std::vector<double*> buf_out(MPrRes res) const;
584 
586 
589  void operator()(VecArg arg, VecRes res) const { (*this)(buf_in(arg), buf_out(res)); }
590  void operator()(VecArg arg, MapRes res) const { (*this)(buf_in(arg), buf_out(res)); }
591  void operator()(VecArg arg, VPrRes res) const { (*this)(buf_in(arg), buf_out(res)); }
592  void operator()(VecArg arg, MPrRes res) const { (*this)(buf_in(arg), buf_out(res)); }
593 
594  void operator()(MapArg arg, VecRes res) const { (*this)(buf_in(arg), buf_out(res)); }
595  void operator()(MapArg arg, MapRes res) const { (*this)(buf_in(arg), buf_out(res)); }
596  void operator()(MapArg arg, VPrRes res) const { (*this)(buf_in(arg), buf_out(res)); }
597  void operator()(MapArg arg, MPrRes res) const { (*this)(buf_in(arg), buf_out(res)); }
599 
602  std::vector<DM> operator()(const DM& arg0) const {
603  return operator()(std::vector<DM>{arg0});
604  }
605  std::vector<SX> operator()(const SX& arg0) const {
606  return operator()(std::vector<SX>{arg0});
607  }
608  std::vector<MX> operator()(const MX& arg0) const {
609  return operator()(std::vector<MX>{arg0});
610  }
612 
616  int operator()(const double** arg, double** res,
617  casadi_int* iw, double* w, int mem) const;
618 
622  int operator()(const double** arg, double** res,
623  casadi_int* iw, double* w) const;
624 
630  int operator()(const SXElem** arg, SXElem** res,
631  casadi_int* iw, SXElem* w, int mem=0) const;
632 
636  int operator()(const bvec_t** arg, bvec_t** res,
637  casadi_int* iw, bvec_t* w, int mem=0) const;
638 
642  int rev(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w, int mem=0) const;
643 
647  int rev(std::vector<bvec_t*> arg, std::vector<bvec_t*> res) const;
648 
649 #endif // SWIG
650 
656  std::vector<MX> mapsum(const std::vector<MX > &x,
657  const std::string& parallelization="serial") const;
658 
660 
700  Function mapaccum(const std::string& name, casadi_int N, const Dict& opts = Dict()) const;
701  Function mapaccum(const std::string& name, casadi_int N, casadi_int n_accum,
702  const Dict& opts = Dict()) const;
703  Function mapaccum(const std::string& name, casadi_int n,
704  const std::vector<casadi_int>& accum_in,
705  const std::vector<casadi_int>& accum_out,
706  const Dict& opts=Dict()) const;
707  Function mapaccum(const std::string& name, casadi_int n,
708  const std::vector<std::string>& accum_in,
709  const std::vector<std::string>& accum_out,
710  const Dict& opts=Dict()) const;
711  Function mapaccum(casadi_int N, const Dict& opts = Dict()) const;
712  Function fold(casadi_int N, const Dict& opts = Dict()) const;
714 
740  Function map(casadi_int n, const std::string& parallelization="serial") const;
741  Function map(casadi_int n, const std::string& parallelization,
742  casadi_int max_num_threads) const;
743 
745 
751  Function map(const std::string& name, const std::string& parallelization, casadi_int n,
752  const std::vector<casadi_int>& reduce_in,
753  const std::vector<casadi_int>& reduce_out,
754  const Dict& opts=Dict()) const;
755  Function map(const std::string& name, const std::string& parallelization, casadi_int n,
756  const std::vector<std::string>& reduce_in,
757  const std::vector<std::string>& reduce_out,
758  const Dict& opts=Dict()) const;
759  Function map(casadi_int n,
760  const std::vector<bool>& reduce_in,
761  const std::vector<bool>& reduce_out=std::vector<bool>(),
762  const Dict& opts=Dict()) const;
764 
768  Function slice(const std::string& name, const std::vector<casadi_int>& order_in,
769  const std::vector<casadi_int>& order_out, const Dict& opts=Dict()) const;
770 
774  static Function conditional(const std::string& name, const std::vector<Function>& f,
775  const Function& f_def, const Dict& opts=Dict());
776 
780  static Function conditional(const std::string& name,
781  const Function& f, const Dict& opts=Dict());
782 
788  static Function bspline(const std::string &name,
789  const std::vector< std::vector<double> >& knots, const std::vector<double>& coeffs,
790  const std::vector<casadi_int>& degree, casadi_int m=1, const Dict& opts=Dict());
791 
795  static Function if_else(const std::string& name, const Function& f_true,
796  const Function& f_false, const Dict& opts=Dict());
797 
814  Function forward(casadi_int nfwd) const;
815 
834  Function reverse(casadi_int nadj) const;
835 
839  const std::vector<Sparsity>& jac_sparsity(bool compact = false) const;
840 
844  Sparsity jac_sparsity(casadi_int oind, casadi_int iind, bool compact = false) const;
845 
849  std::string generate(const std::string& fname, const Dict& opts=Dict()) const;
850 
854  std::string generate(const Dict& opts=Dict()) const;
855 
859  std::string generate_dependencies(const std::string& fname, const Dict& opts=Dict()) const;
860 
868  void generate_in(const std::string& fname, const std::vector<DM>& arg);
869  std::vector<DM> generate_in(const std::string& fname);
871 
879  void generate_out(const std::string& fname, const std::vector<DM>& arg);
880  std::vector<DM> generate_out(const std::string& fname);
882 
889  void export_code(const std::string& lang,
890  const std::string &fname, const Dict& options=Dict()) const;
891 
892 #ifndef SWIG
896  void serialize(std::ostream &stream, const Dict& opts=Dict()) const;
897 
901  void serialize(SerializingStream &s) const;
902 #endif
903 
907  std::string serialize(const Dict& opts=Dict()) const;
908 
914  void save(const std::string &fname, const Dict& opts=Dict()) const;
915 
916  std::string export_code(const std::string& lang, const Dict& options=Dict()) const;
917 #ifndef SWIG
918  void export_code(const std::string& lang,
919  std::ostream &stream, const Dict& options=Dict()) const;
920 #endif // SWIG
922 #ifndef SWIG
925  FunctionInternal* get() const;
926 
928  template<typename T>
929  T* get() const {
930  T* ret = dynamic_cast<T*>(get());
931  casadi_assert_dev(ret!=nullptr);
932  return ret;
933  }
934 
938  FunctionInternal* operator->() const;
939 
941  static bool test_cast(const SharedObjectInternal* ptr);
943 #endif // SWIG
944 
946  Dict stats(int mem=0) const;
947 
949 
954  const SX sx_in(casadi_int iind) const;
955  const SX sx_in(const std::string& iname) const {
956  return sx_in(index_in(iname));
957  }
958  const std::vector<SX> sx_in() const;
959  const MX mx_in(casadi_int ind) const;
960  const MX mx_in(const std::string & iname) const {
961  return mx_in(index_in(iname));
962  }
963  const std::vector<MX> mx_in() const;
965 
967 
972  const SX sx_out(casadi_int oind) const;
973  const SX sx_out(const std::string& oname) const {
974  return sx_out(index_out(oname));
975  }
976  const std::vector<SX> sx_out() const;
977  const MX mx_out(casadi_int ind) const;
978  const MX mx_out(const std::string& oname) const {
979  return mx_out(index_out(oname));
980  }
981  const std::vector<MX> mx_out() const;
983 
988  std::vector<double> nz_from_in(const std::vector<DM>& arg) const;
989  std::vector<double> nz_from_out(const std::vector<DM>& arg) const;
990  std::vector<DM> nz_to_in(const std::vector<double>& arg) const;
991  std::vector<DM> nz_to_out(const std::vector<double>& arg) const;
993 
1001  DMDict convert_in(const std::vector<DM>& arg) const;
1002  std::vector<DM> convert_in(const DMDict& arg) const;
1003  DMDict convert_out(const std::vector<DM>& arg) const;
1004  std::vector<DM> convert_out(const DMDict& arg) const;
1005  SXDict convert_in(const std::vector<SX>& arg) const;
1006  std::vector<SX> convert_in(const SXDict& arg) const;
1007  SXDict convert_out(const std::vector<SX>& arg) const;
1008  std::vector<SX> convert_out(const SXDict& arg) const;
1009  MXDict convert_in(const std::vector<MX>& arg) const;
1010  std::vector<MX> convert_in(const MXDict& arg) const;
1011  MXDict convert_out(const std::vector<MX>& arg) const;
1012  std::vector<MX> convert_out(const MXDict& arg) const;
1014 
1018  bool has_free() const;
1019 
1023  std::vector<std::string> get_free() const;
1024 
1028  std::vector<SX> free_sx() const;
1029 
1033  std::vector<MX> free_mx() const;
1034 
1038  void generate_lifted(Function& SWIG_OUTPUT(vdef_fcn),
1039  Function& SWIG_OUTPUT(vinit_fcn)) const;
1040 
1044  casadi_int n_nodes() const;
1045 
1049  casadi_int n_instructions() const;
1050 
1054  casadi_int instruction_id(casadi_int k) const;
1055 
1061  std::vector<casadi_int> instruction_input(casadi_int k) const;
1062 
1066  double instruction_constant(casadi_int k) const;
1067 
1073  std::vector<casadi_int> instruction_output(casadi_int k) const;
1074 
1078  MX instruction_MX(casadi_int k) const;
1079 
1087 
1089 
1092  bool has_spfwd() const;
1093  bool has_sprev() const;
1095 
1099  size_t sz_arg() const;
1100 
1104  size_t sz_res() const;
1105 
1109  size_t sz_iw() const;
1110 
1114  size_t sz_w() const;
1115 
1116 #ifndef SWIG
1120  void sz_work(size_t& sz_arg, size_t& sz_res, size_t& sz_iw, size_t& sz_w) const;
1121 
1125  void set_work(const double**& arg, double**& res,
1126  casadi_int*& iw, double*& w, int mem=0) const;
1127 
1131  void set_temp(const double** arg, double** res,
1132  casadi_int* iw, double* w, int mem=0) const;
1133 
1137  void setup(const double** arg, double** res, casadi_int* iw, double* w, int mem=0) const;
1138 
1142  template<typename M>
1143  void call_gen(const std::map<std::string, M>& arg, std::map<std::string, M>& res,
1144  bool always_inline, bool never_inline) const;
1145 
1149  void merge(const std::vector<MX>& arg,
1150  std::vector<MX>& subs_from, std::vector<MX>& subs_to) const;
1151 #endif // SWIG
1153 
1157  const std::string& name() const;
1158 
1164  bool is_a(const std::string& type, bool recursive=true) const;
1165 
1178  static bool check_name(const std::string& name);
1179 
1186  static std::string fix_name(const std::string& name);
1187 
1191  static Function deserialize(std::istream& stream);
1192 
1196  static Function deserialize(const std::string& s);
1197 
1201  static Function load(const std::string& filename);
1202 
1207 
1209  void assert_size_in(casadi_int i, casadi_int nrow, casadi_int ncol) const;
1210 
1212  void assert_size_out(casadi_int i, casadi_int nrow, casadi_int ncol) const;
1213 
1215  void assert_sparsity_out(casadi_int i, const Sparsity& sp,
1216  casadi_int n = 1, bool allow_all_zero_sparse = true) const;
1217 
1219  casadi_int checkout() const;
1220 
1222  void release(int mem) const;
1223 
1224 #ifndef SWIG
1226  void* memory(int ind) const;
1227 
1228  static std::vector<SX> order(const std::vector<SX>& expr);
1229  static std::vector<MX> order(const std::vector<MX>& expr);
1230 #endif // SWIG
1231 
1235  Dict cache() const;
1236 
1240  std::vector<std::string> get_function() const;
1241 
1245  Function get_function(const std::string &name) const;
1246 
1250  bool has_function(const std::string& fname) const;
1251 
1257  std::vector<Function> find_functions(casadi_int max_depth = -1) const;
1258 
1265  Function find_function(const std::string &name, casadi_int max_depth=-1) const;
1266 
1268  Dict info() const;
1269 
1270 #ifndef SWIG
1271  protected:
1273 
1276  void construct(const std::string& name,
1277  const std::vector<SX>& ex_in, const std::vector<SX>& ex_out,
1278  const std::vector<std::string>& name_in,
1279  const std::vector<std::string>& name_out,
1280  const Dict& opts);
1281  void construct(const std::string& name,
1282  const std::vector<MX>& ex_in, const std::vector<MX>& ex_out,
1283  const std::vector<std::string>& name_in,
1284  const std::vector<std::string>& name_out,
1285  const Dict& opts);
1286  template<typename M>
1287  void construct(const std::string& name, const std::map<std::string, M>& dict,
1288  const std::vector<std::string>& name_in,
1289  const std::vector<std::string>& name_out,
1290  const Dict& opts);
1292 
1294  static bool proceed_to(std::istream& file, const std::string& str);
1295 
1297  Function mapaccum(const std::string& name, const std::vector<Function>& chain,
1298  casadi_int n_accum=1, const Dict& opts = Dict()) const;
1299 
1300 #ifdef WITH_EXTRA_CHECKS
1301  public:
1302  // How many times have we passed through
1303  // operator()(const double** arg, double** res, casadi_int* iw, double* w, int mem)?
1304  static thread_local casadi_int call_depth_;
1305 #endif
1306 
1307 
1308 #endif // SWIG
1309 
1310 
1311 
1312  };
1313 
1314 
1318 class CASADI_EXPORT FunctionBuffer {
1319  Function f_;
1320  std::vector<double> w_;
1321  std::vector<casadi_int> iw_;
1322  std::vector<const double*> arg_;
1323  std::vector<double*> res_;
1324  FunctionInternal* f_node_;
1325  casadi_int mem_;
1326  void *mem_internal_;
1327  int ret_;
1328 public:
1333 #ifndef SWIG
1334  ~FunctionBuffer();
1335  FunctionBuffer(const FunctionBuffer& f);
1336  FunctionBuffer& operator=(const FunctionBuffer& f);
1337 #endif // SWIG
1338 
1346  void set_arg(casadi_int i, const double* a, casadi_int size);
1347 
1355  void set_res(casadi_int i, double* a, casadi_int size);
1357  int ret();
1358  void _eval();
1359  void* _self() { return this; }
1360  Dict stats() const;
1361 };
1362 
1363 void CASADI_EXPORT _function_buffer_eval(void* raw);
1364 
1365 
1366 } // namespace casadi
1367 
1368 #include "casadi_interrupt.hpp"
1369 #include "runtime/shared.hpp"
1370 
1371 #endif // CASADI_FUNCTION_HPP
Helper class for Serialization.
Class to achieve minimal overhead function evaluations.
Definition: function.hpp:1318
void set_res(casadi_int i, double *a, casadi_int size)
Set output buffer for ouput i.
void set_arg(casadi_int i, const double *a, casadi_int size)
Set input buffer for input i.
FunctionBuffer(const Function &f)
Main constructor.
int ret()
Get last return value.
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:960
bool has_sprev() const
Is the class able to propagate seeds through the algorithm?
casadi_int numel_in() const
Get number of input elements.
Function map(casadi_int n, const std::vector< bool > &reduce_in, const std::vector< bool > &reduce_out=std::vector< bool >(), const Dict &opts=Dict()) const
Map with reduction.
std::vector< bool > is_diff_in() const
Get differentiability of inputs/output.
Function forward(casadi_int nfwd) const
Get a function that calculates nfwd forward derivatives.
casadi_int nnz_out() const
Get number of output nonzeros.
const std::vector< std::string > & name_in() const
Get input scheme.
Function(const std::string &fname)
Construct from a file.
void print_options(std::ostream &stream=casadi::uout()) const
Print options to a stream.
casadi_int n_instructions() const
Number of instruction in the algorithm (SXFunction/MXFunction)
std::string export_code(const std::string &lang, const Dict &options=Dict()) const
Export function in specific language.
size_t sz_res() const
Get required length of res field.
void generate_in(const std::string &fname, const std::vector< DM > &arg)
Export an input file that can be passed to generate C code with a main.
void call(const std::vector< SX > &arg, std::vector< SX > &res, bool always_inline=false, bool never_inline=false) const
Evaluate the function symbolically or numerically.
void print_option(const std::string &name, std::ostream &stream=casadi::uout()) const
Print all information there is to know about a certain option.
std::pair< casadi_int, casadi_int > size_out(const std::string &oname) const
Get output dimension.
Definition: function.hpp:258
std::string generate_dependencies(const std::string &fname, const Dict &opts=Dict()) const
Export / Generate C code for the dependency function.
std::vector< double > nz_from_out(const std::vector< DM > &arg) const
Convert from/to flat vector of input/output nonzeros.
void save(const std::string &fname, const Dict &opts=Dict()) const
Save Function to a file.
const std::string & name() const
Name of the function.
void call(const std::vector< MX > &arg, std::vector< MX > &res, bool always_inline=false, bool never_inline=false) const
Evaluate the function symbolically or numerically.
void assert_size_in(casadi_int i, casadi_int nrow, casadi_int ncol) const
Assert that an input dimension is equal so some given value.
casadi_int size2_out(casadi_int ind) const
Get output dimension.
std::vector< bool > which_depends(const std::string &s_in, const std::vector< std::string > &s_out, casadi_int order=1, bool tr=false) const
Which variables enter with some order.
void call(const MXDict &arg, MXDict &res, bool always_inline=false, bool never_inline=false) const
Evaluate the function symbolically or numerically.
const Sparsity & sparsity_out(casadi_int ind) const
Get sparsity of a given output.
Function map(const std::string &name, const std::string &parallelization, casadi_int n, const std::vector< casadi_int > &reduce_in, const std::vector< casadi_int > &reduce_out, const Dict &opts=Dict()) const
Map with reduction.
const MX mx_in(casadi_int ind) const
Get symbolic primitives equivalent to the input expressions.
Function(const std::string &name, const std::vector< MX > &ex_in, const std::vector< MX > &ex_out, const std::vector< std::string > &name_in, const std::vector< std::string > &name_out, const Dict &opts=Dict())
Construct an MX function.
bool has_spfwd() const
Is the class able to propagate seeds through the algorithm?
std::pair< casadi_int, casadi_int > size_out(casadi_int ind) const
Get output dimension.
std::vector< DM > generate_out(const std::string &fname)
Export an output file that can be checked with generated C code output.
double max_in(casadi_int ind) const
Get largest input value.
std::vector< DM > convert_out(const DMDict &arg) const
Convert from/to input/output lists/map.
const Sparsity sparsity_jac(const std::string &iind, casadi_int oind=0, bool compact=false, bool symmetric=false) const
Definition: function.hpp:491
Function(const std::string &name, const std::vector< MX > &ex_in, const std::vector< MX > &ex_out, const Dict &opts=Dict())
Construct an MX function.
casadi_int nnz_out(const std::string &oname) const
Get number of output nonzeros.
Definition: function.hpp:282
casadi_int size1_in(casadi_int ind) const
Get input dimension.
Function fold(casadi_int N, const Dict &opts=Dict()) const
Create a mapaccumulated version of this function.
casadi_int nnz_in(casadi_int ind) const
Get number of input nonzeros.
std::vector< SX > convert_out(const SXDict &arg) const
Convert from/to input/output lists/map.
Function mapaccum(const std::string &name, casadi_int N, const Dict &opts=Dict()) const
Create a mapaccumulated version of this function.
Function expand() const
Expand a function to SX.
MXDict convert_in(const std::vector< MX > &arg) const
Convert from/to input/output lists/map.
std::pair< casadi_int, casadi_int > size_in(casadi_int ind) const
Get input dimension.
casadi_int nnz_out(casadi_int ind) const
Get number of output nonzeros.
Dict info() const
static bool check_name(const std::string &name)
Check if a string is a valid function name.
Dict cache() const
Get all functions in the cache.
static Function conditional(const std::string &name, const std::vector< Function > &f, const Function &f_def, const Dict &opts=Dict())
Constuct a switch function.
std::vector< casadi_int > instruction_input(casadi_int k) const
Locations in the work vector for the inputs of the instruction.
const std::vector< Sparsity > & jac_sparsity(bool compact=false) const
Get, if necessary generate, the sparsity of all Jacobian blocks.
casadi_int numel_out() const
Get number of output elements.
casadi_int size2_in(const std::string &iname) const
Get input dimension.
Definition: function.hpp:242
std::vector< MX > convert_in(const MXDict &arg) const
Convert from/to input/output lists/map.
std::vector< SX > convert_in(const SXDict &arg) const
Convert from/to input/output lists/map.
Function wrap() const
Wrap in an Function instance consisting of only one MX call.
std::vector< double > nominal_in(casadi_int ind) const
Get nominal input value.
casadi_int numel_in(const std::string &iname) const
Get number of input elements.
Definition: function.hpp:293
casadi_int nnz_in(const std::string &iname) const
Get number of input nonzeros.
Definition: function.hpp:271
const MX mx_out(casadi_int ind) const
Get symbolic primitives equivalent to the output expressions.
void reset_dump_count()
Reset the counter used to name dump files.
Function reverse(casadi_int nadj) const
Get a function that calculates nadj adjoint derivatives.
std::vector< DM > nz_to_in(const std::vector< double > &arg) const
Convert from/to flat vector of input/output nonzeros.
casadi_int size1_out(const std::string &oname) const
Get output dimension.
Definition: function.hpp:254
static Function deserialize(const std::string &s)
Build function from serialization.
Function oracle() const
Get oracle.
std::vector< MX > convert_out(const MXDict &arg) const
Convert from/to input/output lists/map.
const Sparsity sparsity_jac(const std::string &iind, const std::string &oind, bool compact=false, bool symmetric=false) const
Definition: function.hpp:499
Function jacobian() const
Calculate all Jacobian blocks.
casadi_int numel_in(casadi_int ind) const
Get number of input elements.
const std::vector< MX > mx_in() const
Get symbolic primitives equivalent to the input expressions.
void release(int mem) const
Release a memory object.
casadi_int index_in(const std::string &name) const
Find the index for a string describing a particular entry of an input scheme.
Function expand(const std::string &name, const Dict &opts=Dict()) const
Expand a function to SX.
std::vector< std::string > get_function() const
Get a list of all functions.
const MX mx_out(const std::string &oname) const
Get symbolic primitives equivalent to the output expressions.
Definition: function.hpp:978
std::vector< Function > find_functions(casadi_int max_depth=-1) const
Get all functions embedded in the expression graphs.
std::vector< DM > nz_to_out(const std::vector< double > &arg) const
Convert from/to flat vector of input/output nonzeros.
const SX sx_out(const std::string &oname) const
Get symbolic primitives equivalent to the output expressions.
Definition: function.hpp:973
static Function deserialize(std::istream &stream)
Build function from serialization.
static std::string fix_name(const std::string &name)
Turn a string into a valid function name as defined by "check_name".
std::vector< bool > is_diff_out() const
Get differentiability of inputs/output.
casadi_int checkout() const
Checkout a memory object.
bool is_diff_out(casadi_int ind) const
Get differentiability of inputs/output.
Function hessian_old(casadi_int iind, casadi_int oind) const
[DEPRECATED] Replaced by Function::factory.
std::vector< DM > convert_in(const DMDict &arg) const
Convert from/to input/output lists/map.
Function mapaccum(const std::string &name, casadi_int n, const std::vector< std::string > &accum_in, const std::vector< std::string > &accum_out, const Dict &opts=Dict()) const
Create a mapaccumulated version of this function.
casadi_int n_nodes() const
Number of nodes in the algorithm.
const Sparsity sparsity_jac(casadi_int iind, casadi_int oind, bool compact=false, bool symmetric=false) const
Function(const std::string &name, const std::vector< SX > &ex_in, const std::vector< SX > &ex_out, const Dict &opts=Dict())
Construct an SX function.
const std::string & name_in(casadi_int ind) const
Get input scheme name by index.
~Function()
Destructor.
Function find_function(const std::string &name, casadi_int max_depth=-1) const
Get a specific function embedded in the expression graphs.
Function get_function(const std::string &name) const
Get a dependency function.
SX instructions_sx() const
Get the SX node corresponding to all instructions (SXFunction)
void assert_sparsity_out(casadi_int i, const Sparsity &sp, casadi_int n=1, bool allow_all_zero_sparse=true) const
Assert that an output sparsity is a multiple of some given sparsity.
MX instruction_MX(casadi_int k) const
Get the MX node corresponding to an instruction (MXFunction)
const SX sx_in(casadi_int iind) const
Get symbolic primitives equivalent to the input expressions.
Function mapaccum(casadi_int N, const Dict &opts=Dict()) const
Create a mapaccumulated version of this function.
const std::vector< SX > sx_out() const
Get symbolic primitives equivalent to the output expressions.
casadi_int numel_out(casadi_int ind) const
Get number of output elements.
size_t sz_iw() const
Get required length of iw field.
void call(const DMDict &arg, DMDict &res, bool always_inline=false, bool never_inline=false) const
Evaluate the function symbolically or numerically.
casadi_int n_out() const
Get the number of function outputs.
std::vector< casadi_int > instruction_output(casadi_int k) const
Location in the work vector for the output of the instruction.
const Sparsity & sparsity_in(const std::string &iname) const
Get sparsity of a given input.
std::string serialize(const Dict &opts=Dict()) const
Serialize.
static Function conditional(const std::string &name, const Function &f, const Dict &opts=Dict())
Conditional call to a function.
casadi_int n_in() const
Get the number of function inputs.
Function(const std::string &name, const std::map< std::string, SX > &dict, const std::vector< std::string > &name_in, const std::vector< std::string > &name_out, const Dict &opts=Dict())
Construct an SX function.
bool has_out(const std::string &name) const
Does the function have a particularly named output?
static Function load(const std::string &filename)
Build function from serialization.
casadi_int size1_in(const std::string &iname) const
Get input dimension.
Definition: function.hpp:240
bool is_diff_in(casadi_int ind) const
Get differentiability of inputs/output.
DMDict convert_in(const std::vector< DM > &arg) const
Convert from/to input/output lists/map.
Function(const std::string &name, const std::vector< SX > &ex_in, const std::vector< SX > &ex_out, const std::vector< std::string > &name_in, const std::vector< std::string > &name_out, const Dict &opts=Dict())
Construct an SX function.
Function map(const std::string &name, const std::string &parallelization, casadi_int n, const std::vector< std::string > &reduce_in, const std::vector< std::string > &reduce_out, const Dict &opts=Dict()) const
Map with reduction.
const std::string & name_out(casadi_int ind) const
Get output scheme name by index.
Function map(casadi_int n, const std::string &parallelization="serial") const
Create a mapped version of this function.
DMDict convert_out(const std::vector< DM > &arg) const
Convert from/to input/output lists/map.
static Function deserialize(DeserializingStream &s)
Build function from serialization.
casadi_int size2_out(const std::string &oname) const
Get output dimension.
Definition: function.hpp:256
size_t sz_w() const
Get required length of w field.
casadi_int numel_out(const std::string &oname) const
Get number of output elements.
Definition: function.hpp:304
Function mapaccum(const std::string &name, casadi_int N, casadi_int n_accum, const Dict &opts=Dict()) const
Create a mapaccumulated version of this function.
Function(const std::string &name, const std::map< std::string, MX > &dict, const std::vector< std::string > &name_in, const std::vector< std::string > &name_out, const Dict &opts=Dict())
Construct an MX function.
SXDict convert_out(const std::vector< SX > &arg) const
Convert from/to input/output lists/map.
size_t sz_arg() const
Get required length of arg field.
void generate_out(const std::string &fname, const std::vector< DM > &arg)
Export an output file that can be checked with generated C code output.
std::string generate(const std::string &fname, const Dict &opts=Dict()) const
Export / Generate C code for the function.
bool is_a(const std::string &type, bool recursive=true) const
Check if the function is of a particular type.
double min_in(casadi_int ind) const
Get smallest input value.
static std::string type_name()
Get type name.
Definition: function.hpp:65
bool has_in(const std::string &name) const
Does the function have a particularly named input?
std::vector< double > nominal_out(casadi_int ind) const
Get nominal output value.
Function slice(const std::string &name, const std::vector< casadi_int > &order_in, const std::vector< casadi_int > &order_out, const Dict &opts=Dict()) const
returns a new function with a selection of inputs/outputs of the original
bool has_free() const
Does the function have free variables.
Function wrap_as_needed(const Dict &opts) const
Wrap in a Function with options.
casadi_int nnz_in() const
Get number of input nonzeros.
Function mapaccum(const std::string &name, casadi_int n, const std::vector< casadi_int > &accum_in, const std::vector< casadi_int > &accum_out, const Dict &opts=Dict()) const
Create a mapaccumulated version of this function.
void generate_lifted(Function &vdef_fcn, Function &vinit_fcn) const
Extract the functions needed for the Lifted Newton method.
double instruction_constant(casadi_int k) const
Get the floating point output argument of an instruction (SXFunction)
std::vector< std::string > get_free() const
Get free variables as a string.
Sparsity jac_sparsity(casadi_int oind, casadi_int iind, bool compact=false) const
Get, if necessary generate, the sparsity of a single Jacobian block.
bool uses_output() const
Do the derivative functions need nondifferentiated outputs?
bool has_function(const std::string &fname) const
Check if a particular dependency exists.
Function()
Default constructor, null pointer.
std::vector< MX > free_mx() const
Get all the free variables of the function.
const std::vector< MX > mx_out() const
Get symbolic primitives equivalent to the output expressions.
std::string generate(const Dict &opts=Dict()) const
Export / Generate C code for the function.
const std::vector< std::string > & name_out() const
Get output scheme.
void print_dimensions(std::ostream &stream=casadi::uout()) const
Print dimensions of inputs and outputs.
std::vector< MX > mapsum(const std::vector< MX > &x, const std::string &parallelization="serial") const
Evaluate symbolically in parallel and sum (matrix graph)
void call(const SXDict &arg, SXDict &res, bool always_inline=false, bool never_inline=false) const
Evaluate the function symbolically or numerically.
casadi_int size1_out(casadi_int ind) const
Get output dimension.
const Sparsity sparsity_jac(casadi_int iind, const std::string &oind, bool compact=false, bool symmetric=false) const
Definition: function.hpp:495
const SX sx_in(const std::string &iname) const
Get symbolic primitives equivalent to the input expressions.
Definition: function.hpp:955
const Sparsity & sparsity_in(casadi_int ind) const
Get sparsity of a given input.
void export_code(const std::string &lang, const std::string &fname, const Dict &options=Dict()) const
Export function in specific language.
void call(const std::vector< DM > &arg, std::vector< DM > &res, bool always_inline=false, bool never_inline=false) const
Evaluate the function symbolically or numerically.
static Function jit(const std::string &name, const std::string &body, const std::vector< std::string > &name_in, const std::vector< std::string > &name_out, const Dict &opts=Dict())
To resolve ambiguity on some compilers.
casadi_int index_out(const std::string &name) const
Find the index for a string describing a particular entry of an output scheme.
std::vector< SX > free_sx() const
Get all the free variables of the function.
Dict stats(int mem=0) const
Get all statistics obtained at the end of the last evaluate call.
static Function if_else(const std::string &name, const Function &f_true, const Function &f_false, const Dict &opts=Dict())
Constructor (if-else)
SXDict convert_in(const std::vector< SX > &arg) const
Convert from/to input/output lists/map.
std::map< std::string, std::vector< std::string > > AuxOut
Definition: function.hpp:404
const SX sx_out(casadi_int oind) const
Get symbolic primitives equivalent to the output expressions.
std::vector< double > nz_from_in(const std::vector< DM > &arg) const
Convert from/to flat vector of input/output nonzeros.
Function map(casadi_int n, const std::string &parallelization, casadi_int max_num_threads) const
Function factory(const std::string &name, const std::vector< std::string > &s_in, const std::vector< std::string > &s_out, const AuxOut &aux=AuxOut(), const Dict &opts=Dict()) const
casadi_int size2_in(casadi_int ind) const
Get input dimension.
casadi_int instruction_id(casadi_int k) const
Identifier index of the instruction (SXFunction/MXFunction)
const Sparsity & sparsity_out(const std::string &iname) const
Get sparsity of a given output.
MXDict convert_out(const std::vector< MX > &arg) const
Convert from/to input/output lists/map.
const std::vector< SX > sx_in() const
Get symbolic primitives equivalent to the input expressions.
void assert_size_out(casadi_int i, casadi_int nrow, casadi_int ncol) const
Assert that an output dimension is equal so some given value.
void change_option(const std::string &option_name, const GenericType &option_value)
Change option after object creation for debugging.
std::vector< DM > generate_in(const std::string &fname)
Export an input file that can be passed to generate C code with a main.
Function jacobian_old(casadi_int iind, casadi_int oind) const
[DEPRECATED] Replaced by Function::factory.
static Function jit(const std::string &name, const std::string &body, const std::vector< std::string > &name_in, const std::vector< std::string > &name_out, const std::vector< Sparsity > &sparsity_in, const std::vector< Sparsity > &sparsity_out, const Dict &opts=Dict())
To resolve ambiguity on some compilers.
static Function bspline(const std::string &name, const std::vector< std::vector< double > > &knots, const std::vector< double > &coeffs, const std::vector< casadi_int > &degree, casadi_int m=1, const Dict &opts=Dict())
BSpline evaluator function.
double default_in(casadi_int ind) const
Get default input value.
std::pair< casadi_int, casadi_int > size_in(const std::string &iname) const
Get input dimension.
Definition: function.hpp:244
bool has_option(const std::string &option_name) const
Does a particular option exist.
Generic data type, can hold different types such as bool, casadi_int, std::string etc.
MX - Matrix expression.
Definition: mx.hpp:92
Sparse matrix class. SX and DM are specializations.
Definition: matrix_decl.hpp:99
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.hpp:32
std::map< std::string, MX > MXDict
Definition: mx.hpp:1009
CASADI_EXPORT std::ostream & uout()
std::vector< SX > SXVector
Definition: sx_fwd.hpp:37
std::vector< MX > MXVector
Definition: mx.hpp:1006
std::map< std::string, SX > SXDict
Definition: sx_fwd.hpp:40
Matrix< SXElem > SX
Definition: sx_fwd.hpp:32
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
std::initializer_list< SX > SXIList
Definition: sx_fwd.hpp:38
std::initializer_list< MX > MXIList
Definition: mx.hpp:1007
Matrix< double > DM
Definition: dm_fwd.hpp:33
void CASADI_EXPORT _function_buffer_eval(void *raw)
std::map< std::string, DM > DMDict
Definition: dm_fwd.hpp:36