
    h!                        S SK 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	J
r
  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJrJr  S S
KJr   " S S\
5      r\R4                  " \" S5      (       + S5       " S S\5      5       rg)    N)get_executorch_backend_config)#_convert_to_reference_decomposed_fx
prepare_fx)NodeSpecQuantizationTestCase)TestCase)FROM_NODE_KEY)_extract_node_source_debug_infobfs_trace_with_node_process)convert_pt2eprepare_pt2eprepare_qat_pt2e)torch_version_at_leastc                      \ rS rSrSr\R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  \R                  R                  R                  R                  0r       SS jrSrg)PT2EQuantizationTestCase#   z=
Base QuantizationTestCase for PT2 with some helper methods.
Nc                 B   [         R                  R                  5         UR                  5       n[        R
                  " U5      n[        S [        [        U5      5       5       5      n[         R                  R                  UUU(       a  UOS SS9R                  5       nU	(       a  [        X5      nO[        X5      nU
(       a  [        SU5        U" U6   [        U5      nU
(       a  [        SU5        U" U6 n[        nUR!                  5        VVs0 s H  u  nnUR#                  U5      U_M     nnnUc  / nU Vs/ s H  nUR#                  U5      PM     nnU R%                  UUUS9  U(       Ga  Un['        5       n[        R
                  " U5      n[)        UUUUS9nU" U6   [+        UUS9n[         R                  R                  UUU(       a  UOS S9R                  5       n0 n[,        R.                  R!                  5        H%  u  nnUU;   d  M  UU   UUR#                  U5      '   M'     Ub5  UR!                  5        VVs0 s H  u  nnUR#                  U5      U_M     nnnU R%                  UUS	9  U" U6 nU R1                  UU5        U$ s  snnf s  snf s  snnf )
Nc              3   t   #    U  H.  nUS :X  a!  S [         R                  R                  S5      0OSv   M0     g7f)r   dimN)torchexportDim).0is     T/home/james-whalen/.local/lib/python3.13/site-packages/torchao/testing/pt2e/utils.py	<genexpr>;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>F   s6      
/ -.FQ  '(</s   68T)dynamic_shapesstrictzprepared model:zquantized model)expected_node_occurrenceexpected_node_list)backend_config)r   )r!   )r   _dynamoresetevalcopydeepcopytuplerangelenr   moduler   r   printr   r   itemscall_functioncheckGraphModuleNodesr   r   r   r   _MAP_TO_FX_TRACED_OPSassertEqual)selfmodelexample_inputs	quantizerr!   r"   check_against_fx_quantfx_qconfig_mappingexport_with_dynamic_shapeis_qatis_debug_modetraining_ir_node_occurrencem_eagermr   pt2_quant_outputnskvnode_occurrencen	node_listqconfig_mappingr#   m_copym_fxfx_quant_outputs                              r   _test_quantizer(PT2EQuantizationTestCase._test_quantizer1   s     	**, MM'" 
3~./
 
 LL-F>D	   

 &( 	
  .AQ*A#Q'	>O#Q'n-/G/M/M/O
/Otq!BQ"/O 	 
 %!#2DE2DQR%%a(2D	E""I 	# 	
 "0O:<N]]7+FD .!6^D <<&&1J~PT '  fh	 
 !O0FFLLN100;STU;VOB$4$4Q$78 O +6 !< A A C# C1 $$Q'* C   # &&to&V"N3O_.>?K

 F2#s   J=JJ )NFNFFFN)__name__
__module____qualname____firstlineno____doc__r   opsquantized_decomposedquantize_per_tensordefaultdequantize_per_tensorquantize_per_channeldequantize_per_channeltensorr1   rJ   __static_attributes__rL       r   r   r   #   sD   
 			&&::EII<Z<Z<n<n<v<v		&&<<eii>\>\>r>r>z>z		&&;;UYY=[=[=p=p=x=x		&&==uyy?]?]?t?t?|?|		&&::AA599CaCaCuCuC|C|		&&<<CCUYYEcEcEyEy  FA  FA  $"'$(Sr[   r   z2.7.0zRequires torch 2.7+c                   X    \ rS rSrSrS
S jrS\\\4   4S jr	S\\\4   4S jr
S rS	rg)PT2ENumericDebuggerTestCase   z
Base test case class for PT2E numeric debugger tests containing common utility functions
for numeric debugging functionality.
returnNc                 (   ^  U 4S jn[        X5        g )Nc                 .  > U R                   S:X  d  U R                   S:X  a  g [        U R                  ;  d  U R                  [           c  g U R                  [           S   R                  S:X  a  g TR	                  [        U R                  SU  S35        g )Nplaceholderoutputz!ExportedProgram.module().unlift()Node z doesn't have from_node info)opr	   meta	pass_nameassertIn)noder3   s    r   !_assert_node_has_from_node_sourcemPT2ENumericDebuggerTestCase._assert_each_node_has_from_node_source.<locals>._assert_node_has_from_node_source   s    ww-'477h+> DII-=1I1Q  		-(,6667  MM		v9:r[   r   )r3   r4   rk   s   `  r   &_assert_each_node_has_from_node_sourceBPT2ENumericDebuggerTestCase._assert_each_node_has_from_node_source   s    	2 	$EMr[   c                 .   ^ 0 mU4S jn[        X5        T$ )Nc                 l   > [        U 5      =nb%  UR                  UR                  4T[        U 5      '   g g N)r
   namegraph_idstr)rj   root_node_sourcefrom_node_source_maps     r   #_extract_from_node_source_from_nodebPT2ENumericDebuggerTestCase._extract_from_node_source.<locals>._extract_from_node_source_from_node   s=    $CD$II V$))$--3$SY/ Wr[   r   )r3   r4   rw   rv   s      @r   _extract_from_node_source5PT2ENumericDebuggerTestCase._extract_from_node_source   s    /1	 	$EO##r[   c                 .   ^ 0 mU4S jn[        X5        T$ )Nc                   > [         U R                  ;   aj  U R                  [            bU  [        U R                  R                  S5      5      n[	        U 5      nUT;  a  UTU'   g TU   U:X  d   SU  SU SU 35       eg g g )Nnn_module_stackre   z has different from_node info z.than previous node sharing the same decomp op )r	   rg   rt   getr
   )rj   prev_decomp_opfrom_node_source&prev_decomp_op_to_from_node_source_maps      r   7_extract_from_node_source_with_prev_decomp_op_from_nodeڊPT2ENumericDebuggerTestCase._extract_from_node_source_with_prev_decomp_op.<locals>._extract_from_node_source_with_prev_decomp_op_from_node   s    		)dii.F.R!$TYY]]3D%E!F#B4#H !)OO( ;>J
 ?~N+,  v%CDTCUHHXZ	, /S)r[   r   )r3   r4   r   r   s      @r   -_extract_from_node_source_with_prev_decomp_opIPT2ENumericDebuggerTestCase._extract_from_node_source_with_prev_decomp_op   s#    AC.	$ 	$	
 65r[   c                     U R                  UR                  UR                  :H  =(       a    UR                  UR                  :H  5        g rq   )
assertTruerr   rs   )r3   node_source_1node_source_2s      r   assertNodeSourcesEqual2PT2ENumericDebuggerTestCase.assertNodeSourcesEqual   s<    -"4"44 A&&-*@*@@	
r[   rL   )r_   N)rM   rN   rO   rP   rQ   rm   dictrt   anyry   r   r   rZ   rL   r[   r   r]   r]      s;    
N8$$sCx. $6d3PS8n 64
r[   r]   )r'   unittestr   $torch.ao.quantization.backend_configr   !torch.ao.quantization.quantize_fxr   r   +torch.testing._internal.common_quantizationr   r   $torch.testing._internal.common_utilsr   torchao.quantization.pt2er	   +torchao.quantization.pt2e._numeric_debuggerr
   %torchao.quantization.pt2e.graph_utilsr   'torchao.quantization.pt2e.quantize_pt2er   r   r   torchao.utilsr   r   skipIfr]   rL   r[   r   <module>r      s       : 3 W M 
 1a3 aH 
+G446KLO
( O
 MO
r[   