o
    #iu0                     @   sp   d dl Z d dlmZmZmZmZ d dlmZ d dlZd dl	m
Z
 d dlmZ d dlmZ dgZG dd dZdS )	    N)AnyDictOptionalTuple)
deprecated)constraints)lazy_property)_sizeDistributionc                       sF  e Zd ZdZdZdZdZededdfddZ	e
 e
 dfd	e
jd
e
jdee f fddZd@d	e
jfddZede
jfddZede
jfddZedeeejf fddZedee fddZede
jfddZede
jfddZede
jfddZede
jfddZe
 fd e
jde
jfd!d"Ze
 fd e
jde
jfd#d$Ze d%e!d&d'e"de
jfd(d)Z#de
jde
jfd*d+Z$de
jde
jfd,d-Z%de
jde
jfd.d/Z&dAd0ede
jfd1d2Z'de
jfd3d4Z(de
jfd5d6Z)e
 fd e*de+e"d7f fd8d9Z,de
jddfd:d;Z-d@d<d=Z.defd>d?Z/  Z0S )Br
   zP
    Distribution is the abstract base class for probability distributions.
    FTvaluereturnNc                 C   s   | dvrt | t_dS )a  
        Sets whether validation is enabled or disabled.

        The default behavior mimics Python's ``assert`` statement: validation
        is on by default, but is disabled if Python is run in optimized mode
        (via ``python -O``). Validation may be expensive, so you may want to
        disable it once a model is working.

        Args:
            value (bool): Whether to enable validation.
        )TFN)
ValueErrorr
   _validate_args)r    r   ^/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/distributions/distribution.pyset_default_validate_args   s   
z&Distribution.set_default_validate_argsbatch_shapeevent_shapevalidate_argsc           	         s  || _ || _|d ur|| _| jr{z| j}W n ty-   i }t| j dd d  Y nw | D ]H\}}t	
|r<q2|| jvrLttt| |trLq2t| |}||}| sztd| dt|j dt|j dt|  dt| d	| q2t   d S )
Nz$ does not define `arg_constraints`. zAPlease set `arg_constraints = {}` or initialize the distribution z2with `validate_args=False` to turn off validation.zExpected parameter z (
 of shape z) of distribution z to satisfy the constraint , but found invalid values:
)_batch_shape_event_shaper   arg_constraintsNotImplementedErrorwarningswarn	__class__itemsr   is_dependent__dict__
isinstancegetattrtyper   checkallr   __name__tupleshapereprsuper__init__)	selfr   r   r   r   param
constraintr   validr   r   r   r+   (   sT   




zDistribution.__init__c                 C      t )a/  
        Returns a new distribution instance (or populates an existing instance
        provided by a derived class) with batch dimensions expanded to
        `batch_shape`. This method calls :class:`~torch.Tensor.expand` on
        the distribution's parameters. As such, this does not allocate new
        memory for the expanded distribution instance. Additionally,
        this does not repeat any args checking or parameter broadcasting in
        `__init__.py`, when an instance is first created.

        Args:
            batch_shape (torch.Size): the desired expanded size.
            _instance: new instance provided by subclasses that
                need to override `.expand`.

        Returns:
            New distribution instance with batch dimensions expanded to
            `batch_size`.
        r   )r,   r   	_instancer   r   r   expandO   s   zDistribution.expandc                 C      | j S )zF
        Returns the shape over which parameters are batched.
        )r   r,   r   r   r   r   d      zDistribution.batch_shapec                 C   r5   )zJ
        Returns the shape of a single sample (without batching).
        )r   r6   r   r   r   r   k   r7   zDistribution.event_shapec                 C   r1   )a
  
        Returns a dictionary from argument names to
        :class:`~torch.distributions.constraints.Constraint` objects that
        should be satisfied by each argument of this distribution. Args that
        are not tensors need not appear in this dict.
        r2   r6   r   r   r   r   r      zDistribution.arg_constraintsc                 C   r1   )z
        Returns a :class:`~torch.distributions.constraints.Constraint` object
        representing this distribution's support.
        r2   r6   r   r   r   support|      zDistribution.supportc                 C   r1   )z7
        Returns the mean of the distribution.
        r2   r6   r   r   r   mean      zDistribution.meanc                 C   s   t | j d)z7
        Returns the mode of the distribution.
        z does not implement mode)r   r   r6   r   r   r   mode   s   zDistribution.modec                 C   r1   )z;
        Returns the variance of the distribution.
        r2   r6   r   r   r   variance   r<   zDistribution.variancec                 C   s
   | j  S )zE
        Returns the standard deviation of the distribution.
        )r>   sqrtr6   r   r   r   stddev   s   
zDistribution.stddevsample_shapec                 C   s6   t   | |W  d   S 1 sw   Y  dS )z
        Generates a sample_shape shaped sample or sample_shape shaped batch of
        samples if the distribution parameters are batched.
        N)torchno_gradrsampler,   rA   r   r   r   sample   s   
$zDistribution.samplec                 C   r1   )z
        Generates a sample_shape shaped reparameterized sample or sample_shape
        shaped batch of reparameterized samples if the distribution parameters
        are batched.
        r2   rE   r   r   r   rD      r:   zDistribution.rsamplez=`sample_n(n)` will be deprecated. Use `sample((n,))` instead.)categorync                 C   s   |  t|fS )zq
        Generates n samples or n batches of samples if the distribution
        parameters are batched.
        )rF   rB   Size)r,   rH   r   r   r   sample_n   s   	zDistribution.sample_nc                 C   r1   )z
        Returns the log of the probability density/mass function evaluated at
        `value`.

        Args:
            value (Tensor):
        r2   r,   r   r   r   r   log_prob   r8   zDistribution.log_probc                 C   r1   )z
        Returns the cumulative density/mass function evaluated at
        `value`.

        Args:
            value (Tensor):
        r2   rK   r   r   r   cdf   r8   zDistribution.cdfc                 C   r1   )z
        Returns the inverse cumulative density/mass function evaluated at
        `value`.

        Args:
            value (Tensor):
        r2   rK   r   r   r   icdf   r8   zDistribution.icdfr4   c                 C   r1   )ar  
        Returns tensor containing all values supported by a discrete
        distribution. The result will enumerate over dimension 0, so the shape
        of the result will be `(cardinality,) + batch_shape + event_shape`
        (where `event_shape = ()` for univariate distributions).

        Note that this enumerates over all batched tensors in lock-step
        `[[0, 0], [1, 1], ...]`. With `expand=False`, enumeration happens
        along dim 0, but with the remaining batch dimensions being
        singleton dimensions, `[[0], [1], ..`.

        To iterate over the full Cartesian product use
        `itertools.product(m.enumerate_support())`.

        Args:
            expand (bool): whether to expand the support over the
                batch dims to match the distribution's `batch_shape`.

        Returns:
            Tensor iterating over dimension 0.
        r2   )r,   r4   r   r   r   enumerate_support   s   zDistribution.enumerate_supportc                 C   r1   )z
        Returns entropy of distribution, batched over batch_shape.

        Returns:
            Tensor of shape batch_shape.
        r2   r6   r   r   r   entropy   s   zDistribution.entropyc                 C   s   t |  S )z
        Returns perplexity of distribution, batched over batch_shape.

        Returns:
            Tensor of shape batch_shape.
        )rB   exprP   r6   r   r   r   
perplexity   s   zDistribution.perplexity.c                 C   s,   t |tjst|}t|| j | j S )ax  
        Returns the size of the sample returned by the distribution, given
        a `sample_shape`. Note, that the batch and event shapes of a distribution
        instance are fixed at the time of construction. If this is empty, the
        returned shape is upcast to (1,).

        Args:
            sample_shape (torch.Size): the size of the sample to be drawn.
        )r!   rB   rI   r   r   rE   r   r   r   _extended_shape  s   

zDistribution._extended_shapec           	      C   sP  t |tjs
tdt| t| j }| |d | jkr.td|  d| j d| }| j| j }tt	|t	|D ]\}}|dkr\|dkr\||kr\td| d| dqAz| j
}W n tyy   t| j dd	 d
  Y dS w |dusJ ||}| stdt|j dt|j dt| dt|  d| 
dS )a  
        Argument validation for distribution methods such as `log_prob`,
        `cdf` and `icdf`. The rightmost dimensions of a value to be
        scored via these methods must agree with the distribution's batch
        and event shapes.

        Args:
            value (Tensor): the tensor whose log probability is to be
                computed by the `log_prob` method.
        Raises
            ValueError: when the rightmost dimensions of `value` do not match the
                distribution's batch and event shapes.
        z/The value argument to log_prob must be a TensorNz5The right-most size of value must match event_shape: z vs .   z9Value is not broadcastable with batch_shape+event_shape: z% does not define `support` to enable z;sample validation. Please initialize the distribution with z-`validate_args=False` to turn off validation.zExpected value argument (r   z) to be within the support (z) of the distribution r   )r!   rB   Tensorr   lensizer   r   zipreversedr9   r   r   r   r   r$   r%   r#   r&   r'   r(   r)   )	r,   r   event_dim_startactual_shapeexpected_shapeijr9   r/   r   r   r   _validate_sample  sX   


zDistribution._validate_samplec                 C   sN   |d u rt | j|jkrtd| jj d|j d|d u r%| t | S |S )Nz	Subclass z of zR that defines a custom __init__ method must also define a custom .expand() method.)r#   r+   r   r   r&   __new__)r,   clsr3   r   r   r   _get_checked_instanceC  s
   z"Distribution._get_checked_instancec                    sD    fdd j  D }d fdd|D } jjd | d S )Nc                    s   g | ]\}}| j v r|qS r   )r    ).0k_r6   r   r   
<listcomp>L  s    z)Distribution.__repr__.<locals>.<listcomp>z, c                    s@   g | ]}| d  j |  dkr j | n j |   qS )z: rU   )r    numelrX   )rd   pr6   r   r   rg   N  s    2())r   r   joinr   r&   )r,   param_namesargs_stringr   r6   r   __repr__K  s   
zDistribution.__repr__)N)T)1r&   
__module____qualname____doc__has_rsamplehas_enumerate_supportr   staticmethodboolr   rB   rI   r   r+   r4   propertyr   r   r   strr   
Constraintr   r   r9   rV   r;   r=   r>   r@   rF   rD   r   FutureWarningintrJ   rL   rM   rN   rO   rP   rR   r	   r   rS   r`   rc   ro   __classcell__r   r   r0   r   r
      sf    '	


	"	
2)r   typingr   r   r   r   typing_extensionsr   rB   torch.distributionsr   torch.distributions.utilsr   torch.typesr	   __all__r
   r   r   r   r   <module>   s   