class_docstr: Non-normalized Gaussian distribution.
  
  This represents an arbitrary semidefinite quadratic function, which can be
  interpreted as a rank-deficient scaled Gaussian distribution. The precision
  matrix may have zero eigenvalues, thus it may be impossible to work
  directly with the covariance matrix.
  
  :param torch.Tensor log_normalizer: a normalization constant, which is mainly used to keep
      track of normalization terms during contractions.
  :param torch.Tensor info_vec: information vector, which is a scaled version of the mean
      ``info_vec = precision @ mean``. We use this represention to make gaussian contraction
      fast and stable.
  :param torch.Tensor precision: precision matrix of this gaussian.
class_docstr_tok: ["Non-normalized","Gaussian","distribution",".","This","represents","an","arbitrary","semidefinite","quadratic","function",",","which","can","be","interpreted","as","a","rank-deficient","scaled","Gaussian","distribution",".","The","precision","matrix","may","have","zero","eigenvalues",",","thus","it","may","be","impossible","to","work","directly","with","the","covariance","matrix",".",":","param","torch.Tensor","log_normalizer",":","a","normalization","constant",",","which","is","mainly","used","to","keep","track","of","normalization","terms","during","contractions",".",":","param","torch.Tensor","info_vec",":","information","vector",",","which","is","a","scaled","version","of","the","mean","``","info_vec","=","precision","@","mean","``",".","We","use","this","represention","to","make","gaussian","contraction","fast","and","stable",".",":","param","torch.Tensor","precision",":","precision","matrix","of","this","gaussian","."]
docstr: Condition this Gaussian on a leading subset of its state.
  This should satisfy::
  
      g.condition(y).dim() == g.dim() - y.size(-1)
  
  Note that since this is a non-normalized Gaussian, we include the
  density of ``y`` in the result. Thus :meth:`condition` is similar to a
  ``functools.partial`` binding of arguments::
  
      left = x[..., :n]
      right = x[..., n:]
      g.log_density(x) == g.left_condition(left).log_density(right)
code: def left_condition(self, value: torch.Tensor) -> "Gaussian":
      """
      Condition this Gaussian on a leading subset of its state.
      This should satisfy::
  
          g.condition(y).dim() == g.dim() - y.size(-1)
  
      Note that since this is a non-normalized Gaussian, we include the
      density of ``y`` in the result. Thus :meth:`condition` is similar to a
      ``functools.partial`` binding of arguments::
  
          left = x[..., :n]
          right = x[..., n:]
          g.log_density(x) == g.left_condition(left).log_density(right)
      """
      assert isinstance(value, torch.Tensor)
      left = value.size(-1)
      dim = self.dim()
      assert left <= dim
  
      perm = torch.cat(
          [
              torch.arange(left, dim, device=value.device),
              torch.arange(left, device=value.device),
          ]
      )
      return self.event_permute(perm).condition(value)
  
imports: import math
  from typing import Optional, Tuple, Union
  import torch
  from torch.distributions.utils import lazy_property
  from torch.nn.functional import pad
  from pyro.distributions.util import broadcast_shape
  from pyro.ops.tensor_utils import matmul, matvecmul, safe_cholesky, triangular_solve
label_desc: Use image node_id 15 for calling the Gaussian obj's underlying member method code with example usage: obj.left_condition(value) and returns: self