class_docstr: Scatter ``updates`` to ``data`` at locations ``indices``.
  
  
  ``indices`` is an K-dim tensor, where ``indices[i_0,...,i_{K-2}]`` defines a slice of ``data``,
  where ``K = rank(indices)`` , and ``data[indices[i_0, ..., i_{K-2}]]`` has rank ``rank(data) - indices.shape[-1]``.
  
  
  Take ``mode == update`` for instance:
  ``output`` is set to ``data`` initially, and the op updates ``output`` as following:
  ``output[indices[i_0, ..., i_{K-2}]]= updates[indices[i_0, ..., i_{K-2}]]``,
  One more example for ``mode == add``, the update rule with be:
  ``output[indices[i_0, ..., i_{K-2}]] += updates[indices[i_0, ..., i_{K-2}]]``
  
  Parameters
  ----------
  data: tensor<*D,T>  (Required)
  indices: tensor<*K,i32> (Required)
  updates: tensor<*K, T> (Required)
      * must be the shape as ``K[:-1]+data.shape[K[-1]:]``.
  mode: const string (Optional)
      * Default to ``add``.
      * Can be the following modes:
          * ``update``
          * ``add``
          * ``sub``
          * ``mul``
          * ``div``
          * ``max``
          * ``min``
  Returns
  -------
  tensor<*D,T>
      * a tensor with the same shape and type as ``data``.
  
  Attributes
  ----------
  T: fp32
code: def type_inference(self):
      assert self.indices.shape[-1] <= self.data.rank
      expected_updates_shape = (
          self.indices.shape[:-1]
          + self.data.shape[self.indices.shape[-1] :]
      )
      assert is_compatible_symbolic_vector(
          self.updates.shape, tuple(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_nd obj's underlying member method code with example usage: obj.type_inference() and returns: self