def METHOD_NAME(self, signal):
    """
    Compute the NUFFT adjoint using this plan instance.
    :param signal: Signal to be transformed. For a single transform,
    this should be a a 1D array of len `num_pts`.
    For a batch, signal should have shape `(ntransforms, num_pts)`.
    :returns: Transformed signal `(sz)` or `(sz, ntransforms)`.
    """
    # Check we're not forcing a dtype workaround for ASPIRE-Python/703,
    #   then check if we have a dtype mismatch.
    # This avoids false positive complaint for the workaround.
    if (self._original_dtype == self.dtype) and not (
        signal.dtype == self.complex_dtype or signal.dtype == self.dtype
    ):
        logger.warning(
            "Incorrect dtypes passed to (a)nufft."
            " In the future this will be an error."
        )
    res_shape = self.sz
    # Note, there is a corner case for ntransforms == 1.
    if self.ntransforms > 1 or (self.ntransforms == 1 and len(signal.shape) == 2):
        assert (
            len(signal.shape) == 2
        ), f"For multiple {self.dim}D adjoints, signal should be a {self.ntransforms} element stack of {self.num_pts}."
        assert (
            signal.shape[0] == self.ntransforms
        ), "For multiple transforms, signal stack length should match ntransforms {self.ntransforms}."
        res_shape = (self.ntransforms, *self.sz)
    signal_gpu = gpuarray.to_gpu(
        np.ascontiguousarray(signal, dtype=self.complex_dtype)
    )
    result_gpu = gpuarray.GPUArray(res_shape, dtype=self.complex_dtype)
    self._adjoint_plan.execute(signal_gpu, result_gpu)
    result = result_gpu.get()
    # ASPIRE-Python/703
    result = result.astype(complex_type(self._original_dtype), copy=False)
    return result