HAL9000
HAL9000

Reputation: 3751

ERROR: `*` has no method matching *(::Variable)

I wrote the following code:

using JuMP

m = Model()

const A = 
[ :a0 ,
  :a1 , 
  :a2 ]

const T = [1:5]

const U = 
[
  :a0 =>    [9  9  9  9  999],
  :a1 =>    [11 11 11 11 11],
  :a2 =>    [1  1  1  1  1]
]

@defVar(m, x[A,T], Bin)

@setObjective(m, Max, sum{sum{x[i,j] * U[i,j], i=A}, j=T} )

print(m)

status = solve(m)

println("Objective value: ", getObjectiveValue(m))
println("x = ", getValue(x))

When I run it I get the following error

ERROR: `*` has no method matching *(::Variable)
 in anonymous at /home/username/.julia/v0.3/JuMP/src/macros.jl:71
 in include at ./boot.jl:245
 in include_from_node1 at loading.jl:128
 in process_options at ./client.jl:285
 in _start at ./client.jl:354
while loading /programs/julia-0.2.1/models/a003.jl, in expression starting on line 21

What's the correct way of doing this?

Upvotes: 3

Views: 2146

Answers (2)

IainDunning
IainDunning

Reputation: 11644

As the manual says:

There is one key restriction on the form of the expression in the second case: if there is a product between coefficients and variables, the variables must appear last. That is, Coefficient times Variable is good, but Variable times Coefficient is bad

Let me know if there is another place I could put this that would have helped you out.

This situation isn't desirable but unfortunately we haven't got a good solution yet that retains the fast model construction capabilities of JuMP.

I believe the problem with U is that it is a dictionary of arrays, thus you first need to index into the dictionary to return the correct array, then index into the array. JuMP's variables have more powerful indexing, so allow you to do it in one set of [].

Upvotes: 5

HAL9000
HAL9000

Reputation: 3751

I resolved my problem: constants must preceed variables as I read somewhere, moreover it seems that an array of constants must be used as an array of arrays while variables can be used as matrices.

Here's the correct line:

@setObjective(m, Max, sum{sum{U[i][j]*x[i,j], i=A}, j=T} )

Upvotes: 3

Related Questions