docstr: Reduction operation.
          
docstr_tok: ["Reduction","operation","."]
code: def __init__(
      self, name, reduce_func, expr, in_param, out_param, axis
  ):
      """Reduction operation."""
      _fusion_thread_local.check_not_runtime()
      assert isinstance(name, str)
      assert isinstance(reduce_func, _reduction._SimpleReductionKernel)
      assert isinstance(in_param, _TraceArray)
      assert isinstance(out_param, _TraceArray)
      assert isinstance(axis, tuple)
      assert all(0 <= x < in_param.ndim for x in axis)
  
      self.name = name
      self.preamble = reduce_func.preamble
      self.in_params = _VariableSet(in_param)
      self.out_params = _VariableSet(out_param)
      self.block_stride_name = "block_stride_" + name
      self.axis = axis
  
      if reduce_func.identity is None:
          self.identity = ""
      else:
          self.identity = str(reduce_func.identity)
  
      _, self.expr, self.postmap_cast_code, self.reduce_ctype = expr
      if self.reduce_ctype is None:
          (out_param,) = self.out_params
          self.reduce_ctype = get_typename(out_param.dtype)
  
      self.premap_op = None
      self.postmap_op = None
  
imports: import string
  import numpy
  from cupy._core import _codeblock
  from cupy._core._fusion_variable import _TraceVariable
  from cupy._core._fusion_variable import _TraceArray
  from cupy._core._fusion_variable import _VariableSet
  from cupy._core import _fusion_thread_local
  from cupy._core import _kernel
  from cupy._core import _reduction
  from cupy._core._scalar import get_typename
label_desc: Use image node_id 1 to create a new _ReductionTraceOp object  with example: obj = _ReductionTraceOp(name, reduce_func, expr, in_param, out_param, axis)