26 #ifndef CASADI_CODE_GENERATOR_HPP
27 #define CASADI_CODE_GENERATOR_HPP
29 #include "function.hpp"
34 #include <type_traits>
54 void dump(std::ostream& s);
67 std::string
generate(
const std::string& prefix=
"");
70 void add_include(
const std::string& new_include,
bool relative_path=
false,
71 const std::string& use_ifdef=std::string());
75 std::string add_dependency(
const Function& f);
78 void add_external(
const std::string& new_external);
81 std::string shorthand(
const std::string& name)
const;
84 std::string shorthand(
const std::string& name,
bool allow_adding=
true);
91 std::string sparsity(
const Sparsity& sp,
bool canonical=
true);
98 casadi_int add_sparsity(
const Sparsity& sp,
bool canonical=
true);
103 casadi_int get_sparsity(
const Sparsity& sp)
const;
108 casadi_int get_constant(
const std::vector<double>& v,
bool allow_adding=
false);
113 casadi_int get_constant(
const std::vector<casadi_int>& v,
bool allow_adding=
false);
118 casadi_int get_constant(
const std::vector<char>& v,
bool allow_adding=
false);
123 casadi_int get_constant(
const std::vector<std::string>& v,
bool allow_adding=
false);
128 std::string constant(
const std::vector<casadi_int>& v);
133 std::string constant(
const std::vector<int>& v) {
134 return constant(vector_static_cast<casadi_int>(v));
141 const std::string& var_name,
142 const std::vector<casadi_int>& v,
143 const std::string& type=
"casadi_int");
148 std::string constant(
const std::vector<double>& v);
153 std::string constant(
const std::vector<char>& v);
158 std::string constant(
const std::vector<std::string>& v);
163 void define_rom_double(
const void*
id, casadi_int size);
168 std::string rom_double(
const void*
id)
const;
173 void define_rom_integer(
const void*
id, casadi_int size);
178 std::string rom_integer(
const void*
id)
const;
183 void define_pool_double(
const std::string& name,
const std::vector<double>& def);
188 std::string pool_double(
const std::string& name)
const;
195 void define_local_mutex(
const Function& f,
const std::string& name);
200 std::string local_mutex(
const Function& f,
const std::string& name)
const;
205 const std::set<std::string>& local_mutexes(
const Function& f)
const;
210 void setup_callback(
const std::string& s,
const Function& f);
215 std::string operator()(
const Function& f,
const std::string& arg,
216 const std::string& res,
const std::string& iw,
217 const std::string& w,
const std::string& failure_ret=
"1");
227 void print_formatted(
const std::string& s);
234 std::stringstream ss;
236 return (*
this) << ss.str();
242 void flush(std::ostream &s);
247 void local(
const std::string& name,
const std::string& type,
const std::string& ref=
"");
264 void scope_return(
const std::string& value);
276 void scope_add_cleanup(
const std::string& code);
281 std::string sx_work(casadi_int i);
286 void init_local(
const std::string& name,
const std::string& def);
291 void indent() {current_indent_++;}
296 void unindent() {current_indent_--;}
301 bool avoid_stack()
const {
return avoid_stack_;}
306 bool thread_safe()
const {
return thread_safe_; }
311 std::string constant(
double v);
312 std::string constant(casadi_int v);
313 std::string constant(
const std::string& v);
314 std::string constant(
char v);
316 std::string format_padded(casadi_int i)
const;
318 std::string zeros(casadi_int sz);
319 std::string ones(casadi_int sz);
324 template <
typename T>
325 std::string initializer(
const std::vector<T>& v) {
327 if (v.size() > max_initializer_elements_per_line) {
334 bool all_zeros = std::is_arithmetic<T>::value && v.size() > 0;
336 for (
const auto& el : v) {
346 for (casadi_int i = 0; i < v.size(); ++i) {
348 if (max_initializer_elements_per_line > 1 &&
349 i % max_initializer_elements_per_line == 0) {
365 std::string sanitize_source(
const std::string& src,
366 const std::vector<std::string>& inst,
367 bool add_shorthand=
true);
372 std::string dot(casadi_int n,
const std::string& x,
const std::string& y);
377 std::string mv(
const std::string& x,
const Sparsity& sp_x,
378 const std::string& y,
const std::string& z,
bool tr);
383 std::string mv(
const std::string& x, casadi_int nrow_x, casadi_int ncol_x,
384 const std::string& y,
const std::string& z,
bool tr);
389 std::string axpy(casadi_int n,
const std::string& a,
390 const std::string& x,
const std::string& y);
397 std::string clip_min(
const std::string& x, casadi_int n,
398 const std::string& min,
const std::string& mask);
405 std::string clip_max(
const std::string& x, casadi_int n,
406 const std::string& min,
const std::string& mask);
412 std::string vector_fmax(casadi_int n,
const std::string& x,
413 const std::string& y,
const std::string& z);
419 std::string vector_fmin(casadi_int n,
const std::string& x,
420 const std::string& y,
const std::string& z);
426 std::string masked_norm_inf(casadi_int n,
const std::string& x,
427 const std::string& mask);
433 std::string scal(casadi_int n,
const std::string& alpha,
const std::string& x);
438 std::string mtimes(
const std::string& x,
const Sparsity& sp_x,
439 const std::string& y,
const Sparsity& sp_y,
440 const std::string& z,
const Sparsity& sp_z,
441 const std::string& w,
bool tr);
446 std::string mtimes(
const std::string& x, casadi_int nrow_x, casadi_int ncol_x,
447 const std::string& y, casadi_int ncol_y,
448 const std::string& z,
bool tr);
453 std::string mtimes_dense_sparse(
const std::string& x, casadi_int nrow_x,
454 const std::string& y,
const Sparsity& sp_y,
455 const std::string& z);
460 std::string trilsolve(
const Sparsity& sp_x,
const std::string& x,
const std::string& y,
461 bool tr,
bool unity, casadi_int nrhs);
466 std::string triusolve(
const Sparsity& sp_x,
const std::string& x,
const std::string& y,
467 bool tr,
bool unity, casadi_int nrhs);
472 std::string bilin(
const std::string& A,
const Sparsity& sp_A,
473 const std::string& x,
const std::string& y);
478 std::string rank1(
const std::string& A,
const Sparsity& sp_A,
const std::string& alpha,
479 const std::string& x,
const std::string& y);
482 std::string logsumexp(
const std::string& A, casadi_int n);
487 std::string interpn(
const std::string& res, casadi_int ndim,
const std::string& grid,
488 const std::string& offset,
489 const std::string& values,
const std::string& x,
490 const std::string& lookup_mode, casadi_int m,
491 const std::string& iw,
const std::string& w);
496 std::string interpn_grad(
const std::string& grad,
497 casadi_int ndim,
const std::string& grid,
498 const std::string& offset,
499 const std::string& values,
const std::string& x,
500 const std::string& lookup_mode, casadi_int m,
501 const std::string& iw,
const std::string& w);
506 std::string trans(
const std::string& x,
const Sparsity& sp_x,
507 const std::string& y,
const Sparsity& sp_y,
const std::string& iw);
512 std::string qr(
const std::string& sp,
const std::string& A,
513 const std::string& w,
const std::string& sp_v,
514 const std::string& v,
const std::string& sp_r,
515 const std::string& r,
const std::string& beta,
516 const std::string& prinv,
const std::string& pc);
521 std::string det(
const std::string& sp_v,
const std::string& v,
522 const std::string& sp_r,
const std::string& r,
const std::string& beta);
527 std::string qr_solve(
const std::string& x, casadi_int nrhs,
bool tr,
528 const std::string& sp_v,
const std::string& v,
529 const std::string& sp_r,
const std::string& r,
530 const std::string& beta,
const std::string& prinv,
531 const std::string& pc,
const std::string& w);
536 std::string lsqr_solve(
const std::string& A,
const std::string&x,
537 casadi_int nrhs,
bool tr,
const std::string& sp,
const std::string& w);
542 std::string ldl(
const std::string& sp_a,
const std::string& a,
543 const std::string& sp_lt,
const std::string& lt,
544 const std::string& d,
const std::string& p,
545 const std::string& w);
550 std::string ldl_solve(
const std::string& x, casadi_int nrhs,
551 const std::string& sp_lt,
const std::string& lt,
552 const std::string& d,
const std::string& p,
553 const std::string& w);
558 std::string fmax(
const std::string& x,
const std::string& y);
563 std::string fmin(
const std::string& x,
const std::string& y);
568 std::string mmax(
const std::string& x, casadi_int n,
bool is_dense);
573 std::string mmin(
const std::string& x, casadi_int n,
bool is_dense);
578 std::string vfmax(
const std::string& x, casadi_int n,
const std::string& y);
583 std::string vfmin(
const std::string& x, casadi_int n,
const std::string& y);
588 std::string vfmax(
const std::string& x,
const std::string& n,
const std::string& y);
593 std::string vfmin(
const std::string& x,
const std::string& n,
const std::string& y);
598 std::string max(
const std::string& x,
const std::string& y);
603 std::string min(
const std::string& x,
const std::string& y);
608 std::string norm_inf(casadi_int n,
const std::string& x);
613 std::string norm_1(casadi_int n,
const std::string& x);
620 std::string norm_2(casadi_int n,
const std::string& x);
625 std::string max_viol(casadi_int n,
const std::string& x,
626 const std::string& lb,
const std::string& ub);
631 std::string sum_viol(casadi_int n,
const std::string& x,
632 const std::string& lb,
const std::string& ub);
637 std::string bound_consistency(casadi_int n,
const std::string& x,
638 const std::string& lam,
const std::string& lbx,
const std::string& ubx);
643 std::string lb_eig(
const Sparsity& sp_h,
const std::string& h);
648 std::string regularize(
const Sparsity& sp_h,
const std::string& h,
const std::string& reg);
653 std::string convexify_eval(
const ConvexifyData& d,
654 const std::string& Hin,
const std::string& Hout,
const std::string& iw,
const std::string& w);
659 std::string low(
const std::string& x,
const std::string& grid,
660 casadi_int ng, casadi_int lookup_mode);
665 std::string declare(std::string s);
670 void comment(
const std::string& s);
686 AUX_KRON_DENSE_SPARSE,
687 AUX_KRON_SPARSE_DENSE,
688 AUX_KRON_CONTRACT_INNER,
689 AUX_KRON_CONTRACT_INNER_DENSE,
690 AUX_KRON_CONTRACT_INNER_DENSE_SPARSE,
691 AUX_KRON_CONTRACT_INNER_SPARSE_DENSE,
692 AUX_KRON_CONTRACT_OUTER,
693 AUX_KRON_CONTRACT_OUTER_DENSE,
694 AUX_KRON_CONTRACT_OUTER_DENSE_SPARSE,
695 AUX_KRON_CONTRACT_OUTER_SPARSE_DENSE,
712 AUX_MTIMES_DENSE_SPARSE,
727 AUX_INTERPN_INTERPOLATE,
739 AUX_FEASIBLESQPMETHOD,
765 AUX_BOUNDS_CONSISTENCY,
782 AUX_BLAZING_1D_BOOR_EVAL,
783 AUX_BLAZING_2D_BOOR_EVAL,
784 AUX_BLAZING_3D_BOOR_EVAL,
785 AUX_BLAZING_4D_BOOR_EVAL,
786 AUX_BLAZING_5D_BOOR_EVAL,
800 void add_auxiliary(Auxiliary f,
const std::vector<std::string>& inst = {
"casadi_real"});
805 void add_io_sparsities(
const std::string& name,
806 const std::vector<Sparsity>& sp_in,
807 const std::vector<Sparsity>& sp_out);
810 std::string work(casadi_int n, casadi_int sz,
bool is_ref)
const;
813 std::string workel(casadi_int n)
const;
818 void reserve_work(casadi_int n);
821 static std::string array(
const std::string& type,
const std::string& name, casadi_int len,
822 const std::string& def=std::string());
827 void print_vector(std::ostream &s,
const std::string& name,
828 const std::vector<casadi_int>& v);
833 void print_vector(std::ostream &s,
const std::string& name,
834 const std::vector<char>& v);
839 void print_vector(std::ostream &s,
const std::string& name,
840 const std::vector<double>& v);
845 void print_vector(std::ostream &s,
const std::string& name,
846 const std::vector<std::string>& v);
851 std::string print_canonical(
const Sparsity& sp,
const std::string& arg);
856 std::string print_vector(casadi_int sz,
const std::string& arg);
861 std::string print_scalar(
const std::string& arg);
866 std::string fprintf_scalar(
const std::string& f,
const std::string& arg);
871 std::string fprintf_vector(
const std::string& f, casadi_int sz,
872 const std::string& arg,
const std::string& sep);
877 std::string copy(
const std::string& arg, std::size_t n,
const std::string& res);
878 void copy_check(
const std::string& arg, std::size_t n,
const std::string& res,
879 bool check_lhs=
true,
bool check_rhs=
true);
880 void copy_default(
const std::string& arg, std::size_t n,
const std::string& res,
881 const std::string& def,
bool check_rhs=
true);
884 bool elide_copy(casadi_int sz);
889 std::string fill(
const std::string& res, std::size_t n,
const std::string& v);
894 std::string clear(
const std::string& res, std::size_t n);
899 std::string arg(casadi_int i)
const;
904 std::string res(casadi_int i)
const;
909 std::string mem(
const Function& f);
914 std::string project(
const std::string& arg,
const Sparsity& sp_arg,
915 const std::string& res,
const Sparsity& sp_res,
916 const std::string& w);
921 std::string tri_project(
const std::string& arg,
const Sparsity& sp_arg,
922 const std::string& res,
bool lower);
927 std::string densify(
const std::string& arg,
const Sparsity& sp_arg,
928 const std::string& res,
bool tr=
false);
933 std::string sparsify(
const std::string& arg,
const std::string& res,
934 const Sparsity& sp_res,
bool tr=
false);
939 std::string to_mex(
const Sparsity& sp,
const std::string& arg);
944 std::string from_mex(std::string& arg,
945 const std::string& res, std::size_t res_off,
const Sparsity& sp_res,
946 const std::string& w);
951 static std::string fmu_helpers(
const std::string& modelname);
956 std::string printf(
const std::string& str,
957 const std::vector<std::string>& arg=std::vector<std::string>());
958 std::string printf(
const std::string& str,
const std::string& arg1);
959 std::string printf(
const std::string& str,
const std::string& arg1,
const std::string& arg2);
960 std::string printf(
const std::string& str,
const std::string& arg1,
const std::string& arg2,
961 const std::string& arg3);
966 std::string print_op(casadi_int op,
const std::string& a0);
967 std::string print_op(casadi_int op,
const std::string& a0,
const std::string& a1);
972 std::string file_slurp(
const std::string& fname, casadi_int n,
const std::string& a);
977 std::string to_file(
const std::string& f,
const Sparsity& sp,
const std::string& x);
982 void generate_dump(
const Function& f,
const std::string& arr,
bool is_input);
987 void generate_print(
const Function& f,
const std::string& arr,
bool is_input);
992 std::string cache_check(
const std::string& key,
const std::string& cache,
993 const std::string& loc, casadi_int stride, casadi_int sz, casadi_int key_sz,
994 const std::string& val);
997 static std::string casadi_version();
1000 static void stream_open(std::ostream& f,
bool cpp);
1003 static void stream_close(std::ostream& f,
bool cpp);
1008 void sz_work(
size_t& sz_arg,
size_t& sz_res,
size_t& sz_iw,
size_t& sz_w)
const;
1013 void generate_casadi_real(std::ostream &s)
const;
1016 void generate_casadi_int(std::ostream &s)
const;
1019 void generate_mex(std::ostream &s)
const;
1022 std::string codegen_sfunction(
const Function& f)
const;
1025 void generate_sfunction(
const std::string& name,
const std::string& sfunction)
const;
1028 void generate_main(std::ostream &s)
const;
1031 void generate_export_symbol(std::ostream &s)
const;
1034 void generate_import_symbol(std::ostream &s)
const;
1041 std::string name, suffix;
1044 std::string casadi_real_type;
1047 std::string casadi_int_type;
1059 bool with_sfunction;
1060 std::vector<std::string> added_sfunctions;
1075 bool verbose_runtime;
1089 std::string infinity, nan, real_min;
1097 bool codegen_scalars;
1100 bool with_export, with_import;
1103 casadi_int max_declarations_per_line;
1106 casadi_int max_initializer_elements_per_line;
1109 bool force_canonical;
1119 std::string dll_export, dll_import;
1125 std::string dump_dir_prefix;
1126 std::string dump_dir_suffix;
1129 std::stringstream includes;
1130 std::stringstream auxiliaries;
1131 std::stringstream body;
1132 std::stringstream header;
1133 std::stringstream buffer;
1140 casadi_int current_indent_;
1143 casadi_int sz_zeros_;
1144 casadi_int sz_ones_;
1146 casadi_int padding_length_;
1149 std::vector<std::string> exposed_fname;
1152 std::set<std::string> sparsity_meta;
1155 std::set<std::string> added_includes_;
1156 std::set<std::string> added_externals_;
1157 std::set<std::string> added_shorthands_;
1158 std::multimap<Auxiliary, std::vector<std::string>> added_auxiliaries_;
1159 std::multimap<size_t, size_t> added_double_constants_;
1160 std::multimap<size_t, size_t> added_integer_constants_;
1161 std::multimap<size_t, size_t> added_char_constants_;
1162 std::multimap<size_t, size_t> added_string_constants_;
1163 std::map<std::string, std::pair<std::string, std::string> > local_variables_;
1164 std::vector<std::string> local_cleanup_;
1166 std::map<std::string, std::string> local_default_;
1167 std::map<const void *, casadi_int> file_scope_double_;
1168 std::map<const void *, casadi_int> file_scope_integer_;
1169 std::vector< std::vector<double> > pool_double_defaults_;
1170 std::map<std::string, casadi_int> pool_double_;
1171 std::map<const FunctionInternal*, std::set<std::string> > local_mutexes_;
1174 struct FunctionMeta {
1178 std::string codegen_name;
1180 std::vector<FunctionMeta> added_functions_;
1183 std::map<std::string, std::map<FunctionInternal*, casadi_int> > added_wrappers_;
1186 std::vector<std::vector<double> > double_constants_;
1187 std::vector<std::vector<casadi_int> > integer_constants_;
1188 std::vector<std::vector<char> > char_constants_;
1189 std::vector<std::vector<std::string> > string_constants_;
1195 static size_t hash(
const std::vector<double>& v);
1196 static size_t hash(
const std::vector<casadi_int>& v);
1197 static size_t hash(
const std::vector<char>& v);
1198 static size_t hash(
const std::vector<std::string>& v);
1200 std::string wrapper(
const Function& base,
const std::string& name);
1203 template<
typename T>
1204 static bool equal(
const std::vector<T>& v1,
const std::vector<T>& v2) {
1205 if (v1.size()!=v2.size())
return false;
1206 for (casadi_int j=0; j<v1.size(); ++j) {
1207 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.