U
    ªÊ¹j­$  ã                	   @   s|  d dl Z d dlZd dlmZmZmZmZmZmZ d dl	Z	d dl	m
Z
 d dlmZmZmZ eeef Zeeeedf f Zeee  eedœdd„Zee
ee
df f ed	œd
d„Zeeeg ef edœdd„Zeeeeeeef dœdd„Zd%ee
ee
df f eeeeeedœdd„Zeeddœdd„Zeeddœdd„Zedœdd„Zd&eeeedœd d!„Zd'eeeeed"œd#d$„ZdS )(é    N)ÚAnyÚCallableÚListÚOptionalÚTupleÚUnion)ÚTensor)Ú_broadcast_to_and_flattenÚtree_flattenÚtree_unflatten.)Úflat_in_dimsÚ	flat_argsÚreturnc                    sF   dd„ t | |ƒD ƒ‰ ˆ r>t‡ fdd„ˆ D ƒƒr>tdˆ › d�ƒ‚ˆ d S )Nc                 S   s"   g | ]\}}|d k	r|  |¡‘qS ©N)Úsize©Ú.0Úin_dimÚarg© r   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_vmap_internals.pyÚ
<listcomp>   s   þz0_validate_and_get_batch_size.<locals>.<listcomp>c                 3   s   | ]}|ˆ d  kV  qdS )r   Nr   )r   r   ©Zbatch_sizesr   r   Ú	<genexpr>   s     z/_validate_and_get_batch_size.<locals>.<genexpr>zTvmap: Expected all tensors to have the same size in the mapped dimension, got sizes z for the mapped dimensionr   )ÚzipÚanyÚ
ValueError)r   r   r   r   r   Ú_validate_and_get_batch_size   s    þ
ÿr   )Úbatched_outputsr   c                 C   s   t | tƒrt| ƒS dS )Né   )Ú
isinstanceÚtupleÚlen)r   r   r   r   Ú_num_outputs   s    
r#   )ÚvalueÚnum_elementsÚerror_message_lambdar   c                 C   s.   t | tƒs| f| S t| ƒ|kr*t|ƒ ƒ‚| S r   )r    r!   r"   r   )r$   r%   r&   r   r   r   Ú	_as_tuple&   s
    


r'   )Úin_dimsÚargsÚ
vmap_levelÚfuncr   c                    s®  t | tƒs8t | tƒs8tdt|ƒ› d| › dt| ƒ› d�ƒ‚t|ƒdkrXtdt|ƒ› d�ƒ‚t|ƒ\}}t| |ƒ}|d kr¤tdt|ƒ› d| › dt| ƒd › d	|› d�	ƒ‚t	||ƒD ]Î\}}t |tƒsè|d k	rètdt|ƒ› d| › d
|› d�ƒ‚t |tƒ�r*t |t
ƒ�s*tdt|ƒ› d| › d
|› dt|ƒ› d�	ƒ‚|d k	r®|dk �sH|| ¡ kr®tdt|ƒ› d| › d
|› d| ¡ › d| ¡ › d�ƒ‚q®t||ƒ}	‡ fdd„t	||ƒD ƒ}
t|
|ƒ|	fS )Núvmap(z
, in_dims=zv, ...)(<inputs>): expected `in_dims` to be int or a (potentially nested) tuple matching the structure of inputs, got: Ú.r   z�)(<inputs>): got no inputs. Maybe you forgot to add inputs, or you are trying to vmap over a function with no inputs. The latter is unsupported.zb, ...)(<inputs>): in_dims is not compatible with the structure of `inputs`. in_dims has structure r   z but inputs has structure z, ...)(<inputs>): Got in_dim=zE for an input but in_dim must be either an integer dimension or None.z' for an input but the input is of type zT. We cannot vmap over non-Tensor arguments, please use None as the respective in_dimz> for some input, but that input is a Tensor of dimensionality z- so expected in_dim to satisfy 0 <= in_dim < c                    s*   g | ]"\}}|d kr|nt  ||ˆ ¡‘qS r   )ÚtorchZ_add_batch_dimr   ©r*   r   r   r   d   s   ÿz*_create_batched_inputs.<locals>.<listcomp>)r    Úintr!   r   Ú	_get_nameÚtyper"   r
   r	   r   r   Údimr   r   )r(   r)   r*   r+   r   Z	args_specr   r   r   Ú
batch_sizeÚbatched_inputsr   r/   r   Ú_create_batched_inputs2   s@    ÿÿ
(ÿÿ$ÿ.ÿ

þr6   F)r   Úout_dimsr*   r4   r+   Úallow_none_pass_throughr   c                    s†   t | ƒ‰tˆˆ‡‡‡fdd„ƒ}t| tƒrB|d }t | ˆˆ |¡S |rdt‡ ‡fdd„t| |ƒD ƒƒS t‡ ‡fdd„t| |ƒD ƒƒS d S )Nc                	      s&   dt ˆ ƒ› dˆ› dˆ› dt ˆ ƒ› d�	S )Nr,   ú, ..., out_dims=z0): `out_dims` must have one dim per output (got z outputs) of r-   )r1   r   )r+   Únum_outputsr7   r   r   Ú<lambda>x   ó    z!_unwrap_batched.<locals>.<lambda>r   c                 3   s.   | ]&\}}|d k	r"t  |ˆˆ |¡nd V  qd S r   ©r.   Ú_remove_batch_dim©r   ÚoutÚout_dim©r4   r*   r   r   r   ƒ   s   ýÿz"_unwrap_batched.<locals>.<genexpr>c                 3   s"   | ]\}}t  |ˆˆ |¡V  qd S r   r=   r?   rB   r   r   r   Œ   s   ÿ)r#   r'   r    r   r.   r>   r!   r   )r   r7   r*   r4   r+   r8   Zout_dims_as_tuplerA   r   )r4   r+   r:   r7   r*   r   Ú_unwrap_batchedl   s     ý

ú	þrC   )Úoutputsr+   r   c                 C   s�   t | tƒrd S t | tƒs@tdt|ƒ› dt|ƒ› dt| ƒ› d�ƒ‚t| ƒD ]B\}}t |tƒr\qHtdt|ƒ› dt|ƒ› dt|ƒ› d|› d�	ƒ‚qHd S )Nr,   z	, ...): `z%` must only return Tensors, got type z as the return.z for return r-   )r    r   r!   r   r1   r2   Ú	enumerate)rD   r+   ÚidxÚoutputr   r   r   Ú_validate_outputs–   s    

"ÿ
(ÿrH   )r7   r+   r   c                 C   sH   t | tƒrd S t | tƒr*tdd„ | D ƒƒsDtdt|ƒ› d| › d�ƒ‚d S )Nc                 s   s   | ]}t |tƒV  qd S r   )r    r0   )r   rA   r   r   r   r   ª   s    z6_check_out_dims_is_int_or_int_tuple.<locals>.<genexpr>r,   r9   zu): `out_dims` must be an int or a tuple of int representing where in the outputs the vmapped dimension should appear.)r    r0   r!   Úallr   r1   )r7   r+   r   r   r   Ú#_check_out_dims_is_int_or_int_tuple§   s    
ÿÿrJ   ©r+   c                 C   s   t | dƒr| jS t| ƒS )NÚ__name__)ÚhasattrrL   ÚreprrK   r   r   r   r1   ´   s    
r1   )r+   r(   r7   r   c                 C   s   t jddd� t| ||ƒS )z4
    Please use torch.vmap instead of this API.
    z=Please use torch.vmap instead of torch._vmap_internals.vmap. é   )Ú
stacklevel)ÚwarningsÚwarnÚ_vmap)r+   r(   r7   r   r   r   ÚvmapÁ   s
    þrT   )r+   r(   r7   r8   r   c                    s    t  ˆ¡‡ ‡‡‡fdd„ƒ}|S )Nc                     sf   t ˆˆƒ tj ¡ }z@tˆ| |ˆƒ\}}ˆ|Ž }ˆ s>t|ˆƒ t|ˆ||ˆˆ d�W ¢S tj ¡  X d S )N)r8   )rJ   r.   Z_CZ_vmapmode_increment_nestingZ_vmapmode_decrement_nestingr6   rH   rC   )r)   r*   r5   r4   r   ©r8   r+   r(   r7   r   r   Úwrapped×   s*    

   ÿ
ú
	z_vmap.<locals>.wrapped)Ú	functoolsÚwraps)r+   r(   r7   r8   rV   r   rU   r   rS   Í   s    
rS   )F)r   r   )r   r   F)rW   rQ   Útypingr   r   r   r   r   r   r.   r   Ztorch.utils._pytreer	   r
   r   r0   Z	in_dims_tZ
out_dims_tr   r#   Ústrr'   r6   ÚboolrC   rH   rJ   r1   rT   rS   r   r   r   r   Ú<module>   s^    
 þ 	  
þ   
þ@ úù*   üû