Either a data table gave values for the parameter with incorrect subscripts, or the parameter’s indexing set changed, causing some previously valid subscripts to become invalid. For example, in the diet.mod + diet.dat example (Figures 2-1 and 2-2) of the AMPL book, values of parameter cost are supplied for all eight members of set FOOD
:
ampl: display cost;
cost [*] :=
BEEF 3.19 FISH 2.29 MCH 1.89 SPG 1.99 CHK 2.59 HAM 2.89 MTL 1.99 TUR 2.49
;
If you remove the member CHK
from FOOD
, using for example a let
command, then you get a message that cost["CHK"]
has also been dropped from the data:
ampl: let FOOD := FOOD diff {"CHK"};
ampl: display cost;
Error executing "display" command:
error processing param cost: invalid subscript cost['CHK'] discarded.
cost [*] :=
BEEF 3.19 HAM 2.89 MTL 1.99 TUR 2.49 FISH 2.29 MCH 1.89 SPG 1.99
Since cost["CHK"]
has now been dropped, no further error message will appear if you type display cost
again.
To avoid error messages of this sort, you can define a more flexible set structure for your model as shown in dietflex.mod and dietflex.dat. The auxiliary set FOOD_DROP
defaults to empty, so that the problem is solved for all foods; but you can change FOOD_DROP
to {"CHK"}
to solve without member CHK
:
ampl: model dietflex.mod;
ampl: data dietflex.dat;
ampl: option show_stats 1;
ampl: solve;
8 variables, all linear
6 constraints, all linear; 47 nonzeros
5 inequality constraints
1 range constraint
1 linear objective; 8 nonzeros.
MINOS 5.51: optimal solution found.
13 iterations, objective 118.0594032
ampl: let FOOD_DROP := {"CHK"};
ampl: solve;
7 variables, all linear
6 constraints, all linear; 42 nonzeros
5 inequality constraints
1 range constraint
1 linear objective; 7 nonzeros.
MINOS 5.51: optimal solution found.
3 iterations, objective 117.3218891
Changing FOOD_DROP
does not affect the set FOOD_ALL
, and consequently all of the subscripts in the data remain valid.