docstr: Compute Psi function.
  
  For each cell i and outcome k:
  
      Psi(lower_{i,k}, upper_{i,k}, mu_k, sigma_k) = (
      sigma_k * PDF((upper_{i,k} - mu_k) / sigma_k) + (
      mu_k - lower_{i,k}
      ) * (1 - CDF(upper_{i,k} - mu_k) / sigma_k)
      )
  
  See Equation 19 in [Yang2019]_ for more details.
  
  Args:
      lower: A `num_cells x m`-dim tensor of lower cell bounds
      upper: A `num_cells x m`-dim tensor of upper cell bounds
      mu: A `batch_shape x 1 x m`-dim tensor of means
      sigma: A `batch_shape x 1 x m`-dim tensor of standard deviations (clamped).
  
  Returns:
      A `batch_shape x num_cells x m`-dim tensor of values.
docstr_tok: ["Compute","Psi","function",".","For","each","cell","i","and","outcome","k",":","Psi","(","lower_","{","i",",","k","}",",","upper_","{","i",",","k","}",",","mu_k",",","sigma_k",")","=","(","sigma_k","*","PDF","(","(","upper_","{","i",",","k","}","-","mu_k",")","\/","sigma_k",")","+","(","mu_k","-","lower_","{","i",",","k","}",")","*","(","1","-","CDF","(","upper_","{","i",",","k","}","-","mu_k",")","\/","sigma_k",")",")","See","Equation","19","in","[","Yang2019","]","_","for","more","details",".","Args",":","lower",":","A","`","num_cells","x","m","`","-dim","tensor","of","lower","cell","bounds","upper",":","A","`","num_cells","x","m","`","-dim","tensor","of","upper","cell","bounds","mu",":","A","`","batch_shape","x","1","x","m","`","-dim","tensor","of","means","sigma",":","A","`","batch_shape","x","1","x","m","`","-dim","tensor","of","standard","deviations","(","clamped",")",".","Returns",":","A","`","batch_shape","x","num_cells","x","m","`","-dim","tensor","of","values","."]
code: def psi(
      self, lower: Tensor, upper: Tensor, mu: Tensor, sigma: Tensor
  ) -> Tensor:
      r"""Compute Psi function.
  
      For each cell i and outcome k:
  
          Psi(lower_{i,k}, upper_{i,k}, mu_k, sigma_k) = (
          sigma_k * PDF((upper_{i,k} - mu_k) / sigma_k) + (
          mu_k - lower_{i,k}
          ) * (1 - CDF(upper_{i,k} - mu_k) / sigma_k)
          )
  
      See Equation 19 in [Yang2019]_ for more details.
  
      Args:
          lower: A `num_cells x m`-dim tensor of lower cell bounds
          upper: A `num_cells x m`-dim tensor of upper cell bounds
          mu: A `batch_shape x 1 x m`-dim tensor of means
          sigma: A `batch_shape x 1 x m`-dim tensor of standard deviations (clamped).
  
      Returns:
          A `batch_shape x num_cells x m`-dim tensor of values.
      """
      u = (upper - mu) / sigma
      return sigma * self.normal.log_prob(u).exp() + (mu - lower) * (
          1 - self.normal.cdf(u)
      )
  
imports: from __future__ import annotations
  from abc import abstractmethod
  from itertools import product
  from typing import List, Optional
  import torch
  from botorch.acquisition.acquisition import AcquisitionFunction
  from botorch.acquisition.objective import PosteriorTransform
  from botorch.exceptions.errors import UnsupportedError
  from botorch.models.model import Model
  from botorch.utils.multi_objective.box_decompositions.non_dominated import NondominatedPartitioning
  from botorch.utils.transforms import t_batch_mode_transform
  from torch import Tensor
  from torch.distributions import Normal
label_desc: Use image node_id 2 for calling the ExpectedHypervolumeImprovement obj's underlying member method code with example usage: obj.psi(lower, upper, mu, sigma) and returns: unknown