U
    9%eY                     @   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rd}nt jt jfkrƇ fdd  | }nt jkr8|  d	kst| d
}t |st|  }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rd|dd   S |S t jkr|  d
kst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/Darija-Ai-API/env/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rtd	 n|tjkst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 
