o
    H&iu                     @   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m  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$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/Z0 de1fddZ2de3fddZ4d d! Z5G d"d# d#eZ6G d$d% d%eZ7e5  d&d' Z8dS )(    N)	dataclass)	AnyCallableDictListOptional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   JC:\wamp64\www\opt\env\Lib\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    Zis_expr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   :   sP   








r   c                   @   sJ  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ejdejfd$d%Zd&S )'_Z3OpsTranslationValidator	validatorr   r   c                 C      |   r| S t| S N)is_realr    ZToRealr   r   r   r   to_real      z_Z3Ops.to_realc                 C   r:   r;   )Zis_intr    ZToIntr=   r   r   r   to_int   r?   z_Z3Ops.to_int	numeratordenominatorc                 C   s$   | j |dk t|t| S Nr   )r9   add_assertionr7   r>   selfrA   rB   r   r   r   div   s   z
_Z3Ops.divnumberc                 C   
   t |S r;   )r7   r@   rF   rH   r   r   r   floor   s   
z_Z3Ops.floorc                 C   s4   |  p|  }t| ||}|rt|S |S r;   )r<   r7   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    IfrK   rJ   r   r   r   ceil   s
   z_Z3Ops.ceilabc                 C   s   t ||k||S r;   r    rO   rF   rQ   rR   r   r   r   max      z
_Z3Ops.maxc                 C   s   t ||k ||S r;   rS   rT   r   r   r   min   rV   z
_Z3Ops.minpqc                 C   s   ||  |||  S r;   )rM   rF   rX   rY   r   r   r   mod      z
_Z3Ops.modbaseexpc                 C   s$   | j t|dk|dk || S rC   )r9   rD   r    OrrF   r]   r^   r   r   r   r      s   z
_Z3Ops.powc                 C   s"   t |}| j|dk |d S )Nr   g      ?)r7   r>   r9   rD   rJ   r   r   r   sqrt   s   
z_Z3Ops.sqrtc                 C   rI   r;   )r    ZAbsrJ   r   r   r   abs   s   
z
_Z3Ops.absN)__name__
__module____qualname____annotations__staticmethodr    ArithRefr>   r@   rG   rK   rM   rP   rU   rW   r[   r   ra   rb   r   r   r   r   r7      s    
 	r7   r4   r9   r8   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tj||jtj|dd |||jtjtji}| |v r~||  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    rh   BoolRefboolintBoolValsympyIntegerIntValfloatFloatRealValr/   type)rQ   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   rQ   )rw   r   r   	<genexpr>   s    z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>r   )r5   Zwrapped_argsfuncrw   r   r   wrapper   s   z#z3op.<locals>.lift.<locals>.wrapper)r    r,   	functoolswraps)r{   r|   rv   rz   r   lift   s   zz3op.<locals>.liftc                 S   s   | r|S |S r;   r   )rR   tfr   r   r   <lambda>  s    zz3op.<locals>.<lambda>)Ztorch.fx.experimental.sym_noderi   operatornot_and_or_r7   r    NotAndr_   rM   truedivrG   r[   rb   mathrP   rK   torchZ	sym_floatr>   Zsym_maxrU   Zsym_minrW   Zsym_itera   _assert)r4   r9   ri   Zboolean_opsr   opsZreplacement_mapr   rv   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graphr9   r8   c                    s*   || _ tjji |d}t j|dd d S )N)rootr   T)Zgarbage_collect_values)r9   r   fxZGraphModulesuper__init__)rF   r   r9   module	__class__r   r   r   )  s   zPopulateValidator.__init__targetr5   .kwargsr   c                 C   s   t  d }| j|S )Nsymbol)fx_tracebackZget_current_metar9   z3var)rF   r   r5   r   r   r   r   r   placeholder1  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lenr9   add_source_expr)rF   r   r5   r   r   r   r   r   5  s   
 zPopulateValidator.call_function)rc   rd   re   r   r   Z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>   mulgeltleeqgtaddner9   r8   r   Nc                 C   s   || _ t| j | _d S r;   )
_validatorr7   _ops)rF   r9   r   r   r   r   H  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    rq   rm   doublert   rr   rl   rn   r/   )rF   r   r   r   r   r   constantO  s   


zSympyToZ3.constantrA   rB   c                 C      | j ||S r;   )r   rG   rE   r   r   r   r   X     zSympyToZ3.truedivc                 C   r   r;   r   rM   rE   r   r   r   rM   [  r   zSympyToZ3.floordivc                 C   r   r;   r   rE   r   r   r   rG   ^  r   zSympyToZ3.divr]   r^   c                 C   r   r;   )r   r   r`   r   r   r   r   a  r   zSympyToZ3.powrX   rY   c                 C   r   r;   )r   r[   rZ   r   r   r   r[   d  r   zSympyToZ3.modnamec                 C   s\   t jt jt j| jj| jj| jj| jjd}||v r|| S || j	v r't
t|S td| )N)r   r   r   rK   rP   minimummaximumzunhandled operator: )r    r   r_   r   r   rK   rP   rW   rU   OPERATOR_HANDLESgetattrr   AttributeError)rF   r   ZREPLACEMENTr   r   r   __getattr__g  s   


zSympyToZ3.__getattr__exprc                 C   s   t | | jj|S r;   )r   r   symbols)rF   r   r   r   r   runx  s   zSympyToZ3.run)r9   r8   r   N)rc   rd   re   r   r   r   r   r   r    r,   r   rh   r   rM   rG   r   r[   r-   r   ro   Basicr   r   r   r   r   r   E  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 )r8   r   Nc                 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   c                 C   s"   || j v sJ d| | j | S )NzZ3 variable not found for: )r   )rF   r   r   r   r   r     s   
zTranslationValidator.z3varru   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   rc   rm   r    ZIntZis_positiver   r   rr   Realrl   ZBoolRuntimeError)rF   r   ru   varr   r   r   add_var  s   


zTranslationValidator.add_varr   c                 C   s*   |j D ]}t|tjsJ | | qd S r;   )Zfree_symbolsrj   ro   Symbolr   )rF   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   rj   r    rk   rF   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   )rF   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)rj   ro   r   r   r   r    rk   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 ]}|
| 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_timedZ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)Ztorch._dynamo.utilsr   r   r   r   r    Z	SolverForr   translation_validation_timeoutr   r   r   r   r   r   checksatr   ValidationExceptionunknownwarningZunsat)rF   r   ZsolverZ	assertionrr   r   r   validate  s.   






zTranslationValidator.validate)r   N)rc   rd   re   r   ro   r   r    r,   r   r
   r   r   r   rk   r   r   Exprr   r   rD   r   r   r   r   r   r8     s    
F)translation_validation_enabledr   r   BisectValidationExceptionT)	r   r   r   r   r8   r   r   r   r   )_configc                   C   s   t   totjS r;   )_assert_z3_installed_if_tv_set_HAS_Z3configtranslation_validationr   r   r   r   r   )  s   
r   c                   C   s   t jS r;   )r   r   r   r   r   r   r   0  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   4  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?  rV   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   ry   C      zBValidationException.__init__.<locals>.joinlines.<locals>.<genexpr>)r2   )Zxsr   r   r   	joinlinesB  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)rF   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__X  rV   zValidationException.__str__Nrc   rd   re   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   )rF   Zvalidation_excr   failed_actiontraced_noder   r   r   r   ]  s   z"BisectValidationException.__init__c                 C   r   r   r   r   r   r   r   r   e  rV   z!BisectValidationException.__str__Nr   r   r   r   r   r   \  s    r   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   )ShapeEnvSHAPEENV_EVENT_KEYCURRENT_NODE_KEY)FakeTensorMetaShapeEnvEventreplay_shape_env_eventsnoder   c                    s    | j v sJ | j    S r;   )meta)r  )r   eventsr   r   get_node_eventz  s   zbisect.<locals>.get_node_event	shape_envc                    s   t |tr|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 r;   r   r   r   new_with_shape_envr  r   r   ry     r   z5bisect.<locals>.new_with_shape_env.<locals>.<genexpr>c                 3   r  r;   r   r  r  r   r   ry     r   )rj   rm   r   ZSymIntr  Zwith_shape_envtuple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  rx   r  r   r   r     s    z8bisect.<locals>.check_shapeenv_fails.<locals>.<listcomp>c                 S      g | ]}|j qS r   )sourcerx   r   r   r   r         c                 S   r  r   )Zconstraint_dimsrx   r   r   r   r     r  )Zconstraint_inputs)Zproduce_guardsr   )r  r  r   )r	  r  r   check_shapeenv_fails  s   z$bisect.<locals>.check_shapeenv_failsc                    s8   | j   }d |d  }|j  || jS rN   )r  r   Zlintr  )r  rH   r  )r   r  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     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.symbolic_shapesr   r   r   Ztorch.fx.experimental.recordingr   r   r   r  r   r   Noder   r   r   r   Zsnapshot_tracked_fakesr   infoZshould_record_eventsr   Z translation_validation_no_bisectr   nodesr   r   rj   Zis_evaluate_exprZis_defer_runtime_assertr5   r   ro   r   ru   r   r  )r  r   r   r   r  r  Zlast_exception	exceptionZassert_nodesleftmidrightr  eventr   r5   r   )r   r   r  r  r	  r   r   bisects  sd   	&$



r  )9r}   loggingr   r   ro   dataclassesr   typingr   r   r   r   r   r   r	   r
   r   r   Ztorch.fxZtorch.fx.tracebackr   	tracebackr   Ztorch._dynamo.excr   Ztorch.fx.noder   r   Ztorch.utils._sympy.interpr   	getLoggerrc   r   r    r,   r-   r   r7   r   ZInterpreterr   r   r8   ImportErrorr   __all__Ztorch.fx.experimentalr   r   rl   r   rm   r   r   r   r   r  r   r   r   r   <module>   sL    ,
%XOFD 	!
