diff options
author | shumkovnd <shumkovnd@yandex-team.com> | 2023-11-10 14:39:34 +0300 |
---|---|---|
committer | shumkovnd <shumkovnd@yandex-team.com> | 2023-11-10 16:42:24 +0300 |
commit | 77eb2d3fdcec5c978c64e025ced2764c57c00285 (patch) | |
tree | c51edb0748ca8d4a08d7c7323312c27ba1a8b79a /contrib/python/matplotlib/py2/src/_contour_wrapper.cpp | |
parent | dd6d20cadb65582270ac23f4b3b14ae189704b9d (diff) | |
download | ydb-77eb2d3fdcec5c978c64e025ced2764c57c00285.tar.gz |
KIKIMR-19287: add task_stats_drawing script
Diffstat (limited to 'contrib/python/matplotlib/py2/src/_contour_wrapper.cpp')
-rw-r--r-- | contrib/python/matplotlib/py2/src/_contour_wrapper.cpp | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/contrib/python/matplotlib/py2/src/_contour_wrapper.cpp b/contrib/python/matplotlib/py2/src/_contour_wrapper.cpp new file mode 100644 index 0000000000..eedc8a1aec --- /dev/null +++ b/contrib/python/matplotlib/py2/src/_contour_wrapper.cpp @@ -0,0 +1,203 @@ +#include "src/_contour.h" +#include "src/mplutils.h" +#include "src/py_exceptions.h" + +/* QuadContourGenerator */ + +typedef struct +{ + PyObject_HEAD + QuadContourGenerator* ptr; +} PyQuadContourGenerator; + +static PyTypeObject PyQuadContourGeneratorType; + +static PyObject* PyQuadContourGenerator_new(PyTypeObject* type, PyObject* args, PyObject* kwds) +{ + PyQuadContourGenerator* self; + self = (PyQuadContourGenerator*)type->tp_alloc(type, 0); + self->ptr = NULL; + return (PyObject*)self; +} + +const char* PyQuadContourGenerator_init__doc__ = + "QuadContourGenerator(x, y, z, mask, corner_mask, chunk_size)\n" + "\n" + "Create a new C++ QuadContourGenerator object\n"; + +static int PyQuadContourGenerator_init(PyQuadContourGenerator* self, PyObject* args, PyObject* kwds) +{ + QuadContourGenerator::CoordinateArray x, y, z; + QuadContourGenerator::MaskArray mask; + int corner_mask; + long chunk_size; + + if (!PyArg_ParseTuple(args, "O&O&O&O&il", + &x.converter_contiguous, &x, + &y.converter_contiguous, &y, + &z.converter_contiguous, &z, + &mask.converter_contiguous, &mask, + &corner_mask, + &chunk_size)) { + return -1; + } + + if (x.empty() || y.empty() || z.empty() || + y.dim(0) != x.dim(0) || z.dim(0) != x.dim(0) || + y.dim(1) != x.dim(1) || z.dim(1) != x.dim(1)) { + PyErr_SetString(PyExc_ValueError, + "x, y and z must all be 2D arrays with the same dimensions"); + return -1; + } + + if (z.dim(0) < 2 || z.dim(1) < 2) { + PyErr_SetString(PyExc_ValueError, + "x, y and z must all be at least 2x2 arrays"); + return -1; + } + + // Mask array is optional, if set must be same size as other arrays. + if (!mask.empty() && (mask.dim(0) != x.dim(0) || mask.dim(1) != x.dim(1))) { + PyErr_SetString(PyExc_ValueError, + "If mask is set it must be a 2D array with the same dimensions as x."); + return -1; + } + + CALL_CPP_INIT("QuadContourGenerator", + (self->ptr = new QuadContourGenerator( + x, y, z, mask, corner_mask, chunk_size))); + return 0; +} + +static void PyQuadContourGenerator_dealloc(PyQuadContourGenerator* self) +{ + delete self->ptr; + Py_TYPE(self)->tp_free((PyObject *)self); +} + +const char* PyQuadContourGenerator_create_contour__doc__ = + "create_contour(level)\n" + "\n" + "Create and return a non-filled contour."; + +static PyObject* PyQuadContourGenerator_create_contour(PyQuadContourGenerator* self, PyObject* args, PyObject* kwds) +{ + double level; + if (!PyArg_ParseTuple(args, "d:create_contour", &level)) { + return NULL; + } + + PyObject* result; + CALL_CPP("create_contour", (result = self->ptr->create_contour(level))); + return result; +} + +const char* PyQuadContourGenerator_create_filled_contour__doc__ = + "create_filled_contour(lower_level, upper_level)\n" + "\n" + "Create and return a filled contour"; + +static PyObject* PyQuadContourGenerator_create_filled_contour(PyQuadContourGenerator* self, PyObject* args, PyObject* kwds) +{ + double lower_level, upper_level; + if (!PyArg_ParseTuple(args, "dd:create_filled_contour", + &lower_level, &upper_level)) { + return NULL; + } + + if (lower_level >= upper_level) + { + PyErr_SetString(PyExc_ValueError, + "filled contour levels must be increasing"); + return NULL; + } + + PyObject* result; + CALL_CPP("create_filled_contour", + (result = self->ptr->create_filled_contour(lower_level, + upper_level))); + return result; +} + +static PyTypeObject* PyQuadContourGenerator_init_type(PyObject* m, PyTypeObject* type) +{ + static PyMethodDef methods[] = { + {"create_contour", (PyCFunction)PyQuadContourGenerator_create_contour, METH_VARARGS, PyQuadContourGenerator_create_contour__doc__}, + {"create_filled_contour", (PyCFunction)PyQuadContourGenerator_create_filled_contour, METH_VARARGS, PyQuadContourGenerator_create_filled_contour__doc__}, + {NULL} + }; + + memset(type, 0, sizeof(PyTypeObject)); + type->tp_name = "matplotlib.QuadContourGenerator"; + type->tp_doc = PyQuadContourGenerator_init__doc__; + type->tp_basicsize = sizeof(PyQuadContourGenerator); + type->tp_dealloc = (destructor)PyQuadContourGenerator_dealloc; + type->tp_flags = Py_TPFLAGS_DEFAULT; + type->tp_methods = methods; + type->tp_new = PyQuadContourGenerator_new; + type->tp_init = (initproc)PyQuadContourGenerator_init; + + if (PyType_Ready(type) < 0) { + return NULL; + } + + if (PyModule_AddObject(m, "QuadContourGenerator", (PyObject*)type)) { + return NULL; + } + + return type; +} + + +/* Module */ + +extern "C" { + +#if PY3K +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "_contour", + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +#define INITERROR return NULL + +PyMODINIT_FUNC PyInit__contour(void) + +#else +#define INITERROR return + +PyMODINIT_FUNC init_contour(void) +#endif + +{ + PyObject *m; + +#if PY3K + m = PyModule_Create(&moduledef); +#else + m = Py_InitModule3("_contour", NULL, NULL); +#endif + + if (m == NULL) { + INITERROR; + } + + if (!PyQuadContourGenerator_init_type(m, &PyQuadContourGeneratorType)) { + INITERROR; + } + + import_array(); + +#if PY3K + return m; +#endif +} + +} // extern "C" |