Help tracking down an InexactError()

I’m trying to solve a dynamic programming problem and I am running into an InexactError() that I have not been able to track down. Can you please help me out?

const nᵢ = 2

const δ = 0.8
const σ = 1.5
const ρ = 5.0

const S = 1:3
const γc = 1.2
const πmat = [  0.9 0.05 0.05;
                0.05 0.9 0.05;
                0.05 0.05 0.9 ]
const hi = (0.52 * γc) ^ (1 - σ) / (1 - σ)
const lo = (0.35 * γc) ^ (1 - σ) / (1 - σ)
const w = [     hi lo lo; # is
                lo hi lo ]

function J(m, y, s)
    σ / (1 - σ) * sum( ((1 - δ) * (y[i] + m[i])) ^ (1 / σ) for i in 1:nᵢ ) * m[nᵢ + 1] ^ ((σ - 1) / σ) -
    sum( m[i] * w[i, s] for i in 1:nᵢ ) + m[nᵢ + 1] * γc
end

const grid_m = 0:0.1:1.5
const grid_y′ = 0:0.1:1

using Interpolations
function interp1(S, grid_y′1, grid_y′2, Darr)
    itp = interpolate(Darr, BSpline(Cubic(Line())), OnGrid())
    sitp = scale(itp, S, grid_y′1, grid_y′2)
    return sitp
end

interp(S, grid_y′1, grid_y′2, Darr, s, y1, y2) = interp1(S, grid_y′1, grid_y′2, Darr)[s, y1, y2]

using Optim

function main()
    s = 2
    y1 = 0.0
    y2 = sqrt(abs(1.0 - y1^2.0))

    Darr = [J([1.0, 1.0, 1.0], [y1, y2], s) for s in S, y1 in grid_y′, y2 in grid_y′]

    z = x -> begin
                m1 = x[1]
                m2 = x[2]
                m3 = x[3]
                y′1 = x[4]
                y′2 = sqrt(abs(1.0 - y′1^2.0))
                return J([m1, m2, m3], [y1, y2], s) + δ * interp(S, grid_y′, grid_y′, Darr, s, y′1, y′2)
            end
        twicedif = TwiceDifferentiable(z, [0.0, 0.0, 0.0, 0.0]; autodiff = :forward)
        opt = optimize(twicedif, [1.0, 1.0, 1.0, 1.0], Newton(linesearch = LineSearches.Static()))
end

Running main() gives the error.

I think you are running into the float indices being too large to be represented in Int64, eg like in

julia> trunc(Int64, typemax(Int64) + 1.0)
ERROR: InexactError()
Stacktrace:
 [1] trunc(::Type{Int64}, ::Float64) at ./float.jl:672

It is possible that you are leaving the grid when looking for the optimum. Since B-splines don’t necessarily do well outside the grid, I would just restrict the policy choice to something sensible. Also, note that optimize minimizes, is this what you want?

The error is thrown in getindex and when it happens you have (s, y1, y2) = (2, NaN, NaN) so I guess trying to getindex the return value of interp1 with NaN doesn’t work so well.

Yes, I’m looking for a minimum (unfortunate and inconsistent choice of naming optimize, since also to obtain the results one calls minimize and minimum). Is there way to provide bounds to optimize?

NaN? When does the program go to those values?

Yes, using box minimization.

I printed the values inside interp and that’ what they had when the error was thrown

So it seems that was the problem, now with constraints I obtain the solution with no problem. Thanks!

1 Like