Changes in src/sas/sascalc/pr/c_extensions/Cinvertor.c [7ba6470:a52f32f] in sasview
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sascalc/pr/c_extensions/Cinvertor.c
r7ba6470 ra52f32f 5 5 * 6 6 */ 7 #include <Python.h> 8 #include "structmember.h" 7 9 #include <stdio.h> 8 10 #include <stdlib.h> … … 10 12 #include <time.h> 11 13 12 //#define Py_LIMITED_API 0x0305000013 #include <Python.h>14 #include <structmember.h>15 16 // Vector binding glue17 #if (PY_VERSION_HEX > 0x03000000) && !defined(Py_LIMITED_API)18 // Assuming that a view into a writable vector points to a19 // non-changing pointer for the duration of the C call, capture20 // the view pointer and immediately free the view.21 #define VECTOR(VEC_obj, VEC_buf, VEC_len) do { \22 Py_buffer VEC_view; \23 int VEC_err = PyObject_GetBuffer(VEC_obj, &VEC_view, PyBUF_WRITABLE|PyBUF_FORMAT); \24 if (VEC_err < 0 || sizeof(*VEC_buf) != VEC_view.itemsize) return NULL; \25 VEC_buf = (typeof(VEC_buf))VEC_view.buf; \26 VEC_len = VEC_view.len/sizeof(*VEC_buf); \27 PyBuffer_Release(&VEC_view); \28 } while (0)29 #else30 #define VECTOR(VEC_obj, VEC_buf, VEC_len) do { \31 int VEC_err = PyObject_AsWriteBuffer(VEC_obj, (void **)(&VEC_buf), &VEC_len); \32 if (VEC_err < 0) return NULL; \33 VEC_len /= sizeof(*VEC_buf); \34 } while (0)35 #endif36 37 14 #include "invertor.h" 15 38 16 39 17 /// Error object for raised exceptions 40 18 PyObject * CinvertorError; 19 20 #define INVECTOR(obj,buf,len) \ 21 do { \ 22 int err = PyObject_AsReadBuffer(obj, (const void **)(&buf), &len); \ 23 if (err < 0) return NULL; \ 24 len /= sizeof(*buf); \ 25 } while (0) 26 27 #define OUTVECTOR(obj,buf,len) \ 28 do { \ 29 int err = PyObject_AsWriteBuffer(obj, (void **)(&buf), &len); \ 30 if (err < 0) return NULL; \ 31 len /= sizeof(*buf); \ 32 } while (0) 33 41 34 42 35 // Class definition … … 106 99 107 100 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 108 VECTOR(data_obj,data,ndata);101 OUTVECTOR(data_obj,data,ndata); 109 102 110 103 free(self->params.x); … … 138 131 139 132 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 140 VECTOR(data_obj, data, ndata);133 OUTVECTOR(data_obj, data, ndata); 141 134 142 135 // Check that the input array is large enough … … 171 164 172 165 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 173 VECTOR(data_obj,data,ndata);166 OUTVECTOR(data_obj,data,ndata); 174 167 175 168 free(self->params.y); … … 203 196 204 197 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 205 VECTOR(data_obj, data, ndata);198 OUTVECTOR(data_obj, data, ndata); 206 199 207 200 // Check that the input array is large enough … … 236 229 237 230 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 238 VECTOR(data_obj,data,ndata);231 OUTVECTOR(data_obj,data,ndata); 239 232 240 233 free(self->params.err); … … 268 261 269 262 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 270 VECTOR(data_obj, data, ndata);263 OUTVECTOR(data_obj, data, ndata); 271 264 272 265 // Check that the input array is large enough … … 524 517 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 525 518 526 VECTOR(data_obj,pars,npars);519 OUTVECTOR(data_obj,pars,npars); 527 520 528 521 // PyList of residuals … … 575 568 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 576 569 577 VECTOR(data_obj,pars,npars);570 OUTVECTOR(data_obj,pars,npars); 578 571 579 572 // Should create this list only once and refill it … … 616 609 617 610 if (!PyArg_ParseTuple(args, "Od", &data_obj, &q)) return NULL; 618 VECTOR(data_obj,pars,npars);611 OUTVECTOR(data_obj,pars,npars); 619 612 620 613 iq_value = iq(pars, self->params.d_max, (int)npars, q); … … 641 634 642 635 if (!PyArg_ParseTuple(args, "Od", &data_obj, &q)) return NULL; 643 VECTOR(data_obj,pars,npars);636 OUTVECTOR(data_obj,pars,npars); 644 637 645 638 iq_value = iq_smeared(pars, self->params.d_max, (int)npars, … … 666 659 667 660 if (!PyArg_ParseTuple(args, "Od", &data_obj, &r)) return NULL; 668 VECTOR(data_obj,pars,npars);661 OUTVECTOR(data_obj,pars,npars); 669 662 670 663 pr_value = pr(pars, self->params.d_max, (int)npars, r); … … 693 686 694 687 if (!PyArg_ParseTuple(args, "OOd", &data_obj, &err_obj, &r)) return NULL; 695 VECTOR(data_obj,pars,npars);688 OUTVECTOR(data_obj,pars,npars); 696 689 697 690 if (err_obj == Py_None) { … … 699 692 pr_err_value = 0.0; 700 693 } else { 701 VECTOR(err_obj,pars_err,npars2);694 OUTVECTOR(err_obj,pars_err,npars2); 702 695 pr_err(pars, pars_err, self->params.d_max, (int)npars, r, &pr_value, &pr_err_value); 703 696 } … … 733 726 734 727 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 735 VECTOR(data_obj,pars,npars);728 OUTVECTOR(data_obj,pars,npars); 736 729 737 730 oscill = reg_term(pars, self->params.d_max, (int)npars, 100); … … 754 747 755 748 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 756 VECTOR(data_obj,pars,npars);749 OUTVECTOR(data_obj,pars,npars); 757 750 758 751 count = npeaks(pars, self->params.d_max, (int)npars, 100); … … 775 768 776 769 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 777 VECTOR(data_obj,pars,npars);770 OUTVECTOR(data_obj,pars,npars); 778 771 779 772 fraction = positive_integral(pars, self->params.d_max, (int)npars, 100); … … 799 792 800 793 if (!PyArg_ParseTuple(args, "OO", &data_obj, &err_obj)) return NULL; 801 VECTOR(data_obj,pars,npars);802 VECTOR(err_obj,pars_err,npars2);794 OUTVECTOR(data_obj,pars,npars); 795 OUTVECTOR(err_obj,pars_err,npars2); 803 796 804 797 fraction = positive_errors(pars, pars_err, self->params.d_max, (int)npars, 51); … … 820 813 821 814 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 822 VECTOR(data_obj,pars,npars);815 OUTVECTOR(data_obj,pars,npars); 823 816 824 817 value = rg(pars, self->params.d_max, (int)npars, 101); … … 840 833 841 834 if (!PyArg_ParseTuple(args, "O", &data_obj)) return NULL; 842 VECTOR(data_obj,pars,npars);835 OUTVECTOR(data_obj,pars,npars); 843 836 844 837 value = 4.0*acos(-1.0)*int_pr(pars, self->params.d_max, (int)npars, 101); … … 881 874 882 875 if (!PyArg_ParseTuple(args, "iiOO", &nfunc, &nr, &a_obj, &b_obj)) return NULL; 883 VECTOR(a_obj,a,n_a);884 VECTOR(b_obj,b,n_b);876 OUTVECTOR(a_obj,a,n_a); 877 OUTVECTOR(b_obj,b,n_b); 885 878 886 879 assert(n_b>=nfunc); … … 954 947 955 948 if (!PyArg_ParseTuple(args, "iiOO", &nfunc, &nr, &a_obj, &cov_obj)) return NULL; 956 VECTOR(a_obj,a,n_a);957 VECTOR(cov_obj,inv_cov,n_cov);949 OUTVECTOR(a_obj,a,n_a); 950 OUTVECTOR(cov_obj,inv_cov,n_cov); 958 951 959 952 assert(n_cov>=nfunc*nfunc); … … 988 981 989 982 if (!PyArg_ParseTuple(args, "iiO", &nfunc, &nr, &a_obj)) return NULL; 990 VECTOR(a_obj,a,n_a);983 OUTVECTOR(a_obj,a,n_a); 991 984 992 985 assert(n_a>=nfunc*(nr+self->params.npoints)); … … 1128 1121 1129 1122 #define MODULE_DOC "C extension module for inversion to P(r)." 1130 #define MODULE_NAME " _pr_inversion"1131 #define MODULE_INIT2 init _pr_inversion1132 #define MODULE_INIT3 PyInit_ _pr_inversion1123 #define MODULE_NAME "pr_inversion" 1124 #define MODULE_INIT2 initpr_inversion 1125 #define MODULE_INIT3 PyInit_pr_inversion 1133 1126 #define MODULE_METHODS module_methods 1134 1127
Note: See TracChangeset
for help on using the changeset viewer.