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 <uvap...@gmail.com 
> <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 <
>>>> uvap...@gmail.com> 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