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