AMPL, aka A Mathematical Programming Language, is an open source programming language created in 1985 by Robert Fourer and David Gay and Brian Kernighan.

#269on PLDB | 39Years Old | 6kRepos |

A Mathematical Programming Language (AMPL) is an algebraic modeling language to describe and solve high-complexity problems for large-scale mathematical computing (i.e., large-scale optimization and scheduling-type problems). It was developed by Robert Fourer, David Gay, and Brian Kernighan at Bell Laboratories. AMPL supports dozens of solvers, both open source and commercial software, including CBC, CPLEX, FortMP, Gurobi, MINOS, IPOPT, SNOPT, KNITRO, and LGO. Read more on Wikipedia...

- Tags: programming language
- There are at least 5,570 AMPL repos on GitHub
- Early development of AMPL happened in AMPL Optimization LLC
- The Google BigQuery Public Dataset GitHub snapshot shows 806 users using AMPL in 852 repos on GitHub
- Explore AMPL snippets on Rosetta Code
- AMPL on HOPL
- Pygments supports syntax highlighting for AMPL
- GitHub supports syntax highlighting for AMPL
- Events page for AMPL
- Indeed.com has 3 matches for "ampl developer".
- ampl.com was registered in 1995
- See also: (8 related languages) Linux, Unix, awk, C, Algebraic modeling language, NL, XML, Microsoft Excel
- 3 PLDB concepts link to AMPL: mpl, MPS Format, rason

Example from the web:

```
set PROD; # products
param rate {PROD} > 0; # tons produced per hour
param avail >= 0; # hours available in week
param profit {PROD}; # profit per ton
param market {PROD} >= 0; # limit on tons sold in week
var Make {p in PROD} >= 0, <= market[p]; # tons produced
maximize Total_Profit: sum {p in PROD} profit[p] * Make[p];
# Objective: total profits from all products
subject to Time: sum {p in PROD} (1/rate[p]) * Make[p] <= avail;
# Constraint: total of hours used by all
# products may not exceed hours available
```

Example from Linguist:

```
# A toy knapsack problem from the LocalSolver docs written in AMPL.
set I;
param Value{I};
param Weight{I};
param KnapsackBound;
var Take{I} binary;
maximize TotalValue: sum{i in I} Take[i] * Value[i];
s.t. WeightLimit: sum{i in I} Take[i] * Weight[i] <= KnapsackBound;
data;
param:
I: Weight Value :=
0 10 1
1 60 10
2 30 15
3 40 40
4 30 60
5 20 90
6 20 100
7 2 15;
param KnapsackBound := 102;
```

Example from Wikipedia:

```
set Plants;
set Markets;
# Capacity of plant p in cases
param Capacity{p in Plants};
# Demand at market m in cases
param Demand{m in Markets};
# Distance in thousands of miles
param Distance{Plants, Markets};
# Freight in dollars per case per thousand miles
param Freight;
# Transport cost in thousands of dollars per case
param TransportCost{p in Plants, m in Markets} :=
Freight * Distance[p, m] / 1000;
# Shipment quantities in cases
var shipment{Plants, Markets} >= 0;
# Total transportation costs in thousands of dollars
minimize cost:
sum{p in Plants, m in Markets} TransportCost[p, m] * shipment[p, m];
# Observe supply limit at plant p
s.t. supply{p in Plants}: sum{m in Markets} shipment[p, m] <= Capacity[p];
# Satisfy demand at market m
s.t. demand{m in Markets}: sum{p in Plants} shipment[p, m] >= Demand[m];
data;
set Plants := seattle san-diego;
set Markets := new-york chicago topeka;
param Capacity :=
seattle 350
san-diego 600;
param Demand :=
new-york 325
chicago 300
topeka 275;
param Distance : new-york chicago topeka :=
seattle 2.5 1.7 1.8
san-diego 2.5 1.8 1.4;
param Freight := 90;
```

Feature | Supported | Example | Token |
---|---|---|---|

MultiLine Comments | âœ“ | ||

Integers | âœ“ | # \d+([eE][+-]?\d+)? | |

Floats | âœ“ | # (\d+\.(?!\.)\d*|\.(?!.)\d+)([eE][+-]?\d+)? | |

Assignment | âœ“ | := | |

Comments | âœ“ | # A comment | |

Line Comments | âœ“ | # A comment | # |

Semantic Indentation | X |