class_docstr: Projected isotropic normal distribution of arbitrary dimension.
  
  This distribution over directional data is qualitatively similar to the von
  Mises and von Mises-Fisher distributions, but permits tractable variational
  inference via reparametrized gradients.
  
  To use this distribution with autoguides, use ``poutine.reparam`` with a
  :class:`~pyro.infer.reparam.projected_normal.ProjectedNormalReparam`
  reparametrizer in the model, e.g.::
  
      @poutine.reparam(config={"direction": ProjectedNormalReparam()})
      def model():
          direction = pyro.sample("direction",
                                  ProjectedNormal(torch.zeros(3)))
          ...
  
  or simply wrap in :class:`~pyro.infer.reparam.strategies.MinimalReparam` or
  :class:`~pyro.infer.reparam.strategies.AutoReparam` , e.g.::
  
      @MinimalReparam()
      def model():
          ...
  
  .. note:: This implements :meth:`log_prob` only for dimensions {2,3}.
  
  [1] D. Hernandez-Stumpfhauser, F.J. Breidt, M.J. van der Woerd (2017)
      "The General Projected Normal Distribution of Arbitrary Dimension:
      Modeling and Bayesian Inference"
      https://projecteuclid.org/euclid.ba/1453211962
  
  :param torch.Tensor concentration: A combined location-and-concentration
      vector. The direction of this vector is the location, and its
      magnitude is the concentration.
class_docstr_tok: ["Projected","isotropic","normal","distribution","of","arbitrary","dimension",".","This","distribution","over","directional","data","is","qualitatively","similar","to","the","von","Mises","and","von","Mises-Fisher","distributions",",","but","permits","tractable","variational","inference","via","reparametrized","gradients",".","To","use","this","distribution","with","autoguides",",","use","``","poutine.reparam","``","with","a",":","class",":","`","~pyro.infer.reparam.projected_normal.ProjectedNormalReparam","`","reparametrizer","in","the","model",",","e.g",".",":",":","@","poutine.reparam","(","config=","{","``","direction","''",":","ProjectedNormalReparam","(",")","}",")","def","model","(",")",":","direction","=","pyro.sample","(","``","direction","''",",","ProjectedNormal","(","torch.zeros","(","3",")",")",")","...","or","simply","wrap","in",":","class",":","`","~pyro.infer.reparam.strategies.MinimalReparam","`","or",":","class",":","`","~pyro.infer.reparam.strategies.AutoReparam","`",",","e.g",".",":",":","@","MinimalReparam","(",")","def","model","(",")",":","...","..","note",":",":","This","implements",":","meth",":","`","log_prob","`","only","for","dimensions","{","2,3","}",".","[","1","]","D.","Hernandez-Stumpfhauser",",","F.J.","Breidt",",","M.J.","van","der","Woerd","(","2017",")","``","The","General","Projected","Normal","Distribution","of","Arbitrary","Dimension",":","Modeling","and","Bayesian","Inference","''","https",":","\/\/projecteuclid.org\/euclid.ba\/1453211962",":","param","torch.Tensor","concentration",":","A","combined","location-and-concentration","vector",".","The","direction","of","this","vector","is","the","location",",","and","its","magnitude","is","the","concentration","."]
code: def __init__(self, concentration, *, validate_args=None):
      assert concentration.dim() >= 1
      self.concentration = concentration
      batch_shape = concentration.shape[:-1]
      event_shape = concentration.shape[-1:]
      super().__init__(
          batch_shape, event_shape, validate_args=validate_args
      )
  
file_path: pyro/pyro/distributions/projected_normal.py
imports: import math
  import torch
  from pyro.ops.tensor_utils import safe_normalize
  from .None import constraints
  from .torch_distribution import TorchDistribution
label_desc: Use image node_id 1 to create a new ProjectedNormal object from inherited base classes: TorchDistribution with example: obj = ProjectedNormal(concentration)