 AMPL > >Variables > >When I set option substout 1, why doesn’t AMPL make the substitutions that I expect?

A variable is ineligible to be substituted out of a problem if (a) it is subject to any bounds or integrality conditions, or (b) it has already appeared on the right-hand side of a constraint that was used to make a substitution.

Case (a) includes bounds or integrality conditions specified in the variable’s declaration, and also bounds that are added by AMPL’s presolve phase. Thus turning presolve off (by setting `option presolve 0`) may permit a greater number of substitutions.

For constraints indexed over a set, the incidence of case (b) may depend on the ordering of the set. Consider for example the constraints

```var x {1..10};
subj to step {j in 1..9}: x[j] = x[j+1] + 1;
```

The first several constraints generated are

```step:  x = x + 1
step:  x = x + 1
step:  x = x + 1
step:  x = x + 1
```

Constraint `step` may be used to substitute for `x`. Constraint `step` may not be used to substitute for `x`, however, because `x` has already appeared on the right-hand side of a constraint, namely `step`, that was used to make a substitution. Similarly, `step` may be used to substitute for `x`, but `step` may not be used to substitute for `x`, and so forth. Only the odd-numbered constraints `step[j]` are eliminated by substitution in this case.

If instead you write the declaration with the ordered index set reversed,

```subj to step {j in 9..1 by -1} x[j] = x[j+1] + 1;
```

then the constraints are generated as

```step:  x = x + 1
step:  x = x + 1
step:  x = x + 1
step:  x = x + 1
```

and case (b) does not occur. All of the constraints `step[j]` can be eliminated, and every variable except `x` is substituted out as a result.

Close attention to formulation may thus be necessary to get the substitutions that you want. Set option `show_stats 1` to see how many substitutions are being made, and use AMPL’s constraint expansion commands to see the constraints (in order) before and after substitution.

Posted in: Variables