Skip to content

Commit

Permalink
Do not use c++ extension
Browse files Browse the repository at this point in the history
- call the stram operator directly
- also move code inside businessdayconvention instead of calendar,
  more consistent with QuantLib
- also expose two more conventions: Nearest and
  HalfMonthModifiedFollowing
  • Loading branch information
Guillaume Horel authored and thrasibule committed Nov 15, 2016
1 parent 2b390da commit 08c9f45
Show file tree
Hide file tree
Showing 23 changed files with 58 additions and 114 deletions.
19 changes: 0 additions & 19 deletions cpp_layer/businessdayconvention_support_code.cpp

This file was deleted.

10 changes: 0 additions & 10 deletions cpp_layer/businessdayconvention_support_code.hpp

This file was deleted.

2 changes: 1 addition & 1 deletion quantlib/indexes/ibor_index.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ from quantlib.time.date cimport Period
from quantlib.time.daycounter cimport DayCounter
from quantlib.currency.currency cimport Currency
from quantlib.time.calendar cimport Calendar
from quantlib.time._calendar cimport ModifiedFollowing, BusinessDayConvention
from quantlib.time._businessdayconvention cimport ModifiedFollowing, BusinessDayConvention
from quantlib.termstructures.yields.yield_term_structure cimport YieldTermStructure
cimport quantlib._index as _in
cimport quantlib.indexes._ibor_index as _ib
Expand Down
3 changes: 1 addition & 2 deletions quantlib/instruments/bonds.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,9 @@ from libcpp cimport bool
from quantlib.handle cimport Handle, shared_ptr, RelinkableHandle
from quantlib.instruments.instrument cimport Instrument
from quantlib.pricingengines.engine cimport PricingEngine
from quantlib.time._calendar cimport BusinessDayConvention
from quantlib.time._businessdayconvention cimport BusinessDayConvention, Following
from quantlib.time._daycounter cimport DayCounter as QlDayCounter
from quantlib.time._schedule cimport Schedule as QlSchedule
from quantlib.time._calendar cimport Following
from quantlib.time.calendar cimport Calendar
from quantlib.time.date cimport Date, date_from_qldate
from quantlib.time.schedule cimport Schedule
Expand Down
4 changes: 2 additions & 2 deletions quantlib/instruments/swap.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ from libcpp cimport bool
from quantlib.handle cimport Handle, shared_ptr, RelinkableHandle
from quantlib.instruments.instrument cimport Instrument
from quantlib.pricingengines.engine cimport PricingEngine
from quantlib.time._calendar cimport BusinessDayConvention
from quantlib.time._businessdayconvention cimport BusinessDayConvention
from quantlib.time._daycounter cimport DayCounter as QlDayCounter
from quantlib.time._schedule cimport Schedule as QlSchedule
from quantlib.time.calendar cimport Calendar
from quantlib.time.date cimport Date, date_from_qldate
from quantlib.time.schedule cimport Schedule
from quantlib.time.daycounter cimport DayCounter
from quantlib.time.calendar import Following
from quantlib.time.businessdayconvention import Following
from quantlib.cashflow cimport Leg
from quantlib.indexes.ibor_index cimport IborIndex
from quantlib.cashflow cimport SimpleLeg, leg_items
Expand Down
2 changes: 1 addition & 1 deletion quantlib/mlab/fixed_income.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from quantlib.compounding import Compounded

from quantlib.pricingengines.bond import DiscountingBondEngine
from quantlib.time.calendar import (
from quantlib.time.businessdayconvention import (
Unadjusted, ModifiedFollowing, Following)

from quantlib.time.calendars.null_calendar import NullCalendar
Expand Down
2 changes: 1 addition & 1 deletion quantlib/termstructures/yields/bond_helpers.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ from quantlib.quotes cimport Quote
from quantlib.time.date cimport Date
from quantlib.time.schedule cimport Schedule
from quantlib.time.daycounter cimport DayCounter
from quantlib.time._calendar cimport Following
from quantlib.time._businessdayconvention cimport Following
from quantlib.termstructures.yields.rate_helpers cimport RateHelper


Expand Down
5 changes: 2 additions & 3 deletions quantlib/termstructures/yields/rate_helpers.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ cimport quantlib._quote as _qt
cimport quantlib.indexes._ibor_index as _ib
cimport quantlib.indexes._swap_index as _si
from quantlib.time._period cimport Frequency, Days
from quantlib.time._calendar cimport BusinessDayConvention
from quantlib.time._businessdayconvention cimport (
BusinessDayConvention, ModifiedFollowing )
from quantlib.time.date cimport date_from_qldate
from quantlib.quotes cimport Quote, SimpleQuote
from quantlib.time.calendar cimport Calendar
Expand All @@ -25,8 +26,6 @@ from quantlib.time.date cimport Period, Date
from quantlib.indexes.ibor_index cimport IborIndex
from quantlib.indexes.swap_index cimport SwapIndex

from quantlib.time.calendar import ModifiedFollowing

cdef class RateHelper:

def __cinit__(self):
Expand Down
4 changes: 1 addition & 3 deletions quantlib/test/test_bond_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
from quantlib.termstructures.yields.bond_helpers import (
FixedRateBondHelper)
from quantlib.time.api import (
Annual, Backward, Date, DayCounter, Following, Period, Schedule, TARGET)
from quantlib.time.calendar import ModifiedFollowing

Annual, Backward, Date, DayCounter, ModifiedFollowing, Following, Period, Schedule, TARGET)

class TestFixedRateBondHelper(unittest.TestCase):

Expand Down
3 changes: 0 additions & 3 deletions quantlib/test/test_bondfunctions.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@
FixedRateBond, ZeroCouponBond
)
from quantlib.pricingengines.bond import DiscountingBondEngine
from quantlib.time.calendar import (
TARGET, Unadjusted, ModifiedFollowing, Following
)
from quantlib.time.calendars.united_states import (
UnitedStates, GOVERNMENTBOND
)
Expand Down
5 changes: 1 addition & 4 deletions quantlib/test/test_bonds.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@
FixedRateBond, ZeroCouponBond, FloatingRateBond
)
from quantlib.pricingengines.bond import DiscountingBondEngine
from quantlib.time.calendar import (
Unadjusted, ModifiedFollowing, Following
)
from quantlib.time.calendars.united_states import (
UnitedStates, GOVERNMENTBOND, SETTLEMENT
)
Expand All @@ -26,7 +23,7 @@
)
from quantlib.indexes.libor import Libor
from quantlib.currency.api import USDCurrency
from quantlib.time.api import Months
from quantlib.time.api import Months, Unadjusted, Following, ModifiedFollowing
from quantlib.cashflow import Leg, SimpleLeg
from quantlib.cashflows.coupon_pricer import IborCouponPricer, BlackIborCouponPricer, set_coupon_pricer
from quantlib.termstructures.volatility.optionlet.optionlet_volatility_structure import ConstantOptionletVolatility, OptionletVolatilityStructure
Expand Down
1 change: 0 additions & 1 deletion quantlib/test/test_bucketanalysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

from quantlib.instruments.bonds import (FixedRateBond)
from quantlib.pricingengines.bond import DiscountingBondEngine
from quantlib.time.calendar import ( Unadjusted, ModifiedFollowing, Following)
from quantlib.time.calendars.target import TARGET
from quantlib.time.calendars.united_states import ( UnitedStates, GOVERNMENTBOND)
from quantlib.currency.api import USDCurrency
Expand Down
2 changes: 1 addition & 1 deletion quantlib/test/test_business_day_convention.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from .unittest_tools import unittest

from quantlib.time.calendar import (
from quantlib.time.businessdayconvention import (
Following, Preceding)

from quantlib.time.businessdayconvention import BusinessDayConvention
Expand Down
4 changes: 2 additions & 2 deletions quantlib/test/test_calendar.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from .unittest_tools import unittest

from quantlib.time.calendar import (
from quantlib.time.calendar import holiday_list
from quantlib.time.businessdayconvention import (
Following, ModifiedFollowing, ModifiedPreceding, Preceding,
holiday_list
)
from quantlib.time.calendars.target import TARGET
from quantlib.time.calendars.united_kingdom import UnitedKingdom, EXCHANGE
Expand Down
5 changes: 3 additions & 2 deletions quantlib/test/test_cython_bug.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ from quantlib.time._date cimport (
Date as QlDate, Date_todaysDate, Jul, August, September, Date_endOfMonth
)
from quantlib.time._period cimport Years, Period, Annual, Days
from quantlib.time._calendar cimport (
Calendar, Unadjusted, ModifiedFollowing, Following
from quantlib.time._calendar cimport Calendar
from quantlib.time._businessdayconvention cimport (
Unadjusted, ModifiedFollowing, Following
)
from quantlib.time.calendars._target cimport TARGET
from quantlib.time._schedule cimport Schedule, Backward
Expand Down
2 changes: 1 addition & 1 deletion quantlib/test/test_schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from quantlib.time.date import (
Date, Period, Jan, Dec, Weeks, Sep, Months, Nov
)
from quantlib.time.calendar import Following, Preceding
from quantlib.time.businessdayconvention import Following, Preceding
from quantlib.time.calendars.united_kingdom import UnitedKingdom
from quantlib.time.schedule import Schedule, Twentieth, Forward, Backward

Expand Down
16 changes: 16 additions & 0 deletions quantlib/time/_businessdayconvention.pxd
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from libcpp.string cimport string

cdef extern from "ql/time/businessdayconvention.hpp" namespace "QuantLib":
cdef enum BusinessDayConvention:
Following
ModifiedFollowing
Preceding
ModifiedPreceding
Unadjusted
HalfMonthModifiedFollowing
Nearest

cdef extern from "<sstream>" namespace "std":
cdef cppclass stringstream:
stringstream& operator<<(BusinessDayConvention)
string str()
22 changes: 1 addition & 21 deletions quantlib/time/_calendar.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,7 @@ from libcpp.vector cimport vector

from _date cimport Date, Weekday
from _period cimport Period, TimeUnit


cdef extern from 'ql/time/businessdayconvention.hpp' namespace 'QuantLib':
cdef enum BusinessDayConvention:
#ISDA
Following # Choose the first business day after
# the given holiday. */
ModifiedFollowing # Choose the first business day after
# the given holiday unless it belongs
# to a different month, in which case
# choose the first business day before
# the holiday. */
Preceding # Choose the first business day before
# the given holiday. */
# NON ISDA
ModifiedPreceding # Choose the first business day before
# the given holiday unless it belongs
# to a different month, in which case
# choose the first business day after
# the holiday. */
Unadjusted # Do not adjust. */
from _businessdayconvention cimport BusinessDayConvention

cdef extern from 'ql/time/calendar.hpp' namespace 'QuantLib':

Expand Down
7 changes: 4 additions & 3 deletions quantlib/time/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
"""

from .businessdayconvention import BusinessDayConvention
from .calendar import (
Calendar, ModifiedFollowing, Following, ModifiedPreceding,
Preceding, Unadjusted, holiday_list
from .calendar import Calendar, holiday_list
from .businessdayconvention import (
ModifiedFollowing, Following, ModifiedPreceding,
Preceding, Unadjusted, HalfMonthModifiedFollowing, Nearest
)
from .calendar_registry import calendar_from_name
from .calendars.jointcalendar import JointCalendar
Expand Down
30 changes: 16 additions & 14 deletions quantlib/time/businessdayconvention.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,20 @@
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
"""
cimport _businessdayconvention as _bdc

from libcpp.string cimport string
cimport quantlib.time._calendar as _ca
cdef public enum:
Following = _bdc.Following
ModifiedFollowing = _bdc.ModifiedFollowing
Preceding = _bdc.Preceding
ModifiedPreceding = _bdc.ModifiedPreceding
Unadjusted = _bdc.Unadjusted
HalfMonthModifiedFollowing = _bdc.HalfMonthModifiedFollowing
Nearest = _bdc.Nearest

cdef extern from "businessdayconvention_support_code.hpp" namespace "QL":
string repr(int b) except +


# BusinessDayConvention:
cdef QL_BDC = [_ca.Following, _ca.ModifiedFollowing,
_ca.Preceding, _ca.ModifiedPreceding,
_ca.Unadjusted]
cdef QL_BDC = [Following, ModifiedFollowing,
Preceding, ModifiedPreceding, Unadjusted,
HalfMonthModifiedFollowing, Nearest]

_BDC_DICT = {str(BusinessDayConvention(v)).replace(" ",""):v for v in QL_BDC}

Expand All @@ -34,9 +36,9 @@ cdef class BusinessDayConvention(int):
return BusinessDayConvention(_BDC_DICT[name])

def __str__(self):
cdef string res = repr(int(self))
return res.decode('utf-8')
cdef _bdc.stringstream ss
ss << <_bdc.BusinessDayConvention>(self)
return ss.str().decode()

def __repr__(self):
cdef string res = repr(int(self))
return 'Business Day Convention: {}'.format(res.decode('utf-8'))
return 'BusinessDayConvention({})'.format(str(self).replace(" ", ""))
9 changes: 1 addition & 8 deletions quantlib/time/calendar.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,7 @@ cimport quantlib.time._calendar as _calendar
cimport quantlib.time._date as _date
cimport quantlib.time.date as date
cimport quantlib.time._period as _period

# BusinessDayConvention:
cdef public enum BusinessDayConvention:
Following = _calendar.Following
ModifiedFollowing = _calendar.ModifiedFollowing
Preceding = _calendar.Preceding
ModifiedPreceding = _calendar.ModifiedPreceding
Unadjusted = _calendar.Unadjusted
from quantlib.time._businessdayconvention cimport Following

cdef class Calendar:
'''This class provides methods for determining whether a date is a
Expand Down
5 changes: 3 additions & 2 deletions quantlib/time/schedule.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ from libcpp.vector cimport vector
cimport _schedule
cimport _date
cimport _calendar
from _businessdayconvention cimport Following

from calendar cimport DateList, Calendar
from date cimport date_from_qldate, Date, Period
Expand Down Expand Up @@ -42,8 +43,8 @@ cdef class Schedule:

def __init__(self, Date effective_date, Date termination_date,
Period tenor, Calendar calendar,
int business_day_convention=_calendar.Following,
int termination_date_convention=_calendar.Following,
int business_day_convention=Following,
int termination_date_convention=Following,
int date_generation_rule=Forward, end_of_month=False):

self._thisptr = new _schedule.Schedule(
Expand Down
10 changes: 0 additions & 10 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,15 +150,6 @@ def collect_extensions():
**kwargs
)

business_day_convention_extension = Extension(
name='quantlib.time.businessdayconvention',
sources=[
'quantlib/time/businessdayconvention.pyx',
'cpp_layer/businessdayconvention_support_code.cpp'
],
**kwargs
)

multipath_extension = Extension(
name='quantlib.sim.simulate',
sources=[
Expand Down Expand Up @@ -193,7 +184,6 @@ def collect_extensions():
mc_vanilla_engine_extension,
settings_extension,
test_extension,
business_day_convention_extension
]

cython_extension_directories = []
Expand Down

0 comments on commit 08c9f45

Please sign in to comment.