o
    IhW                     @   s   d dl Z d dlZd dlZd dlZd dlmZ dgZG dd dejje j	dZ
dd Zdd	 Zd
d Zdd Zdd Zdd ZedZdS )    N)
_addindentWeightedQuantizedModulec                   @   s"   e Zd ZdZeejdd ZdS )r   zIWrapper for quantized modules than can be lowered from reference modules.c                 C   s   t )N)NotImplementedError)cls
ref_moduleoutput_scaleoutput_zero_point r	   W/var/www/vscode/kcb/lib/python3.10/site-packages/torch/ao/nn/quantized/modules/utils.pyfrom_reference   s   z&WeightedQuantizedModule.from_referenceN)__name__
__module____qualname____doc__classmethodabcabstractmethodr   r	   r	   r	   r
   r      s
    )	metaclassc                 C   s   t | dr| j} | S )Nactivation_post_process)hasattrr   )observerr	   r	   r
   _get_weight_observer   s   
r   c                 C   sB   t | } |tjtjtjfv rt|}| j|jkp| j|j	k S dS )NF)
r   torchqint8quint8qint32iinfo	quant_minmin	quant_maxmax)r   dtypeinfor	   r	   r
   _needs_weight_clamping    s
   
r#   c           	      C   s   t || js| S t|}|j|j}}t|  |}t|  |}t	t
|  ||}|jtjtjfv rIt|| | } | S |jtjtjtjfv r`tj||||jd} | S td|j )N)axisUnexpected qscheme )r#   r!   r   r   r   r   cloneint_reprfill_minimummaximumqschemeper_tensor_symmetricper_tensor_affine!_make_per_tensor_quantized_tensoritemper_channel_symmetricper_channel_affine per_channel_affine_float_qparams"_make_per_channel_quantized_tensorch_axis
ValueError)	qweightr   scalezpmin_max_
qw_int_max
qw_int_minqw_intr	   r	   r
   _clamp_weights(   s,   
r>   c                 C   s   |  \}}|jtjtjfv r%t| t|t|tj}t	||||}|S |jtj
tjfv rL|j}t| |tj|tj|tj}t	||||}|S |jtjfv rot| |tj|tj|j|j}t	||||}|S td|j )Nr%   )calculate_qparamsr+   r   r,   r-   quantize_per_tensorfloatintr   r>   r0   r1   r4   quantize_per_channeltodoubleint64r2   r!   r5   )float_wtr   wt_scalewt_zpr6   wt_axisr	   r	   r
   _quantize_weightE   s:   



rK   c                    s    fdd}|S )zOConverts the argument to a tuple of size n
    with the first element repeated.c                    sB   t | tjjrt|  krn| d } t | tjjstt|  S )Nr   )
isinstancecollectionsr   Sequencelentuple	itertoolsrepeat)xnr	   r
   parseh   s   z!_ntuple_from_first.<locals>.parser	   )rU   rV   r	   rT   r
   _ntuple_from_firstd   s   rW   c           
      C   s   g }|   }|r|d}g }| j D ]\}}t||rqt|}t|d}|d| d |  q|| }|  d }	|rYt	|dkrN|sN|	|d 7 }	n|	dd
| d 7 }	|	d7 }	|	S )	N
   (z):    r   z
  ))
extra_reprsplit_modulesitemsrL   reprr   append	_get_namerO   join)
selfparamsextra_linesr]   child_lineskeymodulemod_strlinesmain_strr	   r	   r
   _hide_packed_params_reprr   s&   


rn   rY   )r   rM   rQ   r   torch.nn.modules.moduler   __all__nnModuleABCMetar   r   r#   r>   rK   rW   rn   _pair_from_firstr	   r	   r	   r
   <module>   s   	