o
    "i$                     @   s  d dl Z d dlmZmZ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mZmZ eeef Zeeeedf f Zdeee  ded	efd
dZdeeeedf f d	efddZdededeg ef d	efddZdedededed	eeef f
ddZ	d-deeeedf f dededededed	efddZd eded	dfd!d"Zdeded	dfd#d$Zdefd%d&Ze	d'ed(d.dededed	efd)d*Z	 	 	d/dedededed	ef
d+d,ZdS )0    N)AnyCallableListOptionalTupleUnion)
deprecated)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 ur| |qS N)size.0in_dimarg r   S/home/ubuntu/SoloSpeech/.venv/lib/python3.10/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   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_outputsc                 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_lambdac                 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funcc                    s  t | tst | tstdt| d|  dt|  dt|dkr,tdt| dt|\}}t| |}|d u rRtdt| d|  dt| d  d	| d	t	||D ]d\}}t |tst|d urttdt| d|  d
| dt |trt |t
stdt| d|  d
| dt| d	|d ur|dk s|| krtdt| d|  d
| d|  d|  dqWt||}	 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 u r|nt || qS r   )torch_add_batch_dimr   r,   r   r   r   e   s    z*_create_batched_inputs.<locals>.<listcomp>)r"   intr#   r   	_get_nametyper$   r   r
   r   r	   dimr   r   )r*   r+   r,   r-   r   	args_specr   r   r   
batch_sizebatched_inputsr   r2   r   _create_batched_inputs3   sf   



r:   Fout_dimsr8   allow_none_pass_throughc                    s   t | tfdd}t| tr!|d }t|  |S |r2t fddt| |D S t fddt| |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/   )r4   r   )r-   num_outputsr;   r   r   <lambda>y   s
    z!_unwrap_batched.<locals>.<lambda>r   c                 3   s0    | ]\}}|d urt | |nd V  qd S r   r0   _remove_batch_dimr   outout_dimr8   r,   r   r   r      s    
z"_unwrap_batched.<locals>.<genexpr>c                 3   s$    | ]\}}t | |V  qd S r   r@   rB   rE   r   r   r      s
    
)r%   r)   r"   r	   r0   rA   r#   r   )r    r;   r,   r8   r-   r<   out_dims_as_tuplerD   r   )r8   r-   r>   r;   r,   r   _unwrap_batchedm   s    

	rG   outputsc                 C   s   t | trd S t | ts tdt| dt| dt|  dt| D ] \}}t |tr.q$tdt| dt| dt| d| d	d S )Nr.   z	, ...): `z%` must only return Tensors, got type z as the return.z for return r/   )r"   r	   r#   r   r4   r5   	enumerate)rH   r-   idxoutputr   r   r   _validate_outputs   s&   


rL   c                 C   sH   t | trd S t | trtdd | D s"tdt| d|  dd S )Nc                 s   s    | ]}t |tV  qd S r   )r"   r3   )r   rD   r   r   r   r      s    

z6_check_out_dims_is_int_or_int_tuple.<locals>.<genexpr>r.   r=   zu): `out_dims` must be an int or a tuple of int representing where in the outputs the vmapped dimension should appear.)r"   r3   r#   allr   r4   )r;   r-   r   r   r   #_check_out_dims_is_int_or_int_tuple   s   
rN   c                 C   s   t | dr| jS t| S )N__name__)hasattrrO   repr)r-   r   r   r   r4      s   
r4   z@Please use `torch.vmap` instead of `torch._vmap_internals.vmap`.)categoryc                 C   s   t | ||S )z4
    Please use torch.vmap instead of this API.
    )_vmap)r-   r*   r;   r   r   r   vmap   s   rT   c                    s    t  fdd}|S )Nc                     sj   t  tj }z$t| |\}}| } st| t||| dW tj  S tj  w )N)r<   )rN   r0   _C_vmapmode_increment_nestingr:   rL   rG   _vmapmode_decrement_nesting)r+   r,   r9   r8   r    r<   r-   r*   r;   r   r   wrapped   s$   


	z_vmap.<locals>.wrapped)	functoolswraps)r-   r*   r;   r<   rY   r   rX   r   rS      s   
rS   )F)r   r   )r   r   F) rZ   typingr   r   r   r   r   r   typing_extensionsr   r0   r	   torch.utils._pytreer
   r   r   r3   	in_dims_t
out_dims_tr   r%   strr)   r:   boolrG   rL   rN   r4   FutureWarningrT   rS   r   r   r   r   <module>   s    

"



@
*
