docstr: :param y: the output of the bijection
  :type y: torch.Tensor
  
  Inverts y => x.
docstr_tok: [":","param","y",":","the","output","of","the","bijection",":","type","y",":","torch.Tensor","Inverts","y","=",">","x","."]
code: def _inverse(self, y):
      """
      :param y: the output of the bijection
      :type y: torch.Tensor
  
      Inverts y => x.
      """
  
      """
          NOTE: This method is equivalent to the following two lines. Using
          Tensor.inverse() would be numerically unstable, however.
  
          filters = (self.permutation @ self.L @ self.U).inverse()[..., None, None]
          x = F.conv2d(y.view(-1, *y.shape[-3:]), filters)
          return x.view_as(y)
  
          """
  
      # Do a matrix vector product over the channel dimension
      # in order to apply inverse permutation matrix
      y_flat = y.flatten(start_dim=-2)
      LUx = (
          y_flat.unsqueeze(-3) * self.permutation.T.unsqueeze(-1)
      ).sum(-2)
  
      # Solve L(Ux) = P^1y
      Ux = torch.linalg.solve_triangular(self.L, LUx, upper=False)
  
      # Solve Ux = (PL)^-1y
      x = torch.linalg.solve_triangular(self.U, Ux, upper=True)
  
      # Unflatten x (works when context variable has batch dim)
      return x.reshape(x.shape[:-1] + y.shape[-2:])
  
imports: import torch
  from torch.distributions import Transform
  from pyro.nn import DenseNN
  from ..None import constraints
  from ..conditional import ConditionalTransformModule
  from ..torch_transform import TransformModule
  from ..util import copy_docs_from
label_desc: Use image node_id 6 for calling the ConditionedGeneralizedChannelPermute obj's underlying member method code with example usage: obj._inverse(y) and returns: x