Set Element Expressions
Use of set element expressions
Set element expressions reference a particular element or element tuple model from a set or a tuple domain. Set element expressions allow for sliced assignment-executing an assignment only for a lesser-dimensional subdomain by fixing certain dimensions to a specific set element. Potentially, this may lead to a vast reduction in execution times for time-consuming calculations.
Passing elements from the GUI
The most elementary form of a set element expression is an element parameter, which turns out to be a useful device for communicating set element information with the graphical interface. You can instruct AIMMS to locate the position in a table or other object where an end-user made changes to a numerical value, and have AIMMS pass the corresponding set element(s) to an element parameter. As a result, you can execute data input checks defined over these element parameters, thereby limiting the amount of computation. This issue is discussed in more detail in the help regarding the Identifier Selection dialog.
Element expressions
AIMMS supports several types of set element expressions, including references to parameters and (bound) indices, lag-lead-expressions, element-valued functions, and iterative-expressions. The last category turns out to be a useful device for computing the proper value of element parameters in your model.
Syntax
element-expression:
The format of list expressions are the same for element and numerical expressions. They are discussed in List Expressions.
Element references
An element reference is any reference to either an element parameter or a (bound) index.
Intrinsic Functions for Sets and Set Elements
The element-related functions…
AIMMS supports functions to obtain the position of an element within a
set, the cardinality (i.e. number of elements) of a set, the
\(n\)-th element in a set, the element in a non-compatible set with
the identical string representation, and the numerical value represented
by a set element. If S
is a set identifier, i
an index bound to
S
, \(l\) an element, and \(n\) a positive integer, then
possible calls to the Ord
, Card
, Sets and set elements, ElementCast
and Val
functions are given in this table.
Function |
Value |
Meaning |
---|---|---|
|
integer |
Ordinal, returns the relative position of the index |
|
integer |
Returns the relative position of the element \(l\) in set |
|
integer |
Cardinality of set |
|
element |
Returns the element in set |
|
element |
Returns the element in set |
|
numerical |
Returns the numerical value represented by \(l\), or a runtime error if \(l\) cannot be interpreted as a number |
|
Max |
Returns the set element with the highest ordinal |
|
Min |
Returns the set element with the lowest ordinal |
…for simple sets
The Ord
, Card
and Sets and set elements functions can be applied to simple
sets. In fact you can even apply Card
to parameters and variables-it
simply returns the number of nondefault elements associated with a
certain data structure.
Crossing root set boundaries
By default, AIMMS does not allow you to use indices associated with one
root set hierarchy in your model, in references to index domains
associated with another root set hierarchy of your model. The function
ElementCast
allows you to cross root set boundaries, by returning
the set element in the root set associated with the first (set) argument
that has the identical name as the element (in another root set) passed
as the second argument. The function ElementCast
has an optional
third argument create (values 0 or 1, with a default of 0), through
which you can indicate whether you want elements which cannot be cast to
the indicated set must be created within that set. In this case, a call
to ElementCast
will never fail. You can find more information about
root sets, as well as an illustrative example of the use of
ElementCast
, in Binding Rules.
Example
In this example, we again use the set Cities
initialized through the
statement
Cities := DATA { Amsterdam, Rotterdam, 'The Hague', London, Paris, Berlin, Madrid } ;
The following table illustrates the intrinsic element-valued functions.
Expression |
Result |
---|---|
|
1 |
|
0 (i.e. not in the set) |
|
7 |
|
|
|
|
The Val
function
If your model contains a set with elements that represent numerical
values, you cannot directly use such elements as a numerical value in
numerical expressions, unless the set is an integer set (see
Integer Sets). To obtain the numerical value of such set
elements, you can use the Val
function. You can also apply the
Val
function to strings that represent a numerical value. In both
cases, a runtime error will occur if the element or string argument of
the Val
function cannot be interpreted as a numerical value.
The element-valued Min
and Max
functions operate on two or more
element-valued expressions in the same (sub-)set hierarchy. If the
arguments are references to element parameters (or bound indices), then
the Range
attributes of these element parameters or indices must be
sets in a single set hierarchy. Through these functions you can obtain
the elements with the lowest and highest ordinal relative to the set
equal to highest ranking range set in the subset hierarchy of all its
arguments. If one or more of the arguments are explicit labels, then
AIMMS will verify that these labels are contained in that set, or will
return an error otherwise. A compiler error will result, if no such set
can be determined (i.e., when the function call refers to explicit
labels only).
Element-valued Iterative Expressions
Selecting elements
AIMMS offers special iterative operators that let you select a specific element from a domain. this table shows all such operators that result in a set element value. The syntax of iterative operators is explained in Iterative Set Operators. The second column in this table refers to the required number of expression arguments following the binding domain argument.
Name |
# Expr. |
Computes for all elements in the domain |
---|---|---|
0 |
the first element (tuple) |
|
0 |
the last element (tuple) |
|
|
1 |
the \(n\)-th element (tuple) |
1 |
the value of the element expression for which the expression reaches its minimum ordinal value |
|
1 |
the value of the element expression for which the expression reaches its maximum ordinal value |
|
|
1 |
the first element (tuple) for which the expression reaches its minimum value |
|
1 |
the first element (tuple) for which the expression reaches its maximum value |
Single index
The binding domain of the First
, Last
, Nth
, Min
,
Max
, ArgMin
, and ArgMax
operator can only consist of a
single index in either a simple set, and the result is a single element
in that domain. You can use this result directly for indexing or
referencing an indexed parameter or variable. Alternatively, you can
assign it to an element parameter in the appropriate domain.
Compared expressions
The ArgMin
and ArgMax
operators return the element for which an
expression reaches its minimum or maximum value. The allowed expressions
are:
numerical expressions, in which case AIMMS performs a numerical comparison,
string expressions, in which case AIMMS uses the normal alphabetic ordering, and
element expressions, in which case AIMMS compares the ordinal numbers of the resulting elements.
For element expressions, the iterative Min
and Max
operators
return expression values with the minimum and maximum ordinal value.
Example
The following assignments illustrate the use of some of the domain related iterative operators. The identifiers on the left are all element parameters.
FirstNonSupplyCity := First ( i | not Exists(j | Transport(i,j)) ) ;
SecondSupplyCity := Nth ( i | Exists(j | Transport(i,j)), 2 ) ;
SmallestSupplyCity := ArgMin( i, Sum(j, Transport(i,j)) ) ;
LargestTransportRoute := ArgMax( r, Transport(r) ) ;
Note that the iterative operators Exists
and Sum
are used here
for illustrative purposes, and are not set- or element-related. They are
treated in Logical Iterative Expressions and Numerical Iterative Operators,
respectively.
Lag and Lead Element Operators
Lag and lead operators…
There are four binary element operators, namely the lag and lead
operators +
, ++
, -
and --
. The first operand of each of
these operators must be an element reference (such as an index or
element parameter), while the second operand must be an integer
numerical expression. There are no unary element operators.
…explained
Lag and lead operators are used to relate an index or element parameter to preceding and subsequent elements in a set. Such correspondence is well-defined, except when a request extends beyond the bounds of the set.
Noncircular versus circular
There are two kinds of lag and lead operators, namely noncircular and circular operators which behave differently when pushed beyond the beginning and the end of a set.
The noncircular operators (
+
and-
) consider the ordered set elements as a sequence with no elements before the first element or after the last element.The circular operators (
++
and--
) consider ordered set elements as a circular chain, in which the first and last elements are linked.
Definition
Let S
be a set, i
a set element expression, and \(k\) an
integer-valued expression. The lag and lead operators +
, ++
,
-
, --
return the element of S
as defined in
this table. Please note that these operators are
also available in the form of +=
, -=
, ++=
and --=
. The
operators in this form can be used in statements like:
CurrentCity := 'Amsterdam';
CurrentCity --= 1; ! Equal to CurrentCity := CurrentCity -- 1;
Lag/lead expr. |
Meaning |
---|---|
\(\mathtt{i}\mathbin{\mathrm{+}}k\) |
The element of |
\(\mathtt{i}\mathbin{\mathrm{++}}k\) |
The circular version of \(\mathtt{i}\mathbin{\mathtt{+}}k\). |
\(\mathtt{i}\mathbin{\mathrm{-}}k\) |
The member of |
\(\mathtt{i}\mathbin{\mathrm{--}}k\) |
The circular version of \(\mathtt{i}\mathbin{\mathtt{-}}k\). |
Lag and lead operators for integer sets
For elements in integer sets, AIMMS may interpret the +
and -
operators either as lag/lead operators or as numerical operators.
Integer Sets discusses the way in which you can steer which
interpretation AIMMS will employ.
Not for literal elements
You cannot always use lag and lead operators in combination with literal set elements. The reason for this is clear: a literal element can be an element of more than one set, and in general, unless the context in which the lag or lead operator is used dictates a particular (domain) set, it is impossible for AIMMS to determine which set to work with.
Verify the effect of lags and leads
Lag and lead operators are frequently used in indexed parameters and variables, and may appear on the left- and right-hand side of assignments. You should be careful to check the correct use of the lag and lead operators to avoid making conceptual errors. For more specific information on the lag and lead operators refer to Assignment Statements, which treats assignments to parameters and variables.
Example
Consider the set Cities
initialized through the assignment
Cities := DATA { Amsterdam, Rotterdam, 'The Hague', London, Paris, Berlin, Madrid } ;
Assuming that the index i
and the element parameter CurrentCity
both currently refer to 'Rotterdam'
,
this table illustrates the results of
various lag/lead expressions.
Lag/lead expression |
Result |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ERROR |