U
    ªÊ¹j@  ã                
   @   sš   d dl Z d dlmZmZ d dlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZ ed	ed
ejdejdejdiZG dd„ deƒZG dd„ deƒZdS )é    N)ÚDictÚListé   )Ú	variables)Úunimplemented)ÚistypeÚnpé   )ÚtypestrÚVariableTrackerz!List types must use ListVariable.z&Dict types must use ConstDictVariable.z%Tensor types must use TensorVariable.zvSymInts must use SymNodeVariable. If the underlying value is static, we will create a ConstantVariable and specialize.z SymInts must use SymNodeVariablec                       s˜   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zedd„ ƒZ	e
dœdd„Zedd„ ƒZdd„ Zdd„ Zddddœ‡ fdd„Zeddœdd„Z‡  ZS )ÚConstantVariablec                    sf   t ƒ jf |Ž t |¡s<t ¡ D ]\}}t||ƒr t|ƒ‚q td k	r\t|tj	ƒr\| 
¡ | _n|| _d S ©N)ÚsuperÚ__init__r   Ú
is_literalÚ_type_to_assert_reasonÚitemsÚ
isinstanceÚAssertionErrorr   ÚnumberÚitemÚvalue)Úselfr   ÚkwargsZdisallowed_typeÚreason©Ú	__class__© ú_/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/variables/constant.pyr      s    
zConstantVariable.__init__c                 C   s   | j S r   ©r   ©r   r   r   r   Úas_proxy)   s    zConstantVariable.as_proxyc                 C   s   dt | jƒj› d�S )NzConstantVariable(ú))Útyper   Ú__name__r    r   r   r   Ú__str__,   s    zConstantVariable.__str__c                 C   s
   t | jƒS r   ©r#   r   r    r   r   r   Úpython_type0   s    zConstantVariable.python_typec                 C   s   | j S r   r   r    r   r   r   Úas_python_constant3   s    z#ConstantVariable.as_python_constantc                 C   s   | j dd�S )zz
        Need this when adding a BaseListVariable and a ConstantVariable together.
        Happens in detectron2.
        N)Útx)Úunpack_var_sequencer    r   r   r   r   6   s    zConstantVariable.items)Úargc                 C   s    t | j| ¡  ft | |g¡ŽS r   )r   r   r(   r   Ú	propagate)r   r+   r   r   r   Úgetitem_const>   s
    ÿþzConstantVariable.getitem_constc                 C   sH   t | ƒtttt d ƒtfkrdS t | ƒttttfkrDt	dd„ | D ƒƒS dS )NTc                 s   s   | ]}t  |¡V  qd S r   )r   r   ©Ú.0Úxr   r   r   Ú	<genexpr>I   s     z.ConstantVariable.is_literal.<locals>.<genexpr>F)
r#   ÚintÚfloatÚboolÚstrÚlistÚtupleÚsetÚ	frozensetÚall)Úobjr   r   r   r   D   s
    zConstantVariable.is_literalc              
      sR   z$t  | g¡‰ ‡ fdd„|  ¡ D ƒW S  tk
rL } z
t|‚W 5 d }~X Y nX d S )Nc                    s   g | ]}t |fˆ Ž‘qS r   )r   r.   ©Úoptionsr   r   Ú
<listcomp>O   s     z8ConstantVariable.unpack_var_sequence.<locals>.<listcomp>)r   r,   r(   Ú	TypeErrorÚNotImplementedError)r   r)   Úer   r<   r   r*   L   s
    z$ConstantVariable.unpack_var_sequencec                 C   s   t | j|ƒ}t|ƒrtƒ ‚|S r   ©Úgetattrr   Úcallabler@   ©r   r)   ÚnameÚmemberr   r   r   Úconst_getattrS   s    zConstantVariable.const_getattrzList[VariableTracker]zDict[str, VariableTracker]r   )Úargsr   Úreturnc              	      st  ddl m‰  t ˆˆ| ¡ ¡}tˆjtƒrTtj	f ˆ 
|¡ˆjdœ|—Ž |ˆˆ|¡S tˆjtƒrŠtjf ˆ 
|¡ˆjdœ|—Ž |ˆˆ|¡S t‡ fdd„ˆD ƒƒr¾t ˆ ¡ ˆj¡ |ˆˆ|¡S z$dd„ ˆD ƒ}dd	„ | ¡ D ƒ}W n( tk
�r
   tƒ  |ˆˆ|¡ Y S X ‡‡‡fd
d„}tˆjtƒ�rXˆtj ¡ k�rXtˆjˆƒ}	t|	||Žf|ŽS |tƒ�sl|tƒ�rÜttˆƒ}
|d }t|tjtjfƒ�rÈddl m‰  |j  !d|
ˆj|fi ¡}ˆ j"|||f|ŽS t|
ˆj|ƒf|ŽS ˆdk�rˆ�s|�stt#ˆjƒf|ŽS ˆdk�rVt#ˆƒdk�rVˆd  $¡ �rV|�r4t%‚ˆd  &¡ }|ˆjk}t|f|ŽS t'dt(ˆjƒ› dˆ› �ƒ d S )Nr	   ©ÚSymNodeVariable)r   Úsourcec                 3   s   | ]}t |ˆ ƒV  qd S r   )r   r.   rK   r   r   r1   o   s     z/ConstantVariable.call_method.<locals>.<genexpr>c                 S   s   g | ]}|  ¡ ‘qS r   ©r(   )r/   Úar   r   r   r>   v   s     z0ConstantVariable.call_method.<locals>.<listcomp>c                 S   s   i | ]\}}||  ¡ “qS r   rN   )r/   ÚkÚvr   r   r   Ú
<dictcomp>w   s      z0ConstantVariable.call_method.<locals>.<dictcomp>c                    s.   t ˆj| ƒo,ttˆƒo,tˆ ƒdko,ˆ d  ¡ S )Nr	   r   )r   r   ÚhasattrÚoperatorÚlenÚis_python_constant)Znum_ty)rI   rF   r   r   r   Úhas_arith_binop{   s    ÿ
þ
üz5ConstantVariable.call_method.<locals>.has_arith_binopr   Zcall_functionÚ__len__Ú__contains__zconst method call Ú.))ZtensorrL   r   r,   Úvaluesr   r   r7   r   ZTupleVariabler*   rM   Úcall_methodr6   ZListVariableÚanyr!   r   r@   r   r   r5   Ú__dict__ÚkeysrC   r   r2   r3   rT   ÚtorchÚSymIntÚSymFloatÚoutputZcreate_proxyÚcreaterU   rV   r   r(   r   r
   )r   r)   rF   rI   r   r=   Z
const_argsZconst_kwargsrW   ÚmethodÚopZ
add_targetÚproxyÚsearchÚresultr   )rL   rI   rF   r   r   r\   Y   s~     ÿÿ   þ ÿÿ   þ   ÿ
   ÿ&

zConstantVariable.call_method)rF   rJ   c                 C   s   t | j|ƒ}t |¡ | ¡S r   )rS   r   r   r   Úadd_options)r   r)   rF   ri   r   r   r   Úcall_hasattrŸ   s    zConstantVariable.call_hasattr)r$   Ú
__module__Ú__qualname__r   r!   r%   r'   r(   Úpropertyr   r   r-   Ústaticmethodr   r*   rH   r\   r5   rk   Ú__classcell__r   r   r   r   r      s"   


úFr   c                       sD   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z‡  Z	S )ÚEnumVariablec                    s   t ƒ jf |Ž || _d S r   )r   r   r   )r   r   r   r   r   r   r   ¥   s    zEnumVariable.__init__c                 C   s   | j S r   r   r    r   r   r   r!   ©   s    zEnumVariable.as_proxyc                 C   s   dt | jƒ› d�S )NzEnumVariable(r"   r&   r    r   r   r   r%   ¬   s    zEnumVariable.__str__c                 C   s
   t | jƒS r   r&   r    r   r   r   r'   ¯   s    zEnumVariable.python_typec                 C   s   | j S r   r   r    r   r   r   r(   ²   s    zEnumVariable.as_python_constantc                 C   s   t | j|ƒ}t|ƒrtƒ ‚|S r   rB   rE   r   r   r   rH   µ   s    zEnumVariable.const_getattr)
r$   rl   rm   r   r!   r%   r'   r(   rH   rp   r   r   r   r   rq   ¤   s   rq   )rT   Útypingr   r   r`   Ú r   Úexcr   Úutilsr   r   Úbaser
   r   r6   ÚdictZTensorra   rb   r   r   rq   r   r   r   r   Ú<module>   s(        ó 