§
    ž²ÅjöU  ã                   óD  — d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZm	Z	 d dl
ZddlmZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZmZ ddlmZmZ dd	l m!Z!m"Z" dd
l#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ ej,         G d„ d¦  «        ¦   «         Z- G d„ d¦  «        Z.dS )é    N)ÚCounterÚDictÚListÚOptionalé   )Úutils)
Úadd_push_nullÚadd_push_null_call_function_exÚcreate_call_functionÚcreate_call_methodÚcreate_dup_topÚcreate_instructionÚcreate_load_constÚcreate_load_methodÚcreate_rot_nÚInstruction)Úunimplemented)Ú
AttrSourceÚSource)Úis_safe_constantÚrot_n_helper)ÚValueMutationExistingÚVariableTracker)ÚNNModuleVariable)ÚNumpyNdarrayVariableÚSymNodeVariableÚTensorVariableÚUnspecializedPythonVariable)ÚTensorWithTFOverrideVariablec                   ó$   — e Zd ZU eed<   eed<   dS )ÚGraphOutputEntryÚindexÚvariableN)Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__r   © ó    úFC:\Projects\Historical\venv\Lib\site-packages\torch/_dynamo/codegen.pyr!   r!   &   s'   € € € € € € à€J€J�JØÐÐÑÐÐr*   r!   c                   ó  — e Zd ZdZ	 	 	 	 	 d:deej        j                 dee         ddfd„Z	ddœd	„Z
d
„ Zd„ Zd;d„Zd<d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdee         fd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zd;defd„Zdefd„Z defd„Z!d „ Z"d!„ Z#defd"„Z$d#„ Z%d$„ Z&defd%„Z'd&„ Z(d=d(„Z)d)„ Z*d*„ Z+d+„ Z,d,e-d-e.fd.„Z/d/„ Z0d0„ Z1d1„ Z2	 d=d2ed3e3j4        d-e.fd4„Z5defd5„Z6d2eddfd6„Z7d>d7„Z8dee         fd8„Z9defd9„Z:dS )?Ú	PyCodegenz<
    Helper class uses for constructing Python bytecode
    NÚrootÚgraph_output_varÚreturnc                 ó6  — || _         d | _        t          j        ¦   «         | _        i | _        g | _        |pi | _        || _        || _	        | j        j
        j        | _        | j        j        | _        | j        j
        j        | _        d| _        |pi | _        d S )NT)r.   Útop_of_stackÚcollectionsr   ÚusesÚgraph_outputsÚ_outputÚtempvarsÚtxr/   ÚoutputÚcode_optionsÚcell_and_freevarsÚnew_varÚvalue_from_sourceÚoverridden_sources)Úselfr8   r.   r/   r7   r>   s         r+   Ú__init__zPyCodegen.__init__1   s–   € ð ˆŒ	Ø7;ˆÔÝ.9Ô.AÑ.CÔ.CˆŒ	Ø:<ˆÔØ*,ˆŒð
 !˜ BˆŒØˆŒØ 0ˆÔØ œGœNÔ7ˆÔØ!%¤Ô!:ˆÔØ”w”~Ô-ˆŒØ'+ˆÔð 9KÐ8PÈbˆÔÐÐr*   T)r=   c                ó†   — | j         }| xj         |z  c_         	 |                      |¦  «         || _         d S # || _         w xY w©N)r=   Úforeach)r?   Ústack_valuesr=   Úprevs       r+   Úrestore_stackzPyCodegen.restore_stackN   sX   € ØÔ%ˆØÐÔÐ"3Ñ3ÐÔð	*Ø�LŠL˜Ñ&Ô&Ð&à%)ˆDÔ"Ð"Ð"ø TˆDÔ"Ð)Ð)Ð)Ð)s	   ™7 ·	A c                 óH   — d„ | j                              ¦   «         D ¦   «         S )Nc                 ó   — g | ]	}|j         ‘Œ
S r)   )r#   ©Ú.0Úxs     r+   ú
<listcomp>z/PyCodegen.graph_output_vars.<locals>.<listcomp>W   s   € Ð@Ð@Ð@˜q�”
Ð@Ð@Ð@r*   )r5   Úvalues©r?   s    r+   Úgraph_output_varszPyCodegen.graph_output_varsV   s%   € Ø@Ð@ DÔ$6×$=Ò$=Ñ$?Ô$?Ð@Ñ@Ô@Ð@r*   c                 óN   — |                      | ¦  «        }|�J d|› �¦   «         ‚d S )Nzreconstruct!=None )Úreconstruct)r?   ÚvalueÚress      r+   Úcall_reconstructzPyCodegen.call_reconstructY   s1   € Ø×Ò Ñ%Ô%ˆØˆ{ˆ{Ð8°Ð8Ð8‰{Œ{ˆ{ˆ{ˆ{r*   Fc                 óª  — t          | j        ¦  «        }t          j        dk     r|                      ¦   «           |¦   «          | j        |d…         }| j        |d…= |r(| j                             t          |¦  «        ¦  «         n'| j                             t          |¦  «        ¦  «         t          j        dk    r|                      ¦   «          dS dS )a˜  
        `gen_fn` generates instructions via PyCodegen methods
        that push a single callable to the stack.

        `add_push_null` pushes a NULL to the stack before or after the
        instructions generated by `gen_fn`, depending on Python version.

        Will attempt to use the NULL push bit for instructions
        with such bits (LOAD_GLOBAL 3.11+, LOAD_ATTR 3.12+, LOAD_SUPER_ATTR).
        ©é   é   N)Úlenr6   ÚsysÚversion_infoÚ	clear_tosÚextendr
   r	   )r?   Úgen_fnÚcall_function_exÚold_lenÚadded_instss        r+   r	   zPyCodegen.add_push_null]   sÐ   € õ �d”lÑ#Ô#ˆÝÔ˜gÒ%Ð%ð �NŠNÑÔÐØˆ‰Œˆà”l 7 8 8Ô,ˆØŒL˜˜˜Ð"Øð 	<ØŒL×ÒÕ >¸{Ñ KÔ KÑLÔLÐLÐLàŒL×Ò¥¨kÑ :Ô :Ñ;Ô;Ð;ÝÔ˜wÒ&Ð&à�NŠNÑÔÐÐÐð 'Ð&r*   c                 óÆ  ‡ ‡‡‡	— t          |t          ¦  «        rF‰ j                             ||¦  «        }‰                      |¦  «         ‰                      ¦   «          dS t          |t          ¦  «        sJ ‚‰ j        Š	‰ j        Š|r‚‰ j	        |u r#‰	 
                    t          ¦   «         ¦  «         dS ‰ j                             |¦  «        �<‰	 
                    ‰                      ‰ j        |         ¦  «        ¦  «         |‰ _	        dS |j        �3|r1t          |j        t           ¦  «        s‰ j        r ‰ |j        ¦  «        S |                     ¦   «         r]t'          |                     ¦   «         ¦  «        r<‰	 
                    ‰                      |                     ¦   «         ¦  «        ¦  «         �n&t          |t,          ¦  «        r´‰                      |¦  «        Š‰                      ˆ fd„¦  «         ‰                      ‰‰         j        ¦  «         ‰	 
                    ‰                      |                     ‰ j        ¦  «        d¬¦  «        ¦  «         ‰	                     t?          dd¦  «        ¦  «         �n]t          |t@          ¦  «        r£| !                    ¦   «         tD          k    r†‰ j        j#        sz‰                      | $                    ‰ j        tJ          j&        ¦  «        ¦  «        Šˆˆˆ	ˆ fd„}‰                      |¦  «         ‰	                     t?          dd¦  «        ¦  «         �n¥t          |tN          t@          tP          tR          f¦  «        �r‰                      |¦  «        Št          |tR          ¦  «        r]‰                      ˆ fd	„¦  «         ‰                      ‰‰         j        ¦  «         ‰	                     t?          d
d¦  «        ¦  «         �nõt          |tP          ¦  «        rI|j*        rBˆˆˆ	ˆ fd„}‰                      |¦  «         ‰	                     t?          dd¦  «        ¦  «         �n—‰                      ‰‰         j        ¦  «         �nut          |tV          ¦  «        rÌ|j,         -                    d¦  «        }|d         ‰ j.        d         v r9‰	 
                    ‰                      |d         ¦  «        ¦  «         |d
d…         }n6‰ j/        €J ‚‰	 
                    ‰  0                    ‰ j/        ¦  «        ¦  «         |D ]*}‰	 
                    ‰  1                    |¦  «        ¦  «         Œ+n”‰ j2        |xx         d
z  cc<   	 ‰                      |¦  «         n"# tf          $ r ti          d|› �¦  «         Y nw xY w|rD|‰ j        v r;‰ j         
                    t          ¦   «         ¦  «         ‰  5                    |¦  «         |‰ _	        dS )a2  
        Generate code such that top-of-stack (TOS) is set to value.

        `allow_cache` is used to determine whether the following could happen,
        when `value` is a `VariableTracker`:
        1. if `value` was codegen-ed previously with `allow_cache=True` and
           without using source, reuse the generated code by loading from top
           of stack or tempvars.
        2. emit code based on `value.source` to handle aliasing.

        Notable effects:
        1. `self.top_of_stack` will be set to `value`, if we don't codegen
           `value` based on source.
        2. `self.uses[value]` will increment, if we don't codegen `value` based
           on source or cache/top-of-stack reuse; in other words, if we codegen
           as if `value` is modelling some brand new python value.
        Nc                  óD   •— ‰                       t          j        d¦  «        S )NÚto_subclass©Úload_import_fromr   r$   rN   s   €r+   ú<lambda>z$PyCodegen.__call__.<locals>.<lambda>À   s   ø€ ˜×-Ò-­e¬n¸mÑLÔL€ r*   T©Úaddé   Fc                  ó˜   •— ‰                      ‰ ‰         j        ¦  «         ‰                     ‰                     d¦  «        ¦  «         d S ©NÚitem©Úload_graph_outputr"   ÚappendÚcreate_load_attr©r5   Úgraph_outputs_keyr9   r?   s   €€€€r+   r^   z"PyCodegen.__call__.<locals>.gen_fnÙ   sF   ø€ Ø×&Ò& }Ð5FÔ'GÔ'MÑNÔNÐNØ—’˜d×3Ò3°FÑ;Ô;Ñ<Ô<Ð<Ð<Ð<r*   r   c                  óD   •— ‰                       t          j        d¦  «        S )NÚto_numpy_helperre   rN   s   €r+   rg   z$PyCodegen.__call__.<locals>.<lambda>ì   s   ø€ ˜D×1Ò1µ%´.ÐBSÑTÔT€ r*   r   c                  ó˜   •— ‰                      ‰ ‰         j        ¦  «         ‰                     ‰                     d¦  «        ¦  «         d S rl   rn   rr   s   €€€€r+   r^   z"PyCodegen.__call__.<locals>.gen_fnò   sF   ø€ Ø×*Ò*¨=Ð9JÔ+KÔ+QÑRÔRÐRØ—M’M $×"7Ò"7¸Ñ"?Ô"?Ñ@Ô@Ð@Ð@Ð@r*   ú.Úco_varnameszreconstruct: )6Ú
isinstancer   r>   ÚgetrT   r\   r   r6   r5   r2   rp   r   r7   Úcreate_loadÚsourceÚmutation_typer   r=   Úis_python_constantr   Úas_python_constantr   r   Úadd_graph_outputr	   ro   r"   Úcreate_load_globalÚglobal_mangled_class_namer8   r]   r   r   Úpython_typeÚfloatÚexportÚ	as_tensorÚtorchÚfloat64r   r   r   Úneed_unwrapr   Ú
module_keyÚsplitr:   r.   Úcreate_load_const_uncheckedrq   r4   ÚNotImplementedErrorr   Ú	add_cache)
r?   rR   Úallow_cacher|   r^   ÚpartsÚpartr5   rs   r9   s
   `      @@@r+   Ú__call__zPyCodegen.__call__z   s+  øøøø€ õ$ �e�VÑ$Ô$ð 	àÔ,×0Ò0°¸Ñ>Ô>ˆFØ×!Ò! &Ñ)Ô)Ð)à�NŠNÑÔÐØˆFå˜%¥Ñ1Ô1Ð1Ð1Ð1Ø”ˆØÔ*ˆàð 	ØÔ  EÐ)Ð)Ø—’�nÑ.Ô.Ñ/Ô/Ð/Ø�àŒ}× Ò  Ñ'Ô'Ð3Ø—’˜d×.Ò.¨t¬}¸UÔ/CÑDÔDÑEÔEÐEØ$)�Ô!Ø�ð Œ<Ð#¨Ð#õ$ ˜5Ô.Õ0EÑFÔFð*àÔ)ð*ð �t˜EœLÑ)Ô)Ð)à×#Ò#Ñ%Ô%ð R	&Õ*:¸5×;SÒ;SÑ;UÔ;UÑ*VÔ*Vð R	&Ø�MŠM˜$×0Ò0°×1IÒ1IÑ1KÔ1KÑLÔLÑMÔMÐMÑMÝ˜Õ;Ñ<Ô<ð P	&Ø $× 5Ò 5°eÑ <Ô <Ðà×ÒØLÐLÐLÐLñô ð ð ×"Ò" =Ð1BÔ#CÔ#IÑJÔJÐJØ�MŠMØ×'Ò'Ø×3Ò3°D´GÑ<Ô<À$ð (ñ ô ñô ð ð
 �MŠMÕ.¨q°%Ñ8Ô8Ñ9Ô9Ð9Ñ9å�u�oÑ.Ô.ðC	&à×!Ò!Ñ#Ô#¥uÒ,Ð,Ø”G”Nð -ð !%× 5Ò 5Ø—’ ¤­¬Ñ7Ô7ñ!ô !Ðð=ð =ð =ð =ð =ð =ð =ð =ð ×Ò˜vÑ&Ô&Ð&Ø�MŠMÕ.¨q°%Ñ8Ô8Ñ9Ô9Ð9Ñ9ÝØåÝÝ+Ý$ð	ñ
ô 
ñ -	&ð !%× 5Ò 5°eÑ <Ô <Ðå˜%Õ!5Ñ6Ô6ð OØ×"Ò"ØTÐTÐTÐTñô ð ð ×&Ò& }Ð5FÔ'GÔ'MÑNÔNÐNØ—’Õ2°1°eÑ<Ô<Ñ=Ô=Ð=Ñ=Ý˜EÕ#>Ñ?Ô?ð 	OÀEÔDUð 	OðAð Að Að Að Að Að Að Að ×"Ò" 6Ñ*Ô*Ð*Ø—’Õ2°1°eÑ<Ô<Ñ=Ô=Ð=Ñ=à×&Ò& }Ð5FÔ'GÔ'MÑNÔNÐNÑNÝ˜Õ/Ñ0Ô0ð 	&ØÔ$×*Ò*¨3Ñ/Ô/ˆEØ�QŒx˜4Ô,¨]Ô;Ð;Ð;Ø—’˜d×.Ò.¨u°Q¬xÑ8Ô8Ñ9Ô9Ð9Ø˜a˜b˜bœ	��à”yÐ,Ð,Ð,Ø—’˜d×>Ò>¸t¼yÑIÔIÑJÔJÐJØð ;ð ;�Ø—’˜d×3Ò3°DÑ9Ô9Ñ:Ô:Ð:Ð:ð;ð ŒI�eÐÐÔ Ñ!ÐÐÑð7Ø×%Ò% eÑ,Ô,Ð,Ð,øÝ&ð 7ð 7ð 7ÝÐ5¨eÐ5Ð5Ñ6Ô6Ð6Ð6Ð6ð7øøøàð &˜u¨¬Ð5Ð5Ø”×#Ò#¥NÑ$4Ô$4Ñ5Ô5Ð5Ø—’˜uÑ%Ô%Ð%à!ˆÔÐÐs   ÕU2 Õ2VÖVc                 ó®   — t          |                     ¦   «         ¦  «        }|| j        vr*t          t	          | j        ¦  «        |¦  «        | j        |<   |S rB   )ÚidÚas_proxyr5   r!   rY   )r?   rR   rs   s      r+   r€   zPyCodegen.add_graph_output  sX   € Ý˜uŸ~š~Ñ/Ô/Ñ0Ô0ÐØ DÔ$6Ð6Ð6Ý4DÝ�DÔ&Ñ'Ô'¨ñ5ô 5ˆDÔÐ0Ñ1ð !Ð r*   c                 ó  — | j         }|                     |                      | j        ¦  «        ¦  «         |                     |                      |¦  «        ¦  «         |                     t          d¦  «        ¦  «         d S )NÚBINARY_SUBSCR)r6   rp   r{   r/   r   r   )r?   r"   r9   s      r+   ro   zPyCodegen.load_graph_output  sm   € Ø”ˆØ�Š�d×&Ò& tÔ'<Ñ=Ô=Ñ>Ô>Ð>Ø�Š�d×,Ò,¨UÑ3Ô3Ñ4Ô4Ð4Ø�ŠÕ(¨Ñ9Ô9Ñ:Ô:Ð:Ð:Ð:r*   c                 óœ   — |                       ¦   «         }|| j        |<   | j                             |                      |¦  «        ¦  «         d S rB   )r<   r7   r6   rp   Úcreate_store)r?   rR   Úvars      r+   rŽ   zPyCodegen.add_cache  sE   € Ø�lŠl‰nŒnˆØ"ˆŒ�eÑØŒ×Ò˜D×-Ò-¨cÑ2Ô2Ñ3Ô3Ð3Ð3Ð3r*   c                 ó&   — |D ]} | |¦  «         Œd S rB   r)   )r?   ÚitemsÚis      r+   rC   zPyCodegen.foreach#  s*   € Øð 	ð 	ˆAØˆD�‰GŒGˆGˆGð	ð 	r*   c                 óÚ   — t          j        dd|¦  «        }| j        j        }||v r)t	          ||         ¦  «        t	          |¦  «        k    sJ ‚n|||<   |                      |d¬¦  «        gS )zStore value in a new globalz[^a-zA-Z0-9_]+Ú_Trh   )ÚreÚsubr8   Ú	f_globalsr”   r�   )r?   ÚnamerR   r¢   s       r+   Úsetup_globally_cachedzPyCodegen.setup_globally_cached'  sv   € åŒvÐ'¨¨dÑ3Ô3ˆØ”GÔ%ˆ	Ø�9ÐÐÝ�i ”oÑ&Ô&­"¨U©)¬)Ò3Ð3Ð3Ð3Ð3à#ˆI�d‰OØ×'Ò'¨°$Ð'Ñ7Ô7Ð8Ð8r*   c                 ó   — d | _         d S rB   )r2   rN   s    r+   r\   zPyCodegen.clear_tos1  s   € Ø ˆÔÐÐr*   c                 ó�   — t          |t          ¦  «        sJ ‚| j                             |¦  «         |                      ¦   «          d S rB   )ry   r   r6   rp   r\   )r?   Úinsts     r+   Úappend_outputzPyCodegen.append_output4  sD   € Ý˜$¥Ñ,Ô,Ð,Ð,Ð,ØŒ×Ò˜DÑ!Ô!Ð!Ø�ŠÑÔÐÐÐr*   c                 ó˜   — t          d„ |D ¦   «         ¦  «        sJ ‚| j                             |¦  «         |                      ¦   «          d S )Nc              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S rB   )ry   r   rI   s     r+   ú	<genexpr>z*PyCodegen.extend_output.<locals>.<genexpr>:  s,   è è € Ð=Ð=°!•:˜a¥Ñ-Ô-Ð=Ð=Ð=Ð=Ð=Ð=r*   )Úallr6   r]   r\   )r?   Úinstss     r+   Úextend_outputzPyCodegen.extend_output9  sQ   € ÝÐ=Ð=°uÐ=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=ØŒ×Ò˜EÑ"Ô"Ð"Ø�ŠÑÔÐÐÐr*   c                 ó   — | j         S rB   )r6   rN   s    r+   Úget_instructionszPyCodegen.get_instructions>  s
   € ØŒ|Ðr*   c                 ó\   — || j         d         v sJ |› d�¦   «         ‚t          d|¬¦  «        S )Nrx   ú missingÚ	LOAD_FAST©Úargval©r:   r   ©r?   r£   s     r+   r{   zPyCodegen.create_loadA  s?   € Ø�tÔ(¨Ô7Ð7Ð7Ð7¸DÐ9JÐ9JÐ9JÑ7Ô7Ð7Ý! +°dÐ;Ñ;Ô;Ð;r*   c                 ó|   — ||                       ¦   «         v sJ ‚t          j        dk    rdnd}t          ||¬¦  «        S )NrV   r³   ÚLOAD_CLOSUREr´   )r;   rZ   r[   r   )r?   r£   Ú	inst_names      r+   Úcreate_load_closurezPyCodegen.create_load_closureE  sH   € Ø�t×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ý#&Ô#3°wÒ#>Ð#>�K�KÀNˆ	Ý! )°DÐ9Ñ9Ô9Ð9r*   c                 óT   — ||                       ¦   «         v sJ ‚t          d|¬¦  «        S )NÚ
LOAD_DEREFr´   ©r;   r   r·   s     r+   Úcreate_load_derefzPyCodegen.create_load_derefJ  s2   € Ø�t×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ý! ,°tÐ<Ñ<Ô<Ð<r*   c                 ó\   — || j         d         v sJ |› d�¦   «         ‚t          d|¬¦  «        S )Nrx   r²   Ú
STORE_FASTr´   r¶   r·   s     r+   r™   zPyCodegen.create_storeN  s?   € Ø�tÔ(¨Ô7Ð7Ð7Ð7¸DÐ9JÐ9JÐ9JÑ7Ô7Ð7Ý! ,°tÐ<Ñ<Ô<Ð<r*   c                 óT   — ||                       ¦   «         v sJ ‚t          d|¬¦  «        S )NÚSTORE_DEREFr´   r¾   r·   s     r+   Úcreate_store_derefzPyCodegen.create_store_derefR  s2   € Ø�t×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ý! -¸Ð=Ñ=Ô=Ð=r*   c                 óž   — |r| j         j                             |¦  «         || j        d         v sJ |› d�¦   «         ‚t	          d|¬¦  «        S )NÚco_namesz not in co_namesÚLOAD_GLOBALr´   )r8   r9   Úupdate_co_namesr:   r   )r?   r£   ri   s      r+   r�   zPyCodegen.create_load_globalV  s_   € Øð 	1ØŒGŒN×*Ò*¨4Ñ0Ô0Ð0Ø�tÔ(¨Ô4Ð4Ð4Ð4¸Ð6OÐ6OÐ6OÑ4Ô4Ð4Ý! -¸Ð=Ñ=Ô=Ð=r*   c                 ó    — t          |¦  «        S rB   ©r   ©r?   rR   s     r+   r   zPyCodegen.create_load_const\  s   € Ý  Ñ'Ô'Ð'r*   c                 ó$   — t          |d¬¦  «        S )NF)ÚcheckedrÊ   rË   s     r+   rŒ   z%PyCodegen.create_load_const_unchecked_  s   € Ý  °Ð6Ñ6Ô6Ð6r*   c                 óˆ   — | j         j                             |¦  «         |                      t	          |¦  «        ¦  «         d S rB   )r8   r9   rÈ   r¨   r   r·   s     r+   Úload_methodzPyCodegen.load_methodb  s=   € ØŒŒ×&Ò& tÑ,Ô,Ð,Ø×ÒÕ-¨dÑ3Ô3Ñ4Ô4Ð4Ð4Ð4r*   c                 óJ   — |                       t          |¦  «        ¦  «         d S rB   )r®   r   )r?   Únargss     r+   Úcall_methodzPyCodegen.call_methodf  s%   € Ø×ÒÕ-¨eÑ4Ô4Ñ5Ô5Ð5Ð5Ð5r*   c                 ón   — || j         d         vr| j         dxx         |fz  cc<   t          d|¬¦  «        S )NrÆ   Ú	LOAD_ATTRr´   r¶   r·   s     r+   rq   zPyCodegen.create_load_attri  sI   € Ø�tÔ(¨Ô4Ð4Ð4ØÔ˜jÐ)Ð)Ô)¨d¨WÑ4Ð)Ð)Ñ)Ý! +°dÐ;Ñ;Ô;Ð;r*   c                 óV   — |                       |                      |¦  «        ¦  «         d S rB   )r¨   rq   r·   s     r+   Ú	load_attrzPyCodegen.load_attrn  s*   € Ø×Ò˜4×0Ò0°Ñ6Ô6Ñ7Ô7Ð7Ð7Ð7r*   c                 óF   ‡ — ˆ fd„|                      d¦  «        D ¦   «         S )Nc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r)   )rq   )rJ   r£   r?   s     €r+   rL   z/PyCodegen.create_load_attrs.<locals>.<listcomp>r  s'   ø€ ÐIÐIÐI°�×%Ò% dÑ+Ô+ÐIÐIÐIr*   rw   )r‹   )r?   Únamess   ` r+   Úcreate_load_attrszPyCodegen.create_load_attrsq  s)   ø€ ØIÐIÐIÐI¸¿ºÀCÑ8HÔ8HÐIÑIÔIÐIr*   c                 ón   — || j         d         vr| j         dxx         |fz  cc<   t          d|¬¦  «        S )NrÆ   Ú
STORE_ATTRr´   r¶   r·   s     r+   Úcreate_store_attrzPyCodegen.create_store_attrt  sI   € Ø�tÔ(¨Ô4Ð4Ð4ØÔ˜jÐ)Ð)Ô)¨d¨WÑ4Ð)Ð)Ñ)Ý! ,°tÐ<Ñ<Ô<Ð<r*   c                 óV   — |                       |                      |¦  «        ¦  «         d S rB   )r¨   rÝ   r·   s     r+   Ú
store_attrzPyCodegen.store_attry  s*   € Ø×Ò˜4×1Ò1°$Ñ7Ô7Ñ8Ô8Ð8Ð8Ð8r*   r   c                 óº  — g }|r“t           j        dk    rƒ|                     t          |                      |d¬¦  «        ¦  «        ¦  «         |dk    rE|                     g |                      |dz   ¦  «        ¢|                      |dz   ¦  «        ¢¦  «         nC|                     |                      |d¬¦  «        g|                      |dz   ¦  «        ¢¦  «         |S )z6Load the global fn_name on the stack num_on_stack down©rW   é   Trh   r   rj   r   )rZ   r[   r]   r	   r�   Úrot_n)r?   Úfn_nameÚ	push_nullÚnum_on_stackr9   s        r+   Úload_function_namezPyCodegen.load_function_name|  sõ   € àˆØð 	�Ô)¨WÒ4Ð4Ø�MŠM�-¨×(?Ò(?ÀÈTÐ(?Ñ(RÔ(RÑSÔSÑTÔTÐTØ˜aÒÐØ—’ðØŸš L°1Ñ$4Ñ5Ô5ðàŸš L°1Ñ$4Ñ5Ô5ðñô ð øð �MŠMà×+Ò+¨G¸Ð+Ñ>Ô>ðà—Z’Z ¨qÑ 0Ñ1Ô1ðñô ð ð ˆr*   c                 ó
  — 	 t          |¦  «        S # t          $ rg t          d|¬¦  «        |                      t	          |¦  «        ¦  «        gt          d¦  «        ¢t          dd¬¦  «        ‘t          d|¬¦  «        ‘cY S w xY w)NÚBUILD_TUPLE©Úargrj   ÚCALL_FUNCTION_EXr   ÚUNPACK_SEQUENCE)r   ÚAttributeErrorr   rŒ   r   )r?   Úns     r+   rã   zPyCodegen.rot_n‘  s«   € ð
	Ý ‘?”?Ð"øÝð 	ð 	ð 	õ # =°aÐ8Ñ8Ô8Ø×0Ò0µ¸a±´ÑAÔAðõ ˜a‘”ðõ #Ð#5¸1Ð=Ñ=Ô=ð	õ
 #Ð#4¸!Ð<Ñ<Ô<ðð ð ð ð	øøøs   ‚ ‘A.BÂBc                 óÚ   — t           j        dk    sJ ‚|                      d„ ¦  «        gt           j        dk    rt          dd¬¦  «        fnd¢t	          dd	¦  «        ¢t          d
¦  «        ‘S )Nrá   c                  ó   — d S rB   r)   r)   r*   r+   rg   z$PyCodegen.pop_null.<locals>.<lambda>£  s   € °T€ r*   rV   ÚSWAPrj   rê   r)   r   FÚPOP_TOP)rZ   r[   rŒ   r   r   rN   s    r+   Úpop_nullzPyCodegen.pop_nullž  s‹   € õ Ô 7Ò*Ð*Ð*Ð*à×,Ò,¨\¨\Ñ:Ô:ð

õ
 Ô# wÒ.Ð.õ $ F°Ð2Ñ2Ô2Ð4Ð4àð

õ " ! UÑ+Ô+ð

õ ˜yÑ)Ô)ð

ð 
	
r*   c                 óJ   — |                       t          d¦  «        ¦  «         d S )Nró   )r¨   r   rN   s    r+   Úpop_topzPyCodegen.pop_top®  s%   € Ø×ÒÕ-¨iÑ8Ô8Ñ9Ô9Ð9Ð9Ð9r*   rÑ   rå   c                 óN   — |                       t          ||¬¦  «        ¦  «         d S )N)rå   )r®   r   )r?   rÑ   rå   s      r+   Úcall_functionzPyCodegen.call_function±  s*   € Ø×ÒÕ/°ÀÐKÑKÔKÑLÔLÐLÐLÐLr*   c                 óH   — |                       t          ¦   «         ¦  «         d S rB   )r¨   r   rN   s    r+   Údup_topzPyCodegen.dup_top´  s"   € Ø×Ò�>Ñ+Ô+Ñ,Ô,Ð,Ð,Ð,r*   c                 óV   — |                       |                      |¦  «        ¦  «         d S rB   )r¨   r™   ©r?   Úvarnames     r+   ÚstorezPyCodegen.store·  s*   € Ø×Ò˜4×,Ò,¨WÑ5Ô5Ñ6Ô6Ð6Ð6Ð6r*   c                 óV   — |                       |                      |¦  «        ¦  «         d S rB   )r¨   r¿   rü   s     r+   Ú
load_derefzPyCodegen.load_derefº  s*   € Ø×Ò˜4×1Ò1°'Ñ:Ô:Ñ;Ô;Ð;Ð;Ð;r*   rä   Úcodec                 óÔ  ‡ ‡‡‡‡— ‰j         Š‰sJ ‚‰ j        Šˆˆˆˆˆ fd„}|r|t          j        dk    rl‰                      |¦  «         ‰                     ‰                      |dz   ¦  «        ¦  «         ‰                     ‰                      |dz   ¦  «        ¦  «         n5 |¦   «          ‰                     ‰                      |dz   ¦  «        ¦  «         ‰                      ¦   «          d S )Nc                  ó†  •— ‰D ]B} | ‰                      ¦   «         v sJ ‚‰                     ‰                     | ¦  «        ¦  «         ŒC‰                     t          dt	          ‰¦  «        ¬¦  «        ¦  «         ‰                     ‰                     ‰¦  «        ¦  «         t          j        dk     r(‰                     ‰                     ‰¦  «        ¦  «         t          j        dk    r5‰                     t          d¦  «        t          dd¬¦  «        g¦  «         d S ‰                     t          dd¬¦  «        ¦  «         d S )Nré   rê   rá   rV   ÚMAKE_FUNCTIONÚSET_FUNCTION_ATTRIBUTEé   )	r;   rp   r»   r   rY   r   rZ   r[   r]   )rš   r  rä   Úfreevarsr9   r?   s    €€€€€r+   r^   z4PyCodegen.make_function_with_closure.<locals>.gen_fnÄ  s?  ø€ ð
  ð =ð =�Ø˜d×4Ò4Ñ6Ô6Ð6Ð6Ð6Ð6Ø—’˜d×6Ò6°sÑ;Ô;Ñ<Ô<Ð<Ð<Ø�MŠMÕ,¨]ÅÀHÁÄÐNÑNÔNÑOÔOÐOØ�MŠM˜$×0Ò0°Ñ6Ô6Ñ7Ô7Ð7ÝÔ 'Ò)Ð)Ø—’˜d×4Ò4°WÑ=Ô=Ñ>Ô>Ð>ÝÔ 7Ò*Ð*Ø—’å*¨?Ñ;Ô;Ý*Ð+CÈÐNÑNÔNðñô ð ð ð ð —’Õ0°ÀdÐKÑKÔKÑLÔLÐLÐLÐLr*   rá   rj   r   )Úco_freevarsr6   rZ   r[   r	   r]   rã   r\   )r?   rä   r  rå   ræ   r^   r  r9   s   ```   @@r+   Úmake_function_with_closurez$PyCodegen.make_function_with_closure½  s  øøøøø€ ð Ô#ˆØˆˆˆxØ”ˆð	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð, ð 	8�Ô)¨WÒ4Ð4Ø×Ò˜vÑ&Ô&Ð&Ø�MŠM˜$Ÿ*š* \°AÑ%5Ñ6Ô6Ñ7Ô7Ð7Ø�MŠM˜$Ÿ*š* \°AÑ%5Ñ6Ô6Ñ7Ô7Ð7Ð7àˆF‰HŒHˆHØ�MŠM˜$Ÿ*š* \°AÑ%5Ñ6Ô6Ñ7Ô7Ð7Ø�ŠÑÔÐÐÐr*   c                 ó4  — | j         j        }|j        }t          j        dd|j        ¦  «        }|                     |d¦  «        |u r|                      |d¬¦  «        S d|› �}| j         j                             ||¦  «        }|                      |d¬¦  «        S )zT
        Generate a LOAD_GLOBAL instruction to fetch a given python module.
        z^.*[.]Ú NTrh   Ú
___module_)	r8   r9   Úglobal_scoper    r¡   r$   rz   r�   Úinstall_global_by_id)r?   Úmodr9   r  r£   ÚprefixÚglobal_names          r+   Úcreate_load_python_modulez#PyCodegen.create_load_python_moduleã  s�   € ð ””ˆØÔ*ˆÝŒv�i  S¤\Ñ2Ô2ˆØ×Ò˜D $Ñ'Ô'¨3Ð.Ð.Ø×*Ò*¨4°TÐ*Ñ:Ô:Ð:Ø$˜dÐ$Ð$ˆØ”g”n×9Ò9¸&À#ÑFÔFˆØ×&Ò& {¸Ð&Ñ=Ô=Ð=r*   c                 óÀ  ‡ — ‰                       ‰                      |d¦  «        ¦  «         ‰ j        j        j        }|D ]o}|j        rQ‰                      ˆ fd„¦  «         ‰                      |¦  «         ‰                       t          dd¦  «        ¦  «         ŒZ‰                      |¦  «         Œp‰                       t          t          |¦  «        d¦  «        ¦  «         dS )z2Call the generated code function stored in fn_nameTc                  óˆ   •— ‰                       ‰                      t          ¦  «        ‰                      d¦  «        g¦  «        S )NÚ_as_tensor_fullprec)r®   r  r‡   rq   rN   s   €r+   rg   z4PyCodegen.make_call_generated_code.<locals>.<lambda>ø  s?   ø€ ˜D×.Ò.à ×:Ò:½5ÑAÔAØ ×1Ò1Ð2GÑHÔHðñô € r*   r   FN)
r®   rç   r8   r9   Ú	graphargsÚpass_arg_as_tensorr	   rT   r   rY   )r?   rä   r  rë   s   `   r+   Úmake_call_generated_codez"PyCodegen.make_call_generated_codeð  só   ø€ à×Ò˜4×2Ò2°7¸DÑAÔAÑBÔBÐBà”G”NÔ,ˆ	Øð 	+ð 	+ˆCØÔ%ð +Ø×"Ò"ðð ð ð ñô ð ð ×%Ò% cÑ*Ô*Ð*Ø×"Ò"Õ#7¸¸5Ñ#AÔ#AÑBÔBÐBÐBà×%Ò% cÑ*Ô*Ð*Ð*à×ÒÕ/µ°I±´ÀÑFÔFÑGÔGÐGÐGÐGr*   c                 óh   —  | t          | j                             |¦  «        |¦  «        ¦  «         d S rB   )r   r8   Úimport_source)r?   Úmodule_nameÚobject_names      r+   rf   zPyCodegen.load_import_from  s2   € Øˆ�Z˜œ×-Ò-¨kÑ:Ô:¸KÑHÔHÑIÔIÐIÐIÐIr*   c                 ó  — t           j        dk    rbt          ||¦  «        }|d         j        dk    sJ ‚|                     d|                      |¦  «        ¦  «         t          d|¬¦  «        |d<   |S t           j        dk    ret          ||¦  «        }t           j        dk    rd}d}nd}d	}||         j        |k    sJ ‚t          d
|¬¦  «        }|                     ||¦  «         |S |                      |¦  «        t          d|¬¦  «        gS )NrV   éÿÿÿÿÚCALLÚCALL_KWrê   rá   )rW   é   éþÿÿÿÚPRECALLÚKW_NAMESr´   ÚCALL_FUNCTION_KW)rZ   r[   r   ÚopnameÚinsertr   r   )r?   rÑ   Úkw_namesrå   r9   ÚidxÚexpected_instÚkw_names_insts           r+   Úcreate_call_function_kwz!PyCodegen.create_call_function_kw	  s$  € ÝÔ˜wÒ&Ð&Ý)¨%°Ñ;Ô;ˆFØ˜"”:Ô$¨Ò.Ð.Ð.Ð.Ø�MŠM˜"˜d×4Ò4°XÑ>Ô>Ñ?Ô?Ð?Ý+¨I¸5ÐAÑAÔAˆF�2‰JØˆMÝÔ Ò(Ð(Ý)¨%°Ñ;Ô;ˆFÝÔ 7Ò*Ð*Ø�Ø &��à�Ø )�Ø˜#”;Ô%¨Ò6Ð6Ð6Ð6Ý.¨zÀ(ÐKÑKÔKˆMØ�MŠM˜#˜}Ñ-Ô-Ð-ØˆMà×"Ò" 8Ñ,Ô,ÝÐ1°uÐ=Ñ=Ô=ð
ð 	
r*   c                 ó$   — t          d|¬¦  «        S )NÚDELETE_FASTr´   )r   rË   s     r+   Úcreate_deletezPyCodegen.create_delete!  s   € Ý! -¸Ð>Ñ>Ô>Ð>r*   )NNNNN)F)T)r   )r0   N);r$   r%   r&   Ú__doc__r   r‡   ÚnnÚModuleÚstrr@   rF   rO   rT   r	   r’   r€   ro   rŽ   rC   r¤   r\   r¨   r®   r   r   r°   r{   r»   r¿   r™   rÄ   r�   r   rŒ   rÏ   rÒ   rq   rÖ   rÚ   rÝ   rß   rç   rã   rô   rö   r'   Úboolrø   rú   rþ   r   ÚtypesÚCodeTyper	  r  r  rf   r,  r/  r)   r*   r+   r-   r-   ,   sI  € € € € € ðð ð Ø*.Ø*.ØØðQð Qð �u”x”Ô'ðQð # 3œ-ð	Qð 
ðQð Qð Qð Qð: @Dð *ð *ð *ð *ð *ðAð Að Að9ð 9ð 9ðð ð ð ð:T"ð T"ð T"ð T"ðl!ð !ð !ð;ð ;ð ;ð4ð 4ð 4ð
ð ð ð9ð 9ð 9ð!ð !ð !ðð ð ð
ð ð ð
 $ {Ô"3ð ð ð ð ð< ;ð <ð <ð <ð <ð:¨;ð :ð :ð :ð :ð
=¨ð =ð =ð =ð =ð= Kð =ð =ð =ð =ð>¨+ð >ð >ð >ð >ð>ð >°[ð >ð >ð >ð >ð(¨+ð (ð (ð (ð (ð7°Kð 7ð 7ð 7ð 7ð5ð 5ð 5ð6ð 6ð 6ð<¨ð <ð <ð <ð <ð
8ð 8ð 8ðJð Jð Jð=¨ð =ð =ð =ð =ð
9ð 9ð 9ðð ð ð ð*ð ð ð
ð 
ð 
ð :ð :ð :ðM 3ð M°4ð Mð Mð Mð Mð-ð -ð -ð7ð 7ð 7ð<ð <ð <ð QRð$ð $Øð$Ø"'¤.ð$Ø=Að$ð $ð $ð $ðL>°ð >ð >ð >ð >ðH°ð H¸ð Hð Hð Hð Hð,Jð Jð Jð Jð
ÀTÈ+ÔEVð 
ð 
ð 
ð 
ð0? kð ?ð ?ð ?ð ?ð ?ð ?r*   r-   )/r3   Údataclassesr    rZ   r5  Útypingr   r   r   r   Útorch.nnr‡   r  r   Úbytecode_transformationr	   r
   r   r   r   r   r   r   r   r   Úexcr   r|   r   r   r   r   Úvariables.baser   r   Úvariables.nn_moduler   Úvariables.tensorr   r   r   r   Úvariables.torch_functionr   Ú	dataclassr!   r-   r)   r*   r+   ú<module>rA     s"  ðà Ð Ð Ð Ø Ð Ð Ð Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0à €€€à Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ 1Ð 1Ð 1Ð 1Ð 1Ð 1ðð ð ð ð ð ð ð ð ð ð ð ð CÐ BÐ BÐ BÐ BÐ Bð Ôðð ð ð ð ñ ô ñ Ôðð
v?ð v?ð v?ð v?ð v?ñ v?ô v?ð v?ð v?ð v?r*   