class_docstr: Base class for operator property class implemented in python.
  
  Parameters
  ----------
  need_top_grad : bool
      The default declare_backward_dependency function. Use this value
      to determine whether this operator needs gradient input.
class_docstr_tok: ["Base","class","for","operator","property","class","implemented","in","python",".","Parameters","--","--","--","--","--","need_top_grad",":","bool","The","default","declare_backward_dependency","function",".","Use","this","value","to","determine","whether","this","operator","needs","gradient","input","."]
docstr: infer_storage_type_backward interface. Used to infer storage
  type of inputs and outputs in the backward pass.
  
  Will raise an error if undefined storage type is returned.
  Returned lists have to be the same size as the input lists to infer_storage_type_backward,
  otherwise an exception will be thrown. When this interface is not implemented,
  all stypes will be inferred as default.
  
  Parameters
  ----------
  ograd_stype : list
      list of output gradient storage types
  in_stype : list
      list of input storage types
  out_stype : list
      list of output storage types
  igrad_stype : list
      list of input gradient storage types
  aux_stype : list
      list of auxiliary storage types
  
  Returns
  -------
  ograd_stype : list
      list of inferred output gradient storage types
  in_stype : list
      list of inferred input storage types
  out_stype : list
      list of inferred output storage types
  igrad_stype : list
      list of inferred input gradient storage types
  aux_stype : list
      list of inferred storage types for auxiliary states
docstr_tok: ["infer_storage_type_backward","interface",".","Used","to","infer","storage","type","of","inputs","and","outputs","in","the","backward","pass",".","Will","raise","an","error","if","undefined","storage","type","is","returned",".","Returned","lists","have","to","be","the","same","size","as","the","input","lists","to","infer_storage_type_backward",",","otherwise","an","exception","will","be","thrown",".","When","this","interface","is","not","implemented",",","all","stypes","will","be","inferred","as","default",".","Parameters","--","--","--","--","--","ograd_stype",":","list","list","of","output","gradient","storage","types","in_stype",":","list","list","of","input","storage","types","out_stype",":","list","list","of","output","storage","types","igrad_stype",":","list","list","of","input","gradient","storage","types","aux_stype",":","list","list","of","auxiliary","storage","types","Returns","--","--","--","-","ograd_stype",":","list","list","of","inferred","output","gradient","storage","types","in_stype",":","list","list","of","inferred","input","storage","types","out_stype",":","list","list","of","inferred","output","storage","types","igrad_stype",":","list","list","of","inferred","input","gradient","storage","types","aux_stype",":","list","list","of","inferred","storage","types","for","auxiliary","states"]
code: def infer_storage_type_backward(
      self, ograd_stype, in_stype, out_stype, igrad_stype, aux_stype
  ):
      """infer_storage_type_backward interface. Used to infer storage
      type of inputs and outputs in the backward pass.
  
      Will raise an error if undefined storage type is returned.
      Returned lists have to be the same size as the input lists to infer_storage_type_backward,
      otherwise an exception will be thrown. When this interface is not implemented,
      all stypes will be inferred as default.
  
      Parameters
      ----------
      ograd_stype : list
          list of output gradient storage types
      in_stype : list
          list of input storage types
      out_stype : list
          list of output storage types
      igrad_stype : list
          list of input gradient storage types
      aux_stype : list
          list of auxiliary storage types
  
      Returns
      -------
      ograd_stype : list
          list of inferred output gradient storage types
      in_stype : list
          list of inferred input storage types
      out_stype : list
          list of inferred output storage types
      igrad_stype : list
          list of inferred input gradient storage types
      aux_stype : list
          list of inferred storage types for auxiliary states
      """
      for i, stype in enumerate(ograd_stype):
          assert (
              stype == _STORAGE_TYPE_ID_TO_STR[_STORAGE_TYPE_DEFAULT]
          ), (
              "Default infer_storage_type_backward implementation doesnt allow non default stypes: "
              f"found non default stype '{stype}' for ograd_stype[{i}]. Please implement "
              "infer_storage_type and infer_storage_type_backward interface "
              "in your custom operator if you have non-default output gradient stypes"
          )
      for i, stype in enumerate(igrad_stype):
          if stype == _STORAGE_TYPE_ID_TO_STR[_STORAGE_TYPE_UNDEFINED]:
              stype = _STORAGE_TYPE_ID_TO_STR[_STORAGE_TYPE_DEFAULT]
          assert (
              stype == _STORAGE_TYPE_ID_TO_STR[_STORAGE_TYPE_DEFAULT]
          ), (
              "Default infer_storage_type_backward implementation doesnt allow non default stypes: "
              f"found non default stype '{stype}' for igrad_stype[{i}]. Please implement "
              "infer_storage_type and infer_storage_type_backward interface "
              "in your custom operator if you have non-default input gradient stypes"
          )
      stype_lists = [
          ograd_stype,
          in_stype,
          out_stype,
          igrad_stype,
          aux_stype,
      ]
      for stype_list in stype_lists:
          stype_list[:] = len(stype_list) * [
              _STORAGE_TYPE_ID_TO_STR[_STORAGE_TYPE_DEFAULT]
          ]
      return (
          stype_lists[0],
          stype_lists[1],
          stype_lists[2],
          stype_lists[3],
          stype_lists[4],
      )
  
imports: import traceback
  import warnings
  import collections
  from array import array
  from threading import Lock
  import ctypes
  from ctypes import CFUNCTYPE, POINTER, Structure, pointer
  from ctypes import c_void_p, c_int, c_char, c_char_p, cast, c_bool
  from .base import _LIB, check_call, MXCallbackList, c_array, c_array_buf, mx_int, OpHandle
  from .base import c_str, mx_uint, mx_float, ctypes2numpy_shared, NDArrayHandle, py_str
  from .None import symbol, context
  from .ndarray import NDArray, dtype_np_to_mx, dtype_mx_to_np
  from .ndarray.ndarray import _STORAGE_TYPE_STR_TO_ID, _STORAGE_TYPE_ID_TO_STR
  from .ndarray.ndarray import _STORAGE_TYPE_UNDEFINED, _STORAGE_TYPE_DEFAULT
  from .ndarray.ndarray import _STORAGE_TYPE_CSR, _STORAGE_TYPE_ROW_SPARSE
  from .ndarray import _ndarray_cls
  from .numpy.multiarray import _np_ndarray_cls
  from .util import is_np_array
label_desc: Use image node_id 5 for calling the CustomOpProp obj's underlying member method code with example usage: obj.infer_storage_type_backward(ograd_stype, in_stype, out_stype, igrad_stype, aux_stype) and returns: stype_lists,  stype_lists,  stype_lists,  stype_lists,  stype_lists