# How to create multidimensional sets in JuMP/Julia as in GAMS

**URL:** https://discourse.julialang.org/t/how-to-create-multidimensional-sets-in-jump-julia-as-in-gams/55581
**Category:** Optimization (Mathematical)
**Tags:** jump, syntax, optimization, set
**Created:** [February 18, 2021, 10:21pm UTC](https://discourse.julialang.org/t/how-to-create-multidimensional-sets-in-jump-julia-as-in-gams/55581 "2021-02-18T22:21:33Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![GraceMabele](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gracemabele/32/21360_2.png) [@GraceMabele](https://discourse.julialang.org/u/GraceMabele)
#### Post date: [February 18, 2021, 10:21pm UTC](https://discourse.julialang.org/t/how-to-create-multidimensional-sets-in-jump-julia-as-in-gams/55581/1 "2021-02-18T22:21:33Z")

</div>

In GAMS, we can create multidimensional sets as follows

```julia
Set i "mining regions" / china, ghana, ee+ussr, s-leone /
    n "ports" / accra, freetown, leningrad, shanghai /
    in(i,n) "mines to ports map" / china .shanghai
                                   ghana .accra
                                   ee+ussr.leningrad
                                   s-leone.freetown /;

```

How can I do the same in JuMP/Julia?

---

<div class="post-metadata">

### Author: ![NiclasMattsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/niclasmattsson/32/21988_2.png) [@NiclasMattsson](https://discourse.julialang.org/u/NiclasMattsson)
#### Post date: [February 18, 2021, 10:49pm UTC](https://discourse.julialang.org/t/how-to-create-multidimensional-sets-in-jump-julia-as-in-gams/55581/2 "2021-02-18T22:49:45Z")

</div>

Usually I’d suggest a vector of symbols, but since your regions contain characters like `+` and `-` probably a vector of strings is better in your case. Then the mines to ports map could be a dictionary, like so:

```julia
regions = ["china", "ghana", "ee+ussr", "s-leone"]
ports = ["accra", "freetown", "leningrad", "shanghai"]
links = Dict("china" => "shanghai",
             "ghana" => "accra",
             "ee+ussr" => "leningrad",
             "s-leone" => "freetown")

```

I teach an introductory course in energy system LP modeling. The first assignment is to build (or rather modify) a very simple model of a district heating system. The model was originally written in GAMS but I recently converted it to Julia/JuMP - you might find it useful to see how things can translate. Both versions (and the assignment itself) are available here:

> **[GitHub - niclasmattsson/LPtown: A simple LP model of a district heating...](https://github.com/niclasmattsson/LPtown)**
>
> A simple LP model of a district heating system, written in Julia/JuMP. - GitHub - niclasmattsson/LPtown: A simple LP model of a district heating system, written in Julia/JuMP.

---

<div class="post-metadata">

### Author: ![GraceMabele](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gracemabele/32/21360_2.png) [@GraceMabele](https://discourse.julialang.org/u/GraceMabele)
#### Post date: [February 19, 2021, 4:44am UTC](https://discourse.julialang.org/t/how-to-create-multidimensional-sets-in-jump-julia-as-in-gams/55581/3 "2021-02-19T04:44:22Z")

</div>

When I index it in a constraint, I obtain a key error.

Is it not better to have it as a vector of symbols?

---

<div class="post-metadata">

### Author: ![NiclasMattsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/niclasmattsson/32/21988_2.png) [@NiclasMattsson](https://discourse.julialang.org/u/NiclasMattsson)
#### Post date: [February 19, 2021, 9:30am UTC](https://discourse.julialang.org/t/how-to-create-multidimensional-sets-in-jump-julia-as-in-gams/55581/4 "2021-02-19T09:30:14Z")

</div>

It’s very hard to say without seeing the error in context, but key error means you’re trying to look up an element in the dictionary that doesn’t exist. Wild guess: are you doing something like `links[x]` where `x` is an integer?

```julia
julia> links["china"]
"shanghai"

julia> links[23]
ERROR: KeyError: key 23 not found

```

---

<div class="post-metadata">

### Author: ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)
#### Post date: [February 19, 2021, 7:53pm UTC](https://discourse.julialang.org/t/how-to-create-multidimensional-sets-in-jump-julia-as-in-gams/55581/5 "2021-02-19T19:53:23Z")

</div>

```nohighlight
julia> using JuMP

julia> regions = ["china", "ghana", "ee+ussr", "s-leone"]
4-element Array{String,1}:
 "china"
 "ghana"
 "ee+ussr"
 "s-leone"

julia> ports = ["accra", "freetown", "leningrad", "shanghai"]
4-element Array{String,1}:
 "accra"
 "freetown"
 "leningrad"
 "shanghai"

julia> links = [
           "china" => "shanghai",
           "ghana" => "accra",
           "ee+ussr" => "leningrad",
           "s-leone" => "freetown"
       ]
4-element Array{Pair{String,String},1}:
   "china" => "shanghai"
   "ghana" => "accra"
 "ee+ussr" => "leningrad"
 "s-leone" => "freetown"

julia> model = Model()
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: NO_OPTIMIZER
Solver name: No optimizer attached.

julia> @variable(model, arcs[r=regions, p=ports; (r => p) in links])
JuMP.Containers.SparseAxisArray{VariableRef,2,Tuple{String,String}} with 4 entries:
  [s-leone, freetown] = arcs[s-leone,freetown]
  [china, shanghai] = arcs[china,shanghai]
  [ee+ussr, leningrad] = arcs[ee+ussr,leningrad]
  [ghana, accra] = arcs[ghana,accra]

julia> arcs["s-leone", "freetown"]
arcs[s-leone,freetown]

```

---

<div class="post-metadata">

### Author: ![sylvaticus](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sylvaticus/32/203883_2.png) [@sylvaticus](https://discourse.julialang.org/u/sylvaticus)
#### Post date: [February 20, 2021, 10:49am UTC](https://discourse.julialang.org/t/how-to-create-multidimensional-sets-in-jump-julia-as-in-gams/55581/6 "2021-02-20T10:49:38Z")

</div>

See also this implementation in JuMP of the classical transport problem in GAMS:

> **[Jupyter Notebook Viewer](https://nbviewer.org/github/sylvaticus/juliatutorial/blob/master/assets/JuMP.ipynb)**
>
> Check out this Jupyter notebook!
