class_docstr: Power-transform outcomes.
  
  Useful if the targets are modeled using a (multivariate) power transform of
  a Normal distribution. This means that we can use a standard GP model on the
  power-transformed outcomes and un-transform the model posterior of that GP.
docstr: Un-transform power-transformed outcomes
  
  Args:
      Y: A `batch_shape x n x m`-dim tensor of power-transfomred targets.
      Yvar: A `batch_shape x n x m`-dim tensor of power-transformed
          observation noises associated with the training targets
          (if applicable).
  
  Returns:
      A two-tuple with the un-transformed outcomes:
  
      - The un-power transformed outcome observations.
      - The un-power transformed observation noise (if applicable).
docstr_tok: ["Un-transform","power-transformed","outcomes","Args",":","Y",":","A","`","batch_shape","x","n","x","m","`","-dim","tensor","of","power-transfomred","targets",".","Yvar",":","A","`","batch_shape","x","n","x","m","`","-dim","tensor","of","power-transformed","observation","noises","associated","with","the","training","targets","(","if","applicable",")",".","Returns",":","A","two-tuple","with","the","un-transformed","outcomes",":","-","The","un-power","transformed","outcome","observations",".","-","The","un-power","transformed","observation","noise","(","if","applicable",")","."]
code: def untransform(
      self, Y: Tensor, Yvar: Optional[Tensor] = None
  ) -> Tuple[Tensor, Optional[Tensor]]:
      r"""Un-transform power-transformed outcomes
  
      Args:
          Y: A `batch_shape x n x m`-dim tensor of power-transfomred targets.
          Yvar: A `batch_shape x n x m`-dim tensor of power-transformed
              observation noises associated with the training targets
              (if applicable).
  
      Returns:
          A two-tuple with the un-transformed outcomes:
  
          - The un-power transformed outcome observations.
          - The un-power transformed observation noise (if applicable).
      """
      Y_utf = Y.pow(1.0 / self.power)
      outputs = normalize_indices(self._outputs, d=Y.size(-1))
      if outputs is not None:
          Y_utf = torch.stack(
              [
                  Y_utf[..., i] if i in outputs else Y[..., i]
                  for i in range(Y.size(-1))
              ],
              dim=-1,
          )
      if Yvar is not None:
          # TODO: Delta method, possibly issue warning
          raise NotImplementedError(
              "Power does not yet support transforming observation noise"
          )
      return Y_utf, Yvar
  
imports: from __future__ import annotations
  import warnings
  from abc import ABC, abstractmethod
  from collections import OrderedDict
  from typing import Any, List, Mapping, Optional, Tuple, Union
  import torch
  from botorch.models.transforms.utils import norm_to_lognorm_mean, norm_to_lognorm_variance
  from botorch.posteriors import GPyTorchPosterior, Posterior, TransformedPosterior
  from botorch.utils.transforms import normalize_indices
  from linear_operator.operators import CholLinearOperator, DiagLinearOperator
  from torch import Tensor
  from torch.nn import Module, ModuleDict
label_desc: Use image node_id 4 for calling the Power obj's underlying member method code with example usage: obj.untransform(Y, Yvar) and returns: Y_utf,  Yvar