summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyisda/credit_index.pyx97
1 files changed, 50 insertions, 47 deletions
diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx
index 6f52651..44d345e 100644
--- a/pyisda/credit_index.pyx
+++ b/pyisda/credit_index.pyx
@@ -45,6 +45,9 @@ cdef TContingentLeg* copyContingentLeg(TContingentLeg* leg) nogil:
memcpy(new_leg, leg, sizeof(TContingentLeg))
return new_leg
+cdef inline void double_free(double* ptr) nogil:
+ free(ptr)
+
@cython.auto_pickle(False)
cdef class CurveList:
@@ -176,27 +179,27 @@ cdef class CurveList:
self._weights.clear()
CurveList.__init__(self, 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
+ 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
+ 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
def __reduce__(self):
return (self.__class__, (self.curves, self.weights,
@@ -230,34 +233,34 @@ 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))
+ 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
+ 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
def __reduce__(self):
return (self.__class__,