U
    ©Ê¹j$0  ã                   @   sd   d dl Z d dlmZmZmZ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)Úconstraints)Úlazy_property)Ú_sizeÚDistributionc                       s"  e Zd ZdZdZdZdZeeddœdd„ƒZ	e
 ¡ e
 ¡ dfe
je
jee dœ‡ fd	d
„Zd=e
jdœdd„Zee
jdœdd„ƒZee
jdœdd„ƒZeeeejf dœdd„ƒZeee dœdd„ƒZee
jdœdd„ƒZee
jdœdd„ƒZee
jdœdd„ƒZee
jdœdd„ƒZe
 ¡ fe
je
jdœd d!„Ze
 ¡ fe
je
jdœd"d#„Ze e
jd$œd%d&„Z!e
je
jdœd'd(„Z"e
je
jdœd)d*„Z#e
je
jdœd+d,„Z$d>ee
jd-œd.d/„Z%e
jdœd0d1„Z&e
jdœd2d3„Z'e
 ¡ fe(e)e d4f dœd5d6„Z*e
jddœd7d8„Z+d?d9d:„Z,edœd;d<„Z-‡  Z.S )@r	   zP
    Distribution is the abstract base class for probability distributions.
    FTN)ÚvalueÚreturnc                 C   s   | dk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   ú_/var/www/html/bwave/python/venv/lib/python3.8/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 k	r|| _| jrøz
| j}W n2 tk
r\   i }t | j› d�d d ¡ Y nX | ¡ D ]�\}}t	 
|¡rzqf|| jkršttt| ƒ|ƒtƒršqft| |ƒ}| |¡}| ¡ sftd|› dt|ƒj› dt|jƒ› dt| ƒ› dt|ƒ› d	|› �ƒ‚qftƒ  ¡  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   Z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)   &   s>    

ÿþÿ

 ÿ

:ÿzDistribution.__init__)r   c                 C   s   t ‚dS )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`.
        N©r   )r*   r   Ú	_instancer   r   r   ÚexpandM   s    zDistribution.expand)r   c                 C   s   | j S )zF
        Returns the shape over which parameters are batched.
        )r   ©r*   r   r   r   r   b   s    zDistribution.batch_shapec                 C   s   | j S )zJ
        Returns the shape of a single sample (without batching).
        )r   r2   r   r   r   r   i   s    zDistribution.event_shapec                 C   s   t ‚dS )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.
        Nr/   r2   r   r   r   r   p   s    zDistribution.arg_constraintsc                 C   s   t ‚dS )z‰
        Returns a :class:`~torch.distributions.constraints.Constraint` object
        representing this distribution's support.
        Nr/   r2   r   r   r   Úsupportz   s    zDistribution.supportc                 C   s   t ‚dS )z7
        Returns the mean of the distribution.
        Nr/   r2   r   r   r   Úmean‚   s    zDistribution.meanc                 C   s   t | j› d�ƒ‚dS )z7
        Returns the mode of the distribution.
        z does not implement modeN)r   r   r2   r   r   r   Úmode‰   s    zDistribution.modec                 C   s   t ‚dS )z;
        Returns the variance of the distribution.
        Nr/   r2   r   r   r   Úvariance�   s    zDistribution.variancec                 C   s
   | j  ¡ S )zE
        Returns the standard deviation of the distribution.
        )r6   Úsqrtr2   r   r   r   Ústddev—   s    zDistribution.stddev)Úsample_shaper   c              
   C   s*   t  ¡ � |  |¡W  5 Q R £ S Q R X dS )z”
        Generates a sample_shape shaped sample or sample_shape shaped batch of
        samples if the distribution parameters are batched.
        N)ÚtorchZno_gradÚrsample©r*   r9   r   r   r   Úsamplež   s    
zDistribution.samplec                 C   s   t ‚dS )z¼
        Generates a sample_shape shaped reparameterized sample or sample_shape
        shaped batch of reparameterized samples if the distribution parameters
        are batched.
        Nr/   r<   r   r   r   r;   ¦   s    zDistribution.rsample)Únr   c                 C   s   t  dt¡ |  t |f¡¡S )zq
        Generates n samples or n batches of samples if the distribution
        parameters are batched.
        z6sample_n will be deprecated. Use .sample((n,)) instead)r   r   ÚUserWarningr=   r:   ÚSize)r*   r>   r   r   r   Úsample_n®   s
     ÿzDistribution.sample_nc                 C   s   t ‚dS )z“
        Returns the log of the probability density/mass function evaluated at
        `value`.

        Args:
            value (Tensor):
        Nr/   ©r*   r
   r   r   r   Úlog_prob¸   s    zDistribution.log_probc                 C   s   t ‚dS )z‡
        Returns the cumulative density/mass function evaluated at
        `value`.

        Args:
            value (Tensor):
        Nr/   rB   r   r   r   ÚcdfÂ   s    zDistribution.cdfc                 C   s   t ‚dS )z�
        Returns the inverse cumulative density/mass function evaluated at
        `value`.

        Args:
            value (Tensor):
        Nr/   rB   r   r   r   ÚicdfÌ   s    zDistribution.icdf)r1   r   c                 C   s   t ‚dS )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.
        Nr/   )r*   r1   r   r   r   Úenumerate_supportÖ   s    zDistribution.enumerate_supportc                 C   s   t ‚dS )z‡
        Returns entropy of distribution, batched over batch_shape.

        Returns:
            Tensor of shape batch_shape.
        Nr/   r2   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.
        )r:   ÚexprG   r2   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   r:   r@   r   r   r<   r   r   r   Ú_extended_shape   s    

zDistribution._extended_shapec           	      C   sV  t |tjƒstdƒ‚t| ¡ ƒt| jƒ }| ¡ |d… | jkr\td| ¡ › d| j› d�ƒ‚| ¡ }| j| j }tt	|ƒt	|ƒƒD ]6\}}|dkr‚|dkr‚||kr‚td|› d|› d�ƒ‚q‚z
| j
}W n0 tk
rô   t | j› d�d	 d
 ¡ Y dS X |dk	�st‚| |¡}| ¡ �sRt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   r:   ÚTensorr   ÚlenÚsizer   r   ÚzipÚreversedr3   r   r   r   r   ÚAssertionErrorr"   r#   r!   r$   r%   r&   r'   )	r*   r
   Zevent_dim_startZactual_shapeZexpected_shapeÚiÚjr3   r-   r   r   r   Ú_validate_sample  s>    ÿÿ

ÿþÿ

4ÿzDistribution._validate_samplec                 C   sN   |d kr4t | ƒj|jkr4td| jj› d|j› d�ƒ‚|d krJ|  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*   Úclsr0   r   r   r   Ú_get_checked_instance@  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 kr|‘qS r   )r   )Ú.0ÚkÚ_r2   r   r   Ú
<listcomp>I  s     
 z)Distribution.__repr__.<locals>.<listcomp>z, c                    s@   g | ]8}|› d ˆ j |  ¡ dkr*ˆ j | nˆ j |  ¡ › �‘qS )z: rL   )r   ZnumelrO   )rY   Úpr2   r   r   r\   K  s   ÿú(ú))r   r   Újoinr   r$   )r*   Zparam_namesÚargs_stringr   r2   r   Ú__repr__H  s    
þÿzDistribution.__repr__)N)T)N)/r$   Ú
__module__Ú__qualname__Ú__doc__Zhas_rsampleZhas_enumerate_supportr   ÚstaticmethodÚboolr   r:   r@   r   r)   r1   Úpropertyr   r   r   Ústrr   Ú
Constraintr   r   r3   rM   r4   r5   r6   r8   r=   r;   ÚintrA   rC   rD   rE   rF   rG   rI   r   r   rJ   rU   rX   rb   Ú__classcell__r   r   r.   r   r	      sX   üü'	



		 2
)r   Útypingr   r   r   r   r:   Ztorch.distributionsr   Ztorch.distributions.utilsr   Ztorch.typesr   Ú__all__r	   r   r   r   r   Ú<module>   s   