diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2023-05-31 11:07:32 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2023-05-31 11:07:32 -0400 |
| commit | 0142aa5313090c0056f456e7746a1747c8a144c6 (patch) | |
| tree | f3de4e60c04674d48abb1ac5d8c3955cb63a15bf | |
| parent | 6f3011991ab3ada600e0504162b33a1bdb3058a4 (diff) | |
| download | pyisda-0142aa5313090c0056f456e7746a1747c8a144c6.tar.gz | |
bring back tweak_curve
| -rw-r--r-- | pyisda/curve.pyx | 76 |
1 files changed, 40 insertions, 36 deletions
diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index 1f5076d..94deda1 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -1052,45 +1052,49 @@ cdef class SpreadCurve(Curve): # <CurveName.DocClause>(doc)) # return sc -# @cython.boundscheck(False) -# def tweak_curve(self, double epsilon, bint multiplicative=True, -# unsigned long mask=-1, bint inplace=False): -# """ -# Tweak the survival curve in place. + @cython.boundscheck(False) + def tweak_curve(self, double epsilon, bint multiplicative=True, + unsigned long mask=-1, bint inplace=False): + """ + Tweak the survival curve in place. -# Parameters -# ---------- -# epsilon : double -# tweaking factor (either additive or multiplicative) -# multiplicative : bool, optional -# do we scale by 1+epsilon or add epsilon (default multiplicative). -# mask : bitmask -# Default is tweak everything, otherwise only tweak values -# in the mask. -# """ -# cdef: -# const TCurve* curve_orig = get_TCurve(self) -# TCurve* curve_tweaked -# SpreadCurve sc -# int num_items = curve_orig.fNumItems -# double* recovery_rates + Parameters + ---------- + epsilon : double + tweaking factor (either additive or multiplicative) + multiplicative : bool, optional + do we scale by 1+epsilon or add epsilon (default multiplicative). + mask : bitmask + Default is tweak everything, otherwise only tweak values + in the mask. + """ + cdef: + const TCurve* curve_orig = self.get_TCurve() + TCurve* curve_tweaked + SpreadCurve sc + int num_items = curve_orig.fNumItems + char* buf -# if not inplace: -# sc = SpreadCurve.__new__(SpreadCurve) -# curve_tweaked = JpmcdsCopyCurve(curve_orig) -# sc._thisptr.reset(curve_tweaked, JpmcdsFreeTCurve) -# sc.name = make_shared[CurveName](deref(self.name)) -# recovery_rates = <double*>malloc(sizeof(double) * num_items) -# sc.recovery_rates.reset(recovery_rates, double_free) -# memcpy(sc.recovery_rates.get(), self.recovery_rates.get(), -# num_items * sizeof(double)) -# else: -# sc = self -# curve_tweaked = <TCurve*>curve_orig + if not inplace: + sc = SpreadCurve.__new__(SpreadCurve) + buf = <char*>malloc(self.buf_size) + memcpy(buf, self.buf.get(), self.buf_size) + sc.buf_size = self.buf_size + sc.buf.reset(buf, char_free) + sc.offset_recovery_rates = sizeof(TCurve) + num_items * sizeof(TRatePt) + buf += sc.offset_recovery_rates + buf += num_items * sizeof(double) + sc.defaulted = deref(<TDate*>buf) + buf += sizeof(TDate) + sc.offset_name = buf - sc.buf.get() + curve_tweaked = <TCurve*>buf + else: + sc = self + curve_tweaked = <TCurve*>curve_orig -# if mask != 0: -# tweak_curve(curve_orig, curve_tweaked, epsilon, mask) -# return sc + if mask != 0: + tweak_curve(curve_orig, curve_tweaked, epsilon, mask) + return sc @cython.boundscheck(False) def par_spread(self, today, step_in_date, start_date, YieldCurve yc not None, |
