o
    ߗi                     @   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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Z0g dZ1Y nw dZ0g dZ1d dl2m3Z4 d	e5fdd Z6d	e7fd!d"Z8d#d$ Z9G d%d& d&eZ:G d'd( d(eZ;e9  d)d* Z<dS )+    N)	dataclass)	AnyCallableDictListOptionalSetTupleType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   ]/home/ubuntu/transcripts/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    Z   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                    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   rK      s    )alltupler!   BV2Int)selfrC   wrapped_argsbitwise_func	bool_funcr   r   wrapper   s   z_bitwise_op.<locals>.wrapper)	functoolswraps)rV   rW   rX   r   rU   r   _bitwise_op   s   	r[   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 rH   )is_realr!   ToRealr   r   r   r   to_real      z_Z3Ops.to_realc                 C   r_   rH   )is_intr!   ToIntrb   r   r   r   to_int   rd   z_Z3Ops.to_intrC   c                 C   s   t |S rH   )sum)rS   rC   r   r   r   sym_sum   s   z_Z3Ops.sym_sum	numeratordenominatorc                 C   s$   | j |dk t|t| S Nr   )r^   add_assertionr\   rc   rS   rj   rk   r   r   r   div   s   z
_Z3Ops.divnumberc                 C   
   t |S rH   )r\   rg   rS   rp   r   r   r   floor   s   
z_Z3Ops.floorc                 C   s4   |  p|  }t| ||}|rt|S |S rH   )r`   r\   rg   ro   rc   )rS   rj   rk   cast_result_to_realresultr   r   r   floordiv   s   z_Z3Ops.floordivc                 C   s"   t | ||k | |d |S Nr&   )r!   Ifrs   rr   r   r   r   ceil   s   z_Z3Ops.ceilc                 C   s   t |dk| || |S rl   )r!   rx   rs   ry   rr   r   r   r   trunc   s   z_Z3Ops.truncrO   bc                 C   s   t ||k||S rH   r!   rx   rS   rO   r{   r   r   r   max      z
_Z3Ops.maxc                 C   s   t ||k ||S rH   r|   r}   r   r   r   min   r   z
_Z3Ops.minpqc                 C   s   ||  |||  S rH   )rv   rS   r   r   r   r   r   mod      z
_Z3Ops.modbaseexpc                 C   s$   | j t|dk|dk || S rl   )r^   rm   r!   OrrS   r   r   r   r   r   r      s   z
_Z3Ops.powc                 C   s"   t |}| j|dk |d S )Nr         ?)r\   rc   r^   rm   rr   r   r   r   sqrt   s   
z_Z3Ops.sqrtc                 C   rq   rH   )r!   Absrr   r   r   r   abs      
z
_Z3Ops.absc                 C   s4   t | |t ddk| |d | |d S )Nr)   r   )r!   rx   r   IntValry   rs   rr   r   r   r   round_to_int   s
   	z_Z3Ops.round_to_intN) __name__
__module____qualname____annotations__staticmethodr!   ArithRefrc   rg   ri   ro   rs   rv   ry   rz   r~   r   r   r   r   r   r   r[   operatorand_Andbitwise_andor_r   
bitwise_orlshiftrshiftr   r   r   r   r\      s:   
 
		r\   rB   r^   r]   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: )rI   r!   r   rJ   boolintBoolValsympyIntegerr   floatFloatRealValr1   type)rO   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 rH   r   rN   r   r   r   rK   (      z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>c                 3   r   rH   r   rN   r   r   r   rK   *  r   )lenrI   listrQ   )rC   rT   funcr   r   r   rX   $  s
   z#z3op.<locals>.lift.<locals>.wrapper)r!   r.   rY   rZ   )r   rX   r   r   r   lift  s   	zz3op.<locals>.liftc                 S   s   | r|S |S rH   r   )r{   tfr   r   r   <lambda>F  s    zz3op.<locals>.<lambda>)#r   not_r\   r!   Notr   r   r   r   r   r   rv   truedivro   r   r   builtinsroundr   mathry   rs   rz   torch	sym_floatrc   sym_maxr~   sym_minr   ri   sym_ite	_sym_sqrtr   _assert)rB   r^   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graphr^   r]   c                    s*   || _ tjji |d}t j|dd d S )N)rootr   T)garbage_collect_values)r^   r   fxGraphModulesuper__init__)rS   r   r^   module	__class__r   r   r   X  s   zPopulateValidator.__init__targetrC   .kwargsr   c                 C   s   t  d }| j|S )Nsymbol)fx_tracebackget_current_metar^   z3var)rS   r   rC   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   r^   r   add_source_expr)rS   r   rC   r   r   r   r   r   f  s   
zPopulateValidator.call_function)r   r   r   r   r   Graphr   r   r	   r   r   r/   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mulr^   r]   r   Nc                 C   s   || _ t| j | _d S rH   )
_validatorr\   _ops)rS   r^   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   r1   )rS   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!   ra   NotImplementedErrorrS   r   r   r   r   r   to_dtype  s   

zSympyToZ3.to_dtypec                 C   rq   rH   )r!   rf   r   r   r   r   trunc_to_int  r   zSympyToZ3.trunc_to_intc                 C      | j |S rH   )r   r   r   r   r   r   r        zSympyToZ3.round_to_intrj   rk   c                 C      | j ||S rH   r   ro   rn   r   r   r   int_truediv     zSympyToZ3.int_truedivc                 C   r   rH   r   rn   r   r   r   r     r   zSympyToZ3.truedivc                 C   r   rH   r   rv   rn   r   r   r   rv     r   zSympyToZ3.floordivc                 C   r   rH   r   rn   r   r   r   ro        zSympyToZ3.divr   r   c                 C   r   rH   r   r   r   r   r   r   r     r   zSympyToZ3.powc                 C   r   rH   r   r   r   r   r   pow_by_natural  r   zSympyToZ3.pow_by_naturalr   r   c                 C   r   rH   )r   r   r   r   r   r   r     r   zSympyToZ3.modc                 C   r   rH   )r   ry   r   r   r   r   ceil_to_int  r   zSympyToZ3.ceil_to_intc                 C   r   rH   )r   rs   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   rs   ry   minimummaximumzunhandled operator: )r!   r   r   r   r   r   r   r   r   rs   ry   r   r~   OPERATOR_HANDLESgetattrr   AttributeError)rS   r   REPLACEMENTr   r   r   __getattr__  s"   

zSympyToZ3.__getattr__exprc                 C   s   t | | jj|S rH   )r   r   symbols)rS   r  r   r   r   run  s   zSympyToZ3.run)r^   r]   r   N)r   r   r   r  r   r   r   r   r!   r.   r   r   r   r   r   r   r   rv   ro   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 )r]   r   Nc                 C   s,   t d i | _t | _t | _t | _d S )Nznew instance)logdebugr  set_source_exprs_target_exprs_assertionsrS   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  )rS   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)rS   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 rH   )free_symbolsrI   r   Symbolr   )rS   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  rI   r!   rJ   rS   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   )rS   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)rI   r   r	  r  r  r!   rJ   r  r
  r  r   r   )rS   r   refr   r   r   rm   ,  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)rS   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  rJ   r  r   r   r   rm   r$  r#  r   r   r   r   r]     s    


F)translation_validation_enabledr-  r0  BisectValidationExceptionT)	r   r   r   r   r]   r7  r-  r0  r8  )_configc                   C   s   t   totjS rH   )_assert_z3_installed_if_tv_set_HAS_Z3configtranslation_validationr   r   r   r   r7    s   
r7  c                   C   s   t jS rH   )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 )r0  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   rK         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:
)r;  r/   sortedmapr   msgdetails)rS   r*  
assertionstarget_exprsr+  rA  rE  	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

rH  rI  r  r   r   r   __str__  r   zValidationException.__str__Nr   r   r   r   rT  r   r   r   r   r0    s    r0  c                   @   r>  )r8  c                 C   s.   d| d| | _ d|  d|j | _d S )Nz#translation validation failed when r?  z)Failure occurred while running node:
    rR  )rH  format_noderI  )rS   validation_excr  failed_actiontraced_noder   r   r   r     s   z"BisectValidationException.__init__c                 C   rP  rQ  rS  r  r   r   r   rT    r   z!BisectValidationException.__str__NrU  r   r   r   r   r8    s    r8  c                    s:  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 rH   )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 rH   r   r   r  new_with_shape_envrd  r   r   rK     rC  z5bisect.<locals>.new_with_shape_env.<locals>.<genexpr>c                 3   re  rH   r   rf  rg  r   r   rK     rC  )rI   r   r   SymIntr`  with_shape_envSymFloatrQ   sizestridestorage_offset	is_nested)rd  fake)rZ  rh  rd  r   rh    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   )rp  rN   rg  r   r   r     s    z8bisect.<locals>.check_shapeenv_fails.<locals>.<listcomp>c                 S      g | ]}|j qS r   )sourcerN   r   r   r   r         c                 S   rs  r   )symbolic_contextrN   r   r   r   r     ru  )input_contexts)produce_guardsr0  )rd  rr  r   )rh  rq  r   check_shapeenv_fails  s   z$bisect.<locals>.check_shapeenv_failsc                    s8   | j   }d |d  }|j  || jS rw   )ra  r   lintrr  )r`  rp   rd  )r_  ry  rb  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: %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  rX  rY  )$torch.fx.experimental.recordingrZ  r[  r\  %torch.fx.experimental.symbolic_shapesr]  r^  r_  rb  r   r   Noder   r   r   r0  _snapshot_tracked_fakesr
  infoshould_record_eventsr<   translation_validation_no_bisectr   nodesr   r  rI   is_evaluate_expris_defer_runtime_assertrC   r   r   r	  r   r8  ra  )rd  r\  r]  r^  rc  r{  last_exception	exceptionassert_nodesleftmidrightr`  eventrX  rC   r   )rZ  r_  ry  rb  rh  r[  r   bisect  sx   	
$



r  )=r   rY   loggingr   r   dataclassesr   typingr   r   r   r   r   r   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   r[   r\   r   Interpreterr   r   r]   ImportErrorr;  __all__torch.fx.experimentalr9  r<  r   r7  r   r-  r:  r0  r8  r  r   r   r   r   <module>   sR   ,
$UiJ"f !