code: def generic(self, args, kws):
      # early exit to make sure typing doesn't fail for normal
      # non-group ops
      if not all(isinstance(arg, GroupType) for arg in args):
          return None
      # check if any groups are poisoned for this op
      for arg in args:
          if isinstance(arg.group_scalar_type, types.Poison):
              raise UDFError(
                  f"Use of a column of {arg.group_scalar_type.ty} detected "
                  "within UDF body. Only columns of the following dtypes "
                  "may be used through the GroupBy.apply() JIT engine: "
                  f"{[str(x) for x in SUPPORTED_GROUPBY_NUMPY_TYPES]}"
              )
      if funcs := call_cuda_functions.get(self.key.__name__):
          for sig in funcs.keys():
              if all(
                  arg.group_scalar_type == ty
                  for arg, ty in zip(args, sig)
              ):
                  return nb_signature(sig[0], *args)
      raise UDFError(self.make_error_string(args))
  
imports: from typing import Any, Dict
  import numba
  from numba import cuda, types
  from numba.core.extending import make_attribute_wrapper, models, register_model, type_callable, typeof_impl
  from numba.core.typing import signature
  from numba.core.typing.templates import AbstractTemplate, AttributeTemplate
  from numba.cuda.cudadecl import registry
  from numba.np import numpy_support
  from cudf.core.udf._ops import arith_ops, comparison_ops, unary_ops
  from cudf.core.udf.utils import Row, UDFError
label_desc: Use image node_id 2 for calling the GroupOpBase obj's underlying member method code with example usage: obj.generic(args, kws) and returns: None, nb_signature