code: def numba_funcify_CategoricalRV(op, node, **kwargs):
      out_dtype = node.outputs[1].type.numpy_dtype
      size_len = int(get_vector_length(node.inputs[1]))
      p_ndim = node.inputs[-1].ndim
  
      @numba_basic.numba_njit
      def categorical_rv(rng, size, dtype, p):
          if not size_len:
              size_tpl = p.shape[:-1]
          else:
              size_tpl = numba_ndarray.to_fixed_tuple(size, size_len)
              p = np.broadcast_to(p, size_tpl + p.shape[-1:])
  
          # Workaround https://github.com/numba/numba/issues/8975
          if not size_len and p_ndim == 1:
              unif_samples = np.asarray(np.random.uniform(0, 1))
          else:
              unif_samples = np.random.uniform(0, 1, size_tpl)
  
          res = np.empty(size_tpl, dtype=out_dtype)
          for idx in np.ndindex(*size_tpl):
              res[idx] = np.searchsorted(
                  np.cumsum(p[idx]), unif_samples[idx]
              )
  
          return (rng, res)
  
      return categorical_rv
  
imports: from textwrap import dedent, indent
  from typing import Any, Callable, Optional
  import numba.np.unsafe.ndarray
  import numpy
  from numba import _helperlib, types
  from numba.core import cgutils
  from numba.extending import NativeValue, box, models, register_model, typeof_impl, unbox
  from numpy.random import RandomState
  import pytensor.tensor.random.basic
  from pytensor.graph.basic import Apply
  from pytensor.graph.op import Op
  from pytensor.link.numba.dispatch import basic
  from pytensor.link.numba.dispatch.basic import numba_funcify, numba_typify
  from pytensor.link.utils import compile_function_src, get_name_for_object, unique_name_generator
  from pytensor.tensor.basic import get_vector_length
  from pytensor.tensor.random.type import RandomStateType
label_desc: Use image node_id 12 for calling a global function with example usage: numba_funcify_CategoricalRV(op, node) and returns: categorical_rv, rng,  res