Ë
    ÃÓ^jÙ‰  ã                  óú  — d dl mZ d dlmZmZmZ d dlmZmZ d dl	Z	d dl
mc mZ d dlmZmZmZm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 d d
lm Z  erd dl!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z'  ed«      Z( ed«      Z) G d„ de«      Z* e*«       Z+e+jY                  ejZ                  «      e+jY                  ej\                  «      	 	 	 	 	 	 	 	 d-d„«       «       Z/	 	 	 	 	 	 d.d„Z0dZ1e1f	 	 	 	 	 	 	 	 	 	 	 d/d„Z2 G d„ de«      Z3	 	 	 	 d0d„Z4d1d„Z5e+jY                  ejl                  «      	 	 	 	 	 	 	 	 	 	 d2d„«       Z7	 	 	 	 	 	 	 	 	 	 	 	 d3d„Z8d4d„Z9	 	 	 	 	 	 	 	 d5d„Z:e+jY                  ejv                  «      	 	 	 	 	 	 	 	 	 	 d6d„«       Z<	 	 	 	 	 	 	 	 	 	 d7d„Z=d8d„Z> G d „ d!«      Z? G d"„ d#e?«      Z@ G d$„ d%e?«      ZA	 d9	 	 	 	 	 	 	 	 	 	 	 d:d&„ZB	 d9	 	 	 	 	 	 	 	 	 	 	 d;d'„ZC	 	 	 	 	 	 d<d(„ZD G d)„ d*e«      ZE eE«       ZF G d+„ d,«      ZGy)=é    )Úannotations)ÚAnyÚ
NamedTupleÚTYPE_CHECKING)Ú	ParamSpecÚTypeVarN)Ú_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_enabled)ÚCallableÚIterableÚSequence)ÚFuncTorchInterpreterÚVmapInterpreterÚ_PÚ_Rc                  ó<   ‡ — e Zd Zdˆ fd„Z	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )Ú!CustomFunctionHigherOrderOperatorc                ó$   •— t         ‰| �  d«       y )NÚcustom_function_call©ÚsuperÚ__init__©ÚselfÚ	__class__s    €úm/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_functorch/autograd_function.pyr#   z*CustomFunctionHigherOrderOperator.__init__,   s   ø€ Ü‰ÑÐ/Õ0ó    c                óŠ   •— t         j                  j                  «       rt        ‰| �  |g|¢­i |¤ŽS  |j
                  |i |¤ŽS ©N)ÚtorchÚ_CÚ _are_functorch_transforms_activer"   Ú__call__Úapply)r%   Úautograd_functionÚargsÚkwargsr&   s       €r'   r.   z*CustomFunctionHigherOrderOperator.__call__/   sI   ø€ ô" �8‰8×4Ñ4Ô6ä‘7Ñ#Ð$5ÐG¸ÒGÀÑGÐGØ&Ð ×&Ñ&¨Ð7°Ñ7Ð7r(   ©ÚreturnÚNone)r0   útype[torch.autograd.Function]r1   ú_P.argsr2   ú	_P.kwargsr4   r   ©Ú__name__Ú
__module__Ú__qualname__r#   r.   Ú__classcell__©r&   s   @r'   r   r   +   s8   ø„ õ1ð8à8ð8ð ð8ð ð	8ð
 
÷8ñ 8r(   r   c                ó|   — t        | |«      }t        «       5   |j                  |Ž }d d d «       |S # 1 sw Y   S xY wr*   )Úgenerate_single_level_functionr   r/   )Úinterpreterr0   ÚoperandsÚ	GeneratedÚflat_outs        r'   Úcustom_function_call_gradrE   i   sE   € ô /¨{Ð<MÓN€IÜ	.Ó	0ñ .à"�9—?‘? HÐ-ˆ÷.ð €O÷.ð €Oús   —1±;c           
     ó0  ‡ ‡‡— ‰ j                  «       Šdˆˆ ˆfd„}dˆfd„}d	ˆfd„}d
ˆfd„}‰j                  › d�}t        |t        j                  j
                  j                  ft        |«      t        |«      t        |«      t        |«      dœ«      }|S )Nc                 óp  •— t        j                  t        j                  ˆfd„| «      }t        j                  «       5  t        d«      5  ‰j                  «       5  t        ‰g|¢­Ž }d d d «       d d d «       d d d «       dˆfd„}t        || |«      S # 1 sw Y   Œ-xY w# 1 sw Y   Œ1xY w# 1 sw Y   Œ5xY w)Nc                ó   •— t        | ‰«      S r*   )r	   )ÚxÚlevels    €r'   ú<lambda>zAgenerate_single_level_function.<locals>.forward.<locals>.<lambda>   s   ø€ Ô$4°Q¸Ó$>€ r(   Tc                ó   •— t        | ‰«      S r*   )r
   )ÚoutputrJ   s    €r'   Úwrap_fnz@generate_single_level_function.<locals>.forward.<locals>.wrap_fnŠ   s   ø€ Ü! &¨%Ó0Ð0r(   )rM   útorch.Tensorr4   rO   )	ÚpytreeÚtree_map_onlyr+   ÚTensorÚenable_gradr   Úlowerr    Ú!wrap_outputs_maintaining_identity)rB   Úunwrapped_operandsÚunwrapped_outputrN   r0   rA   rJ   s       €€€r'   Úforwardz/generate_single_level_function.<locals>.forward}   s´   ø€ Ü#×1Ñ1Ü�L‰LÓ>Àó
Ðô ×ÑÓ ñ 	Ô"7¸Ó"=ñ 	¸{×?PÑ?PÓ?Rñ 	Ü3Ø!ð Ø$6ò Ð÷	÷ 	÷ 	õ	1ô 1ØÐ0°(¸Gó
ð 	
÷	ð 	ú÷ 	ð 	ú÷ 	ð 	ús;   ¾B,Á
B ÁBÁ(B Á0B,ÂBÂB Â B)	Â%B,Â,B5c                ó*   •— ‰j                  | ||«      S r*   )Úsetup_context)ÚctxÚinputsrM   r0   s      €r'   rZ   z5generate_single_level_function.<locals>.setup_context‘   s   ø€ Ø ×.Ñ.¨s°F¸FÓCÐCr(   c                ó.   •—  ‰j                   | g|¢­Ž }|S r*   )Úbackward)r[   ÚgradsÚresultr0   s      €r'   r^   z0generate_single_level_function.<locals>.backward•   s    ø€ Ø+Ð"×+Ñ+¨CÐ8°%Ò8ˆØˆr(   c                ó.   •—  ‰j                   | g|¢­Ž }|S r*   )Újvp)r[   Útangentsr`   r0   s      €r'   rb   z+generate_single_level_function.<locals>.jvpš   s    ø€ Ø&Ð"×&Ñ& sÐ6¨XÒ6ˆØˆr(   rC   )rX   r^   rb   rZ   ©rB   r   r4   r   )r[   r   r\   r   rM   r   r4   r   )r[   r   r_   r   r4   r   ©r[   r   rc   r   r4   r   )rJ   r:   Útyper+   ÚautogradÚfunctionÚ_SingleLevelFunctionÚstaticmethod)	rA   r0   rX   rZ   r^   rb   ÚnamerC   rJ   s	   ``      @r'   r@   r@   w   s�   ú€ ð ×ÑÓ€E÷
õ(Dõõ
ð  ×(Ñ(Ð)¨Ð3€DÜØÜ	�‰×	 Ñ	 ×	5Ñ	5Ð7ä# GÓ,Ü$ XÓ.Ü Ó$Ü)¨-Ó8ñ		
ó	€Ið Ðr(   znot specifiedc           	     óê  — t        j                  |Ž }t        j                  |Ž }t        ||«      D ��ci c]  \  }}t        |«      |“Œ }	}}t        j                  | «      \  }
}g }|t
        k7  }d }|r9t        ||«      }|€+t        d|› dt        j                  |«      d   › d|› d�«      ‚t        |
«      D ]ž  \  }}t        |t        j                  «      s|j                  |«       Œ2t        |«      |	v r|j                  |	t        |«         «       Œ]|r)|€t        d«      ‚|j                   ||||   «      «       Œˆ|j                   ||«      «       Œ  t        j                  ||«      S c c}}w )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.htmlz9flat_out_dims must not be None when out_dims is specified)rP   Úarg_tree_leavesÚzipÚidÚtree_flattenÚNO_OUT_DIMSr   ÚRuntimeErrorÚ	enumerateÚ
isinstancer+   rR   ÚappendÚAssertionErrorÚtree_unflatten)ÚoutputsÚunwrapped_inputsÚorig_inputsrN   Úout_dimsÚflat_unwrapped_inputsÚflat_orig_inputsÚ	unwrappedÚorigÚunwrapped_input_to_orig_inputÚflat_outputsÚspecr`   Úout_dims_specifiedÚflat_out_dimsÚirM   s                    r'   rU   rU   À   s¤  € ô #×2Ñ2Ð4DÐEÐÜ×-Ñ-¨{Ð;Ðô  #Ð#8Ð:JÓK÷%áˆI�tô 	ˆ9‹�tÑð%Ð!ñ %ô
  ×,Ñ,¨WÓ5Ñ€L�$Ø€Fà!¤[Ñ0Ðà€MÙÜ1°(¸DÓAˆð Ð Üð%à%- Jð /*ä*0×*=Ñ*=¸hÓ*GÈÑ*JÐ)Kð L,Ø,0¨6ð 2JðKó	ð 	ô ˜|Ó,ò +‰	ˆˆ6Ü˜&¤%§,¡,Ô/Ø�M‰M˜&Ô!ØÜˆf‹:Ð6Ñ6Ø�M‰MÐ7¼¸6»
ÑCÔDØÙØÐ$Ü$ØOóð ð �M‰M™' &¨-¸Ñ*:Ó;Õ<à�M‰M™' &›/Õ*ð+ô  × Ñ  ¨Ó.Ð.ùóW%s   ´E/c                  ó"   — e Zd ZU ded<   ded<   y)ÚVmapInfoÚintÚ
batch_sizeÚstrÚ
randomnessN)r:   r;   r<   Ú__annotations__© r(   r'   rˆ   rˆ   "  s   … ØƒOØ„Or(   rˆ   c                ób   — | j                   t        j                  j                  j                   uS r*   )r   r+   rg   ÚFunction)r0   s    r'   Úhas_overridden_vmap_ruler‘   '  s%   € ð ×!Ñ!¬¯©×)@Ñ)@×)EÑ)EÐEÐEr(   c                ó°   — d}t        | t        «      st        |dt        | «      › d�z   «      ‚t	        | «      dk(  st        |dt	        | «      › d�z   «      ‚y )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)ru   Útuplers   rf   Úlen)r`   Úbase_error_msgs     r'   Ú+validate_vmap_returns_tuple_of_two_elementsr—   -  se   € ð	Jð ô �fœeÔ$Ü˜>¨f´T¸&³\°NÀ(Ð,KÑKÓLÐLÜˆv‹;˜!ÒÜ˜>¨d´3°v³;°-Ð?OÐ,PÑPÓQÐQð r(   c                óŽ  — t        d„ t        j                  j                  j	                  |«      d   D «       «      rt        d|› �«      ‚|j                  r1t        |«      rt        d|j                  › d�«      ‚t        | |g|¢­Ž S t        |«      st        d|j                  › d�«      ‚t        | |j                  |g|¢­i |¤ŽS )Nc              3  óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wr*   ©ru   r+   rR   )Ú.0Úvals     r'   ú	<genexpr>z,custom_function_call_vmap.<locals>.<genexpr>?  s#   è ø€ ò àô 	�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 overridden vmap staticmethod. Please set generate_vmap_rule=False or delete the overridden 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Ú_pytreerq   ÚNotImplementedErrorÚgenerate_vmap_ruler‘   rs   r:   Ú'custom_function_call_vmap_generate_ruleÚ custom_function_call_vmap_helperr   )rA   r0   rB   r2   s       r'   Úcustom_function_call_vmapr¥   8  s  € ô ñ ä—;‘;×&Ñ&×3Ñ3°FÓ;¸AÑ>ôô ô "ðà�8ðó
ð 	
ð ×+Ò+Ü#Ð$5Ô6ô Ø)Ð*;×*DÑ*DÐ)Eð FJð Kóð ô 7ØÐ*ð
Ø-5ò
ð 	
ô $Ð$5Ô6ô Ø%Ð&7×&@Ñ&@Ð%Að BFð Gó
ð 	
ô ,ØÐ&×+Ñ+Ð->ðØAIòØMSñð r(   c                óF  ‡ ‡‡— ‰ j                  «       Št        ‰ j                  «       ‰ j                  «       ¬«      }t	        |t
        j                  j                  j                  «      Šdˆˆ fd„}t        |‰«      \  }}t        j                  d„ |«      r0 |«       5  ‰rt        |g|¢­Ž cd d d «       S  ||i |¤Žcd d d «       S  |«       5   |||g|¢­i |¤Ž}	d d d «       t        	«       |	\  }
}dˆfd„}t        |
||||¬«      S # 1 sw Y   ŒLxY w# 1 sw Y   Œ;xY w)N)rŠ   rŒ   c                 óä   •— ‰ r‰j                  «       S t        j                  j                  t        j                  j	                  t        j                  j
                  j                  «      «      S r*   )rT   r+   r,   Ú_ExcludeDispatchKeyGuardÚDispatchKeySetÚDispatchKeyÚFuncTorchBatched)Úautograd_function_caserA   s   €€r'   Úlower_to_nextz7custom_function_call_vmap_helper.<locals>.lower_to_nexty  sN   ø€ Ù!Ø×$Ñ$Ó&Ð&ä—8‘8×4Ñ4Ü—‘×'Ñ'¬¯©×(<Ñ(<×(MÑ(MÓNóð r(   c                ó
   — | d u S r*   rŽ   )Údims    r'   rK   z2custom_function_call_vmap_helper.<locals>.<lambda>…  s
   €  3¨$ ;€ r(   c                ó&   •— |€| S t        | |‰«      S r*   )r   )rM   Úout_dimr   s     €r'   rN   z1custom_function_call_vmap_helper.<locals>.wrap_fn’  s'   ø€ ð ˆð ð	
ô   ¨°Ó?ð	
r(   )r|   )r4   r   )rM   rO   r±   ú
int | Noner4   rO   )rJ   rˆ   rŠ   rŒ   ru   r+   rg   rh   ÚFunctionMetar   rP   Útree_allr    r—   rU   )rA   Úvmap_functionÚoprB   r2   Úinfor­   rV   Úin_dimsr`   rW   r|   rN   r¬   r   s   `            @@r'   r¤   r¤   i  s0  ú€ ð  ×%Ñ%Ó'€MÜØ×)Ñ)Ó+Ø×)Ñ)Ó+ô€Dô (¨¬E¯N©N×,CÑ,C×,PÑ,PÓQÐöô #1°¸=Ó"IÑÐ˜ô ‡�Ñ.°Ô8Ù‹_ñ 	/Ù%Ü+¨BÐ:°Ò:÷	/ñ 	/ñ ˜8Ð. vÑ.÷		/ñ 	/ñ 
‹ñ MÙ˜t WÐLÐ/AÒLÀVÑLˆ÷Mä/°Ô7Ø!'ÑÐ�hõ
ô -ØÐ,¨h¸È(ôð ÷'	/ð 	/ú÷Mð Mús   ÂDÂ7DÃDÄDÄD c                óP   — | d   }t        |t        «      r	| d d } | |fS | d   } | |fS )Néÿÿÿÿr   )ru   r”   )ry   r|   s     r'   Úunpack_outputsr»   ž  sC   € Ø�r‰{€HÜ�(œEÔ"Ø˜#˜2�,ˆð �HÐÐð ˜!‘*ˆØ�HÐÐr(   c                ó’  — t        || j                  «       «      \  }}t        ||| j                  «       | j	                  «       «      }| j                  «       5  t        |g|¢­Ž }d d d «       t        t        «      st        dt        |«      › �«      ‚t        |«      \  }}t        ||| j                  «       «      S # 1 sw Y   ŒYxY w)Nz$expected outputs to be a tuple, got )r   rJ   Úvmapify_autograd_functionrŠ   rŒ   rT   r    ru   r”   rw   rf   r»   r   )rA   r0   rB   rV   r¸   Úvmapped_functionry   r|   s           r'   r£   r£   §  sÊ   € ô
 #1°¸;×;LÑ;LÓ;NÓ"OÑÐ˜Ü0ØØØ×ÑÓ Ø×ÑÓ ó	Ðð 
×	Ñ	Ó	ñ NÜ&Ð'7ÐMÐ:LÒMˆ÷Nô �gœuÔ%ÜÐCÄDÈÃMÀ?ÐSÓTÐTÜ& wÓ/Ñ€GˆXÜ˜ ¨;×+<Ñ+<Ó+>Ó?Ð?÷Nð Nús   ÁB=Â=Cc                ó   — t        d«      ‚)Nz0NYI: Functionalize rule for custom_function_call)rs   )rA   r0   r¢   rB   s       r'   Ú"custom_function_call_functionalizerÀ   ¼  s   € ô ÐIÓ
JÐJr(   c           
     ó  ‡ ‡‡‡‡	— dˆ ˆˆˆfd„}d	ˆ	ˆ ˆˆˆfd„}d
ˆ	ˆ ˆˆˆfd„}dˆ	ˆ ˆˆˆfd„}d‰ j                   › �}t        |t        j                  j                  ft        |«      t        |«      t        |«      t        |«      ddœ«      Š	‰	S )Nc                 óŠ   •—  t        ‰j                  ‰‰‰«      | Ž \  }}t        |t        j                  «      r||fS g |¢|‘­S r*   )r   rX   ru   r+   rR   )rB   ry   r|   r0   rŠ   r¸   rŒ   s      €€€€r'   rX   z*vmapify_autograd_function.<locals>.forwardÌ  sX   ø€ ð
œLØ×%Ñ% w°
¸Jó
àðÑˆ�ô �gœuŸ|™|Ô,Ø˜HÐ$Ð$à%�GÐ%˜XÑ%Ð%r(   c                óÚ   •‡ ‡— t        |«      \  }}t        ‰«      Šdˆˆ ˆfd„} t        |‰	|f‰‰
«      ||«       t        ‰ d«      si ‰ _        ‰ j                  j                  ‰|i«       y )Nc                óL  •— t        ‰t        «       «      }‰j                  || |«       t        d„ | D «       «      }t	        ‰d«      si ‰_        ‰j
                  j                  ‰|i«       t	        ‰d«      si ‰_        ‰j                  j                  ‰|j                  i«       y )Nc              3  ól   K  — | ],  }t        |t        j                  «      r|j                  nd –— Œ. y ­wr*   )ru   r+   rR   Úshape)r›   Úinps     r'   r�   zRvmapify_autograd_function.<locals>.setup_context.<locals>.inner.<locals>.<genexpr>å  s+   è ø€ ò !ØILœZ¨¬U¯\©\Ô:�—	’	ÀÓDñ!ùs   ‚24Ú_pt_input_shapesÚ_pt_saved_tensors_bdims_stack)	ÚCtxCustomSaver   rZ   r”   ÚhasattrrÈ   ÚupdaterÉ   Ú_pt_saved_tensors_bdims)r\   ry   Úwrapped_ctxÚinput_shapesr0   r[   Úkeys       €€€r'   Úinnerz?vmapify_autograd_function.<locals>.setup_context.<locals>.innerÙ  s¡   ø€ ô
 (¨¬]«_Ó=ˆKØ×+Ñ+¨K¸ÀÔIô !ñ !ØPVô!ó ˆLô ˜3Ð 2Ô3à')�Ô$Ø× Ñ ×'Ñ'¨¨lÐ(;Ô<ä˜3Ð ?Ô@à46�Ô1Ø×-Ñ-×4Ñ4Ø�{×:Ñ:Ð<õr(   Ú_pt_out_dims)r\   r   ry   r   r4   r5   )r»   rp   r   rË   rÒ   rÌ   )r[   r\   ry   r|   rÑ   rÐ   rC   r0   rŠ   r¸   rŒ   s   `    @€€€€€r'   rZ   z0vmapify_autograd_function.<locals>.setup_contextÕ  su   ú€ Ü*¨7Ó3Ñˆ�Ü�‹mˆ÷	ð8	
ŒØØ�hÐØØó		
ð
 �'ô	ô �s˜NÔ+à!ˆCÔØ×Ñ×Ñ  h Õ0r(   c                ó$  •‡ — t        ‰«      }dˆ	ˆ fd„}t        ‰|«      } t        |‰ j                  |   |f‰
‰«      ‰ j                  |«      \  }}t        ||‰ j                  |   ‰
«      }t        |t        j                  «      r|d fS g |¢d ‘­S )Nc                óB   •— t        ‰| «      } ‰j                  |g|¢­Ž S r*   )ÚCtxWithSavedTensorsrb   )Úsaved_tensorsrc   rÎ   r0   r[   s      €€r'   Újvp_no_contextz>vmapify_autograd_function.<locals>.jvp.<locals>.jvp_no_context  s(   ø€ Ü-¨c°=ÓAˆKØ(Ð$×(Ñ(¨Ð@°xÒ@Ð@r(   )rÖ   r   rc   r   r4   r   )
rp   Úget_tangents_in_dimsr   rÉ   rÖ   Ú	reductifyrÒ   ru   r+   rR   )r[   rc   rÐ   r×   Útangent_in_dimsÚout_tangentsÚout_tangents_dimsr`   rC   r0   rŠ   r¸   rŒ   s   `       €€€€€r'   rb   z&vmapify_autograd_function.<locals>.jvp  s«   ù€ Ü�‹mˆö	Aô /¨w¸ÓAˆð+
¬,ØØ×.Ñ.¨sÑ3°_ÐEØØó	+
ð
 ×
Ñ
˜Xó+'Ñ'ˆÐ'ô ØÐ+¨S×-=Ñ-=¸cÑ-BÀJó
ˆô �fœeŸl™lÔ+Ø˜4�<Ðà �F�=˜D‘=Ð r(   c                óR  •‡ — t        ‰	«      }|d d }‰ j                  |   }t        |t        «      s|f}t        d„ t	        ||«      D «       «      }dˆ
ˆ fd„} t        |‰ j                  |   |ff‰‰«      ‰ j                  |f«      \  }}t        ||‰‰‰ j                  |   «      }|S )Nrº   c              3  ó.   K  — | ]  \  }}|�|nd –— Œ y ­wr*   rŽ   )r›   Úgrad_outputÚin_dims      r'   r�   z>vmapify_autograd_function.<locals>.backward.<locals>.<genexpr>   s&   è ø€ ò %
á#�˜Vð "Ð-‰F°4Ó7ñ%
ùs   ‚c                óL   •— | \  }}t        ‰|«      } ‰j                  |g|¢­Ž S r*   )rÕ   r^   )r\   rÖ   Úgrad_outputsrÎ   r0   r[   s       €€r'   Úbackward_no_contextzHvmapify_autograd_function.<locals>.backward.<locals>.backward_no_context%  s2   ø€ Ø*0Ñ'ˆM˜<Ü-¨c°=ÓAˆKØ-Ð$×-Ñ-¨kÐI¸LÒIÐIr(   )r\   r   r4   r   )
rp   rÒ   ru   r”   ro   r   rÉ   rÖ   rÙ   rÈ   )r[   râ   rÐ   Úgrad_outputs_Úgrad_outputs_in_dimsrã   Úgrad_insÚgrad_ins_dimsr`   rC   r0   rŠ   r¸   rŒ   s   `        €€€€€r'   r^   z+vmapify_autograd_function.<locals>.backward  sÔ   ù€ Ü�‹mˆØ$ S bÐ)ˆØ"×/Ñ/°Ñ4ÐäÐ.´Ô6Ø$8Ð#:Ð ä$ñ %
ä'*¨=Ð:NÓ'Oô%
ó  
Ðö
	Jð
#
¤,ØØ×/Ñ/°Ñ4Ð6JÐKÐMØØó	#
ð
 ×Ñ˜mÐ
,ó#.Ñˆ�-ô Ø�m W¨j¸#×:NÑ:NÈsÑ:Só
ˆð ˆr(   ÚVmappedT)rX   r^   rb   rZ   r¢   rd   )r[   r   r\   r   ry   r   r4   r5   re   )r[   r   râ   r   r4   r   )r:   rf   r+   rg   r�   rj   )
r0   r¸   rŠ   rŒ   rX   rZ   rb   r^   rk   rC   s
   ````     @r'   r½   r½   Æ  s�   ü€ ÷&ð &÷*1ñ *1÷X!ñ !÷.ñ ð: Ð&×/Ñ/Ð0Ð1€DÜØÜ	�‰×	 Ñ	 Ð"ä# GÓ,Ü$ XÓ.Ü Ó$Ü)¨-Ó8Ø"&ñ	
ó
€Ið Ðr(   c                óÒ   — t        j                  | «      \  }}t        j                  |Ž }t        ||«      D ��cg c]  \  }}|€d n|‘Œ }}}t        j                  ||«      S c c}}w r*   )rP   rq   rn   ro   rx   )Ú
input_dimsrc   Úflat_in_dimsrƒ   Úflat_tangentsrà   Útangentr`   s           r'   rØ   rØ   G  st   € Ü×,Ñ,¨ZÓ8Ñ€L�$Ü×*Ñ*¨HÐ5€Mô  # <°Ó?÷áˆF�Gð �‰ VÑ+ð€Fñ ô × Ñ  ¨Ó.Ð.ùó	s   ºA#c                  ó4   — e Zd ZU dZded<   dd„Zd	d„Zd
d„Zy)Ú
WrappedCtx)Ú_pt_reserved_attrsÚ_pt_inner_ctxztuple[str, ...]rð   c                ó    — t        |t        «      s7t        | «      j                  }|D ]  }t	        ||«      sŒt        d|› d�«      ‚ || _        y )NzPyTorch reserves the zU field on ctx. Please name your fields on ctx something else to avoid name collision.)ru   rï   rf   rð   rË   rs   rñ   )r%   r[   Úreserved_attrsrk   s       r'   r#   zWrappedCtx.__init__‰  s`   € Ü˜#œzÔ*Ü! $›Z×:Ñ:ˆNØ&ò �Ü˜s DÔ)ØÜ"Ø+¨NÐ+;ð <!ð !óð ðð !ˆÕr(   c                ó.   — t        | j                  |«      S r*   )Úgetattrrñ   )r%   rk   s     r'   Ú__getattr__zWrappedCtx.__getattr__–  s   € Ü�t×)Ñ)¨4Ó0Ð0r(   c                ó~   — |t        | «      j                  v r|| j                  |<   y t        | j                  ||«      S r*   )rf   rð   Ú__dict__Úsetattrrñ   )r%   rk   Úvalues      r'   Ú__setattr__zWrappedCtx.__setattr__™  s:   € Ø”4˜“:×0Ñ0Ñ0Ø"'ˆD�M‰M˜$ÑØÜ�t×)Ñ)¨4°Ó7Ð7r(   N)r[   r   r4   r5   )rk   r‹   r4   r   )rk   r‹   rú   r   r4   r5   )r:   r;   r<   rð   r�   r#   rö   rû   rŽ   r(   r'   rï   rï   †  s   … Ø*QÐ˜ÓQó!ó1ô8r(   rï   c                  óR   ‡ — e Zd Zdgej                  ¢­Zdˆ fd„Zedd„«       Zˆ xZS )rÕ   Ú_pt_new_saved_tensorsc                ó2   •— t         ‰| �  |«       || _        y r*   )r"   r#   rý   )r%   r[   Únew_saved_tensorsr&   s      €r'   r#   zCtxWithSavedTensors.__init__¤  s   ø€ Ü‰Ñ˜ÔØ%6ˆÕ"r(   c                ó   — | j                   S r*   )rý   )r%   s    r'   rÖ   z!CtxWithSavedTensors.saved_tensors¨  s   € à×)Ñ)Ð)r(   )r[   r   rÿ   úSequence[torch.Tensor]r4   r5   )r4   r  )	r:   r;   r<   rï   rð   r#   ÚpropertyrÖ   r=   r>   s   @r'   rÕ   rÕ   ¡  s0   ø„ Ø1ÐR°J×4QÑ4QÑRÐõ7ð ò*ó ô*r(   rÕ   c                  óR   ‡ — e Zd Zddgej                  ¢­Zdˆ fd„Zdd„Zdd„Zˆ xZS )rÊ   rÍ   Ú_pt_current_levelc                ó@   •— t         ‰| �  |«       d| _        || _        y )NrŽ   )r"   r#   rÍ   r  )r%   r[   r   r&   s      €r'   r#   zCtxCustomSave.__init__´  s    ø€ Ü‰Ñ˜ÔØ8:ˆÔ$Ø!.ˆÕr(   c                óv   — t        || j                  «      \  }} | j                  j                  |Ž  || _        y r*   )r   r  rñ   Úsave_for_backwardrÍ   ©r%   ÚtensorsÚunwrapped_tensorsÚbdimss       r'   r  zCtxCustomSave.save_for_backward¹  s9   € Ü#1°'¸4×;QÑ;QÓ#RÑ Ð˜5Ø,ˆ×Ñ×,Ñ,Ð.?Ñ@Ø',ˆÕ$r(   c                óv   — t        || j                  «      \  }} | j                  j                  |Ž  || _        y r*   )r   r  rñ   Úsave_for_forwardrÍ   r  s       r'   r  zCtxCustomSave.save_for_forward¾  s9   € Ü#1°'¸4×;QÑ;QÓ#RÑ Ð˜5Ø+ˆ×Ñ×+Ñ+Ð->Ñ?Ø',ˆÕ$r(   )r[   r   r   r‰   r4   r5   )r	  rO   r4   r5   )	r:   r;   r<   rï   rð   r#   r  r  r=   r>   s   @r'   rÊ   rÊ   ­  s0   ø„ à!Øðð 
×	&Ñ	&ñÐõ/ó
-÷
-r(   rÊ   c           	     óÚ   ‡— t        | t        «      s| f} t        |t        «      s|f}t        |t        «      s|f}|€t        | «      dz  }t        ˆfd„t        | |||«      D «       «      }|S )Nr*   c              3  óF   •K  — | ]  \  }}}}t        |||‰|«      –— Œ y ­wr*   )Úreductify_leaf)r›   ÚgiÚgi_bdimÚi_bdimÚmaybe_ishaperŠ   s        €r'   r�   zreductify.<locals>.<genexpr>Ô  s.   øè ø€ ò á-ˆB�˜ ô 	�r˜7 F¨J¸×Eñùs   ƒ!)ru   r”   r•   ro   )Ú
grad_inputÚgrad_input_bdimÚ
input_bdimrŠ   Ú&target_shape_without_bdim_to_reduce_tor`   s      `  r'   rÙ   rÙ   Ä  s}   ø€ ô �j¤%Ô(Ø �]ˆ
Ü�o¤uÔ-Ø*Ð,ˆÜ�j¤%Ô(Ø �]ˆ
à-Ð5Ü14°Z³À7Ñ1JÐ.Üó ä14ØØØØ2ó	2
ôó €Fð €Mr(   c                ól  — | €y |€|€| S |�|€| j                  |«      S |€t        d«      ‚|€>| j                  |«      } t        | j                  «      }|||<   | j                  |«      } |}|�/ t        t        j                  j                  |d f|¬«      | |«      S ||k7  r| j                  ||«      } | S )Nzinput_bdim must not be None)r¸   r|   )Úsumrw   Ú	unsqueezeÚlistrÆ   Úexpandr   r+   rR   Úsum_to_sizeÚmovedim)r  r  r  rŠ   r  Ú	new_shapes         r'   r  r  à  sï   € ð ÐØàÐ :Ð#5ØÐàÐ" zÐ'9Ø�~‰~˜oÓ.Ð.ð0 ÐÜÐ:Ó;Ð;àÐØ×)Ñ)¨*Ó5ˆ
Ü˜×)Ñ)Ó*ˆ	Ø *ˆ	�*ÑØ×&Ñ& yÓ1ˆ
Ø$ˆà-Ð9ð
ŒtÜ�L‰L×$Ñ$Ø$ dÐ+Øô
ð Ð<ó	>ð 	>ð �_Ò$Ø×'Ñ'¨¸ÓDˆ
ØÐr(   c                ó   ‡ ‡— dˆ ˆfd„}|S )Nc                ó,   •—  ‰|i |¤Ž} ‰| ||«       |S r*   rŽ   )r[   r1   r2   rM   Úoriginal_forwardÚoriginal_setup_contexts       €€r'   Únew_forwardz8autograd_function_forward_rewritten.<locals>.new_forward   s#   ø€ Ù! 4Ð2¨6Ñ2ˆÙ˜s D¨&Ô1Øˆr(   )r[   r   r1   r7   r2   r8   r4   r   rŽ   )r#  r$  r%  s   `` r'   Ú#autograd_function_forward_rewrittenr&    s   ù€ öð
 Ðr(   c                  ó<   ‡ — e Zd Zdˆ fd„Z	 	 	 	 	 	 	 	 	 	 dd„Zˆ xZS )ÚAutogradFunctionApplyc                ó$   •— t         ‰| �  d«       y )NÚautograd_function_applyr!   r$   s    €r'   r#   zAutogradFunctionApply.__init__)  s   ø€ Ü‰ÑÐ2Õ3r(   c           	     óÖ   ‡‡‡‡‡‡	‡
— d Š
|j                  dg «      Št        ‰«      Š|d   Š|d   Š	 G ˆˆˆˆˆˆ	ˆ
fd„dt        j                  j                  «      } |j
                  |Ž S )NÚ	dirty_idxÚnon_differentiable_idxÚsaved_for_backward_idxc                  óZ   •— e Zd Zedˆˆˆfd„«       Zedˆˆˆfd„«       Zedˆ ˆfd„«       Zy)ú5AutogradFunctionApply.__call__.<locals>.ApplyTemplatec                 óì   •— t        j                  j                  ‰«      j                  | Ž \  }Š	ddlm} t        ‰	«      D ]0  \  }}|‰vsŒ ||«      D ]  }d|j                  j                  d<   Œ Œ2 |S )Nr   )Ú_get_proxiesTÚsaved_tensor_with_no_vc_check)	r+   ÚfxÚInterpreterÚrunÚ"torch.fx.experimental.proxy_tensorr2  rt   ÚnodeÚmeta)
r1   r2   rM   r2  ÚidxÚtÚproxyÚfwdr.  Úsaved_valuess
          €€€r'   rX   z=AutogradFunctionApply.__call__.<locals>.ApplyTemplate.forward:  s�   ø€ ô (-§x¡x×';Ñ';¸CÓ'@×'DÑ'DÀdÐ'KÑ$�˜õ Lä'¨Ó5ò T‘F�C˜ØÐ"8Ò8Ù%1°!£_ò T˜EØOS˜EŸJ™JŸO™OÐ,KÒLñTðTð
 �r(   c                ó¢   •‡— dˆfd„}t        ‰«      dkD  r | j                   |‰«      Ž  t        ‰«      dkD  r | j                   |‰«      Ž  y y )Nc                óª   •— t        | «      }t        ‰t        t        f«      r#t	        ‰«      D ��cg c]  \  }}||v sŒ|‘Œ c}}S d|v r‰gS g S c c}}w )Nr   )Úsetru   r”   r  rt   )r:  Úidx_setr†   rI   rM   s       €r'   Úselected_outputsz]AutogradFunctionApply.__call__.<locals>.ApplyTemplate.setup_context.<locals>.selected_outputsR  sS   ø€ Ü! #›h�GÜ! &¬5´$¨-Ô8Ü.7¸Ó.?×P¡d a¨À1ÈÂ<¢ÓPÐPØ'(¨G¡|˜F˜8Ð;¸Ð;ùó  Qs
   ±A¾Ar   )r:  zIterable[int]r4   z	list[Any])r•   Ú
mark_dirtyÚmark_non_differentiable)r[   r\   rM   rC  r,  Údirty_idx_setr-  s     ` €€€r'   rZ   zCAutogradFunctionApply.__call__.<locals>.ApplyTemplate.setup_contextP  sX   ù€ õ<ô �y“> AÒ%Ø"�C—N‘NÑ$4°]Ó$CÑDô Ð-Ó.°Ò2Ø/�C×/Ñ/Ù)Ð*@ÓAòð 3r(   c                ó~   •— ‰€t        d«      ‚t        j                  j                  ‰«      j                  g |¢‰¢­Ž S )Nzsaved_values must not be None)rw   r+   r4  r5  r6  )r[   ÚgradÚbwdr>  s     €€r'   r^   z>AutogradFunctionApply.__call__.<locals>.ApplyTemplate.backwardb  s?   ø€ ð  Ð'Ü(Ð)HÓIÐIÜ—x‘x×+Ñ+¨CÓ0×4Ñ4ÐJ°dÐJ¸\ÒJÐJr(   N)r1   r   r2   r   r4   r   )r[   r   r\   útuple[Any, ...]rM   r   r4   r5   )r[   r   rH  r   r4   r   )r:   r;   r<   rj   rX   rZ   r^   )rI  r,  rF  r=  r-  r.  r>  s   €€€€€€€r'   ÚApplyTemplater0  9  s?   ø„ Øöó ðð* öó ðð" õKó ñKr(   rK  )ÚgetrA  r+   rg   r�   r/   )r%   r=  rI  Úfwd_argsÚ
fwd_kwargsrK  r,  rF  r-  r.  r>  s    ``   @@@@@r'   r.   zAutogradFunctionApply.__call__,  so   þ€ ð .2ˆØ—N‘N ;°Ó3ˆ	Ü˜I›ˆØ!+Ð,DÑ!EÐØ!+Ð,DÑ!EÐ÷1	Kô 1	KœEŸN™N×3Ñ3ô 1	Kðf #ˆ}×"Ñ" HÐ-Ð-r(   r3   )
r=  útorch.fx.GraphModulerI  rO  rM  r   rN  r   r4   r   r9   r>   s   @r'   r(  r(  (  sC   ø„ õ4ð@.à!ð@.ð "ð@.ð ð	@.ð
 ð@.ð 
÷@.r(   r(  c                  ó   — e Zd Zedd„«       Zy)Ú!DynamoAutogradFunctionTraceHelperc                ó   ‡ — dˆ fd„}|S )Nc                 ó$  •‡ ‡— t        j                  «       5   ‰	‰ i |¤Ž}d d d «       ‰ d   }t        |dd «      Šdˆfd„}dˆ fd„}t        t         j                  «      r# ||«      r ||«      s|j                  |«      S |S g }|D ]p  }t        |t         j                  «      rC ||«      r) ||«      s!|j                  |j                  |«      «       ŒN|j                  |«       Œ`|j                  |«       Œr t        |«      S # 1 sw Y   ŒæxY w)Nr   Údirty_tensorsc                ó4   •‡ — ‰€yt        ˆ fd„‰D «       «      S )NFc              3  óZ   •K  — | ]"  }t        |t        j                  «      r‰|u –— Œ$ y ­wr*   rš   )r›   Údirty_tensorÚtensors     €r'   r�   zmDynamoAutogradFunctionTraceHelper.fwd_trace_helper.<locals>.inner.<locals>.is_dirty_tensor.<locals>.<genexpr>‚  s,   øè ø€ ò à$Ü! ,´·±Ô=ð ˜lÔ*ñùs   ƒ(+©rž   )rX  rT  s   `€r'   Úis_dirty_tensorzZDynamoAutogradFunctionTraceHelper.fwd_trace_helper.<locals>.inner.<locals>.is_dirty_tensor  s&   ù€ Ø Ð(Ø Üó à(5ôó ð r(   c                ó.   •‡ — t        ˆ fd„‰D «       «      S )Nc              3  ó\   •K  — | ]#  }t        |t        j                  «      sŒ|‰u –— Œ% y ­wr*   rš   )r›   ÚargrX  s     €r'   r�   zkDynamoAutogradFunctionTraceHelper.fwd_trace_helper.<locals>.inner.<locals>.is_tensor_arg.<locals>.<genexpr>‰  s'   øè ø€ ò Ø&)´ZÀÄUÇ\Á\Õ5R�C˜6”Mñùs   ƒ,£	,rY  )rX  r1   s   `€r'   Úis_tensor_argzXDynamoAutogradFunctionTraceHelper.fwd_trace_helper.<locals>.inner.<locals>.is_tensor_argˆ  s   ù€ Üó Ø-1ôó ð r(   )rX  rO   r4   Úbool)r+   Úno_gradrõ   ru   rR   Úview_asrv   r”   )
r1   r2   Úoutsr[   rZ  r^  Únew_outsÚoutrT  Úorig_fwds
   `       @€r'   rÑ   zADynamoAutogradFunctionTraceHelper.fwd_trace_helper.<locals>.innerx  sñ   ú€ Ü—‘“ñ 1Ù Ð0¨Ñ0�÷1ð �q‘'ˆCÜ# C¨¸$Ó?ˆMõõô ˜$¤§¡Ô-Ù  Ô&©¸tÔ/DØŸ<™<¨Ó-Ð-à�KàˆHØò )�Ü˜c¤5§<¡<Ô0Ù$ SÔ)±/À#Ô2FØ Ÿ™¨¯©°CÓ(8Õ9à Ÿ™¨Õ,à—O‘O CÕ(ð)ô ˜“?Ð"÷K1ð 1ús   ˜	DÄD)r1   r7   r2   r8   r4   r   rŽ   )re  rÑ   s   ` r'   Úfwd_trace_helperz2DynamoAutogradFunctionTraceHelper.fwd_trace_helpers  s   ø€ õ
&	#ð^ ˆr(   N)re  úCallable[_P, Any]r4   rg  )r:   r;   r<   rj   rf  rŽ   r(   r'   rQ  rQ  r  s   „ Øò3ó ñ3r(   rQ  )rA   r   r0   r6   rB   r   r4   r   )rA   r   r0   r6   r4   z2type[torch.autograd.function._SingleLevelFunction])ry   r   rz   r   r{   r   rN   úCallable[..., Any]r|   r   r4   r   )r0   r6   r4   r_  )r`   r   r4   r5   )
rA   r   r0   r6   rB   r   r2   r   r4   r   )rA   r   rµ   rh  r¶   r   rB   r   r2   r   r4   r   )ry   rJ  r4   ztuple[Any, Any])rA   r   r0   r6   rB   r   r4   r   )
rA   r   r0   r6   r¢   r_  rB   r   r4   r   )
r0   r6   r¸   r   rŠ   r‰   rŒ   r‹   r4   r6   )rê   r   rc   rJ  r4   r   r*   )r  z'torch.Tensor | tuple[torch.Tensor, ...]r  úint | tuple[int, ...]r  ri  rŠ   r‰   r  r   r4   rJ  )r  útorch.Tensor | Noner  r²   r  r²   rŠ   r‰   r  r   r4   rj  )r#  zCallable[_P, _R]r$  rh  r4   zCallable[..., _R])HÚ
__future__r   Útypingr   r   r   Útyping_extensionsr   r   r+   Útorch.utils._pytreerŸ   r    rP   Ú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   Úcollections.abcr   r   r   Útorch._functorch.pyfunctorchr   r   r   r   r   r    Úpy_implÚGradÚJvprE   r@   rr   rU   rˆ   r‘   r—   ÚVmapr¥   r¤   r»   r£   ÚFunctionalizerÀ   r½   rØ   rï   rÕ   rÊ   rÙ   r  r&  r(  r*  rQ  rŽ   r(   r'   ú<module>r|     s¸  ðÝ "ç 1Ñ 1ß 0ã ß $Ð $÷ó õ 'Ý H÷õ õ +Ý ;ñ ß<Ñ<çRáˆtƒ_€ÙˆTƒ]€ô8Ð(;ô 8ñ@ 9Ó:Ð ð< ×Ñ˜m×0Ñ0Ó1Ø×Ñ˜m×/Ñ/Ó0ð	Ø%ð	à4ð	ð ð	ð 	ò		ó 1ó 2ð	ð6Ø%ð6à4ð6ð 8ó6ðD €ð  ð5/Øð5/àð5/ð ð5/ð  ð	5/ð
 ð5/ð 	ó5/ôDˆzô ð
FØ4ðFà	óFóRð ×Ñ˜m×0Ñ0Ó1ð-Ø ð-à4ð-ð ð-ð ð	-ð
 	ò-ó 2ð-ð`2Ø ð2à%ð2ð 	ð2ð ð	2ð
 ð2ð 	ó2ójð@Ø ð@à4ð@ð ð@ð 	ó	@ð* ×Ñ˜m×9Ñ9Ó:ðKØ%ðKà4ðKð ðKð ð	Kð
 	òKó ;ðKð|Ø4ð|àð|ð ð|ð ð	|ð
 #ó|óB/÷~8ñ 8ô6	*˜*ô 	*ô-�Jô -ð8 37ðØ7ðà*ðð &ðð ð	ð
 -0ðð óðB 37ð9Ø#ð9àð9ð ð9ð ð	9ð
 -0ð9ð ó9ðx	Ø&ð	à.ð	ð ó	ôD.Ð/ô D.ñN 0Ó1Ð ÷5ò 5r(   