summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyisda/credit_index.pyx75
-rw-r--r--pyisda/curve.pyx3
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)