class_docstr: Scatter ``updates`` to ``data`` at locations ``indices`` at dimension ``axis`` by operation ``mode``.
  ``mode == update`` for instance.
  ``
  output[p_0, ..., p_{axis-1}, indice[i], p_{axis+1}, ..., p_D] =
  updates[p_0, ..., p_{axis-1}, i, p_{axis+1}, ..., p_D]
  `` for ``i`` in ``[0, len(indices)]``.
  Otherwise
  ``
  output[p_0, ..., p_{axis-1}, j, p_{axis+1}, ..., p_D] =
  data[p_0, ..., p_{axis-1}, j, p_{axis+1}, ..., p_D]
  ``
  
  ``mode == add`` for instance.
  ``
  output[p_0, ..., p_{axis-1}, indice[i], p_{axis+1}, ..., p_D] =
  updates[p_0, ..., p_{axis-1}, i, p_{axis+1}, ..., p_D] +
  x[p_0, ..., p_{axis-1}, indice[i], p_{axis+1}, ..., p_D]
  `` for ``i`` in ``[0, len(indices)]
  Otherwise
  ``
  output[p_0, ..., p_{axis-1}, j, p_{axis+1}, ..., p_D] =
  data[p_0, ..., p_{axis-1}, j, p_{axis+1}, ..., p_D]
  ``
  
  Parameters
  ----------
  data: tensor<*D, T> (Required)
  indices: tensor<[C],T> (Required)
      * 1D tensor.
  updates: tensor<*K, T> (Required)
      * ``K = data.shape[:axis] + [len(indices)] + data.shape[axis+1:]``.
  axis: const i32 (Optional)
      * Default to ``0``.
  mode: const string (Optional)
      * Can be the following modes:
          * update
          * add
          * sub
          * mul
          * div
          * max
          * min
  
  Returns
  -------
  tensor<*D, T>
      * with the same type and shape as input ``x``.
  
  Attributes
  ----------
  T: fp32
code: def type_inference(self):
      if (
          self.axis.val < -self.data.rank
          or self.axis.val >= self.data.rank
      ):
          raise IndexError(
              "Axis value {} is out of bounds for {} node {}".format(
                  self.axis.val, self.op_type, self.name
              )
          )
  
      axis = self.axis.val
      axis = axis if axis >= 0 else axis + self.data.rank
      expected_updates_shape = (
          self.data.shape[:axis]
          + self.indices.shape
          + self.data.shape[axis + 1 :]
      )
      np.testing.assert_equal(
          self.updates.shape, np.array(expected_updates_shape)
      )
  
      return self.data.sym_type
  
imports: from coremltools.converters.mil.mil import SYMBOL, VALUE
  from coremltools.converters.mil.mil.types.symbolic import is_compatible_symbolic_vector
  from ._op_reqs import *
  import numbers
label_desc: Use image node_id 2 for calling the scatter obj's underlying member method code with example usage: obj.type_inference() and returns: self