summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2023-05-31 11:07:32 -0400
committerGuillaume Horel <guillaume.horel@gmail.com>2023-05-31 11:07:32 -0400
commit0142aa5313090c0056f456e7746a1747c8a144c6 (patch)
treef3de4e60c04674d48abb1ac5d8c3955cb63a15bf
parent6f3011991ab3ada600e0504162b33a1bdb3058a4 (diff)
downloadpyisda-0142aa5313090c0056f456e7746a1747c8a144c6.tar.gz
bring back tweak_curve
-rw-r--r--pyisda/curve.pyx76
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,