From 43cd9a00af77489ff4c0413e060e0b276d6d6bb4 Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Thu, 11 May 2017 16:38:14 -0400 Subject: include is a bitset --- pyisda/curve.pxd | 6 +++--- pyisda/curve.pyx | 30 +++++++++++++++++++++--------- 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 = malloc(n_dates * sizeof(TDate)) + cdef TDate* end_dates_c = NULL + cdef TDate[:] end_dates_view cdef TCurve* curve = NULL - cdef TBoolean* includes = 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 = malloc(n_dates * sizeof(TDate)) + end_dates_view = 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, '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, -- cgit v1.2.3-70-g09d2