Thanks for the link Mauro.

Christopher: I think it might make sense to break out TermStructure and
pass it into your methods as an independent object.   If you find yourself
"mixing and matching" pricing engines and term structures, then that sounds
to me like you should be making use of multiple dispatch.  If a bond always
has the same pricing engine and term structure, then a parametric type
might make more sense.  It really comes down to whether the internal types
will need to change.

On Tue, Feb 2, 2016 at 1:49 AM, Mauro <[email protected]> wrote:

> I haven't been following this thread closely, so I have no frame of
> reference here, I'm like a child who wanders into the middle of a
> julia-users thread...
>
> A few observations:
>
> - functions being called with composite types which have some
>   non-concrete fields suffer no performance penalty, as long as you
>   don't use those non-concrete fields
> - if using a non-concrete field, you can use kernel
>   functions  (aka barrier funciton):
>
> http://docs.julialang.org/en/release-0.4/manual/performance-tips/#separate-kernel-functions
>   The kernel fn could be what Tom suggested
>
> nvp(myBond) = isdefined(myBond, :nvp_val) ? myBond.nvp_val :_nvp!(myBond,
> myBond.pricingEngine)
>
> _nvp!(bond, pe:PricingEngine1) = ... # writes to nvp_val field and returns
> it
> _nvp!(bond, pe:PricingEngine2) = ...
>
> On Tue, 2016-02-02 at 00:41, Christopher Alexander <[email protected]>
> wrote:
> > I've been trying to think of a way to implement this, but I'm having some
> > trouble.  Perhaps this can be a discussion around organizing objects in
> > Julia to best exploit the benefits of multiple dispatch.  Let's say I
> have
> > a Bond type:
> >
> > type Bond{P <: PricingEngine}
> >  # some attributes here
> >  pricingEngine::P
> > end
> >
> >
> > Then the particular PricingEngine object for each instantiation of "Bond"
> > has its own term structure (perhaps this could be stored with the bond
> > itself?).  Each PricingEngine sub type (in my code PricingEngine is
> > actually an abstract type itself) has its own calculation method, where
> > various components of the bond are calculated (e.g. NPV, etc).  I suppose
> > this could be separated out, but I essentially want to provide to the end
> > user something like npv(myBond).  The bond knows whether it's been
> > calculated or not, and if it hasn't, it does so via its pricing engine.
> >  Otherwise, it returns a cached value of its NPV (already having been
> > calculated).  If I break all of these things out (bond/instrument, term
> > structure, and pricing engine), I would envision a method like this:
> > npv(bond, pricing_engine, term_structure)
> >
> > Is there a better/more "Julian" way to organize this?  Perhaps keeping
> the
> > TermStructure separate from everyone and passing it into methods where I
> > need it?
> >
> >
> > On Monday, February 1, 2016 at 5:05:21 PM UTC-5, Tom Breloff wrote:
> >>
> >> Just so you realize... in this example "pricingEngine" has an abstract
> >> type, and you've possibly lost whatever performance gain you were hoping
> >> for in your original question.  To solve you either need to take the
> same
> >> approach in defining and updating the Bond object, or maybe rethink how
> >> you're doing this.  You should consider utilizing multiple dispatch a
> >> little more keep your PricingEngine and TermStructure separate:
> >>
> >> do_something(engine::PricingEngine, term::TermStructure) = ...
> >>
> >>
> >>
> >> On Mon, Feb 1, 2016 at 2:07 PM, Christopher Alexander <
> [email protected]
> >> <javascript:>> wrote:
> >>
> >>> This doesn't seem to work if your PricingEngine object is attached to
> >>> some other object.  Like, for example if you have:
> >>>
> >>> type Bond
> >>>  pricingEngine::PricingEngine
> >>> end
> >>>
> >>>
> >>> myPE = PricingEngine(4.5, 5.5, TermStructureA())
> >>>
> >>>
> >>> myBond = Bond(myPE)
> >>>
> >>>
> >>> myPE = update_ts(myPE, TermStructureB())
> >>>
> >>>
> >>> At that point, myBond's pricing engine still points to the older myPE
> >>> with TermStructureA.
> >>>
> >>> On Monday, February 1, 2016 at 1:58:54 PM UTC-5, Christopher Alexander
> >>> wrote:
> >>>>
> >>>> So something like:
> >>>>
> >>>> function update_ts(pe::PricingEngine, newTS::TermStructure)
> >>>>  newPE = PricingEngine(pe.varA, pe.varB, newTS)
> >>>>  return newPE
> >>>> end
> >>>>
> >>>>
> >>>> myPE = PricingEngine(4.5, 5.5, TermStructureA())
> >>>>
> >>>>
> >>>> myPE = update_ts(myPE, TermStructureB())
> >>>>
> >>>> You probably wouldn't be able to update the "myPE" object in place
> right
> >>>> (i.e. updating it in the actual update_ts method and then returning
> itself)?
> >>>>
> >>>>
> >>>> On Monday, February 1, 2016 at 1:50:41 PM UTC-5, Tom Breloff wrote:
> >>>>>
> >>>>> You could just construct a new object with the new TermStructure,
> >>>>> instead of overwriting the old one.
> >>>>>
> >>>>> On Mon, Feb 1, 2016 at 1:27 PM, Christopher Alexander <
> >>>>> [email protected]> wrote:
> >>>>>
> >>>>>> Hello all, I have a question about the usage of parametric types.  I
> >>>>>> know these bring about a performance boost (at least that was my
> >>>>>> understanding), but I have a situation where I have a parametric
> type
> >>>>>> defined as such:
> >>>>>>
> >>>>>> type PricingEngine{T <: TermStructure}
> >>>>>>  varA::Float64
> >>>>>>  varB::Float64
> >>>>>>  ts::T
> >>>>>> end
> >>>>>>
> >>>>>>
> >>>>>> But then I need to actually swap the existing term structure with
> >>>>>> another subtype of TermStructure further down the road. Using
> parametric
> >>>>>> types, it complains because I guess it's locked in to using whatever
> >>>>>> TermStructure sub type is initially there when I instantiate the
> >>>>>> PricingEngine type.  Is there anyway to do such an update while
> still using
> >>>>>> a type parameter, or am I stuck just with a definition that uses the
> >>>>>> broader abstract type?
> >>>>>>
> >>>>>> Thanks!
> >>>>>>
> >>>>>> Chris
> >>>>>>
> >>>>>
> >>>>>
> >>
>

Reply via email to