code: def get_axpbz_kernel(context, dtype_a, dtype_x, dtype_b, dtype_z):
      a_is_complex = dtype_a.kind == "c"
      x_is_complex = dtype_x.kind == "c"
      b_is_complex = dtype_b.kind == "c"
  
      z_is_complex = dtype_z.kind == "c"
  
      ax = "a*x[i]"
      if x_is_complex:
          a = "a"
          x = "x[i]"
  
          if dtype_x != dtype_z:
              x = "{}_cast({})".format(
                  complex_dtype_to_name(dtype_z), x
              )
  
          if a_is_complex:
              if dtype_a != dtype_z:
                  a = "{}_cast({})".format(
                      complex_dtype_to_name(dtype_z), a
                  )
  
              ax = "{}_mul({}, {})".format(
                  complex_dtype_to_name(dtype_z), a, x
              )
          else:
              ax = "{}_rmul({}, {})".format(
                  complex_dtype_to_name(dtype_z), a, x
              )
      elif a_is_complex:
          a = "a"
          x = "x[i]"
  
          if dtype_a != dtype_z:
              a = "{}_cast({})".format(
                  complex_dtype_to_name(dtype_z), a
              )
          ax = "{}_mulr({}, {})".format(
              complex_dtype_to_name(dtype_z), a, x
          )
  
      b = "b"
      if z_is_complex and not b_is_complex:
          b = "{}_fromreal({})".format(
              complex_dtype_to_name(dtype_z), b
          )
  
      if z_is_complex and not (a_is_complex or x_is_complex):
          ax = "{}_fromreal({})".format(
              complex_dtype_to_name(dtype_z), ax
          )
  
      if z_is_complex:
          ax = "{}_cast({})".format(complex_dtype_to_name(dtype_z), ax)
          b = "{}_cast({})".format(complex_dtype_to_name(dtype_z), b)
  
      if a_is_complex or x_is_complex or b_is_complex:
          expr = "{root}_add({ax}, {b})".format(
              ax=ax, b=b, root=complex_dtype_to_name(dtype_z)
          )
      else:
          expr = f"{ax} + {b}"
  
      return get_elwise_kernel(
          context,
          "{tp_z} *z, {tp_a} a, {tp_x} *x,{tp_b} b".format(
              tp_a=dtype_to_ctype(dtype_a),
              tp_x=dtype_to_ctype(dtype_x),
              tp_b=dtype_to_ctype(dtype_b),
              tp_z=dtype_to_ctype(dtype_z),
          ),
          f"z[i] = {expr}",
          name="axpb",
      )
  
imports: import enum
  from typing import Any, List, Optional, Tuple, Union
  import numpy
  import pyopencl
  from pyopencl.tools import context_dependent_memoize
  from pyopencl.tools import dtype_to_ctype, DtypedArgument, VectorArg, ScalarArg, KernelTemplateBase, dtype_to_c_struct
  from pytools import memoize_method
label_desc: Use image node_id 13 for calling a global function with example usage: get_axpbz_kernel(context, dtype_a, dtype_x, dtype_b, dtype_z) and returns: get_elwise_kernel