26 #include "function.hpp"
27 #include "../casadi_c.h"
28 #include "serializer.hpp"
35 static std::vector<Function>& casadi_c_loaded_functions = *
new std::vector<Function>();
36 static std::deque<int>& casadi_c_load_stack = *
new std::deque<int>();
37 static int casadi_c_active = -1;
39 int casadi_c_int_width() {
40 return sizeof(casadi_int);
42 int casadi_c_real_width() {
43 return sizeof(double);
46 int casadi_c_id(
const char* funname) {
48 std::string fname = funname;
49 for (
int i=0;i<casadi_c_loaded_functions.size();++i) {
50 if (fname==casadi_c_loaded_functions.at(i).name()) {
52 std::cerr <<
"Ambiguous function name '" << fname <<
"'" << std::endl;
60 std::cerr <<
"Could not find function named '" << fname <<
"'." << std::endl;
61 std::cerr <<
"Available functions: ";
62 for (
const auto& f : casadi_c_loaded_functions) {
63 std::cerr << f.name() <<
" ";
65 std::cerr << std::endl;
71 int casadi_c_n_loaded() {
return casadi_c_loaded_functions.size(); }
73 inline int casadi_c_push_file_internal(
const char *
filename) {
76 auto type = fs.pop_type();
77 if (type==SerializerBase::SerializationType::SERIALIZED_FUNCTION) {
78 casadi_c_loaded_functions.push_back(fs.blind_unpack_function());
80 }
else if (type==SerializerBase::SerializationType::SERIALIZED_FUNCTION_VECTOR) {
81 for (
const Function& f : fs.blind_unpack_function_vector()) {
82 casadi_c_loaded_functions.push_back(f);
86 std::cerr <<
"Serializer file should contain a 'function' or 'function_vector'. "
90 }
catch (
const std::exception& e) {
91 std::cerr << e.what() << std::endl;
94 std::cerr <<
"Uncaught exception" << std::endl;
99 int casadi_c_push_file(
const char *
filename) {
100 int before = casadi_c_loaded_functions.size();
101 int ret = casadi_c_push_file_internal(
filename);
102 int after = casadi_c_loaded_functions.size();
103 casadi_c_load_stack.push_back(after-before);
107 void casadi_c_clear(
void) {
108 casadi_c_load_stack.clear();
109 casadi_c_loaded_functions.clear();
110 casadi_c_active = -1;
113 void casadi_c_pop(
void) {
114 int count = casadi_c_load_stack.back();
115 casadi_c_load_stack.pop_back();
116 casadi_c_loaded_functions.erase(
117 casadi_c_loaded_functions.begin()+(casadi_c_loaded_functions.size()-count),
118 casadi_c_loaded_functions.end());
121 inline int sanitize_id(
int id) {
122 if (id<0 || id>=casadi_c_loaded_functions.size()) {
123 std::cerr <<
"id " <<
id <<
" is out of range: must be in [0, ";
124 std::cerr << casadi_c_loaded_functions.size() <<
"[" << std::endl;
130 int casadi_c_activate(
int id) {
131 if (sanitize_id(
id))
return -1;
132 casadi_c_active = id;
136 void casadi_c_incref(
void) {}
137 void casadi_c_decref(
void) {}
138 void casadi_c_incref_id(
int id) {}
139 void casadi_c_decref_id(
int id) {}
141 int casadi_c_checkout(
void) {
142 return casadi_c_checkout_id(casadi_c_active);
144 int casadi_c_checkout_id(
int id) {
145 if (sanitize_id(
id))
return -1;
147 return casadi_c_loaded_functions.at(
id).checkout();
148 }
catch (
const std::exception& e) {
149 std::cerr << e.what() << std::endl;
152 std::cerr <<
"Uncaught exception" << std::endl;
157 void casadi_c_release(
int mem) {
158 casadi_c_release_id(casadi_c_active, mem);
160 void casadi_c_release_id(
int id,
int mem) {
163 casadi_c_loaded_functions.at(
id).release(mem);
164 }
catch (
const std::exception& e) {
165 std::cerr << e.what() << std::endl;
167 std::cerr <<
"Uncaught exception" << std::endl;
171 double casadi_c_default_in(casadi_int i) {
172 return casadi_c_default_in_id(casadi_c_active, i);
174 double casadi_c_default_in_id(
int id, casadi_int i) {
175 if (sanitize_id(
id))
return -1;
177 return casadi_c_loaded_functions.at(
id).default_in(i);
178 }
catch (
const std::exception& e) {
179 std::cerr << e.what() << std::endl;
182 std::cerr <<
"Uncaught exception" << std::endl;
187 casadi_int casadi_c_n_in(
void) {
188 return casadi_c_n_in_id(casadi_c_active);
190 casadi_int casadi_c_n_in_id(
int id) {
191 if (sanitize_id(
id))
return -1;
193 return casadi_c_loaded_functions.at(
id).n_in();
194 }
catch (
const std::exception& e) {
195 std::cerr << e.what() << std::endl;
198 std::cerr <<
"Uncaught exception" << std::endl;
203 casadi_int casadi_c_n_out(
void) {
204 return casadi_c_n_out_id(casadi_c_active);
206 casadi_int casadi_c_n_out_id(
int id) {
207 if (sanitize_id(
id))
return -1;
209 return casadi_c_loaded_functions.at(
id).n_out();
210 }
catch (
const std::exception& e) {
211 std::cerr << e.what() << std::endl;
214 std::cerr <<
"Uncaught exception" << std::endl;
219 const char* casadi_c_name() {
220 return casadi_c_name_id(casadi_c_active);
222 const char* casadi_c_name_id(
int id) {
223 if (sanitize_id(
id))
return "";
224 static std::string name;
225 name = casadi_c_loaded_functions.at(
id).name();
229 const char* casadi_c_name_in(casadi_int i) {
230 return casadi_c_name_in_id(casadi_c_active, i);
232 const char* casadi_c_name_in_id(
int id, casadi_int i) {
233 if (sanitize_id(
id))
return "";
235 return casadi_c_loaded_functions.at(
id).name_in(i).c_str();
236 }
catch (
const std::exception& e) {
237 std::cerr << e.what() << std::endl;
240 std::cerr <<
"Uncaught exception" << std::endl;
245 const char* casadi_c_name_out(casadi_int i) {
246 return casadi_c_name_out_id(casadi_c_active, i);
248 const char* casadi_c_name_out_id(
int id, casadi_int i) {
249 if (sanitize_id(
id))
return "";
251 return casadi_c_loaded_functions.at(
id).name_out(i).c_str();
252 }
catch (
const std::exception& e) {
253 std::cerr << e.what() << std::endl;
256 std::cerr <<
"Uncaught exception" << std::endl;
261 const casadi_int* casadi_c_sparsity_in(casadi_int i) {
262 return casadi_c_sparsity_in_id(casadi_c_active, i);
264 const casadi_int* casadi_c_sparsity_in_id(
int id, casadi_int i) {
265 if (sanitize_id(
id))
return nullptr;
267 return casadi_c_loaded_functions.at(
id).sparsity_in(i);
268 }
catch (
const std::exception& e) {
269 std::cerr << e.what() << std::endl;
272 std::cerr <<
"Uncaught exception" << std::endl;
277 const casadi_int* casadi_c_sparsity_out(casadi_int i) {
278 return casadi_c_sparsity_out_id(casadi_c_active, i);
280 const casadi_int* casadi_c_sparsity_out_id(
int id, casadi_int i) {
281 if (sanitize_id(
id))
return nullptr;
283 return casadi_c_loaded_functions.at(
id).sparsity_out(i);
284 }
catch (
const std::exception& e) {
285 std::cerr << e.what() << std::endl;
288 std::cerr <<
"Uncaught exception" << std::endl;
293 int casadi_c_work(casadi_int *sz_arg, casadi_int* sz_res,
294 casadi_int *sz_iw, casadi_int *sz_w) {
295 return casadi_c_work_id(casadi_c_active, sz_arg, sz_res, sz_iw, sz_w);
298 int casadi_c_work_id(
int id, casadi_int *sz_arg, casadi_int* sz_res,
299 casadi_int *sz_iw, casadi_int *sz_w) {
300 if (sanitize_id(
id))
return -1;
302 *sz_arg = casadi_c_loaded_functions.at(
id).sz_arg();
303 *sz_res = casadi_c_loaded_functions.at(
id).sz_res();
304 *sz_iw = casadi_c_loaded_functions.at(
id).sz_iw();
305 *sz_w = casadi_c_loaded_functions.at(
id).sz_w();
306 }
catch (
const std::exception& e) {
307 std::cerr << e.what() << std::endl;
310 std::cerr <<
"Uncaught exception" << std::endl;
316 int casadi_c_eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
int mem) {
317 return casadi_c_eval_id(casadi_c_active, arg, res, iw, w, mem);
320 int casadi_c_eval_id(
int id,
const double** arg,
double** res, casadi_int* iw,
double* w,
int mem) {
321 if (sanitize_id(
id))
return -1;
323 return casadi_c_loaded_functions.at(
id)(arg, res, iw, w, mem);
324 }
catch (
const std::exception& e) {
325 std::cerr << e.what() << std::endl;
328 std::cerr <<
"Uncaught exception" << std::endl;
335 void casadi_c_logger_write(
const char* msg,
int num) {
339 void casadi_c_logger_flush(
void) {
static std::string type_to_string(SerializationType type)
std::string filename(const std::string &path)