summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyisda/curve.pxd1
-rw-r--r--pyisda/curve.pyx19
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)