code: def backward(ctx, grad):
      (
          a,
          b,
          row_indices,
          row_offsets,
          column_indices,
          *_transp_info,
      ) = ctx.saved_tensors
      m, n = a.shape[1], b.shape[1]
  
      # gradients w.r.t. values
      grad = grad.contiguous()
      a = a.contiguous()
      b = b.contiguous()
  
      a_grad = torch.ops.xformers.spmm_sputnik(
          b, row_indices, grad, row_offsets, column_indices, m
      )
  
      (
          row_indices_t,
          grad_t,
          row_offsets_t,
          column_indices_t,
      ) = _transpose_with_info(grad, _transp_info)
  
      b_grad = torch.ops.xformers.spmm_sputnik(
          a, row_indices_t, grad_t, row_offsets_t, column_indices_t, n
      )
  
      return a_grad, b_grad, None, None, None, None
  
file_path: xformers/xformers/sparse/_csr_ops.py
imports: import torch
  from .utils import _csr_to_coo, _transpose_with_info
label_desc: Use image node_id 2 for calling the _sddmm obj's underlying member method code with example usage: obj.backward(ctx, grad) and returns: a_grad,  b_grad,  None,  None,  None,  None