26 #ifndef CASADI_CODE_GENERATOR_HPP
27 #define CASADI_CODE_GENERATOR_HPP
29 #include "function.hpp"
34 #include <type_traits>
50 void add(
const Function& f,
bool with_jac_sparsity=
false);
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);
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);
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>
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);
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);
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;
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.
bool codegen_scalars
Codegen scalar.
std::string constant(const std::vector< int > &v)
Represent an array constant; adding it when new.
std::stringstream includes
std::set< std::string > added_externals_
std::set< std::string > external_names_
std::vector< std::string > added_sfunctions
std::map< std::string, casadi_int > pool_double_
std::set< std::string > added_includes_
std::string casadi_real_type
std::multimap< Auxiliary, std::vector< std::string > > added_auxiliaries_
std::map< std::string, std::pair< std::string, std::string > > local_variables_
void indent()
Increase indentation.
bool thread_safe() const
Emit thead safe code chekout/release?
std::vector< std::string > local_cleanup_
std::map< std::string, std::string > local_default_
std::map< const FunctionInternal *, std::set< std::string > > local_mutexes_
std::vector< std::vector< char > > char_constants_
std::string casadi_int_type
std::string dump_dir_suffix
std::vector< std::vector< double > > pool_double_defaults_
std::set< std::string > added_runtimes_
std::string dump_dir_prefix
std::multimap< size_t, size_t > added_double_constants_
casadi_int current_indent_
casadi_int max_initializer_elements_per_line
void unindent()
Decrease indentation.
std::vector< std::vector< double > > double_constants_
std::map< const FunctionInternal *, size_t > codegen_sz_w_
std::vector< std::vector< casadi_int > > integer_constants_
std::multimap< size_t, size_t > added_char_constants_
std::vector< std::vector< std::string > > string_constants_
std::map< const void *, casadi_int > file_scope_integer_
casadi_int max_declarations_per_line
std::vector< FunctionMeta > added_functions_
Auxiliary
Auxiliary functions.
@ AUX_BLAZING_5D_BOOR_EVAL
@ AUX_KRON_CONTRACT_INNER_DENSE
@ AUX_KRON_CONTRACT_INNER
@ AUX_BLAZING_2D_BOOR_EVAL
@ AUX_BLAZING_4D_BOOR_EVAL
@ AUX_KRON_CONTRACT_OUTER_SPARSE_DENSE
@ AUX_KRON_CONTRACT_OUTER_DENSE_SPARSE
@ AUX_BLAZING_1D_BOOR_EVAL
@ AUX_KRON_CONTRACT_OUTER_DENSE
@ AUX_INTERPN_INTERPOLATE
@ AUX_KRON_CONTRACT_OUTER
@ AUX_KRON_CONTRACT_INNER_SPARSE_DENSE
@ AUX_BLAZING_3D_BOOR_EVAL
@ AUX_KRON_CONTRACT_INNER_DENSE_SPARSE
@ AUX_MTIMES_DENSE_SPARSE
std::map< std::string, std::map< FunctionInternal *, casadi_int > > added_wrappers_
CodeGenerator & operator<<(T s)
Print an arbitrary type to buffer.
std::multimap< size_t, size_t > added_integer_constants_
std::multimap< size_t, size_t > added_string_constants_
std::map< const void *, casadi_int > file_scope_double_
std::string initializer(const std::vector< T > &v)
Print an initializer.
bool avoid_stack() const
Avoid stack?
std::set< std::string > sparsity_meta
std::vector< std::string > exposed_fname
casadi_int padding_length_
std::set< std::string > added_shorthands_
static bool equal(const std::vector< T > &v1, const std::vector< T > &v2)
std::stringstream auxiliaries
T norm_1(const std::vector< T > &x)
T norm_inf(const std::vector< T > &x)
std::string str(const T &v)
String representation, any type.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
void copy(const T1 *x, casadi_int n, T2 *y)
T dot(const std::vector< T > &a, const std::vector< T > &b)
const double nan
Not a number.
std::ostream & operator<<(std::ostream &stream, const std::vector< T > &v)
Enables flushing an std::vector to a stream (prints representation)
T norm_2(const std::vector< T > &x)