
    {-j                        d dl Zd dlZd dlmZ i dej        j        dej        j        dej        j        dej        j	        dej        j
        dej        j        d	ej        j        d
ej        j        dej        j        dej        j        dej        j        dej        j        dej        j        dej        j        dej        j        dej        j        dej        j        ej        j        ej        j        dZej        j        ej        j        ej        j        gZej        j        j        ej        j        j        ej        j        j        ej        j        j        ej        j        j         gZ!ej"        ej#        ej$        ej%        gZ&ej'        ej(        ej)        ej*        ej+        gZ,ej        j        ej        j        gZ-g dZ.g dZ/d Z0d Z1d Z2d Z3d Z4d Z5d Z6dS )    N)quant_layersConv2DTransposeConv2DLinearAdaptiveAvgPool2DAdaptiveMaxPool2D	AvgPool2D	MaxPool2D	Hardswish	LeakyReLUPReLUReLUReLU6SigmoidSoftmaxSwishTanh	BatchNorm)	GroupNorm	LayerNorm)conv2ddepthwise_conv2dmatmulconv2d_transposedepthwise_conv2d_transpose) fake_quantize_dequantize_abs_max-fake_channel_wise_quantize_dequantize_abs_max/fake_quantize_dequantize_moving_average_abs_maxc                     |                      |          }|J d|z   dz               t          j        |                                          S )z(
    Load variable value from scope
    NzCan not find z in the scope.)find_varnparray
get_tensor)scopevar_namevar_nodes      d/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/quantization/imperative/utils.pyload_variable_datar(   ]   sP     ~~h''H8!;>N!N8H''))***    c                 4    | j         D ]}||j        v r|c S dS )z6
    Find the previous op for the input variable.
    N)opsoutput_arg_names)blockr%   ops      r'   find_previous_opr/   f   s6     i  r***III +4r)   c                 Z    g }| j         D ] }||j        v r|                    |           !|S )z7
    Find all followed ops for the input variable.
    )r+   input_arg_namesappend)r-   r%   res_opsr.   s       r'   find_next_opsr4   p   s@     Gi  r)))NN2Nr)   c                    t          | t          j        j                  s
J d            t	          |          dk    s
J d            d}d}| }|t	          |          k     rS||         dk    r/|||         }t          ||          rt          ||          }|dz   }|dz  }|t	          |          k     S|||         }||fS )a  
    Given the model and the name of a layer, find the parent layer and
    the sub_name of the layer.
    For example, if name is 'block_1/convbn_1/conv_1', the parent layer is
    'block_1/convbn_1' and the sub_name is `conv_1`.
    Args:
        model(paddle.nn.Layer): the model to be quantized.
        name(string): the name of a layer

    Returns:
        parent_layer, subname
    z2The model must be the instance of paddle.nn.Layer.r   z%The input (name) should not be empty..   )
isinstancepaddlennLayerlenhasattrgetattr)modelnamelast_idxidxparent_layersub_names         r'   find_parent_layer_and_sub_namerE   {   s     eVY_--  < - t99q===A===H
CL
D		//9HSL)H|X.. #&|X>>7q D		// HSL!H!!r)   c                 \    g }| j         D ]!}|j        D ]}|                    |           "|S )z/
    Return all ops for the input program.
    )blocksr+   r2   )programall_opsr-   r.   s       r'   program_all_opsrJ      sJ     G  ) 	 	BNN2	Nr)   c                     t          | t          j        j                  o$t	          |                                           dk    S )z*
    Whether the layer is leaf layer.
    r   )r8   r9   r:   r;   r<   	sublayers)layers    r'   is_leaf_layerrN      s4     eVY_--M#eoo6G6G2H2HA2MMr)   c                 ^    | j         dk    rt          |           S |                                 S )z)
    Convert numpy to float or list.
    r7   )sizefloattolist)x_nps    r'   fp_numpy_to_naiverT      s)     yA~~T{{{{}}r)   )7numpyr!   r9   paddle.nn.quantr   r:   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   layer_name_mapfake_quant_input_layersquantaddsubtractmultiplydivider   fake_quant_output_layersFakeQuantAbsMaxFakeQuantChannelWiseAbsMaxFakeQuantMovingAverageAbsMaxMovingAverageAbsMaxScalefake_quant_leaf_layersQuantizedConv2DQuantizedLinearQuantizedConv2DTransposeQuantizedColumnParallelLinearQuantizedRowParallelLinearfake_quant_wrap_layersspec_channel_axis_layersweight_op_types!fake_quantize_dequantize_op_typesr(   r/   r4   rE   rJ   rN   rT    r)   r'   <module>rn      s        ( ( ( ( ( (vy0fi fi 4	
 4 $ $ $ $ VY_ FIN VY_ vy  vy  VY_  FIN!" $#$ $$'  0 I
I
I  IO
IO
IO
IO
IO   +-)	    ).+  #I5vy7GH   % % % !+ + +    " " "@  N N N    r)   