data vector $y[k]$, $k\in K$, there exists a corresponding non-negative code vector $x[k]$ that when fed through the network gives a close approximation to $y[k]$. So in addition to learning weights, the network must also learn the code that goes with each data item in the batch.

Provided only that the matrix of weights $W$ in an approximate factorization $Y\approx W X$ of a batch is full rank, an encoder can be constructed starting with the standard pseudo-inverse $$\label{Winv}
\mathcal{E}_W=(W^T W)^{-1}W^T.$$ This $n\times m$ matrix may be interpreted as the weights in the encoding stage of an autoencoder, and should be followed by a ReLU activation correction to ensure the codes $x$ are non-negative: $$\label{NMFencode}
x=\mathrm{ReLU}(\mathcal{E}_W\,y).$$ We emphasize that this encoding stage only plays a very small part in the training. For modestly sized data sets, where we can process all the data as a single batch, it plays no role at all. For larger data sets, where the data must be partitioned into batches, we use only in the initialization of the RRR solution process (code vectors $x$ initialized for new data $y$ to values determined by weights learned in the previous batch).

Constraints
-----------

The variables in our 