# Adjustable Variables

Adjustable variables

An *adjustable variable* reflects a decision made after uncertain data
has been revealed. In robust optimization this is interpreted as the
adjustable variable taking some (explicit or implicit) functional form
in terms of the uncertain data on which it depends. In AIMMS, you
indicate that a `Variable`

should be treated as adjustable by setting
its `Adjustable`

property.

The `Dependency`

attribute

For any adjustable variable, AIMMS will create a `Dependency`

attribute which you can use to specify on which uncertain parameters the
variable depends. The attribute value must be a comma-separated list of
mappings from an uncertain parameter to a binary parameter, indicating
for which combination of indices a dependency exists on that uncertain
parameter.

Linear decision rule only

AIMMS currently only supports the *linear decision rule*, which means
any adjustable variable will be expressed as an affine relation in terms
of the uncertain parameters which it depends on. More explicitly, if an
adjustable variable \(x(t)\) depends on uncertain parameters
\(d_r\), then, under the linear decision rule, AIMMS assumes that
\(x(t)\) takes the form

where \(X_0(t)\) and \(X_r(t)\) are newly introduced
intermediate variables, the value of which is determined by solving the
robust counterpart. As such, the value of an adjustable variable is not
fully determined by the solver. It can be computed afterwards for a
given realization of the uncertain parameters. AIMMS will automatically
generate the affine relation based on the dependencies you indicated in
the `Dependency`

attribute, without the need for you to introduce the
appropriate intermediate variables.

Requirements for adjustable variables

In order for AIMMS to be able to generate the robust counterpart of a
robust optimization model, the model must satisfy the *fixed recourse*
condition, i.e., the coefficients of any adjustable variables in your
model must not depend on uncertain parameters. In addition, for AIMMS to
be able to generate the robust counterpart, adjustable variables may
*not* occur in chance constraints. Also, adjustable variables cannot be
integer.

The `.Adjustable`

suffix for variables

The collection of intermediate variables introduced during this process,
automatically becomes available through the `.Adjustable`

attribute of
the adjustable variable at hand, followed by the name of the uncertain
parameter involved. That is, if an adjustable variable `x(i)`

depends
on an uncertain parameter `a(j)`

, then the corresponding intermediate
variable is available as the expression `x.Adjustable.a(i,j)`

. In
addition, a variable `x.Adjustable.Constant(i)`

will be created to
account for the constant part of the affine relation. If necessary, you
can bound these variables through the .Lower and .Upper
suffices, or you can formulate additional constraints on these
variables.

Example

Consider the following declarations

```
Variable Stock {
IndexDomain : t;
Property : Adjustable;
Dependency : Demand(t2) : StockDemandDependency(t,t2);
}
Parameter Demand {
IndexDomain : t;
Property : Uncertain;
}
Parameter StockDemandDependency {
IndexDomain : (t,t2);
Definition : 1 $ (t2 < t);
}
```

These declarations yield that the adjustable variable `Stock(t)`

depends on the uncertain parameter `Demand(t2)`

for all elements
`t2`

smaller than `t`

. Given these declarations, AIMMS will generate
the following definition for `Stock(t)`

```
Stock(t) = Stock.Adjustable.Constant(t) +
sum(t2 | StockDemandDependency(t,t2), Stock.Adjustable.Demand(t,t2)*Demand(t2))
```

If the data for `Demand(t)`

becomes available, you can use the
computed values of `Stock.Adjustable.Demand(t,t2)`

and
`Stock.Adjustable.Constant`

to compute the value of `Stock(t)`

.

Warning: using same indices

You should be aware that using the same indices in the `Dependency`

attribute and the index domain of the adjustable variable will restrict
the dependencies that are generated. For example, assume we have the
following declarations

```
Variable Stock {
IndexDomain : t;
Property : Adjustable;
Dependency : Demand(t);
}
Parameter Demand {
IndexDomain : t;
Property : Uncertain;
}
```

Given these declarations, AIMMS will generate the following definition
for `Stock(t)`

```
Stock(t) = Stock.Adjustable.Constant(t) + Stock.Adjustable.Demand(t)*Demand(t)
```

If you want `Stock(t)`

to depend on all possible `Demand`

then you
should use a different index in the `Dependency`

attribute, e.g.,

```
Variable Stock {
IndexDomain : t;
Property : Adjustable;
Dependency : Demand(t2);
}
```

Evaluating adjustable variables

To compute the values of an adjustable variable for a given realization
of the uncertain parameters of the robust optimization model, you do not
have to explicitly add the appropriate definitions to your model. AIMMS
offers the function `GMP::Robust::EvaluateAdjustableVariables`

,
discussed in Supporting Functions for Robust Optimization Models, to automatically compute these
values for you.