U
    ©Ê¹jÎ  ã                   @   sì   d dl mZ d dlmZ d dlmZmZ d dlZd dlm	  m
Z d dlmZ dZddd	d
dddgZdd„ Zdd„ Zdd„ Zddd„Zdd	„ Zddd
„ZG dd„ dƒZG dd„ deeƒZd ejeejdœdd„Zd!ejeejdœdd„ZdS )"é    )Úupdate_wrapper)ÚNumber)ÚAnyÚDictN©Úis_tensor_likeg¶oüŒxâ?Úbroadcast_allÚlogits_to_probsÚclamp_probsÚprobs_to_logitsÚlazy_propertyÚtril_matrix_to_vecÚvec_to_tril_matrixc                     sŠ   t dd„ | D ƒƒstdƒ‚t dd„ | D ƒƒs€tt ¡ d�‰ | D ]$}t|tjƒr>t|j|jd�‰  qdq>‡ fdd„| D ƒ}tj	|Ž S tj	| Ž S )	aì  
    Given a list of values (possibly containing numbers), returns a list where each
    value is broadcasted based on the following rules:
      - `torch.*Tensor` instances are broadcasted as per :ref:`_broadcasting-semantics`.
      - numbers.Number instances (scalars) are upcast to tensors having
        the same size and type as the first tensor passed to `values`.  If all the
        values are scalars, then they are upcasted to scalar Tensors.

    Args:
        values (list of `numbers.Number`, `torch.*Tensor` or objects implementing __torch_function__)

    Raises:
        ValueError: if any of the values is not a `numbers.Number` instance,
            a `torch.*Tensor` instance, or an instance implementing __torch_function__
    c                 s   s    | ]}t |ƒpt|tƒV  qd S ©N)r   Ú
isinstancer   ©Ú.0Úv© r   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributions/utils.pyÚ	<genexpr>&   s     z broadcast_all.<locals>.<genexpr>zqInput arguments must all be instances of numbers.Number, torch.Tensor or objects implementing __torch_function__.c                 s   s   | ]}t |ƒV  qd S r   r   r   r   r   r   r   +   s     )Údtype©r   Údevicec                    s&   g | ]}t |ƒr|ntj|fˆ Ž‘qS r   )r   ÚtorchZtensorr   ©Úoptionsr   r   Ú
<listcomp>1   s    z!broadcast_all.<locals>.<listcomp>)
ÚallÚ
ValueErrorÚdictr   Zget_default_dtyper   ÚTensorr   r   Zbroadcast_tensors)ÚvaluesÚvalueÚ
new_valuesr   r   r   r      s    ÿ
ÿ
c                 C   sB   t j ¡ r.t  t j| ||d�t j| ||d�¡S t j| ||d� ¡ S )Nr   )r   Ú_CÚ_get_tracing_stateÚnormalZzerosZonesÚemptyZnormal_)Úshaper   r   r   r   r   Ú_standard_normal8   s    
þr*   c                 C   s0   |dkr| S | j d| … d }|  |¡ d¡S )zÎ
    Sum out ``dim`` many rightmost dimensions of a given tensor.

    Args:
        value (Tensor): A tensor of ``.dim()`` at least ``dim``.
        dim (int): The number of rightmost dims to sum out.
    r   N)éÿÿÿÿr+   )r)   ZreshapeÚsum)r#   ÚdimZrequired_shaper   r   r   Ú_sum_rightmostB   s    r.   Fc                 C   s   |rt  | ¡S tj| dd�S )a  
    Converts a tensor of logits into probabilities. Note that for the
    binary case, each value denotes log odds, whereas for the
    multi-dimensional case, the values along the last dimension denote
    the log probabilities (possibly unnormalized) of the events.
    r+   )r-   )r   ZsigmoidÚFZsoftmax)ZlogitsÚ	is_binaryr   r   r   r	   P   s    
c                 C   s    t  | j¡j}| j|d| d�S )Né   )ÚminÚmax)r   Úfinfor   ÚepsÚclamp)Úprobsr5   r   r   r   r
   \   s    c                 C   s,   t | ƒ}|r"t |¡t | ¡ S t |¡S )a$  
    Converts a tensor of probabilities into logits. For the binary case,
    this denotes the probability of occurrence of the event indexed by `1`.
    For the multi-dimensional case, the values along the last dimension
    denote the probabilities of occurrence of each of the events.
    )r
   r   ÚlogÚlog1p)r7   r0   Z
ps_clampedr   r   r   r   a   s    c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )r   zø
    Used as a decorator for lazy loading of class attributes. This uses a
    non-data descriptor that calls the wrapped method to compute the property on
    first call; thereafter replacing the wrapped method into an instance
    attribute.
    c                 C   s   || _ t| |ƒ d S r   )Úwrappedr   ©Úselfr:   r   r   r   Ú__init__v   s    zlazy_property.__init__Nc              	   C   sD   |d krt | jƒS t ¡ � |  |¡}W 5 Q R X t|| jj|ƒ |S r   )Ú_lazy_property_and_propertyr:   r   Zenable_gradÚsetattrÚ__name__)r<   ÚinstanceÚobj_typer#   r   r   r   Ú__get__z   s    

zlazy_property.__get__)N)r@   Ú
__module__Ú__qualname__Ú__doc__r=   rC   r   r   r   r   r   n   s   c                   @   s   e Zd ZdZdd„ ZdS )r>   zžWe want lazy properties to look like multiple things.

    * property when Sphinx autodoc looks
    * lazy_property when Distribution validate_args looks
    c                 C   s   t  | |¡ d S r   )Úpropertyr=   r;   r   r   r   r=   Š   s    z$_lazy_property_and_property.__init__N)r@   rD   rE   rF   r=   r   r   r   r   r>   ƒ   s   r>   )ÚmatÚdiagÚreturnc                 C   s€   | j d }tj ¡ sH|| k s&||krHtd|› d| › d|d › d�ƒ‚tj|| jd�}|| dd¡|d  k }| d|f }|S )	z 
    Convert a `D x D` matrix or a batch of matrices into a (batched) vector
    which comprises of lower triangular elements from the matrix in row order.
    r+   zdiag (z) provided is outside [z, r1   z].©r   .)r)   r   r%   r&   r   Úaranger   Úview)rH   rI   ÚnrL   Ú	tril_maskÚvecr   r   r   r   Ž   s    
")rP   rI   rJ   c                 C   s  dd|   dd|  d d| j d   dt|ƒ |d   d  d }t | j¡j}tj ¡ sŠt|ƒ| |krŠt	d| j d › d�d	 ƒ‚t
|tjƒr¢t| ¡ ƒnt|ƒ}|  | j d
d… t ||f¡ ¡}tj|| jd�}|| dd¡|d  k }| |d|f< |S )z•
    Convert a vector or a batch of vectors into a batched `D x D`
    lower triangular matrix containing elements from the vector in row order.
    r1   é   é   r+   é   g      à?zThe size of last dimension is z which cannot be expressed as z3the lower triangular part of a square D x D matrix.NrK   .)r)   Úabsr   r4   r   r5   r%   r&   Úroundr   r   r!   ÚitemZ	new_zerosÚSizerL   r   rM   )rP   rI   rN   r5   rH   rL   rO   r   r   r   r   œ   s$    4ÿýÿÿ ")F)F)r   )r   )Ú	functoolsr   Únumbersr   Útypingr   r   r   Ztorch.nn.functionalÚnnZ
functionalr/   Ztorch.overridesr   Zeuler_constantÚ__all__r   r*   r.   r	   r
   r   r   rG   r>   r!   Úintr   r   r   r   r   r   Ú<module>   s0   ù"


