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,
const std::string& name=
"");
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 void add_runtime(
const std::string& key,
const std::string& src,
373 const std::vector<std::string>& inst);
378 std::string dot(casadi_int n,
const std::string& x,
const std::string& y);
383 std::string mv(
const std::string& x,
const Sparsity& sp_x,
384 const std::string& y,
const std::string& z,
bool tr);
389 std::string mv(
const std::string& x, casadi_int nrow_x, casadi_int ncol_x,
390 const std::string& y,
const std::string& z,
bool tr);
395 std::string axpy(casadi_int n,
const std::string& a,
396 const std::string& x,
const std::string& y);
403 std::string clip_min(
const std::string& x, casadi_int n,
404 const std::string& min,
const std::string& mask);
411 std::string clip_max(
const std::string& x, casadi_int n,
412 const std::string& min,
const std::string& mask);
418 std::string vector_fmax(casadi_int n,
const std::string& x,
419 const std::string& y,
const std::string& z);
425 std::string vector_fmin(casadi_int n,
const std::string& x,
426 const std::string& y,
const std::string& z);
432 std::string masked_norm_inf(casadi_int n,
const std::string& x,
433 const std::string& mask);
439 std::string scal(casadi_int n,
const std::string& alpha,
const std::string& x);
444 std::string mtimes(
const std::string& x,
const Sparsity& sp_x,
445 const std::string& y,
const Sparsity& sp_y,
446 const std::string& z,
const Sparsity& sp_z,
447 const std::string& w,
bool tr);
452 std::string mtimes(
const std::string& x, casadi_int nrow_x, casadi_int ncol_x,
453 const std::string& y, casadi_int ncol_y,
454 const std::string& z,
bool tr);
459 std::string mtimes_dense_sparse(
const std::string& x, casadi_int nrow_x,
460 const std::string& y,
const Sparsity& sp_y,
461 const std::string& z);
466 std::string trilsolve(
const Sparsity& sp_x,
const std::string& x,
const std::string& y,
467 bool tr,
bool unity, casadi_int nrhs);
472 std::string triusolve(
const Sparsity& sp_x,
const std::string& x,
const std::string& y,
473 bool tr,
bool unity, casadi_int nrhs);
478 std::string bilin(
const std::string& A,
const Sparsity& sp_A,
479 const std::string& x,
const std::string& y);
484 std::string rank1(
const std::string& A,
const Sparsity& sp_A,
const std::string& alpha,
485 const std::string& x,
const std::string& y);
488 std::string logsumexp(
const std::string& A, casadi_int n);
493 std::string interpn(
const std::string& res, casadi_int ndim,
const std::string& grid,
494 const std::string& offset,
495 const std::string& values,
const std::string& x,
496 const std::string& lookup_mode, casadi_int m,
497 const std::string& iw,
const std::string& w);
502 std::string interpn_grad(
const std::string& grad,
503 casadi_int ndim,
const std::string& grid,
504 const std::string& offset,
505 const std::string& values,
const std::string& x,
506 const std::string& lookup_mode, casadi_int m,
507 const std::string& iw,
const std::string& w);
512 std::string trans(
const std::string& x,
const Sparsity& sp_x,
513 const std::string& y,
const Sparsity& sp_y,
const std::string& iw);
518 std::string qr(
const std::string& sp,
const std::string& A,
519 const std::string& w,
const std::string& sp_v,
520 const std::string& v,
const std::string& sp_r,
521 const std::string& r,
const std::string& beta,
522 const std::string& prinv,
const std::string& pc);
527 std::string det(
const std::string& sp_v,
const std::string& v,
528 const std::string& sp_r,
const std::string& r,
const std::string& beta);
533 std::string qr_solve(
const std::string& x, casadi_int nrhs,
bool tr,
534 const std::string& sp_v,
const std::string& v,
535 const std::string& sp_r,
const std::string& r,
536 const std::string& beta,
const std::string& prinv,
537 const std::string& pc,
const std::string& w);
542 std::string lsqr_solve(
const std::string& A,
const std::string&x,
543 casadi_int nrhs,
bool tr,
const std::string& sp,
const std::string& w);
548 std::string ldl(
const std::string& sp_a,
const std::string& a,
549 const std::string& sp_lt,
const std::string& lt,
550 const std::string& d,
const std::string& p,
551 const std::string& w);
556 std::string ldl_solve(
const std::string& x, casadi_int nrhs,
557 const std::string& sp_lt,
const std::string& lt,
558 const std::string& d,
const std::string& p,
559 const std::string& w);
564 std::string fmax(
const std::string& x,
const std::string& y);
569 std::string fmin(
const std::string& x,
const std::string& y);
574 std::string mmax(
const std::string& x, casadi_int n,
bool is_dense);
579 std::string mmin(
const std::string& x, casadi_int n,
bool is_dense);
584 std::string vfmax(
const std::string& x, casadi_int n,
const std::string& y);
589 std::string vfmin(
const std::string& x, casadi_int n,
const std::string& y);
594 std::string vfmax(
const std::string& x,
const std::string& n,
const std::string& y);
599 std::string vfmin(
const std::string& x,
const std::string& n,
const std::string& y);
604 std::string max(
const std::string& x,
const std::string& y);
609 std::string min(
const std::string& x,
const std::string& y);
614 std::string norm_inf(casadi_int n,
const std::string& x);
619 std::string norm_1(casadi_int n,
const std::string& x);
626 std::string norm_2(casadi_int n,
const std::string& x);
631 std::string max_viol(casadi_int n,
const std::string& x,
632 const std::string& lb,
const std::string& ub);
637 std::string sum_viol(casadi_int n,
const std::string& x,
638 const std::string& lb,
const std::string& ub);
643 std::string bound_consistency(casadi_int n,
const std::string& x,
644 const std::string& lam,
const std::string& lbx,
const std::string& ubx);
649 std::string lb_eig(
const Sparsity& sp_h,
const std::string& h);
654 std::string regularize(
const Sparsity& sp_h,
const std::string& h,
const std::string& reg);
659 std::string convexify_eval(
const ConvexifyData& d,
660 const std::string& Hin,
const std::string& Hout,
const std::string& iw,
const std::string& w);
665 std::string low(
const std::string& x,
const std::string& grid,
666 casadi_int ng, casadi_int lookup_mode);
671 std::string declare(std::string s);
676 void comment(
const std::string& s);
692 AUX_KRON_DENSE_SPARSE,
693 AUX_KRON_SPARSE_DENSE,
694 AUX_KRON_CONTRACT_INNER,
695 AUX_KRON_CONTRACT_INNER_DENSE,
696 AUX_KRON_CONTRACT_INNER_DENSE_SPARSE,
697 AUX_KRON_CONTRACT_INNER_SPARSE_DENSE,
698 AUX_KRON_CONTRACT_OUTER,
699 AUX_KRON_CONTRACT_OUTER_DENSE,
700 AUX_KRON_CONTRACT_OUTER_DENSE_SPARSE,
701 AUX_KRON_CONTRACT_OUTER_SPARSE_DENSE,
718 AUX_MTIMES_DENSE_SPARSE,
733 AUX_INTERPN_INTERPOLATE,
745 AUX_FEASIBLESQPMETHOD,
776 AUX_BOUNDS_CONSISTENCY,
793 AUX_BLAZING_1D_BOOR_EVAL,
794 AUX_BLAZING_2D_BOOR_EVAL,
795 AUX_BLAZING_3D_BOOR_EVAL,
796 AUX_BLAZING_4D_BOOR_EVAL,
797 AUX_BLAZING_5D_BOOR_EVAL,
811 void add_auxiliary(Auxiliary f,
const std::vector<std::string>& inst = {
"casadi_real"});
816 void add_io_sparsities(
const std::string& name,
817 const std::vector<Sparsity>& sp_in,
818 const std::vector<Sparsity>& sp_out);
821 std::string work(casadi_int n, casadi_int sz,
bool is_ref)
const;
824 std::string workel(casadi_int n)
const;
829 void reserve_work(casadi_int n);
837 void set_codegen_sz_w(
const FunctionInternal* f,
size_t sz_w);
844 bool get_codegen_sz_w(
const FunctionInternal* f,
size_t& sz_w)
const;
847 static std::string array(
const std::string& type,
const std::string& name, casadi_int len,
848 const std::string& def=std::string());
853 void print_vector(std::ostream &s,
const std::string& name,
854 const std::vector<casadi_int>& v);
859 void print_vector(std::ostream &s,
const std::string& name,
860 const std::vector<char>& v);
865 void print_vector(std::ostream &s,
const std::string& name,
866 const std::vector<double>& v);
871 void print_vector(std::ostream &s,
const std::string& name,
872 const std::vector<std::string>& v);
877 std::string print_canonical(
const Sparsity& sp,
const std::string& arg);
882 std::string print_vector(casadi_int sz,
const std::string& arg);
887 std::string print_scalar(
const std::string& arg);
892 std::string fprintf_scalar(
const std::string& f,
const std::string& arg);
897 std::string fprintf_vector(
const std::string& f, casadi_int sz,
898 const std::string& arg,
const std::string& sep);
903 std::string copy(
const std::string& arg, std::size_t n,
const std::string& res);
904 void copy_check(
const std::string& arg, std::size_t n,
const std::string& res,
905 bool check_lhs=
true,
bool check_rhs=
true);
906 void copy_default(
const std::string& arg, std::size_t n,
const std::string& res,
907 const std::string& def,
bool check_rhs=
true);
910 bool elide_copy(casadi_int sz);
915 std::string fill(
const std::string& res, std::size_t n,
const std::string& v);
920 std::string clear(
const std::string& res, std::size_t n);
925 std::string arg(casadi_int i)
const;
930 std::string res(casadi_int i)
const;
935 std::string mem(
const Function& f);
940 std::string project(
const std::string& arg,
const Sparsity& sp_arg,
941 const std::string& res,
const Sparsity& sp_res,
942 const std::string& w);
947 std::string tri_project(
const std::string& arg,
const Sparsity& sp_arg,
948 const std::string& res,
bool lower);
953 std::string densify(
const std::string& arg,
const Sparsity& sp_arg,
954 const std::string& res,
bool tr=
false);
959 std::string sparsify(
const std::string& arg,
const std::string& res,
960 const Sparsity& sp_res,
bool tr=
false);
965 std::string to_mex(
const Sparsity& sp,
const std::string& arg);
970 std::string from_mex(std::string& arg,
971 const std::string& res, std::size_t res_off,
const Sparsity& sp_res,
972 const std::string& w);
977 static std::string fmu_helpers(
const std::string& modelname);
982 std::string printf(
const std::string& str,
983 const std::vector<std::string>& arg=std::vector<std::string>());
984 std::string printf(
const std::string& str,
const std::string& arg1);
985 std::string printf(
const std::string& str,
const std::string& arg1,
const std::string& arg2);
986 std::string printf(
const std::string& str,
const std::string& arg1,
const std::string& arg2,
987 const std::string& arg3);
992 std::string print_op(casadi_int op,
const std::string& a0);
993 std::string print_op(casadi_int op,
const std::string& a0,
const std::string& a1);
998 std::string file_slurp(
const std::string& fname, casadi_int n,
const std::string& a);
1003 std::string to_file(
const std::string& f,
const Sparsity& sp,
const std::string& x);
1008 void generate_dump(
const Function& f,
const std::string& arr,
bool is_input);
1013 void generate_print(
const Function& f,
const std::string& arr,
bool is_input);
1018 std::string cache_check(
const std::string& key,
const std::string& cache,
1019 const std::string& loc, casadi_int stride, casadi_int sz, casadi_int key_sz,
1020 const std::string& val);
1023 static std::string casadi_version();
1026 static void stream_open(std::ostream& f,
bool cpp);
1029 static void stream_close(std::ostream& f,
bool cpp);
1034 void sz_work(
size_t& sz_arg,
size_t& sz_res,
size_t& sz_iw,
size_t& sz_w)
const;
1039 void generate_casadi_real(std::ostream &s)
const;
1042 void generate_casadi_int(std::ostream &s)
const;
1045 void generate_mex(std::ostream &s)
const;
1048 std::string codegen_sfunction(
const Function& f)
const;
1051 void generate_sfunction(
const std::string& name,
const std::string& sfunction)
const;
1054 void generate_main(std::ostream &s)
const;
1057 void generate_export_symbol(std::ostream &s)
const;
1060 void generate_import_symbol(std::ostream &s)
const;
1067 std::string name, suffix;
1070 std::string casadi_real_type;
1073 std::string casadi_int_type;
1085 bool with_sfunction;
1086 std::vector<std::string> added_sfunctions;
1101 bool verbose_runtime;
1115 std::string infinity, nan, real_min;
1123 bool codegen_scalars;
1126 bool with_export, with_import;
1129 casadi_int max_declarations_per_line;
1132 casadi_int max_initializer_elements_per_line;
1135 bool force_canonical;
1145 std::string dll_export, dll_import;
1151 std::string dump_dir_prefix;
1152 std::string dump_dir_suffix;
1155 std::stringstream includes;
1156 std::stringstream auxiliaries;
1157 std::stringstream body;
1158 std::stringstream header;
1159 std::stringstream buffer;
1166 casadi_int current_indent_;
1169 casadi_int sz_zeros_;
1170 casadi_int sz_ones_;
1172 casadi_int padding_length_;
1175 std::vector<std::string> exposed_fname;
1178 std::set<std::string> sparsity_meta;
1181 std::set<std::string> added_includes_;
1182 std::set<std::string> added_externals_;
1183 std::set<std::string> external_names_;
1184 std::set<std::string> added_shorthands_;
1185 std::set<std::string> added_runtimes_;
1186 std::multimap<Auxiliary, std::vector<std::string>> added_auxiliaries_;
1187 std::multimap<size_t, size_t> added_double_constants_;
1188 std::multimap<size_t, size_t> added_integer_constants_;
1189 std::multimap<size_t, size_t> added_char_constants_;
1190 std::multimap<size_t, size_t> added_string_constants_;
1191 std::map<std::string, std::pair<std::string, std::string> > local_variables_;
1192 std::vector<std::string> local_cleanup_;
1194 std::map<std::string, std::string> local_default_;
1195 std::map<const void *, casadi_int> file_scope_double_;
1196 std::map<const void *, casadi_int> file_scope_integer_;
1197 std::vector< std::vector<double> > pool_double_defaults_;
1198 std::map<std::string, casadi_int> pool_double_;
1199 std::map<const FunctionInternal*, std::set<std::string> > local_mutexes_;
1202 std::map<const FunctionInternal*, size_t> codegen_sz_w_;
1205 struct FunctionMeta {
1209 std::string codegen_name;
1211 std::vector<FunctionMeta> added_functions_;
1214 std::map<std::string, std::map<FunctionInternal*, casadi_int> > added_wrappers_;
1217 std::vector<std::vector<double> > double_constants_;
1218 std::vector<std::vector<casadi_int> > integer_constants_;
1219 std::vector<std::vector<char> > char_constants_;
1220 std::vector<std::vector<std::string> > string_constants_;
1226 static size_t hash(
const std::vector<double>& v);
1227 static size_t hash(
const std::vector<casadi_int>& v);
1228 static size_t hash(
const std::vector<char>& v);
1229 static size_t hash(
const std::vector<std::string>& v);
1231 std::string wrapper(
const Function& base,
const std::string& name);
1234 template<
typename T>
1235 static bool equal(
const std::vector<T>& v1,
const std::vector<T>& v2) {
1236 if (v1.size()!=v2.size())
return false;
1237 for (casadi_int j=0; j<v1.size(); ++j) {
1238 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.