docstr: evaluates the objective function and devides the evaluation into
      torch.Tensors needed for the indices computation.
  Args:
      f_A_B_ABi: Function evaluations on the entire grid of size M(d+2).
docstr_tok: ["evaluates","the","objective","function","and","devides","the","evaluation","into","torch.Tensors","needed","for","the","indices","computation",".","Args",":","f_A_B_ABi",":","Function","evaluations","on","the","entire","grid","of","size","M","(","d+2",")","."]
code: def evalute_function(
      self, f_A_B_ABi: Optional[torch.Tensor] = None
  ) -> None:
      r"""evaluates the objective function and devides the evaluation into
          torch.Tensors needed for the indices computation.
      Args:
          f_A_B_ABi: Function evaluations on the entire grid of size M(d+2).
      """
      if f_A_B_ABi is None:
          f_A_B_ABi = self.input_function(self.A_B_ABi)  # pyre-ignore
      # for multiple output models, average the outcomes
      if len(f_A_B_ABi.shape) == 3:
          f_A_B_ABi = f_A_B_ABi.mean(dim=0)
      self.f_A = f_A_B_ABi[: self.num_mc_samples]
      self.f_B = f_A_B_ABi[
          self.num_mc_samples : self.num_mc_samples * 2
      ]
      self.f_ABis = [
          f_A_B_ABi[
              self.num_mc_samples
              * (i + 2) : self.num_mc_samples
              * (i + 3)
          ]
          for i in range(self.dim)
      ]
      self.f_total_var = torch.var(f_A_B_ABi[: self.num_mc_samples * 2])
      if self.bootstrap:
          self.f_A_btsp = [
              torch.index_select(self.f_A, 0, indices)  # pyre-ignore
              for indices in self.bootstrap_indices
          ]
          self.f_B_btsp = [
              torch.index_select(self.f_B, 0, indices)  # pyre-ignore
              for indices in self.bootstrap_indices
          ]
          self.f_ABis_btsp = [
              [
                  torch.index_select(f_ABi, 0, indices)
                  for f_ABi in self.f_ABis  # pyre-ignore
              ]
              for indices in self.bootstrap_indices
          ]
          self.f_total_var_btsp = [
              torch.var(
                  torch.cat(
                      (self.f_A_btsp[i], self.f_B_btsp[i]),
                      dim=0,  # pyre-ignore
                  )
              )
              for i in range(self.num_bootstrap_samples)
          ]
      if self.second_order:
          self.f_BAis = [
              f_A_B_ABi[
                  self.num_mc_samples
                  * (i + 2 + self.dim) : self.num_mc_samples
                  * (i + 3 + self.dim)
              ]
              for i in range(self.dim)
          ]
          if self.bootstrap:
              self.f_BAis_btsp = [
                  [
                      torch.index_select(f_BAi, 0, indices)
                      for f_BAi in self.f_BAis
                  ]
                  for indices in self.bootstrap_indices
              ]
  
imports: from copy import deepcopy
  from typing import Any, Callable, Dict, List, Optional, Union
  import numpy
  import torch
  from ax.modelbridge.torch import TorchModelBridge
  from ax.models.torch.botorch import BotorchModel
  from ax.models.torch.botorch_modular.model import BoTorchModel
  from ax.utils.common.typeutils import checked_cast
  from botorch.models.model import Model, ModelList
  from botorch.posteriors.gpytorch import GPyTorchPosterior
  from botorch.sampling.normal import SobolQMCNormalSampler
  from botorch.utils.sampling import draw_sobol_samples
  from botorch.utils.transforms import unnormalize
  from torch import Tensor
label_desc: Use image node_id 3 for calling the SobolSensitivity obj's underlying member method code with example usage: obj.evalute_function(f_A_B_ABi) without return types