code: def backward(ctx, grad_output):
      L, control_var, epsilon = ctx.saved_tensors
      B, C = control_var
      g = grad_output
      loc_grad = sum_leftmost(grad_output, -1)
  
      # compute the rep trick gradient
      epsilon_jb = epsilon.unsqueeze(-2)
      g_ja = g.unsqueeze(-1)
      diff_L_ab = sum_leftmost(g_ja * epsilon_jb, -2)
  
      # modulate the velocity fields with infinitesimal rotations, i.e. apply the control variate
      gL = torch.matmul(g, L)
      eps_gL_ab = sum_leftmost(
          gL.unsqueeze(-1) * epsilon.unsqueeze(-2), -2
      )
      xi_ab = eps_gL_ab - eps_gL_ab.t()
      BC_lab = B.unsqueeze(-1) * C.unsqueeze(-2)
      diff_L_ab += (xi_ab.unsqueeze(0) * BC_lab).sum(0)
      L_grad = torch.tril(diff_L_ab)
  
      # compute control_var grads
      diff_B = (
          L_grad.unsqueeze(0) * C.unsqueeze(-2) * xi_ab.unsqueeze(0)
      ).sum(2)
      diff_C = (
          L_grad.t().unsqueeze(0)
          * B.unsqueeze(-2)
          * xi_ab.t().unsqueeze(0)
      ).sum(2)
      diff_CV = torch.stack([diff_B, diff_C])
  
      return loc_grad, L_grad, diff_CV, None
  
file_path: pyro/pyro/distributions/avf_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 sum_leftmost
label_desc: Use image node_id 2 for calling the _AVFMVNSample obj's underlying member method code with example usage: obj.backward(ctx, grad_output) and returns: loc_grad,  L_grad,  diff_CV,  None