To clarify that last part: if you try to call `process(m.Sol)` with a model 
object that has a `NoResults` value for `Sol`, that should throw a 
MethodError. If I got this right, that is...

// Tomas

On Sunday, April 20, 2014 3:13:55 AM UTC+2, Tomas Lycken wrote:
>
> I can think of one easy (or not, depending on the details of your problem) 
> way to design around this: introduce an abstract results type, a "solution 
> not ready" type and let both the "solution not ready" type and your current 
> results type inherit from the abstract type. Then let your model's Sol 
> field be of the abstract type instead, so that you can give it a value 
> later:
>
> abstract Model
> abstract AbstracResults
>
> type Results <: AbstractResults
> # Details not shown here
> end
>
> type NoResults <: AbstractResults
>
> type IFP{T <: FloatingPoint} <: Model
>     # Model parameters...
>     # Grid parameters for a...
>     # Parameters for y...
>
>     Sol::AbstractResults
> end
>
> When you initialize the Model object, give Sol a value of type NoResults.
>
> *Note: *depending on how you use this, it might incur *severe performance 
> loss*, since you'll throw type inference for the solution object out the 
> window. It might be possible to mitigate this by writing methods that 
> process the results that take a Results object rather than an 
> AbstractResults, but I'm not sure enough on how type inference in Julia 
> works to know for sure. I'd try doing something like
>
> function process(R::Results)
>     # R is now strictly typed to Results, so no type inference problems here
> end
>
> m = getModelWithResults() # however you want to initialize it, calculate 
> results etc
> process(m.Sol)
>
> I *think* this should solve the performance problem, but I'm *not sure*. *Use 
> with care*. =)
>
> // Tomas
>
> On Sunday, April 20, 2014 2:50:05 AM UTC+2, Spencer Lyon wrote:
>>
>> Say I have a type that defines a model. Something like this:
>>
>> abstract Model
>>
>> type Results
>> # Details not shown here
>> end
>>
>> type IFP{T <: FloatingPoint} <: Model
>>     # Model parameters
>>     rho::T
>>     beta::T
>>     r::T
>>     R::T
>>     gamma::T
>>
>>     # Grid parameters for a
>>     n_a::Integer
>>     a_max::T
>>     a::Vector{T}
>>
>>     # Parameters for y
>>     n_y::Integer
>>     y::Vector{T}
>>     P::Matrix{T}
>>
>>     Sol::Results
>>
>> end
>>
>> I would like to be able to initialize an object of type IFP, work with it 
>> for a while, pass it to a solution routine, and then fill in the Solfield at 
>> a later time.
>>
>> Is there a way to leave Sol as an uninitialized field and then fill it 
>> in after the solution has been determined (which will be after constructing 
>> the IFP object and playing around with it for a while)? I suppose one 
>> way would be to have the inner constructor directly call the solution 
>> routine to get the Sol object. However, I want to avoid that because I 
>> may want to manipulate IFP between its construction and actually solving 
>> the model it describes.
>> ------------------------------
>>
>> One more note. In this specific use case Sol could effectively be 
>> replaced by two other fields:
>>
>> c::Matrix{T}
>> ap::Matrix{T}
>>
>> Would that be an easier way to work with them as uninitialized fields? If 
>> so, why?
>>
>

Reply via email to