diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2017-11-20 18:04:52 -0500 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2017-11-21 10:51:22 -0500 |
| commit | 1404e6197c10de950f61a02b61e368090899a37e (patch) | |
| tree | bc959b15cab7d14d961aae2e65fa3913d791893c | |
| parent | a0bd01cbd6cf7d360207f357139ef0b4928cc155 (diff) | |
| download | pyisda-1404e6197c10de950f61a02b61e368090899a37e.tar.gz | |
no need for separate struct
| -rw-r--r-- | pyisda/credit_index.pxd | 4 | ||||
| -rw-r--r-- | pyisda/curve.pxd | 6 | ||||
| -rw-r--r-- | pyisda/curve.pyx | 63 |
3 files changed, 32 insertions, 41 deletions
diff --git a/pyisda/credit_index.pxd b/pyisda/credit_index.pxd index 961130d..0cf8cf8 100644 --- a/pyisda/credit_index.pxd +++ b/pyisda/credit_index.pxd @@ -1,6 +1,6 @@ from legs cimport TContingentLeg, TFeeLeg from date cimport TDate -from curve cimport TCurve, TRatePt, shared_ptr, Carray +from curve cimport TCurve, TRatePt, shared_ptr from libcpp.vector cimport vector from libcpp.unordered_map cimport unordered_map from libcpp.string cimport string @@ -11,7 +11,7 @@ cdef class CurveList: cdef vector[double] T cdef vector[shared_ptr[TCurve]] curves cdef unordered_map[string, size_t] tickers - cdef vector[Carray] recovery_rates + cdef vector[shared_ptr[double]] recovery_rates cdef class CreditIndex(CurveList): cdef TDate start_date diff --git a/pyisda/curve.pxd b/pyisda/curve.pxd index 6432d40..daec974 100644 --- a/pyisda/curve.pxd +++ b/pyisda/curve.pxd @@ -197,13 +197,9 @@ cdef class Curve: cdef class YieldCurve(Curve): cdef vector[TDate] dates -ctypedef struct Carray: - shared_ptr[double] data - size_t size - cdef class SpreadCurve(Curve): cdef string ticker - cdef Carray recovery_rates + cdef shared_ptr[double] recovery_rates cdef fArray_to_list(TRatePt* fArray, int fNumItems) diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index 26b3c79..e852d3d 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -530,10 +530,11 @@ cdef class SpreadCurve(Curve): raise ValueError("Didn't init the survival curve properly") else: self._thisptr = make_shared(curve) - self.recovery_rates.size = recovery_rates.shape[0] * sizeof(double) - self.recovery_rates.data = shared_ptr[double](<double*>malloc(self.recovery_rates.size), - double_free) - memcpy(<void*>self.recovery_rates.data.get(), &recovery_rates[0], self.recovery_rates.size) + self.recovery_rates = shared_ptr[double]( + <double*>malloc(curve.fNumItems * sizeof(double)), + double_free) + memcpy(<void*>self.recovery_rates.get(), &recovery_rates[0], + curve.fNumItems * sizeof(double)) if ticker: self.ticker = ticker.encode() @@ -546,7 +547,7 @@ cdef class SpreadCurve(Curve): 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.size + curve.fNumItems * sizeof(double) unsigned char* buf = <unsigned char*>malloc(buf_size) unsigned char* cursor = buf + size serialize(curve, buf) @@ -554,10 +555,8 @@ cdef class SpreadCurve(Curve): memcpy(cursor, &size, sizeof(size_t)) cursor += sizeof(size_t) cursor += self.ticker.copy(<char*>cursor, size, 0) - size = self.recovery_rates.size - memcpy(cursor, &size, sizeof(size_t)) - cursor += sizeof(size_t) - memcpy(cursor, self.recovery_rates.data.get(), self.recovery_rates.size) + size = self._thisptr.get().fNumItems * sizeof(double) + memcpy(cursor, self.recovery_rates.get(), size) return <bytes>buf[:buf_size] @cython.initializedcheck(False) @@ -566,8 +565,7 @@ cdef class SpreadCurve(Curve): cdef: TCurve* curve = <TCurve*>malloc(sizeof(TCurve)) unsigned char* cursor = state - size_t ticker_length - np.npy_intp size + size_t ticker_length, size double* temp cursor = deserialize(cursor, curve) self._thisptr = make_shared(curve) @@ -575,21 +573,18 @@ cdef class SpreadCurve(Curve): cursor += sizeof(size_t) self.ticker = string(<char*>cursor, ticker_length) cursor += ticker_length - memcpy(&size, cursor, sizeof(size_t)) - self.recovery_rates.size = size - self.recovery_rates.data = shared_ptr[double](<double*>malloc(self.recovery_rates.size), - double_free) - cursor += sizeof(size_t) - memcpy(self.recovery_rates.data.get(), cursor, size) + size = curve.fNumItems * sizeof(double) + self.recovery_rates = shared_ptr[double](<double*>malloc(size), + double_free) + memcpy(self.recovery_rates.get(), cursor, size) def __deepcopy__(self, dict memo): cdef SpreadCurve sc = SpreadCurve.__new__(SpreadCurve) + cdef size_t size = self._thisptr.get().fNumItems * sizeof(double) sc._thisptr = make_shared(JpmcdsCopyCurve(self._thisptr.get())) sc.ticker = self.ticker - sc.recovery_rates.data = shared_ptr[double](<double*>malloc(self.recovery_rates.size), - double_free) - memcpy(sc.recovery_rates.data.get(), self.recovery_rates.data.get(), self.recovery_rates.size) - sc.recovery_rates.size = self.recovery_rates.size + sc.recovery_rates= shared_ptr[double](<double*>malloc(size), double_free) + memcpy(sc.recovery_rates.get(), self.recovery_rates.get(), size) memo[id(self)] = sc return sc @@ -613,25 +608,23 @@ cdef class SpreadCurve(Curve): memcpy(&ticker_length, cursor, sizeof(size_t)) cursor += sizeof(size_t) instance.ticker = string(<char*>cursor, ticker_length) - memcpy(&size, cursor, sizeof(size_t)) - instance.recovery_rates.size = size - instance.recovery_rates.data = shared_ptr[double](<double*>malloc(size), double_free) - cursor += sizeof(size_t) - memcpy(instance.recovery_rates.data.get(), cursor, size) + size = curve.fNumItems * sizeof(double) + instance.recovery_rates = shared_ptr[double]( + <double*>malloc(size), double_free) + memcpy(instance.recovery_rates.get(), cursor, size) return instance def __hash__(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() + size_t buf_size = size + sizeof(size_t) + self.ticker.length() + \ + curve.fNumItems * sizeof(double) unsigned char* buf = <unsigned char*>malloc(buf_size) unsigned char* cursor = buf + size serialize(curve, buf) - size = self.ticker.length() - memcpy(cursor, &size, sizeof(size_t)) - cursor += sizeof(size_t) - self.ticker.copy(<char*>cursor, size, 0) + cursor += self.ticker.copy(<char*>cursor, self.ticker.length(), 0) + memcpy(cursor, self.recovery_rates.get(), curve.fNumItems * sizeof(double)) cdef uint64_t r = Hash64(<char*>buf, buf_size) free(buf) return r @@ -691,6 +684,8 @@ cdef class SpreadCurve(Curve): curve_tweaked = JpmcdsCopyCurve(self._thisptr.get()) sc._thisptr = make_shared(curve_tweaked) sc.ticker = self.ticker + # memcpy(sc.recovery_rates.get(), self.recovery_rates.get(), + # self._thisptr.get().fNumItems * sizeof(double)) sc.recovery_rates = self.recovery_rates else: sc = self @@ -758,10 +753,10 @@ cdef class SpreadCurve(Curve): @property def recovery_rates(self): - cdef np.npy_intp* shape = <np.npy_intp*>&self.recovery_rates.size + cdef np.npy_intp shape = <np.npy_intp>self._thisptr.get().fNumItems cdef np.ndarray[np.float64_t] out = \ - np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, - self.recovery_rates.data.get()) + np.PyArray_SimpleNewFromData(1, &shape, np.NPY_DOUBLE, + self.recovery_rates.get()) return out @cython.boundscheck(False) |
