Hyperedges ---------- A hyperedge typically couples variables belonging to different nodes via equality or inequality constraints (or both). Each hyperedge is defined using a dedicated code block. This code block must be started by either the ``#HYPEREDGE`` keyword or the :``#LINK`` keyword (the two can be used interchangeably). A hyperedge must have a unique :math:`\texttt{}` and no two hyperedges or hyperedge and node may have the same identifier. In addition, a hyperedge may have its own parameters and constraints. Hence, valid hyperedge blocks have the following structure: .. code-block:: c #HYPEREDGE #PARAMETERS // parameter definitions #CONSTRAINTS // constraint definitions #LINK #PARAMETERS // parameter definitions #CONSTRAINTS // constraint definitions Parameters and constraints are further described below. Parameters ========== Parameters defined in a ``#HYPEREDGE`` block follow the exact same rules as the ones defined in ``#NODE`` blocks. Constraints =========== While affine constraints involving all variables declared in a ``#NODE`` block can be defined in the same block, constraints defined in ``#HYPEREDGE`` blocks couple :math:`\texttt{external}` variables associated with any subset of nodes. The syntax for defining constraints is otherwise the same as the one used in ``#NODE`` blocks: .. code-block:: c #CONSTRAINTS == ; <= ; >= ; Similarly to the constraints defined in nodes, hyperedges can also be named by adding an identifier with colon defore the constraint, as follows, .. math:: \texttt{: ;} Given these syntax rules, the following is an example including valid hyperedge blocks (and associated ``#NODE`` blocks): .. code-block:: c #TIMEHORIZON // time horizon definition #NODE node1 #VARIABLES external : x; external : inflow[T]; // further node content #NODE node2 #VARIABLES external : y; external : outflow[T]; // further node content #HYPEREDGE hyperedge1 #CONSTRAINTS node1.inflow[t] == node2.outflow[t]; #NODE node3 #VARIABLES external : z; // further node content #LINK hyperedge2 #PARAMETERS weight = {1/3,2/3}; #CONSTRAINTS node1.x <= weight[0]*node2.y + weight[1]*node3.z; node2.y <= node3.z;