# GLPK/Using GMPL (MathProg)

## Introduction

The first thing to note is that MathProg is not a procedural language. For example, unlike most programming languages, MathProg has no assignment statement. Rather MathProg is a functional language. MathProg is modeled on the AMPL language and provides a subset of that language. And like AMPL, its syntax is tailored to the expression of mathematical optimization problems.

## MathProg objects

### Sets

Within MathProg, sets are unordered collections of elements (unlike arrays in programming languages), so the element positions are indeterminate.

## MathProg syntax

### MathProg suffixes

As from GLPK 4.44 released 03 June 2010, MathProg supports suffixes for constraints and variables. The use of suffixes is covered in the official documentation under appendix A of doc/gmpl.pdf. The following table provides a summary:

Suffix Purpose
.lb lower bound
.ub upper bound
.status  status in the solution
.val primal value
.dual dual value

The MathProg printf statement can be used to create customized output. In the following case, the dual value of constraint c1 will be printed to the terminal:

```...
solve;
printf "dual value of constraint c1: %g\n", c1.dual;
```

Terminal output can also be duplicated to a text file with the GLPSOL command-line option --log filename.log.

### Set statement

The data parameter of the set statement is (as of May 2011) undocumented, but the idea is quite simple. Imagine that you declare a plain set S consisting of 5-tuples (i,j,k,l,m):

```set S, dimen 5;
```

which will be provided with data in the data section. But what you actually want is an array of sets T{j,m}, where T[j,m] is a set of triplets (l,i,k) from S. Using the data attribute, additionally declare a set T as follows:

```set T{j,m}, data S[2,5,4,1,3];
```

This statement has the same effect as providing the corresponding data for T itself from the data section, where [2,5,4,1,3] is a permutation of the component indices: the 2nd and 5th components of every 5-tuple in S gives a pair (j,m) used to index the elements of T, and the 4th, 1st, and 3rd components of the 5-tuple are used to build the (l,i,k) triplets, which are then included in the set T[j,m]. Finally, only plain sets are supported by the data attribute.

## Limitations

### Ordered sets

Ordered sets are not supported in MathProg. The discussions here and here provide some background as to why not. This 2006 thread describes one particular work-around.