code: def forward(self, x, K=1):
      qz_xs, zss = [], []
      # initialise cross-modal matrix
      px_zs = [
          [None for _ in range(len(self.vaes))]
          for _ in range(len(self.vaes))
      ]
      for m, vae in enumerate(self.vaes):
          qz_x, px_z, zs = vae(x[m], K=K)
          qz_xs.append(qz_x)
          zss.append(zs)
          px_zs[m][m] = px_z  # fill-in diagonal
      for e, zs in enumerate(zss):
          for d, vae in enumerate(self.vaes):
              if e != d:  # fill-in off-diagonal
                  px_zs[e][d] = vae.px_z(*vae.dec(zs))
      return qz_xs, px_zs, zss
  
file_path: mmvae/src/models/mmvae.py
imports: from itertools import combinations
  import torch
  import torch.nn
  from utils import get_mean, kl_divergence
  from vis import embed_umap, tensors_to_df
label_desc: Use image node_id 4 for calling the MMVAE obj's underlying member method code with example usage: obj.forward(x, K) and returns: qz_xs,  px_zs,  zss