
    [Th'J                        S SK r S SKr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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 q*\RV                  " 5       r,Sq-S! r.S" r/S# r0S$ r1S% r2S& r3S' r4S( r5\ Rl                  S) 5       r7S* r8S+ r9S, r:S- r;g).    N)partial)AnyCallableOptionalUnion)Tensor)_add_batch_dim_remove_batch_dim_vmap_decrement_nesting_vmap_increment_nestingis_batchedtensor)_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     M/var/www/auris/envauris/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_sizer6   6   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tupler1   )r7   s    r   _num_outputsr<   H   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;   r1   r2   )r=   r>   r?   s      r   	_as_tuplerA   R   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 r9   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;   r2   	_get_nametyper1   r   r   	enumerater0   r   dimr6   )	rB   r   rC   r&   	args_specr%   ir5   r4   s	            r   _process_batched_inputsrN   \   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   )r0   r	   r   )r%   r&   rO   rL   r4   r5   batched_inputss          r   _create_batched_inputsrR      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      $ )NrE   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   r2   rI   r
   )namebatched_outputrO   
batch_sizeout_dims        r   _maybe_remove_batch_dimrX      s    nell338H9
 9
 vYtf -5 6   nell33D64& )!!%n!5 6 7@@
 	
 ^MMr$   out_dimsrV   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)NrE   , ..., out_dims=z`)(<inputs>): out_dims is not compatible with the structure of `outputs`. out_dims has structure r9   z but outputs has structure rF   )r2   rH   r   )rC   rY   output_specs   r   incompatible_error+_unwrap_batched.<locals>.incompatible_error   sJ    IdO$$4XJ ?&&28&<Q&?%@ A(M,
 	
r$   r9   )r   r:   r   r   rG   r;   r1   r   r0   rX   rH   r   )r7   rY   rO   rV   rC   flat_batched_outputsr^   flat_out_dimsrU   rW   flat_outputsr]   s    `  `      @r   _unwrap_batchedrc      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)NrE   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:   rG   r2   rH   )xrC   rY   s      r   _check_int_or_nonerf      sD    !Sy

	$  0
 ;+ 	, r$   c                 `    [        U [        5      (       a  g [        [        [        XS9U 5        g )N)rC   rY   )r:   rG   r   r   rf   )rY   rC   s     r   $_check_out_dims_is_int_or_int_pytreerh      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, ...))hasattrrj   r:   r!   r   rH   rC   repr)rC   s    r   rH   rH      sQ    tZ  }}$	))**#Idii$8#9@@
 :r$   Fc                    ^ [         (       a  g [           [         (       a
   S S S 5        g [        R                  R	                  SS5      S:X  a  OSq  S S S 5        g [
        R                  R                  SSS5      qSSK	J
m  U4S	 jn U " [
        R                  R                  R                  R                  5        U " [
        R                  R                  R                  R                  5        U " [
        R                  R                  R                   R                  5        U " [
        R                  R                  R"                  R                  5        U " [
        R                  R                  R$                  R                  5        U " [
        R                  R                  R&                  R                  5        U " [
        R                  R                  R(                  R                  5        U " [
        R                  R                  R*                  R                  5        Sq S S S 5        g ! , (       d  f       g = f)
NPYTORCH_JIT1TatenIMPLFuncTorchBatchedr   )decomposition_tablec                 `   > U T;   a  [         R                  U TU    5        g [        SU  35      e)Nz!could not find decomposition for )VMAP_DECOMPOSITIONS_LIBimplRuntimeError)decomprs   s    r   #_register_python_decomposition_vmapElazy_load_decompositions.<locals>._register_python_decomposition_vmap$  s5    ,,',,V5H5PQ"%Fvh#OPPr$   )DECOMPOSITIONS_LOADEDDECOMPOSITIONS_LOCKosenvirongetr   libraryLibraryru   torch._decomprs   opsrp   mse_loss_backwarddefaultsmooth_l1_loss_backwardhuber_loss_backwardnll_loss_forwardnll_loss2d_forwardnll_loss_backwardnll_loss2d_backwardaddr)ry   rs   s    @r   lazy_load_decompositionsr     sp   	   
	 

}c2c9i$(! 
	 #(--"7"7F.#
 	6	Q 	,EIINN,L,L,T,TU+IINN22::	
 	,EIINN,N,N,V,VW+EIINN,K,K,S,ST+EIINN,M,M,U,UV+EIINN,L,L,T,TU+EIINN,N,N,V,VW+EIINN,?,?,G,GH $I 
		s   H3(H3GH33
I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   rh   rN   _get_chunked_inputs_chunked_vmap
_flat_vmap)rC   rB   rY   
randomness
chunk_sizer   r   rV   r%   r&   rL   chunks_flat_argss               r   	vmap_implr   8  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_elemsr   n_chunkschunk_sizes	remainders        r   get_chunk_sizesr   Z  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)rK   )tensor_splitr1   )r+   tr4   
split_idxss      r   r.   &_get_chunked_inputs.<locals>.<genexpr>j  sP      
 6IA ! NN:6N2  *o 6s   14)r   r;   	itertools
accumulater0   )r&   r%   rV   r   r   flat_args_chunksr   r   s          @r   r   r   d  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   r   listr0   )chunks_output_flat_chunks_outputarg_specoutputflat_output	arg_specsflat_output_chunkss          r   _flatten_chunks_outputr   |  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   r1   rJ   r   r   cat)rY   r   r   ra   r   idxrW   s          r   _concat_chunked_outputsr     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_stater6   set_rng_stater   r   r   r   r   )rC   r%   r   rL   rY   r   r   chunks_outputrsr&   rV   r   r   r   s                 r   r   r     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 )rw   )r   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   )rV   r   rO   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   rR   rc   )rC   rV   r%   r&   rL   rY   r   r   rO   rQ   r7   s              r   r   r     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   rO   rQ   r7   rV   rC   rB   r   s	        r   innerrestore_vmap.<locals>.inner  s@    #J
;z)$DN"N=f=O!/> <;;s	    8
Ar*   )rC   rB   rV   r   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   rR   )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   r1   r:   r   r   _C
_functorchrc   r0   r   )r   r   r&   r   r5   r   r   r   s           r   r   r     s    "4(OI
9~Rx  C #u||,, HH//;t    LMF&')DDDs   AB)<
contextlibr!   r   r}   	threadingr   typingr   r   r   r   r   r   torch._C._functorchr	   r
   r   r   r   torch.utils._pytreer   r   r   r   r   rG   r;   	in_dims_t
out_dims_tr#   r   r6   r<   strrA   rN   rR   rX   rc   rf   rh   rH   r{   Lockr|   ru   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   r*   r$   r   <module>r      sE      	   1 1     #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 
  nn&  
)%XD0("
.1d
 " "X>Er$   