ó
    Eñi¥0  ã                   ó’   • S SK r S SKJr  S SKrS SKJs  Jr  S rS r	S r
S rS r\ R                  S 5       rS	 rS
 rS rS rS rg)é    N)Ú
namedtuplec                 ó.   ^ ^• [        T 5      mUU 4S jnU$ )Nc                  óŒ  >• TR                  S5      (       a#  TR                  S5      R                  nU" U 0 UD6$ TR                  S5      (       d  TR                  S5      (       aW  TR                  S5      (       a  SOSnUS:X  a  SOSnTR                  U5      R                  n[	        SU ST SU SU S3	5      eT" U 0 UD6$ )	NÚautogradÚsave_for_backwardÚbackwardzWe found a 'z' registration for ú at z but were unable to find a 'zÔ' registration. To use the CustomOp API to register a backward formula, please provide us both a backward function and a 'save for backward' function via `impl_backward` and `impl_save_for_backward` respectively.)Ú	_has_implÚ	_get_implÚfuncÚlocationÚRuntimeError)ÚargsÚkwargsÚkernelÚmissingÚfoundÚlocÚautograd_fallbackÚ	custom_ops         €€ÚV/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_custom_op/autograd.pyÚinnerÚ*autograd_kernel_indirection.<locals>.inner   så   ø€ Ø×Ñ˜z×*Ñ*Ø×(Ñ(¨Ó4×9Ñ9ˆFÙ˜4Ð* 6Ñ*Ð*ð
 ×ÑÐ2×3Ñ3°y×7JÑ7JÈ:×7VÑ7Và'0×':Ñ':¸:×'FÑ'FÑ#ÈJð ð ,3°jÓ+@Ñ'ÀjˆEØ×%Ñ% eÓ,×5Ñ5ˆCÜØ˜u˜gÐ%8¸¸À4Ø�%Ð3°G°9ð =9ð:óð ñ ! $Ð1¨&Ñ1Ð1ó    )Úautograd_not_implemented)r   r   r   s   ` @r   Úautograd_kernel_indirectionr      s   ù€ Ü0°Ó;Ðö2ð0 €Lr   c                 ó   ^ • U 4S jnU$ )Nc                  ó  >• [         R                  " 5       (       a)  [        R                  " S X45      (       a  [	        S5      e[         R
                  R                  5          T" U 0 UD6sS S S 5        $ ! , (       d  f       g = f)Nc                 ó\   • [        U [        R                  5      =(       a    U R                  $ ©N)Ú
isinstanceÚtorchÚTensorÚrequires_grad©Úxs    r   Ú<lambda>Ú:autograd_not_implemented.<locals>.kernel.<locals>.<lambda>6   s   € ”j ¤E§L¡LÓ1×E°a·o±oÐEr   z.Autograd has not been implemented for operator)r"   Úis_grad_enabledÚpytreeÚtree_anyr   Ú_CÚ_AutoDispatchBelowAutograd)r   r   r   s     €r   r   Ú(autograd_not_implemented.<locals>.kernel4   s`   ø€ Ü× Ò ×"Ñ"¤v§¢ÙEÈÀ~÷(
ñ (
ô ÐOÓPÐPÜ�X‰X×0Ñ0Õ2Ù˜dÐ- fÑ-÷ 3×2×2ús   Á#A5Á5
B© )r   r   s   ` r   r   r   3   s   ø€ õ.ð €Mr   c                 óF  • UGb  [        U[        5      (       d  U4nOUn[        U5      [        U5      :w  a#  [        S[        U5       S[        U5       35      e/ n[	        [        X#5      5       H•  u  nu  pg[        U[        R                  5      (       a  U(       d  UR                  U5        MA  [        U[        5      (       a  U(       d  UR                  U5        Mp  U(       d  My  [        SU SU S[        U5       S35      e   U(       a  U R                  " U6   g g g )Nz output_differentiability length z != output length zWith output_differentiability=z	. At idx z , we received an object of type za that is not a Tensor, so it cannot have be marked as differentiable in output_differentiability.)r!   ÚtupleÚlenÚAssertionErrorÚ	enumerateÚzipr"   r#   ÚappendÚlistÚextendr   ÚtypeÚmark_non_differentiable)ÚctxÚoutputÚoutput_differentiabilityÚtuple_outputÚnon_differentiable_tensorsÚidxÚdifferentiableÚouts           r   r:   r:   ?   s1  € ð  Ò+Ü˜&¤%×(Ñ(Ø"˜9‰Là!ˆLÜÐ'Ó(¬C°Ó,=Ó=Ü Ø2´3Ð7OÓ3PÐ2Qð R$Ü$'¨Ó$5Ð#6ð8óð ð &(Ð"Ü*3ÜÐ(Ó7ö+
Ñ&ˆCÑ&�.ô ˜#œuŸ|™|×,Ñ,Þ%Ø.×5Ñ5°cÔ:ÙÜ˜#œt×$Ñ$Þ%Ø.×5Ñ5°cÔ:Ùßˆ~Ü"Ø4Ð5MÐ4Nð OØ!˜UÐ"BÄ4ÈÃ9À+ð N0ð1óð ñ+
ö$ &Ø×'Ò'Ð)CÒDð &ð; ,r   c                 ó(   ^ ^^^^^• UUUUUU 4S jnU$ )Nc                  ó  >^^• [         R                  " U 5      u  nmS mU
UUUUU4S jnUU	U4S jn[        T	R                  S-   X#5      nUR                  " U6 nTc  [        S5      e[         R                  " [        U5      T5      $ )Nc                 óÎ  >• U R                  S5        [        R                  " [        U5      T5      n[        R
                  R                  5          T" U6 nS S S 5        [        T[        R                  " [        U5      5      n[        TU5      nT" UW5      n[        XU45        [        XT
5        [        R                  " U5      u  nm	[        U5      $ ! , (       d  f       N…= f)NT)Úset_materialize_gradsr*   Útree_unflattenr7   r"   r,   r-   Únamedtuple_argsÚtree_mapr9   Úsave_pytree_for_backwardr:   Útree_flattenr1   )r;   Ú	flat_argsr   r<   Ú	args_infoÚsave_for_backward_fn_inputsÚto_saveÚflat_outputÚop_overloadÚout_specr=   Úsave_for_backward_fnÚschemaÚspecs           €€€€€€r   ÚforwardÚ9construct_autograd_kernel.<locals>.apply.<locals>.forwardr   s¼   ø€ Ø×%Ñ% dÔ+Ü×(Ò(¬¨i«¸$Ó?ˆDÜ—‘×4Ñ4Õ6Ù$ dÐ+�÷ 7ô (¨´·²ÄÀdÓ0KÓLˆIä*9¸&À$Ó*GÐ'Ù*Ð+FÈÓOˆGä$ S°IÐ*>Ô?Ü# CÐ1IÔJô %+×$7Ò$7¸Ó$?Ñ!ˆK˜Ü˜Ó%Ð%÷ 7Õ6ús   ÁCÃ
C$c                 ó   >• T	c  [        S5      e[        R                  " [        U5      T	5      n[	        U 5      u  p4[        5       n[        U[        5      (       d  U4nT" XS/UQ76 n[        UTU5        [        Xd5      $ )Núout_spec is unexpectedly None)
r3   r*   rG   r7   Úunpack_savedÚobjectr!   r1   Úvalidate_grad_inputs_dictÚgrad_inputs_dict_to_flat_tuple)
r;   Úflat_grad_outputÚgradsÚsavedrM   Ú	inner_ctxÚgrad_inputs_dictÚbackward_fnr   rR   s
          €€€r   r   Ú:construct_autograd_kernel.<locals>.apply.<locals>.backward…   s‚   ø€ ØÑÜ$Ð%DÓEÐEÜ×)Ò)¬$Ð/?Ó*@À(ÓKˆEÜ+¨CÓ0ÑˆEô ›ˆIÜ˜e¤U×+Ñ+Ø˜�Ù*¨9ÐD¸eÒDÐô &Ð&6¸	À9ÔMÜ1Ð2BÓNÐNr   Ú	_customoprY   )r*   rK   Úgen_autograd_functionÚ_opnameÚapplyr3   rG   r7   )r   rL   rV   r   Úgenerated_clsrP   rR   rU   rc   r   rQ   r=   rS   rT   s         @@€€€€€€r   rh   Ú(construct_autograd_kernel.<locals>.applyn   s„   ú€ Ü ×-Ò-¨dÓ3‰ˆ	�4Øˆ÷	&ò 	&÷&	Oô" .Ø×Ñ Ñ+¨Wó
ˆð $×)Ò)¨9Ð5ˆØÑÜ Ð!@ÓAÐAÜ×$Ò$¤T¨+Ó%6¸ÓAÐAr   r/   )rT   r=   r   rQ   rS   rc   rh   s   `````` r   Úconstruct_autograd_kernelrk   f   s   ý€ ÷/Bò /Bðb €Lr   c                 ó|   • [        U [        R                  R                  4[	        U5      [	        U5      S.5      nU$ )N)rV   r   )r9   r"   r   ÚFunctionÚstaticmethod)ÚnamerV   r   ri   s       r   rf   rf   ¢   s<   € ÜØÜ	�‰×	 Ñ	 Ð"ä# GÓ,Ü$ XÓ.ñ	
ó€Mð Ðr   c                 ó´   • U R                   R                   Vs/ s H  oR                  PM     nn[        U R                  5      S-   n[	        X25      nU$ s  snf )NÚ_args)Ú	argumentsÚflat_allro   Ústrr   )rT   ÚargÚattribsro   Ú	tuple_clss        r   Únamedtuple_args_clsrx   ®   sN   € à#)×#3Ñ#3×#<Ò#<Ó=Ò#<˜C�xŒxÑ#<€GÐ=Üˆv�{‰{Ó˜gÑ%€Dä˜4Ó)€IØÐùò	 >s   ™Ac                 óz   • [        U[        5      (       d  [        S[        U5       35      e[	        U 5      nU" U6 $ )Nzexpected tuple, got )r!   r1   r3   r9   rx   )rT   r   rw   s      r   rH   rH   ·   s;   € Ü�dœE×"Ñ"ÜÐ3´D¸³J°<Ð@ÓAÐAÜ# FÓ+€IÙ�dÐÐr   c                 óÎ  ^• U4S jn[        U [        5      (       d  U" S[        U 5       35        TR                  R                  R
                   Vs1 s H0  nUR                  R                  5       (       d  M$  UR                  iM2     nnU R                  5       nXV:w  a  U" SU SU S35        U R                  5        GHœ  u  px[        X'5      n	[        U	[        5      (       Ga  [        U[        [        45      (       d  U" SU S[        U5       S35        [        U5      [        U	5      :w  a#  U" SU S	[        U	5       S
[        U5       35        [        [        X‰5      5       H{  u  n
u  p¼Uc  M  [        U[         R"                  5      (       d  U" SU S[        U5       SU
 35        [%        U[         R"                  5      (       a  Mg  U" SU SU
 SU
 SU	 35        M}     GM+  Uc  GM1  [        U[         R"                  5      (       d  U" S[        U5       SU S35        [%        U	[         R"                  5      (       a  GMŠ  U" SU SU SU	 S35        GMŸ     g s  snf )Nc                 ób   >• TR                  S5      n[        ST SUR                   SU  35      e)Nr   z%In the backward function defined for r	   z using the CustomOp API, )r   r   r   )Úwhatr   Ú
forward_ops     €r   ÚerrorÚ(validate_grad_inputs_dict.<locals>.error¿   sB   ø€ Ø×'Ñ'¨
Ó3ˆÜØ3°J°<¸tØ× Ñ Ð!Ð!:¸4¸&ðBó
ð 	
r   zBexpected the output of the backward function to be a dict but got z3expected the returned grad_input dict to have keys z	 but got zÖ. The backward function must return a gradient (can be None) for each arg to the CustomOp that may be a Tensor or Sequence[Tensor]. Args declared to be non-Tensor-like types should not appear in the grad_input dictzfor input 'zR' expected the grad_input dict to hold a list of gradients but got object of type Ú.z1' expected the grad_input dict to hold a list of z gradients but got z\' expected the grad_input dict to hold a list of None or Tensor gradients but got object of z
 at index z(', got a Tensor as the gradient for the z(-th value but expected None because the z(-th value was not a Tensor (it was type zgot object of type z as the gradient for input 'z:', but expected the gradient to be either None or a Tensorz(got a Tensor as the gradient for input 'z3' but expected None as the gradient because input 'z ' was not a Tensor (it was type z).)r!   Údictr9   Ú_schemarr   rs   Úis_tensor_likero   ÚkeysÚitemsÚgetattrr7   r1   r2   r4   r5   r"   r#   Ú
issubclass)rb   r}   rM   r~   ru   Úexpected_keysÚactual_keysro   ÚgradÚarg_infor@   ÚgÚinfos    `           r   r\   r\   ¾   sŠ  ø€ õ
ô Ð&¬×-Ñ-ÙðÜÐ(Ó)Ð*ð,ô	
ð ×%Ñ%×/Ñ/×8Ò8óâ8ˆCØ�8‰8×"Ñ"×$ó 	ˆ�ŒÙ8ð ð ð
 #×'Ñ'Ó)€KØÓ#ÙØAØˆo˜Y { mð 4%ð&ô	
ð '×,Ñ,×.‰
ˆÜ˜9Ó+ˆä�h¤×%Ò%Ü˜d¤U¬D M×2Ñ2ÙØ! $ ð (Gä˜D“z�l !ð%ôô
 �4‹yœC ›MÓ)ÙØ! $ ð (&Ü&)¨(£m _Ð4GÜ˜4“y�kð#ôô
 #,¬C°Ó,?Ö"@‘�‘Y�aØ‘9ÙÜ! !¤U§\¡\×2Ñ2ÙØ% d Vð ,%ä%)¨!£W I¨Z¸°uð>ôô
 " $¬¯©×5Ó5ÙØ% d Vð ,#Ø#& %ð (Ø"˜eð $ Ø (˜zð+öñ #Aò  à‰<ÚÜ˜$¤§¡×-Ñ-ÙØ%¤d¨4£j \ð 2Ø�6ð JðKôô
 ˜(¤E§L¡L×1Ô1ÙØ:¸4¸&ð A@Ø@D¸vð F1Ø19°
¸"ð>÷òW /ùò!s   Á#I"Á:I"c                 ó  • / nUR                  5       R                  5        HF  u  p4X0;  a)  UR                  [        R                  " S U5      5        M3  UR                  X   5        MH     [        [        R                  " U5      5      $ )Nc                 ó   • g r    r/   r%   s    r   r'   Ú0grad_inputs_dict_to_flat_tuple.<locals>.<lambda>  s   € °Dr   )Ú_asdictr…   r6   r*   rI   r1   Útree_leaves)rb   rM   Úresultro   r‹   s        r   r]   r]     sm   € Ø€FØ#×+Ñ+Ó-×3Ñ3Ö5‰ˆØÓ'Ø�M‰Mœ&Ÿ/š/©.¸(ÓCÔDÙØ�‰Ð&Ñ,Ö-ñ	 6ô
 ”×#Ò# FÓ+Ó,Ð,r   c                 óœ  • [         R                  " U5      u  p#[        U5      n[        U5       VVs/ s H(  u  pV[	        U[
        R                  5      (       d  M&  UPM*     nnn[        U5       VVs/ s H(  u  pV[	        U[
        R                  5      (       a  M&  UPM*     nnnU Vs/ s H&  n[	        U[
        R                  5      (       d  M$  UPM(     n	nU Vs/ s H&  n[	        U[
        R                  5      (       a  M$  UPM(     n
nX0l        X@l        U R                  " U	6   Xpl
        X l        X€l        g s  snnf s  snnf s  snf s  snf r    )r*   rK   r2   r4   r!   r"   r#   rU   Únum_eltsr   Útensor_idxsÚsaved_non_tensorsÚnon_tensor_idxs)r;   ÚstuffÚ
flat_stuffrU   r•   r@   Úthingr–   r˜   ÚtensorsÚnon_tensorss              r   rJ   rJ     s  € Ü×*Ò*¨5Ó1Ñ€JÜ�:‹€Hä'¨
Ô3ôÚ3‘
�´zÀ%ÌÏÉ×7V�Ñ3ð ñ ô
 $ JÔ/ôâ/‰JˆCÜ˜%¤§¡×.÷ 	Ù/ð ñ ñ
 #-ÓP¢*˜´
¸5Ä%Ç,Á,×0O�u¡*€GÐPÙ&0ÓX¢j˜U¼
À5Ì%Ï,É,×8W—5¡j€KÐXà„HØ„LØ×Ò˜7Ñ#Ø!„OØ'ÔØ)Õùó!ùóùò
 QùÚXs/   ²%D8ÁD8Á2%D>ÂD>Â(#EÃEÃ#E	ÄE	c                 ó  • S /U R                   -  n[        U R                  U R                  5       H	  u  p#X!U'   M     [        U R                  U R
                  5       H	  u  pCXAU'   M     [        R                  " XR                  5      nU$ r    )	r•   r5   Úsaved_tensorsr–   r—   r˜   r*   rG   rU   )r;   rš   Útensorr@   Ú
non_tensorr™   s         r   rZ   rZ   3  sv   € Ø�˜#Ÿ,™,Ñ&€JÜ˜3×,Ñ,¨c¯o©oÖ>‰ˆØ �3‹ñ ?ä˜s×4Ñ4°c×6IÑ6IÖJ‰ˆ
Ø$�3‹ñ Kä×!Ò! *¯h©hÓ7€EØ€Lr   )Ú	functoolsÚcollectionsr   r"   Útorch.utils._pytreeÚutilsÚ_pytreer*   r   r   r:   rk   rf   Ú	lru_cacherx   rH   r\   r]   rJ   rZ   r/   r   r   Ú<module>r¨      sf   ðã Ý "ã ß $Ð $òò@	ò$EòN9òx	ð ×Ññó ðòòMò`-ò*ó.r   