Abstract Models
Note
TODO: this is a copy of “Abstract vs Concrete” from Getting Started.
This should be expanded here.
A mathematical model can be defined using symbols that represent data
values. For example, the following equations represent a linear program
(LP) to find optimal values for the vector \(x\) with parameters
\(n\) and \(b\), and parameter vectors \(a\) and \(c\):
\[
\begin{array}{lll}
\min & \sum_{j=1}^n c_j x_j &\\
\mathrm{s.t.} & \sum_{j=1}^n a_{ij} x_j \geq b_i & \forall i = 1 \ldots m\\
& x_j \geq 0 & \forall j = 1 \ldots n
\end{array}
\]
Note
As a convenience, we use the symbol \(\forall\) to mean “for all”
or “for each.”
We call this an abstract or symbolic mathematical model since it
relies on unspecified parameter values. Data values can be used to
specify a model instance. The AbstractModel
class provides a
context for defining and initializing abstract optimization models in
Pyomo when the data values will be supplied at the time a solution is to
be obtained.
In many contexts, a mathematical model can and should be directly
defined with the data values supplied at the time of the model
definition. We call these concrete mathematical models. For example,
the following LP model is a concrete instance of the previous abstract
model:
\[
\begin{array}{ll}
\min & 2 x_1 + 3 x_2\\
\mathrm{s.t.} & 3 x_1 + 4 x_2 \geq 1\\
& x_1, x_2 \geq 0
\end{array}
\]
The ConcreteModel
class is used to define concrete optimization
models in Pyomo.
Note
Python programmers will probably prefer to write concrete models,
while users of some other algebraic modeling languages may tend to
prefer to write abstract models. The choice is largely a matter of
taste; some applications may be a little more straightforward using
one or the other.