diff options
| -rw-r--r-- | pyisda/credit_index.pyx | 97 |
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__, |
