Source code for gamspy.formulations.result
from __future__ import annotations
from typing import TYPE_CHECKING, Any, TypeAlias
if TYPE_CHECKING:
from collections.abc import Sequence
import gamspy as gp
MatchesType: TypeAlias = dict[
gp.Equation | Sequence[gp.Equation],
gp.Variable | Sequence[gp.Variable],
]
[docs]
class FormulationResult:
"""
FormulationResult class provides a common interface for returning results
when formulations are called. In the old convention, formulations returned
a tuple of result variable and list of equations. In some cases it was
possible to get extra output from the formulation. To provide backwards
compatibility, FormulationResult class can be unpacked into a result
variable and list of equations. Also it supports returning extra output in
unpacking.
With the FormulationResult you can have more access to underlying symbols
created such as equations, variables, parameters and sets. Since many
formulations created symbols with randomized names, it was tedious to find
intermediate symbols created. FormulationResult has dictionaries where keys
are expected to be documented in the formulation returning the
FormulationResult therefore you can access a symbol via its known key.
For example:
Examples
--------
>>> import gamspy as gp
>>> m = gp.Container()
>>> x = gp.Variable(m)
>>> res = gp.math.activation.relu_with_binary_var(x)
>>> aux_binary_var = res.variables_created["binary"]
Therefore, it is important for the formulation returning a
FormulationResult to properly list the keys to the symbols that are
created.
FormulationResult has the following attributes that might be useful:
- `result`
- `equations_created`
- `sets_created`
- `parameters_created`
- `matches`
- `other`
- `extra_return`
"""
def __init__(
self,
result: gp.Variable | gp.Parameter | None = None,
equations_created: dict[str, gp.Equation] | None = None,
extra_return: gp.Variable | MatchesType | None = None,
) -> None:
self.result = result
self.equations_created: dict[str, gp.Equation] = (
equations_created if equations_created is not None else {}
)
self.variables_created: dict[str, gp.Variable] = {}
self.sets_created: dict[str, gp.Set] = {}
self.parameters_created: dict[str, gp.Parameter] = {}
self.matches: MatchesType = {}
self.other: dict[str, Any] = {}
# Extra return is only here for backwards compat reasons
# try to use other when you can
self.extra_return = extra_return
def __len__(self):
# For backwards compat
return 2 + (self.extra_return is not None)
def __iter__(self):
# For backwards compat
if self.extra_return is None:
return [
self.result,
list(self.equations_created.values()),
].__iter__()
return [
self.result,
self.extra_return,
list(self.equations_created.values()),
].__iter__()
def __str__(self) -> str:
return (
"FormulationResult(\n"
+ " Equations: "
+ str(self.equations_created.keys())
+ "\n"
+ " Variables: "
+ str(self.variables_created.keys())
+ "\n"
+ " Sets: "
+ str(self.sets_created.keys())
+ "\n"
+ " Parameters: "
+ str(self.parameters_created.keys())
+ "\n"
+ " Num Matches: "
+ str(len(self.matches))
+ "\n"
+ " Other: "
+ str(self.other)
+ "\n"
+ ")"
)