code: def promote_types_of_numpy_inputs(
      x1: Union[ivy.Array, Number, Iterable[Number]],
      x2: Union[ivy.Array, Number, Iterable[Number]],
      /,
  ) -> Tuple[ivy.Array, ivy.Array]:
      """Promote the dtype of the given ivy array inputs to a common dtype based
      on numpy type promotion rules.
  
      While passing float or integer values or any other non-array input
      to this function, it should be noted that the return will be an
      array-like object. Therefore, outputs from this function should be
      used as inputs only for those functions that expect an array-like or
      tensor-like objects, otherwise it might give unexpected results.
      """
      # ToDo: Overflows not working properly for numpy, if a scalar or 0-dim
      #   is passed with an array, it should go to the next largest dtype that
      #   can hold the value without overflow. E.g a np.array([5], 'int8') + 300 operation
      #   results in np.array([305]) with int16 dtype
      x1 = ivy.asarray(x1)
      x2 = ivy.asarray(x2)
      type1 = ivy.default_dtype(item=x1).strip("u123456789")
      type2 = ivy.default_dtype(item=x2).strip("u123456789")
      # Ignore type of 0-dim arrays or scalars to mimic numpy
      if x1.shape != () and x2.shape == () and type1 == type2:
          x2 = ivy.asarray(
              x2,
              dtype=x1.dtype,
              device=ivy.default_device(item=x1, as_native=False),
          )
      elif x1.shape == () and x2.shape != () and type1 == type2:
          x1 = ivy.asarray(
              x1,
              dtype=x2.dtype,
              device=ivy.default_device(item=x2, as_native=False),
          )
      else:
          promoted = promote_numpy_dtypes(x1.dtype, x2.dtype)
          x1 = ivy.asarray(x1, dtype=promoted)
          x2 = ivy.asarray(x2, dtype=promoted)
      return x1, x2
  
imports: import sys
  import ivy
  from ivy.utils.exceptions import handle_exceptions
  from ivy.functional.frontends import set_frontend_to_specific_version
  from typing import Union, Iterable, Tuple
  from numbers import Number
  from .data_type_routines import dtype
  from .None import ndarray
  from .ndarray import *
  from .None import scalars
  from .scalars import *
  from .None import creation_routines
  from .creation_routines import *
  from .None import data_type_routines
  from .data_type_routines import *
  from .None import logic
  from .logic import *
  from .None import manipulation_routines
  from .manipulation_routines import *
  from .None import mathematical_functions
  from .mathematical_functions import *
  from .None import sorting_searching_counting
  from .sorting_searching_counting import *
  from .None import statistics
  from .statistics import *
  from .None import matrix
  from .matrix import *
  from .None import random
  from .random import *
  from .None import indexing_routines
  from .indexing_routines import *
  from .None import broadcast
  from .broadcast import *
  from .None import ma
  from .None import fft
  from .ufunc import ufunc
  from .None import linalg
  from .linalg.matrix_and_vector_products import inner, outer, matrix_power, tensordot, kron, cross
  from .linalg.decompositions import cholesky, qr, svd
  from .linalg.norms_and_other_numbers import det, slogdet, matrix_rank, norm, trace
  from .linalg.solving_equations_and_inverting_matrices import pinv, inv, solve
  from ivy.functional.frontends.numpy.mathematical_functions.miscellaneous import _absolute, _cbrt, _copysign, _fabs, _heaviside, _sign, _sqrt, _square, _lcm, _gcd, _clip
  from ivy.functional.frontends.numpy.mathematical_functions.arithmetic_operations import _add, _divide, _float_power, _floor_divide, _fmod, _mod, _modf, _multiply, _remainder, _negative, _positive, _power, _reciprocal, _subtract, _divmod
  from ivy.functional.frontends.numpy.mathematical_functions.trigonometric_functions import _arccos, _arcsin, _arctan, _cos, _deg2rad, _rad2deg, _sin, _tan, _degrees, _arctan2
  from ivy.functional.frontends.numpy.mathematical_functions.handling_complex_numbers import _conj
  from ivy.functional.frontends.numpy.mathematical_functions.hyperbolic_functions import _arccosh, _arcsinh, _arctanh, _cosh, _sinh, _tanh
  from ivy.functional.frontends.numpy.mathematical_functions.rounding import _ceil, _trunc, _floor, _rint
  from ivy.functional.frontends.numpy.logic.comparison import _equal, _greater, _greater_equal, _less, _less_equal, _not_equal
  from ivy.functional.frontends.numpy.mathematical_functions.exponents_and_logarithms import _exp, _exp2, _expm1, _log, _log10, _log1p, _log2, _logaddexp, _logaddexp2, _ldexp, _frexp
  from ivy.functional.frontends.numpy.logic.array_type_testing import _isfinite, _isinf, _isnan
  from ivy.functional.frontends.numpy.logic.logical_operations import _logical_and, _logical_not, _logical_or, _logical_xor
  from ivy.functional.frontends.numpy.linalg.matrix_and_vector_products import _matmul, dot, einsum
  from ivy.functional.frontends.numpy.mathematical_functions.extrema_finding import _maximum, _minimum, _fmax, _fmin
  from ivy.functional.frontends.numpy.mathematical_functions.floating_point_routines import _nextafter, _signbit, _spacing
label_desc: Use image node_id 2 for calling a global function with example usage: promote_types_of_numpy_inputs() and returns: x1,  x2