
    Pi!                        d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZ d d
lmZ  G d de
          Z ej         ed           d           G d de                      ZdS )    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                      e Zd ZdZej        j        j        ej        j        j        j        ej        j        j	        ej        j        j	        j        ej        j        j
        ej        j        j
        j        ej        j        j        ej        j        j        j        ej        j        j        j        ej        j        j        j        ej        j        j	        j        ej        j        j	        j        iZ	 	 	 	 	 	 	 ddZdS )PT2EQuantizationTestCasezE
    Base QuantizationTestCase for PT2 with some helper methods.
    NFc                    t           j                                         |                                }t	          j        |          }t          d t          t          |                    D                       }t           j	        	                    |||r|nd d          
                                }|	rt          ||          }nt          ||          }|
rt          d|            ||  t          |          }|
rt          d|            || }t          fd|                                D             }|g }fd|D             }|                     |||           |r!|}t%                      }t	          j        |          }t'          ||||	          } ||  t)          ||	          }t           j	        	                    |||r|nd 
          
                                }i }t*          j                                        D ]'\  }}||v r||         |                    |          <   (| fd|                                D             }|                     ||            || }|                     ||           |S )Nc              3   h   K   | ]-}|d k    r!d t           j                            d          indV  .dS )r   dimN)torchexportDim).0is     n/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torchao/testing/pt2e/utils.py	<genexpr>z;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>F   sX       
 
 -.FFQ  ''((
 
 
 
 
 
    T)dynamic_shapesstrictzprepared model:zquantized modelc                 B    i | ]\  }}                     |          |S  call_functionr   kvnss      r   
<dictcomp>z<PT2EQuantizationTestCase._test_quantizer.<locals>.<dictcomp>_   s:     
 
 
'+q!BQ
 
 
r   c                 :    g | ]}                     |          S r!   r"   )r   nr'   s     r   
<listcomp>z<PT2EQuantizationTestCase._test_quantizer.<locals>.<listcomp>d   s'    EEEQR%%a((EEEr   )expected_node_occurrenceexpected_node_list)backend_config)r   c                 B    i | ]\  }}                     |          |S r!   r"   r$   s      r   r(   z<PT2EQuantizationTestCase._test_quantizer.<locals>.<dictcomp>}   s=     # # #1 $$Q''# # #r   )r,   )r   _dynamoresetevalcopydeepcopytuplerangelenr   moduler   r   printr   r   itemscheckGraphModuleNodesr   r   r   r   _MAP_TO_FX_TRACED_OPSr#   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node_occurrence	node_listqconfig_mappingr.   m_copym_fxr%   r&   fx_quant_outputr'   s                            @r   _test_quantizerz(PT2EQuantizationTestCase._test_quantizer1   s:     	**,, M'"" 
 
3~..//
 
 
 
 
 L-FP>>D	   
 

 &(( 	
  	+ I..AAQ	**A 	(#Q'''	>OO 	(#Q'''1n-
 
 
 
/G/M/M/O/O
 
 
 %!#EEEE2DEEE	""I 	# 	
 	
 	
 " 	@0O:<<N]7++F  D D.!!6^  D <&&1JT~~PT '   fhh	 
 !O0FLLNN W W1000;STU;VOB$4$4Q$7$78*6# # # # ; A A C C# # # &&to&VVV"dN3O_.>???r   )NFNFFFN)__name__
__module____qualname____doc__r   opsquantized_decomposedquantize_per_tensordefaultdequantize_per_tensorquantize_per_channeldequantize_per_channeltensorr<   rQ   r!   r   r   r   r   #   s         
 		&:EI<Z<n<v	&<ei>\>r>z	&;UY=[=p=x	&=uy?]?t?|	&:A59CaCuC|	&<CUYEcEy  FA  $"'$(S S S S S Sr   r   z2.7.0zRequires torch 2.7+c                   X    e Zd ZdZddZdeeef         fdZdeeef         fdZ	d Z
dS )	PT2ENumericDebuggerTestCasez
    Base test case class for PT2E numeric debugger tests containing common utility functions
    for numeric debugging functionality.
    returnNc                 2      fd}t          ||           d S )Nc                    | j         dk    s| j         dk    rd S t          | j        vs| j        t                   d S | j        t                   d         j        dk    rd S                     t          | j        d|  d           d S )Nplaceholderoutputz!ExportedProgram.module().unlift()Node z doesn't have from_node info)opr	   meta	pass_nameassertIn)noder>   s    r   !_assert_node_has_from_node_sourcezmPT2ENumericDebuggerTestCase._assert_each_node_has_from_node_source.<locals>._assert_node_has_from_node_source   s    w-''47h+>+> DI--=1I1Q  	-(,667 7  MM	::::    r   r   )r>   r?   rl   s   `  r   &_assert_each_node_has_from_node_sourcezBPT2ENumericDebuggerTestCase._assert_each_node_has_from_node_source   s5    	 	 	 	 	2 	$E+LMMMMMr   c                 6    i fd}t          ||           S )Nc                 j    t          |           x} |j        |j        ft          |           <   d S d S N)r
   namegraph_idstr)rk   root_node_sourcefrom_node_source_maps     r   #_extract_from_node_source_from_nodezbPT2ENumericDebuggerTestCase._extract_from_node_source.<locals>._extract_from_node_source_from_node   sE    $CD$I$II V$)$-3$SYY/// WVr   r   )r>   r?   rv   ru   s      @r   _extract_from_node_sourcez5PT2ENumericDebuggerTestCase._extract_from_node_source   s;    /1	 	 	 	 	 	$E+NOOO##r   c                 6    i fd}t          ||           S )Nc                    t           | j        v rr| j        t                    bt          | j                            d                    }t	          |           }|vr||<   d S |         |k    sJ d|  d| d|             d S d S d S )Nnn_module_stackrf   z has different from_node info z.than previous node sharing the same decomp op )r	   rh   rs   getr
   )rk   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_nodezPT2ENumericDebuggerTestCase._extract_from_node_source_with_prev_decomp_op.<locals>._extract_from_node_source_with_prev_decomp_op_from_node   s    	))di.F.R!$TY]]3D%E%E!F!F#B4#H#H !)OOO( ;>JJJ
 ?~N+, , ,Z Z ZDT Z ZIWZ Z, , , *).R.R, ,r   r   )r>   r?   r   r~   s      @r   -_extract_from_node_source_with_prev_decomp_opzIPT2ENumericDebuggerTestCase._extract_from_node_source_with_prev_decomp_op   sD    AC.	 	 	 	 	$ 	$J	
 	
 	
 65r   c                 l    |                      |j        |j        k    o|j        |j        k               d S rp   )
assertTruerq   rr   )r>   node_source_1node_source_2s      r   assertNodeSourcesEqualz2PT2ENumericDebuggerTestCase.assertNodeSourcesEqual   sD    -"44 A&-*@@	
 	
 	
 	
 	
r   )r`   N)rR   rS   rT   rU   rm   dictrs   anyrw   r   r   r!   r   r   r_   r_      s         
N N N N8$$sCx. $ $ $ $6d3PS8n 6 6 6 64
 
 
 
 
r   r_   )r3   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_   r!   r   r   <module>r      s                         : 9 9 9 9 9 3 3 3 3 3 3 W W W W W W M M M M M M         
 1 0 0 0 0 0a a a a a3 a a aH ++G4446KLLO
 O
 O
 O
 O
( O
 O
 MLO
 O
 O
r   