From 3341528457bf8e07248fa4e249a7fb134df93d72 Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Thu, 16 Nov 2017 16:23:30 -0500 Subject: save recovery curve --- pyisda/curve.pxd | 1 + pyisda/curve.pyx | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pyisda/curve.pxd b/pyisda/curve.pxd index 4b6b362..c982347 100644 --- a/pyisda/curve.pxd +++ b/pyisda/curve.pxd @@ -199,6 +199,7 @@ cdef class YieldCurve(Curve): cdef class SpreadCurve(Curve): cdef string ticker + cdef public double[:] recovery_rates cdef fArray_to_list(TRatePt* fArray, int fNumItems) diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index c3f91e5..1e64ccb 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -476,7 +476,7 @@ cdef class SpreadCurve(Curve): cdef TCurve* curve = NULL cdef unsigned int includes = 0 cdef size_t i - cdef int freeup = 0 + cdef bint freeup = False if cash_settle_date_c < yc._thisptr.get().fBaseDate: raise ValueError("cash_settle_date: {0} is anterior to yc's base_date: {1}". format(cash_settle_date, yc.base_date)) @@ -484,7 +484,7 @@ cdef class SpreadCurve(Curve): if isinstance(end_dates, list): n_dates = len(end_dates) end_dates_c = malloc(n_dates * sizeof(TDate)) - freeup = 1 + freeup = True i = 0 for d in end_dates: end_dates_c[i] = pydate_to_TDate(d) @@ -525,6 +525,7 @@ cdef class SpreadCurve(Curve): raise ValueError("Didn't init the survival curve properly") else: self._thisptr = make_shared(curve) + self.recovery_rates = recovery_rates if ticker: self.ticker = ticker.encode() @@ -534,14 +535,19 @@ cdef class SpreadCurve(Curve): 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() + \ + sizeof(size_t) + self.recovery_rates.nbytes unsigned char* buf = 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(cursor, size, 0) + cursor += self.ticker.copy(cursor, size, 0) + 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) return buf[:buf_size] def __setstate__(self, bytes state): @@ -549,12 +555,17 @@ cdef class SpreadCurve(Curve): TCurve* curve = malloc(sizeof(TCurve)) unsigned char* cursor = state size_t ticker_length + np.npy_intp size cursor = deserialize(cursor, curve) self._thisptr = make_shared(curve) memcpy(&ticker_length, cursor, sizeof(size_t)) cursor += sizeof(size_t) self.ticker = string(cursor, ticker_length) + 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) def __deepcopy__(self, dict memo): cdef SpreadCurve sc = SpreadCurve.__new__(SpreadCurve) -- cgit v1.2.3-70-g09d2