code: def add(*args, like=None, **kwargs):
      """Add arguments element-wise."""
      if like == "scipy":
          return onp.add(
              *args, **kwargs
          )  # Dispatch scipy add to numpy backed specifically.
  
      arg_interfaces = {get_interface(args[0]), get_interface(args[1])}
  
      # case of one torch tensor and one vanilla numpy array
      if like == "torch" and len(arg_interfaces) == 2:
          # In autoray 0.6.5, np.add dispatches to torch instead of
          # numpy if one parameter is a torch tensor and the other is
          # a numpy array. torch.add raises an Exception if one of the
          # arguments is a numpy array, so here we cast both arguments
          # to be tensors.
          dev = getattr(args[0], "device", None) or getattr(
              args[1], "device"
          )
          arg0 = np.asarray(args[0], device=dev, like=like)
          arg1 = np.asarray(args[1], device=dev, like=like)
          return np.add(arg0, arg1, *args[2:], **kwargs)
  
      return np.add(*args, **kwargs, like=like)
  
imports: import functools
  from collections.abc import Sequence
  import autoray
  import numpy
  from autograd.numpy.numpy_boxes import ArrayBox
  from autoray import numpy
  from numpy import ndarray
  from .None import single_dispatch
  from .utils import cast, cast_like, get_interface, requires_grad
label_desc: Use image node_id 20 for calling a global function with example usage: add() and returns: np, onp, np