26 #ifndef CASADI_CODE_GENERATOR_HPP
27 #define CASADI_CODE_GENERATOR_HPP
29 #include "function.hpp"
53 void dump(std::ostream& s);
66 std::string
generate(
const std::string& prefix=
"");
69 void add_include(
const std::string& new_include,
bool relative_path=
false,
70 const std::string& use_ifdef=std::string());
74 std::string add_dependency(
const Function& f);
77 void add_external(
const std::string& new_external);
80 std::string shorthand(
const std::string& name)
const;
83 std::string shorthand(
const std::string& name,
bool allow_adding=
true);
90 std::string sparsity(
const Sparsity& sp,
bool canonical=
true);
97 casadi_int add_sparsity(
const Sparsity& sp,
bool canonical=
true);
102 casadi_int get_sparsity(
const Sparsity& sp)
const;
107 casadi_int get_constant(
const std::vector<double>& v,
bool allow_adding=
false);
112 casadi_int get_constant(
const std::vector<casadi_int>& v,
bool allow_adding=
false);
117 casadi_int get_constant(
const std::vector<char>& v,
bool allow_adding=
false);
122 casadi_int get_constant(
const std::vector<std::string>& v,
bool allow_adding=
false);
127 std::string constant(
const std::vector<casadi_int>& v);
132 std::string constant(
const std::vector<int>& v) {
133 return constant(vector_static_cast<casadi_int>(v));
140 const std::string& var_name,
141 const std::vector<casadi_int>& v,
142 const std::string& type=
"casadi_int");
147 std::string constant(
const std::vector<double>& v);
152 std::string constant(
const std::vector<char>& v);
157 std::string constant(
const std::vector<std::string>& v);
162 void define_rom_double(
const void*
id, casadi_int size);
167 std::string rom_double(
const void*
id)
const;
172 void define_rom_integer(
const void*
id, casadi_int size);
177 std::string rom_integer(
const void*
id)
const;
182 void define_pool_double(
const std::string& name,
const std::vector<double>& def);
187 std::string pool_double(
const std::string& name)
const;
192 void setup_callback(
const std::string& s,
const Function& f);
197 std::string operator()(
const Function& f,
const std::string& arg,
198 const std::string& res,
const std::string& iw,
199 const std::string& w,
const std::string& failure_ret=
"1");
209 void print_formatted(
const std::string& s);
216 std::stringstream ss;
218 return (*
this) << ss.str();
224 void flush(std::ostream &s);
229 void local(
const std::string& name,
const std::string& type,
const std::string& ref=
"");
244 std::string sx_work(casadi_int i);
249 void init_local(
const std::string& name,
const std::string& def);
254 void indent() {current_indent_++;}
259 void unindent() {current_indent_--;}
264 bool avoid_stack()
const {
return avoid_stack_;}
269 std::string constant(
double v);
270 std::string constant(casadi_int v);
271 std::string constant(
const std::string& v);
272 std::string constant(
char v);
274 std::string format_padded(casadi_int i)
const;
276 std::string zeros(casadi_int sz);
277 std::string ones(casadi_int sz);
282 template <
typename T>
283 std::string initializer(
const std::vector<T>& v) {
285 if (v.size() > max_initializer_elements_per_line) {
290 for (casadi_int i = 0; i < v.size(); ++i) {
292 if (max_initializer_elements_per_line > 1 &&
293 i % max_initializer_elements_per_line == 0) {
308 std::string sanitize_source(
const std::string& src,
309 const std::vector<std::string>& inst,
310 bool add_shorthand=
true);
315 std::string dot(casadi_int n,
const std::string& x,
const std::string& y);
320 std::string mv(
const std::string& x,
const Sparsity& sp_x,
321 const std::string& y,
const std::string& z,
bool tr);
326 std::string mv(
const std::string& x, casadi_int nrow_x, casadi_int ncol_x,
327 const std::string& y,
const std::string& z,
bool tr);
332 std::string axpy(casadi_int n,
const std::string& a,
333 const std::string& x,
const std::string& y);
340 std::string clip_min(
const std::string& x, casadi_int n,
341 const std::string& min,
const std::string& mask);
348 std::string clip_max(
const std::string& x, casadi_int n,
349 const std::string& min,
const std::string& mask);
355 std::string vector_fmax(casadi_int n,
const std::string& x,
356 const std::string& y,
const std::string& z);
362 std::string vector_fmin(casadi_int n,
const std::string& x,
363 const std::string& y,
const std::string& z);
369 std::string masked_norm_inf(casadi_int n,
const std::string& x,
370 const std::string& mask);
376 std::string scal(casadi_int n,
const std::string& alpha,
const std::string& x);
381 std::string mtimes(
const std::string& x,
const Sparsity& sp_x,
382 const std::string& y,
const Sparsity& sp_y,
383 const std::string& z,
const Sparsity& sp_z,
384 const std::string& w,
bool tr);
389 std::string trilsolve(
const Sparsity& sp_x,
const std::string& x,
const std::string& y,
390 bool tr,
bool unity, casadi_int nrhs);
395 std::string triusolve(
const Sparsity& sp_x,
const std::string& x,
const std::string& y,
396 bool tr,
bool unity, casadi_int nrhs);
401 std::string bilin(
const std::string& A,
const Sparsity& sp_A,
402 const std::string& x,
const std::string& y);
407 std::string rank1(
const std::string& A,
const Sparsity& sp_A,
const std::string& alpha,
408 const std::string& x,
const std::string& y);
411 std::string logsumexp(
const std::string& A, casadi_int n);
416 std::string interpn(
const std::string& res, casadi_int ndim,
const std::string& grid,
417 const std::string& offset,
418 const std::string& values,
const std::string& x,
419 const std::string& lookup_mode, casadi_int m,
420 const std::string& iw,
const std::string& w);
425 std::string interpn_grad(
const std::string& grad,
426 casadi_int ndim,
const std::string& grid,
427 const std::string& offset,
428 const std::string& values,
const std::string& x,
429 const std::string& lookup_mode, casadi_int m,
430 const std::string& iw,
const std::string& w);
435 std::string trans(
const std::string& x,
const Sparsity& sp_x,
436 const std::string& y,
const Sparsity& sp_y,
const std::string& iw);
441 std::string qr(
const std::string& sp,
const std::string& A,
442 const std::string& w,
const std::string& sp_v,
443 const std::string& v,
const std::string& sp_r,
444 const std::string& r,
const std::string& beta,
445 const std::string& prinv,
const std::string& pc);
450 std::string qr_solve(
const std::string& x, casadi_int nrhs,
bool tr,
451 const std::string& sp_v,
const std::string& v,
452 const std::string& sp_r,
const std::string& r,
453 const std::string& beta,
const std::string& prinv,
454 const std::string& pc,
const std::string& w);
459 std::string lsqr_solve(
const std::string& A,
const std::string&x,
460 casadi_int nrhs,
bool tr,
const std::string& sp,
const std::string& w);
465 std::string ldl(
const std::string& sp_a,
const std::string& a,
466 const std::string& sp_lt,
const std::string& lt,
467 const std::string& d,
const std::string& p,
468 const std::string& w);
473 std::string ldl_solve(
const std::string& x, casadi_int nrhs,
474 const std::string& sp_lt,
const std::string& lt,
475 const std::string& d,
const std::string& p,
476 const std::string& w);
481 std::string fmax(
const std::string& x,
const std::string& y);
486 std::string fmin(
const std::string& x,
const std::string& y);
491 std::string mmax(
const std::string& x, casadi_int n,
bool is_dense);
496 std::string mmin(
const std::string& x, casadi_int n,
bool is_dense);
501 std::string vfmax(
const std::string& x, casadi_int n,
const std::string& y);
506 std::string vfmin(
const std::string& x, casadi_int n,
const std::string& y);
511 std::string vfmax(
const std::string& x,
const std::string& n,
const std::string& y);
516 std::string vfmin(
const std::string& x,
const std::string& n,
const std::string& y);
521 std::string max(
const std::string& x,
const std::string& y);
526 std::string min(
const std::string& x,
const std::string& y);
531 std::string norm_inf(casadi_int n,
const std::string& x);
536 std::string norm_1(casadi_int n,
const std::string& x);
543 std::string norm_2(casadi_int n,
const std::string& x);
548 std::string max_viol(casadi_int n,
const std::string& x,
549 const std::string& lb,
const std::string& ub);
554 std::string sum_viol(casadi_int n,
const std::string& x,
555 const std::string& lb,
const std::string& ub);
560 std::string bound_consistency(casadi_int n,
const std::string& x,
561 const std::string& lam,
const std::string& lbx,
const std::string& ubx);
566 std::string lb_eig(
const Sparsity& sp_h,
const std::string& h);
571 std::string regularize(
const Sparsity& sp_h,
const std::string& h,
const std::string& reg);
576 std::string convexify_eval(
const ConvexifyData& d,
577 const std::string& Hin,
const std::string& Hout,
const std::string& iw,
const std::string& w);
582 std::string low(
const std::string& x,
const std::string& grid,
583 casadi_int ng, casadi_int lookup_mode);
588 std::string declare(std::string s);
593 void comment(
const std::string& s);
636 AUX_INTERPN_INTERPOLATE,
645 AUX_FEASIBLESQPMETHOD,
670 AUX_BOUNDS_CONSISTENCY,
687 AUX_BLAZING_1D_BOOR_EVAL,
688 AUX_BLAZING_2D_BOOR_EVAL,
689 AUX_BLAZING_3D_BOOR_EVAL,
699 void add_auxiliary(Auxiliary f,
const std::vector<std::string>& inst = {
"casadi_real"});
704 void add_io_sparsities(
const std::string& name,
705 const std::vector<Sparsity>& sp_in,
706 const std::vector<Sparsity>& sp_out);
709 std::string work(casadi_int n, casadi_int sz,
bool is_ref)
const;
712 std::string workel(casadi_int n)
const;
717 void reserve_work(casadi_int n);
720 static std::string array(
const std::string& type,
const std::string& name, casadi_int len,
721 const std::string& def=std::string());
726 void print_vector(std::ostream &s,
const std::string& name,
727 const std::vector<casadi_int>& v);
732 void print_vector(std::ostream &s,
const std::string& name,
733 const std::vector<char>& v);
738 void print_vector(std::ostream &s,
const std::string& name,
739 const std::vector<double>& v);
744 void print_vector(std::ostream &s,
const std::string& name,
745 const std::vector<std::string>& v);
750 std::string print_canonical(
const Sparsity& sp,
const std::string& arg);
755 std::string print_vector(casadi_int sz,
const std::string& arg);
760 std::string print_scalar(
const std::string& arg);
765 std::string copy(
const std::string& arg, std::size_t n,
const std::string& res);
766 void copy_check(
const std::string& arg, std::size_t n,
const std::string& res,
767 bool check_lhs=
true,
bool check_rhs=
true);
768 void copy_default(
const std::string& arg, std::size_t n,
const std::string& res,
769 const std::string& def,
bool check_rhs=
true);
772 bool elide_copy(casadi_int sz);
777 std::string fill(
const std::string& res, std::size_t n,
const std::string& v);
782 std::string clear(
const std::string& res, std::size_t n);
787 std::string arg(casadi_int i)
const;
792 std::string res(casadi_int i)
const;
797 std::string mem(
const Function& f);
802 std::string project(
const std::string& arg,
const Sparsity& sp_arg,
803 const std::string& res,
const Sparsity& sp_res,
804 const std::string& w);
809 std::string tri_project(
const std::string& arg,
const Sparsity& sp_arg,
810 const std::string& res,
bool lower);
815 std::string densify(
const std::string& arg,
const Sparsity& sp_arg,
816 const std::string& res,
bool tr=
false);
821 std::string sparsify(
const std::string& arg,
const std::string& res,
822 const Sparsity& sp_res,
bool tr=
false);
827 std::string to_mex(
const Sparsity& sp,
const std::string& arg);
832 std::string from_mex(std::string& arg,
833 const std::string& res, std::size_t res_off,
const Sparsity& sp_res,
834 const std::string& w);
839 static std::string fmu_helpers(
const std::string& modelname);
844 std::string printf(
const std::string& str,
845 const std::vector<std::string>& arg=std::vector<std::string>());
846 std::string printf(
const std::string& str,
const std::string& arg1);
847 std::string printf(
const std::string& str,
const std::string& arg1,
const std::string& arg2);
848 std::string printf(
const std::string& str,
const std::string& arg1,
const std::string& arg2,
849 const std::string& arg3);
854 std::string print_op(casadi_int op,
const std::string& a0);
855 std::string print_op(casadi_int op,
const std::string& a0,
const std::string& a1);
860 std::string file_slurp(
const std::string& fname, casadi_int n,
const std::string& a);
865 std::string cache_check(
const std::string& key,
const std::string& cache,
866 const std::string& loc, casadi_int stride, casadi_int sz, casadi_int key_sz,
867 const std::string& val);
870 static std::string casadi_version();
873 static void stream_open(std::ostream& f,
bool cpp);
876 static void stream_close(std::ostream& f,
bool cpp);
881 void sz_work(
size_t& sz_arg,
size_t& sz_res,
size_t& sz_iw,
size_t& sz_w)
const;
886 void generate_casadi_real(std::ostream &s)
const;
889 void generate_casadi_int(std::ostream &s)
const;
892 void generate_mex(std::ostream &s)
const;
895 std::string codegen_sfunction(
const Function& f)
const;
898 void generate_sfunction(
const std::string& name,
const std::string& sfunction)
const;
901 void generate_main(std::ostream &s)
const;
904 void generate_export_symbol(std::ostream &s)
const;
907 void generate_import_symbol(std::ostream &s)
const;
914 std::string name, suffix;
917 std::string casadi_real_type;
920 std::string casadi_int_type;
933 std::vector<std::string> added_sfunctions;
942 bool verbose_runtime;
956 std::string infinity, nan, real_min;
964 bool codegen_scalars;
967 bool with_export, with_import;
970 casadi_int max_declarations_per_line;
973 casadi_int max_initializer_elements_per_line;
976 bool force_canonical;
979 std::string dll_export, dll_import;
985 std::stringstream includes;
986 std::stringstream auxiliaries;
987 std::stringstream body;
988 std::stringstream header;
989 std::stringstream buffer;
996 casadi_int current_indent_;
999 casadi_int sz_zeros_;
1000 casadi_int sz_ones_;
1002 casadi_int padding_length_;
1005 std::vector<std::string> exposed_fname;
1008 std::set<std::string> sparsity_meta;
1011 std::set<std::string> added_includes_;
1012 std::set<std::string> added_externals_;
1013 std::set<std::string> added_shorthands_;
1014 std::multimap<Auxiliary, std::vector<std::string>> added_auxiliaries_;
1015 std::multimap<size_t, size_t> added_double_constants_;
1016 std::multimap<size_t, size_t> added_integer_constants_;
1017 std::multimap<size_t, size_t> added_char_constants_;
1018 std::multimap<size_t, size_t> added_string_constants_;
1019 std::map<std::string, std::pair<std::string, std::string> > local_variables_;
1020 std::map<std::string, std::string> local_default_;
1021 std::map<const void *, casadi_int> file_scope_double_;
1022 std::map<const void *, casadi_int> file_scope_integer_;
1023 std::vector< std::vector<double> > pool_double_defaults_;
1024 std::map<std::string, casadi_int> pool_double_;
1027 struct FunctionMeta {
1031 std::string codegen_name;
1033 std::vector<FunctionMeta> added_functions_;
1036 std::map<std::string, std::map<FunctionInternal*, casadi_int> > added_wrappers_;
1039 std::vector<std::vector<double> > double_constants_;
1040 std::vector<std::vector<casadi_int> > integer_constants_;
1041 std::vector<std::vector<char> > char_constants_;
1042 std::vector<std::vector<std::string> > string_constants_;
1048 static size_t hash(
const std::vector<double>& v);
1049 static size_t hash(
const std::vector<casadi_int>& v);
1050 static size_t hash(
const std::vector<char>& v);
1051 static size_t hash(
const std::vector<std::string>& v);
1053 std::string wrapper(
const Function& base,
const std::string& name);
1056 template<
typename T>
1057 static bool equal(
const std::vector<T>& v1,
const std::vector<T>& v2) {
1058 if (v1.size()!=v2.size())
return false;
1059 for (casadi_int j=0; j<v1.size(); ++j) {
1060 if (v1[j]!=v2[j])
return false;
Helper class for C code generation.
std::string dump()
Generate a file, return code as string.
void add(const Function &f, bool with_jac_sparsity=false)
Add a function (name generated)
CodeGenerator(const std::string &name, const Dict &opts=Dict())
Constructor.
std::string generate(const std::string &prefix="")
Generate file(s)
void add_include(const std::string &new_include, bool relative_path=false, const std::string &use_ifdef=std::string())
Add an include file optionally using a relative path "..." instead of an absolute path <....
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.