code: @Override
      public void backward() {
          MVecArray<VarTensor> xs = modIn.getOutput();
          MVecArray<VarTensor> xsAdj = modIn.getOutputAdj();
          for (int a=0; a<xsAdj.dim(); a++) {
              VarTensor xAdj = xsAdj.get(a);
              // Compute the product of all the input factors except for a.
              // We compute this cavity by brute force, rather than dividing out from the joint.
              VarTensor prod = new VarTensor(yAdj);
              for (int b=0; b<xsAdj.dim(); b++) {
                  if (a == b) { continue; }
                  prod.prod(xs.get(b));
              }
              xAdj.add(prod.getMarginal(xAdj.getVars(), false));
          }
      }
docs: Backward pass: dG/d\psi(y_a) += dG/dp(y) dp(y)/d\psi(y_a)
  
  dp(y)/d\psi(y_a) = \prod_{b \neq a} \psi_b(y_b)