o
    Zh                     @   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 d dlZd dlZd dlZd dlm  mZ d dlmZ d dl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"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+g dZ,Y nw dZ+g dZ,d dl-m.Z/ d	e0fdd Z1d	e2fd!d"Z3d#d$ Z4G d%d& d&eZ5G d'd( d(eZ6e4  d)d* Z7dS )+    N)	dataclass)AnyCallableOptionalUnion)TorchDynamoException)dynamo_timed)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   N/var/www/auris/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   Z   s
   

zz3str.<locals>.collect_str_args   r   z!=><z(/z(idiv    ())r   Zis_exprExprReflist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   <   sP   








r   c                    s   t   fdd}|S )Nc                    sB   d urt dd |D r| S tdd |D }t | S )Nc                 s   s    | ]	}t |tjV  qd S N)
isinstancer   BoolRef)r   r   r   r   r   	<genexpr>   s    
z/_bitwise_op.<locals>.wrapper.<locals>.<genexpr>c                 s   s    | ]	}t |d V  qdS )@   N)r   ZInt2BVr   ar   r   r   r7      s    )alltupler   ZBV2Int)selfr2   wrapped_argsbitwise_func	bool_funcr   r   wrapper   s   z_bitwise_op.<locals>.wrapper)	functoolswraps)r@   rA   rB   r   r?   r   _bitwise_op   s   	rE   c                   @   s  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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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ejdejfd)d*Zdejdejfd+d,ZeejejZeejejZeejd-Zeejd-Zd-S )._Z3OpsTranslationValidator	validatorr   r   c                 C      |   r| S t| S r4   )is_realr   ToRealr   r   r   r   to_real      z_Z3Ops.to_realc                 C   rI   r4   )Zis_intr   ToIntrL   r   r   r   to_int   rN   z_Z3Ops.to_intr2   c                 C   s   t |S r4   )sum)r=   r2   r   r   r   sym_sum   s   z_Z3Ops.sym_sum	numeratordenominatorc                 C   s$   | j |dk t|t| S Nr   )rH   add_assertionrF   rM   r=   rS   rT   r   r   r   div   s   z
_Z3Ops.divnumberc                 C   
   t |S r4   )rF   rP   r=   rY   r   r   r   floor   s   
z_Z3Ops.floorc                 C   s4   |  p|  }t| ||}|rt|S |S r4   )rJ   rF   rP   rX   rM   )r=   rS   rT   Z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.ceilc                 C   s   t |dk| || |S rU   )r   r`   r\   ra   r[   r   r   r   trunc   s   z_Z3Ops.truncr:   bc                 C   s   t ||k||S r4   r   r`   r=   r:   rc   r   r   r   max      z
_Z3Ops.maxc                 C   s   t ||k ||S r4   rd   re   r   r   r   min   rg   z
_Z3Ops.minpqc                 C   s   ||  |||  S r4   )r^   r=   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r=   rn   ro   r   r   r   r      s   z
_Z3Ops.powc                 C   s"   t |}| j|dk |d S )Nr         ?)rF   rM   rH   rV   r[   r   r   r   sqrt   s   
z_Z3Ops.sqrtc                 C   rZ   r4   )r   ZAbsr[   r   r   r   abs      
z
_Z3Ops.absc                 C   s4   t | |t ddk| |d | |d S )Nr$   rr   )r   r`   rl   IntValra   r\   r[   r   r   r   round_to_int   s
   	z_Z3Ops.round_to_intN) __name__
__module____qualname____annotations__staticmethodr   ArithRefrM   rP   rR   rX   r\   r^   ra   rb   rf   rh   rl   r   rs   rt   rw   rE   operatorand_Andbitwise_andor_rp   
bitwise_orlshiftrshiftr   r   r   r   rF      s:   
 
		rF   r1   rH   rG   c                    sT  t jh}| |v   fdd}t|}i 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tj||jtj||jtj||jtj||jtj||jtj||jtj||jtj||jtj|dd tj ||j!tj"tj"i}| |v r||  S || S )Nc                    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: )r5   r   r}   r6   boolintBoolValsympyIntegerrv   floatFloatRealValr,   type)r:   Zas_boolr   r   wrap  s   z z3op.<locals>.lift.<locals>.wrapc                     s`   t | dkr!t| d ttfr!tfdd| d D f} | S tfdd| D } | S )Nr!   r   c                 3       | ]} |V  qd S r4   r   r9   r   r   r   r7   (      z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>c                 3   r   r4   r   r9   r   r   r   r7   *  r   )lenr5   r)   r<   )r2   r>   funcr   r   r   rB   $  s
   z#z3op.<locals>.lift.<locals>.wrapper)r   r(   rC   rD   )r   rB   r   r   r   lift  s   	zz3op.<locals>.liftc                 S   s   | r|S |S r4   r   )rc   tfr   r   r   <lambda>F  s    zz3op.<locals>.<lambda>)#r~   not_rF   r   Notr   r   r   r   r   r   r^   truedivrX   rl   rt   builtinsroundrw   mathra   r\   rb   torchZ	sym_floatrM   Zsym_maxrf   Zsym_minrh   rR   Zsym_iteZ	_sym_sqrtrs   _assert)r1   rH   Zboolean_opsr   opsZreplacement_mapr   r   r   z3op  sX   	
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)Zgarbage_collect_values)rH   r   fxZGraphModulesuper__init__)r=   r   rH   module	__class__r   r   r   X  s   zPopulateValidator.__init__targetr2   .kwargsr   c                 C   s   t  d }| j|S )Nsymbol)fx_tracebackZget_current_metarH   z3var)r=   r   r2   r   r   r   r   r   placeholder`  s   zPopulateValidator.placeholderc                    sV   |t jkrt t|| j||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_functionr   rH   r   add_source_expr)r=   r   r2   r   r   r   r   r   f  s   
zPopulateValidator.call_function)rx   ry   rz   r   r   ZGraphr   r
   r<   r	   dictr*   r   r   r   __classcell__r   r   r   r   r   W  s(    




r   c                   @   s  e Zd Zh dZ				d1d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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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/d0ZdS )2	SympyToZ3>   gteqmulnegeltaddlerH   rG   r   Nc                 C   s   || _ t| j | _d S r4   )
_validatorrF   _ops)r=   rH   r   r   r   r   |  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   Zint64r   rv   r   doubler   r   r   r   r,   )r=   r   r   r   r   r   constant  s   


zSympyToZ3.constantr   c                 C   s$   |t jkr
t|S td| d)Nz	to_dtype z NYI)r   Zfloat64r   rK   NotImplementedErrorr=   r   r   r   r   r   to_dtype  s   

zSympyToZ3.to_dtypec                 C   rZ   r4   )r   rO   r   r   r   r   trunc_to_int  ru   zSympyToZ3.trunc_to_intc                 C      | j |S r4   )r   rw   r   r   r   r   rw        zSympyToZ3.round_to_intrS   rT   c                 C      | j ||S r4   r   rX   rW   r   r   r   int_truediv     zSympyToZ3.int_truedivc                 C   r   r4   r   rW   r   r   r   r     r   zSympyToZ3.truedivc                 C   r   r4   r   r^   rW   r   r   r   r^     r   zSympyToZ3.floordivc                 C   r   r4   r   rW   r   r   r   rX        zSympyToZ3.divrn   ro   c                 C   r   r4   r   r   rq   r   r   r   r     r   zSympyToZ3.powc                 C   r   r4   r   rq   r   r   r   pow_by_natural  r   zSympyToZ3.pow_by_naturalri   rj   c                 C   r   r4   )r   rl   rk   r   r   r   rl     r   zSympyToZ3.modc                 C   r   r4   )r   ra   r   r   r   r   ceil_to_int  r   zSympyToZ3.ceil_to_intc                 C   r   r4   )r   r\   r   r   r   r   floor_to_int  r   zSympyToZ3.floor_to_intnamec                 C   st   t jt jt j| jj| jj| jj| jj| jj	| jj
| jj| jjd}||v r)|| S || jv r3tt|S td| )N)r   r   r   r   r   r   r   r\   ra   minimummaximumzunhandled operator: )r   r   rp   r   r   r   r   r   r   r\   ra   rh   rf   OPERATOR_HANDLESgetattrr~   AttributeError)r=   r   ZREPLACEMENTr   r   r   __getattr__  s"   

zSympyToZ3.__getattr__exprc                 C   s   t | | jj|S r4   )r   r   symbols)r=   r   r   r   r   run  s   zSympyToZ3.run)rH   rG   r   N)rx   ry   rz   r   r   r   r   r   r   r(   r   r}   r   r   rw   r   r   r^   rX   r   r   rl   r   r   r*   r   r   Basicr   r   r   r   r   r   y  sP    




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ddZdeejejf ddfddZd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r=   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   )r=   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   rx   r   r   ZIntZis_positiver   r   r   Realr   ZBoolRuntimeError)r=   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 r4   )Zfree_symbolsr5   r   Symbolr   )r=   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   r5   r   r6   r=   r   Z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   )r=   r   r   r   r   r      s   
z$TranslationValidator.add_source_exprsympy.logic.boolalg.Booleanc                 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)r5   r   r   r   r   r   r6   r   r   r   r   r   )r=   r   refr   r   r   rV   ,  s   

z"TranslationValidator.add_assertionc                 C   s4   t d |  W  d    S 1 sw   Y  d S )NTranslationValidator.validate)r   	_validater   r   r   r   validate7  s   
$r   c                    s   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 | }|tjkr]|  t | j| j fdd| jD d|tjkritd d S |tjkspJ td	 d S )
Nr   ZQF_NRA)timeoutztranslation validation: startc                    s   g | ]	}  |s|qS r   )evaluate)r   inpmodelr   r   r   b  s
    
z2TranslationValidator._validate.<locals>.<listcomp>)failed_source_exprsz:translation validation: could not validate: got z3.unknownztranslation validation: success)r   r   r   r   Z	SolverForr   translation_validation_timeoutr   r   r   r   r   r   checksatr   ValidationExceptionunknownwarningZunsat)r=   ZsolverZ	assertionrr   r   r   r   ;  s4   





	zTranslationValidator._validate)r   N)r   r   r   N)rx   ry   rz   r   r   r   r   r(   r   r   r   r   r   r6   r   r   r   r   rV   r   r   r   r   r   r   rG     s    


F)translation_validation_enabledr   r  BisectValidationExceptionT)	r   r   r   r   rG   r  r   r  r  )_configc                   C   s   t   totjS r4   )_assert_z3_installed_if_tv_set_HAS_Z3configtranslation_validationr   r   r   r   r    s   
r  c                   C   s   t jS r4   )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                   @      e Zd Zdd Zdd Zd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|}	|ttt|}
d| _d| d| d	|	 d
|
 | _d S )Nr   c                    s   |  d |   S )N: 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   r7         zBValidationException.__init__.<locals>.joinlines.<locals>.<genexpr>)r/   )Zxsr   r   r   	joinlines  rm   z/ValidationException.__init__.<locals>.joinlinesztranslation validation failed.zModel:
z

Assertions:
z

Target Expressions:
z

Failed Source Expressions:
)r	  r*   sortedmapr   msgdetails)r=   r   Z
assertionsZtarget_exprsr   r  r  Z	model_strZassertions_strZtarget_exprs_strZfailed_source_exprs_strr   r   r   r     s"   zValidationException.__init__c                 C      | j  d| j S N

r  r  r   r   r   r   __str__  rg   zValidationException.__str__Nrx   ry   rz   r   r  r   r   r   r   r    s    r  c                   @   r  )r  c                 C   s.   d| d| | _ d|  d|j | _d S )Nz#translation validation failed when r  z)Failure occurred while running node:
    r  )r  Zformat_noder  )r=   Zvalidation_excr   failed_actiontraced_noder   r   r   r     s   z"BisectValidationException.__init__c                 C   r  r  r  r   r   r   r   r    rg   z!BisectValidationException.__str__Nr  r   r   r   r   r    s    r  c                    sJ  ddl m mm} ddlm}m}m | jdt	j
jd|ffdd}d|dtf fd	d
d|dttt  dtt ffdddt	j
jdtt ffdd}| |  }|sftd d S | jrltjrn|i }dd | jjD }ddt|d }	}
}||| ||< |	|k r|	| d }
||
 }td|
|| ||||
< ||
 r|
}n|
d }	|	|k s|	|v rt||	 tsJ ||	 }||}| rd}n| sJ d| d}|j}|d usJ t|dksJ d|j dt| t|d tj sJ d|j dt!|d  t"||	 |d ||j#| d)Nr   )FakeTensorMetareplay_shape_env_eventsShapeEnvEvent)CURRENT_NODE_KEYShapeEnvSHAPEENV_EVENT_KEYnoder   c                    s    | j v sJ | j    S r4   )meta)r%  )r$  eventsr   r   get_node_event  s   zbisect.<locals>.get_node_event	shape_envc                    s   t |tr|S t |tjrt|j S t |tjr%t|j S t |s,J t fdd| D t fdd|	 D  |
 |jS )Nc                 3       | ]} |V  qd S r4   r   r   r   new_with_shape_envr)  r   r   r7     r  z5bisect.<locals>.new_with_shape_env.<locals>.<genexpr>c                 3   r*  r4   r   r+  r,  r   r   r7     r  )r5   r   r   ZSymIntr%  Zwith_shape_envZSymFloatr<   sizeZstrideZstorage_offsetZ	is_nested)r)  fake)r  r-  r)  r   r-    s   
z"bisect.<locals>.new_with_shape_envtracked_fakesc              
      sp   |d usJ z j  fdd|D dd |D dd |D d W d S  ty7 } z|W  Y d }~S d }~ww )Nc                    s   g | ]} |j qS r   )r/  r9   r,  r   r   r     s    z8bisect.<locals>.check_shapeenv_fails.<locals>.<listcomp>c                 S      g | ]}|j qS r   )sourcer9   r   r   r   r         c                 S   r2  r   )Zsymbolic_contextr9   r   r   r   r     r4  )Zinput_contexts)Zproduce_guardsr  )r)  r1  r   )r-  r0  r   check_shapeenv_fails  s   z$bisect.<locals>.check_shapeenv_failsc                    s8   | j   }d |d  }|j  || jS r_   )r&  r   Zlintr1  )r%  rY   r)  )r$  r5  r'  r   r   r   check_node_fails  s   

z bisect.<locals>.check_node_failsz2translation validation succeeded: no errors found.c                 S   s   g | ]
}|j tjkr|qS r   )r   r   r   )r   r%  r   r   r   r   1  s    zbisect.<locals>.<listcomp>r!   r$   zbisecting at %s: %sZ
evaluatingzunexpected event type: zadding runtime assertzbisecting expects z/ to have at least 2 positional arguments. Got: z9 to have a SymPy expression as its second argument. Got: )r   r  r  )$Ztorch.fx.experimental.recordingr  r   r!  Z%torch.fx.experimental.symbolic_shapesr"  r#  r$  r'  r   r   Noder   r   r)   r  Z_snapshot_tracked_fakesr   infoZshould_record_eventsr
  Z translation_validation_no_bisectr   nodesr   r   r5   Zis_evaluate_exprZis_defer_runtime_assertr2   r   r   r   r   r  r&  )r)  r!  r"  r#  r(  r6  Zlast_exception	exceptionZassert_nodesleftmidrightr%  eventr  r2   r   )r  r$  r5  r'  r-  r   r   bisect  sz   	
$




r?  )8r   rC   loggingr   r~   dataclassesr   typingr   r   r   r   r   r   Ztorch.fxZtorch.fx.tracebackr   	tracebackr   Ztorch._dynamo.excr   Ztorch._dynamo.utilsr   Ztorch.fx.noder	   r
   Ztorch.utils._sympy.interpr   	getLoggerrx   r   r   r(   r*   r   rE   rF   r   ZInterpreterr   r   rG   ImportErrorr	  __all__Ztorch.fx.experimentalr  r
  r   r  r   r   r  r  r  r?  r   r   r   r   <module>   sR   
$UiJ"f !