
    9iB                     V   S SK r S SKrS SKrS SKJr  S SKJrJr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  \\\4   r\\\\S4   4   rS	 rS
\\\      S\S\4S jrS\\
\\
S4   4   S\4S jr S\S\S\/ \!4   S\4S jr"S\S\S\S\\\\   \\   \4   4S jr#S
\\   S\\   S\S\4S jr$S r%S\\
\\
S4   4   S\S\S\S\S\4S jr&S r'S\S\SS4S jr(S\4S  jr)S! r*S" r+S# r,S$ r-S% r.S& r/S' r0\ Rb                  S( 5       r2S) r3S* r4S+ r5S, r6g)-    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   ^ ^ Sm[         R                  " T 5      U U4S 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     U/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/torch/_functorch/vmap.pyfn.doesnt_support_saved_tensors_hooks.<locals>.fn,   s5    ^^!!==gFd%f% GFFs	   =
A)	functoolswraps)r   r    r   s   ` @r   "doesnt_support_saved_tensors_hooksr$   &   s1    	3 
 __Q& & I    flat_in_dims	flat_argsreturnc                   ^ [        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>?   s     Jkd;q>1ks   zTvmap: Expected all tensors to have the same size in the mapped dimension, got sizes z for the mapped dimension)zipr-   len
ValueErrorany)r&   r'   in_dimargr.   s       @r   _validate_and_get_batch_sizer7   5   s    
 |77KF 	7K
 ;1JKKsJkJJJ$$/=0IK
 	
 q>s
   	BBbatched_outputsc                 D    [        U [        5      (       a  [        U 5      $ g)N   )
isinstancetupler2   )r8   s    r   _num_outputsr=   G   s    /5))?##r%   valuenum_elementserror_message_lambdac                 z    [        U [        5      (       d  U 4U-  $ [        U 5      U:w  a  [        U" 5       5      eU $ r   )r;   r<   r2   r3   )r>   r?   r@   s      r   	_as_tuplerB   Q   s>     eU##x,&&
5z\!-/00Lr%   in_dimsr   funcc                 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 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<   r3   	_get_nametyper2   r   r   	enumerater1   r   dimr7   )	rC   r   rD   r'   	args_specr&   ir6   r5   s	            r   _process_batched_inputsrO   [   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 	%\=	 r%   
vmap_levelc           	          [        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   )r1   r
   r   )r&   r'   rP   rM   r5   r6   batched_inputss          r   _create_batched_inputsrS      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      $ )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	   r3   rJ   r   )namebatched_outputrP   
batch_sizeout_dims        r   _maybe_remove_batch_dimrY      s    nell338H9
 9
 vYtf -5 6   nell33D64& )!!%n!5 6 7@@
 	
 ^MMr%   out_dimsrW   c                   ^^^ [        U 5      u  nmUUU4S jn[        U [        R                  5      (       aO  [        T[        5      (       a  T/nOL[        T[
        5      (       a  [        T5      S:X  a  TnO%Tc  T/nOU" 5         O[        TT5      nUc  U" 5         [        UW5       VV	s/ s H  u  p[        [        T5      XX95      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)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   )r3   rI   r   )rD   rZ   output_specs   r   incompatible_error+_unwrap_batched.<locals>.incompatible_error   sJ    IdO$$4XJ ?&&28&<Q&?%@ A(M,
 	
r%   r:   )r   r;   r   r   rH   r<   r2   r   r1   rY   rI   r   )r8   rZ   rP   rW   rD   flat_batched_outputsr_   flat_out_dimsrV   rX   flat_outputsr^   s    `  `      @r   _unwrap_batchedrd      s     )5_(E%+
 /5<<00 h$$%JM%((S]a-?$M%JM 1(KH   (++?'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)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   r3   rI   )xrD   rZ   s      r   _check_int_or_nonerg      sD    !Sy

	$  0
 ;+ 	, r%   c                 `    [        U [        5      (       a  g [        [        [        XS9U 5        g )N)rD   rZ   )r;   rH   r   r   rg   )rZ   rD   s     r   $_check_out_dims_is_int_or_int_pytreeri      s$    (C  g(tGRr%   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, ...))hasattrrk   r;   r"   r   rI   rD   repr)rD   s    r   rI   rI      sQ    tZ  }}$	))**#Idii$8#9@@
 :r%   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   ri   rO   _get_chunked_inputs_chunked_vmap
_flat_vmap)rD   rC   rZ   
randomness
chunk_sizer   r   rW   r&   r'   rM   chunks_flat_argss               r   	vmap_implru     s    (85Lt62Ji .Z
 
 
 	
 	 	 	r%   c                 P    X-  nU/U-  nX-  nUS:w  a  UR                  U5        U$ )Nr   )append)total_elemsrs   n_chunkschunk_sizes	remainders        r   get_chunk_sizesr|   &  s9    %3x,)K(IA~9%r%   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)rL   )tensor_splitr2   )r,   tr5   
split_idxss      r   r/   &_get_chunked_inputs.<locals>.<genexpr>6  sP      
 6IA ! NN:6N2  *o 6s   14)r|   r<   	itertools
accumulater1   )r'   r&   rW   rs   rz   flat_args_chunksrt   r   s          @r   ro   ro   0  sb    J%j=9//<=
 
 Y5
 
 ,-r%   c                     / nS nU  H(  n[        U5      u  pEUR                  U5        Ub  M&  UnM*     [        [        U6 5      nXb4$ r   )r   rw   listr1   )chunks_output_flat_chunks_outputarg_specoutputflat_output	arg_specsflat_output_chunkss          r   _flatten_chunks_outputr   H  s[     H !-f!5!!+. H	 ! c#567''r%   c                     [        X5      n[        U5      [        U5      :X  d   e/ n[        U5       H/  u  pVUR                  [        R
                  " X%   US95        S X%'   M1     U$ r   )r   r2   rK   rw   r   cat)rZ   r   r   rb   r   idxrX   s          r   _concat_chunked_outputsr   Y  si    -hAM}%7!8888K!-0599%7%<'JK"& 1
 r%   c                 6   / nUS:X  a  [         R                  " 5       OS nU HP  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        MR     [        U5      u  pA[        XLU5      n[        X5      $ )Nsamer   )	r   get_rng_stater7   set_rng_staterw   rq   r   r   r   )rD   r&   rt   rM   rZ   rr   r   chunks_outputrsr'   rW   r   r   r   s                 r   rp   rp   g  s     M","6			DB%	1,J
 ?>#	 		
% &> $:-#H  	 *(>PQK +00r%   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)rr   s    r   _check_randomness_argr     s)    77Z[eZfg
 	
 8r%   c              #   ^   #     [        X5      nUv   [        5         g ! [        5         f = f7fr   )r   r   )rW   rr   rP   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   rS   rd   )rD   rW   r&   r'   rM   rZ   rr   r   rP   rR   r8   s              r   rq   rq     sG     
 
	7:/Z
 9&9*RVW 
8	7	7s	   !7
Ac                     ^ ^^^ UU UU4S 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   rP   rR   r8   rW   rD   rC   rr   s	        r   innerrestore_vmap.<locals>.inner  s@    #J
;z)$DN"N=f=O!/> <;;s	    8
Ar+   )rD   rC   rW   rr   r   s   ```` r   restore_vmapr     s    ? ? Lr%   c                 X    [        U 5      u  p4[        X5      nUc   e[        XSX$5      nU$ r   )r   r   rS   )r   bdimslevelr'   spec
flat_bdimsresults          r   r   r     s5    "4(OI*57J!!!#J5GFMr%   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   r+   )
r   r2   r;   r   r   _C
_functorchrd   r1   r   )r   r   r'   r   r6   r   r   r   s           r   r   r     s    "4(OI
9~Rx  C #u||,, HH//;t    LMF&')DDDs   AB)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   rS   rY   rd   rg   ri   rI   ru   r|   ro   r   r   rp   r   contextmanagerr   rq   r   r   r   r+   r%   r   <module>r      s!       1 1   0   #u*	3c3h'(
x}%26$%fck0B(B"C  !9A"c'9J
77#7+37
3S	49h./7|5s)5(,S	5?B5
5N.'565#556'5'5 '5 	'5
 '5 '5T	S: SX SRV S
H 
D0("
.1d
 " "X>Er%   