o
    Hh                     @   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   S/var/www/vscode/kcb/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   is_exprExprReflist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                    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   Int2BVr   ar   r   r   rG      s    )alltupler   BV2Int)selfr?   wrapped_argsbitwise_func	bool_funcr   r   wrapper   s   z_bitwise_op.<locals>.wrapper)	functoolswraps)rR   rS   rT   r   rQ   r   _bitwise_op   s   	rW   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 rD   )is_realr   ToRealr   r   r   r   to_real      z_Z3Ops.to_realc                 C   r[   rD   )is_intr   ToIntr^   r   r   r   to_int   r`   z_Z3Ops.to_intr?   c                 C   s   t |S rD   )sum)rO   r?   r   r   r   sym_sum   s   z_Z3Ops.sym_sum	numeratordenominatorc                 C   s$   | j |dk t|t| S Nr   )rZ   add_assertionrX   r_   rO   rf   rg   r   r   r   div   s   z
_Z3Ops.divnumberc                 C   
   t |S rD   )rX   rc   rO   rl   r   r   r   floor   s   
z_Z3Ops.floorc                 C   s4   |  p|  }t| ||}|rt|S |S rD   )r\   rX   rc   rk   r_   )rO   rf   rg   cast_result_to_realresultr   r   r   floordiv   s   z_Z3Ops.floordivc                 C   s"   t | ||k | |d |S Nr!   )r   Ifro   rn   r   r   r   ceil   s   z_Z3Ops.ceilc                 C   s   t |dk| || |S rh   )r   rt   ro   ru   rn   r   r   r   trunc   s   z_Z3Ops.truncrK   bc                 C   s   t ||k||S rD   r   rt   rO   rK   rw   r   r   r   max      z
_Z3Ops.maxc                 C   s   t ||k ||S rD   rx   ry   r   r   r   min   r{   z
_Z3Ops.minpqc                 C   s   ||  |||  S rD   )rr   rO   r}   r~   r   r   r   mod      z
_Z3Ops.modbaseexpc                 C   s$   | j t|dk|dk || S rh   )rZ   ri   r   OrrO   r   r   r   r   r   r      s   z
_Z3Ops.powc                 C   s"   t |}| j|dk |d S )Nr         ?)rX   r_   rZ   ri   rn   r   r   r   sqrt   s   
z_Z3Ops.sqrtc                 C   rm   rD   )r   Absrn   r   r   r   abs      
z
_Z3Ops.absc                 C   s4   t | |t ddk| |d | |d S )Nr$   r   )r   rt   r   IntValru   ro   rn   r   r   r   round_to_int   s
   	z_Z3Ops.round_to_intN) __name__
__module____qualname____annotations__staticmethodr   ArithRefr_   rc   re   rk   ro   rr   ru   rv   rz   r|   r   r   r   r   r   rW   operatorand_Andbitwise_andor_r   
bitwise_orlshiftrshiftr   r   r   r   rX      s:   
 
		rX   r>   rZ   rY   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: )rE   r   r   rF   boolintBoolValsympyIntegerr   floatFloatRealValr-   type)rK   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 rD   r   rJ   r   r   r   rG   (      z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>c                 3   r   rD   r   rJ   r   r   r   rG   *  r   )lenrE   r*   rM   )r?   rP   funcr   r   r   rT   $  s
   z#z3op.<locals>.lift.<locals>.wrapper)r   r)   rU   rV   )r   rT   r   r   r   lift  s   	zz3op.<locals>.liftc                 S   s   | r|S |S rD   r   )rw   tfr   r   r   <lambda>F  s    zz3op.<locals>.<lambda>)#r   not_rX   r   Notr   r   r   r   r   r   rr   truedivrk   r   r   builtinsroundr   mathru   ro   rv   torch	sym_floatr_   sym_maxrz   sym_minr|   re   sym_ite	_sym_sqrtr   _assert)r>   rZ   boolean_opsr   ops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graphrZ   rY   c                    s*   || _ tjji |d}t j|dd d S )N)rootr   T)garbage_collect_values)rZ   r   fxGraphModulesuper__init__)rO   r   rZ   module	__class__r   r   r   X  s   zPopulateValidator.__init__targetr?   .kwargsr   c                 C   s   t  d }| j|S )Nsymbol)fx_tracebackget_current_metarZ   z3var)rO   r   r?   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   rZ   r   add_source_expr)rO   r   r?   r   r   r   r   r   f  s   
zPopulateValidator.call_function)r   r   r   r   r   Graphr   r
   rM   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>   eqgegtleltneaddmulrZ   rY   r   Nc                 C   s   || _ t| j | _d S rD   )
_validatorrX   _ops)rO   rZ   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   int64r   r   r   doubler   r   r   r   r-   )rO   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   float64r   r]   NotImplementedErrorrO   r   r   r   r   r   to_dtype  s   

zSympyToZ3.to_dtypec                 C   rm   rD   )r   rb   r   r   r   r   trunc_to_int  r   zSympyToZ3.trunc_to_intc                 C      | j |S rD   )r   r   r   r   r   r   r        zSympyToZ3.round_to_intrf   rg   c                 C      | j ||S rD   r   rk   rj   r   r   r   int_truediv     zSympyToZ3.int_truedivc                 C   r   rD   r   rj   r   r   r   r     r   zSympyToZ3.truedivc                 C   r   rD   r   rr   rj   r   r   r   rr     r   zSympyToZ3.floordivc                 C   r   rD   r   rj   r   r   r   rk        zSympyToZ3.divr   r   c                 C   r   rD   r   r   r   r   r   r   r     r   zSympyToZ3.powc                 C   r   rD   r   r   r   r   r   pow_by_natural  r   zSympyToZ3.pow_by_naturalr}   r~   c                 C   r   rD   )r   r   r   r   r   r   r     r   zSympyToZ3.modc                 C   r   rD   )r   ru   r   r   r   r   ceil_to_int  r   zSympyToZ3.ceil_to_intc                 C   r   rD   )r   ro   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   ro   ru   minimummaximumzunhandled operator: )r   r   r   r   r   r   r   r   r   ro   ru   r|   rz   OPERATOR_HANDLESgetattrr   AttributeError)rO   r   REPLACEMENTr   r   r   __getattr__  s"   

zSympyToZ3.__getattr__exprc                 C   s   t | | jj|S rD   )r   r   symbols)rO   r  r   r   r   run  s   zSympyToZ3.run)rZ   rY   r   N)r   r   r   r   r   r   r   r   r   r)   r   r   r   r   r   r   r   rr   rk   r   r   r   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 )rY   r   Nc                 C   s,   t d i | _t | _t | _t | _d S )Nznew instance)logdebugr  set_source_exprs_target_exprs_assertionsrO   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  )rO   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   r   r   r   Intis_positiver
  r   r   Realr   BoolRuntimeError)rO   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 rD   )free_symbolsrE   r   Symbolr   )rO   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  rE   r   rF   rO   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   )rO   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)rE   r   r  r  r  r   rF   r  r  r  r   r   )rO   r   refr   r   r   ri   ,  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   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   	SolverForr  translation_validation_timeoutr  r   r   r   r  r  checksatr&  ValidationExceptionunknownwarningunsat)rO   solver	assertionrr   r%  r   r  ;  s4   





	zTranslationValidator._validate)r   N)r   r  r   N)r   r   r   r   r   r  r   r)   r   r   r  r  r  rF   r  r   r  r   ri   r   r  r   r   r   r   rY     s    


F)translation_validation_enabledr)  r,  BisectValidationExceptionT)	r   r   r   r   rY   r3  r)  r,  r4  )_configc                   C   s   t   totjS rD   )_assert_z3_installed_if_tv_set_HAS_Z3configtranslation_validationr   r   r   r   r3    s   
r3  c                   C   s   t jS rD   )r8  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.)r7  r8  r9  r   r   r   r   r6    s   r6  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  r{   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   rG         zBValidationException.__init__.<locals>.joinlines.<locals>.<genexpr>)r<   )xsr   r   r   	joinlines  r   z/ValidationException.__init__.<locals>.joinlinesztranslation validation failed.zModel:
z

Assertions:
z

Target Expressions:
z

Failed Source Expressions:
)r7  r+   sortedmapr   msgdetails)rO   r&  
assertionstarget_exprsr'  r=  rA  	model_strassertions_strtarget_exprs_strfailed_source_exprs_strr   r%  r   r     s"   zValidationException.__init__c                 C      | j  d| j S N

rD  rE  r  r   r   r   __str__  r{   zValidationException.__str__Nr   r   r   r   rP  r   r   r   r   r,    s    r,  c                   @   r:  )r4  c                 C   s.   d| d| | _ d|  d|j | _d S )Nz#translation validation failed when r;  z)Failure occurred while running node:
    rN  )rD  format_noderE  )rO   validation_excr  failed_actiontraced_noder   r   r   r     s   z"BisectValidationException.__init__c                 C   rL  rM  rO  r  r   r   r   rP    r{   z!BisectValidationException.__str__NrQ  r   r   r   r   r4    s    r4  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 rD   )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 rD   r   r   r  new_with_shape_envr`  r   r   rG     r?  z5bisect.<locals>.new_with_shape_env.<locals>.<genexpr>c                 3   ra  rD   r   rb  rc  r   r   rG     r?  )rE   r   r   SymIntr\  with_shape_envSymFloatrM   sizestridestorage_offset	is_nested)r`  fake)rV  rd  r`  r   rd    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   )rl  rJ   rc  r   r   r     s    z8bisect.<locals>.check_shapeenv_fails.<locals>.<listcomp>c                 S      g | ]}|j qS r   )sourcerJ   r   r   r   r         c                 S   ro  r   )symbolic_contextrJ   r   r   r   r     rq  )input_contexts)produce_guardsr,  )r`  rn  r   )rd  rm  r   check_shapeenv_fails  s   z$bisect.<locals>.check_shapeenv_failsc                    s8   | j   }d |d  }|j  || jS rs   )r]  r   lintrn  )r\  rl   r`  )r[  ru  r^  rW  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: %s
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  rT  rU  )$torch.fx.experimental.recordingrV  rW  rX  %torch.fx.experimental.symbolic_shapesrY  rZ  r[  r^  r   r   Noder   r   r*   r,  _snapshot_tracked_fakesr  infoshould_record_eventsr8   translation_validation_no_bisectr   nodesr   r  rE   is_evaluate_expris_defer_runtime_assertr?   r   r   r  r   r4  r]  )r`  rX  rY  rZ  r_  rw  last_exception	exceptionassert_nodesleftmidrightr\  eventrT  r?   r   )rV  r[  ru  r^  rd  rW  r   bisect  sz   	
$




r  )8r   rU   loggingr   r   dataclassesr   typingr   r   r   r   r   r   torch.fxtorch.fx.tracebackr   	tracebackr   torch._dynamo.excr   torch._dynamo.utilsr   torch.fx.noder	   r
   torch.utils._sympy.interpr   	getLoggerr   r  r   r)   r+   r   rW   rX   r   Interpreterr   r   rY   ImportErrorr7  __all__torch.fx.experimentalr5  r8  r   r3  r   r)  r6  r,  r4  r  r   r   r   r   <module>   sR   
$UiJ"f !