o
    i!                     @   s   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 de
Zeed dG d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                   @   s   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dZdS )PT2EQuantizationTestCasezE
    Base QuantizationTestCase for PT2 with some helper methods.
    NFc                    s  t j  | }t|}tdd tt|D }t j	j	|||r$|nd dd
 }|	r3t||}nt||}|
r?td| ||  t|}|
rNtd| || }t  fdd| D }|d u reg } fd	d
|D }| j|||d |r|}t }t|}t||||d}||  t||d}t j	j	|||r|nd d
 }i }tj D ]\}}||v r|| | |< q|d urˇ fdd| D }| j||d || }| || |S )Nc                 s   s,    | ]}|d krd t jdindV  qdS )r   dimN)torchexportDim).0i r   N/home/ubuntu/.local/lib/python3.10/site-packages/torchao/testing/pt2e/utils.py	<genexpr>F   s
    
z;PT2EQuantizationTestCase._test_quantizer.<locals>.<genexpr>T)dynamic_shapesstrictzprepared model:zquantized modelc                       i | ]
\}}  ||qS r   call_functionr   kvnsr   r   
<dictcomp>_   s    z<PT2EQuantizationTestCase._test_quantizer.<locals>.<dictcomp>c                    s   g | ]}  |qS r   r   )r   nr"   r   r   
<listcomp>d   s    z<PT2EQuantizationTestCase._test_quantizer.<locals>.<listcomp>)expected_node_occurrenceexpected_node_list)backend_config)r   c                    r   r   r   r   r"   r   r   r$   }   s    
)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   r"   r   _test_quantizer1   s   










z(PT2EQuantizationTestCase._test_quantizer)NFNFFFN)__name__
__module____qualname____doc__r   opsquantized_decomposedquantize_per_tensordefaultdequantize_per_tensorquantize_per_channeldequantize_per_channeltensorr6   rK   r   r   r   r   r   #   s"    r   z2.7.0zRequires torch 2.7+c                   @   sN   e Zd ZdZdddZdeeef fddZdeeef fdd	Z	d
d Z
dS )PT2ENumericDebuggerTestCasez
    Base test case class for PT2E numeric debugger tests containing common utility functions
    for numeric debugging functionality.
    returnNc                    s    fdd}t || d S )Nc                    sh   | j dks
| j dkrd S t| jvs| jt d u r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)noder8   r   r   !_assert_node_has_from_node_source   s   
zmPT2ENumericDebuggerTestCase._assert_each_node_has_from_node_source.<locals>._assert_node_has_from_node_sourcer
   )r8   r9   rd   r   rc   r   &_assert_each_node_has_from_node_source   s   zBPT2ENumericDebuggerTestCase._assert_each_node_has_from_node_sourcec                       i   fdd}t ||  S )Nc                    s,   t |  }d ur|j|jf t| < d S d S N)r	   namegraph_idstr)rb   root_node_sourcefrom_node_source_mapr   r   #_extract_from_node_source_from_node   s
   zbPT2ENumericDebuggerTestCase._extract_from_node_source.<locals>._extract_from_node_source_from_noder
   )r8   r9   rn   r   rl   r   _extract_from_node_source   s   
z5PT2ENumericDebuggerTestCase._extract_from_node_sourcec                    rf   )Nc                    sv   t | jv r5| jt  d ur7t| jd}t| }| vr"| |< d S  | |ks9J d|  d| d| d S d S d S )Nnn_module_stackr]   z has different from_node info z.than previous node sharing the same decomp op )r   r_   rj   getr	   )rb   prev_decomp_opfrom_node_source&prev_decomp_op_to_from_node_source_mapr   r   7_extract_from_node_source_with_prev_decomp_op_from_node   s   
	zPT2ENumericDebuggerTestCase._extract_from_node_source_with_prev_decomp_op.<locals>._extract_from_node_source_with_prev_decomp_op_from_noder
   )r8   r9   rv   r   rt   r   -_extract_from_node_source_with_prev_decomp_op   s   zIPT2ENumericDebuggerTestCase._extract_from_node_source_with_prev_decomp_opc                 C   s"   |  |j|jko|j|jk d S rg   )
assertTruerh   ri   )r8   node_source_1node_source_2r   r   r   assertNodeSourcesEqual   s   
z2PT2ENumericDebuggerTestCase.assertNodeSourcesEqual)rY   N)rL   rM   rN   rO   re   dictrj   anyro   rw   r{   r   r   r   r   rX      s    
rX   )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   skipIfrX   r   r   r   r   <module>   s   d