U
    ªÊ¹jÒÓ  ã                   @   sŽ  d dl Z d dlZ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	 d dl
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mZ ddlmZ dd	lmZ dd
lmZmZmZ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+m,Z, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZC e DeE¡ZFG dd„ de0ƒZGdS )é    N)ÚDictÚList)Ú	sym_floatÚsym_inté   )ÚconfigÚ	variables)Ú
is_allowed)ÚAttributeMutationErrorÚunimplementedÚUnsupportedÚ	UserErrorÚUserErrorType)ÚGuardBuilder)ÚDummyModule)Ú
AttrSourceÚis_constant_sourceÚSuperSourceÚ
TypeSource)Úbuild_checkpoint_variableÚcheck_constant_argsÚcheck_numpy_ndarray_argsÚcheck_unspec_python_argsÚget_fake_valueÚguard_if_dynÚis_utils_checkpointÚistypeÚnumpy_operator_wrapperÚproxy_args_kwargsÚspecialize_args_kwargsé   )ÚMutableLocalÚtypestrÚVariableTracker)ÚConstantVariableÚEnumVariable)ÚConstDictVariable)ÚBaseListVariableÚListIteratorVariableÚListVariableÚSetVariableÚSizeVariableÚTupleIteratorVariableÚTupleVariable)ÚFakeItemVariableÚSymNodeVariableÚUnspecializedPythonVariable)ÚUserDefinedVariablec                       s˜  e Zd Zee d¡dd„ ƒƒZdd„ Zee d¡dd„ ƒƒZee d¡dd	„ ƒƒZ	ee d¡d
d„ ƒƒZ
edd„ ƒZdd„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd d!„ Zed"d#„ ƒZd$d%d&d'œ‡ fd(d)„Zd*d+„ Zd,d-„ Zd.d/„ ZeZeZd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Z dyd8d9„Z!e!Z"e!Z#e!Z$e!Z%ed:d;„ ƒZ&d<d=„ Z'ed>d?„ ƒZ(d@dA„ Z)dBdC„ Z*dDdE„ Z+dFdG„ Z,dHdI„ Z-dJdK„ Z.dLdM„ Z/dNdO„ Z0dPdQ„ Z1dRdS„ Z2dTdU„ Z3dVdW„ Z4dzdXdY„Z5d{e6e6dZœd[d\„Z7e6e6e6d]œd^d_„Z8e6e6dZœd`da„Z9e6dbœdcdd„Z:e6dbœdedf„Z;e6dbœdgdh„Z<didj„ Z=dkdl„ Z>dmdn„ Z?dodp„ Z@dqdr„ ZAdsdt„ ZBdudv„ ZCdwdx„ ZDeAZEeAZFeAZGeAZHeAZIeAZJeAZKeAZL‡  ZMS )|ÚBuiltinVariableNc               4   C   sÌ   t ttttttttt	t
tttttttjtttjtjtjtjtjtjtjtjtjtjtjtjtj tj!tj"tj#tj$tj%tj&tj'tj(tj)tj*tj+tj,tj-tj.tj/tj0tj1tj2tj3h4} |  4dd„ t5j6 7¡ D ƒ¡ | S )Nc                 s   s"   | ]}t |ttjƒƒr|V  qd S ©N)Ú
isinstanceÚtypeÚmathÚsqrt©Ú.0Úx© r;   ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/variables/builtin.pyÚ	<genexpr>r   s      z;BuiltinVariable._constant_fold_functions.<locals>.<genexpr>)8ÚabsÚallÚanyÚboolÚcallableÚchrÚdivmodÚfloatÚintÚlenÚmaxÚminÚordÚpowÚreprÚroundÚstrÚformatÚsumr5   ÚoperatorÚposÚnegÚnot_ÚinvertÚmulÚmatmulÚfloordivÚtruedivÚmodÚaddÚsubÚgetitemÚlshiftÚrshiftÚand_Úor_ÚxorÚipowÚimulÚimatmulÚ	ifloordivÚitruedivÚimodÚiaddÚisubÚilshiftÚirshiftÚiandÚixorÚiorÚindexÚupdater6   Ú__dict__Úvalues©Zfnsr;   r;   r<   Ú_constant_fold_functions9   sn    Ì6z(BuiltinVariable._constant_fold_functionsc                 C   s   | j |  ¡ kS r3   )Úfnru   ©Úselfr;   r;   r<   Úcan_constant_fold_throughu   s    z)BuiltinVariable.can_constant_fold_throughc                  C   s„   t jt jt jt jt jt jt jt jt j	t j
t jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jh} | S r3   ) rQ   rR   rS   rT   rU   rK   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rt   r;   r;   r<   Ú_fx_graph_functionsx   sB    á!z#BuiltinVariable._fx_graph_functionsc                  C   sº   t jdddgt jft jdddgt jft jddd	gt jft jd
ddgt jft j	dddgt j
ft jdddgt jftdddgt jft jdddgt jft jdddgt jft jdddgt jfi
} | S )NÚ__add__Ú__radd__Ú__iadd__Ú__sub__Ú__rsub__Ú__isub__Ú__mul__Ú__rmul__Ú__imul__Ú__truediv__Ú__rtruediv__Ú__itruediv__Ú__floordiv__Ú__rfloordiv__Ú__ifloordiv__Ú__mod__Ú__rmod__Ú__imod__Ú__pow__Ú__rpow__Ú__ipow__Ú
__lshift__Ú__rlshift__Ú__ilshift__Ú
__rshift__Ú__rrshift__Ú__irshift__)rQ   r[   ri   r\   rj   rV   rd   rY   rg   rX   rf   rZ   rh   rK   rc   r^   rk   r_   rl   rt   r;   r;   r<   Ú_binopsž   s<       þþ   þþízBuiltinVariable._binopsc                     sþ  i } t  ¡  ¡ D ]ü\}\}}g | |< g | |< |\}}}||fdd„}| |  ttf|f¡ | |  ttf|f¡ |fdd„}| |  ttf|f¡ | |  ttf|f¡ |fdd„}	| |  ttf|	f¡ | |  ttf|	f¡ | |  ttf|	f¡ | |  ttf|	f¡ qdd„ }
d	d
„ }ttf|fttf|
ftt	f|
ft	tfdd„ ft
t
fdd„ fg}| tj  |¡ dd„ }ttf|fttf|
ftt	f|
fg}| tj  |¡ dd„ ‰ tt	fˆ ftt	fˆ ft	tf‡ fdd„ft	tf‡ fdd„fg}| tj  |¡ | S )Nc                 S   s2   t |tƒr| | ||gi ¡S | | ||gi ¡S d S r3   )r4   r1   Úcall_method)ÚtxÚaÚbÚoptionsÚforward_nameÚreverse_namer;   r;   r<   Úuser_defined_handler×   s    
z=BuiltinVariable._binop_handlers.<locals>.user_defined_handlerc                 S   s   |  | ||gi ¡S r3   ©r—   )r˜   r™   rš   r›   rœ   r;   r;   r<   Úuser_defined_inplace_handlerù   s    zEBuiltinVariable._binop_handlers.<locals>.user_defined_inplace_handlerc                 S   s4   ddl m} || | jjd|ft||gi ƒžŽ f|ŽS ©Nr    )Úwrap_fx_proxyÚcall_function)Úbuilderr¢   ÚoutputÚcreate_proxyr   )r˜   r™   rš   r›   rv   r¢   r;   r;   r<   Údynamic_handler  s     ÿÿþûz8BuiltinVariable._binop_handlers.<locals>.dynamic_handlerc                 S   s   t |jt| | ¡ƒ f|ŽS r3   )r-   ÚitemsÚlistÚunpack_var_sequence©r˜   r™   rš   r›   r;   r;   r<   Útuple_add_handler#  s    z:BuiltinVariable._binop_handlers.<locals>.tuple_add_handlerc                 S   s   t |jt| | ¡ƒ f|ŽS r3   )r+   r¨   r©   rª   r«   r;   r;   r<   Úsize_add_handler&  s    z9BuiltinVariable._binop_handlers.<locals>.size_add_handlerc                 S   s   t t| | ¡ƒ|j f|ŽS r3   )r-   r©   rª   r¨   r«   r;   r;   r<   Ú<lambda>;  s   ÿÿz1BuiltinVariable._binop_handlers.<locals>.<lambda>c                 S   s   t |ƒ|j|j f|ŽS r3   )r5   r¨   r«   r;   r;   r<   r®   A  ó    c              	   S   sD   |j r| | ¡sd S |  |tt|jƒt| | ¡ƒ fddi|—Ž¡S )NZregen_guardsF)Úmutable_localÚhas_unpack_var_sequenceÚreplace_allr)   r©   r¨   rª   r«   r;   r;   r<   Úlist_iadd_handlerF  s    ÿþýþz:BuiltinVariable._binop_handlers.<locals>.list_iadd_handlerc                 S   s"   |j f |j| ¡  tƒ dœ|—ŽS )N)r¨   r°   )Ú	__class__r¨   Úas_python_constantr!   )r˜   ÚlstÚconstr›   r;   r;   r<   Úexpand_list_likee  s    þýz9BuiltinVariable._binop_handlers.<locals>.expand_list_likec                    s   ˆ | |||ƒS r3   r;   r«   ©r¸   r;   r<   r®   q  r¯   c                    s   ˆ | |||ƒS r3   r;   r«   r¹   r;   r<   r®   u  r¯   )r2   r–   r¨   Úappendr1   r#   r/   r+   r-   r$   r'   rQ   r[   Úextendr)   ri   rV   )Zop_handlersÚopZmagic_method_namesZin_place_oprœ   r�   Zinplace_namerž   r    r§   r¬   r­   Zlist_like_addition_handlersr³   Zlist_like_iadd_handlersZlist_like_expansion_handlersr;   r¹   r<   Ú_binop_handlersÃ   s¢    	
ý
ú

ÿ
ÿÿ

ÿ
ÿ
ÿ
ÿ
ÿ
ÿþþþþþêþþþ÷


þ
þùzBuiltinVariable._binop_handlersc                 C   sJ   t  ¡ }| |krd S ||  D ](\\}}}t||ƒrt||ƒr|  S qd S r3   )r2   r½   r4   )r¼   r™   rš   ÚhandlersZtype1Ztype2Úhandlerr;   r;   r<   Ú_find_binop_handler|  s    
z#BuiltinVariable._find_binop_handlerc                 C   s   | j |  ¡ kS r3   )rv   rz   rw   r;   r;   r<   Úcan_insert_in_graph‰  s    z#BuiltinVariable.can_insert_in_graphc                    s   t ƒ jf |Ž || _d S r3   )ÚsuperÚ__init__rv   )rx   rv   Úkwargs©r´   r;   r<   rÃ   Œ  s    zBuiltinVariable.__init__c                 C   s,   | j d krd}n| j j}| jj› d|› d�S )NÚNoneú(ú))rv   Ú__name__r´   )rx   Únamer;   r;   r<   Ú__str__�  s    
zBuiltinVariable.__str__c                 C   s
   t | jƒS r3   )r5   rv   rw   r;   r;   r<   Úpython_type˜  s    zBuiltinVariable.python_typec                 C   s   | j S r3   )rv   rw   r;   r;   r<   rµ   ›  s    z"BuiltinVariable.as_python_constantc                    s4   t tj ttjttji}| j|kr*|| j S tƒ  ¡ S r3   )	rA   ÚtorchrF   Zint64rE   Zfloat64rv   rÂ   Úas_proxy)rx   ZDTYPErÅ   r;   r<   rÎ   ž  s       ý

zBuiltinVariable.as_proxyc                 C   s>   | j j}| j jdkst‚||jjks,tdƒ‚|j|ddd�gS )NÚbuiltinszshadowed globalFT)r[   )rv   rÉ   Ú
__module__ÚAssertionErrorr˜   Ú	f_globalsZcreate_load_global)rx   ZcodegenrÊ   r;   r;   r<   Úreconstruct¨  s    zBuiltinVariable.reconstructc                 O   s
   t ||ƒS r3   )r   ©rx   ÚargsrÄ   r;   r;   r<   Úconstant_args®  s    zBuiltinVariable.constant_argsc                 O   s>   t dd„ t || ¡ ¡D ƒƒo<t dd„ t || ¡ ¡D ƒƒ S )Nc                 s   s   | ]}t |tjƒV  qd S r3   )r4   r   ÚTensorVariable©r9   Úir;   r;   r<   r=   ²  s   ÿz.BuiltinVariable.tensor_args.<locals>.<genexpr>c                 s   s   | ]}t |tjƒV  qd S r3   )r4   r   ÚGetAttrVariablerØ   r;   r;   r<   r=   µ  s   ÿ)r@   Ú	itertoolsÚchainrs   rÔ   r;   r;   r<   Útensor_args±  s    þþýzBuiltinVariable.tensor_argsc                 O   s
   t ||ƒS r3   )r   rÔ   r;   r;   r<   Úunspec_python_argsº  s    z"BuiltinVariable.unspec_python_argsc                 C   s„   g }i }| D ].}t |tjfƒr,| |j¡ q| | ¡ ¡ q|D ]:\}}t |tjfƒrh| ||ji¡ q@| || ¡ i¡ q@||fS r3   )r4   r   r0   rº   Ú	raw_valuerµ   rq   )rÕ   rÄ   Zunwrapped_argsZunwrapped_kwargsr:   ÚkÚvr;   r;   r<   Úunwrap_unspec_args_kwargs½  s"    þþz)BuiltinVariable.unwrap_unspec_args_kwargszList[VariableTracker]zDict[str, VariableTracker]r#   )rÕ   rÄ   Úreturnc              
      s   ddl m}m} t||ƒ}| j||Ž}| j||Ž}t | || ¡ ¡}	|  	¡ oR|pR|}
t
|ttfƒsft‚t
|tƒstt‚| jtjkr¤t
|d tjƒs¤d}t|||ƒ\}}|  ¡ �rö|�rö| jtjkràt
|d tƒràt
|d tjƒ�sö�zâ| j}| jtjk�r"t
|d tjƒ�r"tj|d |d g }}| jtjk�r`t
|d tƒ�r`tj|d t d¡|d g }}t||ƒ�r´tdd„ |D ƒƒ�s´|jj dt!| jƒft"||ƒžŽ }|tj#||f|	ŽW S |jj d|ft"||ƒžŽ }tdd„ |D ƒƒ�rô|t$||f|	ŽW S | j||Ž�rX|  %||¡\}}| j||Ž}td	d„ t& '|| ¡ ¡D ƒƒ}|t(||f||d
œ|	—ŽW S t)dd„ |D ƒƒ�r€tj*||d f|	ŽW S | jtj+k�r²t
|d tj(ƒ�r²|d  ,|¡|d< |||f|	ŽW S W n0 t-k
�rô   t.d| › d|› d|› �ƒ Y nX | jt/t0fk�rZt
|d tƒ�rZ| jt/k�r&t1nt2}|f ||j  d||d  3¡ fi ¡dœ|	—Ž}|S t4|ƒdk�r¸t4|ƒdk�r¸t5 6| j|d |d ¡}|�r¸|||d |d |	ƒ}|d k	�r¸|S t7| d| jj8› �d ƒ}|�r.zt9 :|¡j;|f|ž|Ž W n< t<k
�r, } z|
�st= >d||¡ d }W 5 d }~X Y nX |�r”z*||f|ž|Ž}|d k	�r\| ?|	¡W S W n4 t@k
�r’ } z|
�sz‚ | A¡  W 5 d }~X Y nX |
�rÚt|||ƒ\}}tj|  B¡ dd„ |D ƒdd„ | C¡ D ƒŽf|	ŽS | jtDk�rt4|ƒdk�rt
|d tƒ�rtEtFjGdƒ‚tHƒ  I|||¡S )Nr    )r¢   Úwrap_fx_proxy_clsr   Fc                 s   s   | ]}t |ƒtjkV  qd S r3   )r5   r   r×   ©r9   Úargr;   r;   r<   r=     s    z0BuiltinVariable.call_function.<locals>.<genexpr>r£   c                 s   s   | ]}t |tƒV  qd S r3   ©r4   r.   rå   r;   r;   r<   r=     s     c                 s   s    | ]}t |tjƒr|jV  qd S r3   ©r4   r   r0   Úneed_unwrapr8   r;   r;   r<   r=   #  s   þ)rß   ré   c                 s   s   | ]}t |tƒV  qd S r3   ©r4   r/   r8   r;   r;   r<   r=   1  s     zpartial tensor op: ú ©r˜   Úproxyr   Zcall_z1incorrect arg count %s %s and no constant handlerc                 S   s   g | ]}|  ¡ ‘qS r;   ©rµ   r8   r;   r;   r<   Ú
<listcomp>x  s     z1BuiltinVariable.call_function.<locals>.<listcomp>c                 S   s   i | ]\}}||  ¡ “qS r;   rî   )r9   rà   rá   r;   r;   r<   Ú
<dictcomp>y  s      z1BuiltinVariable.call_function.<locals>.<dictcomp>zgCalling round() on symbolic value is not supported. You can use floor() to implement this functionality)Jr¤   r¢   rä   r   rÝ   rÞ   r#   Ú	propagaters   ry   r4   r©   ÚtuplerÑ   Údictrv   rQ   r]   r   r×   r   rÁ   r&   ri   r$   r[   r/   rÍ   Úselectr   r@   r¥   r¦   r   r   ÚNumpyNdarrayVariabler.   râ   rÛ   rÜ   r0   r?   ÚcreaterY   Zconvert_to_constantÚNotImplementedErrorr   rF   rE   r   r   rÎ   rG   r2   rÀ   ÚgetattrrÉ   ÚinspectÚ	signatureÚbindÚ	TypeErrorÚlogÚwarningÚadd_optionsr   Zremove_from_statsrµ   r¨   rM   r   r   ZSTANDARD_LIBRARYrÂ   r£   )rx   r˜   rÕ   rÄ   r¢   rä   rÖ   rÝ   rÞ   r›   Zhas_constant_handlerrv   rí   Ú_argsÚ_kwargsrß   ré   Zfn_ÚoutZbinop_handlerÚresr¿   ÚexcÚresultrÅ   r;   r<   r£   Ó  s:   
ÿ ÿÿþ
üûú	 ÿýÿ
þý  ÿÿþýýüþýûú ÿ  üþø
  ÿ
ý
þÿûþzBuiltinVariable.call_functionc                 G   sr   t |ƒdkr4|d  |¡r4|d  |¡}|  ||¡S t |ƒdkrV|  ||d |d ¡S t |ƒdkrn|  ||¡S d S )Nr    r   r   )rG   r±   rª   Ú_call_min_max_seqÚ_call_min_max_binary©rx   r˜   rÕ   r¨   r;   r;   r<   Ú_call_min_max‡  s    zBuiltinVariable._call_min_maxc                 C   s:   t |ƒdkst‚t |ƒdkr$|d S t t | j|¡|¡S ©Nr   r    )rG   rÑ   Ú	functoolsÚreduceÚpartialr  )rx   r˜   r¨   r;   r;   r<   r  ‘  s    z!BuiltinVariable._call_min_max_seqc                 C   sè  |   ||¡�r0t|tjƒs$|| }}t|tjƒs4t‚t|tƒrVt tj¡ 	||gi ¡}t|t
ƒsjt|t
ƒr¸ddlm} |t|ƒf||jjd| jft||gi ƒžŽ dœt | ||g¡—ŽS | ¡ �rt|tjƒrädd l}t |j¡}nt tj¡}| jtk�rd|ind|i}| 	||g|¡}njt|tjƒ�rVdd l}t|jt|ji| j }t |¡}n ttjttji| j }t |¡}| 	|||gi ¡}tdd	„ ||fD ƒƒ�r*td
d	„ ||fD ƒƒ�rÄtj  |¡S | ¡ �rØ| !¡ }	n|j"}	| jtk�røt|j"|	ƒ}
nt|j"|	ƒ}
tdd	„ ||fD ƒƒ}tj#  ||
|¡S |S n´t|tj$ƒ�r‚t|tj$ƒ�r‚| jtk�rlt $t|j%|j%ƒ¡S t $t|j%|j%ƒ¡S nbt|t
ƒ�sšt|t
ƒ�rÈ|jjd| jft||gi ƒžŽ }t
 &||d ¡S t'dt(|ƒ› dt(|ƒ› �ƒ d S )Nr    ©rä   r£   rì   r   rI   rH   c                 s   s    | ]}t |tjtjfƒV  qd S r3   )r4   r   r0   r$   rØ   r;   r;   r<   r=   Ç  s   ùþþz7BuiltinVariable._call_min_max_binary.<locals>.<genexpr>c                 s   s   | ]}t |tƒV  qd S r3   rç   )r9   Úvalr;   r;   r<   r=   Ñ  s     c                 s   s    | ]}t |tjƒr|jV  qd S r3   rè   r8   r;   r;   r<   r=   Ý  s   þz unsupported min / max over args z, ))rÝ   r4   r   r×   rÑ   r.   ÚTorchVariablerÍ   Útensorr£   r/   r¤   rä   r5   r¥   r¦   rv   r   r#   rñ   Úis_python_constantrõ   ÚnumpyZNumpyVariableZclipÚclamprH   ÚmaximumrI   Úminimumr?   r@   Zfrom_tensor_variablerµ   rß   r0   r$   Úvaluerö   r   rN   )rx   r˜   r™   rš   rä   Únprv   rÄ   r  Zraw_bZraw_resré   rí   r;   r;   r<   r  ˜  sŽ    

ÿþýýø

ø



þ  ÿ ÿ ÿÿz$BuiltinVariable._call_min_max_binaryc                 G   sT   | j |Ž s| j|Ž r.t||i ƒ\}}t |¡S | j|Ž rPdd„ |D ƒ}t |¡S d S )Nc                 S   s   g | ]}t  t|ƒ¡‘qS r;   )r   r$   r   rå   r;   r;   r<   rï   ÿ  s     z.BuiltinVariable.call_range.<locals>.<listcomp>)rÞ   rÖ   r   r   ZRangeVariableÚ_dynamic_args)rx   r˜   rÕ   Ú_r;   r;   r<   Ú
call_rangeú  s    


zBuiltinVariable.call_rangec                 O   s(   t dd„ |D ƒƒp&t dd„ | ¡ D ƒƒS )Nc                 s   s   | ]}t |tƒV  qd S r3   rê   r8   r;   r;   r<   r=     s     z0BuiltinVariable._dynamic_args.<locals>.<genexpr>)r@   rs   rÔ   r;   r;   r<   r    s    ÿzBuiltinVariable._dynamic_argsc                 G   s
   t  |¡S r3   )r   ZSliceVariable)rx   r˜   rÕ   r;   r;   r<   Ú
call_slice	  s    zBuiltinVariable.call_slicec                 O   sD   ddl m} t | || ¡ ¡}|||jjd| jft||ƒžŽ f|ŽS r¡   )	r¤   r¢   r#   rñ   rs   r¥   r¦   rv   r   )rx   r˜   rÕ   rÄ   r¢   r›   r;   r;   r<   Ú
_dyn_proxy  s     ÿÿþûzBuiltinVariable._dyn_proxyc                 O   s  | j ||Žr| j|f|ž|ŽS tj | j¡}|d kr\|tkrL||g tƒ d�S |g tƒ d�S n¤| |¡�r t	ƒ }|j
r²t|j
ƒs²t|tƒrž| |j
 tj¡¡ n| |j
 tj¡¡ |tkrÞ||t| |¡ƒtƒ |d� | |¡S |t| |¡ƒtƒ |d� | |¡S d S )N©r°   )r°   Úguards)r  r  r   r'   Zcls_forrv   r*   r!   r±   ÚsetÚsourcer   r4   r,   r[   Z
make_guardr   ZTUPLE_ITERATOR_LENZLIST_LENGTHr©   rª   rÿ   )rx   r˜   ÚobjrÕ   rÄ   Úclsr  r;   r;   r<   Ú_call_iter_tuple_list  sL    ýþ
ü ûý üz%BuiltinVariable._call_iter_tuple_listc                    s>   |d kp<t |tƒp<t |tttfƒo<t‡ fdd„| ˆ ¡D ƒƒS )Nc                 3   s4   | ],}t |ttfƒo*t | ˆ ¡d  ttfƒV  qdS )r   N)r4   r)   r-   rª   r$   r%   r8   ©r˜   r;   r<   r=   P  s   ü ÿz=BuiltinVariable.is_supported_call_dict_arg.<locals>.<genexpr>)r4   r&   r)   r-   r(   r?   rª   )r˜   ræ   r;   r%  r<   Úis_supported_call_dict_argB  s    ÿýþûôz*BuiltinVariable.is_supported_call_dict_argc                 C   s0   ddl m} t|tj|fƒr,t d¡ |¡S d S )Nr    )ÚBaseUserFunctionVariableT)Z	functionsr'  r4   r   ÚUserDefinedClassVariabler$   rÿ   )rx   r˜   ræ   r'  r;   r;   r<   Úcall_callableZ  s     ÿzBuiltinVariable.call_callablec                 K   sÌ   |d kst |tƒr4t|d k	r |ni |tƒ d� |¡S t |tjƒrV|j|tƒ d� |¡S t |ttt	fƒrÀ|ƒ }| 
| ¡D ]2}| 
| ¡d  ¡ }| 
| ¡d }| ||i¡ qvt||tƒ d� |¡S tdƒ‚d S )Nr  ©Úuser_clsr°   r   r    z!call_dict_helper with illegal arg)r4   ró   r&   r!   rÿ   r   Úcloner)   r-   r(   rª   rµ   rq   rÑ   )r˜   r+  ræ   r›   r¨   r:   rà   rá   r;   r;   r<   Úcall_dict_helperb  sF      ÿþ ÿþýþ  ÿþz BuiltinVariable.call_dict_helperc                 O   s,   t |ƒdkr|d S td|› d|› �ƒ d S )Nr   r    z$unsupported args to builtin cast(): rë   )rG   r   )rx   r  rÕ   rÄ   r;   r;   r<   Ú	call_cast  s    zBuiltinVariable.call_castc                 O   s~   |s|s|   |td ¡S |sHt|ƒdkrH|  ||d ¡rH|   |t|d ¡S |sf|rftjt|ƒttƒ d�S td|› d|› �ƒ d S )Nr    r   r*  zdict(): rë   )r-  ró   rG   r&  r   r&   r!   r   ©rx   r˜   rÕ   rÄ   r;   r;   r<   Ú	call_dict…  s     ÿ
þý  ÿzBuiltinVariable.call_dictc                    sX   t  | |¡‰ t‡fdd„|D ƒƒrT‡ fdd„t‡fdd„|D ƒŽ D ƒ}tj|fˆ ŽS d S )Nc                 3   s   | ]}|  ˆ ¡V  qd S r3   ©r±   r8   r%  r;   r<   r=   —  s     z+BuiltinVariable.call_zip.<locals>.<genexpr>c                    s   g | ]}t jt|ƒfˆ Ž‘qS r;   )r   r-   r©   )r9   Úitem©r›   r;   r<   rï   ˜  s   ÿz,BuiltinVariable.call_zip.<locals>.<listcomp>c                    s   g | ]}|  ˆ ¡‘qS r;   )rª   rå   r%  r;   r<   rï   š  s     )r#   rñ   r?   Úzipr   r-   r  r;   )r›   r˜   r<   Úcall_zip•  s    
þzBuiltinVariable.call_zipc                    s�   t  | |¡‰ t|ƒdkrd}n0t|ƒdks.t‚t|d tjƒsBt‚|d  ¡ }|d  |¡rŒ‡ fdd„t	|d  
|¡|ƒD ƒ}tj|fˆ ŽS d S )Nr    r   r   c                    s,   g | ]$\}}t jt j|fˆ Ž|gfˆ Ž‘qS r;   )r   r-   r$   )r9   ÚidxÚvarr3  r;   r<   rï   §  s   üÿþz2BuiltinVariable.call_enumerate.<locals>.<listcomp>)r#   rñ   rG   rÑ   r4   r   r$   rµ   r±   Ú	enumeraterª   r-   )rx   r˜   rÕ   Ústartr¨   r;   r3  r<   Úcall_enumeratež  s    
ûzBuiltinVariable.call_enumeratec                 O   s   |d   |d|dd … |¡S )Nr   Ú__len__r    rŸ   r/  r;   r;   r<   Úcall_len°  s    zBuiltinVariable.call_lenc                 O   s8   | j ||Žrt|||ƒ\}}|d  |d|dd … |¡S )Nr   Ú__getitem__r    )rÞ   r   r—   r/  r;   r;   r<   Úcall_getitem³  s    zBuiltinVariable.call_getitemc                 C   sÈ   |  ¡ }| ¡ }t|tjƒr6|jd k	r6t | |¡¡S t|tjƒrdt|j	t
jƒrdtd|› d|› �ƒ t|tjƒr’d|jjkr’t |j ||j	¡¡S zt||ƒ}W n tk
r¼   ||k}Y nX t |¡S )Nz&isinstance called on UserDefinedClass rë   Ú__instancecheck__)rÌ   rµ   r4   r   r×   Zdtyper$   Úcall_isinstanceÚUserDefinedObjectVariabler  ÚtypesÚMemberDescriptorTyper   r´   rr   r?  Ú
issubclassrü   )rx   r˜   ræ   Zisinstance_typeZarg_typer  r;   r;   r<   r@  ¸  s.     ÿÿ
ÿ
þÿzBuiltinVariable.call_isinstancec                 C   s8   |j d ks|j d krd nt|j |j d�}tj|||d�S )N)r5   Úbase©r!  )r!  r   r   ZSuperVariable)rx   r˜   r™   rš   r!  r;   r;   r<   Ú
call_superÖ  s    ÿÿýzBuiltinVariable.call_superc                 C   sJ   t |tjƒr(| ¡ \}}| ||¡ |S t |tjƒrF|jd  | |¡S d S )Nr   )r4   r   r(   Znext_variablesr²   r'   r¨   rÿ   )rx   r˜   ræ   r  Z	next_iterr;   r;   r<   Ú	call_nextÞ  s    zBuiltinVariable.call_nextc                 C   s*   |  ¡ r&| ¡ }| ||¡ | ||¡S d S r3   )r  rµ   Úcall_hasattrrÿ   )rx   r˜   r"  ÚattrrÊ   r;   r;   r<   rI  æ  s    zBuiltinVariable.call_hasattrc                    s<   |  ˆ¡r8‡ ‡fdd„| ˆ¡D ƒ}t |¡ | ˆ |¡S d S )Nc                    s   g | ]}ˆ   ˆ|gi ¡‘qS r;   )r£   r8   ©rv   r˜   r;   r<   rï   í  s     z,BuiltinVariable.call_map.<locals>.<listcomp>)r±   rª   r   r-   rÿ   )rx   r˜   rv   Úseqr¨   r;   rK  r<   Úcall_mapë  s    
zBuiltinVariable.call_mapc              	   K   sº   t |tjtjfƒrHtdd„ |jD ƒƒrH|sHdd„ |jD ƒ}t t|ƒ¡S | |¡r¶| 	dt d¡¡ 
¡ }|rpt‚| |¡|d … }ttjƒ |ttjƒt |¡t d¡ | |¡gi ¡S d S )Nc                 s   s*   | ]"}t |tjƒo t |jttfƒV  qd S r3   )r4   r   r$   r  rF   rE   r8   r;   r;   r<   r=   ô  s   þz+BuiltinVariable.call_sum.<locals>.<genexpr>c                 S   s   g | ]
}|j ‘qS r;   )r  r8   r;   r;   r<   rï   û  s     z,BuiltinVariable.call_sum.<locals>.<listcomp>r9  r   )r4   r   r)   r-   r?   r¨   r$   rP   r±   Úpoprµ   rÑ   rª   r2   r  r  r£   rQ   r[   rÿ   )rx   r˜   rL  rÄ   Znew_listr9  r¨   r;   r;   r<   Úcall_sumð  s2    ÿýþù	
 ÿ
ýùzBuiltinVariable.call_sumc                 C   s\   |  |¡rX| |¡}|d kr4|d |dd …  }}n|}|D ]}| |||gi ¡}q<|S d S r
  )r±   rª   r£   )rx   r˜   ÚfunctionÚiterableZinitializerr¨   r  Úelementr;   r;   r<   Úcall_reduce  s    

zBuiltinVariable.call_reduce)r"  Úname_varc                 C   s&  ddl m}m}m}m}m}	 ddlm}
 t 	| ||¡}|d }| 
¡ }| ¡ sVtdƒ |jj |¡r’z|jj ||¡ |¡W S  tk
r�   Y nX |d k	rÖ|  |||¡}| |j¡ | 
¡ dksÄt‚| 
¡ sÖ| |¡S |jròt|j|ƒ}||d< nd }t|tjƒ�r| ||¡ |¡S t|tjƒ�rˆ|dk�rˆ|�r||jjD ]4}|j|j k�r<|j!j"}|
||ƒ|ƒ |¡  S �q<td	ƒ ntd	ƒ �nšt|tjtj#tjtj$tj%fƒ�rîz| ||¡j&|d
� |¡W S  t'k
�rè   |||f|Ž Y S X �n4t||ƒ�rft(|j)|ƒ}t*|ƒ�r"||d< t+f |ŽS t,|ƒ�r8||f|ŽS | -|¡�rP||f|ŽS |
||ƒ|ƒ |¡S n¼t||t.fƒ�r°|j)j/| }t0j1�rœ|j2 3|j)||¡ |
||ƒ|ƒ |¡S t4||	ƒ�rà|dk�rà|t(|j5|ƒft 	|¡ŽS z| ||¡j&|d
� |¡W S  t'k
�r    |||f|Ž Y S X d S )Nr    )r$   rÚ   ÚPythonModuleVariabler  ÚUserFunctionVariable©ÚVariableBuilderr  znon-const getattr() name)TFr!  Úgradztensor gradrF  )rÉ   rÐ   )6Ú r$   rÚ   rU  r  rV  r¤   rX  r#   rñ   rµ   r  r   r¥   Úside_effectsÚis_attribute_mutationZ	load_attrrÿ   ÚKeyErrorrI  rq   r  rÑ   Z
add_guardsr!  r   r4   r   ÚNNModuleVariableÚvar_getattrr×   Z	graphargsrE  ÚexamplerY  ZNamedTupleVariabler(  rA  r,  r÷   rø   r  r   r   r	   Z
is_literalr   rr   r   Zreplay_record_enabledZexec_recorderZrecord_module_accessr   rv   )rx   r˜   r"  rT  Údefaultr$   rÚ   rU  r  rV  rX  r›   r  rÊ   Zhasattr_varr!  ZgraphargZexample_valueÚmemberr;   r;   r<   Úcall_getattr  s”    

ÿ
ûþ
ÿ



ÿÿÿzBuiltinVariable.call_getattr)r"  rT  r  c                 C   st  ddl m} t|tj|fƒr0| |d||gi ¡S |jj |¡rj| 	¡ rj|jj 
|| ¡ |¡ | | ||¡S t|tjƒrŽtdt|jƒj› �ƒ nât|tjƒ�rp|j ¡ s®tdƒ‚| 	¡ �rft|tjƒ�rft| ¡ j|ƒ}z| || ¡ ¡}W n tk
�r   d }Y nX t|tjƒ�rft| ¡ j|ƒ}tjj|||jdd�}	t |j d¡}
|	|k�rf|
t!j"j#jk�rf|S | $|¡ d S )Nr    )ÚPlacementVariableÚ__setattr__z#setattr(UserDefinedObjectVariable) z?Can't inplace modify module params/buffers inside HigherOrderOpT)r!  Z	is_tensor)%Údistributedrd  r4   r   ZDataClassVariabler—   r¥   r[  r\  r  Z
store_attrrµ   rÿ   rA  r   r5   r  re  r^  Zis_root_tracerr
   r×   r   rÎ   Únoder_  ÚAttributeErrorr¤   Zwrap_to_fake_tensor_and_recordr!  rù   Úgetattr_staticÚmodule_typerÍ   ÚnnÚModuleZconvert_to_unspecialized)rx   r˜   r"  rT  r  rd  Zassigning_fake_valZgetattr_varZexisting_attrZexisting_fake_attrZmod_setattrr;   r;   r<   Úcall_setattr~  sV    ÿþÿ
ÿ ÿ
   ÿÿÿþzBuiltinVariable.call_setattrc                 C   s   |   |||t ¡ ¡S r3   )rm  r   ZDeletedVariable)rx   r˜   r"  rT  r;   r;   r<   Úcall_delattr±  s    zBuiltinVariable.call_delattr)r"  c                 C   sˆ   ddl m} z| ¡ }W n tk
r0   d }Y nX t|tjƒrNt|ƒ | |¡S |d k	rx|j	rx||t
|j	ƒƒ|ƒ | |¡S ttjdƒ‚d S )Nr    rW  zJCan't call type() on generated custom object. Please use __class__ instead)r¤   rX  rÌ   r÷   r   r   r-   r2   rÿ   r!  r   r   r   ZANTI_PATTERN)rx   r˜   r"  rX  Zpy_typer;   r;   r<   Ú	call_type´  s     
 ÿþzBuiltinVariable.call_typec                 C   s6   |  |¡r2tt| |¡ƒƒ}tj|ft | |¡ŽS d S r3   )r±   r©   Úreversedrª   r   r-   r#   rñ   )rx   r˜   r"  r¨   r;   r;   r<   Úcall_reversedÊ  s    
ÿ
ÿzBuiltinVariable.call_reversedc                    s´   |  ˆ¡r°t|tjƒs°tdd„ | ˆ¡D ƒƒr°| dd ¡‰ | dtdƒ¡ ¡ }t	|ƒdks^t
‚ˆ r‚t| ˆ¡‡ ‡fdd„|d	�}nt| ˆ¡d
d„ |d	�}tj|ft | |¡ŽS d S )Nc                 s   s   | ]}|  ¡ V  qd S r3   ©r  r8   r;   r;   r<   r=   Õ  s     z.BuiltinVariable.call_sorted.<locals>.<genexpr>ÚkeyÚreverseFr   c                    s   ˆ   ˆ| gi ¡ ¡ S r3   )r£   rµ   ©r:   ©rP  r˜   r;   r<   r®   ß  s     ÿz-BuiltinVariable.call_sorted.<locals>.<lambda>)rs  rt  c                 S   s   |   ¡ S r3   rî   ru  r;   r;   r<   r®   ç  r¯   )r±   r4   r   r×   r?   rª   rN  r$   rµ   rG   rÑ   Úsortedr)   r#   rñ   )rx   r˜   r"  rÄ   rt  r¨   r;   rv  r<   Úcall_sortedÑ  s0    ÿ
þý ÿûýzBuiltinVariable.call_sortedc                    sR   t ‡ fdd„|D ƒƒrNg }|D ]}| | ˆ ¡¡ qtj|ftj| f|žŽ ŽS d S )Nc                 3   s   | ]}|  ˆ ¡V  qd S r3   r1  )r9   r"  r%  r;   r<   r=   í  s     z-BuiltinVariable.call_chain.<locals>.<genexpr>)r?   r»   rª   r   r-   r#   rñ   )rx   r˜   rÕ   r¨   r"  r;   r%  r<   Ú
call_chainì  s    ÿÿzBuiltinVariable.call_chainc                 G   sh   |  |¡rdtdd„ |D ƒƒrddd„ |D ƒ}| |¡}ttj|f|žŽ ƒ}tj|ftj	| |f|žŽ ŽS d S )Nc                 s   s   | ]}|  ¡ V  qd S r3   rr  r8   r;   r;   r<   r=   ö  s    z.BuiltinVariable.call_islice.<locals>.<genexpr>c                 S   s   g | ]}|  ¡ ‘qS r;   rî   r8   r;   r;   r<   rï   ù  s     z/BuiltinVariable.call_islice.<locals>.<listcomp>)
r±   r?   rª   r©   rÛ   Úislicer   r-   r#   rñ   )rx   r˜   rQ  rÕ   Z
const_argsr¨   r;   r;   r<   Úcall_isliceõ  s    ÿ
ÿÿzBuiltinVariable.call_islicec                 C   s(   t |tƒr$tj|t | ¡ ¡d d�S d S )N©Zsym_num)r4   r/   rö   rQ   rS   rÎ   ©rx   r˜   r™   r;   r;   r<   Úcall_neg  s    
ýzBuiltinVariable.call_negc                 G   sR   t |ƒdkr@t|d tjƒr@|d }|j |j¡}t t|ƒ¡S t	d|› �ƒ d S )Nr   zcall_id with args )
rG   r4   r   r^  r¥   Úget_submoduleÚ
module_keyr$   Úidr   )rx   r˜   rÕ   Znn_mod_variablerZ   r;   r;   r<   Úcall_id  s
    zBuiltinVariable.call_idc                    sº  ddl m}m‰ m‰m}m}m} ddlm} ddl	m
}	m}
 | j‰‡‡‡fdd„}t‡ ‡fdd„ˆˆfD ƒƒrÈˆ|	 ¡ krÈtˆˆƒr’|j ˆj¡nˆ ¡ ‰tˆˆƒr²|j ˆj¡nˆ ¡ ‰ˆ ˆˆˆƒƒS tˆ|ƒ�rˆ|	 ¡ kræ|ƒ  tˆ|ƒsö|ƒ  ˆ ˆˆjˆjƒƒS tˆ|tfƒ�r8tˆt|fƒ�r8| |ˆˆˆ¡S tˆ|ƒ�rltˆƒtˆƒk�s\|ƒ  | |ˆˆˆ¡S tˆtƒ�r¢tˆƒtˆƒk�s�|ƒ  ˆ ˆˆjˆjƒƒS tˆ|ƒ�rìdd	lm} ˆ|
 ¡ k�rÎ|ƒ  |tˆƒ|ˆˆ ¡ ˆ ¡ ƒƒS tˆtƒ�stˆtƒ�r6ˆ|
 ¡ k�r|ƒ  tj|ˆˆ ¡ ˆ ¡ ƒd
d�S tˆˆ ƒ�r`tˆˆ ƒ�r`ˆ ˆˆjˆjƒƒS tˆ|ƒ�rŠtˆ|ƒ�rŠˆ ˆˆjˆjƒƒS ˆjdk�r°tˆƒtˆƒk	�r°ˆ dƒS |ƒ  d
S )z¢
        Used to implement comparison operators for different types.
        For example, list1 < list2 is implemented differently from tensor1 < tensor2
        r    )r'   r$   r^  r×   rA  rV  )r+   )Úsupported_const_comparison_opsÚsupported_tensor_comparison_opsc                      s&   t dtˆ ƒ› dˆ› dtˆƒ› �ƒ d S )Nzcomparison rë   )r   r"   r;   )Úleftr¼   Úrightr;   r<   Ú_unimplemented(  s    z3BuiltinVariable._comparison.<locals>._unimplementedc                 3   s   | ]}t |ˆˆ fƒV  qd S r3   )r4   r8   )r$   r^  r;   r<   r=   ,  s   ÿz.BuiltinVariable._comparison.<locals>.<genexpr>r  Nr|  Úis_F) rZ  r'   r$   r^  r×   rA  rV  Úlistsr+   r  rƒ  r„  rv   r?   rs   r4   r¥   r  r€  rµ   r-   Zlist_comparer5   r*   Z_underlying_itemsr¤   rä   rÎ   r/   rö   r  rÉ   )rx   r˜   r…  r†  r'   r×   rA  rV  r+   rƒ  r„  r‡  rä   r;   )r$   r^  r…  r¼   r†  r<   Ú_comparison  s†     þÿ
û	ÿýÿý
 ÿýý ÿzBuiltinVariable._comparisonc                 C   sL   t |ttfƒrHt |ttfƒrHtj||jjdtjft||gi ƒžŽ d d�S d S ©Nr£   r|  )	r4   r/   r$   rö   r¥   r¦   rQ   r`   r   ©rx   r˜   r™   rš   r;   r;   r<   Ú	call_and_}  s     ÿ ÿÿûzBuiltinVariable.call_and_c                 C   sL   t |ttfƒrHt |ttfƒrHtj||jjdtjft||gi ƒžŽ d d�S d S r‹  )	r4   r/   r$   rö   r¥   r¦   rQ   ra   r   rŒ  r;   r;   r<   Úcall_or_Œ  s     ÿ ÿÿûzBuiltinVariable.call_or_c                 C   s\   t |tƒr4tj||jjdtjft|gi ƒžŽ d d�S t |tƒrXt	t
|jƒdkƒ | |¡S d S )Nr£   r|  r   )r4   r/   rö   r¥   r¦   rQ   rT   r   r)   r$   rG   r¨   rÿ   r}  r;   r;   r<   Ú	call_not_š  s    
 ÿ
ÿû
zBuiltinVariable.call_not_)N)N)N)NrÉ   rÐ   Ú__qualname__Ústaticmethodr  Ú	lru_cacheru   ry   rz   r–   r½   rÀ   rÁ   rÃ   rË   rÌ   rµ   rÎ   rÓ   rÖ   rÝ   rÞ   râ   r£   r	  r  r  Zcall_minZcall_maxr  r  r  r  r$  Z	call_iterZ
call_tupleÚ	call_listZcall_setr&  r)  r-  r.  r0  r5  r:  r<  r>  r@  rG  rH  rI  rM  rO  rS  r#   rc  rm  rn  ro  rq  rx  ry  r{  r~  r‚  rŠ  r�  rŽ  r�  Zcall_eqZcall_gtZcall_ltZcall_geZcall_leZcall_neZcall_is_Zcall_is_notÚ__classcell__r;   r;   rÅ   r<   r2   8   s¼   :$# 8

	
 þ 5
_

%

	
 ÿ ÿg  ÿ3	
jr2   )Hr  rù   rÛ   Úloggingr6   rQ   rB  Útypingr   r   rÍ   r   r   rZ  r   r   Zallowed_functionsr	   r  r
   r   r   r   r   r  r   Zreplay_recordr   r!  r   r   r   r   Úutilsr   r   r   r   r   r   r   r   r   r   r   rE  r!   r"   r#   Zconstantr$   r%   Zdictsr&   r‰  r'   r(   r)   r*   r+   r,   r-   r  r.   r/   r0   Zuser_definedr1   Ú	getLoggerrÉ   rý   r2   r;   r;   r;   r<   Ú<module>   s0   4$	
