On Monday, June 30, 2014 09:54:43 AM Spencer Lyon wrote:
> Hey Tim,
> 
> Thanks for the answer. I think I meant what I stated in the definition. A
> function is type instable if return types depend on input types.

No, that's not right. Think about the + function: if you add a Float64 + 
Float64, you want a Float64 back. If you add a Int64 + Int64, you want an 
Int64 back. So it's fine if the result type(s) depends on the input type(s), 
but it's not OK if it depends on the values. 

See the FAQ for a detailed discussion of these points---there's a ton of 
material in there on this, and it's well worth everyone's while to read it 
all.

--Tim

> 
> I guess the question I really want to get an answer to is whether or not
> functions like this will make it difficult for the compiler to emit
> performant code. Any ideas along those lines?
> 
> Thanks.
> 
> On Monday, June 30, 2014 12:51:12 PM UTC-4, Tim Holy wrote:
> > In your definition I think you meant "type stability," not "type
> > instability."
> > To be completely explicit, a function is type-stable if you can calculate
> > the
> > return type(s) of all outputs from the types of the inputs. If you have to
> > look at the actual values of the inputs, it's not type-stable.
> > 
> > --Tim
> > 
> > On Monday, June 30, 2014 09:17:45 AM Spencer Lyon wrote:
> > > Does this function suffer from type instability?
> > > 
> > > function bellman_operator{T <: FloatingPoint}(g::GrowthModel,
> > 
> > w::Vector{T},
> > 
> > compute_policy::Bool=false)
> > 
> > >     # === Apply linear interpolation to w === #
> > >     Aw = CoordInterpGrid(g.grid, w, BCnan, InterpLinear)
> > >     
> > >     if compute_policy
> > >     
> > >         σ = zeros(w)
> > >     
> > >     end
> > >     
> > >     # === set Tw[i] equal to max_c { u(c) + beta w(f(k_i) - c)} === #
> > >     Tw = zeros(w)
> > >     for (i, k) in enumerate(g.grid)
> > >     
> > >         objective(c) = - g.u(c) - g.β * Aw[g.f(k) - c]
> > >         res = optimize(objective, 1e-6, g.f(k))
> > >         c_star = res.minimum
> > >         if compute_policy
> > >         
> > >             σ[i] = c_star
> > >         
> > >         end
> > >         
> > >         Tw[i] = - objective(c_star)
> > >     
> > >     end
> > >     
> > >     if compute_policy
> > >     
> > >         return Tw, σ
> > >     
> > >     else
> > >     
> > >         return Tw
> > >     
> > >     end
> > > 
> > > end
> > > 
> > > As far as I understand (which could very well be the source of my
> > > uncertainty — can anyone correct this definition?), the definition of
> > 
> > type
> > 
> > > instability is that return types depend on the types of input types. In
> > > this case the return type doesn’t depend on the input type, but it does
> > > depend on the *value* of the argument compute_policy (return type is
> > 
> > either
> > 
> > > Vector{T} or (Vector{T}, Vector{T})). I am a little unsure because given
> > > the *value* of compute_policy, the return type is unambiguous.
> > > ​

Reply via email to