Alias: Multiple Names for a Set#

Sometimes it is necessary to have more than one name for the same set, e.g., in models that deal with the interactions of elements within the same set. In input-output models for example, each commodity may be used in the production of all other commodities and it is necessary to have two names for the set of commodities to specify the problem without ambiguity. Example:

from gamspy import Container, Set, Alias

m = Container()

i = Set(m, name = "i", records=["i" + str(i) for i in range(5)])
ip = Alias(m, name = "ip", alias_with = i)

A second name ip for the set i is established that can be used instead of the original set name i.

Note

The newly introduced set name may be used as an alternative name for the original set; the associated set will always contain the same elements as the original set. If the alias name is not provided, it will be autogenerated.

Besides using the Alias() class directly, one can also facilitate the addAlias() method of the Container class (which internally calls Alias()):

h = Set(m, name="h", records=list(range(1, 6)))
hp = Alias(m, name="hp", alias_with=h)

It is possible to create an alias from another alias object. In this case a recursive search will be performed to find the root parent set – this is the set that will ultimately be stored as the alias_with property. We can see this behavior in the following example:

from gamspy import Container, Set, Alias

m = Container()

i = Set(m, name = "i", records=["i" + str(i) for i in range(5)])
ip = Alias(m, name = "ip", alias_with = i)
ipp = Alias(m, "ipp", ip)
In [1]: ip.alias_with.name
Out[1]: 'i'

In [2]: ipp.alias_with.name
Out[2]: 'i'

Warning

If an alias is to be used for the universal set, the gamspy.UniverseAlias() class has to be used. More about this in The Universal Set: * as Set Identifier.

Typical examples for the usage of aliases are problems where transportation costs between members of one set have to be modeled. Example:

from gamspy import Set, Alias, Parameter
import pandas as pd

m = Container()

i = Set(m, name = "i", description = "plant locations", records=[
    "palmasola", "pto-suarez", "potosi", "baranquill", "cartagena"
])

cost = pd.DataFrame(
    [
        ("pto-suarez", "palmasola",  87.22),
        ("potosi",     "palmasola",  31.25),
        ("potosi",     "pto-suarez", 55.97),
        ("baranquill", "palmasola",  89.80),
        ("baranquill", "pto-suarez", 114.56),
        ("baranquill", "potosi",     70.68),
        ("cartagena",  "palmasola",  89.80),
        ("cartagena",  "pto-suarez", 114.56),
        ("cartagena",  "potosi",     70.68),
        ("cartagena",  "baranquill", 5.00),
    ],
    columns=["from", "to", "us$ per ton"],
)

tran = Parameter(m, name="tran",
                       description = "transport cost for interplant shipments (us$ per ton)",
                       domain=[i, i], records=cost)

The parameter tran is two-dimensional and both indices are the set i. The data for the transport cost between the plants is given in this symbol; note that the transport costs are given only for one direction here, i.e. the costs from pto-suarez to palmasola are explicitly specified in the parameter while the costs in the opposite direction are not given at all:

palmasola

pto-suarez

potosi

baranquill

pto-suarez

87.22

nan

nan

nan

potosi

31.25

55.97

nan

nan

baranquill

89.8

114.56

70.68

nan

cartagena

89.8

114.56

70.68

5

The following alias statement introduces ip as another name for the set i. The parameter mui is also two-dimensional and both indices refer to the set i, but this time the alias ip is used in the second position. The parameter mui is defined to contain the transport costs from one plant location to the other, in both directions.

ip = Alias(m, name = "ip", alias_with = i)

mui = Parameter(m, name = "mui",
                      description = "transport cost: interplant shipments (us$ per ton)",
                      domain = [i, ip])

mui[i,ip] = tran[i,ip] + tran[ip,i]

Resulting in the following data for mui

palmasola

pto-suarez

potosi

baranquill

cartagena

palmasola

nan

87.22

31.25

89.8

89.8

pto-suarez

87.22

nan

55.97

114.56

114.56

potosi

31.25

55.97

nan

70.68

70.68

baranquill

89.8

114.56

70.68

nan

5

cartagena

89.8

114.56

70.68

5

nan

Note that if mui were defined without the alias, then all its entries would have been zero.