from cpython cimport datetime from libc.stdlib cimport malloc, free from pyisda.zerocurve cimport JpmcdsBuildIRZeroCurve from pyisda.yearfrac cimport dcc from pyisda.convert cimport JpmcdsStringToDateInterval, JpmcdsDateIntervalToFreq, JpmcdsDate cdef int SUCCESS = 0 cdef class Tcurve: cdef TCurve* _thisptr cdef TDate* _dates def __cinit__(self, date, str types, list dates, double[:] rates, str mm_dcc, str fixed_swap_period, str float_swap_period, str fixed_swap_dcc, str float_swap_dcc, char bad_day_conv, char* holidayFile): cdef: double fixed_freq double float_freq TDateInterval ivl char* routine = 'zerocurve' TDate value_date if isinstance(date, datetime.date): value_date = JpmcdsDate(date.year, date.month, date.day) else: raise ValueError cdef TDate* _dates = malloc(len(dates) * sizeof(TDate)) for i, d in enumerate(date): _dates[i] = JpmcdsDate(d.year, d.month, d.day) fixed_bytes = fixed_swap_period.encode('utf-8') float_bytes = float_swap_period.encode('utf-8') types_bytes = types.encode('utf-8') if JpmcdsStringToDateInterval(fixed_bytes, routine, &ivl) != SUCCESS: raise ValueError if JpmcdsDateIntervalToFreq(&ivl, &fixed_freq) != SUCCESS: raise ValueError if JpmcdsStringToDateInterval(float_bytes, routine, &ivl) != SUCCESS: raise ValueError if JpmcdsDateIntervalToFreq(&ivl, &float_freq) != SUCCESS: raise ValueError self._thisptr = JpmcdsBuildIRZeroCurve( value_date, types_bytes, _dates, &rates[0], len(dates), dcc(mm_dcc), fixed_freq, float_freq, dcc(fixed_swap_dcc), dcc(fixed_swap_dcc), bad_day_conv, "None" ) def __dealloc__(self): if self._thisptr is not NULL: JpmcdsFreeTCurve(self._thisptr) if self._dates is not NULL: free(self._dates) def discount_factor(self, date): cdef TDate discount_date if isinstance(date, datetime.date): discount_date = JpmcdsDate(date.year, date.month, date.day) else: raise ValueError return JpmcdsZeroPrice(self._thisptr, discount_date)