code: def backward(
      self, dnrows, dncols, dC_indptr, dC_indices, dC_eids, dC_weights
  ):
      # Only the last argument is meaningful.
      gidxC = self.backward_cache
      A_weights, B_weights = self.saved_tensors
      dgidxA, dA_weights = _csrmm(
          gidxC,
          dC_weights,
          self.gidxB.reverse(),
          B_weights,
          self.gidxA.number_of_ntypes(),
      )
      dgidxB, dB_weights = _csrmm(
          self.gidxA.reverse(),
          A_weights,
          gidxC,
          dC_weights,
          self.gidxB.number_of_ntypes(),
      )
      dA_weights = _csrmask(dgidxA, dA_weights, self.gidxA)
      dB_weights = _csrmask(dgidxB, dB_weights, self.gidxB)
      return dA_weights, dB_weights
  
imports: import mxnet
  import numpy
  from mxnet import nd
  from ..._sparse_ops import _bwd_segment_cmp, _csrmask, _csrmm, _csrsum, _gsddmm, _gspmm, _scatter_add, _segment_reduce
  from ...base import ALL, dgl_warning, is_all
  from ...heterograph_index import create_unitgraph_from_csr
  from .tensor import asnumpy, context, copy_to, to_backend_ctx, zerocopy_from_numpy
label_desc: Use image node_id 3 for calling the CSRMM obj's underlying member method code with example usage: obj.backward(dnrows, dncols, dC_indptr, dC_indices, dC_eids, dC_weights) and returns: dA_weights,  dB_weights