MathOptInterface.OTHER_ERROR when trying to use ISRES of NLopt through JuMP

You have multiple issues:

  • range(0,1,m) should be range(0,1; length = m) (how did this work otherwise?)
  • Sometimes your objective function errors because the root doesn’t exist. If I run with Ipopt, I get
    ERROR: ArgumentError: The interval [a,b] is not a bracketing interval.
    You need f(a) and f(b) to have different signs (f(a) * f(b) < 0).
    Consider a different bracket or try fzero(f, c) with an initial guess c.
    

Here’s what I would do:

using JuMP
import Ipopt
import Roots

function main()
    k, d, c1, c2, c3, m = 0.5, 1, 0, 2, 1, 10
    nparam = 2 * d + 2
    m -= 1
    vGrid = range(0, 1; length = m)
    function obj(α::T...)  where {T<:Real}
        αb, αs = α[1:d+1], α[d+2:end]
        B(v) = sum(αb[i] * v^(i-1) for i in 1:d+1)
        B1(v) = sum(αb[i] * (i-1) * v^(i-2) for i in 2:d+1)
        S(v) = sum(αs[i] * v^(i-1) for i in 1:d+1)
        S1(v) = sum(αs[i] * (i-1) * v^(i-2) for i in 2:d+1)
        function FOCb(y)
            sy = S(y)
            binv = Roots.fzero(q -> B(q) - sy, zero(T))
            return k * y * S1(y) + sy - binv
        end
        function FOCs(x)
            bx = B(x)
            sinv = Roots.fzero(q -> S(q) - bx, zero(T))
            return (1-k) * (1-x) * B1(x) - B(x) + sinv
        end
        return sum(FOCb(x)^2 + FOCs(x)^2 for x in vGrid)
    end
    αa = [1/12, 2/3, 1/4, 2/3]
    model = Model(Ipopt.Optimizer)
    @variable(model, -c3 <= α[i=1:nparam] <= c3, start = αa[i]+ 0.1 * rand())
    @constraints(model, begin
        [j = 1:m], sum(α[i] * (i-1) * vGrid[j]^(i-2) for i in 2:d+1) >= c1
        [j = 1:m], sum(α[d+1+i] * (i-1) * vGrid[j]^(i-2) for i in 2:d+1) >= c1
    end)
    register(model, :obj, nparam, obj; autodiff = true)
    @NLobjective(model, Min, obj(α...))
    optimize!(model)
    print(solution_summary(model))
    return value.(α)
end
main()
1 Like