constraint formulation of NMF follow the same pattern we will use in all the other examples: a weight $w[k,i\to j]$ and node variable $x[k,i\to j]$ for each data item $k$ and edge $i\to j$ of the network. In NMF these are the only variables. The node variables $x$ will hold the code vectors and have been replicated, on the edges incident to each code node, in order to split the constraints into independent sets $A$ and $B$. The latter are listed below:

$$\begin{aligned}
\mbox{$A$ constraints}\qquad\qquad\qquad&\nonumber\\
\forall\,k\in K, i\in C, j\in D&:\quad x[k,i\to j]=x_A[k,i]\ge 0\label{NMFA1}\\
\forall\,k\in K, i\in C, j\in D&:\quad w[k,i\to j]=w_A[i\to j]\ge 0\label{NMFA2}\\
\forall\,i\in C&:\quad \sum_j w_A^2[i\to j]=\Omega^2\label{NMFA3}\\
\mbox{$B$ constraints}\qquad\qquad\qquad&\nonumber\\
\forall\,k\in K,j\in D&:\quad \sum_i x[k,i\to j]\,w[k,i\to j]=y[k,j].\label{NMFB4}\end{aligned}$$

Note that $x_A$ and $w_A$ are not variables but shorthand for consensus values in the constraint. The reason for making the weight norm $\Omega$ a hyperparameter, and not arbitrarily setting it to 1, is discussed below.

Two things need to be checked for any constraint scheme, such as the one above. The first is that the satisfaction of all constraints, in both sets, solves the original problem. This is trivial, as the constraints are simply a transcription of the matrix equation $W 