U
    ©Ê¹jüY  ã                   @   sŒ  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 d dlmZm	Z	m
Z
mZmZmZmZmZ d dlZd dlmZ d dlZd dlm  mZ d dlmZmZ d dlmZ e e¡Zzrd dl Z e j!e"dœdd	„Z#eG d
d„ dƒƒZ$e	de	dœdd„Z%G dd„ dejj&ƒZ'G dd„ dƒZ(G dd„ dƒZ)W n e*k
�r<   dZ+Y nX dZ+d dl,m-Z- e.dœdd„Z/e0dœdd„Z1dd„ Z2G dd „ d eƒZ3e2ƒ  dS )!é    N)Ú	dataclass)ÚAnyÚCallableÚDictÚListÚSetÚTupleÚTypeÚUnion)ÚTorchDynamoException)ÚArgumentÚTarget)Úsympy_interp©ÚeÚreturnc           
         sÒ  t  | ¡std| › �ƒ‚t jtt dœdd„}t  | ¡} t  | ¡sPtd| › �ƒ‚t  	| ¡sdt  
| ¡rl|  ¡ S |  ¡ }| ¡ ‰t|ƒ}|| ƒ}ˆt jkržd}�nˆt jt jfkrÆ‡ ‡fdd„‰ ˆ | ƒ}nêˆt jk�r8|  ¡ d	ksât‚|  d
¡}t  |¡sút‚| ¡  ¡ }t jdt jdt jdi}||k�r°|| }||ƒ}nxˆt jt jfk�rŠ|  ¡ d	k�s\t‚t|  d
¡ƒ}| d¡�r†d|dd …  S |S ˆt jk�r°|  ¡ d
k�s¨t‚t|ƒS |d d |¡ }	d|	 ¡ › d�S )Nzunsupported expression type: r   c                    s   ‡ fdd„t ˆ  ¡ ƒD ƒS )Nc                    s   g | ]}t ˆ  |¡ƒ‘qS © )Úz3strÚarg)Ú.0Úi©r   r   ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/fx/experimental/validator.pyÚ
<listcomp>>   s     z/z3str.<locals>.get_args_str.<locals>.<listcomp>)ÚrangeÚnum_argsr   r   r   r   Úget_args_str=   s    zz3str.<locals>.get_args_strzcan't print Z3 expression: Úpowc                    sD   t  ˆ ¡rˆ  ¡  ¡ ˆks$tˆ ƒgS ‡‡ fdd„tˆ  ¡ ƒD ƒS d S )Nc                    s$   g | ]}ˆ ˆ  |¡ƒD ]}|‘qqS r   )r   )r   r   Úx)Úcollect_str_argsr   r   r   r   ]   s    þz3z3str.<locals>.collect_str_args.<locals>.<listcomp>)Úz3Úis_appÚdeclÚkindr   r   r   r   ©r   r#   r   r   r   Y   s
    

þzz3str.<locals>.collect_str_argsé   r   z!=ú>ú<z(/z(idivé   ú ú(ú))r    Zis_exprÚAssertionErrorÚExprRefr   ÚstrÚsimplifyr!   Ú
ValueErrorZis_int_valueZis_rational_valueÚ	as_stringr"   r#   ZZ3_OP_POWERZ	Z3_OP_ADDZ	Z3_OP_MULZ	Z3_OP_NOTr   r   ZZ3_OP_EQZZ3_OP_LEZZ3_OP_GEZZ3_OP_TO_INTZZ3_OP_TO_REALr   Ú
startswithZZ3_OP_UNINTERPRETEDÚjoinÚrstrip)
r   r   r"   ÚopÚargsr   ZargkindZlogic_inverseZargstrÚstringr   r$   r   r   :   sT    





   ý

r   c                   @   s  e Zd ZU ded< eejejdœdd„ƒZeejejdœdd„ƒZejejejdœd	d
„Z	ejejdœdd„Z
ejejejdœdd„Zejejdœdd„Zejejejdœdd„Zejejejdœdd„Zejejejdœdd„Zejejejdœdd„Zejejdœdd„ZdS ) ÚZ3OpsÚTranslationValidatorÚ	validator)r   r   c                 C   s   |   ¡ r| S t | ¡S ©N)Úis_realr    ZToReal©r   r   r   r   Úto_realœ   s    zZ3Ops.to_realc                 C   s   |   ¡ r| S t | ¡S r;   )Zis_intr    ZToIntr=   r   r   r   Úto_int¡   s    zZ3Ops.to_int©Ú	numeratorÚdenominatorr   c                 C   s$   | j  |dk¡ t |¡t |¡ S ©Nr   )r:   Úadd_assertionr8   r>   ©ÚselfrA   rB   r   r   r   Údiv¦   s    z	Z3Ops.div)Únumberr   c                 C   s
   t  |¡S r;   )r8   r?   ©rF   rH   r   r   r   Úfloorª   s    zZ3Ops.floorc                 C   s4   |  ¡ p|  ¡ }t |  ||¡¡}|r0t |¡S |S r;   )r<   r8   r?   rG   r>   )rF   rA   rB   Zcast_result_to_realÚresultr   r   r   Úfloordiv°   s    zZ3Ops.floordivc                 C   s"   t  |  |¡|k |  |d ¡|¡S )Nr%   )r    ÚIfrJ   rI   r   r   r   Úceil·   s
    ýz
Z3Ops.ceil)ÚaÚbr   c                 C   s   t  ||k||¡S r;   ©r    rM   ©rF   rO   rP   r   r   r   Úmax¾   s    z	Z3Ops.maxc                 C   s   t  ||k ||¡S r;   rQ   rR   r   r   r   ÚminÁ   s    z	Z3Ops.min©ÚpÚqr   c                 C   s   ||   ||¡|  S r;   )rL   ©rF   rV   rW   r   r   r   ÚmodÆ   s    z	Z3Ops.mod©ÚbaseÚexpr   c                 C   s$   | j  t |dk|dk¡¡ || S rC   )r:   rD   r    ÚOr©rF   r[   r\   r   r   r   r   É   s    z	Z3Ops.powc                 C   s"   t  |¡}| j |dk¡ |d S )Nr   g      à?)r8   r>   r:   rD   rI   r   r   r   ÚsqrtÎ   s    
z
Z3Ops.sqrtN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__Ústaticmethodr    ÚArithRefr>   r?   rG   rJ   rL   rN   rS   rT   rY   r   r_   r   r   r   r   r8   ’   s   
r8   r9   )r5   r:   r   c                    sê   ddl m} tjtjtjh}| |k‰ ‡ fdd„}t|ƒ}tj|tjƒtj|tj	ƒtj|tj
ƒtj||jƒtj||jƒtj||jƒtj||jƒtj||jƒtj||jƒtj||jƒtj||jƒ|||jƒtjtji}| |krâ||  S || ƒS )Nr   )Úsym_sqrtc                    s0   t jdœ‡fdd„‰t ˆ ¡‡ ‡fdd„ƒ}|S )N©r   c                    sŽ   t | tjtjfƒr| S t | tƒs.ˆ r<t | tƒr<t t| ƒ¡S t | ttjfƒrZt 	t| ƒ¡S t | t
tjfƒrxt t
| ƒ¡S tdt| ƒ› �ƒ‚d S )Nzcan't lift type: )Ú
isinstancer    re   ÚBoolRefÚboolÚintÚBoolValÚsympyÚIntegerÚIntValÚfloatÚFloatÚRealValr0   Útype)rO   ©Zas_boolr   r   Úwrapë   s    z z3op.<locals>.lift.<locals>.wrapc                     s   ‡fdd„| D ƒ}ˆ |Ž S )Nc                 3   s   | ]}ˆ |ƒV  qd S r;   r   )r   rO   )ru   r   r   Ú	<genexpr>û   s     z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>r   )r6   Zwrapped_args©Úfuncru   r   r   Úwrapperø   s    z#z3op.<locals>.lift.<locals>.wrapper)r    r-   Ú	functoolsÚwraps)rx   ry   rt   rw   r   Úliftê   s    zz3op.<locals>.lift)Z%torch.fx.experimental.symbolic_shapesrf   ÚoperatorÚnot_Úand_Úor_r8   r    ÚNotÚAndr]   rL   ÚtruedivrG   rY   ÚmathrN   rJ   ÚtorchZ	sym_floatr>   Zsym_maxrS   Zsym_minrT   r_   Ú_assert)r5   r:   rf   Zboolean_opsr|   ZopsZreplacement_mapr   rt   r   Úz3opß   sB                 ìr‡   c                       st   e Zd Zejjddœ‡ fdd„Zeee	df e
eef edœdd„Zeee	df e
eef edœ‡ fd	d
„Z‡  ZS )ÚPopulateValidatorr9   )Úgraphr:   c                    s*   || _ tjji |d�}tƒ j|dd� d S )N)Úrootr‰   T)Zgarbage_collect_values)r:   r…   ÚfxZGraphModuleÚsuperÚ__init__)rF   r‰   r:   Úmodule©Ú	__class__r   r   r�   $  s    zPopulateValidator.__init__.)Útargetr6   Úkwargsr   c                 C   s   t  ¡ d }| j |¡S )NÚsymbol)Úfx_tracebackZget_current_metar:   Úz3var)rF   r‘   r6   r’   r“   r   r   r   Úplaceholder,  s    zPopulateValidator.placeholderc                    sN   |t jkrtƒ  |||¡S t|ƒdks:tdt|ƒ› d�ƒ‚| j |d ¡ d S )Nr%   z'expected 1 argument on assertion. Got: r)   r   )r…   r†   rŒ   Úcall_functionÚlenr,   r:   Úadd_source_expr)rF   r‘   r6   r’   r�   r   r   r—   0  s    
 zPopulateValidator.call_function)r`   ra   rb   r…   r‹   ZGraphr�   r   r   r   r   r.   r   r–   r—   Ú__classcell__r   r   r�   r   rˆ   #  s   $rˆ   c                   @   sâ   e Zd ZddddddddhZd	d
dœdd„Zeejej	dœdd„Z
ejejejdœdd„Zejejejdœdd„Zejejejdœdd„Zejejejdœdd„Zejejejdœdd„Zeedœdd „Zejej	d!œd"d#„Zd
S )$Ú	SympyToZ3ÚaddÚmulÚeqÚneÚltÚgtÚleÚger9   N)r:   r   c                 C   s   || _ t| j ƒ| _d S r;   )Ú
_validatorr8   Ú_ops)rF   r:   r   r   r   r�   C  s    zSympyToZ3.__init__)ÚvalueÚdtyper   c                 C   sZ   |t jkrt t|ƒ¡S |t jkr0t t|ƒ¡S |t jkrHt 	t|ƒ¡S t
d|› �ƒ‚d S )Nzunsupported dtype (SympyToZ3): )r…   Zint64r    ro   rk   Údoublerr   rp   rj   rl   r0   )rF   r¦   r§   r   r   r   ÚconstantJ  s    


zSympyToZ3.constantr@   c                 C   s   | j  ||¡S r;   )r¥   rG   rE   r   r   r   rƒ   S  s    zSympyToZ3.truedivc                 C   s   | j  ||¡S r;   ©r¥   rL   rE   r   r   r   rL   V  s    zSympyToZ3.floordivc                 C   s   | j  ||¡S r;   rª   rE   r   r   r   rG   Y  s    zSympyToZ3.divrZ   c                 C   s   | j  ||¡S r;   )r¥   r   r^   r   r   r   r   \  s    zSympyToZ3.powrU   c                 C   s   | j  ||¡S r;   )r¥   rY   rX   r   r   r   rY   _  s    zSympyToZ3.mod)Únamer   c                 C   sT   t jt jt j| jj| jjdœ}||kr.|| S || jkrBtt	|ƒS t
d|› �ƒ‚d S )N)r   r€   r~   rJ   rN   zunhandled operator: )r    r‚   r]   r�   r¥   rJ   rN   ÚOPERATOR_HANDLESÚgetattrr}   ÚAttributeError)rF   r«   ZREPLACEMENTr   r   r   Ú__getattr__b  s    û

zSympyToZ3.__getattr__)Úexprr   c                 C   s   t | | jj|ƒS r;   )r   r¤   Úsymbols)rF   r°   r   r   r   Úrunq  s    zSympyToZ3.run)r`   ra   rb   r¬   r�   r   r…   r§   r    r-   r©   re   rƒ   rL   rG   r   rY   r.   r¯   rm   ÚBasicr²   r   r   r   r   r›   @  s   ý	r›   c                   @   s¸   e Zd Zddœdd„Zejejdœdd„Zeje	ejdœd	d
„Z
ejddœdd„Zejejdœdd„Zejddœdd„Zejddœdd„Zeejejf ddœdd„Zddœdd„ZdS )r9   Nrg   c                 C   s,   t  d¡ i | _tƒ | _tƒ | _tƒ | _d S )Nznew instance)ÚlogÚdebugr±   ÚsetÚ_source_exprsÚ_target_exprsÚ_assertions)rF   r   r   r   r�   ƒ  s
    
zTranslationValidator.__init__)r“   r   c                 C   s"   || j kstd|› �ƒ‚| j | S )NzZ3 variable not found for: )r±   r,   )rF   r“   r   r   r   r•   ˜  s    zTranslationValidator.z3var)r“   rs   r   c                 C   sš   || j kr| j | S t d|j|j¡ |tkrRt |j¡}|jrŒ| j	 
|dk¡ n:|tkrht |j¡}n$|tkr~t |j¡}ntd|› �ƒ‚|| j |< |S )Nznew variable: %s (%s)r   z"unsupported type for Z3 variable: )r±   r´   rµ   r«   r`   rk   r    ZIntZis_positiver¸   rœ   rp   ÚRealrj   ZBoolÚRuntimeError)rF   r“   rs   Úvarr   r   r   Úadd_var�  s    


zTranslationValidator.add_varr   c                 C   s*   |j D ]}t|tjƒst‚|  |¡ qd S r;   )Zfree_symbolsrh   rm   ÚSymbolr,   r•   )rF   r   Úsr   r   r   Ú_check_freesymbolsµ  s    
z'TranslationValidator._check_freesymbolsc                 C   s,   t | ƒ |¡}t|tjƒs(td|› �ƒ‚|S )Nz"expected boolean expression. Got: )r›   r²   rh   r    ri   r,   ©rF   r   Zz3exprr   r   r   Úto_z3_boolean_expr½  s    z'TranslationValidator.to_z3_boolean_exprc                 C   s*   || j krt dt|ƒ¡ | j  |¡ d S )Nzadd source guard: %s)r·   r´   rµ   r   rœ   )rF   r   r   r   r   r™   Â  s    
z$TranslationValidator.add_source_exprc                 C   s>   |   |¡ |  |¡}|| jkr.t dt|ƒ¡ | j |¡ d S )Nzadd target guard: %s)rÀ   rÂ   r¸   r´   rµ   r   rœ   rÁ   r   r   r   Úadd_target_exprÇ  s
    


z$TranslationValidator.add_target_exprc                 C   s`   t |tjƒr"|  |¡ |  |¡}n|}t |tjƒs6t‚|| jkrPt	 
dt|ƒ¡ | j |¡ d S )Nzadd assertion: %s)rh   rm   r³   rÀ   rÂ   r    ri   r,   r¹   r´   rµ   r   rœ   )rF   r   Úrefr   r   r   rD   Î  s    

z"TranslationValidator.add_assertionc                    s   ddl m} t| jƒdks(t| jƒdkr,d S t d¡}|jtƒ d� | j	D ]}| 
|¡ qJ| 
t tj| jŽ ¡¡ |j
| jŽ  t d¡ |ƒ |jƒƒ }|tjkrÎ| ¡ ‰ tˆ | j	| j‡ fdd„| jD ƒd�‚n.|tjkrät d	¡ n|tjksòt‚t d
¡ d S )Nr   )Údynamo_timedZQF_NRA)Útimeoutztranslation validation: startc                    s   g | ]}ˆ   |¡s|‘qS r   )Úevaluate)r   Zinp©Úmodelr   r   r      s    
 z1TranslationValidator.validate.<locals>.<listcomp>)Úfailed_source_exprsz:translation validation: could not validate: got z3.unknownztranslation validation: success)Ztorch._dynamo.utilsrÅ   r˜   r·   r¸   r    Z	SolverForr¶   Útranslation_validation_timeoutr¹   rœ   r�   r‚   r´   rµ   ÚcheckÚsatrÉ   ÚValidationExceptionÚunknownÚwarningZunsatr,   )rF   rÅ   ZsolverZ	assertionÚrr   rÈ   r   ÚvalidateÙ  s2    



  
ÿþ
zTranslationValidator.validate)r`   ra   rb   r�   rm   r¾   r    r-   r•   r	   r½   r³   rÀ   ri   rÂ   r™   ÚExprrÃ   r
   rD   rÒ   r   r   r   r   r9   ‚  s   FT)Úconfigrg   c                   C   s   t ƒ  totjS r;   )Úassert_z3_installed_if_tv_setÚ_HAS_Z3rÔ   Útranslation_validationr   r   r   r   Útranslation_validation_enabled  s    rØ   c                   C   s   t jS r;   )rÔ   rË   r   r   r   r   rË     s    rË   c                   C   s   t stjrtdƒ‚d S )Nzotranslation validation requires Z3 package. Please, either install z3-solver or disable translation validation.)rÖ   rÔ   r×   r,   r   r   r   r   rÕ   !  s    ÿrÕ   c                       s   e Zd Z‡ fdd„Z‡  ZS )rÎ   c                    sŒ   t st‚tdœ‡ fdd„}tdœdd„}|t|ˆ ƒƒ}|tt|ƒƒ}|tt|ƒƒ}	|tt|ƒƒ}
tƒ  d| d | d |	 d	 |
 ¡ d S )
Nrg   c                    s   | › dˆ |  › �S )Nz: r   )ÚsymrÈ   r   r   Ú	symbolstr,  s    z/ValidationException.__init__.<locals>.symbolstrc                 S   s   d  dd„ | D ƒ¡S )NÚ
c                 s   s   | ]}d |› �V  qdS )z  ==> Nr   )r   r   r   r   r   rv   0  s     zBValidationException.__init__.<locals>.joinlines.<locals>.<genexpr>)r3   )Zxsr   r   r   Ú	joinlines/  s    z/ValidationException.__init__.<locals>.joinlinesz'translation validation failed.

Model:
z

Assertions:
z

Target Expressions:
z

Failed Source Expressions:
)rÖ   r,   r.   Úmapr   rŒ   r�   )rF   rÉ   Z
assertionsZtarget_exprsrÊ   rÚ   rÜ   Z	model_strZassertions_strZtarget_exprs_strZfailed_source_exprs_strr�   rÈ   r   r�   )  s0    ÿÿþþýýüÿzValidationException.__init__)r`   ra   rb   r�   rš   r   r   r�   r   rÎ   (  s   rÎ   )4rz   Úloggingr„   r}   rm   Údataclassesr   Útypingr   r   r   r   r   r   r	   r
   r…   Ztorch._dynamo.excr   Ztorch.fxZtorch.fx.tracebackr‹   Ú	tracebackr”   Ztorch.fx.noder   r   Ztorch.utils._sympy.interpr   Ú	getLoggerr`   r´   r    r-   r.   r   r8   r‡   ZInterpreterrˆ   r›   r9   ÚImportErrorrÖ   Ztorch._dynamorÔ   rj   rØ   rk   rË   rÕ   rÎ   r   r   r   r   Ú<module>   s@   (
%XLDB 
