26 #ifndef CASADI_CODE_GENERATOR_HPP
27 #define CASADI_CODE_GENERATOR_HPP
29 #include "function.hpp"
49 void add(
const Function& f,
bool with_jac_sparsity=
false);
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);
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);
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>
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);
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);
696 void add_auxiliary(Auxiliary f,
const std::vector<std::string>& inst = {
"casadi_real"});
701 void add_io_sparsities(
const std::string& name,
702 const std::vector<Sparsity>& sp_in,
703 const std::vector<Sparsity>& sp_out);
706 std::string work(casadi_int n, casadi_int sz,
bool is_ref)
const;
709 std::string workel(casadi_int n)
const;
714 void reserve_work(casadi_int n);
717 static std::string array(
const std::string& type,
const std::string& name, casadi_int len,
718 const std::string& def=std::string());
723 void print_vector(std::ostream &s,
const std::string& name,
724 const std::vector<casadi_int>& v);
729 void print_vector(std::ostream &s,
const std::string& name,
730 const std::vector<char>& v);
735 void print_vector(std::ostream &s,
const std::string& name,
736 const std::vector<double>& v);
741 void print_vector(std::ostream &s,
const std::string& name,
742 const std::vector<std::string>& v);
747 std::string
copy(
const std::string& arg, std::size_t n,
const std::string& res);
748 void copy_check(
const std::string& arg, std::size_t n,
const std::string& res,
749 bool check_lhs=
true,
bool check_rhs=
true);
750 void copy_default(
const std::string& arg, std::size_t n,
const std::string& res,
751 const std::string& def,
bool check_rhs=
true);
754 bool elide_copy(casadi_int sz);
759 std::string fill(
const std::string& res, std::size_t n,
const std::string& v);
764 std::string clear(
const std::string& res, std::size_t n);
769 std::string arg(casadi_int i)
const;
774 std::string res(casadi_int i)
const;
779 std::string mem(
const Function& f);
784 std::string project(
const std::string& arg,
const Sparsity& sp_arg,
785 const std::string& res,
const Sparsity& sp_res,
786 const std::string& w);
791 std::string tri_project(
const std::string& arg,
const Sparsity& sp_arg,
792 const std::string& res,
bool lower);
797 std::string densify(
const std::string& arg,
const Sparsity& sp_arg,
798 const std::string& res,
bool tr=
false);
803 std::string sparsify(
const std::string& arg,
const std::string& res,
804 const Sparsity& sp_res,
bool tr=
false);
809 std::string to_mex(
const Sparsity& sp,
const std::string& arg);
814 std::string from_mex(std::string& arg,
815 const std::string& res, std::size_t res_off,
const Sparsity& sp_res,
816 const std::string& w);
821 static std::string fmu_helpers(
const std::string& modelname);
826 std::string printf(
const std::string&
str,
827 const std::vector<std::string>& arg=std::vector<std::string>());
828 std::string printf(
const std::string&
str,
const std::string& arg1);
829 std::string printf(
const std::string&
str,
const std::string& arg1,
const std::string& arg2);
830 std::string printf(
const std::string&
str,
const std::string& arg1,
const std::string& arg2,
831 const std::string& arg3);
836 std::string print_op(casadi_int op,
const std::string& a0);
837 std::string print_op(casadi_int op,
const std::string& a0,
const std::string& a1);
842 std::string file_slurp(
const std::string& fname, casadi_int n,
const std::string& a);
847 std::string cache_check(
const std::string& key,
const std::string& cache,
848 const std::string& loc, casadi_int stride, casadi_int sz, casadi_int key_sz,
849 const std::string& val);
852 static std::string casadi_version();
855 static void file_open(std::ofstream& f,
const std::string& name,
bool cpp);
858 static void file_close(std::ofstream& f,
bool cpp);
863 void sz_work(
size_t& sz_arg,
size_t& sz_res,
size_t& sz_iw,
size_t& sz_w)
const;
868 void generate_casadi_real(std::ostream &s)
const;
871 void generate_casadi_int(std::ostream &s)
const;
874 void generate_mex(std::ostream &s)
const;
877 std::string codegen_sfunction(
const Function& f)
const;
880 void generate_sfunction(
const std::string& name,
const std::string& sfunction)
const;
883 void generate_main(std::ostream &s)
const;
886 void generate_export_symbol(std::ostream &s)
const;
889 void generate_import_symbol(std::ostream &s)
const;
1030 static size_t hash(
const std::vector<double>& v);
1031 static size_t hash(
const std::vector<casadi_int>& v);
1032 static size_t hash(
const std::vector<char>& v);
1033 static size_t hash(
const std::vector<std::string>& v);
1035 std::string wrapper(
const Function& base,
const std::string& name);
1038 template<
typename T>
1039 static bool equal(
const std::vector<T>& v1,
const std::vector<T>& v2) {
1040 if (v1.size()!=v2.size())
return false;
1041 for (casadi_int j=0; j<v1.size(); ++j) {
1042 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::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.
std::map< std::string, std::string > local_default_
std::vector< std::vector< char > > char_constants_
std::string casadi_int_type
std::vector< std::vector< double > > pool_double_defaults_
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::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_2D_BOOR_EVAL
@ AUX_BLAZING_1D_BOOR_EVAL
@ AUX_INTERPN_INTERPOLATE
@ AUX_BLAZING_3D_BOOR_EVAL
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::ostream & operator<<(std::ostream &stream, const XmlNode &node)
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.
T norm_2(const std::vector< T > &x)