26 #include "function.hpp"
27 #include "../casadi_c.h"
28 #include "serializer.hpp"
33 static std::vector<Function> casadi_c_loaded_functions;
34 static std::deque<int> casadi_c_load_stack;
35 static int casadi_c_active = -1;
37 int casadi_c_int_width() {
38 return sizeof(casadi_int);
40 int casadi_c_real_width() {
41 return sizeof(double);
44 int casadi_c_id(
const char* funname) {
46 std::string fname = funname;
47 for (
int i=0;i<casadi_c_loaded_functions.size();++i) {
48 if (fname==casadi_c_loaded_functions.at(i).name()) {
50 std::cerr <<
"Ambiguous function name '" << fname <<
"'" << std::endl;
58 std::cerr <<
"Could not find function named '" << fname <<
"'." << std::endl;
59 std::cerr <<
"Available functions: ";
60 for (
const auto& f : casadi_c_loaded_functions) {
61 std::cerr << f.name() <<
" ";
63 std::cerr << std::endl;
69 int casadi_c_n_loaded() {
return casadi_c_loaded_functions.size(); }
71 inline int casadi_c_push_file_internal(
const char *
filename) {
74 auto type = fs.pop_type();
75 if (type==SerializerBase::SerializationType::SERIALIZED_FUNCTION) {
76 casadi_c_loaded_functions.push_back(fs.blind_unpack_function());
78 }
else if (type==SerializerBase::SerializationType::SERIALIZED_FUNCTION_VECTOR) {
79 for (
const Function& f : fs.blind_unpack_function_vector()) {
80 casadi_c_loaded_functions.push_back(f);
84 std::cerr <<
"Serializer file should contain a 'function' or 'function_vector'. "
88 }
catch (
const std::exception& e) {
89 std::cerr << e.what() << std::endl;
92 std::cerr <<
"Uncaught exception" << std::endl;
97 int casadi_c_push_file(
const char *
filename) {
98 int before = casadi_c_loaded_functions.size();
99 int ret = casadi_c_push_file_internal(
filename);
100 int after = casadi_c_loaded_functions.size();
101 casadi_c_load_stack.push_back(after-before);
105 void casadi_c_clear(
void) {
106 casadi_c_load_stack.clear();
107 casadi_c_loaded_functions.clear();
108 casadi_c_active = -1;
111 void casadi_c_pop(
void) {
112 int count = casadi_c_load_stack.back();
113 casadi_c_load_stack.pop_back();
114 casadi_c_loaded_functions.erase(
115 casadi_c_loaded_functions.begin()+(casadi_c_loaded_functions.size()-count),
116 casadi_c_loaded_functions.end());
119 inline int sanitize_id(
int id) {
120 if (id<0 || id>=casadi_c_loaded_functions.size()) {
121 std::cerr <<
"id " <<
id <<
" is out of range: must be in [0, ";
122 std::cerr << casadi_c_loaded_functions.size() <<
"[" << std::endl;
128 int casadi_c_activate(
int id) {
129 if (sanitize_id(
id))
return -1;
130 casadi_c_active = id;
134 void casadi_c_incref(
void) {}
135 void casadi_c_decref(
void) {}
136 void casadi_c_incref_id(
int id) {}
137 void casadi_c_decref_id(
int id) {}
139 int casadi_c_checkout(
void) {
140 return casadi_c_checkout_id(casadi_c_active);
142 int casadi_c_checkout_id(
int id) {
143 if (sanitize_id(
id))
return -1;
145 return casadi_c_loaded_functions.at(
id).checkout();
146 }
catch (
const std::exception& e) {
147 std::cerr << e.what() << std::endl;
150 std::cerr <<
"Uncaught exception" << std::endl;
155 void casadi_c_release(
int mem) {
156 casadi_c_release_id(casadi_c_active, mem);
158 void casadi_c_release_id(
int id,
int mem) {
161 casadi_c_loaded_functions.at(
id).release(mem);
162 }
catch (
const std::exception& e) {
163 std::cerr << e.what() << std::endl;
165 std::cerr <<
"Uncaught exception" << std::endl;
169 double casadi_c_default_in(casadi_int i) {
170 return casadi_c_default_in_id(casadi_c_active, i);
172 double casadi_c_default_in_id(
int id, casadi_int i) {
173 if (sanitize_id(
id))
return -1;
175 return casadi_c_loaded_functions.at(
id).default_in(i);
176 }
catch (
const std::exception& e) {
177 std::cerr << e.what() << std::endl;
180 std::cerr <<
"Uncaught exception" << std::endl;
185 casadi_int casadi_c_n_in(
void) {
186 return casadi_c_n_in_id(casadi_c_active);
188 casadi_int casadi_c_n_in_id(
int id) {
189 if (sanitize_id(
id))
return -1;
191 return casadi_c_loaded_functions.at(
id).n_in();
192 }
catch (
const std::exception& e) {
193 std::cerr << e.what() << std::endl;
196 std::cerr <<
"Uncaught exception" << std::endl;
201 casadi_int casadi_c_n_out(
void) {
202 return casadi_c_n_out_id(casadi_c_active);
204 casadi_int casadi_c_n_out_id(
int id) {
205 if (sanitize_id(
id))
return -1;
207 return casadi_c_loaded_functions.at(
id).n_out();
208 }
catch (
const std::exception& e) {
209 std::cerr << e.what() << std::endl;
212 std::cerr <<
"Uncaught exception" << std::endl;
217 const char* casadi_c_name() {
218 return casadi_c_name_id(casadi_c_active);
220 const char* casadi_c_name_id(
int id) {
221 if (sanitize_id(
id))
return "";
222 static std::string name;
223 name = casadi_c_loaded_functions.at(
id).name();
227 const char* casadi_c_name_in(casadi_int i) {
228 return casadi_c_name_in_id(casadi_c_active, i);
230 const char* casadi_c_name_in_id(
int id, casadi_int i) {
231 if (sanitize_id(
id))
return "";
233 return casadi_c_loaded_functions.at(
id).name_in(i).c_str();
234 }
catch (
const std::exception& e) {
235 std::cerr << e.what() << std::endl;
238 std::cerr <<
"Uncaught exception" << std::endl;
243 const char* casadi_c_name_out(casadi_int i) {
244 return casadi_c_name_out_id(casadi_c_active, i);
246 const char* casadi_c_name_out_id(
int id, casadi_int i) {
247 if (sanitize_id(
id))
return "";
249 return casadi_c_loaded_functions.at(
id).name_out(i).c_str();
250 }
catch (
const std::exception& e) {
251 std::cerr << e.what() << std::endl;
254 std::cerr <<
"Uncaught exception" << std::endl;
259 const casadi_int* casadi_c_sparsity_in(casadi_int i) {
260 return casadi_c_sparsity_in_id(casadi_c_active, i);
262 const casadi_int* casadi_c_sparsity_in_id(
int id, casadi_int i) {
263 if (sanitize_id(
id))
return nullptr;
265 return casadi_c_loaded_functions.at(
id).sparsity_in(i);
266 }
catch (
const std::exception& e) {
267 std::cerr << e.what() << std::endl;
270 std::cerr <<
"Uncaught exception" << std::endl;
275 const casadi_int* casadi_c_sparsity_out(casadi_int i) {
276 return casadi_c_sparsity_out_id(casadi_c_active, i);
278 const casadi_int* casadi_c_sparsity_out_id(
int id, casadi_int i) {
279 if (sanitize_id(
id))
return nullptr;
281 return casadi_c_loaded_functions.at(
id).sparsity_out(i);
282 }
catch (
const std::exception& e) {
283 std::cerr << e.what() << std::endl;
286 std::cerr <<
"Uncaught exception" << std::endl;
291 int casadi_c_work(casadi_int *sz_arg, casadi_int* sz_res,
292 casadi_int *sz_iw, casadi_int *sz_w) {
293 return casadi_c_work_id(casadi_c_active, sz_arg, sz_res, sz_iw, sz_w);
296 int casadi_c_work_id(
int id, casadi_int *sz_arg, casadi_int* sz_res,
297 casadi_int *sz_iw, casadi_int *sz_w) {
298 if (sanitize_id(
id))
return -1;
300 *sz_arg = casadi_c_loaded_functions.at(
id).sz_arg();
301 *sz_res = casadi_c_loaded_functions.at(
id).sz_res();
302 *sz_iw = casadi_c_loaded_functions.at(
id).sz_iw();
303 *sz_w = casadi_c_loaded_functions.at(
id).sz_w();
304 }
catch (
const std::exception& e) {
305 std::cerr << e.what() << std::endl;
308 std::cerr <<
"Uncaught exception" << std::endl;
314 int casadi_c_eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
int mem) {
315 return casadi_c_eval_id(casadi_c_active, arg, res, iw, w, mem);
318 int casadi_c_eval_id(
int id,
const double** arg,
double** res, casadi_int* iw,
double* w,
int mem) {
319 if (sanitize_id(
id))
return -1;
321 return casadi_c_loaded_functions.at(
id)(arg, res, iw, w, mem);
322 }
catch (
const std::exception& e) {
323 std::cerr << e.what() << std::endl;
326 std::cerr <<
"Uncaught exception" << std::endl;
333 void casadi_c_logger_write(
const char* msg,
int num) {
337 void casadi_c_logger_flush(
void) {
static std::string type_to_string(SerializationType type)
std::string filename(const std::string &path)