AMPL > >Faqs

Displays and Results

How can I look at the explicit constraints that AMPL has generated from my model and data?

AMPL’s expand command can display any explicit linear constraint, or indexed collection of constraints. For example:

ampl: model transp.mod;
ampl: data transp.dat;
ampl: expand Demand['STL'];
s.t. Demand['STL']:
        Trans['GARY','STL'] + Trans['CLEV','STL'] +
        Trans['PITT','STL'] = 1700;
ampl: expand Supply;
s.t. Supply['GARY']:
        Trans['GARY','FRA'] + Trans['GARY','DET'] +
        Trans['GARY','LAN'] + Trans['GARY','WIN'] +
        Trans['GARY','STL'] + Trans['GARY','FRE'] +
        Trans['GARY','LAF'] = 1400;
s.t. Supply['CLEV']:
        Trans['CLEV','FRA'] + Trans['CLEV','DET'] +
        Trans['CLEV','LAN'] + Trans['CLEV','WIN'] +
        Trans['CLEV','STL'] + Trans['CLEV','FRE'] +
        Trans['CLEV','LAF'] = 2600;
s.t. Supply['PITT']:
        Trans['PITT','FRA'] + Trans['PITT','DET'] +
        Trans['PITT','LAN'] + Trans['PITT','WIN'] +
        Trans['PITT','STL'] + Trans['PITT','FRE'] +
        Trans['PITT','LAF'] = 2900;

The expand command also works with variables and objectives, and has indexing options similar to those of display or print for specifying which components are expanded.

How do I list all variables that have a certain property in the optimal solution?

The built-in parameter _nvars contains the number of variables; a symbolic parameter _varname[j] contains the AMPL name of the jth variable; and _var[j] is a “synonym” that refers to the jth variable. Thus to show the names of all variables that are below their upper bounds at the optimum, for example, you can write:

ampl: display {j in 1.._nvars:
ampl?   _var[j] < _var[j].ub - 0.00001} _varname[j];
_varname[j] [*] :=
2  "PD_Ship['SE']"
5  "DW_Ship['NE','BWI']"
6  "DW_Ship['SE','EWR']"
7  "DW_Ship['SE','BWI']"

This is only one of the uses for AMPL’s generic synonyms for variables, constraints and objectives. See the discussion of AMPL’s generic names in Section A.19.4 of the reference appendix to the AMPL book.

How do I get “ranges” and other sensitivity analyses?

AMPL’s suffix feature can be used by solvers to return ranging information. See in particular the discussion of solver-defined suffixes in Section 14.3 of the AMPL book for an example of range output from CPLEX. The option listings for the CPLEX and Gurobi solvers contain more information about how to request and retrieve this information.

AMPL does not currently support “parametric” algorithms for postoptimal analysis of objective functions or constraint right-hand sides.

In practice, ranging often provides sensitivity information of limited usefulness, and parametric algorithms are limited to certain kinds of linear changes to the data. You may do better to write a simple AMPL script that solves the same model for a series of different parameter values. For an example, see the simple sensitivity analysis script developed in Section 13.1 of the AMPL book.

How do I get a “tableau column” from AMPL?

AMPL cannot determine by itself the values from the linear programming tableau, because the sparse linear algebra routines capable of computing these values are found only in the solvers. Efficient solver implementations avoid computing or storing more than a few tableau columns at a time, however. Hence AMPL also has no solver directives that can cause tableau values to be returned.

For a specific AMPL model, it is possible to set up an auxiliary model that finds the tableau values, at least in the nondegenerate case; see our diet tableau example based on the diet model from Chapter 2 of the AMPL book. This approach is highly inefficient, but should be adequate for small linear programs — up to a few dozen variables, say.

Why can’t I view an indexed collection of subsets by typing display {k in SS} POW[k]?

The display command does not currently recognize {k in SS} POW[k] where POW is an indexed (subscripted) set. For this elementary case, you can exhibit the whole indexed collection of subsets by giving just the name of the collection:

display POW;

You can also exhibit each of the indexed sets separately, by using the iterated form of the display command; it resembles the ordinary form, but with a colon after the index set:

display {k in SS}: POW[k];

This gives the same output as if you had typed a separate statement display POW[k] for each member k of SS. Any set expression (or list of expressions) may follow the colon.

How can I get the display command to list a set’s members in the same order that they were given in my data file?

Add the keyword ordered to the set’s declaration, after the set name. It can be useful to declare a set ordered for purposes of ordering the output, even when the ordering plays no role in the model.

Where do I find the amount of computation (CPU) time taken by AMPL or by a solver?

AMPL provides the following built-in timing parameters such as _ampl_time and _total_solve_time. You’ll find the complete list in Table A-14 in the reference appendix of the AMPL book. These timing parameters can be used in all the same ways as ordinary AMPL parameters defined through param statements. Thus in particular you can show their values (or the values of expressions involving them) by use of display or printf commands.