summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2017-05-11 16:38:14 -0400
committerGuillaume Horel <guillaume.horel@gmail.com>2017-05-11 16:38:14 -0400
commit43cd9a00af77489ff4c0413e060e0b276d6d6bb4 (patch)
tree96c456a902d8881489bb4aef0af81bd7d5f8349a
parent3269416a5058ee5c9215b9d3178146ddba6c1416 (diff)
downloadpyisda-43cd9a00af77489ff4c0413e060e0b276d6d6bb4.tar.gz
include is a bitset
-rw-r--r--pyisda/curve.pxd6
-rw-r--r--pyisda/curve.pyx30
-rw-r--r--pyisda/flat_hazard.pyx2
3 files changed, 25 insertions, 13 deletions
diff --git a/pyisda/curve.pxd b/pyisda/curve.pxd
index 698e6cf..532a530 100644
--- a/pyisda/curve.pxd
+++ b/pyisda/curve.pxd
@@ -53,13 +53,13 @@ cdef extern from "isda/cds.h" nogil:
# Array of size nbDate
TDate *endDates,
# Coupon rates for each benchmark instrument. Array of size nbDate
- const double *couponRates,
- const double *upfrontRates,
+ const double *couponRates,
+ const double *upfrontRates,
# Flags to denote that we include particular benchmarks. This makes it
# easy for the user to include or exclude benchmarks on a one-by-one
# basis. Can be NULL if all are included. Otherwise an array of size
# nbDate.
- const TBoolean *includes,
+ const unsigned int includes,
# Recovery rate in case of default
const double* recoveryRate,
# Should accrued interest be paid on default. Usually set to TRUE
diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx
index 6039616..3f9ece2 100644
--- a/pyisda/curve.pyx
+++ b/pyisda/curve.pyx
@@ -372,8 +372,9 @@ cdef class SpreadCurve(Curve):
"""
@cython.boundscheck(False)
@cython.wraparound(False)
+ @cython.initializedcheck(False)
def __init__(self, today, YieldCurve yc, start_date, step_in_date,
- cash_settle_date, list end_dates,
+ cash_settle_date, end_dates,
double[:] coupon_rates, double[:] upfront_rates,
double[:] recovery_rates, bint pay_accrued_on_default=True):
@@ -382,17 +383,27 @@ cdef class SpreadCurve(Curve):
cdef TDate cash_settle_date_c = pydate_to_TDate(cash_settle_date)
cdef TDate start_date_c = pydate_to_TDate(start_date)
cdef int n_dates = len(end_dates)
- cdef TDate* end_dates_c = <TDate*>malloc(n_dates * sizeof(TDate))
+ cdef TDate* end_dates_c = NULL
+ cdef TDate[:] end_dates_view
cdef TCurve* curve = NULL
- cdef TBoolean* includes = <TBoolean*>calloc(n_dates, sizeof(TBoolean))
+ cdef unsigned int includes = 0
cdef size_t i
if cash_settle_date_c < yc._thisptr.get().fBaseDate:
raise ValueError("cash_settle_date: {0} is anterior to yc's base_date: {1}".
format(cash_settle_date, yc.base_date))
- for i, d in enumerate(end_dates):
- end_dates_c[i] = pydate_to_TDate(d)
- if upfront_rates[i] == upfront_rates[i]:
- includes[i] = 1
+
+ if isinstance(end_dates, list):
+ end_dates_c = <TDate*>malloc(n_dates * sizeof(TDate))
+ end_dates_view = <TDate[:n_dates]>end_dates_c
+ for i, d in enumerate(end_dates):
+ end_dates_view[i] = pydate_to_TDate(d)
+ if upfront_rates[i] == upfront_rates[i]:
+ includes |= 1 << i
+ else:
+ end_dates_view = memoryview(end_dates)
+ for i in range(n_dates):
+ if upfront_rates[i] == upfront_rates[i]:
+ includes |= 1 << i
cdef TStubMethod stub_type
if JpmcdsStringToStubMethod(b"f/s", &stub_type) != 0:
@@ -404,7 +415,7 @@ cdef class SpreadCurve(Curve):
step_in_date_c,
cash_settle_date_c,
n_dates,
- end_dates_c,
+ &end_dates_view[0],
&coupon_rates[0],
&upfront_rates[0],
includes,
@@ -415,7 +426,8 @@ cdef class SpreadCurve(Curve):
&stub_type,
<long>'M',
b'NONE')
- free(end_dates_c)
+ if end_dates_c:
+ free(end_dates_c)
if curve == NULL:
raise ValueError("Didn't init the survival curve properly")
else:
diff --git a/pyisda/flat_hazard.pyx b/pyisda/flat_hazard.pyx
index 363ef95..88cd82a 100644
--- a/pyisda/flat_hazard.pyx
+++ b/pyisda/flat_hazard.pyx
@@ -60,7 +60,7 @@ def strike_vec(double[:] spreads, YieldCurve yc, trade_date, value_date,
&end_date_c,
&spreads[i],
&zero_upfront,
- NULL,
+ 0,
&recovery_rate,
1, # pay_accrued_on_default True
NULL,