Ë
    P/æj]m  ã                   óˆ  — d dl mZ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  G d	„ d
e«      Z e«       Zej=                  ej>                  «      ej=                  ej@                  «      d„ «       «       Z!d„ Z"dZ#e#fd„Z$ G d„ de«      Z%d„ Z&d„ Z'ej=                  ejP                  «      d„ «       Z)d„ Z*d„ Z+ej=                  ejX                  «      d„ «       Z-d„ Z.d„ Z/ G d„ d«      Z0 G d„ de0«      Z1 G d„ de0«      Z2	 d$d„Z3	 d$d „Z4d!„ Z5 G d"„ d#e«      Z6 e6«       Z7y)%é    )ÚAnyÚ
NamedTupleÚTupleN)Ú_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                   ó*   ‡ — e Zd Zdˆ fd„Zˆ fd„Zˆ xZS )Ú!CustomFunctionHigherOrderOperatorc                 ó$   •— t         ‰| �  d«       y )NÚcustom_function_call©ÚsuperÚ__init__©ÚselfÚ	__class__s    €úe/root/repos/pocs/video-evals/.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   ©ÚreturnN©Ú__name__Ú
__module__Ú__qualname__r   r$   Ú__classcell__©r   s   @r   r   r       s   ø„ õ1÷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%   )Úinterpreterr&   ÚoperandsÚ	GeneratedÚflat_outs        r   Úcustom_function_call_gradr7   X   sA   € ô /¨{Ð<MÓN€IÜ	.Ó	0ñ .Ø"�9—?‘? HÐ-ˆ÷.à€O÷.à€Oús   —1±;c           
      ó(  ‡ ‡‡— ‰ j                  «       Šˆˆ ˆfd„}ˆfd„}ˆfd„}ˆfd„}‰j                  › d�}t        |t        j                  j
                  j                  ft        |«      t        |«      t        |«      t        |«      dœ«      }|S )Nc                  ón  •— 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 «       ˆfd„}t        || |«      S # 1 sw Y   Œ,xY w# 1 sw Y   Œ0xY w# 1 sw Y   Œ4xY w)Nc                 ó   •— t        | ‰«      S r    )r   )ÚxÚlevels    €r   ú<lambda>zAgenerate_single_level_function.<locals>.forward.<locals>.<lambda>f   s   ø€ Ô$4°Q¸Ó$>€ r   Tc                 ó   •— t        | ‰«      S r    )r   )Úoutputr<   s    €r   Úwrap_fnz@generate_single_level_function.<locals>.forward.<locals>.wrap_fnq   s   ø€ Ü! &¨%Ó0Ð0r   )	ÚpytreeÚtree_map_onlyr!   ÚTensorÚenable_gradr   Úlowerr   Ú!wrap_outputs_maintaining_identity)r4   Úunwrapped_operandsÚunwrapped_outputr@   r&   r3   r<   s       €€€r   Úforwardz/generate_single_level_function.<locals>.forwardd   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+Â+B4c                 ó*   •— ‰j                  | ||«      S r    )Úsetup_context)ÚctxÚinputsr?   r&   s      €r   rK   z5generate_single_level_function.<locals>.setup_contextx   s   ø€ Ø ×.Ñ.¨s°F¸FÓCÐCr   c                 ó.   •—  ‰j                   | g|¢­Ž }|S r    )Úbackward)rL   ÚgradsÚresultr&   s      €r   rO   z0generate_single_level_function.<locals>.backward|   s    ø€ Ø+Ð"×+Ñ+¨CÐ8°%Ò8ˆØˆr   c                 ó.   •—  ‰j                   | g|¢­Ž }|S r    )Újvp)rL   ÚtangentsrQ   r&   s      €r   rS   z+generate_single_level_function.<locals>.jvp�   s    ø€ Ø&Ð"×&Ñ& sÐ6¨XÒ6ˆØˆr   r5   )rI   rO   rS   rK   )r<   r,   Útyper!   ÚautogradÚfunctionÚ_SingleLevelFunctionÚstaticmethod)	r3   r&   rI   rK   rO   rS   Únamer5   r<   s	   ``      @r   r2   r2   a   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  }|r9t        ||«      }|€+t        d|› dt        j                  |«      d   › d|› d�«      ‚t        |
«      D ]‘  \  }}t        |t        j                  «      s|j                  |«       Œ2t        |«      |	v r|j                  |	t        |«         «       Œ]|r|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.html)rA   Úarg_tree_leavesÚzipÚidÚtree_flattenÚNO_OUT_DIMSr   ÚRuntimeErrorÚ	enumerateÚ
isinstancer!   rC   ÚappendÚtree_unflatten)ÚoutputsÚunwrapped_inputsÚorig_inputsr@   Úout_dimsÚflat_unwrapped_inputsÚflat_orig_inputsÚ	unwrappedÚorigÚunwrapped_input_to_orig_inputÚflat_outputsÚspecrQ   Úout_dims_specifiedÚflat_out_dimsÚir?   s                    r   rF   rF   §   s‡  € ô #×2Ñ2Ð4DÐEÐÜ×-Ñ-¨{Ð;Ðô  #Ð#8Ð:JÓK÷%áˆI�tô 	ˆ9‹�tÑð%Ð!ñ %ô
  ×,Ñ,¨WÓ5Ñ€L�$Ø€Fà!¤[Ñ0ÐáÜ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ØÙØ�M‰M™' &¨-¸Ñ*:Ó;Õ<à�M‰M™' &›/Õ*ð
+ô × Ñ  ¨Ó.Ð.ùóM%s   ´E c                   ó"   — e Zd ZU eed<   eed<   y)ÚVmapInfoÚ
batch_sizeÚ
randomnessN)r,   r-   r.   ÚintÚ__annotations__Ústr© r   r   rv   rv      s   … ØƒOØ„Or   rv   c                 ób   — | j                   t        j                  j                  j                   uS r    )r
   r!   rV   ÚFunction)r&   s    r   Úhas_overriden_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)rd   Útuplerb   rU   Úlen)rQ   Ú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    )rd   r!   rC   )Ú.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 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Ú_pytreer`   ÚNotImplementedErrorÚgenerate_vmap_ruler   rb   r,   Ú'custom_function_call_vmap_generate_ruleÚ custom_function_call_vmap_helperr
   )r3   r&   r4   r(   s       r   Úcustom_function_call_vmapr’     s  € ä
ñ ä—;‘;×&Ñ&×3Ñ3°FÓ;¸AÑ>ôô ô "ðà�8ðó
ð 	
ð ×+Ò+Ü"Ð#4Ô5ô Ø)Ð*;×*DÑ*DÐ)Eð FJð Kóð ô 7ØÐ*ð
Ø-5ò
ð 	
ô #Ð#4Ô5ô Ø%Ð&7×&@Ñ&@Ð%Að BFð Gó
ð 	
ô ,ØÐ&×+Ñ+Ð->ðØAIòØMSñð r   c                 óR  ‡— | j                  «       Št        | j                  «       | j                  «       ¬«      }t	        |‰«      \  }}t        j                  d„ |«      re| j                  «       5  t        |t        j                  j                  j                  «      rt        |g|¢­Ž cd d d «       S  ||i |¤Žcd d d «       S | j                  «       5   |||g|¢­i |¤Ž}d d d «       t        «       |\  }	}
ˆfd„}t        |	||||
¬«      S # 1 sw Y   ŒTxY w# 1 sw Y   Œ:xY w)N)rw   rx   c                 ó
   — | d u S r    r|   )Údims    r   r=   z2custom_function_call_vmap_helper.<locals>.<lambda>L  s
   €  3¨$ ;€ r   c                 ó&   •— |€| S t        | |‰«      S r    )r   )r?   Úout_dimr   s     €r   r@   z1custom_function_call_vmap_helper.<locals>.wrap_fnY  s'   ø€ ð ˆð ð	
ô   ¨°Ó?ð	
r   )rj   )r<   rv   rw   rx   r   rA   Útree_allrE   rd   r!   rV   rW   ÚFunctionMetar   r…   rF   )r3   Úvmap_functionÚopr4   r(   ÚinforG   Úin_dimsrQ   rH   rj   r@   r   s               @r   r‘   r‘   @  s1  ø€ ð  ×%Ñ%Ó'€MÜØ×)Ñ)Ó+Ø×)Ñ)Ó+ô€Dô #1°¸=Ó"IÑÐ˜ô ‡�Ñ.°Ô8Ø×ÑÓ ñ 	/Ü˜"œeŸn™n×5Ñ5×BÑBÔCÜ+¨BÐ:°Ò:÷	/ñ 	/ñ ˜8Ð. vÑ.÷		/ñ 	/ð 
×	Ñ	Ó	ñ MÙ˜t WÐLÐ/AÒLÀVÑLˆ÷Mä/°Ô7Ø!'ÑÐ�hô
ô -ØÐ,¨h¸È(ôð ÷'	/ð 	/ú÷Mð Mús   Á1:DÂ5DÃDÄDÄD&c                 ó<  — t        || j                  «       «      \  }}t        ||| j                  «       | j	                  «       «      \  }}| j                  «       5  t        |g|¢­Ž }d d d «        |«       }t        || j                  «       «      S # 1 sw Y   Œ+xY wr    )r   r<   Úvmapify_autograd_functionrw   rx   rE   r   r   )	r3   r&   r4   rG   r�   Úvmapped_functionÚget_out_dimsr?   rj   s	            r   r�   r�   e  s¡   € Ü"0°¸;×;LÑ;LÓ;NÓ"OÑÐ˜Ü%>Ø˜7 K×$:Ñ$:Ó$<¸k×>TÑ>TÓ>Vó&Ñ"Ð�lð 
×	Ñ	Ó	ñ MÜ%Ð&6ÐLÐ9KÒLˆ÷Mñ ‹~€HÜ˜ ¨+×*;Ñ*;Ó*=Ó>Ð>÷	Mð Mús   ÁBÂBc                 ó   — t        d«      ‚)Nz0NYI: Functionalize rule for custom_function_call)rb   )r3   r&   r�   r4   s       r   Ú"custom_function_call_functionalizer£   r  s   € ô ÐIÓ
JÐJr   c           
      óJ  ‡ ‡‡‡‡‡‡‡— dŠ‰Š‰Š‰Šˆ ˆˆˆˆfd„}ˆ ˆˆˆˆˆˆfd„}ˆ ˆˆˆˆˆˆfd„}ˆ ˆˆˆˆˆˆˆfd„}d‰ j                   › �}t        |t        j                  j                  ft        |«      t        |«      t        |«      t        |«      ddœ«      }	ˆˆfd	„}
|	|
fS )
Nznot populatedc                  óD   •—  t        ‰j                  ‰‰‰«      | Ž \  }Š|S r    )r   rI   )r4   rg   r&   rw   r�   rj   rx   s     €€€€€r   rI   z*vmapify_autograd_function.<locals>.forward‡  s4   ø€ ð
œLØ×%Ñ% w°
¸Jó
àðÑˆ�ð ˆr   c                 óZ   •‡ ‡‡— d Šd Šˆˆ ˆˆfd„} t        |‰‰
f‰‰«      ||«       ‰Š	‰Šy )Nc                 ó�   •— t        ‰t        «       «      }‰j                  || |«       t        d„ | D «       «      Š|j                  Šy )Nc              3   ól   K  — | ],  }t        |t        j                  «      r|j                  nd –— Œ. y ­wr    )rd   r!   rC   Úshape)rˆ   Úinps     r   rŠ   zRvmapify_autograd_function.<locals>.setup_context.<locals>.inner.<locals>.<genexpr>Ÿ  s+   è ø€ ò "ØILœZ¨¬U¯\©\Ô:�—	’	ÀÓDñ"ùs   ‚24)ÚCtxCustomSaver   rK   r‚   Ú_pt_saved_tensors_bdims)rM   rg   Úwrapped_ctxr&   rL   Úinput_shapes_Úsaved_tensors_bdims_s      €€€€r   Úinnerz?vmapify_autograd_function.<locals>.setup_context.<locals>.inner’  sL   ø€ ô
 (¨¬]«_Ó=ˆKØ×+Ñ+¨K¸ÀÔIô "ñ "ØPVô"ó ˆMð $/×#FÑ#FÑ r   )r   )rL   rM   rg   r°   r®   r¯   r&   rw   r�   Úinput_shapesrj   rx   Úsaved_tensors_bdimss   `   @@€€€€€€€r   rK   z0vmapify_autograd_function.<locals>.setup_contextŽ  sJ   û€ ØˆØ#Ð÷	Gð(	
ŒØØ�hÐØØó		
ð
 �'ô	ð %ˆà2Ñr   c                 ó®   •‡ — ‰‰
k7  sJ ‚‰‰
k7  sJ ‚ˆˆ fd„}t        ‰	|«      } t        |‰|f‰‰«      ‰ j                  |«      \  }}t        ||‰‰«      }|S )Nc                 óB   •— t        ‰| «      } ‰j                  |g|¢­Ž S r    )ÚCtxWithSavedTensorsrS   )Úsaved_tensorsrT   r­   r&   rL   s      €€r   Újvp_no_contextz>vmapify_autograd_function.<locals>.jvp.<locals>.jvp_no_context¶  s(   ø€ Ü-¨c°=ÓAˆKØ(Ð$×(Ñ(¨Ð@°xÒ@Ð@r   )Úget_tangents_in_dimsr   r¶   Ú	reductify)rL   rT   r·   Útangent_in_dimsÚout_tangentsÚout_tangents_dimsrQ   r&   rw   r�   Úinit_valrj   rx   r²   s   `      €€€€€€€r   rS   z&vmapify_autograd_function.<locals>.jvp²  s‚   ù€ Ø˜8Ò#Ð#Ð#Ø" hÒ.Ð.Ð.õ	Aô /¨w¸ÓAˆð+
¬,ØØ  /Ð2ØØó	+
ð
 ×
Ñ
˜Xó+'Ñ'ˆÐ'ô ˜<Ð):¸HÀjÓQˆØˆr   c                 óª   •‡ — ‰‰	k7  sJ ‚‰
‰	k7  sJ ‚‰‰	k7  sJ ‚ˆˆ fd„} t        |‰‰ff‰‰«      ‰ j                  |f«      \  }}t        ||‰‰‰
«      }|S )Nc                 óL   •— | \  }}t        ‰|«      } ‰j                  |g|¢­Ž S r    )rµ   rO   )rM   r¶   Úgrad_outputsr­   r&   rL   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¶   r¹   )rL   rÀ   rÁ   Úgrad_insÚgrad_ins_dimsrQ   r&   rw   r�   r½   r±   rj   rx   r²   s   `     €€€€€€€€r   rO   z+vmapify_autograd_function.<locals>.backwardÅ  sˆ   ù€ Ø˜8Ò#Ð#Ð#Ø˜xÒ'Ð'Ð'Ø" hÒ.Ð.Ð.õ	Jð
#
¤,ØØ! 8Ð,Ð.ØØó	#
ð
 ×Ñ˜lÐ
+ó#-Ñˆ�-ô ˜8 ]°G¸ZÈÓVˆØˆr   ÚVmappedT)rI   rO   rS   rK   r�   c                  ó   •— ‰‰ k7  sJ ‚‰S r    r|   )r½   rj   s   €€r   r¡   z/vmapify_autograd_function.<locals>.get_out_dimså  s   ø€ Ø˜8Ò#Ð#Ð#Øˆr   )r,   rU   r!   rV   r~   rY   )r&   r�   rw   rx   rI   rK   rS   rO   rZ   r5   r¡   r½   r±   rj   r²   s   ````       @@@@r   rŸ   rŸ   y  s°   ÿ€ ð €HØ€HØ €LØ'Ð÷ð ÷"3ò "3÷Hò ÷&ó ð& Ð&×/Ñ/Ð0Ð1€DÜØÜ	�‰×	 Ñ	 Ð"ä# GÓ,Ü$ XÓ.Ü Ó$Ü)¨-Ó8Ø"&ñ	
ó
€Iõð �lÐ"Ð"r   c                 óÒ   — t        j                  | «      \  }}t        j                  |Ž }t        ||«      D ��cg c]  \  }}|€d n|‘Œ }}}t        j                  ||«      S c c}}w r    )rA   r`   r]   r^   rf   )Ú
input_dimsrT   Úflat_in_dimsrq   Úflat_tangentsÚin_dimÚtangentrQ   s           r   r¸   r¸   î  st   € Ü×,Ñ,¨ZÓ8Ñ€L�$Ü×*Ñ*¨HÐ5€Mô  # <°Ó?÷áˆF�Gð �‰ VÑ+ð€Fñ ô × Ñ  ¨Ó.Ð.ùó	s   ºA#c                   ó8   — e Zd ZU dZeedf   ed<   d„ Zd„ Zd„ Z	y)Ú
WrappedCtx)Ú_pt_reserved_attrsÚ_pt_inner_ctx.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.)rd   rÍ   rU   rÎ   Úhasattrrb   rÏ   )r   rL   Úreserved_attrsrZ   s       r   r   zWrappedCtx.__init__0  s`   € Ü˜#œzÔ*Ü! $›Z×:Ñ:ˆNØ&ò �Ü˜s DÔ)ØÜ"Ø+¨NÐ+;ð <!ð !óð ðð !ˆÕr   c                 ó.   — t        | j                  |«      S r    )ÚgetattrrÏ   )r   rZ   s     r   Ú__getattr__zWrappedCtx.__getattr__=  s   € Ü�t×)Ñ)¨4Ó0Ð0r   c                 ó~   — |t        | «      j                  v r|| j                  |<   y t        | j                  ||«      S r    )rU   rÎ   Ú__dict__ÚsetattrrÏ   )r   rZ   Úvalues      r   Ú__setattr__zWrappedCtx.__setattr__@  s:   € Ø”4˜“:×0Ñ0Ñ0Ø"'ˆD�M‰M˜$ÑØÜ�t×)Ñ)¨4°Ó7Ð7r   N)
r,   r-   r.   rÎ   r   r{   rz   r   rÕ   rÚ   r|   r   r   rÍ   rÍ   -  s$   … Ø*QÐ˜˜c 3˜h™ÓQò!ò1ó8r   rÍ   c                   óN   ‡ — e Zd Zdgej                  ¢­Zˆ fd„Zed„ «       Zˆ xZS )rµ   Ú_pt_new_saved_tensorsc                 ó2   •— t         ‰| �  |«       || _        y r    )r   r   rÜ   )r   rL   Únew_saved_tensorsr   s      €r   r   zCtxWithSavedTensors.__init__K  s   ø€ Ü‰Ñ˜ÔØ%6ˆÕ"r   c                 ó   — | j                   S r    )rÜ   )r   s    r   r¶   z!CtxWithSavedTensors.saved_tensorsO  s   € à×)Ñ)Ð)r   )	r,   r-   r.   rÍ   rÎ   r   Úpropertyr¶   r/   r0   s   @r   rµ   rµ   H  s0   ø„ Ø1ÐR°J×4QÑ4QÑRÐô7ð ñ*ó ô*r   rµ   c                   óL   ‡ — e Zd Zddgej                  ¢­Zˆ fd„Zd„ Zd„ Zˆ xZS )r«   r¬   Ú_pt_current_levelc                 ó@   •— t         ‰| �  |«       d| _        || _        y )Nr|   )r   r   r¬   râ   )r   rL   r   r   s      €r   r   zCtxCustomSave.__init__[  s    ø€ Ü‰Ñ˜ÔØ')ˆÔ$Ø!.ˆÕ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_forwarde  s9   € Ü#1°'¸4×;QÑ;QÓ#RÑ Ð˜5Ø+ˆ×Ñ×+Ñ+Ð->Ñ?Ø',ˆÕ$r   )	r,   r-   r.   rÍ   rÎ   r   rå   rë   r/   r0   s   @r   r«   r«   T  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_ishaperw   s        €r   rŠ   zreductify.<locals>.<genexpr>{  s.   øè ø€ ò á-ˆB�˜ ô 	�r˜7 F¨J¸×Eñùs   ƒ!)rd   r‚   rƒ   r^   )Ú
grad_inputÚgrad_input_bdimÚ
input_bdimrw   Ú&target_shape_without_bdim_to_reduce_torQ   s      `  r   r¹   r¹   k  s}   ø€ ô �j¤%Ô(Ø �]ˆ
Ü�o¤uÔ-Ø*Ð,ˆÜ�j¤%Ô(Ø �]ˆ
à-Ð5Ü14°Z³À7Ñ1JÐ.Üó ä14ØØØØ2ó	2
ôó €Fð €Mr   c                 óZ  — | €y |€|€| S |�|€| j                  |«      S |€J ‚|€>| j                  |«      } t        | j                  «      }|||<   | j	                  |«      } |}|�/ t        t        j                  j                  |d f|¬«      | |«      S ||k7  r| j                  ||«      } | S )N)r�   rj   )
ÚsumÚ	unsqueezeÚlistr©   Úexpandr
   r!   rC   Úsum_to_sizeÚmovedim)ró   rô   rõ   rw   rö   Ú	new_shapes         r   rî   rî   ‡  sé   € ð ÐØàÐ :Ð#5ØÐàÐ" zÐ'9Ø�~‰~˜oÓ.Ð.ð0 Ð!Ð!Ð!àÐØ×)Ñ)¨*Ó5ˆ
Ü˜×)Ñ)Ó*ˆ	Ø *ˆ	�*ÑØ×&Ñ& yÓ1ˆ
Ø$ˆà-Ð9ð
ŒtÜ�L‰L×$Ñ$Ø$ dÐ+Øô
ð Ð<ó	>ð 	>ð �_Ò$Ø×'Ñ'¨¸ÓDˆ
ØÐr   c                 ó   ‡ ‡— ˆ ˆfd„}|S )Nc                 ó,   •—  ‰|i |¤Ž} ‰| ||«       |S r    r|   )rL   r'   r(   r?   Ú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  r  r  s   `` r   Ú#autograd_function_forward_rewrittenr  Â  s   ù€ õð
 Ðr   c                   ó&   ‡ — e Zd Zdˆ fd„Z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 Š
|d   }|d   Š	t        |«      }‰d | } G ˆˆˆˆ	ˆ
fd„dt        j                  j                  «      } |j                  |Ž S )NÚargs_tensor_maskÚnon_differentiable_idxc                   ó>   •— e Zd Zeˆˆˆˆfd„«       Zeˆ ˆfd„«       Zy)ú5AutogradFunctionApply.__call__.<locals>.ApplyTemplatec                 ó°   •—  ‰d g‰¢­Ž \  }Š	t        ‰«      dkD  r:g }t        |«      D ]  \  }}|‰v sŒ|j                  |«       Œ  | j                  |Ž  |S )Nr   )rƒ   rc   re   Úmark_non_differentiable)
rL   r'   r?   Únon_differentiable_outputrt   r;   ÚfwdÚfwd_argsr  Úsaved_valuess
         €€€€r   rI   z=AutogradFunctionApply.__call__.<locals>.ApplyTemplate.forwardÚ  sx   ø€ ñ (+¨4Ð';°(Ò';Ñ$�˜ô Ð-Ó.°Ò2Ø02Ð-Ü )¨&Ó 1ò @™˜˜1ØÐ 6Ò6Ø5×<Ñ<¸QÕ?ð@ð 0�C×/Ñ/Ð1JÑKà�r   c                 ó   •—  ‰d g|¢‰¢­Ž S r    r|   )rL   ÚgradÚbwdr  s     €€r   rO   z>AutogradFunctionApply.__call__.<locals>.ApplyTemplate.backwardé  s   ø€ á˜4Ð6 $Ð6¨Ò6Ð6r   N)r,   r-   r.   rY   rI   rO   )r  r  r  r  r  s   €€€€€r   ÚApplyTemplater  Ù  s)   ø„ Øöó ðð ô7ó ñ7r   r  )rø   r!   rV   r~   r%   )r   r  r  r  Ú
fwd_kwargsr
  Úlength_of_tensor_argsÚnew_fwd_argsr  r  r  s    ```     @@r   r$   zAutogradFunctionApply.__call__Ï  sl   ü€ ØˆØ%Ð&8Ñ9ÐØ!+Ð,DÑ!EÐÜ #Ð$4Ó 5Ðð  Ð 6Ð!6Ð7ˆ÷	7ò 	7œEŸN™N×3Ñ3ô 	7ð( #ˆ}×"Ñ" LÐ1Ð1r   r)   r+   r0   s   @r   r  r  Ë  s   ø„ õ4ö2r   r  r    )8Útypingr   r   r   r!   Útorch.utils._pytreerŒ   r�   rA   Ú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ÚJvpr7   r2   ra   rF   rv   r   r…   ÚVmapr’   r‘   r�   ÚFunctionalizer£   rŸ   r¸   rÍ   rµ   r«   r¹   rî   r  r  r  r|   r   r   ú<module>r(     sz  ðç )Ñ )ã ß $Ð $÷ó õ 'Ý H÷õ õ +Ý ;ô8Ð(;ô 8ñ4 9Ó:Ð ð< ×Ñ˜m×0Ñ0Ó1Ø×Ñ˜m×/Ñ/Ó0ñó 1ó 2ðò3ð~ €ð ?Jó,/ôrˆzô ò
FòRð ×Ñ˜m×0Ñ0Ó1ñ(ó 2ð(òV"òJ
?ð ×Ñ˜m×9Ñ9Ó:ñKó ;ðKòp#òj/÷~8ñ 8ô6	*˜*ô 	*ô-�Jô -ð8 ,0óðB ,0ó8òvô"2Ð/ô "2ñJ 0Ó1Ñ r   