
    Wj                     P   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 d dl	m
Z
mZmZ d dlZd dlZd dlZd dlmc 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j        e          Z	 d dl Z d	e j!        d
e"fdZ#d Z$e G d d                      Z%deddd
efdZ& G d dej        j'                  Z( G d d          Z) G d d          Z*dZ+g dZ,n# e-$ r	 dZ+g dZ,Y nw xY wd dl.m/Z0 d
e1fdZ2d
e3fdZ4d Z5 G d  d!e          Z6 G d" d#e          Z7 e5             d$ Z8dS )%    N)Callable)	dataclass)AnyOptionalUnion)TorchDynamoException)dynamo_timed)ArgumentTarget)sympy_interpereturnc                   
 t          j        |           st          d|            dt           j        dt          t
                   fd}t          j        |           } t          j        |           st          d|            t          j	        |           st          j
        |           r|                                 S |                                 }|                                t          |          } ||           }t           j        k    rd}nt           j        t           j        fv r
fd
 
|           }n߉t           j        k    r|                                 dk    r$t          d	|                                            |                     d
          }t          j        |          st          d          |                                                                }t           j        dt           j        dt           j        di}||v r||         } ||          }nt           j        t           j        fv r|                                 dk    r$t          d	|                                            t3          |                     d
                    }|                    d          rd|dd          z   S |S t           j        k    rK|                                 d
k    r$t          d|                                            t          |          S |dz   d                    |          z   }	d|	                                 dS )Nzunsupported expression type: r   r   c                 ^      fdt                                                     D             S )Nc                 T    g | ]$}t                              |                    %S  )z3strarg).0ir   s     d/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/fx/experimental/validator.py
<listcomp>z/z3str.<locals>.get_args_str.<locals>.<listcomp>B   s)    AAAE!%%((OOAAA    )rangenum_args)r   s   `r   get_args_strzz3str.<locals>.get_args_strA   s-    AAAAU1::<<-@-@AAAAr   zcan't print Z3 expression: powc                      t          j                   r*                                                                 k    st	                     gS  fdt                                                     D             S )Nc                 V    g | ]%}                      |                    D ]}|&S r   )r   )r   r   xcollect_str_argsr   s      r   r   z3z3str.<locals>.collect_str_args.<locals>.<listcomp>`   sU       !1!1!%%((!;!;      r   )z3is_appdeclkindr   r   r   )r   r!   r%   s   `r   r!   zz3str.<locals>.collect_str_args\   s|    	! D)@)@!!HH:%    !&qzz||!4!4   r      zExpected 1 arg, got r   zExpected z3 appz!=><z(/z(idiv   zExpected 0 args, got  ())r"   is_exprAssertionError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%   s             @@r   r   r   =   s'   z!}} 	F !D!D!DEEE	BBJ 	B49 	B 	B 	B 	B
 KNN y|| 	@>1>>????1 	!!5a!8!8 	!;;== vvxxyy{{YY|A2>!!BBblBL111      $#A&&DDR\!! zz||q  $%JAJJLL%J%JKKK%%((C9S>> 8$%6777hhjjoo''G TSSM -''"7+#|C((bor'7888zz||q  $%JAJJLL%J%JKKK15588__F   && ,++ MR+++zz||q  $%KQZZ\\%K%KLLLt99cCHHTNN*%6==??%%%%r   c                 J     t          j                    fd            }|S )Nc                     t          d |D                       r | S t          d |D                       }t          j         |           S )Nc              3   J   K   | ]}t          |t          j                  V  d S N)
isinstancer"   BoolRef)r   r   s     r   	<genexpr>z/_bitwise_op.<locals>.wrapper.<locals>.<genexpr>   s?       - -03
3
++- - - - - -r   c              3   @   K   | ]}t          j        |d           V  dS )@   N)r"   Int2BVr   as     r   rP   z/_bitwise_op.<locals>.wrapper.<locals>.<genexpr>   s.       @ @a1b!1!1 @ @ @ @ @ @r   )alltupler"   BV2Int)selfrE   wrapped_argsbitwise_func	bool_funcs      r   wrapperz_bitwise_op.<locals>.wrapper   sv    $ - -7;- - - * *$ !y$''  @ @4 @ @ @@@L9\\<8999r   )	functoolswraps)r[   r\   r]   s   `` r   _bitwise_opr`      s>    		&	&	: 	: 	: 	: 	: 
'	&	: r   c                   F   e Zd ZU ded<   edej        dej        fd            Zedej        dej        fd            Zdej        dej        fdZ	d	ej        d
ej        dej        fdZ
dej        dej        fdZd	ej        d
ej        dej        fdZdej        dej        fdZdej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZdej        dej        fdZdej        dej        fdZdej        dej        f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                 V    |                                  r| nt          j        |           S rM   )is_realr"   ToRealr    s    r   to_realz_Z3Ops.to_real   s!    		51115r   c                 V    |                                  r| nt          j        |           S rM   )is_intr"   ToIntrh   s    r   to_intz_Z3Ops.to_int   s!    

3113r   rE   c                      t          |          S rM   )sum)rY   rE   s     r   sym_sumz_Z3Ops.sym_sum   s    t99r   	numeratordenominatorc                     | j                             |dk               t                              |          t                              |          z  S Nr   )rd   add_assertionrb   ri   rY   rq   rr   s      r   divz
_Z3Ops.div   s@    N(()9:::>>),,v~~k/J/JJJr   numberc                 6    t                               |          S rM   )rb   rm   rY   rx   s     r   floorz_Z3Ops.floor   s    ==(((r   c                     |                                 p|                                 }t                              |                     ||                    }|rt                              |          n|S rM   )rf   rb   rm   rw   ri   )rY   rq   rr   cast_result_to_realresults        r   floordivz_Z3Ops.floordiv   se     #,"3"3"5"5"N9L9L9N9N]]488I{#C#CDDF .AL6>>&)))fLr   c                     t          j        |                     |          |k     |                     |dz             |          S Nr&   )r"   Ifr{   rz   s     r   ceilz_Z3Ops.ceil   s7    5F++f4djj!6L6LfUUUr   c                     t          j        |dk    |                     |          |                     |                    S rt   )r"   r   r{   r   rz   s     r   truncz_Z3Ops.trunc   s2    51djj&8&8$))F:K:KLLLr   rU   bc                 6    t          j        ||k    ||          S rM   r"   r   rY   rU   r   s      r   maxz
_Z3Ops.max       5Q1%%%r   c                 6    t          j        ||k     ||          S rM   r   r   s      r   minz
_Z3Ops.min   r   r   pqc                 :    ||                      ||          |z  z
  S rM   )r   rY   r   r   s      r   modz
_Z3Ops.mod   s     t}}Q**Q...r   baseexpc                 v    | j                             t          j        |dk    |dk                         ||z  S rt   )rd   ru   r"   OrrY   r   r   s      r   r   z
_Z3Ops.pow   s6    N((tqy#')B)BCCC9r   c                 |    t                               |          }| j                            |dk               |dz  S )Nr         ?)rb   ri   rd   ru   rz   s     r   sqrtz_Z3Ops.sqrt   s;     ^^F++F N((15553;r   c                 *    t          j        |          S rM   )r"   Absrz   s     r   absz
_Z3Ops.abs   s    6&>>!r   c                     t          j        |                     |t          j        d                    dk    |                     |dz
            |                     |dz                       S )Nr)   r   )r"   r   r   IntValr   r{   rz   s     r   round_to_intz_Z3Ops.round_to_int   s\     51..#5		&3,''

6C<((  r   N) __name__
__module____qualname____annotations__staticmethodr"   ArithRefri   rm   rp   rw   r{   r   r   r   r   r   r   r   r   r   r   r`   operatorand_Andbitwise_andor_r   
bitwise_orlshiftrshiftr   r   r   rb   rb      s         *))) 
	6r{ 	6r{ 	6 	6 	6 
	6 
	4bk 	4bk 	4 	4 	4 
	4	 	 	 	 	 		K 	K2; 	K2; 	K 	K 	K 	K	) 	) 	) 	) 	) 	)	M[	M79{	M[	M 	M 	M 	M	Vr{ 	Vr{ 	V 	V 	V 	V	M 	M 	M 	M 	M 	M	& 	& 	& 	& 	& 	& 	&	& 	& 	& 	& 	& 	& 	&
	/ 	/ 	/ 	/ 	/ 	/ 	/	BK 	bk 	bk 	 	 	 	
	r{ 	r{ 	 	 	 		"bk 	"bk 	" 	" 	" 	"	r{ 	r{ 	 	 	 	 "k(-88 [ru55
X_d33X_d33r   rb   rD   rd   rc   c                    t           j        h}| |v f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           t.          j          ||j!                  t.          j"        t.          j"        i}| |v r||          n
 ||           S )Nc                 p     dt           j        ffdt          j                    fd            }|S )Nr   c                 4   t          | t          j        t          j        f          r| S t          | t                    sr6t          | t
                    r!t          j        t	          |                     S t          | t
          t          j        f          r!t          j	        t          |                     S t          | t          t          j        f          r!t          j        t          |                     S t          dt          |                      )Nzcan't lift type: )rN   r"   r   rO   boolintBoolValsympyIntegerr   floatFloatRealValr3   type)rU   as_bools    r   wrapz z3op.<locals>.lift.<locals>.wrap  s    a"+rz!:;; H a&& /7 /z!S7I7I /:d1gg...a#u}!566 -9SVV,,,a%!566 0:eAhh/// !>T!WW!>!>???r   c                      t          |           dk    rEt          | d         t          t          f          r#t          fd| d         D                       f}nt          fd| D                       } | S )Nr&   r   c              3   .   K   | ]} |          V  d S rM   r   r   rU   r   s     r   rP   z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>,  s+      )C)Ca$$q'')C)C)C)C)C)Cr   c              3   .   K   | ]} |          V  d S rM   r   r   s     r   rP   z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>.  s+      (?(?Qa(?(?(?(?(?(?r   )lenrN   r0   rW   )rE   rZ   funcr   s     r   r]   z#z3op.<locals>.lift.<locals>.wrapper(  s     t99>>ja4-&H&H>$))C)C)C)C47)C)C)C$C$C#ELL#((?(?(?(?$(?(?(?#?#?Lt\**r   )r"   r/   r^   r_   )r   r]   r   r   s   ` @r   liftzz3op.<locals>.lift  so    @2: @ @ @ @ @ @ _T""+ + + + + #"+ Nr   c                     | r|n|S rM   r   )r   tfs      r   <lambda>zz3op.<locals>.<lambda>J  s    QA r   )#r   not_rb   r"   Notr   r   r   r   r   r   r   truedivrw   r   r   builtinsroundr   mathr   r{   r   torch	sym_floatri   sym_maxr   sym_minr   rp   sym_ite	_sym_sqrtr   _assert)rD   rd   boolean_opsr   opsreplacement_mapr   s         @r   z3opr     sQ   
  }o#	 	 	 	 	4 Y
M44<<
 M4400
 L$$s~..	

 OTT#*--
 OTT#*--
 ttCL11
 dd37mm
 L$$sw--
 L$$sw--
 NDD!122
 IttCH~~
 JSY
 JSY
" OTT#+..#
$ M44==%
& M44=='
( M44,,)
* M44 = =>>OTT#(^^ M5=3
 
6 ')O&;&;r""bIr   c                        e Zd Zdej        j        ddf fdZdedee	df         de
eef         d	efd
Zdedee	df         de
eef         d	ef fdZ xZS )PopulateValidatorgraphrd   rc   c                     || _         t          j                            i |          }t	                                          |d           d S )N)rootr   T)garbage_collect_values)rd   r   fxGraphModulesuper__init__)rY   r   rd   module	__class__s       r   r   zPopulateValidator.__init__\  sI    &DN X))r)??FGGVDAAAAAr   targetrE   .kwargsr   c                 h    t          j                    d         }| j                            |          S )Nsymbol)fx_tracebackget_current_metard   z3var)rY   r   rE   r   r   s        r   placeholderzPopulateValidator.placeholderd  s-     "244X>F>''///r   c                 6   |t           j        ur6t                                          t	          || j                  ||          S t          |          dk    r t          dt          |           d          | j                            |d                    d S )Nr&   z'expected 1 argument on assertion. Got: r*   r   )	r   r   r   call_functionr   rd   r   r.   add_source_expr)rY   r   rE   r   r   s       r   r   zPopulateValidator.call_functionj  s     U]**ww,,T&$.-I-I4QWXXX 4yyA~~$Jc$iiJJJ   N**4733333r   )r   r   r   r   r   Graphr   r   rW   r
   dictr1   r   r   r   __classcell__)r   s   @r   r   r   [  s        	B%(. 	B=S 	B 	B 	B 	B 	B 	B	0 	0(-hm(<	0FJ3PS8n	0	0 	0 	0 	0	4 	4(-hm(<	4FJ3PS8n	4	4 	4 	4 	4 	4 	4 	4 	4 	4 	4r   r   c                      e Zd Zh dZ	 	 	 	 d"dZdedej        dej	        fd	Z
d
ej        dej        dej        fdZd
ej        dej        dej        fdZd
ej        dej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZdej        dej        dej        fdZd
ej        dej        dej        fdZd
ej        dej        dej        fdZdedefdZd ej        dej	        fd!ZdS )#	SympyToZ3>   eqgegtleltneaddmulrd   rc   r   Nc                 F    || _         t          | j                   | _        d S rM   )
_validatorrb   _ops)rY   rd   s     r   r   zSympyToZ3.__init__  s      (DOt//DIIIr   valuedtypec                 @   |t           j        u r!t          j        t	          |                    S |t           j        u r!t          j        t          |                    S |t           j        u r!t          j	        t          |                    S t          d|           )Nzunsupported dtype (SympyToZ3): )r   int64r"   r   r   doubler   r   r   r   r3   )rY   r   r  s      r   constantzSympyToZ3.constant  s    ##yU,,,$$z%,,///
""z$u++...FuFFGGGr   r    c                 p    |t           j        k    rt          j        |          S t	          d| d          )Nz	to_dtype z NYI)r   float64r"   rg   NotImplementedErrorrY   r    r  s      r   to_dtypezSympyToZ3.to_dtype  s7    %%y||#%&=%&=&=&=>>>r   c                 *    t          j        |          S rM   )r"   rl   r	  s      r   trunc_to_intzSympyToZ3.trunc_to_int  s    8A;;r   c                 6    | j                             |          S rM   )r   r   r	  s      r   r   zSympyToZ3.round_to_int  s    9))!,,,r   rq   rr   c                 8    | j                             ||          S rM   r   rw   rv   s      r   int_truedivzSympyToZ3.int_truediv       9==K888r   c                 8    | j                             ||          S rM   r  rv   s      r   r   zSympyToZ3.truediv  r  r   c                 8    | j                             ||          S rM   r   r   rv   s      r   r   zSympyToZ3.floordiv  s     9%%i===r   c                 8    | j                             ||          S rM   r  rv   s      r   rw   zSympyToZ3.div  s    9%%i===r   r   r   c                 8    | j                             ||          S rM   r   r   r   s      r   r   zSympyToZ3.pow      9==s+++r   c                 8    | j                             ||          S rM   r  r   s      r   pow_by_naturalzSympyToZ3.pow_by_natural  r  r   r   r   c                 8    | j                             ||          S rM   r   r   r   s      r   r   zSympyToZ3.mod      9==A&&&r   c                 8    | j                             ||          S rM   r  r   s      r   
python_modzSympyToZ3.python_mod  r  r   c                 6    | j                             |          S rM   )r   r   r	  s      r   ceil_to_intzSympyToZ3.ceil_to_int  s    9>>!$$$r   c                 6    | j                             |          S rM   )r   r{   r	  s      r   floor_to_intzSympyToZ3.floor_to_int  s    9??1%%%r   namec                 r   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 rt          t          |          S t!          d|           )N)r   r   r   r   r   r   r   r{   r   minimummaximumzunhandled operator: )r"   r   r   r   r   r   r   r   r   r{   r   r   r   OPERATOR_HANDLESgetattrr   AttributeError)rY   r$  REPLACEMENTs      r   __getattr__zSympyToZ3.__getattr__  s    u#y4"i2)*)*	9=9= K {"""4((t,,,x... !>!>!>???r   exprc                 8    t          | | j        j        |          S rM   )r   r   symbols)rY   r-  s     r   runzSympyToZ3.run  s    do&=tDDDr   )rd   rc   r   N)r   r   r   r(  r   r   r   r  r"   r/   r  r   r
  r  r   r  r   r   rw   r   r  r   r  r!  r#  r1   r,  r   Basicr0  r   r   r   r   r   ~  s<       MMM	0-	0 	0 	0 	0 	0	H# 	Hek 	Hbj 	H 	H 	H 	H	?bk 	?%+ 	?"+ 	? 	? 	? 	?
	"+ 	ek 	bk 	 	 	 		-"+ 	-ek 	-bk 	- 	- 	- 	-	9[	979{	9[	9 	9 	9 	9
	9[	979{	9[	9 	9 	9 	9
	>[	>79{	>[	> 	> 	> 	>
	> 	>2; 	>2; 	> 	> 	> 	>	,BK 	,bk 	,bk 	, 	, 	, 	,	,r{ 	, 	, 	, 	, 	, 	,	' 	' 	' 	' 	' 	' 	'	' 	' 	' 	' 	' 	' 	'	% 	%U[ 	%R[ 	% 	% 	% 	%	&"+ 	&ek 	&bk 	& 	& 	& 	&	@C 	@C 	@ 	@ 	@ 	@*	EEK 	EBJ 	E 	E 	E 	E 	E 	Er   r   c                      e Zd ZddZdej        dej        fdZdej        de	dej        fdZ
dej        ddfd	Zdej        dej        fd
Zdej        ddfdZddZdeej        ej        f         ddfdZddZddZdS )rc   r   Nc                     t                               d           i | _        t                      | _        t                      | _        t                      | _        d S )Nznew instance)logdebugr/  set_source_exprs_target_exprs_assertionsrY   s    r   r   zTranslationValidator.__init__  sM    IIn%%% <>DL
 36%%D
 36%%D 14Dr   r   c                 R    || j         vrt          d|           | j         |         S )NzZ3 variable not found for: )r/  r.   )rY   r   s     r   r   zTranslationValidator.z3var  s3    T\))$%K6%K%KLLL<''r   r   c                    || j         v r| j         |         S t                              d|j        |j                   |t
          u r?t          j        |j                  }|j        r| j	        
                    |dk               nX|t          u rt          j        |j                  }n5|t          u rt          j        |j                  }nt          d|           || j         |<   |S )Nznew variable: %s (%s)r   z"unsupported type for Z3 variable: )r/  r4  r5  r$  r   r   r"   Intis_positiver8  r   r   Realr   BoolRuntimeError)rY   r   r   vars       r   add_varzTranslationValidator.add_var  s    %%|F++II-v{DMJJJs{{fV[)) % 4&**37333gfk**gfk**"#N#N#NOOO#&DL Jr   r   c                     |j         D ]P}t          |t          j                  st	          dt          |                     |                     |           Qd S )NzExpected sympy.Symbol, got )free_symbolsrN   r   Symbolr.   r   r   )rY   r   ss      r   _check_freesymbolsz'TranslationValidator._check_freesymbols  sb    ^  !!U\22 R()PtAww)P)PQQQ 

1 r   c                     t          |                               |          }t          |t          j                  st          d|           |S )Nz"expected boolean expression. Got: )r   r0  rN   r"   rO   r.   rY   r   z3exprs      r   to_z3_boolean_exprz'TranslationValidator.to_z3_boolean_expr#  sL    t__((++Ffbj11 T$%R&%R%RSSSMr   c                     || j         vr(t                              dt          |                     | j                             |           d S )Nzadd source guard: %s)r7  r4  r5  r   r   )rY   r   s     r   r   z$TranslationValidator.add_source_expr)  sH    ***		0%((;;;""1%%%%%r   sympy.logic.boolalg.Booleanc                     |                      |           |                     |          }|| j        vr(t                              dt          |                     | j                            |           d S )Nzadd target guard: %s)rH  rL  r8  r4  r5  r   r   rJ  s      r   add_target_exprz$TranslationValidator.add_target_expr.  so    ##A&&&,,Q//F***		0%--@@@""6*****r   c                    t          |t          j                  r+|                     |           |                     |          }n|}t          |t
          j                  st          dt          |                     || j	        vr(t                              dt          |                     | j	                            |           d S )NzExpected z3.BoolRef, got zadd assertion: %s)rN   r   r1  rH  rL  r"   rO   r.   r   r9  r4  r5  r   r   )rY   r   refs      r   ru   z"TranslationValidator.add_assertion5  s    !U[)) ''***--a00c2:.. N$%Lc%L%LMMM$***		-uSzz:::  %%%%%r   c                 |    t          d          5  |                                 cd d d            S # 1 swxY w Y   d S )NzTranslationValidator.validate)r	   	_validater:  s    r   validatezTranslationValidator.validateA  s    =>> ( (~~''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   155c                 t   t          | j                  dk    st          | j                  dk    rd S t          j        d          }|                    t                                 | j        D ]}|                    |           |                    t          j	        t          j
        | j                               |j        | j          t                              d           |                                }|t          j        k    rB|                                t!          | j        | j        fd| j        D                       |t          j        k    rt                              d           d S |t          j        k    rt)          d|           t                              d	           d S )
Nr   QF_NRA)timeoutztranslation validation: startc                 >    g | ]}                     |          |S r   )evaluate)r   inpmodels     r   r   z2TranslationValidator._validate.<locals>.<listcomp>l  s;     ) ) ) #PSATAT)) ) )r   )failed_source_exprsz:translation validation: could not validate: got z3.unknownzExpected z3.unsat, got ztranslation validation: success)r   r7  r8  r"   	SolverForr6  translation_validation_timeoutr9  r   r   r   r4  r5  checksatr\  ValidationExceptionunknownwarningunsatr.   )rY   solver	assertionrr\  s       @r   rT  zTranslationValidator._validateE  s   4%&&!++s43E/F/F!/K/K t \(++FJJ=??J@@@ "- & &	

9%%%% JJrvbfd&89::;;;FJ*++II5666ABF{{ )$&) ) ) )'+'9) ) )	    
?? KKT    
 BH}},-Jq-J-JKKKII?@@@@@r   )r   N)r   rN  r   N)r   r   r   r   r   rF  r"   r/   r   r   rC  r1  rH  rO   rL  r   rP  r   ru   rU  rT  r   r   r   rc   rc     s[       	6 	6 	6 	6*	( 	( 	( 	( 	( 	(	%, 	d 	rz 	 	 	 	0	 	 	 	 	 		 	
 	 	 	 		&RZ 	&D 	& 	& 	& 	&
	+ 	+ 	+ 	+
	&5U[)@#A 
	&d 
	& 
	& 
	& 
	&	( 	( 	( 	(7	A 7	A 7	A 7	A 7	A 7	Ar   T)	r   r   r   r   rc   translation_validation_enabledr_  rb  BisectValidationExceptionF)ri  r_  rb  rj  )_configc                  D    t                       t          ot          j        S rM   )_assert_z3_installed_if_tv_set_HAS_Z3configtranslation_validationr   r   r   ri  ri    s     #$$$4v44r   c                      t           j        S rM   )ro  r_  r   r   r   r_  r_    s    00r   c                  N    t           st          j        rt          d          d S d S )Nzotranslation validation requires Z3 package. Please, either install z3-solver or disable translation validation.)rn  ro  rp  r.   r   r   r   rm  rm    s?     
68 
;
 
 	

 
 
 
r   c                       e Zd Zd Zd ZdS )rb  c                    t           st          d          dt          ffd}dt          fd} |t          t	          |                              } |t          t	          t
          |                              } |t          t	          t
          |                              }	 |t          t	          t
          |                              }
d| _        d| d| d|	 d	|
 | _        d S )
NzZ3 is requiredr   c                     |  d|           S )N: r   )symr\  s    r   	symbolstrz/ValidationException.__init__.<locals>.symbolstr  s    ))U3Z)))r   c                 @    d                     d | D                       S )N
c              3       K   | ]	}d | V  
dS )z  ==> Nr   )r   r    s     r   rP   zBValidationException.__init__.<locals>.joinlines.<locals>.<genexpr>  s(      66a\a\\666666r   )rB   )xss    r   	joinlinesz/ValidationException.__init__.<locals>.joinlines  s#    99662666666r   ztranslation validation failed.zModel:
z

Assertions:
z

Target Expressions:
z

Failed Source Expressions:
)rn  r.   r1   sortedmapr   msgdetails)rY   r\  
assertionstarget_exprsr]  rx  r}  	model_strassertions_strtarget_exprs_strfailed_source_exprs_strs    `         r   r   zValidationException.__init__  s1    	3 !1222	*c 	* 	* 	* 	* 	* 	*	7S 	7 	7 	7 	7 IfSE%:%:;;<<	"6#eZ*@*@#A#ABB$9VC|,D,D%E%EFF"+)F3u>Q3R3R,S,S"T"T3
 
      r   c                 $    | j          d| j         S N

r  r  r:  s    r   __str__zValidationException.__str__      (.....r   Nr   r   r   r   r  r   r   r   rb  rb    s2          :/ / / / /r   rb  c                       e Zd Zd Zd ZdS )rj  c                 h    d| d| | _         d|                                 d|j         | _        d S )Nz#translation validation failed when rv  z)Failure occurred while running node:
    r  )r  format_noder  )rY   validation_excr-  failed_actiontraced_nodes        r   r   z"BisectValidationException.__init__  sQ    PPP$PP  	 r   c                 $    | j          d| j         S r  r  r:  s    r   r  z!BisectValidationException.__str__  r  r   Nr  r   r   r   rj  rj    s2          / / / / /r   rj  c           	         ddl mmm} ddlm}m}m | j        dt          j
        j        d|ffd}d|dt          ffdd|d	t          t          t                            dt          t                   ffd
dt          j
        j        dt          t                   ffd} | |                                           }|st"                              d           d S | j        rt(          j        r|i }d | j        j        D             }ddt1          |          dz
  }}
}	 |||                   ||<   |	|k     rY|	|z   dz  }
||
         }t"                              d|
 ||                      ||          ||
<   ||
         r|
}n|
dz   }	|	|k     Y|	|v rt5          ||	         t                    st7          d          ||	         } ||          }|                                rd}n(|                                st7          d|           d}|j        }|t7          d          t1          |          dk     r't7          d|j         dt1          |                     t5          |d         t@          j!                  s-t7          d|j         dtE          |d                              tG          ||	         |d         ||j$        |                   )Nr   )FakeTensorMetareplay_shape_env_eventsShapeEnvEvent)CURRENT_NODE_KEYShapeEnvSHAPEENV_EVENT_KEYnoder   c                 Z    | j         vrt          d          | j                           S )Nz#SHAPEENV_EVENT_KEY not in node.meta)metar.   )r  r  eventss    r   get_node_eventzbisect.<locals>.get_node_event  s2    TY.. !FGGGdi 2344r   	shape_envc           	          t          |t                    r|S t          |t          j                  r,t          j        |j                                                 S t          |t          j                  r,t          j        |j                                                 S t          |          st          dt          |                      t           fd|
                                D                       t           fd|                                D                         |                                          |j                  S )NzExpected FakeTensorMeta, got c              3   0   K   | ]} |          V  d S rM   r   r   rG  new_with_shape_envr  s     r   rP   z5bisect.<locals>.new_with_shape_env.<locals>.<genexpr>  s1      HHq$$Y22HHHHHHr   c              3   0   K   | ]} |          V  d S rM   r   r  s     r   rP   z5bisect.<locals>.new_with_shape_env.<locals>.<genexpr>  s1      JJq$$Y22JJJJJJr   )rN   r   r   SymIntr  with_shape_envSymFloatr.   r   rW   sizestridestorage_offset	is_nested)r  faker  r  s   ` r   r  z"bisect.<locals>.new_with_shape_env  s@   dC   	KdEL)) 	E<	 8 8 C CDDDdEN++ 	G>$)":":9"E"EFFF$// 	O !Md!M!MNNN~HHHHHDIIKKHHHHHJJJJJDKKMMJJJJJy$*=*=*?*?@@N	
 
 	
r   tracked_fakesc                      |t          d          	                       fd|D             d |D             d |D                        d S # t          $ r}|cY d }~S d }~ww xY w)Nztracked_fakes is Nonec                 2    g | ]} |j                   S r   )r  )r   rU   r  r  s     r   r   z8bisect.<locals>.check_shapeenv_fails.<locals>.<listcomp>  s)    NNN1##Iqv66NNNr   c                     g | ]	}|j         
S r   )sourcerT   s     r   r   z8bisect.<locals>.check_shapeenv_fails.<locals>.<listcomp>  s    111a111r   c                     g | ]	}|j         
S r   )symbolic_contextrT   s     r   r   z8bisect.<locals>.check_shapeenv_fails.<locals>.<listcomp>  s    JJJq 2JJJr   )input_contexts)r.   produce_guardsrb  )r  r  r   r  s   `  r   check_shapeenv_failsz$bisect.<locals>.check_shapeenv_fails  s       !8999	 $$NNNNNNNN11=111JJMJJJ %   
 4" 	 	 	HHHHHH	s   9A 
A&A!A&!A&c                     | j                  } d |dz                      }|j                                          ||         j                  S r   )r  r   lintr  )r  rx   r  r  r  r  r  s      r   check_node_failsz bisect.<locals>.check_node_fails&  s[    -.++F<VaZ<,@AA	##Ivf~/KLLLr   z2translation validation succeeded: no errors found.c                 8    g | ]}|j         t          j        u |S r   )r   r   r   )r   r  s     r   r   zbisect.<locals>.<listcomp>A  s-       $+2N2N2N2N2Nr   r&   r)   zbisecting at %s: %sz-Expected ValidationException at bisect result
evaluatingzunexpected event type: zadding runtime assertzevent.args is Nonez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  )%torch.fx.experimental.recordingr  r  r  %torch.fx.experimental.symbolic_shapesr  r  r  r  r   r   Noder   r   r0   rb  _snapshot_tracked_fakesr4  infoshould_record_eventsro   translation_validation_no_bisectr   nodesr   r5  rN   r.   is_evaluate_expris_defer_runtime_assertrE   r$  r   r1  r   rj  r  )r  r  r  r  r  r  last_exception	exceptionassert_nodesleftmidrightr  eventr  rE   r  r  r  r  r  r  s                   @@@@@@r   bisectr    s8            
          F5UX] 5} 5 5 5 5 5 5 5
h 
 
 
 
 
 
 
 
",4T#Y,?	%	&     (Mux} M:M1N M M M M M M M M M *)94466 N   	EFFF) V-T   I ".  L !S..2u#D''U(;<<Ie
,,e|!C 		'nnT.B.BCCC *)$//	#S> 	EE7D ,, I*Yt_>Q"R"RLMMMDN4  E 0$,,.. 	D !B5!B!BCCC/:D|1222
4yy1}}     II   
 
 	
 d1gu{++ 
. . ."47mm. .
 
 	

 $$!W#I./	   r   )9r   r^   loggingr   r   collections.abcr   dataclassesr   typingr   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   r4  r"   r/   r1   r   r`   rb   r   Interpreterr   r   rc   rn  __all__ImportErrortorch.fx.experimentalrk  ro  r   ri  r   r_  rm  rb  rj  r  r   r   r   <module>r     s           $ $ $ $ $ $ ! ! ! ! ! ! ' ' ' ' ' ' ' ' ' '    ) ) ) ) ) ) ) ) ) 2 2 2 2 2 2 , , , , , , * * * * * * * * 2 2 2 2 2 2 g!!}	IIIHU& U& U& U& U& U&t  $ ]4 ]4 ]4 ]4 ]4 ]4 ]4 Y]4N?J ?J&< ?J ?J ?J ?J ?JT4 4 4 4 4EH0 4 4 4FYE YE YE YE YE YE YE YERUA UA UA UA UA UA UA UAD G
 
 
GG    G  GGG2 4 3 3 3 3 35 5 5 5 51 1 1 1 1
 
 
/ / / / /. / / /D
/ 
/ 
/ 
/ 
/ 4 
/ 
/ 
/        T T T T Ts   +A%C C%$C%