From a05f8b80149ee9c8f0cb402d5649f83dcccdd55d Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Fri, 17 Nov 2017 15:00:41 -0500 Subject: try to fix the memoryview code --- pyisda/curve.pyx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index acf4720..aad22e8 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -21,6 +21,8 @@ from numpy cimport npy_intp cdef extern from "Python.h": int PyMemoryView_Check(object) Py_buffer *PyMemoryView_GET_BUFFER(object) + object PyMemoryView_FromMemory(char* mem, Py_ssize_t data, int flags) + cdef int PyBUF_READ cdef extern from "numpy/arrayobject.h": void PyArray_ENABLEFLAGS(np.ndarray arr, int flags) @@ -453,7 +455,8 @@ cdef class SpreadCurve(Curve): cash_settle_date: :class:`datetime.date` end_dates : list of :class:`datetime.date` coupon_rates : :class:`array.array` of double - recovery_rate : float + upfront_rates : double[:] + recovery_rates : double[:] pay_accrued_on_default : bool, optional Default to True @@ -531,12 +534,13 @@ cdef class SpreadCurve(Curve): survival_probability = Curve.__forward_zero_price + @cython.initializedcheck(False) def __getstate__(self): cdef: TCurve* curve = self._thisptr.get() size_t size = TCurve_size(curve.fNumItems) size_t buf_size = size + sizeof(size_t) + self.ticker.length() + \ - sizeof(size_t) + self.recovery_rates.nbytes + sizeof(size_t) + sizeof(double) * self.recovery_rates.shape[0] unsigned char* buf = malloc(buf_size) unsigned char* cursor = buf + size serialize(curve, buf) @@ -547,9 +551,10 @@ cdef class SpreadCurve(Curve): size = self.recovery_rates.size memcpy(cursor, &size, sizeof(size_t)) cursor += sizeof(size_t) - memcpy(cursor, &self.recovery_rates[0], self.recovery_rates.nbytes) + memcpy(cursor, &self.recovery_rates[0], sizeof(double) * self.recovery_rates.shape[0]) return buf[:buf_size] + @cython.initializedcheck(False) def __setstate__(self, bytes state): cdef: TCurve* curve = malloc(sizeof(TCurve)) @@ -565,7 +570,7 @@ cdef class SpreadCurve(Curve): cursor += ticker_length memcpy(&size, cursor, sizeof(size_t)) cursor += sizeof(size_t) - self.recovery_rates = np.PyArray_SimpleNewFromData(1, &size, np.NPY_DOUBLE, cursor) + self.recovery_rates = PyMemoryView_FromMemory(cursor, size, PyBUF_READ) def __deepcopy__(self, dict memo): cdef SpreadCurve sc = SpreadCurve.__new__(SpreadCurve) @@ -667,6 +672,7 @@ cdef class SpreadCurve(Curve): curve_tweaked = JpmcdsCopyCurve(self._thisptr.get()) sc._thisptr = make_shared(curve_tweaked) sc.ticker = self.ticker + sc.recovery_rates = self.recovery_rates else: sc = self curve_tweaked = self._thisptr.get() -- cgit v1.2.3-70-g09d2