o
    hY                     @   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z<d dl Z de j!de"fd	d
Z#eG dd dZ$de	ddde	fddZ%G dd dejj&Z'G dd dZ(G dd dZ)W n e*y   dZ+Y nw dZ+d dl,m-Z- de.fddZ/de0f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J d|  dt jdtt fdd}t | } t | s)td|  t | s3t 	| r7| 
 S |  }| t|}|| }t jkrOd}nt jt jfv rc fdd	  | }nnt jkr|  d
kspJ | d}t |s|J |  }t jdt jdt jdi}||v r|| }||}n7t jt jfv r|  d
ksJ t| d}|drd|dd   S |S t jkr|  dksJ t|S |d d| }	d|	  dS )Nzunsupported expression type: r   r   c                    s    fddt   D S )Nc                    s   g | ]	}t  |qS  )z3strarg).0ir   r   U/var/www/html/ai/venv/lib/python3.10/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                    s@   t  r   kst gS  fddt  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   is_exprExprRefr   strsimplifyr    
ValueErroris_int_valueis_rational_value	as_stringr!   r"   Z3_OP_POWER	Z3_OP_ADD	Z3_OP_MUL	Z3_OP_NOTr   r   Z3_OP_EQZ3_OP_LEZ3_OP_GEZ3_OP_TO_INTZ3_OP_TO_REALr   
startswithZ3_OP_UNINTERPRETEDjoinrstrip)
r   r   r!   opargsr   argkindlogic_inverseargstrstringr   r#   r   r   :   sP   








r   c                   @   s4  e Zd ZU ded< edejdejfddZedejdejfddZd	ejd
ejdejfddZ	dejdejfddZ
d	ejd
ejdejfddZdejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfd d!Zdejdejfd"d#Zd$S )%Z3OpsTranslationValidator	validatorr   r   c                 C      |   r| S t| S N)is_realr   ToRealr   r   r   r   to_real      zZ3Ops.to_realc                 C   rI   rJ   )is_intr   ToIntrM   r   r   r   to_int   rO   zZ3Ops.to_int	numeratordenominatorc                 C   s$   | j |dk t|t| S Nr   )rH   add_assertionrF   rN   selfrS   rT   r   r   r   div   s   z	Z3Ops.divnumberc                 C   s
   t |S rJ   )rF   rR   rX   rZ   r   r   r   floor   s   
zZ3Ops.floorc                 C   s4   |  p|  }t| ||}|rt|S |S rJ   )rK   rF   rR   rY   rN   )rX   rS   rT   cast_result_to_realresultr   r   r   floordiv   s   zZ3Ops.floordivc                 C   s"   t | ||k | |d |S )Nr$   )r   Ifr\   r[   r   r   r   ceil   s
   z
Z3Ops.ceilabc                 C   s   t ||k||S rJ   r   r`   rX   rb   rc   r   r   r   max      z	Z3Ops.maxc                 C   s   t ||k ||S rJ   rd   re   r   r   r   min   rg   z	Z3Ops.minpqc                 C   s   ||  |||  S rJ   )r_   rX   ri   rj   r   r   r   mod      z	Z3Ops.modbaseexpc                 C   s$   | j t|dk|dk || S rU   )rH   rV   r   OrrX   rn   ro   r   r   r   r      s   z	Z3Ops.powc                 C   s"   t |}| j|dk |d S )Nr   g      ?)rF   rN   rH   rV   r[   r   r   r   sqrt   s   
z
Z3Ops.sqrtN)__name__
__module____qualname____annotations__staticmethodr   ArithRefrN   rR   rY   r\   r_   ra   rf   rh   rl   r   rr   r   r   r   r   rF      s   
 rF   r@   rH   rG   c                    s   ddl m} tjtjtjh}| |v   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}| |v rq||  S || S )Nr   )sym_sqrtc                    s0   dt jffddt  fdd}|S )Nr   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r-t	t| S t | t
tjfr<tt
| S tdt|  )Nzcan't lift type: )
isinstancer   rx   BoolRefboolintBoolValsympyIntegerIntValfloatFloatRealValr/   type)rb   as_boolr   r   wrap   s   z z3op.<locals>.lift.<locals>.wrapc                     s   fdd| D } | S )Nc                 3   s    | ]} |V  qd S rJ   r   )r   rb   )r   r   r   	<genexpr>   s    z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>r   )rA   wrapped_argsfuncr   r   r   wrapper   s   z#z3op.<locals>.lift.<locals>.wrapper)r   r,   	functoolswraps)r   r   r   r   r   lift   s   zz3op.<locals>.lift)%torch.fx.experimental.symbolic_shapesry   operatornot_and_or_rF   r   NotAndrp   r_   truedivrY   rl   mathra   r\   torch	sym_floatrN   sym_maxrf   sym_minrh   rr   _assert)r@   rH   ry   boolean_opsr   opsreplacement_mapr   r   r   z3op   s(   
r   c                       s   e Zd Zdejjddf fddZdedee	df d	e
eef d
efddZdedee	df d	e
eef d
ef fddZ  ZS )PopulateValidatorgraphrH   rG   c                    s*   || _ tjji |d}t j|dd d S )N)rootr   T)garbage_collect_values)rH   r   fxGraphModulesuper__init__)rX   r   rH   module	__class__r   r   r   $  s   zPopulateValidator.__init__targetrA   .kwargsr   c                 C   s   t  d }| j|S )Nsymbol)fx_tracebackget_current_metarH   z3var)rX   r   rA   r   r   r   r   r   placeholder,  s   zPopulateValidator.placeholderc                    sN   |t jkrt |||S t|dksJ dt| d| j|d  d S )Nr$   z'expected 1 argument on assertion. Got: r(   r   )r   r   r   call_functionlenrH   add_source_expr)rX   r   rA   r   r   r   r   r   0  s   
 zPopulateValidator.call_function)rs   rt   ru   r   r   Graphr   r   r   r   r   r-   r   r   r   __classcell__r   r   r   r   r   #  s    *6r   c                   @   s   e Zd Zh dZ				d"ddZded	ejdej	fd
dZ
dejdejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfddZdedefddZdejdej	fd d!ZdS )#	SympyToZ3>   eqgegtleltneaddmulrH   rG   r   Nc                 C   s   || _ t| j | _d S rJ   )
_validatorrF   _ops)rX   rH   r   r   r   r   C  s   zSympyToZ3.__init__valuedtypec                 C   sV   |t ju rtt|S |t ju rtt|S |t ju r$t	t|S t
d| )Nzunsupported dtype (SympyToZ3): )r   int64r   r   r}   doubler   r   r|   r~   r/   )rX   r   r   r   r   r   constantJ  s   


zSympyToZ3.constantrS   rT   c                 C      | j ||S rJ   )r   rY   rW   r   r   r   r   S     zSympyToZ3.truedivc                 C   r   rJ   r   r_   rW   r   r   r   r_   V  r   zSympyToZ3.floordivc                 C   r   rJ   r   rW   r   r   r   rY   Y  r   zSympyToZ3.divrn   ro   c                 C   r   rJ   )r   r   rq   r   r   r   r   \  r   zSympyToZ3.powri   rj   c                 C   r   rJ   )r   rl   rk   r   r   r   rl   _  r   zSympyToZ3.modnamec                 C   sP   t jt jt j| jj| jjd}||v r|| S || jv r!tt	|S t
d| )N)r   r   r   r\   ra   zunhandled operator: )r   r   rp   r   r   r\   ra   OPERATOR_HANDLESgetattrr   AttributeError)rX   r   REPLACEMENTr   r   r   __getattr__b  s   

zSympyToZ3.__getattr__exprc                 C   s   t | | jj|S rJ   )r   r   symbols)rX   r   r   r   r   runq  s   zSympyToZ3.run)rH   rG   r   N)rs   rt   ru   r   r   r   r   r   r   r,   r   rx   r   r_   rY   r   rl   r-   r   r   Basicr   r   r   r   r   r   @  s    
	r   c                   @   s   e Zd ZdddZdejdejfddZdejde	dejfd	d
Z
dejddfddZdejdejfddZdejddfddZdejddfddZdeejejf ddfddZdddZdS )rG   r   Nc                 C   s,   t d i | _t | _t | _t | _d S )Nznew instance)logdebugr   set_source_exprs_target_exprs_assertions)rX   r   r   r   r     s
   
zTranslationValidator.__init__r   c                 C   s"   || j v sJ d| | j | S )NzZ3 variable not found for: )r   )rX   r   r   r   r   r     s   
zTranslationValidator.z3varr   c                 C   s   || j v r
| j | S td|j|j |tu r)t|j}|jr(| j	
|dk n|tu r4t|j}n|tu r?t|j}ntd| || j |< |S )Nznew variable: %s (%s)r   z"unsupported type for Z3 variable: )r   r   r   r   rs   r}   r   Intis_positiver   r   r   Realr|   BoolRuntimeError)rX   r   r   varr   r   r   add_var  s   


zTranslationValidator.add_varr   c                 C   s*   |j D ]}t|tjsJ | | qd S rJ   )free_symbolsrz   r   Symbolr   )rX   r   sr   r   r   _check_freesymbols  s   
z'TranslationValidator._check_freesymbolsc                 C   s,   t | |}t|tjsJ d| |S )Nz"expected boolean expression. Got: )r   r   rz   r   r{   rX   r   z3exprr   r   r   to_z3_boolean_expr  s   z'TranslationValidator.to_z3_boolean_exprc                 C   s*   || j vrtdt| | j | d S )Nzadd source guard: %s)r   r   r   r   r   )rX   r   r   r   r   r     s   
z$TranslationValidator.add_source_exprc                 C   s>   |  | | |}|| jv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sJ || jvr(t	dt
| | j| d S )Nzadd assertion: %s)rz   r   r   r   r   r   r{   r   r   r   r   r   )rX   r   refr   r   r   rV     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 ]}|
| q%|
ttj| j  |j
| j  td | |j }|tjkrf|  t | j	| j fdd| jD d|tjkrrtd	 d S |tjksyJ td
 d S )Nr   )dynamo_timedQF_NRA)timeoutztranslation validation: startc                    s   g | ]	}  |s|qS r   )evaluate)r   inpmodelr   r   r      s
    
z1TranslationValidator.validate.<locals>.<listcomp>)failed_source_exprsz:translation validation: could not validate: got z3.unknownztranslation validation: success)torch._dynamo.utilsr   r   r   r   r   	SolverForr   translation_validation_timeoutr   r   r   r   r   r   checksatr   ValidationExceptionunknownwarningunsat)rX   r   solver	assertionrr   r   r   validate  s.   






zTranslationValidator.validate)r   N)rs   rt   ru   r   r   r   r   r,   r   r	   r   r   r   r{   r   r   Exprr   r
   rV   r  r   r   r   r   rG     s    
FT)configc                   C   s   t   totjS rJ   )assert_z3_installed_if_tv_set_HAS_Z3r  translation_validationr   r   r   r   translation_validation_enabled  s   
r  c                   C   s   t jS rJ   )r  r   r   r   r   r   r     s   r   c                   C   s   t s	tjrJ dd S d S )Nzotranslation validation requires Z3 package. Please, either install z3-solver or disable translation validation.)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J dtf fdd}dtfdd}|t| }|tt|}|tt|}	|tt|}
t d| d | d |	 d	 |
  d S )
Nr   c                    s   |  d |   S )Nz: r   )symr   r   r   	symbolstr,  rg   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   r   0  s    zBValidationException.__init__.<locals>.joinlines.<locals>.<genexpr>)r>   )xsr   r   r   	joinlines/  rm   z/ValidationException.__init__.<locals>.joinlinesz'translation validation failed.

Model:
z

Assertions:
z

Target Expressions:
z

Failed Source Expressions:
)r  r-   mapr   r   r   )rX   r   
assertionstarget_exprsr   r	  r  	model_strassertions_strtarget_exprs_strfailed_source_exprs_strr   r   r   r   )  s0   zValidationException.__init__)rs   rt   ru   r   r   r   r   r   r   r   (  s    r   )4r   loggingr   r   r   dataclassesr   typingr   r   r   r   r   r   r	   r
   r   torch._dynamo.excr   torch.fxtorch.fx.tracebackr   	tracebackr   torch.fx.noder   r   torch.utils._sympy.interpr   	getLoggerrs   r   r   r,   r-   r   rF   r   Interpreterr   r   rG   ImportErrorr  torch._dynamor  r|   r  r}   r   r  r   r   r   r   r   <module>   sD    (
%XLDB 
