Parameters
The word “parameters” is used in many settings. When discussing a Pyomo
model, we use the word to refer to data that must be provided in order
to find an optimal (or good) assignment of values to the decision
variables. Parameters are declared as instances of a Param
class, which
takes arguments that are somewhat similar to the Set
class. For
example, the following code snippet declares sets model.A
and
model.B
, and then a parameter model.P
that is indexed by
model.A
and model.B
:
model.A = pyo.RangeSet(1,3)
model.B = pyo.Set()
model.P = pyo.Param(model.A, model.B)
In addition to sets that serve as indexes, Param
takes
the following options:
default
= The parameter value absent any other specification.doc
= A string describing the parameter.initialize
= A function (or Python object) that returns data used to initialize the parameter values.mutable
= Boolean value indicating if the Param values are allowed to change after the Param is initialized.validate
= A callback function that takes the model, proposed value, and indices of the proposed value; returningTrue
if the value is valid. ReturningFalse
will generate an exception.within
= Set used for validation; it specifies the domain of valid parameter values.
These options perform in the same way as they do for Set
. For
example, given model.A
with values {1, 2, 3}
, then there are many
ways to create a parameter that represents a square matrix with 9, 16, 25 on the
main diagonal and zeros elsewhere, here are two ways to do it. First using a
Python object to initialize:
v={}
v[1,1] = 9
v[2,2] = 16
v[3,3] = 25
model.S1 = pyo.Param(model.A, model.A, initialize=v, default=0)
And now using an initialization function that is automatically called
once for each index tuple (remember that we are assuming that
model.A
contains {1, 2, 3}
)
def s_init(model, i, j):
if i == j:
return i*i
else:
return 0.0
model.S2 = pyo.Param(model.A, model.A, initialize=s_init)
In this example, the index set contained integers, but index sets need not be numeric. It is very common to use strings.
Note
Data specified in an input file will override the data specified by
the initialize
option.
Parameter values can be checked by a validation function. In the
following example, the every value of the parameter T
(indexed by
model.A
) is checked
to be greater than 3.14159. If a value is provided that is less than
that, the model instantiation will be terminated and an error message
issued. The validation function should be written so as to return
True
if the data is valid and False
otherwise.
t_data = {1: 10, 2: 3, 3: 20}
def t_validate(model, v, i):
return v > 3.14159
model.T = pyo.Param(model.A, validate=t_validate, initialize=t_data)
This example will prodice the following error, indicating that the value
provided for T[2]
failed validation:
Traceback (most recent call last):
...
ValueError: Invalid parameter value: T[2] = '3', value type=<class 'int'>.
Value failed parameter validation rule