code: def backward(ctx, grad_output):
      jitter = 1.0e-8  # do i really need this?
      z, epsilon, L = ctx.saved_tensors
  
      dim = L.shape[0]
      g = grad_output
      loc_grad = sum_leftmost(grad_output, -1)
  
      identity = eye_like(g, dim)
      R_inv = torch.linalg.solve_triangular(L.t(), identity, upper=True)
  
      z_ja = z.unsqueeze(-1)
      g_R_inv = torch.matmul(g, R_inv).unsqueeze(-2)
      epsilon_jb = epsilon.unsqueeze(-2)
      g_ja = g.unsqueeze(-1)
      diff_L_ab = 0.5 * sum_leftmost(
          g_ja * epsilon_jb + g_R_inv * z_ja, -2
      )
  
      Sigma_inv = torch.mm(R_inv, R_inv.t())
      V, D, _ = torch.svd(Sigma_inv + jitter)
      D_outer = D.unsqueeze(-1) + D.unsqueeze(0)
  
      expand_tuple = tuple([-1] * (z.dim() - 1) + [dim, dim])
      z_tilde = identity * torch.matmul(z, V).unsqueeze(-1).expand(
          *expand_tuple
      )
      g_tilde = identity * torch.matmul(g, V).unsqueeze(-1).expand(
          *expand_tuple
      )
  
      Y = sum_leftmost(
          torch.matmul(z_tilde, torch.matmul(1.0 / D_outer, g_tilde)),
          -2,
      )
      Y = torch.mm(V, torch.mm(Y, V.t()))
      Y = Y + Y.t()
  
      Tr_xi_Y = torch.mm(torch.mm(Sigma_inv, Y), R_inv) - torch.mm(
          Y, torch.mm(Sigma_inv, R_inv)
      )
      diff_L_ab += 0.5 * Tr_xi_Y
      L_grad = torch.tril(diff_L_ab)
  
      return loc_grad, L_grad, None
  
file_path: pyro/pyro/distributions/omt_mvn.py
imports: import torch
  from torch.autograd import Function
  from torch.autograd.function import once_differentiable
  from torch.distributions import constraints
  from pyro.distributions.torch import MultivariateNormal
  from pyro.distributions.util import eye_like, sum_leftmost
label_desc: Use image node_id 2 for calling the _OMTMVNSample obj's underlying member method code with example usage: obj.backward(ctx, grad_output) and returns: loc_grad,  L_grad,  None