
    shAp                        S SK Jr  S SKrS SKJs  Jr  S SKJrJ	r	J
r
J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  S SKJr   " S	 S
\5      r\" 5       r\R9                  \R:                  5      \R9                  \R<                  5      S 5       5       rS r Sr!\!4S jr" " S S\5      r#S r$S r%\R9                  \RL                  5      S 5       r'S r(S r)S r*\R9                  \RV                  5      S 5       r,S r-S r. " S S5      r/ " S S\/5      r0 " S S\/5      r1 S%S  jr2 S%S! jr3S" r4 " S# S$\5      r5\5" 5       r6g)&    )
NamedTupleN)_unwrap_for_grad_wrap_for_gradcurrent_levelTransformType)vmap)%enable_single_level_autograd_function)_add_batch_dim_broadcast_to_and_flattenrestore_vmapunwrap_batchedwrap_batched)HigherOrderOperator)_set_fwd_grad_enabledc                   8   ^  \ rS rSrSU 4S jjrU 4S jrSrU =r$ )!CustomFunctionHigherOrderOperator    c                 $   > [         TU ]  S5        g )Ncustom_function_callsuper__init__self	__class__s    v/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/_functorch/autograd_function.pyr   *CustomFunctionHigherOrderOperator.__init__!   s    /0    c                    > [         R                  R                  5       (       a  [        TU ]  " U/UQ70 UD6$ UR
                  " U0 UD6$ N)torch_C _are_functorch_transforms_activer   __call__apply)r   autograd_functionargskwargsr   s       r   r$   *CustomFunctionHigherOrderOperator.__call__$   sI     8844667#$5GGGG &&777r    returnN__name__
__module____qualname____firstlineno__r   r$   __static_attributes____classcell__r   s   @r   r   r       s    18 8r   r   c                     [        X5      n[        5          UR                  " U6 nS S S 5        U$ ! , (       d  f       W$ = fr    )generate_single_level_functionr	   r%   )interpreterr&   operands	Generatedflat_outs        r   custom_function_call_gradr;   X   s:     /{NI	.	0??H- 
1O 
1	0Os   0
?c           
      0  ^ ^^ T R                  5       mUU U4S jnU4S jnU4S jnU4S jnTR                   S3n[        U[        R                  R
                  R                  4[        U5      [        U5      [        U5      [        U5      S.5      nU$ )Nc                    > [         R                  " [        R                  U4S jU 5      n[        R                  " 5          [        S5         TR                  5          [        T/UQ76 nS S S 5        S S S 5        S S S 5        U4S jn[        WXU5      $ ! , (       d  f       N1= f! , (       d  f       N:= f! , (       d  f       NC= f)Nc                    > [        U T5      $ r    )r   )xlevels    r   <lambda>Agenerate_single_level_function.<locals>.forward.<locals>.<lambda>f   s    $4Q$>r   Tc                    > [        U T5      $ r    )r   )outputr@   s    r   wrap_fn@generate_single_level_function.<locals>.forward.<locals>.wrap_fnq   s    !&%00r   )	pytreetree_map_onlyr!   Tensorenable_gradr   lowerr   !wrap_outputs_maintaining_identity)r8   unwrapped_operandsunwrapped_outputrE   r&   r7   r@   s       r   forward/generate_single_level_function.<locals>.forwardd   s    #11LL>
  "7"={?P?P?R3! $6  @S"= 	1 10G
 	
 @S?R"="=  s<   B8B'B+B'3B8
B$ B''
B5	1B88
Cc                 (   > TR                  XU5      $ r    )setup_context)ctxinputsrD   r&   s      r   rR   5generate_single_level_function.<locals>.setup_contextx   s     ..sFCCr   c                 .   > TR                   " U /UQ76 nU$ r    )backward)rS   gradsresultr&   s      r   rW   0generate_single_level_function.<locals>.backward|   s    "++C8%8r   c                 .   > TR                   " U /UQ76 nU$ r    )jvp)rS   tangentsrY   r&   s      r   r\   +generate_single_level_function.<locals>.jvp   s    "&&s6X6r   r9   )rO   rW   r\   rR   )r@   r.   typer!   autogradfunction_SingleLevelFunctionstaticmethod)	r7   r&   rO   rR   rW   r\   namer9   r@   s	   ``      @r   r6   r6   a   s    E
(D
  (()3D		 	 	5	57#G,$X.$)-8		
	I r   znot specifiedc           	          [         R                  " U6 n[         R                  " U6 n[        XV5       VVs0 s H  u  px[        U5      U_M     n	nn[         R                  " U 5      u  p/ nU[
        :g  nU(       a:  [        XK5      nUc,  [        SU S[         R                  " U5      S    SU S35      e[        U
5       H  u  nn[        U[        R                  5      (       d  UR                  U5        M8  [        U5      U	;   a  UR                  U	[        U5         5        Mf  U(       a  UR                  U" UWU   5      5        M  UR                  U" U5      5        M     [         R                  " X5      $ s  snnf )NzoThe autograd.Function's vmap staticmethod returned an incompatible (output, out_dims) tuple. Expected out_dims=zI to be compatible with the structure of `output`. out_dims has structure    z but output has structure zV. For more details, please see https://pytorch.org/docs/main/notes/extending.func.html)rG   arg_tree_leaveszipidtree_flattenNO_OUT_DIMSr   RuntimeError	enumerate
isinstancer!   rI   appendtree_unflatten)outputsunwrapped_inputsorig_inputsrE   out_dimsflat_unwrapped_inputsflat_orig_inputs	unwrappedorigunwrapped_input_to_orig_inputflat_outputsspecrY   out_dims_specifiedflat_out_dimsirD   s                    r   rL   rL      s|    #224DE--{;  ##8K%KOI 	9tK " %
  ,,W5LF![01(A  %%-J /**0*=*=h*G*J)K L,,06 2JK	 	 |,	6&%,,//MM&!f:66MM76
CDMM'&-*:;<MM'&/* -   ..M%s   E:c                   *    \ rS rSr% \\S'   \\S'   Srg)VmapInfo   
batch_size
randomnessr*   N)r.   r/   r0   r1   int__annotations__strr2   r*   r   r   r   r      s    OOr   r   c                 b    U R                   [        R                  R                  R                   L$ r    )r   r!   r`   Function)r&   s    r   has_overriden_vmap_ruler     s#    !!)@)@)E)EEEr   c                     Sn[        U [        5      (       d  [        US[        U 5       S3-   5      e[	        U 5      S:X  d  [        US[	        U 5       S3-   5      eg )Nz}Expected the vmap staticmethod to have two returns, an output and out_dims with pytree structure compatible with the output. zGot a z instead   zGot z returns instead)rn   tuplerl   r_   len)rY   base_error_msgs     r   +validate_vmap_returns_tuple_of_two_elementsr   	  sh    	J  fe$$>fT&\N(,KKLLv;!>d3v;-?O,PPQQ r   c                    [        S [        R                  R                  R	                  U5      S    5       5      (       a  [        SU 35      eUR                  (       a5  [        U5      (       a  [        SUR                   S35      e[        X/UQ76 $ [        U5      (       d  [        SUR                   S35      e[        XR                  U/UQ70 UD6$ )Nc              3   V   #    U  H  n[        U[        R                  5      v   M!     g 7fr    )rn   r!   rI   ).0vals     r   	<genexpr>,custom_function_call_vmap.<locals>.<genexpr>  s%      >C 	3%%>s   ')r   z|Run vmap on autograd.Function with kwarg-only Tensor args. Please do not pass kwarg-only Tensors to autograd.Function. Got: zYou tried to vmap over a  , but it has both generate_vmap_rule=True and an overriden vmap staticmethod. Please set generate_vmap_rule=False or delete the overriden vmap staticmethod to avoid ambiguity. For more details, please see https://pytorch.org/docs/main/notes/extending.func.htmlz, but it does not have vmap support. Please override and implement the vmap staticmethod or set generate_vmap_rule=True. For more details, please see https://pytorch.org/docs/main/notes/extending.func.html)anyr!   utils_pytreerj   NotImplementedErrorgenerate_vmap_ruler   rl   r.   'custom_function_call_vmap_generate_rule custom_function_call_vmap_helperr   )r7   r&   r8   r(   s       r   custom_function_call_vmapr     s   
 ;;&&33F;A>   "8
 	
 ++"#455 )*;*D*D)E FJ K  7
-5
 	
 ##455 %&7&@&@%A BF G
 	
 ,++->AIMS r   c                 Z  ^ ^^ T R                  5       m[        T R                  5       T R                  5       S9n[	        U[
        R                  R                  R                  5      mUU 4S jn[        UT5      u  px[        R                  " S U5      (       a5  U" 5          T(       a  [        U/UQ76 sS S S 5        $ U" U0 UD6sS S S 5        $ U" 5          U" XX/UQ70 UD6n	S S S 5        [        W	5        U	u  pU4S jn[        XX<US9$ ! , (       d  f       NJ= f! , (       d  f       N?= f)N)r   r   c                     > T (       a  TR                  5       $ [        R                  R                  [        R                  R	                  [        R                  R
                  R                  5      5      $ r    )rK   r!   r"   _ExcludeDispatchKeyGuardDispatchKeySetDispatchKeyFuncTorchBatched)autograd_function_caser7   s   r   lower_to_next7custom_function_call_vmap_helper.<locals>.lower_to_nextL  sN    !$$&&8844''(<(<(M(MN r   c                 
    U S L $ r    r*   )dims    r   rA   2custom_function_call_vmap_helper.<locals>.<lambda>X  s    3$;r   c                 &   > Uc  U $ [        XT5      $ r    )r
   )rD   out_dimr   s     r   rE   1custom_function_call_vmap_helper.<locals>.wrap_fne  s%      	
  ?	
r   )rt   )r@   r   r   r   rn   r!   r`   ra   FunctionMetar   rG   tree_allr   r   rL   )r7   vmap_functionopr8   r(   infor   rM   in_dimsrY   rN   rt   rE   r   r   s   `            @@r   r   r   @  s     %%'M))+))+D (ENN,C,C,P,PQ #1="I .88_%+B:: _ 8.v.	 _ 
tL/ALVL 
/7!'
 -h( ' _ 
s   !D>DD
D
D*c                 V    U S   n[        U[        5      (       a  U S S n X4$ U S   n X4$ )Nr   )rn   r   )rq   rt   s     r   unpack_outputsr   q  sB    r{H(E""#2,  !*r   c                 r   [        X R                  5       5      u  p4[        XU R                  5       U R	                  5       5      nU R                  5          [        U/UQ76 nS S S 5        [        W[        5      (       d   e[        U5      u  pg[        XgU R                  5       5      $ ! , (       d  f       NL= fr    )r   r@   vmapify_autograd_functionr   r   rK   r   rn   r   r   r   )r7   r&   r8   rM   r   vmapped_functionrq   rt   s           r   r   r   z  s    "0;L;L;N"O0K$:$:$<k>T>T>V 
			&'7M:LM 
 gu%%%%&w/G;+<+<+>?? 
	s   B((
B6c                     [        S5      e)Nz0NYI: Functionalize rule for custom_function_call)rl   )r7   r&   r   r8   s       r   "custom_function_call_functionalizer     s     I
JJr   c           
        ^ ^^^^	 U UUU4S jnU	U UUU4S jnU	U UUU4S jnU	U UUU4S jnST R                    3n[        U[        R                  R                  4[        U5      [        U5      [        U5      [        U5      SS.5      m	T	$ )Nc                     > [        TR                  TTT5      " U 6 u  p[        U[        R                  5      (       a  X4$ / UQUP7$ r    )r   rO   rn   r!   rI   )r8   rq   rt   r&   r   r   r   s      r   rO   *vmapify_autograd_function.<locals>.forward  sS    (%%w
J
 gu||,,$$%G%X%%r   c                    >^ ^ [        U5      u  p#[        T5      mUU U4S jn[        UT	U4TT
5      " X5        [        T S5      (       d  0 T l        T R                  R                  TU05        g )Nc                 ^  > [        T[        5       5      nTR                  X U5        [        S U  5       5      n[	        TS5      (       d  0 Tl        TR
                  R                  TU05        [	        TS5      (       d  0 Tl        TR                  R                  TUR                  05        g )Nc              3   |   #    U  H2  n[        U[        R                  5      (       a  UR                  OS v   M4     g 7fr    )rn   r!   rI   shape)r   inps     r   r   Rvmapify_autograd_function.<locals>.setup_context.<locals>.inner.<locals>.<genexpr>  s-      !PVZU\\::		DPVs   :<_pt_input_shapes_pt_saved_tensors_bdims_stack)	CtxCustomSaver   rR   r   hasattrr   updater   _pt_saved_tensors_bdims)rT   rq   wrapped_ctxinput_shapesr&   rS   keys       r   inner?vmapify_autograd_function.<locals>.setup_context.<locals>.inner  s    
 (]_=K++KI ! !PV! L 3 233')$  ''l(;<3 ?@@461--44{::<r   _pt_out_dims)r   ri   r   r   r   r   )rS   rT   rq   rt   r   r   r9   r&   r   r   r   s   `    @r   rR   0vmapify_autograd_function.<locals>.setup_context  sr    *73m	4 	h		

 	 sN++!Ch0r   c                 *  >^  [        T5      nU	U 4S jn[        TU5      n[        UT R                  U   U4T
T5      " T R                  U5      u  pV[        XVT R                  U   T
5      n[        U[        R                  5      (       a  US 4$ / UQS P7$ )Nc                 B   > [        TU 5      nTR                  " U/UQ76 $ r    )CtxWithSavedTensorsr\   )saved_tensorsr]   r   r&   rS   s      r   jvp_no_context>vmapify_autograd_function.<locals>.jvp.<locals>.jvp_no_context  s%    -c=AK$((@x@@r   )
ri   get_tangents_in_dimsr   r   r   	reductifyr   rn   r!   rI   )rS   r]   r   r   tangent_in_dimsout_tangentsout_tangents_dimsrY   r9   r&   r   r   r   s   `       r   r\   &vmapify_autograd_function.<locals>.jvp  s    m	A /wA*6..s3_E	+

 

X+'' S-=-=c-BJ
 fell++4< F=D= r   c                 V  >^  [        T	5      nUS S nT R                  U   n[        U[        5      (       d  U4n[        S [	        X45       5       5      nU
U 4S jn[        UT R                  U   U44TT5      " T R                  U45      u  pg[        XgTTT R                  U   5      nU$ )Nr   c              3   4   #    U  H  u  pUb  UOS v   M     g 7fr    r*   )r   grad_outputin_dims      r   r   >vmapify_autograd_function.<locals>.backward.<locals>.<genexpr>  s$      %
'O# "-F47'Os   c                 J   > U u  p[        TU5      nTR                  " U/UQ76 $ r    )r   rW   )rT   r   grad_outputsr   r&   rS   s       r   backward_no_contextHvmapify_autograd_function.<locals>.backward.<locals>.backward_no_context  s-    *0'M-c=AK$--kILIIr   )
ri   r   rn   r   rh   r   r   r   r   r   )rS   r   r   grad_outputs_grad_outputs_in_dimsr   grad_insgrad_ins_dimsrY   r9   r&   r   r   r   s   `        r   rW   +vmapify_autograd_function.<locals>.backward  s    m$Sb)"//4.66$8#: $ %
'*='O%
  

	J
 #///46JKM	#

 m
,#. Wj#:N:Ns:S
 r   VmappedT)rO   rW   r\   rR   r   )r.   r_   r!   r`   r   rc   )
r&   r   r   r   rO   rR   r\   rW   rd   r9   s
   ````     @r   r   r     s    & &'1 '1R! !. : &//01D		 	 "#G,$X.$)-8"&	

I r   c                     [         R                  " U 5      u  p#[         R                  " U6 n[        X$5       VVs/ s H  u  pVUc  S OUPM     nnn[         R                  " Xs5      $ s  snnf r    )rG   rj   rg   rh   rp   )
input_dimsr]   flat_in_dimsr{   flat_tangentsr   tangentrY   s           r   r   r     so    ,,Z8L**H5M  #<??OF V+?     ..	s   A&c                   @    \ rS rSr% Sr\\S4   \S'   S rS r	S r
Srg	)

WrappedCtxiF  )_pt_reserved_attrs_pt_inner_ctx.r   c                     [        U[        5      (       d=  [        U 5      R                  nU H"  n[	        X5      (       d  M  [        SU S35      e   Xl        g )NzPyTorch reserves the zU field on ctx. Please name your fields on ctx something else to avoid name collision.)rn   r   r_   r   r   rl   r   )r   rS   reserved_attrsrd   s       r   r   WrappedCtx.__init__I  s]    #z**!$Z::N&s))"+N+; <! !  ' !r   c                 .    [        U R                  U5      $ r    )getattrr   )r   rd   s     r   __getattr__WrappedCtx.__getattr__V  s    t))400r   c                 ~    U[        U 5      R                  ;   a  X R                  U'   g [        U R                  X5      $ r    )r_   r   __dict__setattrr   )r   rd   values      r   __setattr__WrappedCtx.__setattr__Y  s6    4:000"'MM$t))477r   )r   N)r.   r/   r0   r1   r   r   r   r   r   r   r   r2   r*   r   r   r   r   F  s$    *Qc3hQ!18r   r   c                   X   ^  \ rS rSrS/\R
                  Q7rU 4S jr\S 5       rSr	U =r
$ )r   ia  _pt_new_saved_tensorsc                 0   > [         TU ]  U5        X l        g r    )r   r   r  )r   rS   new_saved_tensorsr   s      r   r   CtxWithSavedTensors.__init__d  s    %6"r   c                     U R                   $ r    r  )r   s    r   r   !CtxWithSavedTensors.saved_tensorsh  s    )))r   r  )r.   r/   r0   r1   r   r   r   propertyr   r2   r3   r4   s   @r   r   r   a  s0    1RJ4Q4QR7 * *r   r   c                   V   ^  \ rS rSrSS/\R
                  Q7rU 4S jrS rS rSr	U =r
$ )r   im  r   _pt_current_levelc                 >   > [         TU ]  U5        SU l        X l        g )Nr*   )r   r   r   r  )r   rS   r   r   s      r   r   CtxCustomSave.__init__t  s    ')$!.r   c                 p    [        XR                  5      u  p#U R                  R                  " U6   X0l        g r    )r   r  r   save_for_backwardr   r   tensorsunwrapped_tensorsbdimss       r   r  CtxCustomSave.save_for_backwardy  s1    #1';Q;Q#R ,,.?@',$r   c                 p    [        XR                  5      u  p#U R                  R                  " U6   X0l        g r    )r   r  r   save_for_forwardr   r  s       r   r  CtxCustomSave.save_for_forward~  s1    #1';Q;Q#R ++->?',$r   )r  r   )r.   r/   r0   r1   r   r   r   r  r  r2   r3   r4   s   @r   r   r   m  s5    ! 
	&	&/
-
- -r   r   c           	         ^ [        U [        5      (       d  U 4n [        U[        5      (       d  U4n[        U[        5      (       d  U4nUc  [        U 5      S-  n[        U4S j[        U UUU5       5       5      nU$ )Nr    c              3   F   >#    U  H  u  pp4[        XUTU5      v   M     g 7fr    )reductify_leaf)r   gigi_bdimi_bdimmaybe_ishaper   s        r   r   reductify.<locals>.<genexpr>  s/      2
-B 	rFJEE2
s   !)rn   r   r   rh   )
grad_inputgrad_input_bdim
input_bdimr   &target_shape_without_bdim_to_reduce_torY   s      `  r   r   r     s     j%(( ]
ou--*,j%(( ]
-514Z71J. 142	2
 F Mr   c                 ^   U c  g Uc  Uc  U $ Ub  Uc  U R                  U5      $ Uc   eUc=  U R                  U5      n [        U R                  5      nX5U'   U R	                  U5      n UnUb+  [        [        R                  R                  US 4US9" X5      $ X!:w  a  U R                  X5      n U $ )N)r   rt   )
sum	unsqueezelistr   expandr   r!   rI   sum_to_sizemovedim)r!  r"  r#  r   r$  	new_shapes         r   r  r    s     :#5"z'9~~o..0 !!!))*5
))*	 **&&y1
$-9LL$$$d+
 	> 	> $''D
r   c                    ^ ^ U U4S jnU$ )Nc                 *   > T" U0 UD6nT" XU5        U$ r    r*   )rS   r'   r(   rD   original_forwardoriginal_setup_contexts       r   new_forward8autograd_function_forward_rewritten.<locals>.new_forward  s!    !4262s&1r   r*   )r/  r0  r1  s   `` r   #autograd_function_forward_rewrittenr3    s    
 r   c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )AutogradFunctionApplyi  c                 $   > [         TU ]  S5        g )Nautograd_function_applyr   r   s    r   r   AutogradFunctionApply.__init__  s    23r   c                    ^^^^	^
 S m
US   nUS   m	[        U5      nTS U n " UUUU	U
4S jS[        R                  R                  5      nUR                  " U6 $ )Nargs_tensor_masknon_differentiable_idxc                   J   > \ rS rSr\UUUU4S j5       r\U U4S j5       rSrg)5AutogradFunctionApply.__call__.<locals>.ApplyTemplatei  c                    > T" S /TQ76 u  nm	[        T5      S:  a>  / n[        U5       H  u  pEUT;   d  M  UR                  U5        M      U R                  " U6   U$ )Nr   )r   rm   ro   mark_non_differentiable)
rS   r'   rD   non_differentiable_outputr~   r?   fwdfwd_argsr;  saved_valuess
         r   rO   =AutogradFunctionApply.__call__.<locals>.ApplyTemplate.forward  sm     (+4';(';$ -.202- )& 1 665<<Q? !2 //1JKr   c                    > T" S /UQTQ76 $ r    r*   )rS   gradbwdrC  s     r   rW   >AutogradFunctionApply.__call__.<locals>.ApplyTemplate.backward  s    46$666r   r*   N)r.   r/   r0   r1   rc   rO   rW   r2   )rG  rA  rB  r;  rC  s   r   ApplyTemplater=    s)      7 7r   rI  )r&  r!   r`   r   r%   )r   rA  rG  rB  
fwd_kwargsr:  length_of_tensor_argsnew_fwd_argsrI  r;  rC  s    ```     @@r   r$   AutogradFunctionApply.__call__  sj    %&89!+,D!E #$4 5   6!67	7 	7ENN33 	7( ""L11r   r*   r+   r-   r4   s   @r   r5  r5    s    42 2r   r5  r    )7typingr   r!   torch.utils._pytreer   r   rG   torch._C._functorchr   r   r   r   torch._functorch.apisr   torch._functorch.utilsr	   torch._functorch.vmapr
   r   r   r   r   
torch._opsr   torch.autograd.forward_adr   r   r   py_implGradJvpr;   r6   rk   rL   r   r   r   Vmapr   r   r   r   Functionalizer   r   r   r   r   r   r   r  r3  r5  r7  r*   r   r   <module>r[     s}     $ $  ' H  + ;8(; 84 9: < m001m//0 1 23~  ?J,/rz 
FR m001( 2(V.b
@ m99:K ;Ktr/~8 86	** 	*-J -8 ,0B ,08v"2/ "2J 01 r   