diff options
| -rw-r--r-- | pyisda/credit_index.pyx | 75 | ||||
| -rw-r--r-- | pyisda/curve.pyx | 3 |
2 files changed, 75 insertions, 3 deletions
diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx index bdf9a6a..77f41cf 100644 --- a/pyisda/credit_index.pyx +++ b/pyisda/credit_index.pyx @@ -1,6 +1,7 @@ #cython: cdivision=True, boundscheck=False from libc.stdlib cimport malloc, free from libc.math cimport nan +from libc.string cimport memcpy from libcpp.pair cimport pair from cython.operator cimport dereference as deref from cpython cimport PyObject, Py_INCREF @@ -19,6 +20,29 @@ np.import_array() import numpy as np import pandas as pd +cdef inline shared_ptr[TCurve] make_shared(TCurve* ptr) nogil: + return shared_ptr[TCurve](ptr, JpmcdsFreeTCurve) + +cdef inline void double_free(double* ptr) nogil: + free(ptr) + +cdef TFeeLeg* copyFeeLeg(TFeeLeg* leg) nogil: + cdef TFeeLeg* new_leg = <TFeeLeg*>malloc(sizeof(TFeeLeg)) + cdef size_t size = leg.nbDates * sizeof(TDate) + memcpy(new_leg, leg, sizeof(TFeeLeg)) + new_leg.accStartDates = <TDate*>malloc(size) + new_leg.accEndDates = <TDate*>malloc(size) + new_leg.payDates = <TDate*>malloc(size) + memcpy(new_leg.accStartDates, leg.accStartDates, size) + memcpy(new_leg.accEndDates, leg.accEndDates, size) + memcpy(new_leg.payDates, leg.payDates, size) + return new_leg + +cdef TContingentLeg* copyContingentLeg(TContingentLeg* leg) nogil: + cdef TContingentLeg* new_leg = <TContingentLeg*>malloc(sizeof(TContingentLeg)) + memcpy(new_leg, leg, sizeof(TContingentLeg)) + return new_leg + cdef class CurveList: @cython.initializedcheck(False) @@ -154,6 +178,28 @@ cdef class CurveList: for i in range(self.curves.size()): self.weights[i] /= len_l + def __deepcopy__(self, memo): + cdef: + shared_ptr[TCurve] sc + double* temp + size_t i = 0 + TCurve* copy_sc + CurveList copy = CurveList.__new__(CurveList) + copy.weights = self.weights + copy.T = self.T + copy.base_date = self.base_date + + for sc in self.curves: + copy_sc = sc.get() + copy.curves.push_back(make_shared(JpmcdsCopyCurve(copy_sc))) + temp = <double*>malloc(copy_sc.fNumItems * sizeof(double)) + if temp != NULL: + memcpy(<void*>temp, self.recovery_rates[i].get(), + copy_sc.fNumItems * sizeof(double)) + copy.recovery_rates.push_back(shared_ptr[double](temp, double_free)) + copy.tickers = self.tickers + return copy + cdef class CreditIndex(CurveList): def __init__(self, start_date, maturities, list curves, double[:] weights=None): CurveList.__init__(self, curves, weights) @@ -195,6 +241,35 @@ cdef class CreditIndex(CurveList): for i in range(self.maturities.size()): JpmcdsFeeLegFree(self.fee_legs[i]) + def __deepcopy__(self, memo): + cdef: + shared_ptr[TCurve] sc + double* temp + size_t i = 0 + TCurve* copy_sc + CreditIndex copy = CreditIndex.__new__(CreditIndex) + copy.weights = self.weights + copy.T = self.T + copy.base_date = self.base_date + copy.start_date = self.start_date + copy.maturities = self.maturities + for sc in self.curves: + copy_sc = sc.get() + copy.curves.push_back(make_shared(JpmcdsCopyCurve(copy_sc))) + temp = <double*>malloc(copy_sc.fNumItems * sizeof(double)) + if temp != NULL: + memcpy(<void*>temp, self.recovery_rates[i].get(), + copy_sc.fNumItems * sizeof(double)) + copy.recovery_rates.push_back(shared_ptr[double](temp, double_free)) + + copy.tickers = self.tickers + copy.contingent_legs = <TContingentLeg**>malloc(sizeof(TContingentLeg*) * self.maturities.size()) + copy.fee_legs = <TFeeLeg**>malloc(sizeof(TFeeLeg*) * self.maturities.size()) + for i in range(self.maturities.size()): + copy.fee_legs[i] = copyFeeLeg(self.fee_legs[i]) + copy.contingent_legs[i] = copyContingentLeg(self.contingent_legs[i]) + return copy + #@cython.initializedcheck(False) def pv_vec(self, step_in_date, value_date, YieldCurve yc, double recovery_rate): cdef: diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index e852d3d..438dc7f 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -1,7 +1,4 @@ -from libc.stdlib cimport malloc, free, calloc from libc.math cimport log1p, log -from libcpp.vector cimport vector -from libcpp.string cimport string from date cimport (JpmcdsStringToDateInterval, pydate_to_TDate, dcc, JpmcdsDateIntervalToFreq, JpmcdsDateFwdThenAdjust, TDate_to_pydate, JpmcdsDateFromBusDaysOffset, JpmcdsStringToDayCountConv, ACT_360) |
