code: def backward(self, indexes, grad_outputs):
      sp, dn = self.get_retained_inputs()
      (g_c,) = grad_outputs
      ret = []
      if 0 in indexes:
          g_sp = CooMatMulGradSP(
              self.sp_row,
              self.sp_col,
              self.sp_shape,
              self.sp_order,
              self.transc,
              not self.transb,
              self.transa,
              dtype=sp.dtype,
          ).apply((g_c, dn))[0]
          ret.append(g_sp)
      if 1 in indexes:
          g_dn = CooMatMul(
              self.sp_row,
              self.sp_col,
              self.sp_shape,
              self.sp_order,
              not self.transa,
              self.transc,
              self.transb,
              dtype=dn.dtype,
          ).apply((sp, g_c))[0]
          ret.append(g_dn)
      return ret
  
imports: import numpy
  import chainer
  from chainer import backend
  from chainer.backends import cuda
  from chainer import function_node
  from chainer import utils
  from chainer.utils import type_check
label_desc: Use image node_id 4 for calling the CooMatMul obj's underlying member method code with example usage: obj.backward(indexes, grad_outputs) and returns: ret