26 #ifndef CASADI_MAP_HPP
27 #define CASADI_MAP_HPP
29 #include "function_internal.hpp"
39 class CASADI_EXPORT Map :
public FunctionInternal {
42 static Function create(
const std::string& parallelization,
43 const Function& f, casadi_int n);
53 std::string class_name()
const override {
return "Map";}
58 bool is_a(
const std::string& type,
bool recursive)
const override;
61 virtual std::vector<std::string> get_function()
const override;
64 const Function& get_function(
const std::string &name)
const override;
67 bool has_function(
const std::string& fname)
const override;
73 Sparsity get_sparsity_in(casadi_int i)
override {
74 return repmat(f_.sparsity_in(i), 1, n_);
76 Sparsity get_sparsity_out(casadi_int i)
override {
77 return repmat(f_.sparsity_out(i), 1, n_);
84 double get_default_in(casadi_int ind)
const override {
return f_.default_in(ind);}
90 size_t get_n_in()
override {
return f_.n_in();}
91 size_t get_n_out()
override {
return f_.n_out();}
98 std::string get_name_in(casadi_int i)
override {
return f_.name_in(i);}
99 std::string get_name_out(casadi_int i)
override {
return f_.name_out(i);}
106 int eval_gen(
const T** arg, T** res, casadi_int* iw, T* w,
int mem=0)
const;
109 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
112 virtual std::string parallelization()
const {
return "serial"; }
117 int eval_sx(
const SXElem** arg, SXElem** res,
118 casadi_int* iw, SXElem* w,
void* mem)
const override;
123 int sp_forward(
const bvec_t** arg, bvec_t** res,
124 casadi_int* iw, bvec_t* w,
void* mem)
const override;
129 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w,
void* mem)
const override;
133 bool has_spfwd()
const override {
return true;}
134 bool has_sprev()
const override {
return true;}
140 bool has_codegen()
const override {
return true;}
145 void codegen_declarations(CodeGenerator& g)
const override;
150 void codegen_body(CodeGenerator& g)
const override;
155 void init(
const Dict& opts)
override;
161 bool has_forward(casadi_int nfwd)
const override {
return true;}
162 Function get_forward(casadi_int nfwd,
const std::string& name,
163 const std::vector<std::string>& inames,
164 const std::vector<std::string>& onames,
165 const Dict& opts)
const override;
172 bool has_reverse(casadi_int nadj)
const override {
return true;}
173 Function get_reverse(casadi_int nadj,
const std::string& name,
174 const std::vector<std::string>& inames,
175 const std::vector<std::string>& onames,
176 const Dict& opts)
const override;
180 Dict info()
const override {
return {{
"f", f_}, {
"n", n_}}; }
185 void serialize_body(SerializingStream &s)
const override;
189 void serialize_type(SerializingStream &s)
const override;
194 std::string serialize_base_function()
const override {
return "Map"; }
199 static ProtoFunction* deserialize(DeserializingStream& s);
205 explicit Map(DeserializingStream& s);
208 Map(
const std::string& name,
const Function& f, casadi_int n);
224 class CASADI_EXPORT OmpMap :
public Map {
228 OmpMap(
const std::string& name,
const Function& f, casadi_int n) : Map(name, f, n) {}
238 std::string class_name()
const override {
return "OmpMap";}
243 bool is_a(
const std::string& type,
bool recursive)
const override;
246 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
251 void init(
const Dict& opts)
override;
254 std::string parallelization()
const override {
return "openmp"; }
259 void codegen_body(CodeGenerator& g)
const override;
265 explicit OmpMap(DeserializingStream& s) : Map(s) {}
275 class CASADI_EXPORT ThreadMap :
public Map {
279 ThreadMap(
const std::string& name,
const Function& f, casadi_int n) : Map(name, f, n) {}
284 ~ThreadMap()
override;
289 std::string class_name()
const override {
return "ThreadMap";}
294 bool is_a(
const std::string& type,
bool recursive)
const override;
297 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
302 void init(
const Dict& opts)
override;
305 std::string parallelization()
const override {
return "thread"; }
310 void codegen_body(CodeGenerator& g)
const override;
316 explicit ThreadMap(DeserializingStream& s) : Map(s) {}
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.