
    %VjiB                        d dl Z d dlZd dlZd dlm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mZmZmZmZ d dlmZmZmZmZmZ eeef         Zeeeedf         f         Zd	 Zd
eee                  dedefdZdee
ee
df         f         defdZ dededeg e!f         defdZ"dedededeeee         ee         ef         fdZ#d
ee         dee         dedefdZ$d Z%dee
ee
df         f         dededededefdZ&d Z'dededdfdZ(defd Z)d! Z*d" Z+d# Z,d$ Z-d% Z.d& Z/d' Z0e j1        d(             Z2d) Z3d* Z4d+ Z5d, Z6dS )-    N)partial)AnyCallableOptionalUnion)Tensor)is_batchedtensor)_add_batch_dim_remove_batch_dim_vmap_decrement_nesting_vmap_increment_nestinglazy_load_decompositions)_broadcast_to_and_flattentree_flatten	tree_map_tree_unflattenTreeSpec.c                 N     dt          j                    fd            }|S )Nzvtorch.func.{grad, vjp, jacrev, hessian} don't yet support saved tensor hooks. Please open an issue with your use case.c                      t           j        j                                      5   | i |cd d d            S # 1 swxY w Y   d S N)torchautogradgraphdisable_saved_tensors_hooks)argskwargsfmessages     O/root/voice-cloning/.venv/lib/python3.11/site-packages/torch/_functorch/vmap.pyfnz.doesnt_support_saved_tensors_hooks.<locals>.fn,   s    ^!==gFF 	& 	&1d%f%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   ;??)	functoolswraps)r   r    r   s   ` @r   "doesnt_support_saved_tensors_hooksr#   &   sJ    	3 
 _Q& & & & & & I    flat_in_dims	flat_argsreturnc                     d t          | |          D             t                    dk    rt          d          r.t          fdD                       rt          d d          d         S )Nc                 B    g | ]\  }}||                     |          S r   )size).0in_dimargs      r   
<listcomp>z0_validate_and_get_batch_size.<locals>.<listcomp>8   s8       FC 	r$   r   z/vmap: Expected at least one Tensor to vmap overc              3   0   K   | ]}|d          k    V  dS )r   N )r+   r*   batch_sizess     r   	<genexpr>z/_validate_and_get_batch_size.<locals>.<genexpr>?   s,      JJd4;q>1JJJJJJr$   zTvmap: Expected all tensors to have the same size in the mapped dimension, got sizes z for the mapped dimension)ziplen
ValueErrorany)r%   r&   r1   s     @r   _validate_and_get_batch_sizer7   5   s     |Y77  K
 ;1JKKK 
sJJJJkJJJJJ 
K$/K K K
 
 	
 q>r$   batched_outputsc                 N    t          | t                    rt          |           S dS )N   )
isinstancetupler4   )r8   s    r   _num_outputsr=   G   s'    /5)) $?###1r$   valuenum_elementserror_message_lambdac                     t          | t                    s| f|z  S t          |           |k    rt           |                      | S r   )r;   r<   r4   r5   )r>   r?   r@   s      r   	_as_tuplerB   Q   sQ     eU## 'x,&&
5zz\!!--//000Lr$   in_dimsr   funcc                    t          | t                    sHt          | t                    s3t          dt	          |           d|  dt          |            d          t          |          dk    r t          dt	          |           d          t          |          \  }}t          | |          }|<t          dt	          |           d|  dt          |           d          d	| d	          t          t          ||                    D ]`\  }\  }}t          |t                    s(|&t          dt	          |           d|  d
| d          t          |t                    rKt          |t                    s6t          dt	          |           d|  d
| dt          |           d	          |||                                 k     s||                                k    ret          dt	          |           d|  d
| d|                                 d|                                 d|                                 d          | |dk     r||                                z  ||<   bt          ||          |||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 -z <= in_dim < )r;   intr<   r5   	_get_nametyper4   r   r   	enumerater3   r   dimr7   )	rC   r   rD   r&   	args_specr%   ir-   r,   s	            r   _process_batched_inputsrO   [   sQ    gs## 
Jw,F,F 
GIdOO G Gw G G6:7mmG G G
 
 	

 4yyA~~*IdOO * * *
 
 	
 (--Iy,Wi@@L*IdOO * *w * *%1'%:%:1%=* * '* * *
 
 	
 &c)\&B&BCC 1 1=C&#&& 	6+=1	$ 1 17 1 1$1 1 1  
 fc"" 	:c6+B+B 	<	$ < <7 < <$< <99< < <   6SWWYYJ#6#6&CGGII:M:M9	$ 9 97 9 9$9 9%(WWYY9 9 GGII9 9 -0GGII9 9 9   &1**$swwyy0LO 	%\9==	 r$   
vmap_levelc                 \    fdt          | |          D             }t          ||          S )Nc                 @    g | ]\  }}||nt          ||          S r   )r
   )r+   r,   r-   rP   s      r   r.   z*_create_batched_inputs.<locals>.<listcomp>   sA       FC ~>#vz#J#J  r$   )r3   r   )r%   r&   rP   rM   batched_inputss     `  r   _create_batched_inputsrT      sG       |Y77  N .)444r$   c           
      ,   |At          |t          j                  r%t          |          rt	          d|  d|  d          |S t          |t          j                  s&t	          d|  d|  dt          |           d          t          ||||          S )NrF   z	, ...): `z5` can not return a BatchedTensor when out_dim is Nonez%` must only return Tensors, got type z3. Did you mean to set out_dims= to None for output?)r;   r   r   r	   r5   rJ   r   )namebatched_outputrP   
batch_sizeout_dims        r   _maybe_remove_batch_dimrZ      s    nel33 	8H9
 9
 	 6 6 6t 6 6 6    nel33 
@D @ @4 @ @!%n!5!5@ @ @
 
 	
 ^ZWMMMr$   out_dimsrX   c                   	 t          |           \  }		fd}t          | t          j                  rUt          t                    rg}nXt          t
                    rt                    dk    r}n-g}n' |             nt          	          }|
 |             fdt          ||          D             }t          |	          S )Nc                  |    t          dt                      d dt                    d          d d	          )NrF   , ..., out_dims=z`)(<inputs>): out_dims is not compatible with the structure of `outputs`. out_dims has structure r:   z but outputs has structure rG   )r5   rI   r   )rD   r[   output_specs   r   incompatible_errorz+_unwrap_batched.<locals>.incompatible_error   sf    ,IdOO , ,X , ,&28&<&<Q&?, , ), , ,
 
 	
r$   r:   c           	      V    g | ]%\  }}t          t                    ||          &S r0   )rZ   rI   )r+   rW   rY   rX   rD   rP   s      r   r.   z#_unwrap_batched.<locals>.<listcomp>   sJ        $NG 	 dOO^ZW	
 	
  r$   )
r   r;   r   r   rH   r<   r4   r   r3   r   )
r8   r[   rP   rX   rD   flat_batched_outputsr`   flat_out_dimsflat_outputsr_   s
    ````    @r   _unwrap_batchedre      s1    )5_(E(E%+
 
 
 
 
 
 
 /5<00 ! h$$ 	!%JMM%(( 	!S]]a-?-?$MM%JMM    1(KHH          (++?'O'O	  L ,444r$   c                 ~    t          | t                    rd S | d S t          dt          |           d| d          )NrF   r^   z): `out_dims` must be an int, None or a python collection of ints representing where in the outputs the vmapped dimension should appear.)r;   rH   r5   rI   )xrD   r[   s      r   _check_int_or_nonerh      s]    !S y
	,	$ 	, 	, 	, 	, 	,  r$   c                 ~    t          | t                    rd S t          t          t          ||           |            d S )N)rD   r[   )r;   rH   r   r   rh   )r[   rD   s     r   $_check_out_dims_is_int_or_int_pytreerj      s?    (C   g(thGGGRRRRRr$   c                     t          | d          r| j        S t          | t          j                  rdt          | j                   dS t          |           S )N__name__zfunctools.partial(z, ...))hasattrrl   r;   r!   r   rI   rD   repr)rD   s    r   rI   rI      s[    tZ   }$	)** A@Idi$8$8@@@@
 ::r$   c           	          t                       t          ||            t          |||           \  }}}	}
|$t          |	|||          }t	          | |||
||fi |S t          | |||	|
||fi |S r   )r   rj   rO   _get_chunked_inputs_chunked_vmap
_flat_vmap)rD   rC   r[   
randomness
chunk_sizer   r   rX   r%   r&   rM   chunks_flat_argss               r   	vmap_implrv     s    (48885Lt6 62Ji .|Z
 
 
 
 
 
 	
 	 	 	 	 	r$   c                 `    | |z  x}}|g|z  }| |z  }|dk    r|                     |           |S )Nr   )append)total_elemsrt   n_chunkschunk_sizes	remainders        r   get_chunk_sizesr}   &  sJ    %33Hx,)Kj(IA~~9%%%r$   c                     |f|1t          ||          }t          t          j        |                    t          fdt	          | |          D                       }t	          | }|S )Nc              3   v   K   | ]3\  }}||                     |          n|gt                    z  V  4d S N)rL   )tensor_splitr4   )r+   tr,   
split_idxss      r   r2   z&_get_chunked_inputs.<locals>.<genexpr>6  sr       
 
 Av ! NN:6N222  *oo	
 
 
 
 
 
r$   )r}   r<   	itertools
accumulater3   )r&   r%   rX   rt   r{   flat_args_chunksru   r   s          @r   rp   rp   0  s    J%j*==9/<<==
 
 
 
 
 Y55
 
 
 
 
 ,-r$   c                     g }d }| D ]-}t          |          \  }}|                    |           ||}.t          t          |           }||fS r   )r   rx   listr3   )chunks_output_flat_chunks_outputarg_specoutputflat_output	arg_specsflat_output_chunkss          r   _flatten_chunks_outputr   H  sq     H  ! !!-f!5!5Y!!+... H c#5677x''r$   c                     t          | |          }t          |          t          |          k    sJ g }t          |          D ]9\  }}|                    t	          j        ||         |                     d ||<   :|S r   )r   r4   rK   rx   r   cat)r[   r   r   rc   r   idxrY   s          r   _concat_chunked_outputsr   Y  s    -hAAM}%7!8!88888K!-00 ' 'W59%7%<'JJJKKK"&3r$   c                 T   g }|dk    rt          j                    nd }|D ]U}	t          ||	          }
|
dk    r|t          j        |           |                    t          | |
||	|||fi |           Vt          |          \  }}~t          |||          }t          ||          S )Nsamer   )	r   get_rng_stater7   set_rng_staterx   rr   r   r   r   )rD   r%   ru   rM   r[   rs   r   chunks_outputrsr&   rX   r   r   r   s                 r   rq   rq   g  s     M","6"6				DB% 
 
	1,	JJ
 ??>###	 	 	 		
 	
 	
 	
 $:-#H#H  	 *(H>PQQK +x000r$   c                 2    | dvrt          d|            d S )N)error	differentr   zLOnly allowed values for randomness are 'error', 'different', or 'same'. Got )RuntimeError)rs   s    r   _check_randomness_argr     s4    777g[egg
 
 	
 87r$   c              #   v   K   	 t          | |          }|V  t                       d S # t                       w xY wr   )r   r   )rX   rs   rP   s      r   vmap_increment_nestingr     sK      ",ZDD
!!!!!!!!!s   ( 8c                     t          ||          5 }t          ||||          }	 | |	i |}
t          |
||||           cd d d            S # 1 swxY w Y   d S r   )r   rT   re   )rD   rX   r%   r&   rM   r[   rs   r   rP   rS   r8   s              r   rr   rr     s     
 
J	7	7 X:/)Z
 
 $9&99*jRVWWX X X X X X X X X X X X X X X X X Xs   -AAAc                       fd}|S )Nc                      t                    5 }t          | |          } |i |}t          ||          cd d d            S # 1 swxY w Y   d S r   )r   wrap_batchedunwrap_batched)	r   r   rP   rS   r8   rX   rD   rC   rs   s	        r   innerzrestore_vmap.<locals>.inner  s    #J
;; 	?z)$DDN"dN=f==O!/:>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?s   )AAAr0   )rD   rC   rX   rs   r   s   ```` r   restore_vmapr     s5    ? ? ? ? ? ? ? ? Lr$   c                 v    t          |           \  }}t          ||          }|J t          ||||          }|S r   )r   r   rT   )r   bdimslevelr&   spec
flat_bdimsresults          r   r   r     sF    "4((OIt*5$77J!!!#J	5$GGFMr$   c                     t          |           \  }}t          |          dk    r| dfS fd|D             }t          | \  }}t          ||          t          ||          fS )Nr   r0   c                     g | ]E}t          |t          j                  r%t          j        j                            |          n|d fFS r   )r;   r   r   _C
_functorchre   )r+   r-   r   s     r   r.   z"unwrap_batched.<locals>.<listcomp>  s]         #u|,,EH//U;;;t	  r$   )r   r4   r3   r   )r   r   r&   r   r   r   r   s    `     r   r   r     s    "4((OIt
9~~Rx      F LMFE&$''t)D)DDDr$   )7
contextlibr!   r   r   typingr   r   r   r   r   r   torch._C._functorchr	   torch._functorch.predispatchr
   r   r   r   r   torch.utils._pytreer   r   r   r   r   rH   r<   	in_dims_t
out_dims_tr#   r   r7   r=   strrB   rO   rT   rZ   re   rh   rj   rI   rv   r}   rp   r   r   rq   r   contextmanagerr   rr   r   r   r   r0   r$   r   <module>r      s#                     1 1 1 1 1 1 1 1 1 1 1 1        0 0 0 0 0 0                           #u*	3c3h'(
  x}%26   $%fck0B(B"C     !9A"c'9J
   77#7+37
3S	49h./7 7 7 7|5s)5(,S	5?B5
5 5 5 5N N N.'565#556'5'5 '5 	'5
 '5 '5 '5 '5 '5T	 	 	S: SX SRV S S S S
H 
 
 
 
  D    0( ( ("
 
 
.1 .1 .1d
 
 
 " " "X X X>    E E E E Er$   