code: def concatenate_pending_points(
      method: Callable[[Any, Tensor], Any]
  ) -> Callable[[Any, Tensor], Any]:
      r"""Decorator concatenating X_pending into an acquisition function's argument.
  
      This decorator works on the `forward` method of acquisition functions taking
      a tensor `X` as the argument. If the acquisition function has an `X_pending`
      attribute (that is not `None`), this is concatenated into the input `X`,
      appropriately expanding the pending points to match the batch shape of `X`.
  
      Example:
          >>> class ExampleAcquisitionFunction:
          >>>     @concatenate_pending_points
          >>>     @t_batch_mode_transform()
          >>>     def forward(self, X):
          >>>         ...
      """
  
      @wraps(method)
      def decorated(cls: Any, X: Tensor, **kwargs: Any) -> Any:
          if cls.X_pending is not None:
              X = torch.cat(
                  [X, match_batch_shape(cls.X_pending, X)], dim=-2
              )
          return method(cls, X, **kwargs)
  
      return decorated
  
file_path: botorch/botorch/utils/transforms.py
imports: from __future__ import annotations
  import warnings
  from functools import wraps
  from typing import Any, Callable, List, Optional, TYPE_CHECKING
  import torch
  from botorch.utils.safe_math import logmeanexp
  from torch import Tensor
label_desc: Use image node_id 9 for calling a global function with example usage: concatenate_pending_points(method) and returns: decorated, method