§
    ž²Åj=/  ã                   ó�   — d dl Z d dlmc mZ d dlmZ d dlZd„ Zd„ Z	d„ Z
d„ Zd„ Zej        d„ ¦   «         Zd	„ Zd
„ Zd„ Zd„ Zd„ ZdS )é    N)Ú
namedtuplec                 ó4   ‡ ‡— t          ‰ ¦  «        Šˆˆ fd„}|S )Nc                  óˆ  •— ‰                      d¦  «        r"‰                     d¦  «        j        } || i |¤ŽS ‰                      d¦  «        s‰                      d¦  «        rY‰                      d¦  «        rdnd}|dk    rdnd}‰                     |¦  «        j        }t	          d|› d‰› d|› d|› d�	¦  «        ‚ ‰| i |¤ŽS )	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         €€úJC:\Projects\Historical\venv\Lib\site-packages\torch/_custom_op/autograd.pyÚinnerz*autograd_kernel_indirection.<locals>.inner   s)  ø€ Ø×Ò˜zÑ*Ô*ð 	+Ø×(Ò(¨Ñ4Ô4Ô9ˆFØ�6˜4Ð* 6Ð*Ð*Ð*ð
 ×ÒÐ2Ñ3Ô3ð 	;°y×7JÒ7JÈ:Ñ7VÔ7Vð 	;à'0×':Ò':¸:Ñ'FÔ'Fð  Ð#Ð#Øð ð ,3°jÒ+@Ð+@Ð'Ð'ÀjˆEØ×%Ò% eÑ,Ô,Ô5ˆCÝð:˜uð :ð :¸ð :ð :Øð:ð :Ø4;ð:ð :ð :ñ;ô ;ð ;ð !Ð  $Ð1¨&Ð1Ð1Ð1ó    )Úautograd_not_implemented)r   r   r   s   ` @r   Úautograd_kernel_indirectionr      s7   øø€ Ý0°Ñ;Ô;Ðð2ð 2ð 2ð 2ð 2ð 2ð. €Lr   c                 ó   ‡ — ˆ fd„}|S )Nc                  óø   •— t          j        ¦   «         r't          j        d„ | |f¦  «        rt	          d¦  «        ‚t           j                             ¦   «         5   ‰| i |¤Žcd d d ¦  «         S # 1 swxY w Y   d S )Nc                 óD   — t          | t          j        ¦  «        o| j        S ©N)Ú
isinstanceÚtorchÚTensorÚrequires_grad©Úxs    r   ú<lambda>z:autograd_not_implemented.<locals>.kernel.<locals>.<lambda>4   s   € •j ¥E¤LÑ1Ô1ÐE°a´o€ r   z.Autograd has not been implemented for operator)r!   Úis_grad_enabledÚpytreeÚtree_anyr   Ú_CÚ_AutoDispatchBelowAutograd)r   r   r   s     €r   r   z(autograd_not_implemented.<locals>.kernel2   sÐ   ø€ ÝÔ Ñ"Ô"ð 	Q¥v¤ØEÐEÈÈfÀ~ñ(
ô (
ð 	Qõ ÐOÑPÔPÐPÝŒX×0Ò0Ñ2Ô2ð 	.ð 	.Ø�9˜dÐ- fÐ-Ð-ð	.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   ÁA/Á/A3Á6A3© )r   r   s   ` r   r   r   1   s#   ø€ ð.ð .ð .ð .ð .ð €Mr   c                 ó  — |�út          |t          ¦  «        s|f}n|}t          |¦  «        t          |¦  «        k    sJ ‚g }t          t	          ||¦  «        ¦  «        D ]�\  }\  }}t          |t
          j        ¦  «        r|s|                     |¦  «         Œ:t          |t          ¦  «        r|s| 	                    |¦  «         Œg|r&t          d|› d|› dt          |¦  «        › d�¦  «        ‚Œ�|r | j        |Ž  d S d S d S )Nz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Ú	enumerateÚzipr!   r"   ÚappendÚlistÚextendr   ÚtypeÚmark_non_differentiable)ÚctxÚoutputÚoutput_differentiabilityÚtuple_outputÚnon_differentiable_tensorsÚidxÚdifferentiableÚouts           r   r6   r6   <   so  € ð  Ð+Ý˜&¥%Ñ(Ô(ð 	"Ø"˜9ˆLˆLà!ˆLÝÐ+Ñ,Ô,µ°LÑ0AÔ0AÒAÐAÐAÐAØ%'Ð"Ý*3µCÐ8PÐR^Ñ4_Ô4_Ñ*`Ô*`ð 	2ð 	2Ñ&ˆCÑ&�. #Ý˜#�uœ|Ñ,Ô,ð Ø%ð ;Ø.×5Ò5°cÑ:Ô:Ð:ØÝ˜#�tÑ$Ô$ð Ø%ð ;Ø.×5Ò5°cÑ:Ô:Ð:ØØð 2Ý"ð1Ð5Mð 1ð 1Ø!ð1ð 1ÝCGÈÁ9Ä9ð1ð 1ð 1ñ2ô 2ð 2ð2ð &ð 	EØ'ˆCÔ'Ð)CÐDÐDÐDÐDð/ ,Ð+ð,	Eð 	Er   c                 ó&   ‡ ‡‡‡‡‡— ˆˆˆˆˆˆ fd„}|S )Nc                  óî   •‡‡— t          j        | ¦  «        \  }Šd Šˆ
ˆˆˆˆˆfd„}ˆˆ	ˆfd„}t          ‰	j        dz   ||¦  «        } |j        |Ž }‰€J ‚t          j        t          |¦  «        ‰¦  «        S )Nc                 ó  •— |                       d¦  «         t          j        t          |¦  «        ‰¦  «        }t          j                             ¦   «         5   ‰|Ž }d d d ¦  «         n# 1 swxY w Y   t          ‰t          j        t          |¦  «        ¦  «        }t          ‰|¦  «        } ‰||¦  «        }t          | ||f¦  «         t          | |‰
¦  «         t          j        |¦  «        \  }Š	t          |¦  «        S )NT)Úset_materialize_gradsr(   Útree_unflattenr3   r!   r*   r+   Únamedtuple_argsÚtree_mapr5   Úsave_pytree_for_backwardr6   Útree_flattenr.   )r7   Ú	flat_argsr   r8   Ú	args_infoÚsave_for_backward_fn_inputsÚto_saveÚflat_outputÚop_overloadÚout_specr9   Úsave_for_backward_fnÚschemaÚspecs           €€€€€€r   Úforwardz9construct_autograd_kernel.<locals>.apply.<locals>.forwardh   s8  ø€ Ø×%Ò% dÑ+Ô+Ð+ÝÔ(­¨i©¬¸$Ñ?Ô?ˆDÝ”×4Ò4Ñ6Ô6ð ,ð ,Ø$˜ dÐ+�ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,õ (Ø�œ­¨dÑ3Ô3ñ5ô 5ˆIõ +:¸&À$Ñ*GÔ*GÐ'Ø*Ð*Ð+FÈÑOÔOˆGå$ S¨7°IÐ*>Ñ?Ô?Ð?Ý# C¨Ð1IÑJÔJÐJõ %+Ô$7¸Ñ$?Ô$?Ñ!ˆK˜Ý˜Ñ%Ô%Ð%s   ÁA)Á)A-Á0A-c                 ó  •— ‰	€J ‚t          j        t          |¦  «        ‰	¦  «        }t          | ¦  «        \  }}t	          ¦   «         }t          |t          ¦  «        s|f} ‰||g|¢R Ž }t          |‰|¦  «         t          ||¦  «        S r   )	r(   rC   r3   Úunpack_savedÚobjectr    r.   Úvalidate_grad_inputs_dictÚgrad_inputs_dict_to_flat_tuple)
r7   Úflat_grad_outputÚgradsÚsavedrI   Ú	inner_ctxÚgrad_inputs_dictÚbackward_fnr   rN   s
          €€€r   r   z:construct_autograd_kernel.<locals>.apply.<locals>.backward|   s    ø€ ØÐ'Ð'Ð'ÝÔ)­$Ð/?Ñ*@Ô*@À(ÑKÔKˆEÝ+¨CÑ0Ô0ÑˆE�9õ ™œˆIÝ˜e¥UÑ+Ô+ð !Ø˜�Ø*˜{¨9°eÐD¸eÐDÐDÐDÐõ &Ð&6¸	À9ÑMÔMÐMÝ1Ð2BÀIÑNÔNÐNr   Ú	_customop)r(   rG   Úgen_autograd_functionÚ_opnameÚapplyrC   r3   )r   rH   rR   r   Úgenerated_clsrL   rN   rQ   r]   r   rM   r9   rO   rP   s         @@€€€€€€r   ra   z(construct_autograd_kernel.<locals>.applyd   sÔ   øøø€ Ý Ô-¨dÑ3Ô3‰ˆ	�4Øˆð	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð(	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oõ  .ØÔ Ñ+¨W°hñ@ô @ˆð *�mÔ)¨9Ð5ˆØÐ#Ð#Ð#ÝÔ$¥T¨+Ñ%6Ô%6¸ÑAÔAÐAr   r,   )rP   r9   r   rM   rO   r]   ra   s   `````` r   Úconstruct_autograd_kernelrc   \   sL   øøøøøø€ ð-Bð -Bð -Bð -Bð -Bð -Bð -Bð -Bð -Bð -Bð\ €Lr   c                 ó‚   — t          | t          j        j        ft	          |¦  «        t	          |¦  «        dœ¦  «        }|S )N)rR   r   )r5   r!   r   ÚFunctionÚstaticmethod)ÚnamerR   r   rb   s       r   r_   r_   •   sG   € ÝØÝ	ŒÔ	 Ð"å# GÑ,Ô,Ý$ XÑ.Ô.ð	
ð 	
ñô €Mð Ðr   c                 ó€   — d„ | j         j        D ¦   «         }t          | j        ¦  «        dz   }t	          ||¦  «        }|S )Nc                 ó   — g | ]	}|j         ‘Œ
S r,   )rg   ©Ú.0Úargs     r   ú
<listcomp>z'namedtuple_args_cls.<locals>.<listcomp>£   s   € Ð=Ð=Ð=˜CˆsŒxÐ=Ð=Ð=r   Ú_args)Ú	argumentsÚflat_allÚstrrg   r   )rP   Úattribsrg   Ú	tuple_clss       r   Únamedtuple_args_clsrt   ¡   sD   € à=Ð= 6Ô#3Ô#<Ð=Ñ=Ô=€GÝˆvŒ{ÑÔ˜gÑ%€Då˜4 Ñ)Ô)€IØÐr   c                 óX   — t          |t          ¦  «        sJ ‚t          | ¦  «        } ||Ž S r   )r    r.   rt   )rP   r   rs   s      r   rD   rD   ª   s2   € Ý�d�EÑ"Ô"Ð"Ð"Ð"Ý# FÑ+Ô+€IØˆ9�dÐÐr   c                 óœ  ‡— ˆfd„}t          | t          ¦  «        s |dt          | ¦  «        › �¦  «         d„ ‰j        j        j        D ¦   «         }|                      ¦   «         }||k    r |d|› d|› d�¦  «         |                      ¦   «         D �]¸\  }}t          ||¦  «        }t          |t          ¦  «        �r t          |t          t          f¦  «        s |d|› dt          |¦  «        › d	�¦  «         t          |¦  «        t          |¦  «        k    s. |d|› d
t          |¦  «        › dt          |¦  «        › �¦  «         t          t          ||¦  «        ¦  «        D ]w\  }	\  }
}|
€Œt          |
t          j        ¦  «        s! |d|› dt          |
¦  «        › d|	› �¦  «         t!          |t          j        ¦  «        s |d|› d|	› d|	› d|› �¦  «         Œx�ŒL|€�ŒPt          |t          j        ¦  «        s |dt          |¦  «        › d|› d�¦  «         t!          |t          j        ¦  «        s |d|› d|› d|› d�¦  «         �Œºd S )Nc                 óh   •— ‰                      d¦  «        }t          d‰› d|j        › d| › �¦  «        ‚)Nr   z%In the backward function defined for r	   z using the CustomOp API, )r   r   r   )Úwhatr   Ú
forward_ops     €r   Úerrorz(validate_grad_inputs_dict.<locals>.error±   s`   ø€ Ø×'Ò'¨
Ñ3Ô3ˆÝðB°Jð Bð BØÔ ðBð BØ;?ðBð BñCô Cð 	Cr   zBexpected the output of the backward function to be a dict but got c                 óN   — h | ]"}|j                              ¦   «         ¯|j        ’Œ#S r,   )r5   Úis_tensor_likerg   rj   s     r   ú	<setcomp>z,validate_grad_inputs_dict.<locals>.<setcomp>»   s<   € ð 3ð 3ð 3 #Øœ×/Ò/Ñ1Ô1ð3�S”Xð 3ð 3ð 3r   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    Údictr5   Ú_schemaro   rp   ÚkeysÚitemsÚgetattrr3   r.   r/   r0   r1   r!   r"   Ú
issubclass)r\   ry   rI   rz   Úexpected_keysÚactual_keysrg   ÚgradÚarg_infor<   ÚgÚinfos    `          r   rV   rV   °   s²  ø€ ðCð Cð Cð Cð Cõ Ð&­Ñ-Ô-ð /Øˆð .ÝÐ*Ñ+Ô+ð.ð .ñ 	/ô 	/ð 	/ð3ð 3¨Ô);Ô)EÔ)Nð 3ñ 3ô 3€Mà"×'Ò'Ñ)Ô)€KØ˜Ò#Ð#Øˆð (Øð(ð (Ø)4ð(ð (ð (ñ 	)ô 	)ð 	)ð '×,Ò,Ñ.Ô.ð #Añ #A‰
ˆˆdÝ˜9 dÑ+Ô+ˆå�h¥Ñ%Ô%ñ 	Ý˜d¥U­D MÑ2Ô2ð (Ø�ð ' Dð 'ð 'å˜d™œð'ð 'ð 'ñ (ô (ð (õ �t‘9”9¥ H¡¤Ò-Ð-Ø�ð % Dð %ð %Ý(+¨H©¬ð%ð %å˜T™œð%ð %ñ &ô &ð &õ #,­C°°hÑ,?Ô,?Ñ"@Ô"@ð .ð .‘�‘Y�a˜Ø�9ØÝ! !¥U¤\Ñ2Ô2ð AØ�Eð @¨ð @ð @å'+¨A¡w¤wð@ð @à:=ð@ð @ñ Aô Að Aõ " $­¬Ñ5Ô5ð .Ø�Eð -¨ð -ð -Ø%(ð-ð -à!$ð-ð -ð #+ð-ð -ñ .ô .ð .øñ àˆ<ÙÝ˜$¥¤Ñ-Ô-ð 	NØˆEð M­¨T©
¬
ð Mð MØðMð Mð Mñ Nô Nð Nõ ˜(¥E¤LÑ1Ô1ð 	AØˆEð @¸Tð @ð @ØBFð@ð @à3;ð@ð @ð @ñ Aô Að AùðC#Að #Ar   c                 ó2  — g }|                      ¦   «                              ¦   «         D ]N\  }}|| vr*|                     t          j        d„ |¦  «        ¦  «         Œ3|                     | |         ¦  «         ŒOt          t          j        |¦  «        ¦  «        S )Nc                 ó   — d S r   r,   r$   s    r   r&   z0grad_inputs_dict_to_flat_tuple.<locals>.<lambda>ð   s   € °D€ r   )Ú_asdictr‚   r2   r(   rE   r.   Útree_leaves)r\   rI   Úresultrg   rˆ   s        r   rW   rW   ì   s•   € Ø€FØ#×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5ð .ð .‰ˆˆhØÐ'Ð'Ð'Ø�MŠM�&œ/¨.¨.¸(ÑCÔCÑDÔDÐDØØ�ŠÐ& tÔ,Ñ-Ô-Ð-Ð-Ý•Ô# FÑ+Ô+Ñ,Ô,Ð,r   c                 ó@  — t          j        |¦  «        \  }}t          |¦  «        }d„ t          |¦  «        D ¦   «         }d„ t          |¦  «        D ¦   «         }d„ |D ¦   «         }d„ |D ¦   «         }|| _        || _         | j        |Ž  || _        || _        || _	        d S )Nc                 óL   — g | ]!\  }}t          |t          j        ¦  «        ¯|‘Œ"S r,   ©r    r!   r"   ©rk   r<   Úthings      r   rm   z,save_pytree_for_backward.<locals>.<listcomp>ü   s<   € ð 7ð 7ð 7™:˜3 Ý  ­¬Ñ5Ô5ð7�3ð 7ð 7ð 7r   c                 óL   — g | ]!\  }}t          |t          j        ¦  «        °|‘Œ"S r,   r’   r“   s      r   rm   z,save_pytree_for_backward.<locals>.<listcomp>þ   s<   € ð ?ð ?ð ?™z˜s EÝ(¨µ´Ñ=Ô=ð?�sð ?ð ?ð ?r   c                 óF   — g | ]}t          |t          j        ¦  «        ¯|‘ŒS r,   r’   ©rk   r”   s     r   rm   z,save_pytree_for_backward.<locals>.<listcomp>   s)   € ÐPÐPÐP˜µ
¸5Å%Ä,Ñ0OÔ0OÐPˆuÐPÐPÐPr   c                 óF   — g | ]}t          |t          j        ¦  «        °|‘ŒS r,   r’   r—   s     r   rm   z,save_pytree_for_backward.<locals>.<listcomp>  s)   € ÐXÐXÐX˜U½
À5Í%Ì,Ñ8WÔ8WÐX�5ÐXÐXÐXr   )
r(   rG   r/   r0   rQ   Únum_eltsr   Útensor_idxsÚsaved_non_tensorsÚnon_tensor_idxs)	r7   ÚstuffÚ
flat_stuffrQ   r™   rš   rœ   ÚtensorsÚnon_tensorss	            r   rF   rF   ù   sÍ   € ÝÔ*¨5Ñ1Ô1Ñ€J�Ý�:‰Œ€Hð7ð 7­°:Ñ)>Ô)>ð 7ñ 7ô 7€Kð?ð ?­Y°zÑ-BÔ-Bð ?ñ ?ô ?€OàPÐP *ÐPÑPÔP€GØXÐX jÐXÑXÔX€Kà€C„HØ€C„LØ€CÔ˜7Ð#Ð#Ø!€C„OØ'€CÔØ)€CÔÐÐr   c                 óä   — d g| j         z  }t          | j        | j        ¦  «        D ]
\  }}|||<   Œt          | j        | j        ¦  «        D ]
\  }}|||<   Œt          j        || j        ¦  «        }|S r   )	r™   r1   Úsaved_tensorsrš   r›   rœ   r(   rC   rQ   )r7   rž   Útensorr<   Ú
non_tensorr�   s         r   rT   rT     s„   € Ø�˜#œ,Ñ&€JÝ˜3Ô,¨c¬oÑ>Ô>ð !ð !‰ˆ�Ø ˆ
�3‰ˆÝ˜sÔ4°cÔ6IÑJÔJð %ð %‰ˆ
�CØ$ˆ
�3‰ˆÝÔ! *¨c¬hÑ7Ô7€EØ€Lr   )r!   Útorch.utils._pytreeÚutilsÚ_pytreer(   Úcollectionsr   Ú	functoolsr   r   r6   rc   r_   Ú	lru_cachert   rD   rV   rW   rF   rT   r,   r   r   ú<module>r«      s  ðà €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð ðð ð ð>ð ð ðEð Eð Eð@6ð 6ð 6ðr	ð 	ð 	ð Ôðð ñ Ôððð ð ð9Að 9Að 9Aðx-ð -ð -ð*ð *ð *ð&ð ð ð ð r   