o
    h20                     @   sp   d dl Z d dl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 dlmZ dgZG d	d dZdS )
    N)Optional)
deprecated)Tensor)constraints)lazy_property)_sizeDistributionc                       s  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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j fddZedefddZedefddZedefddZedefddZe
 fd edefd!d"Ze
 fd edefd#d$Ze d%e!d&d'e"defd(d)Z#dedefd*d+Z$dedefd,d-Z%dedefd.d/Z&d@d0edefd1d2Z'defd3d4Z(defd5d6Z)e
 fd ede
jfd7d8Z*deddfd9d:Z+d?d;d<Z,defd=d>Z-  Z.S )Ar   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   t/var/www/html/construction_image-detection-poc/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 ]I\}}t	
|r<q2|| jvrLttt| |trLq2t| |}||}t|s{t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torch_is_all_truer   __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   expandQ   s   zDistribution.expandc                 C      | j S )zF
        Returns the shape over which parameters are batched.
        )r   r+   r   r   r   r   f      zDistribution.batch_shapec                 C   r4   )zJ
        Returns the shape of a single sample (without batching).
        )r   r5   r   r   r   r   m   r6   zDistribution.event_shapec                 C   r0   )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.
        r1   r5   r   r   r   r   t      zDistribution.arg_constraintsc                 C   r0   )z
        Returns a :class:`~torch.distributions.constraints.Constraint` object
        representing this distribution's support.
        r1   r5   r   r   r   support~      zDistribution.supportc                 C   r0   )z7
        Returns the mean of the distribution.
        r1   r5   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   r5   r   r   r   mode   s   zDistribution.modec                 C   r0   )z;
        Returns the variance of the distribution.
        r1   r5   r   r   r   variance   r;   zDistribution.variancec                 C   s
   | j  S )zE
        Returns the standard deviation of the distribution.
        )r=   sqrtr5   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)r#   no_gradrsampler+   r@   r   r   r   sample   s   
$zDistribution.samplec                 C   r0   )z
        Generates a sample_shape shaped reparameterized sample or sample_shape
        shaped batch of reparameterized samples if the distribution parameters
        are batched.
        r1   rC   r   r   r   rB      r9   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.
        )rD   r#   Size)r+   rF   r   r   r   sample_n   s   	zDistribution.sample_nc                 C   r0   )z
        Returns the log of the probability density/mass function evaluated at
        `value`.

        Args:
            value (Tensor):
        r1   r+   r	   r   r   r   log_prob   r7   zDistribution.log_probc                 C   r0   )z
        Returns the cumulative density/mass function evaluated at
        `value`.

        Args:
            value (Tensor):
        r1   rI   r   r   r   cdf   r7   zDistribution.cdfc                 C   r0   )z
        Returns the inverse cumulative density/mass function evaluated at
        `value`.

        Args:
            value (Tensor):
        r1   rI   r   r   r   icdf   r7   zDistribution.icdfr3   c                 C   r0   )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.
        r1   )r+   r3   r   r   r   enumerate_support   s   zDistribution.enumerate_supportc                 C   r0   )z
        Returns entropy of distribution, batched over batch_shape.

        Returns:
            Tensor of shape batch_shape.
        r1   r5   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#   exprN   r5   r   r   r   
perplexity   s   zDistribution.perplexityc                 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#   rG   r   r   rC   r   r   r   _extended_shape  s   

zDistribution._extended_shapec           	      C   sR  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 ||}t|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   r#   r   r   lensizer   r   zipreversedr8   r   r   r   r   r"   r$   r!   r%   r&   r'   r(   )	r+   r	   event_dim_startactual_shapeexpected_shapeijr8   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+   clsr2   r   r   r   _get_checked_instanceE  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_r5   r   r   
<listcomp>N  s    z)Distribution.__repr__.<locals>.<listcomp>z, c                    s@   g | ]}| d  j |  dkr j | n j |   qS )z: rS   )r   numelrU   )ra   pr5   r   r   rd   P  s    2())r   r   joinr   r%   )r+   param_namesargs_stringr   r5   r   __repr__M  s   
zDistribution.__repr__)N)T)/r%   
__module____qualname____doc__has_rsamplehas_enumerate_supportr   staticmethodboolr   r#   rG   r   r*   r   r3   propertyr   r   dictstrr   
Constraintr   r8   r   r:   r<   r=   r?   rD   rB   r   FutureWarningintrH   rJ   rK   rL   rM   rN   rP   rQ   r]   r`   rl   __classcell__r   r   r/   r   r      sf    '	


		
2)r   typingr   typing_extensionsr   r#   r   torch.distributionsr   torch.distributions.utilsr   torch.typesr   __all__r   r   r   r   r   <module>   s   