class_docstr: A wrapper around AcquisitionFunctions to fix a subset of features.
  
  Example:
      >>> model = SingleTaskGP(train_X, train_Y)  # d = 5
      >>> qEI = qExpectedImprovement(model, best_f=0.0)
      >>> columns = [2, 4]
      >>> values = X[..., columns]
      >>> qEI_FF = FixedFeatureAcquisitionFunction(qEI, 5, columns, values)
      >>> qei = qEI_FF(test_X)  # d' = 3
docstr: Constructs the full input for the base acquisition function.
  
  Args:
      X: Input tensor with shape `batch_shape x q x d'` such that
          `d' + d_f = d`.
  
  Returns:
      Tensor `X_full` of shape `batch_shape x q x d`, where
      `X_full[..., i] = values[..., i]` if `i in columns`,
      and `X_full[..., i] = X[..., j]`, with
      `j = i - sum_{l<=i} 1_{l in fixed_colunns}`.
docstr_tok: ["Constructs","the","full","input","for","the","base","acquisition","function",".","Args",":","X",":","Input","tensor","with","shape","`","batch_shape","x","q","x","d","'","`","such","that","`","d","'","+","d_f","=","d","`",".","Returns",":","Tensor","`","X_full","`","of","shape","`","batch_shape","x","q","x","d","`",",","where","`","X_full","[","...",",","i","]","=","values","[","...",",","i","]","`","if","`","i","in","columns","`",",","and","`","X_full","[","...",",","i","]","=","X","[","...",",","j","]","`",",","with","`","j","=","i","-","sum_","{","l","<","=i","}","1_","{","l","in","fixed_colunns","}","`","."]
code: def _construct_X_full(self, X: Tensor) -> Tensor:
      r"""Constructs the full input for the base acquisition function.
  
      Args:
          X: Input tensor with shape `batch_shape x q x d'` such that
              `d' + d_f = d`.
  
      Returns:
          Tensor `X_full` of shape `batch_shape x q x d`, where
          `X_full[..., i] = values[..., i]` if `i in columns`,
          and `X_full[..., i] = X[..., j]`, with
          `j = i - sum_{l<=i} 1_{l in fixed_colunns}`.
      """
      d_prime, d_f = X.shape[-1], self.values.shape[-1]
      if d_prime + d_f != self.d:
          raise ValueError(
              f"Feature dimension d' ({d_prime}) of input must be "
              f"d - d_f ({self.d - d_f})."
          )
      # concatenate values to the end
      values = self.values.to(X).expand(*X.shape[:-1], d_f)
      X_perm = torch.cat([X, values], dim=-1)
      # now select the appropriate column order
      return X_perm[..., self._selector]
  
file_path: botorch/botorch/acquisition/fixed_feature.py
imports: from __future__ import annotations
  from numbers import Number
  from typing import List, Optional, Sequence, Union
  import torch
  from botorch.acquisition.acquisition import AcquisitionFunction
  from torch import Tensor
  from torch.nn import Module
label_desc: Use image node_id 5 for calling the FixedFeatureAcquisitionFunction obj's underlying member method code with example usage: obj._construct_X_full(X) and returns: X_perm