
    Vh                     6   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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j8                  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                   jL                        Z' G d d      Z( G d d      Z)dZ*g dZ+d dl-m.Z/ d	e0fdZ1d	e2fdZ3d Z4 G d d e      Z5 G d! d"e      Z6 e4        d# Z7y# e,$ r	 dZ*g dZ+Y Cw xY w)$    N)	dataclass)AnyCallableOptionalUnion)TorchDynamoException)dynamo_timed)ArgumentTarget)sympy_interpereturnc                 Z  
 t        j                  |       s
J d|         dt         j                  dt        t           fd}t        j
                  |       } t        j                  |       st        d|        t        j                  |       st        j                  |       r| j                         S | j                         }|j                         t	        |      } ||       }t         j                  k(  rd}nt         j                  t         j                  fv r
fd
 
|       }nQt         j                   k(  r| j#                         dk(  sJ | j%                  d	      }t        j                  |      sJ |j                         j                         }t         j&                  d
t         j(                  dt         j*                  di}||v r||   } ||      }nt         j,                  t         j.                  fv rJ| j#                         dk(  sJ t1        | j%                  d	            }|j3                  d      rd|dd  z   S |S t         j4                  k(  r | j#                         d	k(  sJ t	        |      S |dz   dj7                  |      z   }	d|	j9                          dS )Nzunsupported expression type: r   r   c                     t        | j                               D cg c]  }t        | j                  |             c}S c c}w N)rangenum_argsz3strarg)r   is     O/home/dcms/DCMS/lib/python3.12/site-packages/torch/fx/experimental/validator.pyget_args_strzz3str.<locals>.get_args_str?   s-    -21::<-@AE!%%(OAAAs   !A zcan't print Z3 expression: powc           	         t        j                  |       r!| j                         j                         k(  st	        |       gS t        | j                               D cg c]   } | j                  |            D ]  }| " c}}S c c}}w r   )z3is_appdeclkindr   r   r   r   )r   r   xcollect_str_argsr   s      r   r    zz3str.<locals>.collect_str_argsZ   s|    		!D)@!!H:% "'qzz|!4!1!%%(!;    s    %B	   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   s             @@r   r   r   <   s@   zz!}A =aSAA}	BBJJ 	B49 	B
 KKN yy|:1#>????1!5!5a!8;;= vvxyy{YA2>>!BbllBLL11 $A&DR\\! ::<1$$$%%(C99S>!>hhjoo'G TSSM -'"7+#C(boor'7'788::<1$$$1558_F   &++ MR+++::<1$$$t9cCHHTN*6==?#1%%    c                 F     t        j                          fd       }|S )Nc                     t        d |D              r | S t        d |D              }t        j                   |       S )Nc              3   P   K   | ]  }t        |t        j                           y wr   )
isinstancer   BoolRef).0r   s     r   	<genexpr>z/_bitwise_op.<locals>.wrapper.<locals>.<genexpr>   s       -03
3

+-s   $&c              3   H   K   | ]  }t        j                  |d         yw)@   N)r   Int2BV)rJ   as     r   rK   z/_bitwise_op.<locals>.wrapper.<locals>.<genexpr>   s      @a1b!1 @s    ")alltupler   BV2Int)selfr?   wrapped_argsbitwise_func	bool_funcs      r   wrapperz_bitwise_op.<locals>.wrapper   sN    $ -7;- * !$''  @4 @@L99\<899rD   )	functoolswraps)rU   rV   rW   s   `` r   _bitwise_oprZ      s%    		&	: 
'	: rD   c                      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j0                  ej2                        Z eej6                  ej8                        Z eej<                  d      Z eej>                  d      Zy)_Z3OpsTranslationValidator	validatorr   r   c                 P    | j                         r| S t        j                  |       S r   )is_realr   ToRealr   s    r   to_realz_Z3Ops.to_real   s    		1515rD   c                 P    | j                         r| S t        j                  |       S r   )is_intr   ToIntrb   s    r   to_intz_Z3Ops.to_int   s    
133rD   r?   c                     t        |      S r   )sum)rS   r?   s     r   sym_sumz_Z3Ops.sym_sum   s    t9rD   	numeratordenominatorc                     | j                   j                  |dk7         t        j                  |      t        j                  |      z  S Nr   )r^   add_assertionr\   rc   rS   rk   rl   s      r   divz
_Z3Ops.div   s6    NN(()9:>>),v~~k/JJJrD   numberc                 ,    t         j                  |      S r   )r\   rg   rS   rr   s     r   floorz_Z3Ops.floor   s    ==((rD   c                     |j                         xs |j                         }t        j                  | j                  ||            }|rt        j	                  |      S |S r   )r`   r\   rg   rq   rc   )rS   rk   rl   cast_result_to_realresults        r   floordivz_Z3Ops.floordiv   sS     #,"3"3"5"N9L9L9N]]488I{#CDF .A6>>&)LfLrD   c                 x    t        j                  | j                  |      |k  | j                  |dz         |      S Nr!   )r   Ifru   rt   s     r   ceilz_Z3Ops.ceil   s5    55

6"V+TZZ
-CV rD   c                 r    t        j                  |dk\  | j                  |      | j                  |            S rn   )r   r|   ru   r}   rt   s     r   truncz_Z3Ops.trunc   s+    551djj&8$))F:KLLrD   rO   bc                 6    t        j                  ||kD  ||      S r   r   r|   rS   rO   r   s      r   maxz
_Z3Ops.max       55Q1%%rD   c                 6    t        j                  ||k  ||      S r   r   r   s      r   minz
_Z3Ops.min   r   rD   pqc                 2    || j                  ||      |z  z
  S r   )ry   rS   r   r   s      r   modz
_Z3Ops.mod   s    t}}Q*Q...rD   baseexpc                 v    | j                   j                  t        j                  |dk7  |dkD               ||z  S rn   )r^   ro   r   OrrS   r   r   s      r   r   z
_Z3Ops.pow   s1    NN((tqy#')BC9rD   c                 r    t         j                  |      }| j                  j                  |dk\         |dz  S )Nr         ?)r\   rc   r^   ro   rt   s     r   sqrtz_Z3Ops.sqrt   s4     ^^F+F NN((153;rD   c                 ,    t        j                  |      S r   )r   Absrt   s     r   absz
_Z3Ops.abs   s    66&>!rD   c                     t        j                  | j                  |t        j                  d            dk(  | j	                  |dz
        | j                  |dz               S )Nr$   r   )r   r|   r   IntValr}   ru   rt   s     r   round_to_intz_Z3Ops.round_to_int   sP     551.#5		&3,'

6C<( rD   N) __name__
__module____qualname____annotations__staticmethodr   ArithRefrc   rg   rj   rq   ru   ry   r}   r   r   r   r   r   r   r   r   rZ   operatorand_Andbitwise_andor_r   
bitwise_orlshiftrshift rD   r   r\   r\      sW    *) 
	6r{{ 	6r{{ 	6 
	6 
	4bkk 	4bkk 	4 
	4	 	 		K 	K2;; 	K2;; 	K	) 	) 	)	M[[	M79{{	M[[	M	r{{ 	r{{ 	
	M 	M 	M	& 	& 	& 	&	& 	& 	& 	&
	/ 	/ 	/ 	/	BKK 	bkk 	bkk 	
	r{{ 	r{{ 		"bkk 	"bkk 	"	r{{ 	r{{ 	 "(--8 ruu5
X__d3X__d3rD   r\   r>   r^   r]   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.        j0                   ||j2                        t.        j4                   ||j6                        t.        j8                   ||j:                        t.        j<                   ||j<                        t.        j>                   |d       t.        j@                   ||jB                        t.        jD                  t.        jD                  i}| |v r||    S  ||       S )Nc                 t     dt         j                  ffdt        j                          fd       }|S )Nr   c                    t        | t        j                  t        j                  f      r| S t        | t              sr.t        | 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: )rH   r   r   rI   boolintBoolValsympyIntegerr   floatFloatRealValr-   type)rO   as_bools    r   wrapz z3op.<locals>.lift.<locals>.wrap  s    a"++rzz!:;H a&7z!S7I::d1g..a#u}}!5699SV,,a%!56::eAh// #4T!WI!>??rD   c                      t        |       dk(  r2t        | d   t        t        f      rt        fd| d   D              f}nt        fd| D              } | S )Nr!   r   c              3   .   K   | ]  } |        y wr   r   rJ   rO   r   s     r   rK   z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>(  s     )Ca$q')C   c              3   .   K   | ]  } |        y wr   r   r   s     r   rK   z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>*  s     (?Qa(?r   )lenrH   r*   rQ   )r?   rT   funcr   s     r   rW   z#z3op.<locals>.lift.<locals>.wrapper$  sS     t9>ja4-&H$))C47)C$C#EL#((?$(?#?L\**rD   )r   r)   rX   rY   )r   rW   r   r   s   ` @r   liftzz3op.<locals>.lift  s9    @2:: @ __T"+ #+ NrD   c                     | r|S |S r   r   )r   tfs      r   <lambda>zz3op.<locals>.<lambda>F  s    Q A rD   )#r   not_r\   r   Notr   r   r   r   r   r   ry   truedivrq   r   r   builtinsroundr   mathr}   ru   r   torch	sym_floatrc   sym_maxr   sym_minr   rj   sym_ite	_sym_sqrtr   _assert)r>   r^   boolean_opsr   opsreplacement_mapr   s         @r   z3opr     s)   
  }}o#	4 Y
MM4<
 MM40
 LL$s~~.	

 OOT#**-
 OOT#**-
 tCLL1
 d377m
 LL$sww-
 LL$sww-
 NND!1!12
 IItCHH~
 JJSYY
 JJSYY
" OOT#++.#
$ MM4=%
& MM4='
( MM4,)
* MM4 =>OOT#((^ MM5==3
6 ')O&;r"IbIrD   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graphr^   r]   c                 x    || _         t        j                  j                  i |      }t        |   |d       y )N)rootr   T)garbage_collect_values)r^   r   fxGraphModulesuper__init__)rS   r   r^   module	__class__s       r   r   zPopulateValidator.__init__X  s7    &DN XX))r)?FGVDArD   targetr?   .kwargsr   c                 f    t        j                         d   }| j                  j                  |      S )Nsymbol)fx_tracebackget_current_metar^   z3var)rS   r   r?   r   r   s        r   placeholderzPopulateValidator.placeholder`  s,     "224X>F>>''//rD   c                     |t         j                  k7  r%t        |   t	        || j
                        ||      S t        |      dk(  sJ dt        |       d       | j
                  j                  |d          y )Nr!   z'expected 1 argument on assertion. Got: r%   r   )r   r   r   call_functionr   r^   r   add_source_expr)rS   r   r?   r   r   s       r   r   zPopulateValidator.call_functionf  ss     &w,T&$..-I4QWXX D	QF8T1EFNN**473rD   )r   r   r   r   r   Graphr   r   rQ   r
   dictr+   r   r   r   __classcell__)r   s   @r   r   r   W  s    	B%((.. 	B=S 	B	0 	0(-hm(<	0FJ3PS8n	0	0	4 	4(-hm(<	4FJ3PS8n	4	4 	4rD   r   c                   h   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defdZdej6                  dej                  fdZy) 	SympyToZ3>   eqgegtleltneaddmulr   Nc                 F    || _         t        | j                         | _        y r   )
_validatorr\   _ops)rS   r^   s     r   r   zSympyToZ3.__init__|  s     (DOt/DIrD   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   r-   )rS   r   r   s      r   constantzSympyToZ3.constant  sr    #yyU,,$zz%,//

"zz$u+..>ugFGGrD   r   c                 p    |t         j                  k(  rt        j                  |      S t	        d| d      )Nz	to_dtype z NYI)r   float64r   ra   NotImplementedErrorrS   r   r   s      r   to_dtypezSympyToZ3.to_dtype  s0    %yy|#%	%&=>>rD   c                 ,    t        j                  |      S r   )r   rf   r  s      r   trunc_to_intzSympyToZ3.trunc_to_int  s    88A;rD   c                 8    | j                   j                  |      S r   )r   r   r  s      r   r   zSympyToZ3.round_to_int  s    99))!,,rD   rk   rl   c                 :    | j                   j                  ||      S r   r   rq   rp   s      r   int_truedivzSympyToZ3.int_truediv       99==K88rD   c                 :    | j                   j                  ||      S r   r  rp   s      r   r   zSympyToZ3.truediv  r  rD   c                 :    | j                   j                  ||      S r   r   ry   rp   s      r   ry   zSympyToZ3.floordiv  s     99%%i==rD   c                 :    | j                   j                  ||      S r   r  rp   s      r   rq   zSympyToZ3.div  s    99%%i==rD   r   r   c                 :    | j                   j                  ||      S r   r   r   r   s      r   r   zSympyToZ3.pow      99==s++rD   c                 :    | j                   j                  ||      S r   r  r   s      r   pow_by_naturalzSympyToZ3.pow_by_natural  r  rD   r   r   c                 :    | j                   j                  ||      S r   )r   r   r   s      r   r   zSympyToZ3.mod  s    99==A&&rD   c                 8    | j                   j                  |      S r   )r   r}   r  s      r   ceil_to_intzSympyToZ3.ceil_to_int  s    99>>!$$rD   c                 8    | j                   j                  |      S r   )r   ru   r  s      r   floor_to_intzSympyToZ3.floor_to_int  s    99??1%%rD   namec                    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   ru   r}   minimummaximumzunhandled operator: )r   r   r   r   r   r   r   r   r   ru   r}   r   r   OPERATOR_HANDLESgetattrr   AttributeError)rS   r  REPLACEMENTs      r   __getattr__zSympyToZ3.__getattr__  s    uu#yy44"ii22))**))**		99==99==K {""4((t,,,x.. #7v!>??rD   exprc                 D    t        | | j                  j                  |      S r   )r   r   symbols)rS   r%  s     r   runzSympyToZ3.run  s    doo&=&=tDDrD   )r^   r]   r   N)r   r   r   r   r   r   r   r   r   r)   r  r   r  r  r   r  r   ry   rq   r   r  r   r  r  r+   r$  r   Basicr(  r   rD   r   r   r   y  sJ   M	0-	0 	0	H# 	Hekk 	Hbjj 	H	?bkk 	?%++ 	?"++ 	?
	"++ 	ekk 	bkk 		-"++ 	-ekk 	-bkk 	-	9[[	979{{	9[[	9
	9[[	979{{	9[[	9
	>[[	>79{{	>[[	>
	> 	>2;; 	>2;; 	>	,BKK 	,bkk 	,bkk 	,	,r{{ 	, 	, 	,	' 	' 	' 	'	% 	%U[[ 	%R[[ 	%	&"++ 	&ekk 	&bkk 	&	@C 	@C 	@*	EEKK 	EBJJ 	ErD   r   c                   b   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y)r]   r   Nc                     t         j                  d       i | _        t               | _        t               | _        t               | _        y )Nznew instance)logdebugr'  set_source_exprs_target_exprs_assertionsrS   s    r   r   zTranslationValidator.__init__  s;    IIn% <>DL
 36%D
 36%D 14DrD   r   c                 P    || j                   v s
J d|        | j                   |   S )NzZ3 variable not found for: )r'  )rS   r   s     r   r   zTranslationValidator.z3var  s0    T\\)Q-H+QQ)<<''rD   r   c                    || j                   v r| j                   |   S t        j                  d|j                  |j                         |t
        u rJt        j                  |j                        }|j                  r}| j                  j                  |dkD         n^|t        u r t        j                  |j                        }n6|t        u r t        j                  |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_positiver0  r   r   Realr   BoolRuntimeError)rS   r   r   vars       r   add_varzTranslationValidator.add_var  s    %||F++II-v{{DMMJs{ffV[[) %%&&**373ggfkk*ggfkk*"%Gv#NOO#&DLL JrD   r   c                     |j                   D ]/  }t        |t        j                        sJ | j	                  |       1 y r   )free_symbolsrH   r   Symbolr   )rS   r   ss      r   _check_freesymbolsz'TranslationValidator._check_freesymbols  s6    ^^ !!U\\222 

1	rD   c                     t        |       j                  |      }t        |t        j                        s
J d|        |S )Nz"expected boolean expression. Got: )r   r(  rH   r   rI   rS   r   z3exprs      r   to_z3_boolean_exprz'TranslationValidator.to_z3_boolean_expr  sG    t_((+F

 =3F8<=  MrD   c                     || j                   vrt        j                  dt        |             | j                   j	                  |       y )Nzadd source guard: %s)r/  r,  r-  r   r   )rS   r   s     r   r   z$TranslationValidator.add_source_expr   s7    ***		0%(;""1%rD   c                     | j                  |       | j                  |      }|| j                  vrt        j	                  dt        |             | j                  j                  |       y )Nzadd target guard: %s)r@  rD  r0  r,  r-  r   r   rB  s      r   add_target_exprz$TranslationValidator.add_target_expr%  sU    ##A&,,Q/F***		0%-@""6*rD   c                 J   t        |t        j                        r#| j                  |       | j	                  |      }n|}t        |t
        j                        sJ || j                  vrt        j                  dt        |             | j                  j                  |       y )Nzadd assertion: %s)rH   r   r)  r@  rD  r   rI   r1  r,  r-  r   r   )rS   r   refs      r   ro   z"TranslationValidator.add_assertion,  s|    !U[[)''*--a0c2::...$***		-uSz:  %rD   c                 d    t        d      5  | j                         cd d d        S # 1 sw Y   y xY w)NzTranslationValidator.validate)r	   	_validater2  s    r   validatezTranslationValidator.validate7  s*    => (~~'( ( (s   &/c                    t        | j                        dk(  st        | j                        dk(  ry t        j                  d      }|j                  t                      | j                  D ]  }|j                  |        |j                  t        j                  t        j                  | j                                 |j                  | j                    t        j                  d       |j                         }|t        j                  k(  r]|j                         }t!        || j                  | j                  | j                  D cg c]  }|j#                  |      r| c}      |t        j$                  k(  rt        j'                  d       y |t        j(                  k(  sJ t        j                  d       y c c}w )Nr   QF_NRA)timeoutztranslation validation: start)failed_source_exprsz:translation validation: could not validate: got z3.unknownztranslation validation: success)r   r/  r0  r   	SolverForr.  translation_validation_timeoutr1  r   r   r   r,  r-  checksatmodelValidationExceptionevaluateunknownwarningunsat)rS   solver	assertionrrU  inps         r   rK  zTranslationValidator._validate;  sd   4%%&!+s43E3E/F!/K  \\(+FJJ=?J@ "-- &	

9%&
 JJrvvbffd&8&89:;FJJ**+II56ABFF{ )$$&&'+'9'9) #PSAT)	  

? KKT
 =(=II?@)s   G#G)r   N)r   zsympy.logic.boolalg.Booleanr   N)r   r   r   r   r   r>  r   r)   r   r   r;  r)  r@  rI   rD  r   rG  r   ro   rL  rK  r   rD   r   r]   r]     s    	6*	( 	( 	(
	%,, 	d 	rzz 	0	 	 		 	

 		&RZZ 	&D 	&
	+		&5U[[)@#A 		&d 		&	(6	ArD   T)	r   r   r   r   r]   translation_validation_enabledrR  rV  BisectValidationExceptionF)r_  rR  rV  r`  )_configc                  F    t                t        xr t        j                  S r   )_assert_z3_installed_if_tv_set_HAS_Z3configtranslation_validationr   rD   r   r_  r_    s     #$4v444rD   c                  "    t         j                  S r   )re  rR  r   rD   r   rR  rR    s    000rD   c                  @    t         st        j                  rJ d       y y )Nzotranslation validation requires Z3 package. Please, either install z3-solver or disable translation validation.)rd  re  rf  r   rD   r   rc  rc    s$    &77 	7777rD   c                       e Zd Zd Zd Zy)rV  c                 f   t         sJ 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|
 | _        y )	Nr   c                     |  d|     S )N: r   )symrU  s    r   	symbolstrz/ValidationException.__init__.<locals>.symbolstr  s    U"U3ZL))rD   c                 2    dj                  d | D              S )N
c              3   &   K   | ]	  }d |   yw)z  ==> Nr   )rJ   r   s     r   rK   zBValidationException.__init__.<locals>.joinlines.<locals>.<genexpr>  s     6avaS\6s   )r<   )xss    r   	joinlinesz/ValidationException.__init__.<locals>.joinlines  s    9962666rD   ztranslation validation failed.zModel:
z

Assertions:
z

Target Expressions:
z

Failed Source Expressions:
)rd  r+   sortedmapr   msgdetails)rS   rU  
assertionstarget_exprsrP  rn  rs  	model_strassertions_strtarget_exprs_strfailed_source_exprs_strs    `         r   r   zValidationException.__init__  s    w	*c 	*	7S 	7 fSE%:;<	"6#eZ*@#AB$VC|,D%EF"+F3u>Q3R,S"T3
         rD   c                 8    | j                    d| j                   S N

rv  rw  r2  s    r   __str__zValidationException.__str__      ((4~..rD   Nr   r   r   r   r  r   rD   r   rV  rV    s    8/rD   rV  c                       e Zd Zd Zd Zy)r`  c                 h    d| d| | _         d|j                          d|j                   | _        y )Nz#translation validation failed when rl  z)Failure occurred while running node:
    r  )rv  format_noderw  )rS   validation_excr%  failed_actiontraced_nodes        r   r   z"BisectValidationException.__init__  sD    8r$P   	rD   c                 8    | j                    d| j                   S r  r  r2  s    r   r  z!BisectValidationException.__str__  r  rD   Nr  r   rD   r   r`  r`    s    /rD   r`  c                 R   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} | | j!                               }|st"        j%                  d       y | j&                  rt(        j*                  r|i }| j,                  j.                  D cg c]"  }|j0                  t        j2                  k(  s!|$ }	}ddt5        |	      dz
  }}}
 ||	|         ||<   |
|k  rH|
|z   dz  }|	|   }t"        j7                  d| ||              ||      ||<   ||   r|}n|dz   }
|
|k  rH|
|v rt9        ||
   t              sJ |	|
   } ||      }|j;                         rd}n|j=                         s
J d|        d}|j>                  }|J t5        |      dk\  s J d|j@                   dt5        |              t9        |d   tB        jD                        s#J d|j@                   dtG        |d                 tI        ||
   |d   ||jJ                  |         c c}w )Nr   )FakeTensorMetareplay_shape_env_eventsShapeEnvEvent)CURRENT_NODE_KEYShapeEnvSHAPEENV_EVENT_KEYnoder   c                 H    | j                   v sJ | j                         S r   )meta)r  r  eventss    r   get_node_eventzbisect.<locals>.get_node_event  s*    !TYY...dii 2344rD   	shape_envc           	      >    t        |t              r|S t        |t        j                        r.t        j                  |j                  j                               S t        |t        j                        r.t        j                  |j                  j                               S t        |      sJ  t         fd|j                         D              t         fd|j                         D                |j                               |j                        S )Nc              3   0   K   | ]  } |        y wr   r   rJ   r?  new_with_shape_envr  s     r   rK   z5bisect.<locals>.new_with_shape_env.<locals>.<genexpr>  s     Hq$Y2H   c              3   0   K   | ]  } |        y wr   r   r  s     r   rK   z5bisect.<locals>.new_with_shape_env.<locals>.<genexpr>  s     Jq$Y2Jr  )rH   r   r   SymIntr  with_shape_envSymFloatrQ   sizestridestorage_offset	is_nested)r  faker  r  s   ` r   r  z"bisect.<locals>.new_with_shape_env  s    dC KdELL)<<		 8 8 CDDdENN+>>$))":":9"EFF$///HDIIKHHJDKKMJJy$*=*=*?@NN	
 	
rD   tracked_fakesc           	      $   |J 	 | j                  |D cg c]  } | |j                         c}|D cg c]  }|j                   c}|D cg c]  }|j                   c}       y c c}w c c}w c c}w # t        $ r}|cY d }~S d }~ww xY w)N)input_contexts)produce_guardsr  sourcesymbolic_contextrV  )r  r  rO   r   r  s       r   check_shapeenv_failsz$bisect.<locals>.check_shapeenv_fails  s     (((	 $$@MN1#Iqvv6N#01a1<IJq 2 2J % 
 	 O1J # 	H	sD   A: A+A: A0
	A: A5"A: +A: :	BB
B
Bc                     | j                      } d |dz          }|j                  j                           ||   j                        S r{   )r  r   lintr  )r  rr   r  r  r  r  r  s      r   check_node_failsz bisect.<locals>.check_node_fails  sN    -.+F<VaZ,@A	#Ivf~/K/KLLrD   z2translation validation succeeded: no errors found.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%  r  r  )&torch.fx.experimental.recordingr  r  r  %torch.fx.experimental.symbolic_shapesr  r  r  r  r   r   Noder   r   r*   rV  _snapshot_tracked_fakesr,  infoshould_record_eventsre   translation_validation_no_bisectr   nodesr   r   r   r-  rH   is_evaluate_expris_defer_runtime_assertr?   r  r   r)  r   r`  r  )r  r  r  r  r  r  last_exception	exceptionr  assert_nodesleftmidrighteventr  r?   r  r  r  r  r  r  s                   @@@@@@r   bisectr    s    
  F5UXX]] 5} 5
h 
 
 ,4T#Y,?	%	&&Muxx}} M:M1N M M *9446N  	EF))V-T-T  I
 #..$++2NL  !S.2u#D'U(;<Ie
,e|!C 		'nT.BC *$/	#S>E7D , 9IdO=P!QQQD4 E$,,.Q2I%0QQ./::Dt9> 
UZZL )D	{	> d1gu{{+ 
UZZL )T!W	 +
 $$!W#II./	 cs   "J$<J$)8r   rX   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   rZ   r\   r   Interpreterr   r   r]   rd  __all__ImportErrortorch.fx.experimentalra  re  r   r_  r   rR  rc  rV  r`  r  r   rD   r   <module>r     s_        ! 1 1    ) ) 2 , * 2 g!s	HP& P& P&j$ _4 _4 _4R?J ?J&< ?J ?JT4EHH00 4DVE VELRA RA~ G
G 45 51 1/. /B
/ 4 
/   LQ  GGs   )A%D
 
DD