diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2017-11-16 16:23:30 -0500 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2017-11-16 16:23:30 -0500 |
| commit | 3341528457bf8e07248fa4e249a7fb134df93d72 (patch) | |
| tree | 95fe3c65262ddffbe214d9fa976ea3e75c0a2d16 | |
| parent | d6268113ac807e7f137b54aed71f07486645c3fb (diff) | |
| download | pyisda-3341528457bf8e07248fa4e249a7fb134df93d72.tar.gz | |
save recovery curve
| -rw-r--r-- | pyisda/curve.pxd | 1 | ||||
| -rw-r--r-- | 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 = <TDate*>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 = <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, 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 <bytes>buf[:buf_size] def __setstate__(self, bytes state): @@ -549,12 +555,17 @@ cdef class SpreadCurve(Curve): TCurve* curve = <TCurve*>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(<char*>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) |
