code: def get_pow_array_kernel(
      dtype_x, dtype_y, dtype_z, is_base_array, is_exp_array
  ):
      """
      Returns the kernel for the operation: ``z = x ** y``
      """
      if dtype_z == np.float32:
          func = "powf"
      else:
          # FIXME: Casting args to double-precision not
          # ideal for all cases (ex. int args)
          func = "pow"
  
      if not is_base_array and is_exp_array:
          x_ctype = "%(tp_x)s x"
          y_ctype = "%(tp_y)s *y"
          func = "%s(x,y[i])" % func
  
      elif is_base_array and is_exp_array:
          x_ctype = "%(tp_x)s *x"
          y_ctype = "%(tp_y)s *y"
          func = "%s(x[i],y[i])" % func
  
      elif is_base_array and not is_exp_array:
          x_ctype = "%(tp_x)s *x"
          y_ctype = "%(tp_y)s y"
          func = "%s(x[i],y)" % func
  
      else:
          raise AssertionError
  
      return get_elwise_kernel(
          (x_ctype + ", " + y_ctype + ", " + "%(tp_z)s *z")
          % {
              "tp_x": dtype_to_ctype(dtype_x),
              "tp_y": dtype_to_ctype(dtype_y),
              "tp_z": dtype_to_ctype(dtype_z),
          },
          "z[i] = %s" % func,
          name="pow_method",
      )
  
imports: from pycuda.tools import context_dependent_memoize
  from typing import Any
  import numpy
  from pycuda.tools import dtype_to_ctype, VectorArg, ScalarArg
  from pytools import memoize_method
label_desc: Use image node_id 24 for calling a global function with example usage: get_pow_array_kernel(dtype_x, dtype_y, dtype_z, is_base_array, is_exp_array) and returns: get_elwise_kernel