for(int e=0; e < ne; e++) {
ChiEdge<Float> edge = (side == LEFTSIDE ? vertex.outEdge(e) : vertex.inEdge(e));
float observation = edge.getValue();
if (observation < 1.0) throw new RuntimeException("Had invalid observation: " + observation + " on edge " + idTranslate.backward(vertex.getId()) + "->" +
idTranslate.backward(edge.getVertexId()));
otherSideMatrix.getRow(idTranslate.backward(edge.getVertexId()), neighborLatent);
for(int i=0; i < D; i++) {
Xty.setEntry(i, Xty.getEntry(i) + neighborLatent[i] * observation);
for(int j=i; j < D; j++) {
XtX.setEntry(j,i, XtX.getEntry(j, i) + neighborLatent[i] * neighborLatent[j]);