
    N jK                    l   S SK Jr  S SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	J
r
JrJr  S SKJrJr  S SKrS SKJr  S SKJr  S S	KJrJrJrJrJr  S S
KJrJrJrJrJr  \(       a  S SKJ r J!r!  \" S5      r"\" S5      r#\$\%\	S4   -  r&\$\%\$S4   -  S-  r'S&S jr(      S'S jr)S(S jr*        S)S jr+        S*S jr,          S+S jr-            S,S jr.            S-S jr/S.S jr0      S/S jr1S0S jr2                S1S jr3S2S jr4          S3S jr5    S4S jr6        S5S jr7                S6S jr8S7S  jr9\Rt                        S8S! j5       r;                  S9S" jr<          S:S# jr=        S;S$ jr>S<S% jr?g)=    )annotationsN)Callable)partial)AnycastNoReturnTYPE_CHECKING)	ParamSpecTypeVar)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)	GeneratorIterable_P_R.c                R   ^ ^ Sm[         R                  " T 5      SU U4S jj5       nU$ )Nzvtorch.func.{grad, vjp, jacrev, hessian} don't yet support saved tensor hooks. Please open an issue with your use case.c                    > [         R                  R                  R                  T5         T" U 0 UD6sS S S 5        $ ! , (       d  f       g = fN)torchautogradgraphdisable_saved_tensors_hooks)argskwargsfmessages     f/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/torch/_functorch/vmap.pyfn.doesnt_support_saved_tensors_hooks.<locals>.fn5   s5    ^^!!==gFd%f% GFFs	   =
A)r#   _P.argsr$   	_P.kwargsreturnr   )	functoolswraps)r%   r(   r&   s   ` @r'   "doesnt_support_saved_tensors_hooksr/   /   s1    	3 
 __Q& & I    c                  ^ [        X5       VVs/ s H  u  p#Uc  M
  UR                  U5      PM     snnm[        T5      S:X  a  [        S5      eT(       a)  [	        U4S jT 5       5      (       a  [        ST S35      eTS   $ s  snnf )Nr   z/vmap: Expected at least one Tensor to vmap overc              3  2   >#    U  H  oTS    :g  v   M     g7f)r   N ).0sizebatch_sizess     r'   	<genexpr>/_validate_and_get_batch_size.<locals>.<genexpr>H   s     Jkd;q>1ks   zTvmap: Expected all tensors to have the same size in the mapped dimension, got sizes z for the mapped dimension)zipr5   len
ValueErrorany)flat_in_dims	flat_argsin_dimargr6   s       @r'   _validate_and_get_batch_sizerA   >   s    
 |77KF 	7K
 ;1JKKsJkJJJ$$/=0IK
 	
 q>s
   	BBc                D    [        U [        5      (       a  [        U 5      $ g)N   )
isinstancetupler:   )batched_outputss    r'   _num_outputsrG   P   s    /5))?##r0   c                z    [        U [        5      (       d  U 4U-  $ [        U 5      U:w  a  [        U" 5       5      eU $ r   )rD   rE   r:   r;   )valuenum_elementserror_message_lambdas      r'   	_as_tuplerL   Z   s>    
 eU##x,&&
5z\!-/00Lr0   c                4   [        U [        5      (       d<  [        U [        5      (       d'  [        S[	        U5       SU  S[        U 5       S35      e[        U5      S:X  a  [        S[	        U5       S35      e[        U5      u  p4[        X5      nUc-  [        S[	        U5       SU  S[        U 5      S    S	U S3	5      e[        [        X55      5       GH1  u  nu  px[        U[        5      (       d!  Ub  [        S[	        U5       SU  S
U S35      e[        U[        5      (       a?  [        U[        5      (       d*  [        S[	        U5       SU  S
U S[        U5       S3	5      eUbx  XR                  5       * :  d  XR                  5       :  aQ  [        S[	        U5       SU  S
U SUR                  5        SUR                  5        SUR                  5        S35      eUc  GM  US:  d  GM  XR                  5       -  XV'   GM4     [        XS5      UUU4$ )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 rC   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 < )rD   intrE   r;   	_get_nametyper:   r   r   	enumerater9   r   dimrA   )	in_dimsr#   funcr>   	args_specr=   ir@   r?   s	            r'   _process_batched_inputsrY   f   sZ    gs##Jw,F,FIdO$Jwi 866:7m_AG
 	

 4yA~IdO$ %) *
 	
 (-I,W@LIdO$Jwi 8%%1'%:1%=$> ?&Kq*
 	
 &c)&BC=C&#&&6+=	$(
7) <$X &01 
 fc"":c6+B+B	$(
7) <$X%L9+ ;<  6WWYJ#6&GGI:M	$(
7) <$X &%%(WWYK 0GGI;mCGGI;a9  &1*$wwy0LO- D2 	%\=	 r0   c           	         [        X5       VVs/ s H  u  pEUc  UO[        XTU5      PM     nnn[        Xc5      $ s  snnf r   )r9   r   r   )r=   r>   
vmap_levelrW   r?   r@   batched_inputss          r'   _create_batched_inputsr]      sM     |77KF ~>#z#JJ7   .44	s   :c           
         UcC  [        U[        R                  5      (       a"  [        U5      (       a  [	        SU  SU  S35      eU$ [        U[        R                  5      (       d  [	        SU  SU  S[        U5       S35      e[        XX45      $ )NrN   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?)rD   r   r   r   r;   rR   r   )namebatched_outputr[   
batch_sizeout_dims        r'   _maybe_remove_batch_dimrc      s     nell338H9
 9
 vYtf -5 6   nell33D64& )!!%n!5 6 7@@
 	
 ^MMr0   c                  ^^^ [        U 5      u  nmSUUU4S jjn/ n[        U [        R                  5      (       aX  [        T[        5      (       a  T/nOX[        T[
        5      (       a  [        T5      S:X  a  [        T5      nO(Tc  T/nO!U" 5         O[        TT5      nUc  U" 5         OUn[        XW5       V	V
s/ s H  u  p[        [        T5      XX:5      PM     nn	n
[        UT5      $ s  sn
n	f )Nc                 ^   > [        S[        T 5       ST S[        T5      S    ST S3	5      e)NrN   , ..., out_dims=z`)(<inputs>): out_dims is not compatible with the structure of `outputs`. out_dims has structure rC   z but outputs has structure rO   )r;   rQ   r   )rV   out_dimsoutput_specs   r'   incompatible_error+_unwrap_batched.<locals>.incompatible_error   sJ    IdO$$4XJ ?&&28&<Q&?%@ A(M,
 	
r0   rC   )r,   r   )r   rD   r   r   rP   rE   r:   listr   r9   rc   rQ   r   )rF   rg   r[   ra   rV   flat_batched_outputsri   flat_out_dimsbroadcast_resultr`   rb   flat_outputsrh   s    `  `       @r'   _unwrap_batchedrp      s     )5_(E%+
 
 ')M/5<<00 h$$%JM%((S]a-? NM%JM 4X{K# ,M (++?'O	 (P#N 	 dO^	
 (P	   ,44s   <"C-c                l    [        U [        5      (       a  g U c  g [        S[        U5       SU S35      e)NrN   rf   z): `out_dims` must be an int, None or a python collection of ints representing where in the outputs the vmapped dimension should appear.)rD   rP   r;   rQ   )xrV   rg   s      r'   _check_int_or_noners      sD    !Sy

	$  0
 ;+ 	, r0   c                `    [        U [        5      (       a  g [        [        [        XS9U 5        g )N)rV   rg   )rD   rP   r   r   rs   )rg   rV   s     r'   $_check_out_dims_is_int_or_int_pytreeru   	  s&     (C  g(tGRr0   c                    [        U S5      (       a  U R                  $ [        U [        R                  5      (       a  S[        U R                  5       S3$ [        U 5      $ )N__name__zfunctools.partial(z, ...))hasattrrw   rD   r-   r   rQ   rV   repr)rV   s    r'   rQ   rQ     sQ    tZ  }}$	))**#Idii$8#9@@
 :r0   c           	         [        5         [        X 5        [        XU 5      u  pxpUb  [        XXt5      n[	        U UUU
UU40 UD6$ [        U UUU	U
UU40 UD6$ r   )r   ru   rY   _get_chunked_inputs_chunked_vmap
_flat_vmap)rV   rU   rg   
randomness
chunk_sizer#   r$   ra   r=   r>   rW   chunks_flat_argss               r'   	vmap_implr     s     (85Lt62Ji .Z
 
 
 	
 	 	 	r0   c                P    X-  nU/U-  nX-  nUS:w  a  UR                  U5        U$ )Nr   )append)total_elemsr   n_chunkschunk_sizes	remainders        r'   get_chunk_sizesr   H  s9    (H,)K(IA~9%r0   c                   ^ U4mUb*  [        X#5      n[        [        R                  " U5      5      m[        U4S j[	        X5       5       5      n[	        U6 nU$ )Nc              3  l   >#    U  H)  u  pUb  UR                  TUS9OU/[        T5      -  v   M+     g 7f)NrT   )tensor_splitr:   )r4   tr?   
split_idxss      r'   r7   &_get_chunked_inputs.<locals>.<genexpr>]  sP      
 6IA ! NN:6N2  *o 6s   14)r   rE   	itertools
accumulater9   )r>   r=   ra   r   r   flat_args_chunksr   r   s          @r'   r{   r{   R  sd     J%j=9//<=
 
 Y5
 
 ,-r0   c                    / nS nU  H(  n[        U5      u  pEUR                  U5        Ub  M&  UnM*     [        [        U6 5      nUc  [	        S5      eXb4$ )Nzarg_spec must not be None)r   r   rk   r9   AssertionError)chunks_output_flat_chunks_outputarg_specoutputflat_output	arg_specsflat_output_chunkss          r'   _flatten_chunks_outputr   o  sm    
 +- $H !-f!5!!+. H	 ! c#567899''r0   c                T   [        X5      nUc  [        S5      e[        U5      [        U5      :w  a#  [        S[        U5       S[        U5       35      e/ n[        U5       HB  u  pVX%   nUc  [        SU S35      eUR	                  [
        R                  " XvS95        S X%'   MD     U$ )Nzflat_out_dims must not be Nonezlen(flat_out_dims)=z != len(flat_output_chunks)=zchunk at index z must not be Noner   )r   r   r:   rS   r   r   cat)rg   r   r   rm   r   idxrb   chunks           r'   _concat_chunked_outputsr     s     .hAM=>>
=S!344!#m"4!55QRUVhRiQjk
 	
 !#K!-0"'= ?3%7H!IJJ599U89"& 1 r0   c                   / nUS:X  a  [         R                  " 5       OS nU H[  n	[        U	5      n
[        X5      nUS:X  a  M!  Ub  [         R                  " U5        UR                  [        U UUU
UUU40 UD65        M]     [        U5      u  pA[        XM[        [        [        [        S4   S -     U5      5      n[        X5      $ )Nsamer   .)r   get_rng_staterk   rA   set_rng_stater   r}   r   r   r   rE   r   r   )rV   r=   r   rW   rg   r~   r$   chunks_outputrsflat_args_tupler>   ra   r   r   r   s                  r'   r|   r|     s      "M","6			DB+)	1,J
 ?>#	 		
' ,@ $:-#H  	
 *DeCHo&<!=?QRK
 +00r0   c                ,    U S;  a  [        SU  35      eg )N)error	differentr   zLOnly allowed values for randomness are 'error', 'different', or 'same'. Got )RuntimeError)r~   s    r'   _check_randomness_argr     s)    77Z[eZfg
 	
 8r0   c              #  ^   #     [        X5      nUv   [        5         g ! [        5         f = f7fr   )r   r   )ra   r~   r[   s      r'   vmap_increment_nestingr     s'     ",ZD
!!s   - -*-c                    [        X5       n[        X#X5      n	U " U	0 UD6n
[        XXU 5      sS S S 5        $ ! , (       d  f       g = fr   )r   r]   rp   )rV   ra   r=   r>   rW   rg   r~   r$   r[   r\   rF   s              r'   r}   r}     sG     
 
	7:/Z
 9&9*RVW 
8	7	7s	   !7
Ac                $   ^ ^^^ SUU UU4S jjnU$ )Nc                    > [        TT5       n[        U TU5      nT" U0 UD6n[        XB5      sS S S 5        $ ! , (       d  f       g = fr   )r   wrap_batchedunwrap_batched)	r#   r$   r[   r\   rF   ra   rV   rU   r~   s	        r'   innerrestore_vmap.<locals>.inner  s@    #J
;z)$DN"N=f=O!/> <;;s	    8
A)r#   r   r$   r   r,   tuple[Any, Any]r3   )rV   rU   ra   r~   r   s   ```` r'   restore_vmapr     s    ? ? Lr0   c                j    [        U 5      u  p4[        X5      nUc  [        S5      e[        XSX$5      nU$ )Nzflat_bdims must not be None)r   r   r   r]   )r#   bdimslevelr>   spec
flat_bdimsresults          r'   r   r     s=     #4(OI*57J:;;#J5GFMr0   c                D   [        U 5      u  p#[        U5      S:X  a  U S4$ U Vs/ s HO  n[        U[        R                  5      (       a)  [        R
                  R                  R                  XA5      OUS 4PMQ     nn[        U6 u  pg[        Xc5      [        Xs5      4$ s  snf )Nr   r3   )
r   r:   rD   r   r   _C
_functorchrp   r9   r   )r#   r   r>   r   r@   r   r   r   s           r'   r   r   *  s    "4(OI
9~Rx  C #u||,, HH//;t    LMF&')DDDs   AB)r%   Callable[_P, _R]r,   r   )r=   list[int | None]r>   	list[Any]r,   rP   )rF   Tensor | tuple[Tensor, ...]r,   rP   )rI   ztuple[_R, ...] | _RrJ   rP   rK   zCallable[[], str]r,   ztuple[_R, ...])rU   	in_dims_tr#   tuple[Any, ...]rV   Callable[..., Any]r,   z1tuple[int, list[int | None], list[Any], TreeSpec])
r=   r   r>   r   r[   rP   rW   r   r,   r   )r_   strr`   r   r[   rP   ra   rP   rb   
int | Noner,   ztorch.Tensor)rF   r   rg   
out_dims_tr[   rP   ra   rP   rV   r   r,   r   )rr   r   rV   r   rg   r   r,   None)rg   r   rV   r   r,   r   )rV   r   r,   r   )rV   )Callable[_P, Tensor | tuple[Tensor, ...]]rU   r   rg   r   r~   r   r   r   r#   r*   r$   r+   r,   r   )r   rP   r   rP   r,   z	list[int])
r>   r   r=   r   ra   rP   r   r   r,   Iterable[tuple[Any, ...]])r   r   r,   z&tuple[list[tuple[Any, ...]], TreeSpec])rg   r   r   r   r   zlist[tuple[Any, ...] | None]r,   zlist[Tensor])rV   r   r=   r   r   r   rW   r   rg   r   r~   r   r$   r   r,   r   )r~   r   r,   r   )ra   rP   r~   r   r,   zGenerator[int, None, None])rV   z*Callable[..., Tensor | tuple[Tensor, ...]]ra   rP   r=   r   r>   r   rW   r   rg   r   r~   r   r$   r   r,   r   )
rV   zCallable[..., _R]rU   r   ra   rP   r~   r   r,   zCallable[..., tuple[Any, Any]])r#   r   r   r   r   rP   r,   r   )r#   r   r   rP   r,   r   )@
__future__r   
contextlibr-   r   collections.abcr   r   typingr   r   r   r	   typing_extensionsr
   r   r   r   torch._C._functorchr   torch._functorch.predispatchr   r   r   r   r   torch.utils._pytreer   r   r   r   r   r   r   r   r   rP   rE   r   r   r/   rA   rG   rL   rY   r]   rc   rp   rs   ru   rQ   r   r   r{   r   r   r|   r   contextmanagerr   r}   r   r   r   r3   r0   r'   <module>r      s   #    $  5 5 0   0   3 t_T]%S/!	5c?"T)
"/8$			 ,	 		77-75G767~5"55 5 	5
 5N
NN N 	N
 N N:*50*5*5 *5 	*5
 *5 *5Z	SS 2S	S
'
3'' ' 	'
 ' ' ' 	'T"  	
 :((+(* 5 	491
391"91 091 	91
 91 91 91 	91z
 ""!$"" "X
4XX #X 	X
 X X X X 	XL	
	&/	=@	NQ	#	
"+47Er0   