From 3cbd0d4a7b00463a440c39ab354e19fb0388c019 Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Fri, 28 Apr 2023 14:05:46 -0400 Subject: update par_spread --- pyisda/curve.pyx | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index 5ae18b8..9df876b 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -960,8 +960,9 @@ cdef class SpreadCurve(Curve): # return sc @cython.boundscheck(False) - def par_spread(self, today, step_in_date, start_date, end_dates, - const double[:] recovery_rates, YieldCurve yc not None, + def par_spread(self, today, step_in_date, start_date, YieldCurve yc not None, + list end_dates=None, + const double[:] recovery_rates=None, bint pay_accrued_on_default=True, str calendar="NONE"): """ @@ -972,11 +973,21 @@ cdef class SpreadCurve(Curve): cdef TDate today_c = pydate_to_TDate(today) cdef TDate step_in_date_c = pydate_to_TDate(step_in_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 size_t i - for i, d in enumerate(end_dates): - end_dates_c[i] = pydate_to_TDate(d) + cdef size_t i, n_dates + cdef const TCurve* curve = self.get_TCurve() + cdef const double* recoveries + if end_dates is None: + n_dates = curve.fNumItems + end_dates_c = malloc(n_dates * sizeof(TDate)) + for i in range(n_dates): + end_dates_c[i] = curve.fArray[i].fDate + recoveries = self.recovery_rates_ptr() + else: + n_dates = len(end_dates) + end_dates_c = malloc(n_dates * sizeof(TDate)) + for i, d in enumerate(end_dates): + end_dates_c[i] = pydate_to_TDate(d) + recoveries = &recovery_rates[0] cdef double* par_spreads cdef const char* c_cal = calendar @@ -1000,8 +1011,8 @@ cdef class SpreadCurve(Curve): MODIFIED, c_cal, yc.get_TCurve(), - self.get_TCurve(), - &recovery_rates[0], + curve, + recoveries, par_spreads) free(end_dates_c) cdef list r = [] -- cgit v1.2.3-70-g09d2