Ana
Ana

Reputation: 1586

What functions work with JuMPArrays?

Is there a way to make certain functions such as isinteger() work with JuMPArrays? I am using Julia/JuMP to solve an optimization problem, and after I get the solution, I want to check if the solution is integer. So here is what I wrote:

@defVar(m, 0<= x[1:3] <= 1)
...
xstar = getValue(x)
if isinteger(xstar)
  ...
end

And I get an error saying isinteger() has no method matching isinteger(::JuMPArray). Thanks

Upvotes: 1

Views: 292

Answers (1)

IainDunning
IainDunning

Reputation: 11664

So in general you can get an underlying array from a JuMPArray by using [:], e.g.

m = Model()
@variable(m, 0 <= x[1:3] <= 1)
@variable(m, 0 <= y[1:10, 1:10] <= 1)
solve(m)
xstar = getvalue(x)[:]
ystar = getvalue(y)[:,:]

Note that the reason for this is that JuMPArrays don't have to start with index 1, so the user needs to explicitly say they want a normal Julia array before doing things.

Regardless, you shouldn't use isinteger. Solvers don't always return very precise answers, e.g. they might say x[1] = 0.999996 but they really mean it is 1. You should do something like

for i in 1:3
    if getvalue(x[i]) >= 0.999
        println("x[$i] is 1!")
    elseif getvalue(x[i]) <= 0.001
        println("x[$i] is 0!")
    end
end

to make sure you don't get any false negatives. If the variable is restricted to be integer or binary, use iround, e.g.

for i in 1:3
    v = iround(getvalue(x[i]))
    if v == 1
        println("x[$i] is 1!")
    elseif v == 0
        println("x[$i] is 0!")
    end
end

but it looks like in this case you are just seeing if the solution is naturally 0 or 1.

Upvotes: 1

Related Questions