§
    Ÿ²Åj\#  ã                   ó  — d dl Z d dl mZ d dlmZmZmZmZmZ d dlm	Z	m
Z
mZmZ d dlmZ ddlmZ  G d„ d	e¦  «        Ze j         G d
„ d¦  «        ¦   «         Zde
j        dedefd„Zdedefd„Zd„ Zd„ Zej        Zej        Zej        ZdS )é    N)Ú	dataclass)ÚAnyÚCallableÚDictÚOptionalÚProtocol)Ú_CÚ_opsÚautogradÚTensor)Ú_pytreeé   )Úutilsc                   ó<   — e Zd ZU ee         ed<   ee         ed<   dS )ÚInfoProtocolÚ_backward_fnÚ_setup_context_fnN©Ú__name__Ú
__module__Ú__qualname__r   r   Ú__annotations__© ó    úHC:\Projects\Historical\venv\Lib\site-packages\torch/_library/autograd.pyr   r      s4   € € € € € € Ø˜8Ô$Ð$Ð$Ñ$Ø Ô)Ð)Ð)Ñ)Ð)Ð)r   r   c                   ó<   — e Zd ZU ee         ed<   ee         ed<   dS )ÚInfor   r   Nr   r   r   r   r   r      s4   € € € € € € à˜8Ô$Ð$Ð$Ñ$Ø Ô)Ð)Ð)Ñ)Ð)Ð)r   r   ÚopÚinfoÚreturnc                 óÌ  ‡ ‡‡‡‡	‡
— d‰ j         › d‰ j        › d‰ j        › �}t          j        ‰ j        ¦  «        Š
t           G d„ d¦  «        ¦   «         Šˆ fd„Š	ˆ
ˆˆ fd„}ˆˆ fd„}t          |t          j	        ft          |¦  «        t          |¦  «        dœ¦  «        Š‰ j        }t          d	„ g |j        ¢|j        ¢R D ¦   «         ¦  «        rt          ‰¦  «        Šˆˆˆ	fd
„}|S )NÚGeneratedBackwardFor_Ú_c                   ó>   — e Zd ZU ej        ed<   eeef         ed<   dS )ú$make_autograd_impl.<locals>.MetadataÚkeysetÚkeyword_only_argsN)	r   r   r   r	   ÚDispatchKeySetr   r   Ústrr   r   r   r   ÚMetadatar%      s5   € € € € € € àÔ!Ð!Ð!Ñ!Ø  S œ>Ð)Ð)Ñ)Ð)Ð)r   r*   c                  óÞ   •— | d         }| d d…         } t          j        ¦   «         5  |j        }|j        } ‰j        |t           j        z  g| ¢R i |¤Ž}|cd d d ¦  «         S # 1 swxY w Y   d S )Néÿÿÿÿ)r	   Ú_AutoDispatchBelowAutogradr&   r'   Ú
redispatchÚ_after_autograd_keyset)ÚargsÚmetadatar&   ÚkwargsÚresultr   s        €r   Úforward_no_gradz+make_autograd_impl.<locals>.forward_no_grad!   sÈ   ø€ Ø˜”8ˆØ�C�R�CŒyˆåÔ*Ñ,Ô,ð 	ð 	Ø”_ˆFØÔ/ˆFØ"�R”] 6­BÔ,EÑ#EÐWÈÐWÐWÐWÐPVÐWÐWˆFØð		ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   §.A"Á"A&Á)A&c                 ó�  •— |d         }|d d…         }t          j        ¦   «         5  |j        }|j        } ‰j        |t           j        z  g|¢R i |¤Ž}‰j        rRt          j        ‰j	        ||¦  «        \  }}‰r‰                     | |||¬¦  «         n‰                     | ||¬¦  «         |cd d d ¦  «         S # 1 swxY w Y   d S )Nr,   )ÚctxÚinputsÚkeyword_only_inputsÚoutput)r6   r7   r9   )
r	   r-   r&   r'   r.   r/   r   r   Úfill_defaultsÚ_schema)	r6   r0   r1   r&   r2   r3   Úhas_kwarg_only_argsr   r   s	         €€€r   Úforwardz#make_autograd_impl.<locals>.forward+   sB  ø€ Ø˜”8ˆØ�C�R�CŒyˆåÔ*Ñ,Ô,ð 	ð 	Ø”_ˆFØÔ/ˆFØ"�R”] 6­BÔ,EÑ#EÐWÈÐWÐWÐWÐPVÐWÐWˆFØÔ%ð Põ  %Ô2°2´:¸tÀVÑLÔL‘��fà&ð PØ×*Ò*Ø¨À&ÐQWð +ñ ô ð ð ð ×*Ò*¨s¸4ÈÐ*ÑOÔOÐOØð/	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   §BB;Â;B?ÃB?c                 óô   •— ‰j         r^	 | j        }| j        d d…         | _         ‰j         | g|¢R Ž }|| _        n# || _        w xY wt          |t          ¦  «        rg |¢d ‘R S |d fS t	          d‰› d�¦  «        ‚)Nr,   zTrying to backward through zQ but no autograd formula was registered. Please use register_autograd to add one.)r   Úneeds_input_gradÚ
isinstanceÚtupleÚRuntimeError)r6   ÚgradsÚprev_needs_input_gradr3   r   r   s       €€r   Úbackwardz$make_autograd_impl.<locals>.backwardH   s¾   ø€ ØÔð 		 ð=Ø(+Ô(<Ð%Ø'*Ô';¸C¸R¸CÔ'@�Ô$Ø*˜Ô*¨3Ð7°Ð7Ð7Ð7�à'<�Ô$Ð$øÐ'<�Ô$Ð<Ð<Ð<Ð<Ý˜&¥%Ñ(Ô(ð 'Ø&˜� ��Ð&Ø˜4�<ÐÝð8¨"ð 8ð 8ð 8ñ
ô 
ð 	
s	   Š); »	A)r=   rE   c              3   óH   K  — | ]}t          j        |j        ¦  «        V — Œd S ©N)r   Úis_tensorlist_like_typeÚtype)Ú.0Úas     r   ú	<genexpr>z%make_autograd_impl.<locals>.<genexpr>c   sC   è è € ð ð àõ 	Ô% a¤fÑ-Ô-ðð ð ð ð ð r   c                 óÎ   •— t          j        ¦   «         r<t          j        t          d„ |t
          ¦  «        r ‰j        g |¢ ‰| |¦  «        ‘R Ž }n ‰g |¢ ‰| |¦  «        ‘R Ž }|S )Nc                 ó   — | j         S rG   )Úrequires_grad)Úxs    r   ú<lambda>z;make_autograd_impl.<locals>.autograd_impl.<locals>.<lambda>m   s   € ˜aœo€ r   )r	   Úis_grad_enabledr   Útree_any_onlyr   Únot_list_of_tensorÚapply)r&   r0   r'   r3   Ú	Generatedr*   r4   s       €€€r   Úautograd_implz)make_autograd_impl.<locals>.autograd_implk   s‘   ø€ ÝÔÑÔð 	Q¥GÔ$9ÝÐ-Ð-¨tÕ5Gñ%
ô %
ð 	Qð %�Y”_ÐP dÐP¨H¨H°VÐ=NÑ,OÔ,OÐPÐPÐPˆFˆFà$�_ÐP dÐP¨H¨H°VÐ=NÑ,OÔ,OÐPÐPÐPˆFØˆr   )Ú
_namespaceÚ_opnameÚ_overloadnamer   r<   r;   r   rI   r   ÚFunctionÚstaticmethodÚanyÚ	argumentsÚreturnsÚsupports_tensorlist)r   r   Únamer=   rE   ÚschemarW   rV   r*   r4   r<   s   ``     @@@@r   Úmake_autograd_implrc      s‹  øøøøøø€ ØW¨¬ÐWÐW¸¼
ÐWÐWÀRÔEUÐWÐW€DåÔ3°B´JÑ?Ô?Ðåð*ð *ð *ð *ð *ñ *ô *ñ „Yð*ðð ð ð ð ðð ð ð ð ð ð ð:
ð 
ð 
ð 
ð 
ð 
õ" ØÝ	Ô	Ðå# GÑ,Ô,Ý$ XÑ.Ô.ð	
ð 	
ñô €Ið ŒZ€FÝ
ð ð à5�6Ô#Ð5 f¤nÐ5Ð5ðñ ô ñ ô ð 3õ (¨	Ñ2Ô2ˆ	ðð ð ð ð ð ð ð Ðr   Úclsc                 ó¸   ‡‡‡‡— | j         Š| j        Š| j        Št           G d„ d¦  «        ¦   «         Šˆˆfd„}ˆfd„}ˆˆfd„}|| _         || _        || _        | S )a4  Allows a given autograd.Function class to support List[Tensor] inputs/outputs.

    Regular autograd.Function has a constraint that it only directly supports autograd for
    Tensors. Applying @supports_tensorlist enables an autograd.Function to support
    autograd for List[Tensor] inputs and outputs.
    c                   óN   — e Zd ZU eed<   dZee         ed<   dZee         ed<   dS )ú%supports_tensorlist.<locals>.MetadataÚ
input_specNÚoutput_specÚresult_is_tuple)	r   r   r   Úspec_tr   ri   r   rj   Úboolr   r   r   r*   rg   ‚   sG   € € € € € € àÐÐÑØ(,ˆ�X˜fÔ%Ð,Ð,Ñ,Ø*.ˆ˜ $œÐ.Ð.Ñ.Ð.Ð.r   r*   c                 ó¬  •— |d         }|d d…         }t          |‰¦  «        st          d¦  «        ‚t          t          |¦  «        |j        ¦  «        } ‰| g|¢R Ž }t          |t
          ¦  «        |_        |j        s|f}t          |t          ¦  «        \  }}||_	        t          | d¦  «        rt          d¦  «        ‚|| _        t          |¦  «        S )Nr,   z�NYI: calling supports_tensorlist autograd.Function.forward directly. You should probably be calling .apply instead. Please file an issue if not.Ú_pt_metadataz@Please don't set ctx._pt_metadata; PyTorch uses it to store info)r@   ÚNotImplementedErrorÚ	unflattenÚlistrh   rA   rj   ÚflattenrT   ri   ÚhasattrrB   rn   )r6   r0   r1   r3   Úflat_resultri   r*   Úorig_forwards         €€r   Únew_forwardz(supports_tensorlist.<locals>.new_forwardˆ   só   ø€ Ø˜”8ˆØ�C�R�CŒyˆÝ˜( HÑ-Ô-ð 	Ý%ð/ñô ð õ
 �˜d™œ XÔ%8Ñ9Ô9ˆØ�˜cÐ) DÐ)Ð)Ð)ˆÝ#-¨fµeÑ#<Ô#<ˆÔ ØÔ'ð 	Ø�YˆFÝ#*¨6Õ3EÑ#FÔ#FÑ ˆ�[Ø*ˆÔå�3˜Ñ'Ô'ð 	ÝØRñô ð ð $ˆÔå�[Ñ!Ô!Ð!r   c                 ó  •— t          | d¦  «        st          d¦  «        ‚| j        }t          t	          |¦  «        |j        ¦  «        }| j        }	 t          t	          | j        d d…         ¦  «        |j        ¦  «        | _         ‰| g|¢R Ž }|| _        n# || _        w xY wt          |t          ¦  «        s|f}t          |t          ¦  «        \  }}||j        k    rt          d|› d|j        › d�¦  «        ‚t          |d gz   ¦  «        S )Nrn   z¤NYI: calling supports_tensorlist autograd.Function.backward directly. This will automatically get called by PyTorch autograd. Please file an issue if you need this.r,   zRExpected the return from backward to be of the same structure as the inputs. Got: z (return from backward), z	 (inputs))rs   ro   rn   rp   rq   ri   r?   rh   r@   rA   rr   Únot_list_of_optional_tensorrB   )r6   rC   r1   rD   Úgrad_inputsÚflat_grad_inputsÚgrad_inputs_specÚorig_backwards          €r   Únew_backwardz)supports_tensorlist.<locals>.new_backward¡   s]  ø€ Ý�s˜NÑ+Ô+ð 	Ý%ð9ñô ð ð Ô#ˆÝ�$˜u™+œ+ xÔ';Ñ<Ô<ˆð !$Ô 4Ðð	9Ý#,Ý�SÔ)¨#¨2¨#Ô.Ñ/Ô/°Ô1Dñ$ô $ˆCÔ ð (˜-¨Ð4¨eÐ4Ð4Ð4ˆKà#8ˆCÔ Ð øÐ#8ˆCÔ Ð8Ð8Ð8Ð8å˜+¥uÑ-Ô-ð 	)Ø&˜.ˆKõ .5ØÕ4ñ.
ô .
Ñ*ÐÐ*ð ˜xÔ2Ò2Ð2Ýð2Ø'7ð2ð 2àÔ&ð2ð 2ð 2ñô ð õ
 Ð%¨¨Ñ.Ñ/Ô/Ð/s   Á=B Â	B c                  ó0  •— t          | t          ¬¦  «        \  }} ‰|¦  «        } ‰g |¢|‘R Ž }|j        €J ‚t          t	          |¦  «        |j        ¦  «        }|j        s4t          |t          ¦  «        sJ ‚t          |¦  «        dk    sJ ‚|d         S |S )N)Úis_leafr   r   )	rr   rT   ri   rp   rq   rj   r@   rA   Úlen)r0   Ú	flat_argsrh   r1   r3   r*   Ú
orig_applys        €€r   Ú	new_applyz&supports_tensorlist.<locals>.new_applyÍ   s²   ø€ Ý '¨Õ6HÐ IÑ IÔ IÑˆ	�:Ø�8˜JÑ'Ô'ˆØ�Ð1˜YÐ1¨Ð1Ð1Ð1ˆØÔ#Ð/Ð/Ð/Ý�4 ™<œ<¨Ô)=Ñ>Ô>ˆØÔ'ð 	Ý˜f¥eÑ,Ô,Ð,Ð,Ð,Ý�v‘;”; !Ò#Ð#Ð#Ð#Ø˜!”9ÐØˆr   )r=   rE   rU   r   )rd   rv   r}   rƒ   r*   r‚   r|   ru   s       @@@@r   r`   r`   w   sÁ   øøøø€ ð ”;€LØ”L€MØ”€Jåð/ð /ð /ð /ð /ñ /ô /ñ „Yð/ð
"ð "ð "ð "ð "ð "ð2*0ð *0ð *0ð *0ð *0ðX
ð 
ð 
ð 
ð 
ð 
ð €C„KØ€C„LØ€C„IØ€Jr   c                 ó�   — t          | t          ¦  «        rdS t          | t          ¦  «        rt          d„ | D ¦   «         ¦  «        S dS )NFc              3   óB   K  — | ]}t          |t          ¦  «         V — Œd S rG   ©r@   r   ©rJ   Úls     r   rL   z%not_list_of_tensor.<locals>.<genexpr>ã   s/   è è € Ð;Ð;°•z !¥VÑ,Ô,Ð,Ð;Ð;Ð;Ð;Ð;Ð;r   T©r@   rA   rq   r]   ©Útrees    r   rT   rT   ß   sM   € Ý�$�ÑÔð ØˆuÝ�$�ÑÔð <ÝÐ;Ð;°dÐ;Ñ;Ô;Ñ;Ô;Ð;Øˆ4r   c                 ó�   — t          | t          ¦  «        rdS t          | t          ¦  «        rt          d„ | D ¦   «         ¦  «        S dS )NFc              3   óJ   K  — | ]}|d uot          |t          ¦  «         V — Œd S rG   r†   r‡   s     r   rL   z.not_list_of_optional_tensor.<locals>.<genexpr>ë   s8   è è € ÐMÐMÀ1�1˜D�=Ð>­°AµvÑ)>Ô)>Ð%>ÐMÐMÐMÐMÐMÐMr   Tr‰   rŠ   s    r   rx   rx   ç   sN   € Ý�$�ÑÔð ØˆuÝ�$�ÑÔð NÝÐMÐMÈÐMÑMÔMÑMÔMÐMØˆ4r   )Údataclassesr   Útypingr   r   r   r   r   Útorchr	   r
   r   r   Útorch.utilsr   Ú r   r   r   Ú
OpOverloadrc   r`   rT   rx   Útree_flattenrr   Útree_unflattenrp   ÚTreeSpecrk   r   r   r   ú<module>r—      s�  ðà Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð ð*ð *ð *ð *ð *�8ñ *ô *ð *ð
 Ôð*ð *ð *ð *ð *ñ *ô *ñ Ôð*ð
]˜4œ?ð ]°,ð ]À8ð ]ð ]ð ]ð ]ð@e˜Sð e Sð eð eð eð eðPð ð ðð ð ð Ô
€ØÔ"€	Ø	Ô	€€€r   