9#define PY_SSIZE_T_CLEAN
25using namespace std::string_literals;
38 static char const* kwlist[] = {
"var_descriptor",
"lmodexclusive", NULL};
41 int lmodexclusive = 0;
42 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"(s#i)|p", (
char**)&kwlist,
43 &name, &len, &(var_descr.
id),
47 if (len > COMIN_MAX_LEN_VAR_NAME)
48 return PyErr_Format(PyExc_ValueError,
"Variable name to long!");
50 strncpy(var_descr.
name, name, COMIN_MAX_LEN_VAR_NAME);
53 check_error(
"var_descr: "s + std::string(name) +
", "s +
54 std::to_string(var_descr.
id));
64 static char const* kwlist[] = {
"var_descriptor",
"key",
"value", NULL};
65 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"(s#i)sO", (
char**)&kwlist,
66 &name, &len, &(var_descr.
id), &key, &val))
69 if (len > COMIN_MAX_LEN_VAR_NAME)
70 return PyErr_Format(PyExc_ValueError,
"Variable name to long!");
72 strncpy(var_descr.
name, name, COMIN_MAX_LEN_VAR_NAME);
74 if (PyBool_Check(val)) {
75 comin_metadata_set_logical(var_descr, key, val == Py_True);
76 check_error(
"var_descr: "s + std::string(name) +
", "s +
77 std::to_string(var_descr.
id) +
" key: " + std::string(key));
80 if (PyLong_Check(val)) {
82 long val_l = PyLong_AsLongAndOverflow(val, &overflow);
83 if (val_l > std::numeric_limits<int>::max() ||
84 val_l < std::numeric_limits<int>::min() || overflow != 0) {
85 return PyErr_Format(PyExc_ValueError,
"value is out of the range of int");
87 comin_metadata_set_integer(var_descr, key, val_l);
88 check_error(
"var_descr: "s + std::string(name) +
", "s +
89 std::to_string(var_descr.
id) +
" key: " + std::string(key));
92 if (PyFloat_Check(val)) {
93 double val_d = PyFloat_AsDouble(val);
94 if (val_d == -1. && PyErr_Occurred())
95 return PyErr_Format(PyExc_ValueError,
"value is not a float");
96 comin_metadata_set_real(var_descr, key, val_d);
97 check_error(
"var_descr: "s + std::string(name) +
", "s +
98 std::to_string(var_descr.
id) +
" key: " + std::string(key));
101 if (PyUnicode_Check(val)) {
102 const char* val_str = PyUnicode_AsUTF8(val);
104 return PyErr_Format(PyExc_ValueError,
105 "value cannot be converted to char* (UTF-8)");
106 comin_metadata_set_character(var_descr, key, val_str);
107 check_error(
"var_descr: "s + std::string(name) +
", "s +
108 std::to_string(var_descr.
id) +
" key: " + std::string(key));
111 PyTypeObject* type = val->ob_type;
112 return PyErr_Format(PyExc_ValueError,
113 "comin_metadata_set is not implemented for the provided "
114 "object type (type=%s, name=%s, id=%d, key=%s)",
115 type->tp_name, var_descr.
name, var_descr.
id, key);
129 static char const* kwlist[] = {
"var_descriptor",
"key", NULL};
133 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"(s#i)s", (
char**)&kwlist,
134 &name, &len, &(var_desc.
id), &key))
136 strncpy(var_desc.
name, name, len + 1);
138 check_error(
"var_descr: "s + std::string(name) +
", "s +
139 std::to_string(var_desc.
id) +
" key: " + std::string(key));
140 if (type == COMIN_METADATA_TYPEID_BOOL) {
142 check_error(
"var_descr: "s + std::string(name) +
", "s +
143 std::to_string(var_desc.
id) +
" key: " + std::string(key));
149 if (type == COMIN_METADATA_TYPEID_INT) {
151 check_error(
"var_descr: "s + std::string(name) +
", "s +
152 std::to_string(var_desc.
id) +
" key: " + std::string(key));
153 return PyLong_FromLong(val);
155 if (type == COMIN_METADATA_TYPEID_DOUBLE) {
157 check_error(
"var_descr: "s + std::string(name) +
", "s +
158 std::to_string(var_desc.
id) +
" key: " + std::string(key));
159 return PyFloat_FromDouble(val);
161 if (type == COMIN_METADATA_TYPEID_STRING) {
163 check_error(
"var_descr: "s + std::string(name) +
", "s +
164 std::to_string(var_desc.
id) +
" key: " + std::string(key));
165 return PyUnicode_FromString(val);
167 return PyErr_Format(PyExc_KeyError,
"Key not found: %s", key);
170static PyObject*
var_get(PyObject* , PyObject* args, PyObject* kwargs) {
175 static char const* kwlist[] = {
"context",
"var_descriptor",
"flag", NULL};
178 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O(s#i)|i", (
char**)&kwlist,
179 &context, &name, &len, &(var_desc.
id),
182 strncpy(var_desc.
name, name, len + 1);
184 if (!PyList_Check(context))
185 return PyErr_Format(PyExc_ValueError,
186 "PyCominVar requires list of integers as contexts");
187 std::vector<int> icontext(PyList_Size(context));
188 for (
size_t i = 0; i < icontext.size(); ++i)
189 icontext[i] = (
int)PyLong_AsLong(PyList_GetItem(context, i));
191 t_comin_var_handle* var = comin_var_get(
192 icontext.size(), (t_comin_entry_point*)icontext.data(), var_desc, flag);
193 check_error(
"var_descr: "s + std::string(name) +
", "s +
194 std::to_string(var_desc.
id));
195 return PyCapsule_New(var,
"var", NULL);
200 PyObject* handle_cap;
201 static char const* kwlist[] = {
"handle", NULL};
202 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist,
205 t_comin_var_handle* handle =
206 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap,
"var");
208 comin_var_get_descriptor(handle, &
descr);
210 void* ptr = comin_var_get_ptr(handle);
213 return PyErr_Format(PyExc_ValueError,
"comin_var_get_ptr failed");
215 comin_var_get_shape(handle, shape);
219 check_error(
"'datatype' not set for "s + std::string(
descr.name) +
", id="s +
220 std::to_string(
descr.id));
232 throw std::runtime_error(
"Unknown datatype for "s +
233 std::string(
descr.name) +
", id="s +
234 std::to_string(
descr.id));
237 return PyMemoryView_FromBuffer(&
buffer);
242 PyObject* handle_cap;
243 static char const* kwlist[] = {
"handle", NULL};
244 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist,
247 t_comin_var_handle* handle =
248 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap,
"var");
250 void* ptr = comin_var_get_device_ptr(handle);
252 return PyLong_FromVoidPtr(ptr);
257 PyObject* handle_cap;
258 static char const* kwlist[] = {
"handle", NULL};
259 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist,
262 t_comin_var_handle* handle =
263 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap,
"var");
264 int dim_semantics[5];
265 comin_var_get_dim_semantics(handle, dim_semantics);
267 return Py_BuildValue(
"iiiii", dim_semantics[0], dim_semantics[1],
268 dim_semantics[2], dim_semantics[3], dim_semantics[4]);
273 PyObject* handle_cap;
274 static char const* kwlist[] = {
"handle", NULL};
275 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist,
278 t_comin_var_handle* handle =
279 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap,
"var");
281 comin_var_get_ncontained(handle, &ncontained);
283 return PyLong_FromLong(ncontained);
288 PyObject* handle_cap;
289 static char const* kwlist[] = {
"handle", NULL};
290 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist,
293 t_comin_var_handle* handle =
294 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap,
"var");
296 comin_var_get_descriptor(handle, &
descr);
298 return Py_BuildValue(
"si",
descr.name,
descr.id);
305 return PyCapsule_New(head,
"var_descr_list", NULL);
310 PyObject* py_current;
311 static char const* kwlist[] = {
"current", NULL};
312 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist,
315 t_comin_var_descr_list_iterator* it =
316 (t_comin_var_descr_list_iterator*)PyCapsule_GetPointer(py_current,
323 return PyCapsule_New(next,
"var_descr_list", NULL);
328 PyObject* py_current;
329 static char const* kwlist[] = {
"current", NULL};
330 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist,
333 t_comin_var_descr_list_iterator* current =
334 (t_comin_var_descr_list_iterator*)PyCapsule_GetPointer(py_current,
339 return Py_BuildValue(
"si", var_desc.
name, var_desc.
id);
345 PyObject* py_current;
346 static char const* kwlist[] = {
"current", NULL};
347 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist,
350 t_comin_var_descr_list_iterator* it =
351 (t_comin_var_descr_list_iterator*)PyCapsule_GetPointer(py_current,
363 static char const* kwlist[] = {
"var_descriptor", NULL};
364 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"(s#i)", (
char**)&kwlist,
365 &name, &len, &(var_desc.
id)))
367 strncpy(var_desc.
name, name, COMIN_MAX_LEN_VAR_NAME);
370 std::to_string(var_desc.
id));
371 return PyCapsule_New(it,
"metadata_iterator", NULL);
379 static char const* kwlist[] = {
"var_descriptor", NULL};
380 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"(s#i)", (
char**)&kwlist,
381 &name, &len, &(var_desc.
id)))
383 strncpy(var_desc.
name, name, COMIN_MAX_LEN_VAR_NAME);
386 std::to_string(var_desc.
id));
387 return PyCapsule_New(it,
"metadata_iterator", NULL);
393 static char const* kwlist[] = {
"it", NULL};
394 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist, &py_it))
398 "metadata_iterator");
401 return Py_BuildValue(
"s", key);
406 PyObject *py_it1, *py_it2;
407 static char const* kwlist[] = {
"it1",
"it2", NULL};
408 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"OO", (
char**)&kwlist, &py_it1,
413 "metadata_iterator");
416 "metadata_iterator");
428 static char const* kwlist[] = {
"it", NULL};
429 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist, &py_it))
433 "metadata_iterator");
442 static char const* kwlist[] = {
"it", NULL};
443 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O", (
char**)&kwlist, &py_it))
447 "metadata_iterator");
456 METH_VARARGS | METH_KEYWORDS,
457 "Request the host model to add a variable, arguments:"
458 " (name string, domain id), lmodexclusive"},
460 METH_VARARGS | METH_KEYWORDS,
461 "retrieve metadata, arguments: (name string, domain id) , metadata key"},
463 METH_VARARGS | METH_KEYWORDS,
""},
465 METH_VARARGS | METH_KEYWORDS,
""},
467 METH_VARARGS | METH_KEYWORDS,
""},
469 METH_VARARGS | METH_KEYWORDS,
""},
470 {
"_var_get_dim_semantics",
472 METH_VARARGS | METH_KEYWORDS,
""},
474 METH_VARARGS | METH_KEYWORDS,
""},
476 METH_VARARGS | METH_KEYWORDS,
""},
479 {
"_var_get_descr_list_next",
481 METH_VARARGS | METH_KEYWORDS,
""},
482 {
"_var_get_descr_list_var_desc",
484 METH_VARARGS | METH_KEYWORDS,
""},
485 {
"_var_descr_list_iterator_delete",
487 METH_VARARGS | METH_KEYWORDS,
""},
488 {
"_metadata_get_iterator_begin",
490 METH_VARARGS | METH_KEYWORDS,
""},
491 {
"_metadata_get_iterator_end",
493 METH_VARARGS | METH_KEYWORDS,
""},
494 {
"_metadata_iterator_get_key",
496 METH_VARARGS | METH_KEYWORDS,
""},
497 {
"_metadata_iterator_compare",
499 METH_VARARGS | METH_KEYWORDS,
""},
500 {
"_metadata_iterator_next",
502 METH_VARARGS | METH_KEYWORDS,
""},
503 {
"_metadata_iterator_delete",
505 METH_VARARGS | METH_KEYWORDS,
""},
C interface for the ICON Community Interface.
void comin_var_request_add(t_comin_var_descriptor var_desc, bool lmodexclusive)
void comin_var_descr_list_iterator_delete(t_comin_var_descr_list_iterator **it)
void comin_var_get_descr_list_var_desc(t_comin_var_descr_list_iterator *current, t_comin_var_descriptor *var_desc)
t_comin_var_descr_list_iterator * comin_var_get_descr_list_head()
t_comin_var_descr_list_iterator * comin_var_get_descr_list_next(t_comin_var_descr_list_iterator *current)
char name[COMIN_MAX_LEN_VAR_NAME+1]
static PyObject * var_request_add(PyObject *, PyObject *args, PyObject *kwargs)
Request the host model to add a variable.
int COMIN_VAR_DATATYPE_FLOAT
static PyObject * metadata_get(PyObject *, PyObject *args, PyObject *kwargs)
Retrieve metadata for a variable.
int COMIN_VAR_DATATYPE_DOUBLE
int COMIN_VAR_DATATYPE_INT
static PyObject * var_get_device_ptr(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_buffer(PyObject *self, PyObject *args, PyObject *kwargs)
void check_error(std::string add_info)
static PyObject * metadata_get_iterator_end(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_descr_list_head(PyObject *, PyObject *)
static PyObject * metadata_iterator_compare(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * metadata_iterator_next(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * metadata_set(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_dim_semantics(PyObject *, PyObject *args, PyObject *kwargs)
void fill_buffer(Py_buffer *buffer, void *mem, int *shape, int ndims, int readonly=1)
static PyObject * var_get_ncontained(PyObject *, PyObject *args, PyObject *kwargs)
std::vector< PyMethodDef > variables_methods()
static PyObject * metadata_get_iterator_begin(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_descriptor(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * metadata_iterator_get_key(PyObject *, PyObject *args, PyObject *kwargs)
PyObject * func_wrapper(PyObject *self, PyObject *args)
static PyObject * metadata_iterator_delete(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_descr_list_iterator_delete(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_descr_list_var_desc(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_descr_list_next(PyObject *, PyObject *args, PyObject *kwargs)