Ë
    g^(h¸'  ã                   ó´   — d Z ddlZddlmZ ddl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mZmZmZ d	d
lmZ erddlmZ  G d„ de«      Z G d„ de«      Zy)a  
Constant and enum variable tracking in Dynamo.

This module is fundamental to Dynamo's ability to track and propagate constant
values during compilation, ensuring proper handling of Python literals and
maintaining type safety through the compilation process.
é    N)ÚTYPE_CHECKING)Ú
AttrSourceÚGetItemSourceé   )Úgraph_break_hintsÚ	variables)Úraise_observed_exceptionÚunimplemented_v2)Úcmp_name_to_op_mappingÚcommon_constant_typesÚistypeÚnpé   )ÚVariableTracker)ÚInstructionTranslatorc                   óÒ   ‡ — e Zd ZdZedefd„«       Zdˆ fd„Zd„ Zde	fd„Z
d„ Zd„ Zed	„ «       Zd
ddefd„Zed„ «       Zed„ «       Zd„ Zdd„Z	 	 	 	 	 	 dˆ fd„Zd
dde	ddfd„Zˆ xZS )ÚConstantVariablea  
    Variable tracker for Python literals and basic immutable types, with automatic
    routing support for collection types (lists, tuples, sets, etc.).

    The create() method intelligently constructs appropriate variable types for
    nested collections.
    Úreturnc                 ó�  — |j                  dd«      }t        | t        «      r8| D �cg c]  }t        j	                  |«      ‘Œ }}t        j                  |fi |¤ŽS t        | t        «      r8| D �cg c]  }t        j	                  |«      ‘Œ }}t        j                  |fi |¤ŽS t        | t        t        f«      ryg }t        | «      D ];  \  }}|rt        ||«      nd}|j                  t        j	                  ||¬«      «       Œ= t        j                  j                  t!        | «      «      |fi |¤ŽS t        | fi |¤ŽS c c}w c c}w )aV  
        Create a `ConstantVariable` based on the given value, and supports
        automatic routing for collection types like `tuple` (in which case we'd
        create `ConstantVariable` for the leaf items).

        NOTE: the caller must install the proper guards if needed; most often
        the guard will be `CONSTANT_MATCH`.
        ÚsourceN©r   )ÚgetÚ
isinstanceÚsetr   Úcreater   ÚSetVariableÚ	frozensetÚFrozensetVariableÚlistÚtupleÚ	enumerater   ÚappendÚBaseListVariableÚcls_forÚtype)ÚvalueÚkwargsr   ÚxÚitemsÚiÚitem_sources          ú^/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_dynamo/variables/constant.pyr   zConstantVariable.create$   s7  € ð —‘˜H dÓ+ˆô �eœSÔ!Ø9>Ö?°AÔ%×,Ñ,¨QÕ/Ð?ˆEÐ?Ü×(Ñ(¨Ñ9°&Ñ9Ð9Ü˜œyÔ)Ø9>Ö?°AÔ%×,Ñ,¨QÕ/Ð?ˆEÐ?Ü×.Ñ.¨uÑ?¸Ñ?Ð?Ü˜¤¤e˜}Ô-ØˆEÜ! %Ó(ò ‘��1Ù:@œm¨F°AÔ6Àd�Ø—‘Ü$×+Ñ+ØØ*ð ,ó õðô ×-Ñ-×5Ñ5´d¸5³kÓBÀ5ÑSÈFÑSÐSä Ñ0¨Ñ0Ð0ùò# @ùò @s   §D>Á/Ec                 óð   •— t        ‰| �  di |¤Ž t        j                  |«      sJ dt	        |«      › d�«       ‚t
        �0t        |t
        j                  «      r|j                  «       | _	        y || _	        y )Nz7
Cannot construct `ConstantVariable` for value of type a`  .

This failure likely due to PyTorch-internal use of `ConstantVariable` on
non-literal python values, please try using `VariableTracker.build` instead. If
you believe it's a necessary and legitimate use case (the value is immutable and
can't easily be represented with another `VariableTracker` class), please add
its type to `common_constant_types`.
© )
ÚsuperÚ__init__r   Úis_base_literalr%   r   r   ÚnumberÚitemr&   ©Úselfr&   r'   Ú	__class__s      €r,   r0   zConstantVariable.__init__E   so   ø€ Ü‰ÑÑ"˜6Ò"Ü×/Ñ/°Ô6ð 	ð =7Ü7;¸E³{°mð Dð9ó 	Ð6ô ˆ>œj¨´·	±	Ô:ØŸ™›ˆD�JàˆD�Jó    c                 ó   — | j                   S ©N©r&   ©r5   s    r,   Úas_proxyzConstantVariable.as_proxyU   ó   € Ø�z‰zÐr7   c                 ót   — dt        | j                  «      j                  › dt        | j                  «      › d�S )NzConstantVariable(z: ú))r%   r&   Ú__name__Úreprr;   s    r,   Ú__repr__zConstantVariable.__repr__X   s2   € Ø"¤4¨¯
©
Ó#3×#<Ñ#<Ð"=¸RÄÀTÇZÁZÓ@PÐ?QÐQRÐSÐSr7   c                 ó   — | j                   S r9   r:   r;   s    r,   Úas_python_constantz#ConstantVariable.as_python_constant[   r=   r7   c                  ó   — y)NTr.   r;   s    r,   Úis_python_constantz#ConstantVariable.is_python_constant^   s   € Ør7   c                 ó&   — | j                  d¬«      S )zz
        Need this when adding a BaseListVariable and a ConstantVariable together.
        Happens in detectron2.
        N)Útx)Úunpack_var_sequencer;   s    r,   r)   zConstantVariable.itemsa   s   € ð ×'Ñ'¨4Ð'Ó0Ð0r7   rH   r   Úargc                 ób   — t         j                  | j                  |j                  «          «      S r9   )r   r   r&   rD   )r5   rH   rJ   s      r,   Úgetitem_constzConstantVariable.getitem_consti   s*   € Ü×&Ñ&Ø�J‰J�s×-Ñ-Ó/Ñ0ó
ð 	
r7   c                 ó$   — t        | «      t        v S r9   )r%   r   ©Úobjs    r,   r1   z ConstantVariable.is_base_literaln   s   € ä�C‹yÔ1Ð1Ð1r7   c                 ó°   — t        | «      t        t        t        t        t
        j                  fv rt        d„ | D «       «      S t        j                  | «      S )Nc              3   óF   K  — | ]  }t         j                  |«      –— Œ y ­wr9   )r   Ú
is_literal)Ú.0r(   s     r,   ú	<genexpr>z.ConstantVariable.is_literal.<locals>.<genexpr>u   s   è ø€ ÒC¸!Ô'×2Ñ2°1×5ÑCùs   ‚!)
r%   r   r    r   r   ÚtorchÚSizeÚallr   r1   rN   s    r,   rR   zConstantVariable.is_literalr   s?   € ä�‹9œœu¤c¬9´e·j±jÐAÑAÜÑC¸sÔCÓCÐCÜ×/Ñ/°Ó4Ð4r7   c                 ó    — 	 | j                  «       D �cg c]  }t        j                  |«      ‘Œ c}S c c}w # t        $ r}t        |‚d }~ww xY wr9   )rD   r   r   Ú	TypeErrorÚNotImplementedError)r5   rH   r(   Úes       r,   rI   z$ConstantVariable.unpack_var_sequencex   sH   € ð	-Ø8<×8OÑ8OÓ8QÖR°1Ô$×+Ñ+¨AÕ.ÒRÐRùÒRøÜò 	-Ü%¨1Ð,ûð	-ús!   ‚8 ”3°8 ³8 ¸	AÁAÁAc                 óŒ   — t        | j                  |«      st        ‚t        | j                  |«      }t	        |«      rt        ‚|S r9   )Úhasattrr&   rZ   ÚgetattrÚcallable)r5   rH   ÚnameÚmembers       r,   Úconst_getattrzConstantVariable.const_getattr~   s9   € Ü�t—z‘z 4Ô(Ü%Ð%Ü˜Ÿ™ TÓ*ˆÜ�FÔÜ%Ð%Øˆr7   r   c                 ó(
  •‡— ddl mŠ |dk(  rQt        | j                  t        «      r7t        j                  t        j                  «      j                  || g|¢|«      S |dk(  r˜t        | j                  t        «      r~t        |«      dk(  rt        |«      dk(  sJ ‚|d   j                  |«      }	 |D �cg c]  }|j                  «       ‘Œ }}t        j                  | j                  j                  |«      «      S t%        ˆfd„|D «       «      r@t        j                  | j'                  «       | j                  «      j#                  ||||«      S 	 |D �cg c]  }|j                  «       ‘Œ }	}|j)                  «       D �
�ci c]  \  }
}|
|j                  «       “Œ }}
}t+        | j                  t        «      rR|t        j,                  j/                  «       v r2t1        | j                  |«      }	 t        j                   ||	i |¤Ž«      S t+        | j                  t8        t:        f«      �r|s0|s.t        j                   t1        | j                  |«      «       «      S t=        t>        |«      �r$t        |«      dk(  �r|d   jA                  «       �r|	d   }t1        t>        |«      }t+        |tB        jD                  tB        jF                  tB        jH                  f«      r=|jJ                  jM                  d|| j                  |fi «      }‰j                  |||«      S t        j                   || j                  |«      «      S t+        | j                  tN        «      r6|dk(  r1t1        | j                  |«      }t        j                   ||	i |¤Ž«      S |d	k(  r,|s*|s(t        j                  t        | j                  «      «      S |d
k(  r[t        |«      dk(  rM|d   jA                  «       r:t        j                  tQ        | j                  |d   j                  «       «      «      S |dk(  r[t        |«      dk(  rM|d   jA                  «       r:|rJ ‚|d   j                  «       }|| j                  v }t        j                  |«      S t         ‰| �E  ||||«      S c c}w # t        $ r t         ‰| �E  ||||«      cY S w xY wc c}w c c}}
w # t        $ r t         ‰| �E  ||||«      cY S w xY w# t2        $ r }t5        t7        |«      |«       Y d }~�Œyd }~ww xY w)Nr   )ÚSymNodeVariableÚformatÚjoinr   c              3   ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr9   )r   )rS   r(   rd   s     €r,   rT   z/ConstantVariable.call_method.<locals>.<genexpr>œ   s   øè ø€ Ò<°!Œz˜!˜_×-Ñ<ùs   ƒÚcall_functionÚdecodeÚ__len__Ú	__round__Ú__contains__))Útensorrd   r   r&   Ústrr   ÚBuiltinVariablere   rh   ÚlenÚforce_unpack_var_sequencerD   r   r   rf   rZ   r/   Úcall_methodÚanyr<   r)   r   Ú__dict__Úkeysr^   Ú	Exceptionr	   r%   ÚfloatÚintr]   ÚoperatorrF   rU   ÚSymBoolÚSymFloatÚSymIntÚoutputÚcreate_proxyÚbytesÚround)r5   rH   r`   Úargsr'   Úarg_unpackedr(   Ú	arg_constÚaÚ
const_argsÚkÚvÚconst_kwargsÚmethodr[   Ú
add_targetÚopÚproxyÚsearchÚresultrd   r6   s                       @€r,   rr   zConstantVariable.call_method†   sH  ù€ õ 	,à�8Ò¤ t§z¡z´3Ô 7Ü×,Ñ,¬S¯Z©ZÓ8×FÑFØ�T�M˜D�M 6óð ð �VŠ^¤ t§z¡z´3Ô 7Ü�t“9 ’>¤c¨&£k°QÒ&6Ð6Ð6Ø ™7×<Ñ<¸RÓ@ˆLðCØ=IÖJ¸˜Q×1Ñ1Õ3ÐJ�	ÐJÜ'×.Ñ.¨t¯z©z¯©¸yÓ/IÓJÐJô Ó<°tÔ<Ô<ä×,Ñ,¨T¯]©]«_¸d¿j¹jÓI×UÑUØ�D˜$ óð ð	?Ø:>Ö?°Q˜!×.Ñ.Õ0Ð?ˆJÐ?ØBHÇ,Á,Ã.×Q¹$¸!¸Q˜A˜q×3Ñ3Ó5Ñ5ÐQˆLÑQô �d—j‘j¤#Ô&¨4´3·<±<×3DÑ3DÓ3FÑ+FÜ˜TŸZ™Z¨Ó.ˆFð6Ü'×.Ñ.©v°zÐ/RÀ\Ñ/RÓSÐSô ˜Ÿ
™
¤U¬C LÕ1Ù™FÜ'×.Ñ.Ð/H¬w°t·z±zÀ4Ó/HÓ/JÓKÐKäœ $Õ'Ü˜“I “NØ˜‘G×.Ñ.Õ0à'¨™]�
ÜœX tÓ,�ÜØ¤§¡´·±ÄÇÁÐ Môð ŸI™I×2Ñ2Ø'¨¨d¯j©j¸*Ð-EÀró�Eð +×1Ñ1°"°e¸ZÓHÐHä+×2Ñ2±2°d·j±jÀ*Ó3MÓNÐNÜ˜Ÿ
™
¤EÔ*¨t°xÒ/?Ü˜TŸZ™Z¨Ó.ˆFÜ#×*Ñ*©6°:Ð+NÀÑ+NÓOÐOà�9Ò¡d©fÜ#×*Ñ*¬3¨t¯z©z«?Ó;Ð;Ø�[Ò ¤S¨£Y°!¢^¸¸Q¹×8RÑ8RÔ8TÜ#×*Ñ*Ü�d—j‘j $ q¡'×"<Ñ"<Ó">Ó?óð ð �^Ò#¬¨D«	°Qª¸4À¹7×;UÑ;UÔ;WÙÐ�:Ø˜!‘W×/Ñ/Ó1ˆFØ˜tŸz™zÐ)ˆFÜ#×*Ñ*¨6Ó2Ð2Ü‰wÑ" 2 t¨T°6Ó:Ð:ùòu Køä&ò CÜ‘wÑ*¨2¨t°T¸6ÓBÒBðCüò @ùÛQøÜ"ò 	?Ü‘7Ñ& r¨4°°vÓ>Ò>ð	?ûô ò 6Ü(¬¨a«°"×5Ò5ûð6úsl   Â1R Â5RÃ/R ÅS ÅR<Å,S ÆSÆS Ç0S( ÒR ÒR9Ò8R9Ò<S ÓS%Ó$S%Ó(	TÓ1TÔTr`   c                 ól   — t        | j                  |«      }t        j                  j	                  |«      S r9   )r]   r&   r   r   r   )r5   rH   r`   rŽ   s       r,   Úcall_obj_hasattrz!ConstantVariable.call_obj_hasattrÓ   s+   € ô ˜Ÿ™ TÓ*ˆÜ×)Ñ)×0Ñ0°Ó8Ð8r7   ©r   N©rH   r   )r�   zlist[VariableTracker]r'   zdict[str, VariableTracker]r   r   )r@   Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr   r   r0   r<   rn   rB   rD   rF   Úpropertyr)   rL   r1   rR   rI   rb   rr   r�   Ú__classcell__©r6   s   @r,   r   r      så   ø„ ñð ð1 ?ò 1ó ð1õ@ò ðT˜#ó Tòòð ñ1ó ð1ð
Ð 7ð 
¸oó 
ð
 ñ2ó ð2ð ñ5ó ð5ò
-óðK;ð &ð	K;ð
 -ðK;ð 
õK;ðZ9Ø)ð9Ø14ð9à	÷9r7   r   c                   óT   ‡ — e Zd ZdZd	ˆ fd„Zed„ «       Zd„ Zdefd„Z	d„ Z
d
d„Zˆ xZS )ÚEnumVariablezÐVariableTracker for enum.Enum and enum.IntEnum instances

    Provides specialized handling for Python enum types, supporting
    both standard Enum and IntEnum with proper value tracking and comparison.
    r   c                 ó2   •— t        ‰| �  di |¤Ž || _        y )Nr.   )r/   r0   r&   r4   s      €r,   r0   zEnumVariable.__init__á   s   ø€ Ü‰ÑÑ"˜6Ò"Øˆ�
r7   c           
      óD  — t        |t        j                  «      r8t        |«      D ]*  }|j                  |j                  «       k(  sŒ! | |fi |¤Žc S  t        dd|› dt        |«      › �d|› dt        |«      › d�g t        j                  ¢t        j                  ¢¬«       y )Nz!Failed to construct Enum variablezvalue: z, allowed enum values: z•Attempted to construct an Enum value that is non-constant (e.g. int, string) or is not an acceptable value for the Enum. Acceptable values for Enum `z`: ú.)Úgb_typeÚcontextÚexplanationÚhints)
r   r   r   r   r&   rD   r
   r   Ú
USER_ERRORÚSUPPORTABLE)ÚclsÚcls_typeÚvalue_vtÚoptionsra   s        r,   r   zEnumVariable.createå   s¨   € ä�h¤	× :Ñ :Ô;Ü˜x›.ò 2�Ø—<‘< 8×#>Ñ#>Ó#@Ó@Ù˜vÑ1¨Ñ1Ò1ð2ô 	Ø7Ø˜h˜ZÐ'>¼tÀH»~Ð>NÐOð+à+3¨*°C¼¸X»Ð7GÀqðJð RÔ%×0Ñ0ÐQÔ3D×3PÑ3PÐQö	
r7   c                 óx   — t        | j                  t        «      rt        | j                  «      S | j                  S r9   )r   r&   rx   r;   s    r,   r<   zEnumVariable.as_proxyô   s(   € Ü�d—j‘j¤#Ô&Ü�t—z‘z“?Ð"Ø�z‰zÐr7   c                 ó4   — dt        | j                  «      › d�S )NzEnumVariable(r?   )r%   r&   r;   s    r,   rB   zEnumVariable.__repr__ù   s   € Øœt D§J¡JÓ/Ð0°Ð2Ð2r7   c                 ó   — | j                   S r9   r:   r;   s    r,   rD   zEnumVariable.as_python_constantü   r=   r7   c                 ó  — t        | j                  |«      st        ‚|t        v rt	        j
                  | |«      S t        | j                  |«      }| j                  xr t        | j                  |«      }t        j                  |||¬«      S )Nr   )r]   r&   rZ   r   r   ÚGetAttrVariabler^   r   r   r   Úbuild)r5   rH   r`   ra   r   s        r,   Úvar_getattrzEnumVariable.var_getattrÿ   sp   € Ü�t—z‘z 4Ô(Ü%Ð%ØÔ)Ñ)Ü×,Ñ,¨T°4Ó8Ð8Ü˜Ÿ™ TÓ*ˆØ—‘Ò>¤¨D¯K©K¸Ó!>ˆÜ×$Ñ$ R¨¸Ô?Ð?r7   r‘   r’   )r@   r“   r”   r•   r0   Úclassmethodr   r<   rn   rB   rD   r¯   r˜   r™   s   @r,   r›   r›   Ú   s=   ø„ ñõð ñ
ó ð
òð
3˜#ó 3ò÷@r7   r›   )r•   ry   Útypingr   rU   Útorch._dynamo.sourcer   r   Ú r   r   Úexcr	   r
   Úutilsr   r   r   r   Úbaser   Útorch._dynamo.symbolic_convertr   r   r›   r.   r7   r,   ú<module>r¸      sL   ðñó Ý  ã ß :ç +ß <ß MÓ MÝ !ñ ÝDô|9�ô |9ô~,@�?õ ,@r7   