
    ia                        S SK r S SKrS SKrS SKrS SKrS SKJrJrJrJ	r	  S SK
Jr  S SKrS SKrS SKJr  S SKJrJr  S SKJr  S SKJr  S SK
JrJrJrJrJr  S SKJrJrJr   S S	K!J"r"  S S
K#J$r$  S SK%J&r&  S SK'J(r(J)r)  S SK*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3  S SK4J5r5  S SK6J7r7  S SK8J9r9J:r:  S SK;J<r<  S SK=J>r>  S SK?J@r@  S SKAJBrB  S SKCJDrD  S SKEJFrF  S SKGJHrH  S SKIJJrJ  S SKKJLrL  S SKMJNrN  S SKOJPrP  S SKQJRrR  S SKSJTrT  S SKUJVrV  S SKWJXrX  S S KYJZrZJ[r[  S S!K\J]r]J^r^J_r_  S S"K`Jara  S S#KJbrb  S S$KcJdrd  S S%KeJfrf  S S&KgJhrh  S S'KiJjrjJkrkJlrl  S S(KmJnrnJoro  S S)KpJqrq  S S*KrJsrsJtrt  S S+KuJvrv  S S,KwJxry  S S-KzJ{r{J|r|  S S.K}J~r~  S/\R                  R                  4S0 jr\t" S1S25      r\GR                  S35        \GR                  S45        \GR                  S55        \s" \S6S75      S8\GR                  S9\	\GR                  \\GR                     4   4S: j5       r\GR                  S;5        \s" \S<S75      S8\GR                  S=\GR                  S>\GR                  S9\	\GR                  \\GR                     4   4S? j5       r\s" \S@SA5      S8\GR                  S9\GR                  4SB j5       r\GR                  GR                  \GR                   SC35      SD 5       r\GR                  SE5        \s" \SFSA5      SG\GR                  SH\GR                  S9\GR                  4SI j5       rSJ\GR                  SK\dS9\GR                  4SL jrS9\4SM jr " SN SO\GR                   5      r " SP SQ\GR                   5      r " SR SS\GR                   5      rg)T    N)CallableListOptionalTuple)XnnpackPartitioner)!get_symmetric_quantization_configXNNPACKQuantizer)QuantizationConfig)%get_xnnpack_executorch_backend_config)EdgeCompileConfigEdgeProgramManagermemoryto_edgeto_edge_transform_and_lower)bind_pattern_to_opopsr   )EdgeOpOverload)emit_program)get_control_flow_submodules)
ExportPass
PassResult)	convert_constant_dim_order_passdead_code_elimination_pass	DebugPassHintBasedSymShapeEvalPassMemoryPlanningPasspropagate_dynamic_shapeRemoveNoopPassReplaceSymSizeOpPassToOutVarPass)constant_prop_pass)CSEPass)DebugHandleGeneratorPassgenerate_missing_debug_handles)"insert_write_back_for_buffers_pass)DimOrderOpsRevertPass)NormalizeViewCopyBasePass)RemoveGraphAssertsPass)RemoveMixedTypeOperators)EdgeToBackendOpsPass)ReplaceViewCopyWithViewPass)ScalarToTensorPass)SpecPropPass)SymToTensorPass)lift_constant_tensor_pass)TensorShapeDynamism)eval_upper_bound)
TensorSpec!register_additional_test_aten_ops)FTCondDeadCode
FTMapBasic)FeedForwardBlockMLPMul)control_flow)nn)ELEMENTWISE_TYPE_PROMOTION_KIND)FakeTensorMode)export)	InputKind	InputSpecTensorArgument)GraphModulesubgraph_rewriter)make_fx)implLibrary)	FileCheck)_pytree)convert_pt2eprepare_pt2e)QuantizationSpecgmc                 4   [        5       nU R                  5        Hy  n[        U[        R                  R
                  5      (       d  M.  UR                  R                   H1  nUR                  S:X  d  M  UR                  " UR                  5        M3     M{     U$ )zP
Collect all targets for call_function nodes from the graph module recursively.
call_function)setmodules
isinstancetorchfxrB   graphnodesopaddtarget)rL   r   subgmnodes       `/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/executorch/exir/tests/test_passes.pycollect_opsr\   i   sl     %C%!5!566KK%%Dww/)$ &  J    DO_NOT_USE_TEST_ONLYDEFz$foo(Tensor self) -> (Tensor, Tensor)z-add_relu(Tensor self, Tensor other) -> Tensorzunbacked(Tensor self) -> TensorfooCompositeExplicitAutogradareturnc                     U S-   S 4$ N    rb   s    r[   r`   r`   ~   s    q5$;r]   zUfoo.out(Tensor self, *, Tensor(a!) out1, Tensor(b!) out2) -> (Tensor(a!), Tensor(b!))zfoo.outout1out2c                     U S-   S 4$ re   rg   )rb   ri   rj   s      r[   foo_outrl      s     q5$;r]   unbackedCPUc                     U S U S    $ Nr   rg   rh   s    r[   rm   rm      s    Vqt9r]   z
::unbackedc                     [         R                  R                  5       nUR                  5       nU R	                  U5      $ N)rR   _custom_opsget_ctxcreate_unbacked_symint	new_empty)xctxout_sizes      r[   meta_unbackedrz      s3    



#
#
%C))+H;;x  r]   z:unbacked.out(Tensor self, *, Tensor(a!) out) -> Tensor(a!)zunbacked.outrw   outc                 0    UR                  U S U S    5      $ rp   )copy_)rw   r{   s     r[   unbacked_outr~      s    
 99Qv1Yr]   dtypepromotion_kindc                     U[         R                  :X  a  U $ U[         R                  :X  a#  U R                  (       a  U $ [        R
                  $ [        SU 35      e)NzUnsupported promotion kind )r<   DEFAULTINT_TO_FLOATis_floating_pointrR   float	Exception)r   r   s     r[   simple_promote_dtyper      sR     8@@@8EEE//u@U[[@5n5EFGGr]   c                    SnUR                   R                   Hh  nUR                  S:X  d  M  UR                  U:X  d  M'  US-  nUR                   H,  nU R                  UR                  S   R                  U5        M.     Mj     U$ )Nr   rN   rf   val)rT   rU   rV   rX   argsassertEqualmetar   )selfmodulerX   	arg_dtypecountrZ   args          r[   6count_nodes_with_target_asserting_arguments_have_dtyper      sp     E""77o%$++*?QJEyy  %!6!6	B ! #
 Lr]   c                      \ rS rSr\SBS j5       rSBS jrSBS jrSBS jrSBS jr	SBS jr
SBS	 jrSBS
 jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jr \!RD                  SBS j5       r#SBS  jr$  SBS! jr%SBS" jr&SBS# jr'SBS$ jr(SBS% jr)SBS& jr*SBS' jr+SBS( jr,SBS) jr-SBS* jr.SBS+ jr/SBS, jr0SBS- jr1SBS. jr2SBS/ jr3SBS0 jr4SBS1 jr5SBS2 jr6SBS3 jr7SBS4 jr8SBS5 jr9SBS6 jr:SBS7 jr;SBS8 jr<SBS9 jr=SBS: jr>SBS; jr?SBS< jr@ " S= S>\AR                  R                  5      rDS? rES@ rFSArGg)C
TestPasses   Nc                     [        5         g rr   r3   )clss    r[   
setUpClassTestPasses.setUpClass   s    )+r]   c                 J   S[         [        R                  [        R                  /[        R                  4   4S jnU" S 5      nU" S 5      nU" S 5      nU" [        R                  5      nU" [        R                  5      nU" S 5      nU" S 5      nU" S 5      n	U[
        R                  R                  R                  R                  S	[        R                  4U[
        R                  R                  R                  R                  S	[        R                  4U[
        R                  R                  R                  R                  S
[        R                  4U[
        R                  R                  R                  R                  S
[        R                  4U[
        R                  R                  R                  R                  S
[        R                  4U[
        R                  R                  R                  R                  S
[        R                  4U[
        R                  R                  R                  R                  S
[        R                  4U	[
        R                  R                  R                  R                  S
[        R                  44 GH  u  pp[        R                   [        R"                  [        R$                  4 H  n[        R&                  " / SQ/[        R                   S9n[        R&                  " / SQ/US9n[)        [+        U
" 5       UU4SS95      nUR-                  [/        5       /5      nUR1                  5       R2                  nU R5                  U5        [7        X5      n[9        U UUU5      nU R;                  UU5        M     GM	     g )Nfwdc                 T   ^   " U 4S jS[         R                  R                  5      nU$ )Nc                   n   > \ rS rSrS\R
                  S\R
                  S\R
                  4U 4S jjrSrg)PTestPasses.test_remove_mixed_type_operators.<locals>.make_module.<locals>.Module   rw   yrc   c                    > T" X5      $ rr   rg   )r   rw   r   r   s      r[   forwardXTestPasses.test_remove_mixed_type_operators.<locals>.make_module.<locals>.Module.forward   s    q9$r]   rg   N__name__
__module____qualname____firstlineno__rR   Tensorr   __static_attributes__)r   s   r[   Moduler      s.    %U\\ %ell %u|| % %r]   r   )rR   r;   r   )r   r   s   ` r[   make_module@TestPasses.test_remove_mixed_type_operators.<locals>.make_module   s    % % Mr]   c                     X-   U -   $ rr   rg   rw   r   s     r[   <lambda>=TestPasses.test_remove_mixed_type_operators.<locals>.<lambda>   
    {r]   c                     X-
  U -
  $ rr   rg   r   s     r[   r   r      r   r]   c                 
    X-  $ rr   rg   r   s     r[   r   r      s    r]   c                 ,    [         R                  " XS S9$ )Nrounding_moderR   divr   s     r[   r   r      s    599QQU3Vr]   c                 ,    [         R                  " XSS9$ )Ntruncr   r   r   s     r[   r   r          1w?r]   c                 ,    [         R                  " XSS9$ )Nfloorr   r   r   s     r[   r   r      r   r]      rf   )rf   r      r         ?g       @      @Tstrict)r   rR   r   minimumr   exir_opsedgeatenrW   r<   r   submuldefaultr   Tensor_modeint64r   doubletensorr   r>   	transformr)   exported_programgraph_moduleassertIsNotNoner   r   r   )r   r   AddSubMultMinimumDivWithoutModeDivWithNoneModeDivWithTruncModeDivWithFloorModer   rV   expected_countr   second_arg_dtype
int_tensorfloat_tensor	edge_prognew_prognew_graph_modulepromoted_typer   s                         r[    test_remove_mixed_type_operators+TestPasses.test_remove_mixed_type_operators   s   	Xu||U\\&BELL&PQ 	 2323-.emm,$UYY/%&VW&?
 '?
 ""&&--/77	 ""&&--/77	 ""&&--/77	 ""**22/77	 ""&&--/<<	  ""&&22/<<	 !""&&22/77	 !""&&22/77	W1;
6Fd &+[[%++u||$L "\\9+U[[I
$||_,=EUV#68j,%?M	 %..0H0J/KL#+#<#<#>#K#K $$%56 45E VN*B   7 %Me1;
r]   c           
      l    " S S[         R                  R                  5      nU" 5       n[        [	        U[         R
                  " S[         R                  S94SS95      nUR                  [        5       /5      nU R                  UR                  5       R                  5        UR                  5       R                  nUR                  R                   H]  nUR                  S:X  d  M  U R                  UR                   [         R"                  R$                  R&                  R(                  5        M_     g )Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)-TestPasses.test_remove_noop_pass.<locals>.Fooi  rw   rc   c                 <    UR                  [        R                  S9$ Nr   torR   float32r   rw   s     r[   r   5TestPasses.test_remove_noop_pass.<locals>.Foo.forward  s    tt%--t00r]   rg   Nr   rg   r]   r[   Foor     s    1 1%,, 1r]   r   rf   r   Tr   rN   )rR   r;   r   r   r>   onesr   r   r   r   r   r   rT   rU   rV   assertNotEqualrX   r   r   r   r   )r   r   r`   r   r   rZ   s         r[   test_remove_noop_pass TestPasses.test_remove_noop_pass  s    	1%((// 	1 e 3AU]];=dK
	 '')9(:;	Y779FFG$557DD$**00Dww/)##DKK1B1B1H1HI 1r]   c                     " S S[         R                  R                  5      nU" 5       n " S S[         R                  R                  5      nU" 5       n " S S[         R                  R                  5      nU" 5       n[         R                  " S5      n[	        [        X'4SS	95      nUR                  [        5       /5      nUR                  5       R                  n	[        5       R                  S
SSS9R                  U	R                  5        [	        [        XG4SS	95      nUR                  [        5       /5      nUR                  5       R                  n	[        5       R                  S
SSS9R                  U	R                  5        [	        [        Xg4SS	95      nUR                  [        5       /5      nUR                  5       R                  n	[        5       R                  S
SSS9R                  U	R                  5        g )Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)DTestPasses.test_redundant_slice_copy_removal.<locals>.FooWithNoSlicei-  rw   rc   c                     US S 2S S 2S S 24   $ rr   rg   r   s     r[   r   LTestPasses.test_redundant_slice_copy_removal.<locals>.FooWithNoSlice.forward.  s    Aqz!r]   rg   Nr   rg   r]   r[   FooWithNoSlicer   -  s    " "%,, "r]   r   c                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)ETestPasses.test_redundant_slice_copy_removal.<locals>.FooWithOneSlicei3  rw   rc   c                     US S2S S 2S S 24   $ re   rg   r   s     r[   r   MTestPasses.test_redundant_slice_copy_removal.<locals>.FooWithOneSlice.forward4  s    !Q{"r]   rg   Nr   rg   r]   r[   FooWithOneSlicer   3  s    # #%,, #r]   r  c                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)FTestPasses.test_redundant_slice_copy_removal.<locals>.FooWithAllSlicesi9  rw   rc   c                     US S2S S2SS24   $ )Nrf   r      rg   r   s     r[   r   NTestPasses.test_redundant_slice_copy_removal.<locals>.FooWithAllSlices.forward:  s    !RaR1~%r]   rg   Nr   rg   r]   r[   FooWithAllSlicesr  9  s    & &%,, &r]   r  )r      r  Tr   9executorch_exir_dialects_edge__ops_aten_slice_copy_Tensorr   exactlyrf   r   )rR   r;   r   r   r   r>   r   r   r   r   rG   check_countruncode)
r   r   foo_with_no_slicer  foo_with_one_slicer  foo_with_all_slicesrw   progr   s
             r[   !test_redundant_slice_copy_removal,TestPasses.test_redundant_slice_copy_removal,  s   	"UXX__ 	" +,	#ehhoo 	# -.	&uxx 	& /0 JJy!v/dCD~~~/01002??GTX 	  	

###
$v0$tDE~~~/01002??GTX 	  	

###
$v14EF~~~/01002??GTX 	  	

###
$r]   c                      " S S[         R                  R                  5      nU" 5       n[         R                  " SS5      4n[	        [        X#SS95      R                  5       R                    g )Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg),TestPasses.test_compile_to_edge.<locals>.FooiW  rw   rc   c                     US-  $ Nr   rg   r   s     r[   r   4TestPasses.test_compile_to_edge.<locals>.Foo.forwardX      1ur]   rg   Nr   rg   r]   r[   r   r  W       %,, r]   r   r   r   Tr   )rR   r;   r   randnr   r>   r   r   )r   r   frw   s       r[   test_compile_to_edgeTestPasses.test_compile_to_edgeV  sP    	%((// 	 E[[A qD)*;;=JJr]   c                 B    " S S[         R                  R                  5      n[         R                  " SS/5      n[         R                  " SS/5      n[         R                  " SS/5      nX#U4nU" S5      n[	        [        XeSS9[        R                  " SS	9S
9nUR                  [        5       /5      n[        5       " UR                  5       R                  5      n	U R                  U	5        U	R                  n
U
R                  R                   GH  nUR                   S:X  d  M  UR"                  [         R$                  R&                  R(                  R*                  [         R$                  R,                  R.                  R*                  4;   d  M  U R1                  [3        UR4                  5      S5        UR4                  S   nU R1                  UR                   S5        U R7                  UR"                  [8        R:                  5        U R7                  UR4                  S   S 5        GM     [=        5       " U
5      n	U R                  U	5        U	R                  n
U
R                  UR                  5       R                  l        [?        UR                  5       5        g )Nc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )BTestPasses.test_to_out_variant_none_output.<locals>.CompositeModelid  c                 v   > [         TU ]  5         Xl        [        R                  R                  SSSS9U l        g )N    rf   
input_sizehidden_size
num_layers)super__init__weightrR   r;   LSTMlstm)r   _weight	__class__s     r[   r+  KTestPasses.test_to_out_variant_none_output.<locals>.CompositeModel.__init__e  s5     "%!HHMM! "  * 	r]   c                 6    U R                  XU45      u  nu  pVU$ rr   r.  )r   x_rawhcoutputhncns          r[   r   JTestPasses.test_to_out_variant_none_output.<locals>.CompositeModel.forwardn  s     #'99UF#; r]   )r.  r,  r   r   r   r   r+  r   r   __classcell__r0  s   @r[   CompositeModelr#  d  s     r]   r>  rf   r%  r   Tr   F_check_ir_validitycompile_configrN   r   ri   rj   ) rR   r;   r   r   r   r>   exirr   r   r-   r    r   r   r   rT   rU   rV   rX   r   r^   r`   r{   my_awesome_3rdparty_ns
awesome_opr   lenkwargsassertIsr   allocr   r   )r   r>  input_xinput_hinput_cinputscomposite_mr   r   
new_gm_resnew_gmrZ   	out1_nodes                r[   test_to_out_variant_none_output*TestPasses.test_to_out_variant_none_outputc  s   	UXX__ 	 **aW%**aW%**aW%G,$Q';t411UK
	 &&'78!^H$=$=$?$L$LM
Z(((LL&&Dww/)dkk		..2266		00;;??> /   T[[!115 KK/	  ?i..=dkk&148 ' ()&1
Z(((9?!!#006X..01r]   c                 r    " S S[         R                  5      nU" 5       nUR                  5       n[        [	        X#SS9[        SS9S9n[        5       " UR                  5       R                  5      nU R                  U5        UR                  nUR                  R                   H@  nUR                  [        R                  R                  R                   R"                  L d  M@    O   WR$                  S   nU R'                  [)        U[*        [,        45      5        U R/                  S	[1        U5      5        g )
Nc                   4   ^  \ rS rSrU 4S jrS rS rSrU =r$ )DTestPasses.test_to_out_variant_singleon_tensor_list.<locals>.MyModeli  c                 "   > [         TU ]  5         g rr   r*  r+  r   r0  s    r[   r+  MTestPasses.test_to_out_variant_singleon_tensor_list.<locals>.MyModel.__init__       "r]   c                 0    [         R                  " US5      $ N
   )rR   splitr   s     r[   r   LTestPasses.test_to_out_variant_singleon_tensor_list.<locals>.MyModel.forward  s    {{1b))r]   c                 0    [         R                  " S5      4$ r]  rR   r  r   s    r[   get_random_inputsVTestPasses.test_to_out_variant_singleon_tensor_list.<locals>.MyModel.get_random_inputs      B))r]   rg   	r   r   r   r   r+  r   rd  r   r<  r=  s   @r[   MyModelrV    s    #** *r]   rh  Tr   Fr?  rA  r   rf   )r;   r   rd  r   r>   r   r    r   r   r   rT   rU   rX   r   r   r   
split_copy
Tensor_outr   
assertTruerQ   tuplelistr   rF  	r   rh  modelrM  r  rO  rP  ndr   s	            r[   (test_to_out_variant_singleon_tensor_list3TestPasses.test_to_out_variant_singleon_tensor_list  s    	*bii 	* 	((*5.,F
 "^D$9$9$;$H$HI
Z(((,,$$ByyHMM..99DDD % ggen 	
367CH%r]   c                 r    " S S[         R                  5      nU" 5       nUR                  5       n[        [	        X#SS9[        SS9S9n[        5       " UR                  5       R                  5      nU R                  U5        UR                  nUR                  R                   H@  nUR                  [        R                  R                  R                   R"                  L d  M@    O   WR$                  S   nU R'                  [)        U[*        [,        45      5        U R/                  S	[1        U5      5        g )
Nc                   4   ^  \ rS rSrU 4S jrS rS rSrU =r$ )<TestPasses.test_to_out_variant_multiple_out.<locals>.MyModeli  c                 "   > [         TU ]  5         g rr   rX  rY  s    r[   r+  ETestPasses.test_to_out_variant_multiple_out.<locals>.MyModel.__init__  r[  r]   c                 0    [         R                  " US5      $ )N   )rR   topkr   s     r[   r   DTestPasses.test_to_out_variant_multiple_out.<locals>.MyModel.forward  s    zz!Q''r]   c                 0    [         R                  " S5      4$ r]  rb  rc  s    r[   rd  NTestPasses.test_to_out_variant_multiple_out.<locals>.MyModel.get_random_inputs  rf  r]   rg   rg  r=  s   @r[   rh  ru    s    #(* *r]   rh  Tr   Fr?  rA  r   r   )r;   r   rd  r   r>   r   r    r   r   r   rT   rU   rX   rR   r   r   rz  valuesr   rk  rQ   rl  rm  r   rF  rn  s	            r[    test_to_out_variant_multiple_out+TestPasses.test_to_out_variant_multiple_out  s    	*bii 	* 	((*5.,F
 "^D$9$9$;$H$HI
Z(((,,$$ByyEIINN//666 % ggen 	
367CH%r]   c                 h    " S S[         R                  R                  5      nU" 5       n[         R                  " S[         R                  S9nU" U5      n[        [        X#4SS95      nUR                  5       R                  5       " U5      nU R                  [         R                  " XF5      5        g )Nc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )6TestPasses.test_to_out_variant_to_copy.<locals>.Modulei  c                 "   > [         TU ]  5         g rr   rX  rY  s    r[   r+  ?TestPasses.test_to_out_variant_to_copy.<locals>.Module.__init__  r[  r]   c                 @    UR                  [        R                  5      $ rr   )r   rR   int32r   s     r[   r   >TestPasses.test_to_out_variant_to_copy.<locals>.Module.forward  s    ttEKK((r]   rg   r;  r=  s   @r[   r   r    s    #) )r]   r   r   r   Tr   )rR   r;   r   r   r   r   r>   r   r   rk  allclose)r   r   ro  rM  	model_resedge_dialectedge_ress          r[   test_to_out_variant_to_copy&TestPasses.test_to_out_variant_to_copy  s    	)UXX__ 	) c5&M	veYtDE00299;FCy;<r]   c           	      f    " S S[         R                  R                  5      nU" 5       n " S S[        5      n[	        [        U[         R                  " SS5      4SS9[        S	S
9S9nUR                  U" 5       /5      nUR                  5       R                  R                  R                  nU HK  nUR                  S:w  a  M  U R                  [        US5      5        U R!                  UR"                  5        MM     UR                  5       R                  R                  R                  nU R%                  ['        U5      ['        U5      5        [)        Xh5       HQ  u  pU R%                  U	R                  U
R                  5        U R%                  U	R*                  U
R*                  5        MS     g )Nc                   T    \ rS rSrS\R
                  S\\R
                     4S jrSrg)(TestPasses.test_export_pass.<locals>.Fooi  rw   rc   c                     [         R                  " X/5      n[         R                  R                  R                  R                  US5      $ r  rR   catr   r   tensor_splitsectionsr   rw   r   s      r[   r   0TestPasses.test_export_pass.<locals>.Foo.forward  3    IIqf%yy~~22;;AqAAr]   rg   N	r   r   r   r   rR   r   r   r   r   rg   r]   r[   r   r    %    B B$u||2D Br]   r   c                       \ rS rSrSrg)-TestPasses.test_export_pass.<locals>.NullPassi  rg   Nr   r   r   r   r   rg   r]   r[   NullPassr        r]   r  r   r   Tr   Fr?  rA  rN   stack_trace)rR   r;   r   r   r   r>   r   r   r   r   r   rT   rU   rV   rk  hasattrr   r  r   rF  ziprX   r   r   r  r  r  r   	new_nodesrZ   	old_nodesnew_nodeold_nodes              r[   test_export_passTestPasses.test_export_pass  sK   	B%((// 	B
 E	z 	 1uzz!Q')$7,F
 >>8:,/--/<<BBHH	Dww/)OOGD-89  !1!12	  ))+88>>DD	YY8"%i";HX[[(++6X__hoo> #<r]   c           	      |    " S S[         R                  R                  5      nU" 5       n " S S[        5      n[	        [        U[         R                  " SS5      4SS9[        R                  " S	S
9S9nUR                  U" 5       /5      nUR                  5       R                  R                  R                  nU HK  nUR                  S:w  a  M  U R                  [!        US5      5        U R#                  UR$                  5        MM     UR                  5       R                  R                  R                  nU R'                  [)        U5      [)        U5      5        [+        Xh5       HQ  u  pU R'                  U	R                  U
R                  5        U R'                  U	R,                  U
R,                  5        MS     g )Nc                   T    \ rS rSrS\R
                  S\\R
                     4S jrSrg),TestPasses.test_export_pass_pt2.<locals>.Fooi  rw   rc   c                     [         R                  " X/5      n[         R                  R                  R                  R                  US5      $ r  r  r  s      r[   r   4TestPasses.test_export_pass_pt2.<locals>.Foo.forward  r  r]   rg   Nr  rg   r]   r[   r   r    r  r]   r   c                       \ rS rSrSrg)1TestPasses.test_export_pass_pt2.<locals>.NullPassi  rg   Nr  rg   r]   r[   r  r    r  r]   r  r   r   Tr   Fr?  rA  rN   r  )rR   r;   r   r   r   r>   r   rC  r   r   r   r   rT   rU   rV   rk  r  r   r  r   rF  r  rX   r  s              r[   test_export_pass_pt2TestPasses.test_export_pass_pt2  sQ   	B%((// 	B
 E	z 	 1uzz!Q')$711UK
 >>8:,/--/<<BBHH	Dww/)OOGD-89  !1!12	  ))+88>>DD	YY8"%i";HX[[(++6X__hoo> #<r]   c                 @   [         R                  R                  5       n[         R                  " S5      n[	        5        nUR                  U5      nUR                  S5      nXER                  S'   S S S 5        UR                  [         R                  R                  R                  R                  WS4S9nUR                  U5        [         R                  R                  [         R                  R!                  5       U5      nU" U5      n[#        5       " U5      n	U	R$                  n
U R'                  U	R(                  5        U R+                  [#        5       " U
5      R(                  5        U
R,                  R.                   H[  nUR0                  S:X  d  M  UR2                   H6  nU R'                  [5        U[         R                  R6                  5      5        M8     M]     U
" U5      nU R'                  [         R8                  " X5      5        g ! , (       d  f       GN= f)Nrf   rw   r   gQ	@)r   rN   )rR   rS   Graphr  r=   from_tensorplaceholderr   rN   r   r   r   r   r7  rB   r;   r   r,   r   rk  modifiedassertFalserT   rU   rV   r   rQ   Nodeequal)r   rT   
test_input	fake_mode
fake_inputrw   mul_noderL   original_outputresultrP  rZ   r   
new_outputs                 r[   !test_export_scalar_to_tensor_pass,TestPasses.test_export_scalar_to_tensor_pass!  s    [[

 "..z:J!!#&A&FF5M  &&IINN%%T ' 
 	XXX!!%((//"3U;Z.#%b)$$(+-f5>>? LL&&Dww/)99COOJsEHHMM$BC % '
 J'
O@A9 s   1H
Hc                 $    " S S[         R                  R                  5      nU" 5       n[         R                  " SSSS5      4n[	        [        X#SS95      nUR                  [        5       [        5       [        5       /5      nU R                  UR                  5       R                  5        U R                  [         R                  " UR                  5       R                  5       " U6 UR                  5       R                  5       " U6 5      5        g )	Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)9TestPasses.test_remove_mixed_types_symfloats.<locals>.FooiF  rw   rc   c                     [         R                  R                  R                  UUR                  S   S-  UR                  S   S-  4SSSS9$ )Nr   r   bilinearF)sizemodealign_corners	antialias)rR   r;   
functionalinterpolateshaper   s     r[   r   ATestPasses.test_remove_mixed_types_symfloats.<locals>.Foo.forwardG  sP    xx**66''!*q.!''!*q.9#"'# 7  r]   rg   Nr   rg   r]   r[   r   r  F  s     %,, r]   r   r   r   r  ry  Tr   )rR   r;   r   r  r   r>   r   r   r,   r)   r   r   r   rk  r  r   )r   r   r  example_inputsrL   rP  s         r[   !test_remove_mixed_types_symfloats,TestPasses.test_remove_mixed_types_symfloatsE  s    	%((// 	 E++aAq13VAd;<!#%7%9;S;UV
 	V446CCDNN##%,,.?'')002NC	
r]   c           	      D    " S S[         R                  R                  5      nU" 5       n[        [	        U[         R
                  " SS5      4SS95      R                  5       R                  n[        5       " U5      nU R                  U5        UR                  R                  R                  nSnU HY  nUR                  S:w  a  M  US	-  nU R                  UR                  S
   S   UR                  S   S   R                  S
   5        M[     U R!                  US	5        g )Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)+TestPasses.test_spec_prop_pass.<locals>.Fooib  rw   rc   c                 
    X-   $ rr   rg   r   s     r[   r   3TestPasses.test_spec_prop_pass.<locals>.Foo.forwardc  	    ur]   rg   Nr   rg   r]   r[   r   r  b  r  r]   r   r   r   Tr   r   r7  rf   specrR   r;   r   r   r>   r   r   r   r-   r   rT   rU   rV   rH  r   r   r   r   r   r  rL   rP  r  counterrZ   s           r[   test_spec_prop_passTestPasses.test_spec_prop_passa  s    	%((// 	 E F1uzz!Q/1$?@\ 	
 #V$''--33	Dww("qLGMM$))F+A.		!Q0D0DV0LM	  	!$r]   c           	      D    " S S[         R                  R                  5      nU" 5       n[        [	        U[         R
                  " SS5      4SS95      R                  5       R                  n[        5       " U5      nU R                  U5        UR                  R                  R                  nSnU HY  nUR                  S:w  a  M  US	-  nU R                  UR                  S
   S   UR                  S   S   R                  S
   5        M[     U R!                  US	5        g )Nc                   T    \ rS rSrS\R
                  S\\R
                     4S jrSrg)8TestPasses.test_spec_prop_pass_tuple_output.<locals>.Fooiz  rw   rc   c                     X-   4$ rr   rg   r   s     r[   r   @TestPasses.test_spec_prop_pass_tuple_output.<locals>.Foo.forward{  s    xr]   rg   N	r   r   r   r   rR   r   r   r   r   rg   r]   r[   r   r  z  s"       %2E  r]   r   r   r   Tr   r   r7  rf   r  r  r  s           r[    test_spec_prop_pass_tuple_output+TestPasses.test_spec_prop_pass_tuple_outputy  s    	 %((// 	  E F1uzz!Q/1$?@\ 	
 #V$''--33	Dww("qLGMM$))F+A.		!Q0D0DV0LM	  	!$r]   c           	      `    " S S[         R                  R                  5      nU" 5       n[        [	        U[         R
                  " / SQ5      45      5      R                  5       R                  n[        5       " U5      nU R                  U5        [        S UR                  R                  R                   5       5      nU R                  U5        UR                  S   nU R                  [        UR                   5      S5        [#        UR                   S   5      nU R                  US5        g )	Nc                       \ rS rSrS rSrg)@TestPasses.test_spec_prop_pass_unbacked_symint.<locals>.Unbackedi  c                     [         R                  R                  R                  U5      n[         R                  " UR
                  S   SS9  U$ )Nr   r^  max)rR   r   r^   rm   _constrain_as_sizer  )r   rw   r7  s      r[   r   HTestPasses.test_spec_prop_pass_unbacked_symint.<locals>.Unbacked.forward  s9    77@@C((abAr]   rg   Nr   r   r   r   r   r   rg   r]   r[   Unbackedr    s    r]   r  )ry  r  r   r   rf   r   rf   r   c              3      #    U  HE  nUR                   [        R                  R                  R                  R
                  :X  d  MA  Uv   MG     g 7frr   )rX   r   r   r^   rm   r   .0ns     r[   	<genexpr>ATestPasses.test_spec_prop_pass_unbacked_symint.<locals>.<genexpr>  s;      
4xx8====FFNNN A4s   A A	Ar  rf   r   r^  )rR   r;   r   r   r>   
LongTensorr   r   r-   r   nextrT   rU   r   r   rF  r  r1   )r   r  ro  rL   rP  op_noder  upper_bounds           r[   #test_spec_prop_pass_unbacked_symint.TestPasses.test_spec_prop_pass_unbacked_symint  s    	uxx 	 
F55#3#34L#M"OPQ\ 	
 #V$  
((..44
 

 	W%"<</TZZ!,&tzz!}5b)r]   c                 &    " S S[         R                  R                  5      nU" 5       n[         R                  " S5      4nSS[         R                  R                  SSSS900n[        [	        X#US	95      nUR                  5       R                  n[        5       " U5      nU R                  U5        [        S
 UR                  R                  R                   5       5      nU R                  U5        UR                  S   n	U R                  [!        U	["        5      5        U R%                  ['        U	5      S5        U R%                  ['        U	S   R(                  5      S5        [+        U	S   R(                  S   5      n
U R%                  U
S5        g )Nc                   &    \ rS rSrS rS rS rSrg):TestPasses.test_spec_prop_pass_cond.<locals>.ModelWithCondi  c                     US-  $ r  rg   r   r   s     r[   true_fnBTestPasses.test_spec_prop_pass_cond.<locals>.ModelWithCond.true_fn      Qwr]   c                     US-   $ re   rg   r  s     r[   false_fnCTestPasses.test_spec_prop_pass_cond.<locals>.ModelWithCond.false_fn  r  r]   c                 j    [         R                  " US   S:  U R                  U R                  U/5      $ rp   )rR   condr  r  r   s     r[   r   BTestPasses.test_spec_prop_pass_cond.<locals>.ModelWithCond.forward  s)    zz!A$(DLL$--!MMr]   rg   N)r   r   r   r   r  r  r   r   rg   r]   r[   ModelWithCondr    s    Nr]   r  r^  rw   r   rf      minr  )dynamic_shapesc              3      #    U  HD  n[        UR                  S 5      (       d  M   UR                  R                  5       S:X  d  M@  Uv   MF     g7f)namer  Nr  rX   r  r  s     r[   r  6TestPasses.test_spec_prop_pass_cond.<locals>.<genexpr>  >      
4qxx( -.XX]]_-F A4   AA	Ar  )rR   r;   r   r   r>   Dimr   r   r   r-   r   r  rT   rU   r   rk  rQ   rl  r   rF  r  r1   )r   r  ro  rM  r  edge_programrL   rP  	cond_noder  r  s              r[   test_spec_prop_pass_cond#TestPasses.test_spec_prop_pass_cond  sM   	NEHHOO 	N **R."5<<#3#3CQB#3#GHI veNST**,99#V$  
((..44
 
	
 	Y' #,.."8
4/0TA&T!W]]+Q/&tAw}}Q'78b)r]   c                     " S S[         R                  R                  5      nU" 5       n[         R                  " S/5      4n[	        [        X#5      5      nUR                  5       R                  n[        5       " U5      nU R                  U5        [        S UR                  R                  R                   5       5      nU R                  U5        UR                  S   nU R                  [        U[         5      5        U R#                  [%        U5      S5        U R#                  [%        US   R&                  5      S5        [)        US   R&                  S   5      n	U R#                  U	S	5        g )
Nc                       \ rS rSrS rSrg)<TestPasses.test_spec_prop_pass_while.<locals>.ModelWithWhilei  c                     S nS n[         R                  R                  X#U[         R                  " S5      45      u  pEU$ )Nc                     U S   S:  $ rp   rg   iaccs     r[   	loop_condWTestPasses.test_spec_prop_pass_while.<locals>.ModelWithWhile.forward.<locals>.loop_cond  s    Q4!8Or]   c                     U S-
  X-   4$ re   rg   r"  s     r[   	loop_bodyWTestPasses.test_spec_prop_pass_while.<locals>.ModelWithWhile.forward.<locals>.loop_body  s    q5#'>)r]   r^  )rR   _higher_order_ops
while_loopzeros)r   r#  r%  r(  _r$  s         r[   r   DTestPasses.test_spec_prop_pass_while.<locals>.ModelWithWhile.forward  s?    $* 00;;1ekk"o*> 
r]   rg   Nr  rg   r]   r[   ModelWithWhiler    s    
r]   r/  ry  c              3      #    U  HD  n[        UR                  S 5      (       d  M   UR                  R                  5       S:X  d  M@  Uv   MF     g7f)r  r+  Nr  r  s     r[   r  7TestPasses.test_spec_prop_pass_while.<locals>.<genexpr>  s>      
4qxx( -.XX]]_-L A4r  r  r   rf   r   r^  )rR   r;   r   r   r   r>   r   r   r-   r   r  rT   rU   r   rk  rQ   rl  r   rF  r  r1   )
r   r/  ro  rM  r  rL   rP  
while_noder  r  s
             r[   test_spec_prop_pass_while$TestPasses.test_spec_prop_pass_while  s(   	UXX__ 	  ,,s#% ve45**,99#V$  
((..44
 


 	Z( #-//&"9
4/0TA&T!W]]+Q/&tAw}}Q'78b)r]   c                 8  ^	 SSK Jm	   " U	4S jS[        R                  R                  5      nU" 5       n[        R
                  " S5      R                  5       R                  SS5      4n[        [        X#SS	9[        S
S9S9nUR                  5       R                  n[        5       " U5      nU R                  U5        [        S UR                  R                   R"                   5       5      nU R                  U5        UR$                  S   nU R'                  [)        U[*        5      5        U R-                  [/        U5      S5        U R-                  [1        US   R2                  5      S/5        U R-                  [1        US   R2                  5      SS/5        g )Nr   scanc                   t   > \ rS rSrS\R
                  S\\R
                  \R
                  4   4U 4S jjrSrg):TestPasses.test_spec_prop_pass_scan.<locals>.ModelWithScani  xsrc   c                 N   > S n[         R                  " US   5      nT" X#U5      $ )Nc                 ,    X-   nX"R                  5       4$ rr   clonecarryrw   	new_carrys      r[   
combine_fnVTestPasses.test_spec_prop_pass_scan.<locals>.ModelWithScan.forward.<locals>.combine_fn       %	I$oo&777r]   r   rR   
zeros_liker   r:  rB  initr7  s       r[   r   BTestPasses.test_spec_prop_pass_scan.<locals>.ModelWithScan.forward  +    8 ''1.Jb11r]   rg   Nr  r6  s   r[   ModelWithScanr9    1    2%,, 25u||9S3T 2 2r]   rK     ry  r   Tr   Fr?  rA  c              3      #    U  HD  n[        UR                  S 5      (       d  M   UR                  R                  5       S:X  d  M@  Uv   MF     g7fr  r7  Nr  r  s     r[   r  6TestPasses.test_spec_prop_pass_scan.<locals>.<genexpr>  r  r  r  r   rf   )torch._higher_order_ops.scanr7  rR   r;   r   aranger   reshaper   r>   r   r   r   r-   r   r  rT   rU   r   rk  rQ   rl  r   rF  rm  r  )
r   rK  ro  rM  r  rL   rP  	scan_noder  r7  s
            @r[   test_spec_prop_pass_scan#TestPasses.test_spec_prop_pass_scan  sL   5	2EHHOO 	2 ,,r"((*221a8: 5.,F
 **,99#V$  
((..44
 
	
 	Y' /8nnV.D
4/0TA& 	d1gmm,qc2d1gmm,q!f5r]   c                   ^ SSK Jm   " U4S jS[        R                  R                  5      nU" 5       n[        R
                  " S5      R                  5       R                  SS5      4nSS[        R                  R                  S	S
SS900n[        X#USS9n[        S UR                  R                   5       5      nUR                  R                  S5      nU R                  U5        U R!                  US
   R"                  S   [        R$                  5        ['        U[)        SS9S9nUR+                  5       R,                  n	[/        5       " U	5      n
U R                  U
5        [        S U
R,                  R                  R                   5       5      nU R                  U5        UR                  S   nU R1                  [3        U[4        5      5        U R7                  [9        U5      S5        U R7                  [;        US   R"                  5      S/5        U R7                  US   R<                  [>        R@                  5        U R7                  [9        US
   R"                  5      S5        [C        US
   R"                  S   5      nU R7                  US5        U R7                  US
   R<                  [>        RD                  5        U R7                  US
   R"                  S
   S5        g )Nr   r6  c                   t   > \ rS rSrS\R
                  S\\R
                  \R
                  4   4U 4S jjrSrg)HTestPasses.test_spec_prop_pass_scan_dynamic_shape.<locals>.ModelWithScani+  r:  rc   c                 N   > S n[         R                  " US   5      nT" X#U5      $ )Nc                 ,    X-   nX"R                  5       4$ rr   r=  r?  s      r[   rB  dTestPasses.test_spec_prop_pass_scan_dynamic_shape.<locals>.ModelWithScan.forward.<locals>.combine_fn-  rD  r]   r   rE  rG  s       r[   r   PTestPasses.test_spec_prop_pass_scan_dynamic_shape.<locals>.ModelWithScan.forward,  rJ  r]   rg   Nr  r6  s   r[   rK  rY  +  rL  r]   rK  rM  ry  r   r:  seq_lenrf   r  r  Tr  r   c              3      #    U  HD  n[        UR                  S 5      (       d  M   UR                  R                  5       S:X  d  M@  Uv   MF     g7frO  r  r  s     r[   r  DTestPasses.test_spec_prop_pass_scan_dynamic_shape.<locals>.<genexpr>:  s>      &
)qxx( -.XX]]_-F A)r  r   Fr?  rA  c              3      #    U  HD  n[        UR                  S 5      (       d  M   UR                  R                  5       S:X  d  M@  Uv   MF     g7frO  r  r  s     r[   r  ra  N  r  r  r  r   )#rQ  r7  rR   r;   r   rR  r   rS  r>   r  r  rT   rU   r   getr   assertIsInstancer  SymIntr   r   r   r   r-   rk  rQ   rl  r   rF  rm  shape_dynamismr0   STATICr1   DYNAMIC_BOUND)r   rK  ro  rM  r  exportedscan_node_after_exportval_after_exportr  rL   rP  rT  r  r  r7  s                 @r[   &test_spec_prop_pass_scan_dynamic_shape1TestPasses.test_spec_prop_pass_scan_dynamic_shape(  sm   5	2EHHOO 	2 ,,r"((*221a8:ELL$4$4YA2$4$N OP %tT!% &
^^))&
 "

 266::5A-..q177:ELLI ,F
 **,99#V$  
((..44
 
	
 	Y' /8nnV.D
4/0TA& 	d1gmm,qc2a//1D1K1KL 	T!W]]+Q/&tAw}}Q'78b)a//1D1R1RSaq)1-r]   c                     " S S[         R                  5      nU" SSS9n[        R                  " SSS5      n[	        X#45      n[        U[        R                  " SS	9S
9nUR                  5       R                  nSnUR                  R                   H  nUR                  [        R                  R                  R                  R                   :X  d>  UR                  [        R                  R                  R"                  R$                  :X  d  M}  US-  nM     U R'                  US5        U R)                  [        R*                  " UR                  5       R-                  5       " U5      U" U5      5      5        g )Nc                   4   ^  \ rS rSrU 4S jrS rS rSrU =r$ )>TestPasses.test_compile_fix_broken_ops.<locals>.ExportableLoopif  c                   > [         TU ]  5         Xl        [        R                  " [
        R                  " US5      5      U l        [        R                  " [
        R                  " X!5      5      U l        [
        R                  " SU5      n[        R                  " US   R                  5       5      U l
        [        R                  " US   R                  5       5      U l        g )Nrf   r   r   )r*  r+  r(  r;   	ParameterrR   r  BCr>  A_realA_imag)r   r(  out_channelsAr0  s       r[   r+  GTestPasses.test_compile_fix_broken_ops.<locals>.ExportableLoop.__init__g  s     "#. ekk+q&ABKK: KK;/ ll1Q4::<8 ll1Q4::<8r]   c                     US S 2SS S 24   US S 2SS S 24   pCX0R                   -  X@R                  -  -
  U-   nX@R                   -  X0R                  -  -   n[        R                  " XV/SS9nXu4$ )Nr   rf   )dim)ru  rv  rR   stack)r   r5  x_thrhihrnhinr8  s           r[   update_stateKTestPasses.test_compile_fix_broken_ops.<locals>.ExportableLoop.update_stater  sk    1a7Qq!QwZB;;&kk)99C?;;&kk)99[[#3wr]   c                   ^ ^^^ [         R                  " T R                  U5      mTR                  u  p#m[         R                  " USUTR
                  TR                  S9n[         R                  " X#TTR
                  TR                  S9n[         R                  " STR
                  [         R                  S9n[         R                  " STR
                  [         R                  S9mU4S jnUU U4S jn[         R                  R                  XxXdU45      u  pn[         R                  " T R                  U5      R                  SS5      n
U
$ )Nr   )devicer   r   rf   c                    > U T:  $ rr   rg   )r#  r5  h_accumTs      r[   r  TTestPasses.test_compile_fix_broken_ops.<locals>.ExportableLoop.forward.<locals>.cond  s    q5Lr]   c                    > TR                  SU R                  S5      5      R                  S5      nTR                  X5      u  pUR	                  SU R                  S5      UR                  S5      5      nU T-   nXQU4$ )Nr   )index_select	unsqueezesqueezer  
index_copy)	r#  r5  r  r}  r~  i_nextoner   rw   s	         r[   bodyTTestPasses.test_compile_fix_broken_ops.<locals>.ExportableLoop.forward.<locals>.body  s{    ..Q[[^<DDC !--a5EA%00AKKNBLL,<G WF!g--r]   )rR   matmulrs  r  r,  r  r   r   r   r*  r+  rt  	transpose)r   urs  Hr5  r  r#  r  r  r-  r   r  r  rw   s   `          @@@r[   r   FTestPasses.test_compile_fix_broken_ops.<locals>.ExportableLoop.forwardz  s    LL+''aKK1aH++!AHHAGG LL1885;;Gll1QXXU[[I!	. !& 7 7 B Bw!g LL1;;AqAr]   )rv  ru  rs  rt  r(  )	r   r   r   r   r+  r  r   r   r<  r=  s   @r[   ExportableLooprp  f  s    	9 r]   r     r^  )r(  rw  rf   r%  Fr?  rA  r   )r;   r   rR   r  r>   r   rC  r   r   r   rT   rU   rX   r   r   r  dimsselectintr   rk  r  r   )	r   r  ro  inpepr  rL   count_afterrZ   s	            r[   test_compile_fix_broken_ops&TestPasses.test_compile_fix_broken_opse  s   2	RYY 2	j 3R@kk!Q#E6"11UK
 ""$11HHNNDuyy~~55:::;;%)).."7"7";";;q  # 	a(NN400299;C@%*M	
r]   c           	      n    " S S[         R                  R                  5      nU" 5       n[         R                  R	                  SSS9n[        [        U[         R                  " SS5      4SSU00S	S
9[        R                  " SS9S9nUR                  [        5       /5      nU R                  UR                  5       R                  5        UR                  5       R                  n[        5       R                  S5      R                  S5      R!                  S5      R#                  UR$                  5        g )Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)-TestPasses.test_convert_symb_ops.<locals>.Fooi  rw   rc   c                 N    [         R                  " XR                  S   S-
  5      $ Nr   rf   rR   rW   r  r   s     r[   r   5TestPasses.test_convert_symb_ops.<locals>.Foo.forward      yyGGAJN33r]   rg   Nr   rg   r]   r[   r   r        4 4%,, 4r]   r   dim_xr   r  r   rw   r   Tr_  Fr?  rA  ztorch.ops.aten.sym_size.int@executorch_exir_dialects_backend__ops_executorch_prim_sub_Scalarzoperator.sub)rR   r;   r   r>   r  r   r   rC  r   r   r*   r   r   r   rG   check	check_notr  r  )r   r   r  r  r  r   converted_gms          r[   test_convert_symb_ops TestPasses.test_convert_symb_ops  s    	4%((// 	4 E   a 0EJJq!$&aZ7HQU  11UK	
 >>#7#9":;X668EEF002??78>>N	

)N
#CC(9(9$:r]   c           	         [        5       nUR                  5       n[        [        XSS9[        R
                  " SS9S9n[        5       [        5       /nUR                  U5      n[        5       " UR                  5       R                  5      nU R                  U5        UR                  n[        5       " U5      nU R                  U5        UR                  n/ nUR                  5        H|  n	[        U	[         R"                  R$                  5      (       d  M.  U	R&                  R(                   H4  n
U
R*                  [,        R.                  :X  d  M#  UR1                  U
5        M6     M~     U R3                  [5        U5      S:  5        U H<  n
U R3                  [        U
R6                  R9                  SS5      [:        5      5        M>     g)	z[
Make sure every memory.alloc node including those in sub graph modules
have a TensorSpec.
Tr   Fr?  rA  r   r  N)r6   rd  r   r>   rC  r   r-   r   r   r    r   r   r   r   rP   rQ   rR   rS   rB   rT   rU   rX   r   rI  appendrk  rF  r   rc  r2   )r   eager_modelrM  r  passesr   rO  rP  alloc_nodesrY   rZ   s              r[   test_alloc_node_specTestPasses.test_alloc_node_spec  s\   
 !l..0;t411UK

 N%'
 >>&)!^H$=$=$?$L$LM
Z(((')&1
Z(((^^%E%!5!566!KK--D{{fll2#**40 . &
 	K(1,-DOOJtyy}}VT'BJOP  r]   c                 
   [        5       nUR                  5       n[        U5      " U6 n [        R                  " 5       u  pE[        SU 35        [        US9" U5        [        U5       nUR                  5       nS S S 5        U R                  SW;   5        [        R                  " U5        [        R                  " U5        g ! , (       d  f       NO= f! [        R                  " W5        [        R                  " W5        f = f)NzWrite DebugPass output to )log_filenameztorch.ops.aten.mul)r9   rd  rD   tempfilemkstempprintr   openreadrk  oscloseunlink)r   r  rM  rL   fdpathr  	file_conts           r[   test_debug_pass_file_log#TestPasses.test_debug_pass_file_log  s    e..0 [!6*
	'')HB.tf564(,dqFFH	 OO0I=>HHRLIIdO  HHRLIIdOs#   ?C )C:C 
CC .Dc                 (   [        5       nUR                  5       n[        XSS9R                  n[	        U5        UR                  5         U R                  [        R                  R                  R                  R                  [        U5      ;   5        g )NTr   )r5   rd  r>   r   r   print_readabler  rR   r   r   r   r   r\   )r   r  rM  rL   s       r[   test_dce_recursiveTestPasses.test_dce_recursive  si    $&..0K5BB"2&
++22k"oEFr]   c                 N    " S S[         R                  R                  5      nU" 5       n[        [	        U[         R
                  " S5      4SS9[        R                  " SS9S9R                  [        5       5      nUR                  5       R                  nS	nUR                  R                   H`  n[        R                  " UR                   S
   5      S	    H3  nU R#                  [%        S UR&                   5       5      5        US-  nM5     Mb     U R#                  US	:  5        g )Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)4TestPasses.test_propagate_dynamic_shape.<locals>.Fooi  rw   rc   c                 6    Un[        S5       H  nX!-   nM	     U$ r  )range)r   rw   r   r-  s       r[   r   <TestPasses.test_propagate_dynamic_shape.<locals>.Foo.forward  s!    qAA "r]   rg   Nr   rg   r]   r[   r   r    s     %,, r]   r   ry  Tr   Fr?  rA  r   r  c              3   B   #    U  H  n[        U[        5      v   M     g 7frr   )rQ   r  )r  rw   s     r[   r  :TestPasses.test_propagate_dynamic_shape.<locals>.<genexpr>  s     #K
1Jq#$6$6
s   rf   )rR   r;   r   r   r>   randrC  r   r   r   r   r   rT   rU   pytreetree_flattenr   rk  allr  )r   r   r  r  rL   nspecr  r  s           r[   test_propagate_dynamic_shape'TestPasses.test_propagate_dynamic_shape  s    	%((// 	 E1uzz!}&t411UK
 )+-
.	 	
 ""$11A++AFF6N;A>#K

#K KL
 ?  
 		"r]   c           	      X    " S S[         R                  R                  5      nU" 5       n[         R                  R	                  SSS9n[        [        U[         R                  " SS5      4SSU00S	S
9[        R                  " SS9S9nUR                  [        5       /5      nUR                  5       R                  nUR                  5         UR                  R                  Gt pxn	[!        SUR#                  5        35        U R%                  ['        UR(                  S   R*                  S   [         R,                  5      5        U R%                  [/        UR(                  S   R*                  S   R0                  R2                  R4                  5      S:  5        UR                  [7        5       /5      nUR                  5       R                  nUR                  5         UR                  R                  Gt pxn	[!        SUR#                  5        35        U R%                  ['        UR(                  S   R*                  S   [         R,                  5      5        U R%                  [/        UR(                  S   R*                  S   R0                  R2                  R4                  5      S:  5        g)z
Guard against an issue that after calling ConvertSymbolicOpsPass(),
future ExportPass will encounter symbolic information loss.
c                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)1TestPasses.test_losing_symbolic_info.<locals>.Fooi$  rw   rc   c                 N    [         R                  " XR                  S   S-
  5      $ r  r  r   s     r[   r   9TestPasses.test_losing_symbolic_info.<locals>.Foo.forward%  r  r]   rg   Nr   rg   r]   r[   r   r  $  r  r]   r   r  r   r  r   rw   r   Tr_  Fr?  rA  zBefore ExportPass: r   zAfter ExportPass: N)rR   r;   r   r>   r  r   r   rC  r   r   r*   r   r   r  rT   rU   r  format_noderk  rQ   r   r  re  rF  rZ   exprfree_symbolsr   )
r   r   r  r  r  r   rL   r-  r   r{   s
             r[   test_losing_symbolic_info$TestPasses.test_losing_symbolic_info  s   	4%((// 	4 E  a 0EJJq!$&aZ7HQU  11UK	
 >>#7#9":;&&(55
##D$4$4$6#789
499U#3#9#9!#<ellKLDIIe,2215::??LLMPQQR%%z|n5&&(55
#"4#3#3#5"678
499U#3#9#9!#<ellKLDIIe,2215::??LLMPQQRr]   c                    [         R                  " / SQ5      n " S S[         R                  R                  5      nU" 5       n[	        [        X14SS95      R                  5       R                  nUR                  R                   H>  nUR                  S:X  d  M  U R                  [        UR                  5      [        5        M@     g )Nr   r   r  ry  c                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)2TestPasses.test_to_edge_with_edge_ops.<locals>.FooiE  rw   rc   c                 
    X-   $ rr   rg   r   s     r[   r   :TestPasses.test_to_edge_with_edge_ops.<locals>.Foo.forwardF  r  r]   rg   Nr   rg   r]   r[   r   r  E  r  r]   r   Tr   rN   )rR   r  r;   r   r   r>   r   r   rT   rU   rV   r   typerX   r   )r   rw   r   r  rL   rZ   s         r[   test_to_edge_with_edge_ops%TestPasses.test_to_edge_with_edge_opsB  s    KK%	%((// 	 EVAtD12CCERRHHNNDww/)  dkk!2NC #r]   c           
          " S S[         R                  R                  5      nU" 5       n[        U[         R                  " SS5      [         R                  " SS5      4SS9n[        5       R                  S5      R                  S5      R                  UR                  R                  5         " S S	[        5      n " S
 S[        5      n[        U[        SS9S9R                  U" 5       U" 5       /5      n[        5       R                  S5      R                  UR                  5       R                  R                  5        [        [        UR                  5       R                  5       [         R                  " SS5      [         R                  " SS5      4SS95      n[        5       R                  S5      R                  S5      R                  UR                  5       R                  R                  5        g)zfThis test makes sure the backend op is still retraceable, with the pattern being registered as kernel.c                   f    \ rS rSrS\R
                  S\R
                  S\R
                  4S jrSrg)9TestPasses.test_backend_fused_op_retraceable.<locals>.FooiU  rw   r   rc   c                 p    X-   n[         R                  R                  R                  R	                  U5      $ rr   )rR   r   r   relur   )r   rw   r   zs       r[   r   ATestPasses.test_backend_fused_op_retraceable.<locals>.Foo.forwardV  s(    Eyy~~**22155r]   rg   Nr   rg   r]   r[   r   r  U  s(    6 6%,, 65<< 6r]   r   r   Tr   ztorch.ops.aten.add.Tensorztorch.ops.aten.relu.defaultc                   &    \ rS rSrS\S\4S jrSrg)GTestPasses.test_backend_fused_op_retraceable.<locals>.AddReluFusionPassio  r   rc   c                 B   [        [        S5      S[        R                  S[        R                  S[        R                  4S j5       nS[        R                  S[        R                  S[        R                  4S jn[        R
                  " XU5        [        US5      $ )Nadd_relurw   r   rc   c                     [         R                  R                  R                  R	                  X5      n[         R                  R                  R
                  R                  U5      nU$ rr   )rR   r   r   rW   r   r  r   )rw   r   r  r{   s       r[   pattern]TestPasses.test_backend_fused_op_retraceable.<locals>.AddReluFusionPass.call.<locals>.patternr  sC    		**11!7A))..--55a8CJr]   c                 h    [         R                  R                  R                  R	                  X5      $ rr   )r   backendr^   r  r   r   s     r[   replacementaTestPasses.test_backend_fused_op_retraceable.<locals>.AddReluFusionPass.call.<locals>.replacementx  s#    ;;;;DDLLQRRr]   T)r   librR   r   rC   replace_patternr   )r   r   r  r  s       r[   callLTestPasses.test_backend_fused_op_retraceable.<locals>.AddReluFusionPass.callp  s    #C4u||    5
S5<< SELL SU\\ S "11,U!,55r]   rg   N)r   r   r   r   rB   r   r  r   rg   r]   r[   AddReluFusionPassr  o  s    6 6 6r]   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )CTestPasses.test_backend_fused_op_retraceable.<locals>.OpReplacePassi  c                   > U[         R                  R                  R                  R                  :X  a>  [
        TU ]  [        R                  R                  R                  R                  UUU5      $ [
        TU ]  XX45      $ rr   )rR   r   r^   r  r   r*  call_operatorr  )r   rV   r   rG  r   r0  s        r[   r	  QTestPasses.test_backend_fused_op_retraceable.<locals>.OpReplacePass.call_operator  si    77@@HHH 7088AAII	  w,RvDDr]   rg   )r   r   r   r   r	  r   r<  r=  s   @r[   OpReplacePassr    s    E Er]   r  Fr?  rA  Kexecutorch_exir_dialects_backend__ops_DO_NOT_USE_TEST_ONLY_add_relu_defaultN)rR   r;   r   r>   r  rG   r  r  r   r  r   r   r   r   r   r   )r   r   r  rL   r  r  
gm_loweredgm_retraceds           r[   !test_backend_fused_op_retraceable,TestPasses.test_backend_fused_op_retraceableQ  s   	6%((// 	6
 EAq!Aq! 
 	56<<)	

#boo""
#	6
 	6 		EJ 		E ,#(

 )&(-/:
; 	 	Y	

#j))+88==
> ++-446KK1%KK1% 	
 	56<<)	

#k**,99>>
?r]   c                 "   [        SSS9nUR                  5       n[        [        XSS95      R	                  5       R
                  nUR                  R                   HC  nUR                  S:w  d  M  UR                  S:w  d  M'  U R                  SUR                  5        ME     [        5       " U5        UR                  R                   HC  nUR                  S:w  d  M  UR                  S:w  d  M'  U R                  SUR                  5        ME     g )	Nr   r  output_sizeTr   r  r7  debug_handle)r8   rd  r   r>   r   r   rT   rU   rV   assertInr   r,   )r   r  rM  r   rZ   s        r[    test_debug_handle_generator_pass+TestPasses.test_debug_handle_generator_pass  s    !+..0 F;t<=\ 	 !&&,,Dww-'DGGx,?ndii8 - 	\* &&,,Dww-'DGGx,?ndii8 -r]   c                 \   [        SS5      n[        R                  " SS5      4n[        [	        XSS95      R                  5       R                  nSSSSSSS	S
S
SSS.n0 nUR                  R                   H  nUR                  S:w  d  M  UR                  S:w  d  M'  U R                  SUR                  5        UR                  U;   a9  UUR                      H$  nU R                  XW   UR                  S   5        M&     M  UUR                      H  nUR                  S   XW'   M     M     g )N   i      Tr   )aten_native_layer_norm_defaultgetitem)aten_permute_copy_defaultaten_addmm_default)aten_native_dropout_default	getitem_1)aten_relu_default)aten_permute_copy_default_1aten_addmm_default_1)aten_native_dropout_default_1	getitem_2)r  r  r  r  r  r   r!  r"  r#  r$  r%  r  r7  r  )r7   rR   r  r   r>   r   r   rT   rU   rV   r  r   r  r   )r   r  rM  r   same_source_nodesnode_name_to_debug_handlerZ    node_name_with_same_debug_handles           r[   Vtest_debug_handle_generator_pass_generate_same_debug_handle_on_ops_sharing_same_sourceaTestPasses.test_debug_handle_generator_pass_generate_same_debug_handle_on_ops_sharing_same_source  sB    'sC0++b#&( F;t<=\ 	/ E* #V+WE!7,%. H5
: %'! !&&,,Dww-'DGGx,?ndii899 99<M		=8 ((5W IIn5= =N		=8 !IIn5 2S= -r]   c                    [        SSS9nUR                  5       n[        [        XSS95      R	                  5       nUR
                  R                   Vs/ s H  oDR                  S:w  d  M  UPM     snS   nUR                  R                  S5        U R                  UR                  R                  S5      S L 5        [        U5        U R                  UR                  R                  S5      S L5        g s  snf )	Nr   r  r  Tr   r  r   r  )r8   rd  r   r>   r   rT   rU   rV   r   poprk  rc  r$   )r   r  rM  r  r  first_non_placeholder_nodes         r[   #test_generate_missing_debug_handles.TestPasses.test_generate_missing_debug_handles  s    !+..0VK=>OOQ xx~~&
%!)>A~&

&" 	#''++N;277;;NKtST&r*277;;NKSWWX&
s   C6+C6c           
      "  ^ ^^^	^
^ S[         R                  S[         R                  4S jmS[         R                  S[         R                  4S jmS[         R                  S[         R                  S[         R                  4UU4S jjm
S[         R                  S[         R                  4S jmS[         R                  S	[         R                  S[         R                  S[         R                  S[         R                  4
UU
4S
 jjm	 " U	4S jS[         R                  R                  5      nU" 5       n[         R                  " SS5      [         R
                  " S/5      [         R
                  " S/5      [         R                  " SS5      4n[        [        X#SS95      R                  5       nUR                  nS[         R                  R                  SS 4U 4S jjn[        5       " U5        U" U5        [        5       " U5        U" U5        g )Nr   rc   c                 :    X -   n [         R                  " X 5      n U $ rr   rR   mmr   s    r[   true_nestedRTestPasses.test_debug_handle_generator_pass_with_control_flow.<locals>.true_nested  s    AAHr]   c                 .    [         R                  " X 5      $ rr   r2  r4  s    r[   false_nestedSTestPasses.test_debug_handle_generator_pass_with_control_flow.<locals>.false_nested  s    88A>!r]   rw   pred2c                 @   > [         R                  " UTTU /5      nX-   $ rr   )r:   r  )rw   r:  r  r8  r5  s      r[   r  NTestPasses.test_debug_handle_generator_pass_with_control_flow.<locals>.true_fn  s"    !!%lQCHA5Lr]   c                 "    U R                  5       $ rr   )cos)rw   r-  s     r[   r  OTestPasses.test_debug_handle_generator_pass_with_control_flow.<locals>.false_fn  s    557Nr]   pred1c                    > U R                  5       n [        R                  " UTTX2/5      nX-   n U R                  5       $ rr   )r>  r:   r  sin)rw   r@  r:  r   r  r  s       r[   map_fnMTestPasses.test_debug_handle_generator_pass_with_control_flow.<locals>.map_fn  s:     A!!%(QJGAA557Nr]   c            
          > \ rS rSrS\R
                  S\R
                  S\R
                  S\R
                  S\R
                  4
U 4S jjrSrg	)
JTestPasses.test_debug_handle_generator_pass_with_control_flow.<locals>.Fooi%  r:  r@  r:  r   rc   c                 `   > [         R                  " XD5      n[        R                  " TXX45      $ rr   )rR   r3  r:   map)r   r:  r@  r:  r   rC  s        r[   r   RTestPasses.test_debug_handle_generator_pass_with_control_flow.<locals>.Foo.forward&  s'     HHQN#''5DDr]   rg   Nr   )rC  s   r[   r   rF  %  sX    ELLE ||E ||	E
 <<E E Er]   r   r   FTr   r   c                 x  > U /nU(       a  UR                  S5      nUR                  R                   HC  nUR                  S:w  d  M  UR                  S:w  d  M'  TR	                  SUR
                  5        ME     [        U5       VVs/ s H  u  pEnUPM
     nnnUR                  U5        U(       a  M  g g s  snnf )Nr   r  r7  r  )r,  rT   rU   rV   r  r   r   extend)r   queuecurrent_graph_modulerZ   r-  	submodulecontrol_flow_submodulesr   s          r[   check_debug_handle_metadatabTestPasses.test_debug_handle_generator_pass_with_control_flow.<locals>.check_debug_handle_metadata<  s    !NE',yy|$066<<Dww-/DGGx4Gndii@ =
 ,G,,+,a , ( + 45 %
+s   B6)rR   r   r;   r   r   r   r   r>   r   r   rS   rB   r#   r,   )r   r   r  rM  r  r   rP  r  r8  rC  r  r5  s   `      @@@@@r[   2test_debug_handle_generator_pass_with_control_flow=TestPasses.test_debug_handle_generator_pass_with_control_flow  s   	5<< 	ELL 	
	"ELL 	"U\\ 	"	u|| 	ELL 	U\\ 	 		 	ELL 		||	$)LL	9>	JO,,	\\	 			E%((// 		E E JJq!LL%!LL%!JJq!	
 VAd34EEG	6ehh6J6J 	6t 	6 	!"<0#L1 	\*#L1r]   c                     " S S[         R                  R                  5      nU" 5       n[         R                  R	                  SSS9n[        [        U[         R                  " SS5      4SSU00S	S
9[        R                  " SS9S9nUR                  [        5       /5      n[        5       R                  S5      R                  UR                  5       R                  R                   5        U R#                  [         R$                  " U" [         R                  " SS5      5      UR                  5       R'                  5       " [         R                  " SS5      5      5      5        U R#                  [         R$                  " U" [         R(                  " SS5      5      UR                  5       R'                  5       " [         R(                  " SS5      5      5      5        g )Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg).TestPasses.test_symint_conversion.<locals>.FooiS  rw   rc   c                 N    [         R                  " XR                  S   S-
  5      $ r  r  r   s     r[   r   6TestPasses.test_symint_conversion.<locals>.Foo.forwardT  r  r]   rg   Nr   rg   r]   r[   r   rV  S  r  r]   r   r  r   r  r   rw   r   Tr_  Fr?  rA  z$torch.ops.aten.scalar_tensor.default)rR   r;   r   r>   r  r   r   rC  r   r   r.   rG   r  r  r   r   r  rk  r  r   r,  )r   r   r  r  r  s        r[   test_symint_conversion!TestPasses.test_symint_conversionR  sj   	4%((// 	4 E  a 0EJJq!$&aZ7HQU  11UK	
 ~~012@AEE!!#0055	
 	NN%**Q"#T%:%:%<%C%C%EejjQRTUFV%W	

 	NN%++a#$%%'..0Q1BC	
r]   c                 H    " S S[         R                  R                  5      nU" 5       n[        [	        U[         R
                  " S5      4SS9[        R                  " SS9S9nUR                  [        5       /5      nUR                  5       R                  R                   Vs/ s HU  nUR                  S	:X  d  M  UR                  [         R                  R                   R"                  R$                  :X  d  MS  UPMW     nnU R'                  [)        U5      S
5        g s  snf )Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)/TestPasses.test_remove_assert_pass.<locals>.Fooir  rw   rc   c                 4    UR                   S   S:X  d   eX-  $ )Nr   ry  )r  r   s     r[   r   7TestPasses.test_remove_assert_pass.<locals>.Foo.forwards  s    wwqzQ&ur]   rg   Nr   rg   r]   r[   r   r]  r  s     %,, r]   r   ry  Tr   Fr?  rA  rN   r   )rR   r;   r   r   r>   r  rC  r   r   r(   r   rT   rU   rV   rX   r   r   _assert_asyncmsgr   rF  )r   r   r  rL   rP  rZ   num_assertss          r[   test_remove_assert_pass"TestPasses.test_remove_assert_passq  s    	%((// 	
 E1u{{1~'511UK
 5789 //177==
=ww/)  uyy~~;;??? = 	 
 	[)1-
s   %D=:D;Dc                      " S S[         R                  R                  5      n[        [	        U" 5       [         R
                  " S5      4SS95      R                  5       ng )Nc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )!TestPasses.test_arange.<locals>.Mi  c                 X   > [         TU ]  5         [        R                  " S5      U l        g r  r*  r+  rR   r   rb   rY  s    r[   r+  *TestPasses.test_arange.<locals>.M.__init__  s     "Ar]   c                 2    [         R                  " SSS9U-   $ )Nr   r   )startend)rR   rR  r   s     r[   r   )TestPasses.test_arange.<locals>.M.forward  s    ||!3a77r]   rh   r;  r=  s   @r[   Mrg    s    '8 8r]   ro  r   Tr   )rR   r;   r   r   r>   r  to_executorch)r   ro  r-  s      r[   test_arangeTestPasses.test_arange  sA    	8 	8 F13Q 1$?@NNPr]   c                 :    " S S[         R                  R                  5      n[        [	        U" 5       [         R
                  " S5      4SS95      R                  5       R                  n[        5       R                  S5      R                  UR                  5        g )Nc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )(TestPasses.test_replace_slice.<locals>.Mi  c                 X   > [         TU ]  5         [        R                  " S5      U l        g r]  ri  rY  s    r[   r+  1TestPasses.test_replace_slice.<locals>.M.__init__  s     "Br]   c                 &    U R                   S S U-   $ r  rh   r   s     r[   r   0TestPasses.test_replace_slice.<locals>.M.forward  s    vvbqzA~%r]   rh   r;  r=  s   @r[   ro  ru    s    (& &r]   ro  r   Tr   r	  )rR   r;   r   r   r>   r  r   r   rG   r  r  r  )r   ro  rL   s      r[   test_replace_sliceTestPasses.test_replace_slice  sk    	& 	& F13Q 1$?@\ 	
 	G	

#bgg,r]   c                     " S S[         R                  R                  5      nU" 5       n[        [	        USSS9[        SS9S9n[        5       R                  S	5      R                  S
5      R                  UR                  5       R                  R                  5        [        UR                  S5      SS9UR                  S'   [        5       R                  S5      R                  S5      R                  UR                  5       R                  R                  5        UR                  5       R                  5         UR!                  5         g )Nc                   6    \ rS rSrS\R
                  4S jrSrg)5TestPasses.test_constant_prop_for_output.<locals>.Addi  rc   c                     [         R                  " [         R                  " S5      [         R                  " S5      5      $ )Nr   ry  )rR   rW   r   rc  s    r[   r   =TestPasses.test_constant_prop_for_output.<locals>.Add.forward  s#    yya%,,q/BBr]   rg   Nr   rg   r]   r[   r   r~    s    C Cr]   r   rg   Tr   F_skip_dim_orderrA  c_lifted_tensor_0c_lifted_tensor_1r   c_lifted_tensor__prop_tensor_constant)rR   r;   r   r   r>   r   rG   r  r  r   r   r  r!   _edge_programsr  	_validaterp  )r   r   rW   r   s       r[   test_constant_prop_for_output(TestPasses.test_constant_prop_for_output  s   	C%((// 	C e34(,UC

 	-.445HIMM!!#0055	
 *<!!),e*
I&
 	01778OPTT!!#0055	
 	))+r]   c                     " S S[         R                  R                  5      nU" 5       n[        [	        U[         R
                  " S5      4SS9[        SS9S9nUR                  [        5       [        5       /5      n[        UR                  5       5      n[        5       R                  S	5      R                  S
5      R                  UR                  R                   5        [#        U5      n[        5       R%                  S5      R                  S5      R%                  S
5      R                  UR                  R                   5        g )Nc                   N    \ rS rSrS\R
                  S\R
                  4S jrSrg)7TestPasses.test_constant_prop_pass_for_add.<locals>.Addi  rw   rc   c                     US-   $ Nr   rg   r   s     r[   r   ?TestPasses.test_constant_prop_pass_for_add.<locals>.Add.forward  r  r]   rg   Nr   rg   r]   r[   r   r    r  r]   r   rf   Tr   Fr  rA  _lifted_tensor_constant0Kexecutorch_exir_dialects_edge__ops_dim_order_ops__to_dim_order_copy_default_lifted_tensor_constant_prop_tensor_constant0)rR   r;   r   r   r>   r   r   r   r,   r)   r/   r   rG   r  r  r   r  r!   r  )r   r   rW   r   r   new_eps         r[   test_constant_prop_pass_for_add*TestPasses.test_constant_prop_pass_for_add  s   	%((// 	 e3A(6,UC
 ~~135M5OPQ4T5J5J5LM 	45;;Y	

#++00
1#$45 	78>>$	

)Y

#$$
r]   c                 Z    " S S[         R                  R                  5      nU" 5       n[        USSS9n[	        U[        SS9S9nUR                  5       n[        5       R                  S	5      R                  S
5      R                  UR                  R                  5        U R                  UR                  R                  S   R                  R                   S	5        U R                  UR                  R                  S   R                  R                   S
5        UR#                  5         g )Nc                   J   ^  \ rS rSrU 4S jrS\R                  4S jrSrU =r	$ )9TestPasses.test_pass_no_user_inputs.<locals>.NoUserInputsi  c                 n   > [         TU ]  5         U R                  S[        R                  " S5      5        g )Nrb   rf   )r*  r+  register_bufferrR   r   rY  s    r[   r+  BTestPasses.test_pass_no_user_inputs.<locals>.NoUserInputs.__init__  s&     "$$S%**Q-8r]   rc   c                      SU R                   -   $ r  rh   rc  s    r[   r   ATestPasses.test_pass_no_user_inputs.<locals>.NoUserInputs.forward  s    466z!r]   rg   )
r   r   r   r   r+  rR   r   r   r   r<  r=  s   @r[   NoUserInputsr    s    9" " "r]   r  rg   Tr   Fr  rA  _lifted_tensor_constant1b_ar   rf   )rR   r;   r   r>   r   r   r   rG   r  r  r   r  r   graph_signatureinput_specsr   r  rp  )r   r  modr   r   r  s         r[   test_pass_no_user_inputs#TestPasses.test_pass_no_user_inputs  s    	"588?? 	" n!#r$7,UC
 ""$45;;	

#boo""
# 	**1-11668R	
 	++77:>>CCUK 	r]   c                    S[         R                  R                  S[        4S jn " S S[         R                  R
                  5      n[        U" 5       [         R                  " SSS5      4SS	9nU R                  U" UR                  5      S5        [        U5      nU R                  U" UR                  5      S
5        g )NrL   rc   c                 N    [        S U R                  R                   5       5      $ )Nc              3      #    U  H?  oR                   [        R                  R                  R                  R
                  :H  v   MA     g 7frr   rX   rR   r   r   rW   r   r  rZ   s     r[   r  \TestPasses.test_constant_prop_pass_for_parameter.<locals>.count_additions.<locals>.<genexpr>  .      GUt		 2 2 9 99~   AA	sumrT   rU   rL   s    r[   count_additionsITestPasses.test_constant_prop_pass_for_parameter.<locals>.count_additions  $     GIxx~~  r]   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ );TestPasses.test_constant_prop_pass_for_parameter.<locals>.Mi  c                    > [         TU ]  5         [        R                  R	                  [        R
                  " SSS5      5      U l        g Nrf   r   r   r*  r+  rR   r;   rr  r   rb   rY  s    r[   r+  DTestPasses.test_constant_prop_pass_for_parameter.<locals>.M.__init__  1     "++EJJq!Q,?@r]   c                     U R                   U R                   -   n[        R                  " U R                   U/5      nX3-   U-   $ rr   rb   rR   r  r   rw   br6  s       r[   r   CTestPasses.test_constant_prop_pass_for_parameter.<locals>.M.forward  5    FFTVVOIItvvqk*{"r]   rh   r;  r=  s   @r[   ro  r        A# #r]   ro  r   r   Tr   rf   )rR   rS   rB   r  r;   r   r>   r,  r   r   r!   r   r  ro  r   r  s        r[   %test_constant_prop_pass_for_parameter0TestPasses.test_constant_prop_pass_for_parameter  s    	 4 4 	 	
	# 	# acEKK1a024@):):;Q?#D))<)<=qAr]   c           
         S[         R                  R                  S[        4S jn " S S[         R                  R
                  5      n[        U" 5       [         R                  " SSS5      4SS	9nU R                  [        UR                  R                  5      S5        [        U5      nU R                  UR                  R                  [        [        R                  [!        S
S9S
SS9UR                  R                  S   /5        g )NrL   rc   c                 N    [        S U R                  R                   5       5      $ )Nc              3      #    U  H?  oR                   [        R                  R                  R                  R
                  :H  v   MA     g 7frr   r  r  s     r[   r  ^TestPasses.test_constant_prop_pass_graph_signature.<locals>.count_additions.<locals>.<genexpr>  r  r  r  r  s    r[   r  KTestPasses.test_constant_prop_pass_graph_signature.<locals>.count_additions  r  r]   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )=TestPasses.test_constant_prop_pass_graph_signature.<locals>.Mi  c                    > [         TU ]  5         [        R                  R	                  [        R
                  " SSS5      5      U l        g r  r  rY  s    r[   r+  FTestPasses.test_constant_prop_pass_graph_signature.<locals>.M.__init__  r  r]   c                     U R                   U R                   -   n[        R                  " U R                   U/5      nX3-   U-   $ rr   r  r  s       r[   r   ETestPasses.test_constant_prop_pass_graph_signature.<locals>.M.forward  r  r]   rh   r;  r=  s   @r[   ro  r    r  r]   ro  r   r   Tr   r  )r  )kindr   rX   
persistentr  )rR   rS   rB   r  r;   r   r>   r,  r   rF  r  r  r!   r@   r?   CONSTANT_TENSORrA   r  s        r[   'test_constant_prop_pass_graph_signature2TestPasses.test_constant_prop_pass_graph_signature  s    	 4 4 	 	
	# 	# acEKK1a024@ 	T11==>B#D) 	"".."22&,DE3#	 $$004		
r]   c           
          " S S[         R                  R                  5      n[         R                  " SSSS5      n[         R                  " SSSS5      n[         R                  " SSSS5      n[         R                  R	                  U" S5      X#U4SS9R                  5       nSSKJnJn  [        [         R                  SS	[         R                  S
US9n[        [         R                  SS[         R                  SS
US9n	[        UUU	S S
S9n
[        5       nUR!                  U
5        [#        X[5      n[%        U5      n[	        XRX44SS9n['        U5      n[)        U[+        S
SS9S9nUR-                  [/        5       5      n['        UR1                  5       5      nU R3                  [5        UR6                  5      S5        g )Nc                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )>TestPasses.test_constant_prop_pass_after_delegation.<locals>.Mi6  c                 j   > [         TU ]  5         [        R                  R	                  X5      U l        g rr   )r*  r+  rR   r;   Linearlinear)r   r{  r0  s     r[   r+  GTestPasses.test_constant_prop_pass_after_delegation.<locals>.M.__init__7  s"     "#hhooc7r]   c           	          U R                  U5      nU R                  U5      nU R                  U5      n[        R                  R                  R	                  XUS SSS9$ )Ng        T)	attn_mask	dropout_p	is_causal)r  rR   r;   r  scaled_dot_product_attention)r   querykeyvalues       r[   r   FTestPasses.test_constant_prop_pass_after_delegation.<locals>.M.forward;  s[    E*kk#&E*xx**GGPT H  r]   )r  )r%  r;  r=  s   @r[   ro  r  6  s    8 r]   ro  r%  Tr   r   )MinMaxObserverPerChannelMinMaxObserveri i  F)r   	quant_min	quant_maxqscheme
is_dynamicobserver_or_fake_quant_ctr   )r   r  r  r  ch_axisr  r  )input_activationoutput_activationr,  biasis_qat)r@  _use_edge_opsrA  rf   )rR   r;   r   r  r>   r   torchao.quantization.pt2er  r  rK   int16per_tensor_affineint8per_channel_symmetricr
   r	   
set_globalrJ   rI   r!   r   r   
to_backendr   r   assertGreaterEqualrF  	constants)r   ro  r  r  r  mr  r  activation_qspecweight_qspeccustom_qconfig	quantizer	aten_progr   s                 r[   (test_constant_prop_pass_after_delegation3TestPasses.test_constant_prop_pass_after_delegation5  s   	 	 BB+kk"b"b)BB+ LL"E':4HOOQ 	W+++++'5
 (**//'?
 ,-.
 %&	^,&O 1c1$?	&y1	 ,#(
	 (();)=>	 'y'A'A'CD	I$7$7 8!<r]   c                    S[         R                  R                  S[        4S jn " S S[         R                  R
                  5      n[        U" 5       [         R                  " SSS5      4SS9nU R                  S	UR                  5        U R                  U" UR                  5      S
5        [        U5      n[        5       R                  S5      R                  UR                  R                   5        U R                  SUR"                  5        U R%                  S	UR                  5        U R                  U" UR                  5      S5        g )NrL   rc   c                 N    [        S U R                  R                   5       5      $ )Nc              3      #    U  H@  nUR                   [        R                  R                  R                  R
                  :H  v   MB     g 7frr   )rX   rR   r   r   
slice_copyr   r  s     r[   r  ^TestPasses.test_constant_prop_pass_for_parameter_slice.<locals>.count_slice.<locals>.<genexpr>~  s4      *D 		 9 9 @ @@*s   AA
r  r  s    r[   count_sliceKTestPasses.test_constant_prop_pass_for_parameter_slice.<locals>.count_slice}  s$     HHNN  r]   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )ATestPasses.test_constant_prop_pass_for_parameter_slice.<locals>.Mi  c                    > [         TU ]  5         [        R                  R	                  [        R
                  " SSS5      5      U l        g )Nr   r   r  rY  s    r[   r+  JTestPasses.test_constant_prop_pass_for_parameter_slice.<locals>.M.__init__  r  r]   c                 r    [         R                  " U R                  SSSS9n[         R                  " X/5      $ )Nr   rf   )r{  rl  rm  )rR   r
  rb   r  )r   rw   slice_tensors      r[   r   ITestPasses.test_constant_prop_pass_for_parameter_slice.<locals>.M.forward  s.    $//AQANyy!!233r]   rh   r;  r=  s   @r[   ro  r    s    A4 4r]   ro  r   Tr   rb   rf   r  r   )rR   rS   rB   r  r;   r   r>   r,  r  
state_dictr   r   r!   rG   r  r  r  r  assertNotIn)r   r  ro  r   r  s        r[   +test_constant_prop_pass_for_parameter_slice6TestPasses.test_constant_prop_pass_for_parameter_slice|  s    	EHH00 	S 		4 	4 acEKK1a024@c4??+T%6%67;#D)23778I8I8N8NO.0@0@Af//0V%8%891=r]   c           	      
   S[         R                  R                  S[        4S jn " S S[         R                  R
                  5      n[        U" 5       [         R                  " SSS5      [         R                  " SSS5      4S	S
9nU R                  SUR                  5        U R                  U" UR                  5      S5        [        U5      n[        5       R                  S5      R                  S5      R                  S5      R                  UR                  R                   5        U R#                  SUR$                  5        U R                  SUR                  5        U R                  U" UR                  5      S5        g )NrL   rc   c                 N    [        S U R                  R                   5       5      $ )Nc              3   >   #    U  H  oR                   S :H  v   M     g7f)r  N)rV   r  s     r[   r  ]TestPasses.test_constant_prop_pass_no_propagate.<locals>.count_placeholder.<locals>.<genexpr>  s     Mnd=0ns   r  r  s    r[   count_placeholderJTestPasses.test_constant_prop_pass_no_propagate.<locals>.count_placeholder  s    MbhhnnMMMr]   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ ):TestPasses.test_constant_prop_pass_no_propagate.<locals>.Mi  c                    > [         TU ]  5         [        R                  R	                  [        R
                  " SSS5      5      U l        g )Nr   r   r  r  rY  s    r[   r+  CTestPasses.test_constant_prop_pass_no_propagate.<locals>.M.__init__  r  r]   c                     XR                   -   $ rr   rh   r  s      r[   r   BTestPasses.test_constant_prop_pass_no_propagate.<locals>.M.forward  s    66z!r]   rh   r;  r=  s   @r[   ro  r     s    A" "r]   ro  r   r   r  Tr   rb   p_arw   r   r  )rR   rS   rB   r  r;   r   r>   r,  r  r  r   r   r!   rG   r  r  r  r  r  )r   r  ro  r   r  s        r[   $test_constant_prop_pass_no_propagate/TestPasses.test_constant_prop_pass_no_propagate  s$   	N%(("6"6 	N3 	N	" 	" acEKK1a0%++aA2FGPTUc4??+*4+<+<=qA#D)% &&s+11#6::4;L;L;Q;QR163C3CDc6,,-*6+>+>?Cr]   c                 (    " S S[         R                  R                  5      nU" 5       n[         R                  " SS/5      n[         R                  " US   S   R                  5       S:  5      n[        [        X$U4SS9[        R                  " SS9S	9nUR                  5       R                  5       " XC5      nS
nU R                  SS9 n[        UR                  5       5      n	U R                  XxR                  S   5        S S S 5        W	R                  5       " XC5      n
U R!                  [         R"                  " Xj5      5        [%        5       R'                  S5      R)                  U	R*                  R,                  5        g ! , (       d  f       N= f)Nc                   F   ^  \ rS rSrU 4S jrS rS rS rS rS r	Sr
U =r$ )	CTestPasses.test_constant_prop_pass_for_control_flow.<locals>.Modulei  c                    > [         TU ]  5         [        R                  R	                  SS5      U l        [        R                  " SS5      U l        g r  )r*  r+  rR   r;   r  r  r  wrY  s    r[   r+  LTestPasses.test_constant_prop_pass_for_control_flow.<locals>.Module.__init__  s6     "#hhooa3Q*r]   c                     US-   $ re   rg   r  s     r[   tETestPasses.test_constant_prop_pass_for_control_flow.<locals>.Module.t  r  r]   c                     US-
  $ re   rg   r  s     r[   r  ETestPasses.test_constant_prop_pass_for_control_flow.<locals>.Module.f  r  r]   c                 H    U R                  U5      U R                  U5      -   $ rr   )r  r/  r  s     r[   r  KTestPasses.test_constant_prop_pass_for_control_flow.<locals>.Module.true_fn      {{3'$&&+55r]   c                 H    U R                  U5      U R                  U5      -
  $ rr   )r  r  r  s     r[   r  LTestPasses.test_constant_prop_pass_for_control_flow.<locals>.Module.false_fn  r5  r]   c                 6   [         R                  R                  R                  X R                  R                  [         R                  5      R                  [         R                  5      5      n[         R                  " XR                  U R                  U/5      $ rr   )rR   r;   r  r  r,  r   float16r   r  r  r  )r   predrw   r{   s       r[   r   KTestPasses.test_constant_prop_pass_for_control_flow.<locals>.Module.forward  s^    hh))00vvyy/225==A zz$dmmcUKKr]   )r  r,  )r   r   r   r   r+  r/  r  r  r  r   r   r<  r=  s   @r[   r   r*    s(    +
66L Lr]   r   r   r   Tr   Fr?  rA  zFconstant_prop_pass does not constant propagate in control flow modulesWARNING)levelzKexecutorch_exir_dialects_edge__ops_aten_mm_default(x, _prop_tensor_constant)rR   r;   r   r  r   itemr   r>   rC  r   r   r   
assertLogsr!   r  r7  rk  r  rG   r  r  r   r  )r   r   r  rw   r:  r   expected_outwarn_loglogprogramr{   s              r[   (test_constant_prop_pass_for_control_flow3TestPasses.test_constant_prop_pass_for_control_flow  s=   	LUXX__ 	L0 hKKA||AaDGLLNQ./3q	$/11UK
 ,,.557@ U 	 __9_-()>)>)@AGMM(JJqM2 . nnt'|9: 	Y	

#g""''
( .-s   8F
Fc                     " S S[         R                  R                  5      nU" 5       n[         R                  " S/5      nU" U5        [	        [        X#4SS9[        R                  " SS9S9n[        UR                  5       5        [        5       R                  S	5      R                  UR                  5       R                  R                  5        g )
Nc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )>TestPasses.test_constant_prop_pass_quant_primitives.<locals>.Mi  c                    > [         TU ]  5         [        R                  " SS[        R                  S9U l        SU l        SU l        g )Nr   r   r   )r*  r+  rR   r   r  w_intw_scalew_zero_pointrY  s    r[   r+  GTestPasses.test_constant_prop_pass_quant_primitives.<locals>.M.__init__  s5     ""ZZ1EJJ?
"$%!r]   c                    [         R                  R                  R                  R	                  U R
                  U R                  U R                  SS[         R                  5      n[         R                  R                  R                  X5      $ )Nr  )rR   r   quantized_decomposeddequantize_per_tensorr   rJ  rK  rL  r  r;   r  r  )r   rw   w_dqs      r[   r   FTestPasses.test_constant_prop_pass_quant_primitives.<locals>.M.forward  s^    yy55KKSSJJd.?.?sEJJ xx**11!::r]   )rJ  rK  rL  r;  r=  s   @r[   ro  rH    s    &; ;r]   ro  r   Tr   Fr?  rA  Uexecutorch_exir_dialects_edge__ops_quantized_decomposed_dequantize_per_tensor_default)rR   r;   r   r  r   r>   rC  r   r!   r   rG   r  r  r   r  )r   ro  r  rw   r   s        r[   (test_constant_prop_pass_quant_primitives3TestPasses.test_constant_prop_pass_quant_primitives  s    	; 	; cKKA3T*11UK
 	40023c	

#d##%2277
8r]   c                    S[         R                  R                  S[        4S jn " S S[         R                  R
                  5      n[        [        U" 5       [         R                  " S5      4SS95      nU R                  U" UR                  5       R                  5      S	5        [        UR                  5       5      u  pEU R                  U" U5      S
5        g )NrL   rc   c                 N    [        S U R                  R                   5       5      $ )Nc              3      #    U  H?  oR                   [        R                  R                  R                  R
                  :H  v   MA     g 7frr   )rX   rR   r   r   r}   r   r  s     r[   r  HTestPasses.test_mutable_buffers.<locals>.count_copies.<locals>.<genexpr>  s.      JX$		 4 4 < <<.r  r  r  s    r[   count_copies5TestPasses.test_mutable_buffers.<locals>.count_copies  s$     JL((..  r]   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ );TestPasses.test_mutable_buffers.<locals>.MutableStateModulei  c                    > [         TU ]  5         U R                  S[        R                  " S5      5        U R                  S[        R                  " S5      5        g )Nstaterf   direct_copy_from_inputr*  r+  r  rR   r,  rY  s    r[   r+  DTestPasses.test_mutable_buffers.<locals>.MutableStateModule.__init__  s?     "$$Wekk!n=$$%=u{{1~Nr]   c                     XR                   -   nU R                   R                  S5        U R                  R                  U5        U$ re   )r`  add_ra  r}   r  s      r[   r   CTestPasses.test_mutable_buffers.<locals>.MutableStateModule.forward  s6    

N

"++11!4r]   rg   r;  r=  s   @r[   MutableStateModuler^    s    O
 r]   rg  rf   Tr   r   r   )rR   rS   rB   r  r;   r   r   r>   r,  r   r   r   r%   )r   r[  rg  ro  rL   r-  s         r[   test_mutable_buffersTestPasses.test_mutable_buffers  s    	UXX11 	c 	

	 
	 13ekk!n5FtTUe&<&<&>&K&KLaP 353I3I3KL 	b)1-r]   c           	      j  ^^  " S S[         R                  R                  5      n " S S[         R                  R                  5      nS[         R                  R                  S[
        4S jmS[         R                  R                  S[
        4S jmS	[         R                  R                  S
[        [         R                     S[        [        [
        [
        4   4UU4S jjn[         R                  " SS5      4nU" 5       nUR                  5       nU" Xd5      u  pxn	T" UR                  5       R                  5      n
T" UR                  5       R                  5      nU R                  X-
  S5        U R                  X-
  S5        UR                  5       R                  R                  R                   H*  nU R!                  S[#        UR$                  5      ;   5        M,     U" 5       nUR                  5       nU" Xd5      u  pxn	T" UR                  5       R                  5      n
T" UR                  5       R                  5      nU R                  X5        U R                  X5        U R'                  [)        S UR                  5       R                  R                  R                   5       5      5        g )Nc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )GTestPasses.test_remove_quantized_op_noop_pass.<locals>.TestAddSliceNoopi+  c                 "   > [         TU ]  5         g rr   rX  rY  s    r[   r+  PTestPasses.test_remove_quantized_op_noop_pass.<locals>.TestAddSliceNoop.__init__,  r[  r]   c                     X-   nXS S  -   nU$ rr   rg   r   s     r[   r   OTestPasses.test_remove_quantized_op_noop_pass.<locals>.TestAddSliceNoop.forward/  s    E!Hr]   rg   r;  r=  s   @r[   TestAddSliceNooprl  +      # r]   rq  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )JTestPasses.test_remove_quantized_op_noop_pass.<locals>.TestAddSliceNotNoopi4  c                 "   > [         TU ]  5         g rr   rX  rY  s    r[   r+  STestPasses.test_remove_quantized_op_noop_pass.<locals>.TestAddSliceNotNoop.__init__5  r[  r]   c                     X-   nXS S -   nU$ re   rg   r   s     r[   r   RTestPasses.test_remove_quantized_op_noop_pass.<locals>.TestAddSliceNotNoop.forward8  s    E"1Ir]   rg   r;  r=  s   @r[   TestAddSliceNotNooprt  4  rr  r]   ry  rL   rc   c                 N    [        S U R                  R                   5       5      $ )Nc              3      #    U  Hn  nUR                   [        R                  R                  R                  R
                  [        R                  R                  R                  R
                  4;   v   Mp     g 7frr   )rX   rR   r   rP  rQ  r   r   r   r  s     r[   r  XTestPasses.test_remove_quantized_op_noop_pass.<locals>.count_dq_nodes.<locals>.<genexpr>>  s[      	 +D KK		66LLTT ::PPXX +   A6A8r  r  s    r[   count_dq_nodesETestPasses.test_remove_quantized_op_noop_pass.<locals>.count_dq_nodes=  &     	 HHNN	 	 	r]   c                 N    [        S U R                  R                   5       5      $ )Nc              3      #    U  Hn  nUR                   [        R                  R                  R                  R
                  [        R                  R                  R                  R
                  4;   v   Mp     g 7frr   )rX   rR   r   rP  quantize_per_tensorr   r   r   r  s     r[   r  WTestPasses.test_remove_quantized_op_noop_pass.<locals>.count_q_nodes.<locals>.<genexpr>J  s[      	 +D KK		66JJRR ::NNVV +r}  r  r  s    r[   count_q_nodesDTestPasses.test_remove_quantized_op_noop_pass.<locals>.count_q_nodesI  r  r]   m_eagerr  c                 ~  > [         R                  R                  XSS9R                  5       n[        5       n[	        5       nUR                  U5        [        X#5      n[        USS9n[         R                  R                  X!SS9nT	" UR                  5      nT
" UR                  5      n[        U[        SS9S9nXU4$ )NTr   )fold_quantizeFr?  rA  )rR   r>   r   r	   r   r  rJ   rI   r   r   r   )r  r  r  r  quantization_configr  dq_nodes_preq_nodes_prer   r~  r  s            r[   quantize_modelETestPasses.test_remove_quantized_op_noop_pass.<locals>.quantize_modelU  s     ##GD#IPPRA(*I"C"E  !45Q*AQd3A$$Qt$DB)"//:L'8K#4#ND {22r]   	   r  rf   slicec              3   R   #    U  H  nS [        UR                  5      ;   v   M     g7fr  NstrrX   r  s     r[   r  @TestPasses.test_remove_quantized_op_noop_pass.<locals>.<genexpr>  %      LD 3t{{++L   %')rR   r;   r   rS   rB   r  r   r   r   r  evalr   r   r   rT   rU   r  r  rX   rk  any)r   rq  ry  r  r  ro  r  r   r  r  dq_nodes_postq_nodes_postrZ   r~  r  s                @@r[   "test_remove_quantized_op_noop_pass-TestPasses.test_remove_quantized_op_noop_pass*  s(   	uxx 		%((// 	
	uxx33 
	 
	
	ehh22 
	s 
		3XX__	36;ELL6I	3%sC/0	3 	3&  ++a+- "**,*8*Q'K&t'<'<'>'K'KL$T%:%:%<%I%IJ5q93Q7 ))+88>>DDDWDKK(889 E $%**,*8*Q'K&t'<'<'>'K'KL$T%:%:%<%I%IJ53 	  113@@FFLL 	
r]   c                 ,    " S S[         R                  R                  5      nU" 5       nUR                  5       n[         R                  R	                  U[         R
                  " SS5      4SS9n[        U5      nU R                  [        S UR                  5       R                  R                  R                   5       5      5        U R                  [        S UR                  5       R                  R                  R                   5       5      5        g )	Nc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )0TestPasses.test_dq_q_no_op_pass.<locals>.TestDqQi  c                 "   > [         TU ]  5         g rr   rX  rY  s    r[   r+  9TestPasses.test_dq_q_no_op_pass.<locals>.TestDqQ.__init__  r[  r]   c                    [         R                  R                  R                  R	                  USSSS[         R
                  5      n[         R                  R                  R                  R	                  USSSS[         R
                  5      nU$ )Nr   r   r  r  )rR   r   rP  rQ  r   r  r  )r   rw   dqqs       r[   r   8TestPasses.test_dq_q_no_op_pass.<locals>.TestDqQ.forward  sm    YY33IIQQsAtS%** II22FFNNQc5:: r]   rg   r;  r=  s   @r[   TestDqQr    s    # r]   r  r  r  Tr   c              3   R   #    U  H  nS [        UR                  5      ;   v   M     g7f
dequantizeNr  r  s     r[   r  2TestPasses.test_dq_q_no_op_pass.<locals>.<genexpr>  %      LD DKK 00Lr  c              3   R   #    U  H  nS [        UR                  5      ;   v   M     g7fquantizeNr  r  s     r[   r  r    %      LD c$++..Lr  )rR   r;   r   r  r>   r  r   rk  r  r   r   rT   rU   )r   r  ro  r  r  r   s         r[   test_dq_q_no_op_passTestPasses.test_dq_q_no_op_pass  s    	ehhoo 	 	**,\\  5;;q!+<*>t Lr{  113@@FFLL 	
 	  113@@FFLL 	
r]   c                      " S S[         R                  R                  5      nU" 5       nUR                  5       n[         R                  R	                  U[         R
                  " SS5      4SS9n[        U5      n[        UR                  5       R                  R                  5        U R                  [        S UR                  5       R                  R                  R                   5       5      5        U R                  [        S UR                  5       R                  R                  R                   5       5      5        U R                  [        S	 UR                  5       R                  R                  R                   5       5      5        g )
Nc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )FTestPasses.test_dq_q_different_qparams.<locals>.TestDqQDifferentQParami  c                 "   > [         TU ]  5         g rr   rX  rY  s    r[   r+  OTestPasses.test_dq_q_different_qparams.<locals>.TestDqQDifferentQParam.__init__  r[  r]   c                    [         R                  R                  R                  R	                  USSSS[         R
                  5      n[         R                  R                  R                  R                  USS5      n[         R                  R                  R                  R	                  USSSS[         R
                  5      nU$ )Nr   r   r  r  rO  )
rR   r   rP  rQ  r   r  r   r
  r   r  )r   rw   r  slice_copy_outputr  s        r[   r   NTestPasses.test_dq_q_different_qparams.<locals>.TestDqQDifferentQParam.forward  s    YY33IIQQsAtS%** %*IINN$=$=$D$DRA$N!II22FFNN%sAtS%** r]   rg   r;  r=  s   @r[   TestDqQDifferentQParamr    s    # r]   r  r  r  Tr   c              3   R   #    U  H  nS [        UR                  5      ;   v   M     g7fr  r  r  s     r[   r  9TestPasses.test_dq_q_different_qparams.<locals>.<genexpr>  r  r  c              3   R   #    U  H  nS [        UR                  5      ;   v   M     g7fr  r  r  s     r[   r  r    r  r  c              3   R   #    U  H  nS [        UR                  5      ;   v   M     g7fr  r  r  s     r[   r  r    r  r  )rR   r;   r   r  r>   r  r   r  r   r   rT   rk  r  rU   r  )r   r  ro  r  r  r   s         r[   test_dq_q_different_qparams&TestPasses.test_dq_q_different_qparams  s4   	UXX__ 	 '(**,\\  5;;q!+<*>t Lr{d##%22889  113@@FFLL 	
 	  113@@FFLL 	
 	  113@@FFLL 	
r]   c                 (    " S S[         R                  R                  5      nS[         R                  R                  S[
        4S jn[        U" 5       [         R                  " S5      4SS9R                  nS	nS	nUR                  R                   H:  nU" U5      (       d  M  US
-  nUR                  S	   nU" U5      (       d  M5  US
-  nM<     U R                  US5        U R                  US5        [        5       nU" U5      n	U	c   eU	R                  nS	n
S	nUR                  R                   H:  nU" U5      (       d  M  U
S
-  n
UR                  S	   nU" U5      (       d  M5  US
-  nM<     U R                  U
S5        U R                  US	5        g )Nc                       \ rS rSrS rSrg)@TestPasses.test_normalize_view_copy_base_pass.<locals>.ViewChaini  c                    [         R                  R                  R                  R	                  USS/5      n[         R                  R                  R                  R	                  USS/5      n[         R                  R                  R                  R	                  USS/5      n[         R                  R                  R                  R	                  USS/5      nU$ )	N   rf   ry     r   rM  r   r  )rR   r   r   	view_copyr   r   s     r[   r   HTestPasses.test_normalize_view_copy_base_pass.<locals>.ViewChain.forward  s    IINN,,44QQ@IINN,,44QA?IINN,,44QB@IINN,,44QB@r]   rg   Nr  rg   r]   r[   	ViewChainr    s    r]   r  rZ   rc   c                     U R                   S:H  =(       a;    U R                  [        R                  R                  R
                  R                  :H  $ NrN   rV   rX   rR   r   r   r  r   rZ   s    r[   is_view_copyCTestPasses.test_normalize_view_copy_base_pass.<locals>.is_view_copy  9    ?* DKK599>>#;#;#C#CCr]   r  Tr   r   rf   r  r   )rR   r;   r   rS   r  boolr>   r   r   rT   rU   r   r   r'   )r   r  r  rL   n_view_copy_beforen_view_copy_bases_beforerZ   basepgm_resn_view_copy_aftern_view_copy_bases_afters               r[   "test_normalize_view_copy_base_pass-TestPasses.test_normalize_view_copy_base_pass  sx   	 		uxx}} 	 	 IK%**R.!24@MM #$ HHNNDD!!"a'"yy|%%,1, # 	+Q/115 &'2!!!   "#HHNNDD!!!Q&!yy|%%+q0+ # 	*A.0!4r]   c                 N   S[         R                  R                  S[        4S jnS[         R                  R                  S[        4S jn " S S[         R                  R
                  5      n[         R                  R                  U" 5       [         R                  " S5      4SS	9nUR                  R                   Hn  nUR                  S
:X  d  M  [        R                  " [         R                  " S5      5      UR                  S'   [        R                   UR                  S   l        Mp     UR$                  n['        5       R)                  SSSS9R+                  UR,                  5        ['        5       R)                  SSSS9R+                  UR,                  5        [/        5       nU" U5      nUc   eUR$                  n['        5       R)                  SSSS9R+                  UR,                  5        ['        5       R)                  SSSS9R+                  UR,                  5        g )NrZ   rc   c                     U R                   S:H  =(       a;    U R                  [        R                  R                  R
                  R                  :H  $ r  r  r  s    r[   r  FTestPasses.test_replace_view_copy_with_view_pass.<locals>.is_view_copy  r  r]   c                 h    U R                   S:H  =(       a    U R                  [        R                  :H  $ r  )rV   rX   r   viewr  s    r[   is_memory_viewHTestPasses.test_replace_view_copy_with_view_pass.<locals>.is_memory_view
  s#    77o-L$++2LLr]   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )HTestPasses.test_replace_view_copy_with_view_pass.<locals>.TestViewCopiesi  c                    > [         TU ]  5         [        R                  R	                  [        R
                  " S5      5      U l        g re   )r*  r+  rR   r;   rr  r   	parameterrY  s    r[   r+  QTestPasses.test_replace_view_copy_with_view_pass.<locals>.TestViewCopies.__init__  s,     "!&!3!3EJJqM!Br]   c                 P   [         R                  R                  R                  R	                  US/5      n[         R                  R                  R                  R	                  U R
                  S/5      n[         R                  R                  R                  R                  X#5      $ re   )rR   r   r   r  r   r  rW   r   )r   rw   o1o2s       r[   r   PTestPasses.test_replace_view_copy_with_view_pass.<locals>.TestViewCopies.forward  sk    YY^^--55a!=YY^^--55dnnqcJ yy~~))0088r]   )r  r;  r=  s   @r[   TestViewCopiesr    s    C9 9r]   r  rf   T)r   r   r  r  z torch.ops.aten.view_copy.defaultr   r
  executorch_exir_memory_viewr   )rR   rS   r  r  r;   r   r>   r   rT   rU   rV   r2   r  emptyr   r0   rg  rf  r   rG   r  r  r  r+   )	r   r  r  r  r  rZ   rL   r  r  s	            r[   %test_replace_view_copy_with_view_pass0TestPasses.test_replace_view_copy_with_view_pass  s   	uxx}} 	 		M 	M4 	M
	9UXX__ 
	9 \\  !1A8HQU VHHNNDww-'$.$:$:5;;q>$J		&!3F3M3M		&!0 # __ 	.4 	  	

#bgg, =q$OSSGG	

 ()2!!!   	.4 	  	

#bgg, =q$OSSGG	
r]   c                    S[         R                  R                  S[        4S jn " S S[         R                  R
                  5      n[        [        U" 5       [         R                  " S5      4SS95      nU R                  U" UR                  5       R                  5      S	5        [        UR                  S
   5      UR                  S
'   U R                  U" UR                  5       R                  5      S	5        g )NrL   rc   c                     [        U R                  R                  S[        R                  R
                  R                  R                  S95      $ )NrN   rV   rX   )rF  rT   
find_nodesr   r   r   rW   r   r  s    r[   
count_addsJTestPasses.test_constant_prop_pass_for_mutable_buffers.<locals>.count_adds:  sA    ##&x}}/A/A/E/E/L/L $  r]   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )RTestPasses.test_constant_prop_pass_for_mutable_buffers.<locals>.MutableStateModuleiA  c                 n   > [         TU ]  5         U R                  S[        R                  " S5      5        g )Nr`  rf   rb  rY  s    r[   r+  [TestPasses.test_constant_prop_pass_for_mutable_buffers.<locals>.MutableStateModule.__init__B  s&     "$$Wekk!n=r]   c                 X    XR                   -   nU R                   R                  S5        U$ re   )r`  re  r   s     r[   r   ZTestPasses.test_constant_prop_pass_for_mutable_buffers.<locals>.MutableStateModule.forwardF  s"    

N

"r]   rg   r;  r=  s   @r[   rg  r  A  s    > r]   rg  rf   Tr   r   r   )rR   rS   rB   r  r;   r   r   r>   r,  r   r   r   r!   r  )r   r  rg  edge_managers       r[   +test_constant_prop_pass_for_mutable_buffers6TestPasses.test_constant_prop_pass_for_mutable_buffers9  s    	588// 	C 			 		 %'%++a.):4H
 	L$A$A$C$P$PQSTU1C''	22
##I. 	L$A$A$C$P$PQSTUr]   c                 ~  ^  " U4S jS[         R                  R                  5      mT" SSSS9n[         R                  " SSS5      4n[         R                  R	                  XSS	9n[
        R                  " S
S
S9n[        UUS9n[        UR                  S   5      n[        R                  " UR                  5      ng )Nc                   2   >^  \ rS rSrUU 4S jrS rSrU =r$ )<TestPasses.test_constant_prop_pass_for_no_grad.<locals>.LSTMiV  c                    > [         TU ]  5         X l        X0l        [        R
                  R                  XUSS9U l        g )NT)batch_first)r*  r+  r(  r)  rR   r;   r-  r.  )r   r'  r(  r)  r-  r0  s       r[   r+  ETestPasses.test_constant_prop_pass_for_no_grad.<locals>.LSTM.__init__W  s;    dD*,#. ",!HHMMZT * 	r]   c                 0    U R                  US S9u  nu  p4U$ )N)inputhxr3  )r   text_tokenslstm_outnew_hidden_statenew_cell_states        r[   r   DTestPasses.test_constant_prop_pass_for_no_grad.<locals>.LSTM.forward_  s-    ?Cyy%$ @I @<<+  r]   )r(  r.  r)  r;  )r0  r-  s   @r[   r-  r  V  s       r]   r-        r   r&  r^  Fr   T)r@  r  rA  r   )rR   r;   r   r  r>   rC  r   r   r!   r  copydeepcopymodule_call_graph)	r   r.  example_inputr   _EDGE_COMPILE_CONFIGr  r  r-  r-  s	           @r[   #test_constant_prop_pass_for_no_grad.TestPasses.test_constant_prop_pass_for_no_gradU  s    	 588?? 	   sBAr3/1||""4u"E#55#  

 ,3/,
 $L$?$?	$JKMM&223r]   c           
         SnSnSn " S S[         R                  R                  5      nS[        S[        S[        S	[
        [           S
S 4
S jnU" 5       nUR                  5       n[         R                  " / SQ5      R                  [         R                  S9n[        Xh4SS9R                  0 5      n	U" U	R                  R                  UUX#/5        [        U	[        R                   " SS9S9R"                  S   n
U" U
R                  R                  UUX/5        [%        5       " U
R                  5      nU R'                  U5        U" UR                  R                  UUX/5        [        U	[        R                   " SS9S9R"                  S   nU" UR                  R                  UUX/5        [%        5       " UR                  5      nU R'                  U5        U" UR                  R                  UUX/5        UR                  U5      nUR                  U5      nU R)                  [         R*                  " US   US   5      5        g )Nztorch.ops.aten._to_copy.default8executorch_exir_dialects_edge__ops_aten__to_copy_defaultr  c                   v   ^  \ rS rSrSrU 4S jrS\R                  S\R                  4S jr\	S 5       r
SrU =r$ )	5TestPasses.test_dim_order_revert_pass.<locals>.Modulei{  z
A simple module that has a single to op that converts to channels last and then back to contiguous.
Assuming contiguous input.
c                 "   > [         TU ]  5         g rr   rX  rY  s    r[   r+  >TestPasses.test_dim_order_revert_pass.<locals>.Module.__init__  r[  r]   rw   rc   c                     UR                  [        R                  S9R                  [        R                  S9UR                  [        R                  S9R                  [        R                  S9-   $ Nmemory_format)r   rR   channels_lastcontiguous_formatr   s     r[   r   =TestPasses.test_dim_order_revert_pass.<locals>.Module.forward  sg    tt%*=*=t>AA"'"9"9 B DDu':':D;>>"'"9"9 ?  r]   c                      g)Nr  rg   rg   r]   r[   to_copy_countCTestPasses.test_dim_order_revert_pass.<locals>.Module.to_copy_count  s    r]   rg   )r   r   r   r   __doc__r+  rR   r   r   staticmethodr%  r   r<  r=  s   @r[   r   r  {  s<    
# %,,   r]   r   test_strallowedallowed_countnot_allowed_listrc   c                     U H9  n[        5       R                  XSS9R                  U5      R                  U 5        M;     g )NTr
  )rG   r  r  r  )r)  r*  r+  r,  not_alloweds        r[   
_do_checks9TestPasses.test_dim_order_revert_pass.<locals>._do_checks  s:      0'''MWW#h-  0r]   r  r  Tr   r  rA  r   Fr   )rR   r;   r   r  r  r   r%  r  r   r"  r>   run_decompositionsr   r  r   rC  r   r  r&   r   rk  r  )r   aten_op_stredge_aten_op_stredge_dim_order_op_strr   r/  r  r  r  r  r   new_resedge_prog_dim_ordernew_res_dim_orderoutput_no_dim_orderoutput_no_dim_order_reverts                   r[   test_dim_order_revert_pass%TestPasses.test_dim_order_revert_passv  s@   7U m	UXX__ 	(	 	 $'	 8;	 OSTWy	 	  HOOL),,5;R;R,S Ax-@@DOO  5		
 t55dK

.$	 	""''0		
 ())*@*@AW%  %%0		
 &t55eL

.$ 	,,11!+		
 234G4T4TU./**//0		
 &2259%6%C%CE%J"NN.q13Ma3PQ	
r]   c                     " S S[         R                  R                  5      nU" 5       n[         R                  " / SQ5      nU" U5        [	        [        X#4SS9[        R                  " SS9S9nU R                  S	[        UR                  5       R                  5      5        [        UR                  5       5      nU R                  S
[        UR                  5      5        g)zQ
This checks that None arguments are treated as constants in constant_prop_pass.
c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )2TestPasses.test_constant_prop_pass_none.<locals>.Mi  c                    > [         TU ]  5         [        R                  " SSS[        R                  S9U l        [        R                  " SSS[        R                  S9U l        g )Nr   r   )r*  r+  rR   r   r  cstr,  rY  s    r[   r+  ;TestPasses.test_constant_prop_pass_none.<locals>.M.__init__  sB     " ::aAUZZ@Aq!5::>r]   c                     [         R                  R                  R                  R	                  U R
                  U R                  S S/S/S/SS/S5	      nX!-   $ )Nrf   r   F)rR   r   r   convolutionr   r@  r,  )r   rw   rb   s      r[   r   :TestPasses.test_constant_prop_pass_none.<locals>.M.forward  sL    IINN..66HHdffdQC!qc51#q ur]   )r@  r,  r;  r=  s   @r[   ro  r>    s    ?
 r]   ro  )r   r   r   Tr   Fr?  rA  r   rf   N)rR   r;   r   r  r   r>   rC  r   r   rF  r   r  r!   )r   ro  r  rw   r   pass_results         r[   test_constant_prop_pass_none'TestPasses.test_constant_prop_pass_none  s    
	 	 cKK	"A3T*11UK

 	C 5 5 7 A ABC()>)>)@AC 5 567r]   c                 0    " S S[         R                  R                  5      nU" 5       n[         R                  " SS5      n[         R                  R	                  X#45      nU R                  SUR                  5        [        U5      n[        U[        5       /S9nUR                  [        [        5       /5      5        U R                  [        UR                  5      S5        SnUR                  R!                  5        H  u  pUR#                  S	5      (       d  M  U	n  O   U R%                  U5        U R'                  SUR)                  5       S
UR)                  5        35        U R+                  UR-                  5       SUR)                  5        35        g)z
Test that constant propagation correctly handles tensors with zero strides
by converting them to contiguous tensors. Zero-stride tensors can be created
by operations like expand() and are not supported by ExecuTorch.
c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )OTestPasses.test_constant_prop_pass_zero_stride_tensors.<locals>.ZeroStrideModeli  c                    > [         TU ]  5         [        R                  R	                  [        R
                  " / SQ5      5      U l        g )Nr   )r*  r+  rR   r;   rr  r   const_paramrY  s    r[   r+  XTestPasses.test_constant_prop_pass_zero_stride_tensors.<locals>.ZeroStrideModel.__init__  s.     "#(88#5#5ell?6S#T r]   c                     U R                   R                  S5      nUR                  SS5      nXR                  5       -   nU$ )Nrf   r   ry  )rL  r  expandr  )r   rw   
unsqueezedexpandedr  s        r[   r   WTestPasses.test_constant_prop_pass_zero_stride_tensors.<locals>.ZeroStrideModel.forward  sD    !--77
 &,,Q2 \\^+r]   )rL  r;  r=  s   @r[   ZeroStrideModelrJ    s    U	 	r]   rS  r   ry  rL  )partitionerr   Nr  z)Propagated tensor still has zero stride: z%Propagated tensor is not contiguous: )rR   r;   r   r  r>   r  r  r!   r   r   rp  r   r-   assertGreaterrF  r  items
startswithr   r  striderk  is_contiguous)
r   rS  ro  rw   ri  const_prop_resultloweredprop_tensorconstant_nameconstant_tensors
             r[   +test_constant_prop_pass_zero_stride_tensors6TestPasses.test_constant_prop_pass_zero_stride_tensors  sa   	ehhoo 	   !KK1<<&&ud3 	mX%8%89.x8-+-.
 	C\^DTUV30::;Q? .?.I.I.O.O.Q*M''(?@@- /R 	[) 78J8J8L7MN	
 	%%'3K4F4F4H3IJ	
r]   c                   R   ^  \ rS rSrSS\R
                  S\4U 4S jjjrS rSr	U =r
$ )TestPasses.AddConstanti0	  constant
use_bufferc                 b   > [         TU ]  5         U(       a  U R                  SU5        g Xl        g )Nrc  )r*  r+  r  rc  )r   rc  rd  r0  s      r[   r+  TestPasses.AddConstant.__init__1	  s&    G$$Z: (r]   c                     XR                   -   $ rr   rc  r   s     r[   r   TestPasses.AddConstant.forward8	  s    }}$$r]   rh  )F)r   r   r   r   rR   r   r  r+  r   r   r<  r=  s   @r[   AddConstantrb  0	  s)    	)U\\ 	)t 	) 	)	% 	%r]   rj  c                 <   [         R                  [         R                  /nSS/n[        R                  " X5       GH]  u  p4[         R
                  " SSSS5      R                  US9nU R                  XTS9n[         R
                  " SSSS5      R                  US94n[         R                  R                  Xg5      n[        R                  " [        R                  " U5      5      n	UR                  5       " U6 n
U	R                  5       " U6 n[         R                  R                  XSS	9  U(       a  [        UR!                  5       5      n[        U	R!                  5       5      nU R#                  [%        U5      S
5        U R#                  [%        U5      S
5        ['        [)        UR+                  5       5      5      nX   nX   n[         R                  R                  UUSS	9  GM  U R#                  [%        UR,                  5      S
5        U R#                  [%        U	R,                  5      S
5        ['        [)        UR,                  R+                  5       5      5      nUR,                  U   nU	R,                  U   n[         R                  R                  UUSS	9  GM`     g)zy
Verify that the convert_constant_dim_order_pass does not modify
constant tensors in contiguous or channels last format.
FTr   r   r  ry  r  rd  )check_striderf   N)rR   r"  r!  	itertoolsproductr  r   rj  r>   r   r  r  r   testingassert_closedictnamed_buffersr   rF  r  iterkeysr  )r   memory_formatsuse_buffer_optionsr   rd  rc  ro  rM  r  modified_eporiginal_outputsmodified_outputsoriginal_buffersmodified_buffers
buffer_keyoriginal_buffermodified_buffer	const_keyoriginal_constmodified_consts                       r[   $test_convert_constant_dim_order_noop/TestPasses.test_convert_constant_dim_order_noop;	  sE    ##

 $T])2):):*
%M {{1aA.111NH$$X$EEkk!Q1-00}0MOF$$U3B/OOMM"%   "yy{F3*113V<MM&&  '  #'(8(8(:#; #'(A(A(C#D   %5!6:  %5!6:!$'7'<'<'>"?@
"2">"2">**#_4 +    R\\!2A6  [%:%:!;Q? bll&7&7&9!:;	!#i!8!,!6!6y!A**"N + _*
r]   c                    / SQnSS/n[         R                  " X5       GHK  u  u  p4pVU R                  XVS9   [        R                  " U5      nUR                  U5      nU R                  UR                  5       S5        U R                  XS9n	[        R                  " UR                  5      4n
[        R                  R                  X5      n[        R                  " [        R                  " U5      5      nUR                  5       " U
6 nUR                  5       " U
6 n[        R                  R!                  X5        U(       a  [#        UR%                  5       5      nU R'                  [)        U5      S5        [+        [-        UR/                  5       5      5      nUU   nU R1                  UR                  5       SUR3                  5        35        OU R'                  [)        UR4                  5      S5        [+        [-        UR4                  R/                  5       5      5      nUR4                  U   nU R1                  UR                  5       S	UR3                  5        35        S
S
S
5        GMN     g
! , (       d  f       GMa  = f)z
Verify that the convert_constant_dim_order_pass converts constant/buffer
tensors with dim orders / memory formats outside the allowed list
(contiguous and channels_last) to contiguous.
)))ry  r  )rf   r   z2D transposed))r  r   r   )r   r   rf   z3D permuted))r   r  r   )rf   r   r   z3D permuted v2))ry  r  r   r   )r   rf   r   r   z4D permuted))r  ry  r  r   r   )r  r   r   r   rf   z5D permutedFT)descriptionrd  z1Test setup error: tensor should be non-contiguousrl  rf   z4Buffer should be contiguous after pass, got strides z6Constant should be contiguous after pass, got strides N)rn  ro  subTestrR   r  permuter  rY  rj  r  r>   r   r  r  r   rp  rq  rr  rs  r   rF  r  rt  ru  rk  rX  r  )r   
test_casesrw  
base_shapepermutationr  rd  base_tensorrc  ro  rM  r  rx  ry  rz  r|  r}  r  r  r  s                       r[   -test_convert_constant_dim_order_to_contiguous8TestPasses.test_convert_constant_dim_order_to_contiguous{	  s%   

 $T]BKBSBSC
>2Zk +M#kk*5&..{;   **,G
 (((I++hnn57\\((73SSb)  $&99;#7 #.#5#5#7#@ **+;N '+K,E,E,G'H$$$S)9%:A>!%d+;+@+@+B&C!DJ&6z&BOOO'557NOeOeOgNhi
 $$S)>)>%?C $T+*?*?*D*D*F%G HI%0%:%:9%ENOO&446PQ_QfQfQhPijY NMC
 NMs   H+I00
J 	rg   rc   N)Hr   r   r   r   classmethodr   r   r   r  r  rR  rq  r  r  r  r  r  r  r  r  r  r  r3  rU  rl  r  r  r  r  r  r  r  r  unittestexpectedFailurer  r  r)  r.  rR  rY  rc  rq  rz  r  r  r  r  r  r  r  r&  rD  rU  rh  r  r  r  r  r  r  r  r:  rF  r_  rR   r;   r   rj  r  r  r   rg   r]   r[   r   r      s   , ,V8pJ$(%T	K12f&@&@="?:?:"BH
8%0%0*>$*L&*P(6T;.zH
T;0!QF&G#0"SHD V@ V@p9(=	=~Y C2J
>.*	Q$8
<<B*#
JE=N>:D0/)b94,.\]
~
@&
P/5b5
nV84B\
|8>;
z	%ehhoo 	%>@Kr]   r   c                   6    \ rS rSrSrSS jrSS jrSS jrSrg)	%TestMemoryFormatOpsPassPreserveFormati	  z:
Tests for MemoryFormatOpsPass preserve_format semantics.
Nc                     " S S[         R                  R                  5      nU" 5       R                  [         R                  S9n[         R
                  " SSSS5      R                  [         R                  S9n[         R                  " 5          U" U5      nSSS5        U R                  WR                  [         R                  S9SUR                  5        35        [         R                  R                  X#45      n[        U[        S	S
9S9nS	nUR                  5       R                  R                  R                    H  nUR"                  S:X  d  M  S[%        UR&                  5      ;   d  M0  SnUR(                  R+                  S5      n	U R-                  U	S5        [/        U	R1                  5       5      n
U R3                  U
SSU
 35          O   U R                  US5        g! , (       d  f       GNS= f)z
Verify that clone() on a channels-last input with no memory_format kwarg
produces a _clone_dim_order node with channels-last dim_order (0,2,3,1).
c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )nTestMemoryFormatOpsPassPreserveFormat.test_clone_no_kwarg_preserves_channels_last_dim_order.<locals>.ConvClonei	  c                 l   > [         TU ]  5         [        R                  R	                  SSSSS9U l        g )Nr      rf   )kernel_sizepadding)r*  r+  rR   r;   Conv2dconvrY  s    r[   r+  wTestMemoryFormatOpsPassPreserveFormat.test_clone_no_kwarg_preserves_channels_last_dim_order.<locals>.ConvClone.__init__	  s*     "!HHOOArq!OL	r]   c                 @    U R                  U5      R                  5       $ rr   )r  r>  r   s     r[   r   vTestMemoryFormatOpsPassPreserveFormat.test_clone_no_kwarg_preserves_channels_last_dim_order.<locals>.ConvClone.forward	  s    yy|))++r]   )r  r;  r=  s   @r[   	ConvCloner  	  s    M, ,r]   r  r  rf   r   r  NzVclone() without memory_format kwarg should preserve channels-last layout, got strides Fr  rA  rN   _clone_dim_orderTr   z"Clone node should have meta['val']r   r   r   rf   z3Clone should preserve channels-last dim_order, got z0Should find a _clone_dim_order node in the graph)rR   r;   r   r   r!  r  no_gradrk  rY  rX  r>   r   r   r   r   rT   rU   rV   r  rX   r   rc  r   rl  	dim_orderr   )r   r  ro  rw   r   r  r   found_clonerZ   r  r  s              r[   5test_clone_no_kwarg_preserves_channels_last_dim_order[TestMemoryFormatOpsPassPreserveFormat.test_clone_no_kwarg_preserves_channels_last_dim_order	  s   	, 	, U-@-@AKK1a#&&U5H5H&I ]]_aA OO%*=*=O>defememeodpq	

 \\  -r*;E*RS ))+88>>DDDww/).@CDT.T"yy}}U+$$T+OP!$.."23	   I)U
  E 	%WX3 _s   	G$$
G3c                 (    " S S[         R                  R                  5      nU" 5       n[         R                  " SSSS5      R	                  [         R
                  S9n[         R                  " 5          U" U5      nSSS5        U R                  WR                  5       SUR                  5        35        U R                  UR                  [         R
                  S9S	5        [         R                  R                  X#45      n[        U[        S
S9S9nS
nUR                  5       R                  R                   R"                   H  nUR$                  S:X  d  M  S['        UR(                  5      ;   d  S['        UR(                  5      ;   d  MI  SnUR*                  R-                  S5      n	U R/                  U	S5        [1        U	R3                  5       5      n
U R5                  U
SSU
 35          O   U R                  US5        g! , (       d  f       GN= f)au  
Regression guard: explicit contiguous_format should produce contiguous dim_order.

Note: When clone(memory_format=contiguous_format) is called on a channels-last
input, this is a layout-transforming operation. After export, this typically
lowers to _to_dim_order_copy (not _clone_dim_order) because it changes the
memory layout. We check for both node types to be robust.
c                       \ rS rSrS rSrg)wTestMemoryFormatOpsPassPreserveFormat.test_clone_contiguous_format_kwarg_stays_contiguous.<locals>.CloneContiguousModeli
  c                 <    UR                  [        R                  S9$ r  )r>  rR   r"  r   s     r[   r   TestMemoryFormatOpsPassPreserveFormat.test_clone_contiguous_format_kwarg_stays_contiguous.<locals>.CloneContiguousModel.forward
  s    wwU-D-DwEEr]   rg   Nr  rg   r]   r[   CloneContiguousModelr  
  s    Fr]   r  rf   r   r  r  NzUclone(memory_format=contiguous_format) should produce contiguous layout, got strides zOclone(memory_format=contiguous_format) should not preserve channels-last layoutFr  rA  rN   r  _to_dim_order_copyTr   !Copy node should have meta['val'])r   rf   r   r   z@Explicit contiguous clone should have contiguous dim_order, got z9Should find a _clone_dim_order or _to_dim_order_copy node)rR   r;   r   r  r   r!  r  rk  rY  rX  r  r>   r   r   r   r   rT   rU   rV   r  rX   r   rc  r   rl  r  r   )r   r  ro  rw   r   r  r   
found_copyrZ   r  r  s              r[   3test_clone_contiguous_format_kwarg_stays_contiguousYTestMemoryFormatOpsPassPreserveFormat.test_clone_contiguous_format_kwarg_stays_contiguous	  s   	F588?? 	F %&KK1a#&&U5H5H&I ]]_aA OOcdedldldncop	
 	OO%*=*=O>]	

 \\  -r*;E*RS 
))+88>>DDDww/)"c$++&66'3t{{+;;!
yy}}U+$$T+NO!$.."23	   VW`Vab
  E  	S	
C _s   4	H
Hc                     " S S[         R                  R                  5      nU" 5       n[         R                  " SSSS[         R                  S9R                  [         R                  S9n[         R                  " 5          U" U5      nSSS5        U R                  WR                  [         R                  S9S	UR                  5        35        [         R                  R                  X#45      n[        U[        S
S9S9nS
nUR                  5       R                  R                   R"                   H  nUR$                  S:X  d  M  S['        UR(                  5      ;   d  M0  SnUR*                  R-                  S5      n	U R/                  U	S5        [1        U	R3                  5       5      n
U R5                  U
SSU
 35          O   U R                  US5        g! , (       d  f       GNS= f)z
Verify that tensor.to(dtype=...) with no memory_format kwarg preserves
the input's dim_order (preserve_format semantics).

This tests the _to_copy.default path in MemoryFormatOpsPass.
c                       \ rS rSrS rSrg)rTestMemoryFormatOpsPassPreserveFormat.test_to_copy_no_kwarg_preserves_channels_last_dim_order.<locals>.ToCopyModeli<
  c                 <    UR                  [        R                  S9$ r   r   r   s     r[   r   zTestMemoryFormatOpsPassPreserveFormat.test_to_copy_no_kwarg_preserves_channels_last_dim_order.<locals>.ToCopyModel.forward=
  s    tt%--t00r]   rg   Nr  rg   r]   r[   ToCopyModelr  <
  s    1r]   r  rf   r   r  r   r  Nz\to(dtype=...) without memory_format kwarg should preserve channels-last layout, got strides Fr  rA  rN   r  Tr   r  r  z;to(dtype=...) should preserve channels-last dim_order, got z%Should find a _to_dim_order_copy node)rR   r;   r   r  r9  r   r!  r  rk  rY  rX  r>   r   r   r   r   rT   rU   rV   r  rX   r   rc  r   rl  r  r   )r   r  ro  rw   r   r  r   r  rZ   r  r  s              r[   7test_to_copy_no_kwarg_preserves_channels_last_dim_order]TestMemoryFormatOpsPassPreserveFormat.test_to_copy_no_kwarg_preserves_channels_last_dim_order4
  s   	1%((// 	1
 KK1a%--8;;-- < 
 ]]_aA OO%*=*=O>jklkskskujvw	

 \\  -r*;E*RS 
))+88>>DDDww/).Bc$++FV.V!
yy}}U+$$T+NO!$.."23	   QR[Q\]
  E 	
$KL3 _s   	G
G%rg   r  )	r   r   r   r   r'  r  r  r  r   rg   r]   r[   r  r  	  s    ,Y\6
p-Mr]   r  c                   V    \ rS rSrSr\S 5       r\S 5       rS rS r	S r
S rS	 rS
rg)TestCSEPassid
  z0Tests for Common Subexpression Elimination pass.c                     [         R                  R                  XSS9n[        U5      nUR                  5       R                  $ )NFr   )rR   r>   r   r   r   )r   r  r  r   s       r[   _to_edge_gmTestCSEPass._to_edge_gmg
  s9    \\   Fr{$$&333r]   c                 V   ^ [        U4S jU R                  R                   5       5      $ )Nc              3   n   >#    U  H*  oR                   S :X  d  M  UR                  T:X  d  M&  Sv   M,     g7f)rN   rf   Nr  )r  r  rX   s     r[   r  )TestCSEPass._count_ops.<locals>.<genexpr>o
  s-      
%!)@AQXXQWEWAA~s   55	5r  )rL   rX   s    `r[   
_count_opsTestCSEPass._count_opsm
  s%     
xx~~
 
 	
r]   c                     " S S[         R                  R                  5      nU R                  U" 5       [         R                  " SS5      45      n[
        R                  R                  R                  R                  nU R                  X#5      nUS:  a  U R                  S5        [        5       " U5      nU R                  UR                  5        U R                  U R                  UR                   U5      S5        g)z3Two identical neg(x) ops should be merged into one.c                       \ rS rSrS rSrg)<TestCSEPass.test_duplicate_unary_ops_deduplicated.<locals>.Miv
  c                 b    [         R                  " U5      n[         R                  " U5      nX#-   $ rr   rR   negr   rw   rb   r  s       r[   r   DTestCSEPass.test_duplicate_unary_ops_deduplicated.<locals>.M.forwardw
  s#    IIaLIIaLur]   rg   Nr  rg   r]   r[   ro  r  v
      r]   ro  r  r   z#Export already deduplicated neg opsrf   N)rR   r;   r   r  r  r   r   r   r  r   r  skipTestr"   rk  r  r   r   )r   ro  rL   rX   beforer  s         r[   %test_duplicate_unary_ops_deduplicated1TestCSEPass.test_duplicate_unary_ops_deduplicateds
  s    	 	 acEKK1$5#78##''//,A:MM?@2()<)<fEqIr]   c                      " S S[         R                  R                  5      nU R                  U" 5       [         R                  " SS5      45      n[        5       " U5      nU R                  UR                  5        g)z'neg(x) and abs(x) should not be merged.c                       \ rS rSrS rSrg)4TestCSEPass.test_different_ops_not_merged.<locals>.Mi
  c                 \    [         R                  " U5      [         R                  " U5      -   $ rr   rR   r  absr   s     r[   r   <TestCSEPass.test_different_ops_not_merged.<locals>.M.forward
      yy|eiil22r]   rg   Nr  rg   r]   r[   ro  r  
      3r]   ro  r  NrR   r;   r   r  r  r"   r  r  r   ro  rL   r  s       r[   test_different_ops_not_merged)TestCSEPass.test_different_ops_not_merged
  sW    	3 	3 acEKK1$5#782)r]   c                 &    " S S[         R                  R                  5      nU R                  U" 5       [         R                  " SS5      [         R                  " SS5      45      n[        5       " U5      nU R                  UR                  5        g)z'neg(x) and neg(y) should not be merged.c                       \ rS rSrS rSrg)?TestCSEPass.test_same_op_different_inputs_not_merged.<locals>.Mi
  c                 \    [         R                  " U5      [         R                  " U5      -   $ rr   r  r  s      r[   r   GTestCSEPass.test_same_op_different_inputs_not_merged.<locals>.M.forward
  r  r]   rg   Nr  rg   r]   r[   ro  r  
  r  r]   ro  r  Nr  r  s       r[   (test_same_op_different_inputs_not_merged4TestCSEPass.test_same_op_different_inputs_not_merged
  sd    	3 	3 acEKK1$5u{{1a7H#IJ2)r]   c                      " S S[         R                  R                  5      nU R                  U" 5       [         R                  " SS5      45      n[        5       " U5      nU R                  UR                  5        g )Nc                       \ rS rSrS rSrg)3TestCSEPass.test_noop_when_no_duplicates.<locals>.Mi
  c                     US-   $ re   rg   r   s     r[   r   ;TestCSEPass.test_noop_when_no_duplicates.<locals>.M.forward
  r  r]   rg   Nr  rg   r]   r[   ro  r  
  s    r]   ro  r  r  r  s       r[   test_noop_when_no_duplicates(TestCSEPass.test_noop_when_no_duplicates
  sW    	 	 acEKK1$5#782)r]   c                     " S S[         R                  R                  5      nU R                  U" 5       [         R                  " SS5      45      n[
        R                  R                  R                  R                  n[
        R                  R                  R                  R                  nU R                  X#5      S:  a  U R                  S5        [        5       " U5      nU R                  UR                  5        U R!                  U R                  UR"                  U5      S5        U R!                  U R                  UR"                  U5      S5        g)zBDuplicate multi-op chains should be merged via structural hashing.c                       \ rS rSrS rSrg)9TestCSEPass.test_duplicate_chains_deduplicated.<locals>.Mi
  c                     [         R                  " [         R                  " U5      5      n[         R                  " [         R                  " U5      5      nX#-   $ rr   r  r  s       r[   r   ATestCSEPass.test_duplicate_chains_deduplicated.<locals>.M.forward
  s5    IIeiil+IIeiil+ur]   rg   Nr  rg   r]   r[   ro  r  
  r  r]   ro  r  r   z"Export already deduplicated chainsrf   N)rR   r;   r   r  r  r   r   r   r  r   r  r  r  r"   rk  r  r   r   )r   ro  rL   
neg_target
abs_targetr  s         r[   "test_duplicate_chains_deduplicated.TestCSEPass.test_duplicate_chains_deduplicated
  s    	 	 acEKK1$5#78]]''++33
]]''++33
??2*Q.MM>?2()<)<jI1M)<)<jI1Mr]   rg   N)r   r   r   r   r'  r(  r  r  r  r  r  r  r  r   rg   r]   r[   r  r  d
  sF    :4 4
 
 

J*	*	**Nr]   r  )r  rn  r  r  r  typingr   r   r   r   executorch.exirrC  executorch.exir.memory_planning
executorchrR   9executorch.backends.xnnpack.partition.xnnpack_partitionerr   7executorch.backends.xnnpack.quantizer.xnnpack_quantizerr   r	   =executorch.backends.xnnpack.quantizer.xnnpack_quantizer_utilsr
   )executorch.backends.xnnpack.utils.configsr   r   r   r   r   r   executorch.exir.dialects._opsr   r   r   "executorch.exir.dialects.edge._opsr   executorch.exir.emitr   executorch.exir.graph_moduler   executorch.exir.pass_baser   r   executorch.exir.passesr   r   r   r   r   r   r   r   r    )executorch.exir.passes.constant_prop_passr!   executorch.exir.passes.cse_passr"   2executorch.exir.passes.debug_handle_generator_passr#   r$   9executorch.exir.passes.insert_write_back_for_buffers_passr%   -executorch.exir.passes.memory_format_ops_passr&   4executorch.exir.passes.normalize_view_copy_base_passr'   0executorch.exir.passes.remove_graph_asserts_passr(   2executorch.exir.passes.remove_mixed_type_operatorsr)   5executorch.exir.passes.replace_edge_with_backend_passr*   7executorch.exir.passes.replace_view_copy_with_view_passr+   ,executorch.exir.passes.scalar_to_tensor_passr,   %executorch.exir.passes.spec_prop_passr-   )executorch.exir.passes.sym_to_tensor_passr.    executorch.exir.program._programr/   executorch.exir.schemar0   executorch.exir.sym_utilr1   executorch.exir.tensorr2   executorch.exir.tests.commonr4   )executorch.exir.tests.control_flow_modelsr5   r6   executorch.exir.tests.modelsr7   r8   r9   functorch.experimentalr:   r;   torch._prims_commonr<   torch._subclasses.fake_tensorr=   torch.exportr>   torch.export.graph_signaturer?   r@   rA   torch.fxrB   rC   "torch.fx.experimental.proxy_tensorrD   torch.libraryrE   rF   torch.testingrG   torch.utilsrH   r  'torchao.quantization.pt2e.quantize_pt2erI   rJ   #torchao.quantization.pt2e.quantizerrK   rS   r\   r  definer   r`   rl   rm   libraryregister_fakensrz   r~   r   r   r  r   TestCaser   r  r  rg   r]   r[   <module>r*     s     	   2 2  '  X  S R = - D <
 
 
 I 3 P T W V L > E F 6 5 - J P C C /  ? 9  M M 3 6 ' # ) N @EHH((  $e, 

1 2 

: ; 

, - c5-.5<< E%,,0F"FG  / 

[
 c912|| <</4||
5<<%,,//0 3 c:u    xz23! 4! 

G H c>5! || 	  \\  " H;;H(GH
[[H		I$"" I$XHXMH,=,= XMvWN(## WNr]   