summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2017-11-17 15:00:41 -0500
committerGuillaume Horel <guillaume.horel@gmail.com>2017-11-17 15:24:09 -0500
commita05f8b80149ee9c8f0cb402d5649f83dcccdd55d (patch)
tree51faede33d1249a0a146f6ad3696ec4168c2fc66
parentfaae175f2ffff1002c5e03e3cc332562200fe6eb (diff)
downloadpyisda-a05f8b80149ee9c8f0cb402d5649f83dcccdd55d.tar.gz
try to fix the memoryview code
-rw-r--r--pyisda/curve.pyx14
1 files 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 = <unsigned char*>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 <bytes>buf[:buf_size]
+ @cython.initializedcheck(False)
def __setstate__(self, bytes state):
cdef:
TCurve* curve = <TCurve*>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(<char*>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()