class_docstr: Multivariate Gaussian distribution, with covariance matrix parametrized
  as the sum of a diagonal matrix and a low-rank matrix
  
  .. math::
      \Sigma = D + W W^T
  
  When `W = None` the covariance matrix is just diagonal.
  
  The implementation is strongly inspired from Pytorch:
  https://github.com/pytorch/pytorch/blob/master/torch/distributions/lowrank_multivariate_normal.py.
  
  Complexity to compute log_prob is :math:`O(dim * rank + rank^3)` per element.
  
  Parameters
  ----------
  dim
      Dimension of the distribution's support
  rank
      Rank of W
  mu
      Mean tensor, of shape (..., dim)
  D
      Diagonal term in the covariance matrix, of shape (..., dim)
  W
      Low-rank factor in the covariance matrix, of shape (..., dim, rank)
      Optional; if not provided, the covariance matrix is just diagonal.
code: def __init__(
      self,
      dim: int,
      rank: int,
      mu: Tensor,
      D: Tensor,
      W: Optional[Tensor] = None,
  ) -> None:
      self.dim = dim
      self.rank = rank
      self.mu = mu
      self.D = D
      self.W = W
      self.Cov = None
  
imports: import math
  from typing import Optional, Tuple
  import numpy
  from mxnet import gluon
  from gluonts.core.component import validated
  from gluonts.mx import Tensor
  from .distribution import Distribution, _sample_multiple, getF
  from .distribution_output import ArgProj, DistributionOutput, AffineTransformedDistribution
label_desc: Use image node_id 1 to create a new LowrankMultivariateGaussian object from inherited base classes: Distribution with example: obj = LowrankMultivariateGaussian(dim, rank, mu, D, W)