diff options
| -rw-r--r-- | pyisda/curve.pxd | 6 | ||||
| -rw-r--r-- | pyisda/curve.pyx | 30 | ||||
| -rw-r--r-- | pyisda/flat_hazard.pyx | 2 |
3 files changed, 25 insertions, 13 deletions
diff --git a/pyisda/curve.pxd b/pyisda/curve.pxd index 698e6cf..532a530 100644 --- a/pyisda/curve.pxd +++ b/pyisda/curve.pxd @@ -53,13 +53,13 @@ cdef extern from "isda/cds.h" nogil: # Array of size nbDate TDate *endDates, # Coupon rates for each benchmark instrument. Array of size nbDate - const double *couponRates, - const double *upfrontRates, + const double *couponRates, + const double *upfrontRates, # Flags to denote that we include particular benchmarks. This makes it # easy for the user to include or exclude benchmarks on a one-by-one # basis. Can be NULL if all are included. Otherwise an array of size # nbDate. - const TBoolean *includes, + const unsigned int includes, # Recovery rate in case of default const double* recoveryRate, # Should accrued interest be paid on default. Usually set to TRUE diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index 6039616..3f9ece2 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -372,8 +372,9 @@ cdef class SpreadCurve(Curve): """ @cython.boundscheck(False) @cython.wraparound(False) + @cython.initializedcheck(False) def __init__(self, today, YieldCurve yc, start_date, step_in_date, - cash_settle_date, list end_dates, + cash_settle_date, end_dates, double[:] coupon_rates, double[:] upfront_rates, double[:] recovery_rates, bint pay_accrued_on_default=True): @@ -382,17 +383,27 @@ cdef class SpreadCurve(Curve): cdef TDate cash_settle_date_c = pydate_to_TDate(cash_settle_date) cdef TDate start_date_c = pydate_to_TDate(start_date) cdef int n_dates = len(end_dates) - cdef TDate* end_dates_c = <TDate*>malloc(n_dates * sizeof(TDate)) + cdef TDate* end_dates_c = NULL + cdef TDate[:] end_dates_view cdef TCurve* curve = NULL - cdef TBoolean* includes = <TBoolean*>calloc(n_dates, sizeof(TBoolean)) + cdef unsigned int includes = 0 cdef size_t i 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)) - for i, d in enumerate(end_dates): - end_dates_c[i] = pydate_to_TDate(d) - if upfront_rates[i] == upfront_rates[i]: - includes[i] = 1 + + if isinstance(end_dates, list): + end_dates_c = <TDate*>malloc(n_dates * sizeof(TDate)) + end_dates_view = <TDate[:n_dates]>end_dates_c + for i, d in enumerate(end_dates): + end_dates_view[i] = pydate_to_TDate(d) + if upfront_rates[i] == upfront_rates[i]: + includes |= 1 << i + else: + end_dates_view = memoryview(end_dates) + for i in range(n_dates): + if upfront_rates[i] == upfront_rates[i]: + includes |= 1 << i cdef TStubMethod stub_type if JpmcdsStringToStubMethod(b"f/s", &stub_type) != 0: @@ -404,7 +415,7 @@ cdef class SpreadCurve(Curve): step_in_date_c, cash_settle_date_c, n_dates, - end_dates_c, + &end_dates_view[0], &coupon_rates[0], &upfront_rates[0], includes, @@ -415,7 +426,8 @@ cdef class SpreadCurve(Curve): &stub_type, <long>'M', b'NONE') - free(end_dates_c) + if end_dates_c: + free(end_dates_c) if curve == NULL: raise ValueError("Didn't init the survival curve properly") else: diff --git a/pyisda/flat_hazard.pyx b/pyisda/flat_hazard.pyx index 363ef95..88cd82a 100644 --- a/pyisda/flat_hazard.pyx +++ b/pyisda/flat_hazard.pyx @@ -60,7 +60,7 @@ def strike_vec(double[:] spreads, YieldCurve yc, trade_date, value_date, &end_date_c, &spreads[i], &zero_upfront, - NULL, + 0, &recovery_rate, 1, # pay_accrued_on_default True NULL, |
