
    |j$                         d dl Z d dlZddlmZmZ ddlmZ g dZd Z	d Z
d	 Zd
 Zd Zd ZddZddZddZd Zd Zd Zd Z G d d          ZdS )    N   )IrNodeOperator   )SUPPORT_QUANTIZATION_OP_DICT)conv2d_transposemulmatmul	matmul_v2c                    t          | t          t          f          s
J d            g }t          | t                    r|                                 n| j        }|t
          vrg S t
          |         d         }|D ]W}|                     |          }t          |t                    r|                    |           B|	                    |           X|S )z
    Get the input var names of the op.
    Args:
        op(IrNode, Operator): the input op.
    Returns:
        input_var_names or None.
    *The input op should be IrNode or Operator.r   )

isinstancer   r   nametyper   inputlistextendappendop	var_namesop_name	name_listr   var_names         p/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/static/quantization/utils.py_get_op_input_var_namesr      s     b68,--  4 - I%b&11>bggiiirwG222	,W5a8I ' '88D>>h%% 	'X&&&&X&&&&    c                    t          | t          t          f          s
J d            g }t          | t                    r|                                 n| j        }|t
          vrg S t
          |         d         }|D ]W}|                     |          }t          |t                    r|                    |           B|	                    |           X|S ) r   r   )
r   r   r   r   r   r   outputr   r   r   r   s         r   _get_op_output_var_namesr!   8   s    b68,--  4 - I%b&11>bggiiirwG222	,W5a8I ' '99T??h%% 	'X&&&&X&&&&r   c                 `   t          | t          t          f          s
J d            t          | t                    r|                                 n| j        }|t
          vrdS d}t
          |         d         D ]6}|                     |          }t          |          D ]\  }}||k    r||f}7|S )z6Get the input name and index of the var_name in the opr   Nr   )r   r   r   r   r   r   r   	enumerate)r   input_var_namer   resargnamer   indexr   s           r   _get_input_name_indexr(   L   s    b68,--  4 - &b&11>bggiiirwG222t
C/8; ' 'HHW%%	$Y// 	' 	'KE4~%%&	' Jr   c                 d   t          | t          t          f          s
J d            t          | t                    r|                                 n| j        }|t
          vrdS t
          |         d         }d}|D ]6}|                     |          }t          |          D ]\  }}||k    r||f}7|S )z7Get the output name and index of the var_name in the opr   Nr   )r   r   r   r   r   r   r    r#   )	r   output_var_namer   r   r%   r   r   r'   vals	            r   _get_output_name_indexr,   ^   s    b68,--  4 - &b&11>bggiiirwG222t,W5a8I
C $ $99T??#H-- 	$ 	$JE3o%%Um	$ Jr   c                     |                      |          }|J d|z   dz               t          j        |                                          }|j        dk    r|                    d          S |S )z(
    Load variable value from scope
    NzCannot find z
 in scope. r   )find_varnparray
get_tensorshapereshape)scoper   var_nodetensors       r   load_variable_datar8   q   sr     ~~h''H(!:\!IXh))++,,F|r~~a   r   c                     t          |t          j                  s
J d            |                     |          }|,|                                }|                    ||           dS dS )z?
    Set the value of var node by name, if the node exits,
    z(The type of value should be numpy array.N)r   r0   ndarrayr/   r2   set)r5   placer   np_valuer6   r7   s         r   set_variable_datar>   ~   sy     h
++  2 + ~~h''H$$&&

8U##### r      Fc                    d }d|dz
  z  dz
  }t          |t                    rt          |          dk    r|d         }t          |t                    r3|dv s
J d            t          |          D ]\  }}|dk    rd}|dk    rp|rGt	          j        | |         |z  |z            | |<   t	          j        | |         | dz
  |          | |<   ] || |         |          | |<   | |         |z  |z  | |<   |rWt	          j        | d d |f         |z  |z            | d d |f<   t	          j        | d d |f         | dz
  |          | d d |f<    || d d |f         |          | d d |f<   | d d |f         |z  |z  | d d |f<   nU|dk    rdn|}|r5t	          j        | |z  |z            } t	          j        | | dz
  |          } n || |          } | |z  |z  } | S )Nc                 .    || | |k    <   | | | | k     <   | S Nr.   )xscales     r   _clipzquant_tensor.<locals>._clip   s%    !e)!uf*r   r   r   )r   r   $quant_axis should be 0 or 1 for now.        :0yE>)r   r   lenr#   r0   roundclip)	rC   rD   
quant_axisweight_bitsonnx_formatrE   bntiss	            r   quant_tensorrS      sT     
 q!Q
&C% 3u::??a%  Z''')O'''e$$ 	0 	0DAqCxxQ *8AaD1HsN33AaD71Q4#377AaDD 51q>>AaDQ4!8c>AaDD 0 hqAw{S'899AaaadG ga1gtax==AaaadGG#eAaaadGQ//AaaadG1gkC/AaaadGG!	0$ % 	 US))AC4!8S))AAaAE	CAHr   c                 $   |dv s
J d            d|dz
  z  dz
  }t          |t                    rOt          |          D ]>\  }}|dk    rd}|dk    r| |         |z  |z  | |<   %| d d |f         |z  |z  | d d |f<   ?n|dk    rdn|}| |z  |z  } | S )N)r   r   rG   r   rH   rI   r   )r   r   r#   )rC   rD   rM   rN   rP   rQ   rR   s          r   dequant_tensorrU      s    !Gq!Q
&C% 
e$$ 	, 	,DAqCxxQtax#~!AAAqD'A++!!!Q$	, %IOHr   c                 8    d}d|dz
  z  dz
  }|                                 t          |t                    r|dk    rt          |          D ]\  }}|         |z  |z  |<    z
                      j        d         d                              d          }	                      j        d         d                              d          }
                    j        d         d                              d          }|
||z   z  }n/t          |          D ]\  }}|dd|f         |z  |z  dd|f<    z
  t          j	        fdt          j        d                   D                       }	t          j	         fdt           j        d                   D                       }
t          j	        fdt          j        d                   D                       }|
||z   z  }nK||z  |z   z
                                  }	                                                                 |z   z  }|	j        dk    r4t          j        | j                  }t          j        |	 j                  }	|	z   |z  t          |||          }|S )	z$
    Bias correction for weight
    rI   r   r   rF   Nc                 L    g | ] }d d |f                                          !S rB   mean).0rQ   
quant_biass     r   
<listcomp>z%bias_correction_w.<locals>.<listcomp>   s2    MMMQAAAqD!&&((MMMr   c                 L    g | ] }d d |f                                          !S rB   std)rZ   rQ   rC   s     r   r\   z%bias_correction_w.<locals>.<listcomp>   s-     J J J1111a4 J J Jr   c                 L    g | ] }d d |f                                          !S rB   r^   )rZ   rQ   	x_dequants     r   r\   z%bias_correction_w.<locals>.<listcomp>   s1    JJJ1111a4$$&&JJJr   )copyr   r   r#   r4   r3   rY   r_   r0   r1   rangendimresizerS   )rC   x_quantscale_vrM   rN   epsrP   rQ   rR   	mean_biasstd_orig	std_quantstd_biasquantized_param_vr[   ra   s   `             @@r   bias_correction_wrn      s    Cq!Q
&CI'4   5??!'** 6 61(|a/#5	!YJ"**:+;A+>CCHHLLIyyR0044R88H!)))/!*<bAAEEbIII9s?3HH!'** : :1")!!!Q$-!"3c"9	!!!Q$YJMMMM%
8H8K2L2LMMM I x J J J Jagaj8I8I J J JKKHJJJJioa6H0I0IJJJ I  9s?3HHg%+	]((**	5577immoo34~9Xqw//Ii11	Y&(2I$7J  r   c           	          t          j        | dk     t          j        |           dt          j        |           z   z  ddt          j        |            z   z            }|S )Nr   r   )r0   whereexp)rC   sigs     r   stable_sigmoidrs      sJ    
(1q5"&))q26!99}5qAr

N7K
L
LCJr   c                 @   t          j        |                                 |                                          t           j                            |                                           t           j                            |                                          z  z  }|S rB   )r0   innerflattenlinalgnorm)orig_tensor
qdq_tensorcos_sims      r   calculate_quant_cos_errorr|      sv    h{**,,j.@.@.B.BCC
	{**,,--
)..++--
.
.	/G Nr   c                    |                                  }|j        D ]}|j        dk    r|                    d          j        }|                     |          }g }|j                                        D ]6\  }}|j        r*|	                    |           |
                    |           7|D ]}|                    |           |                    |                    d                     |j                            d|           d S )Nwhile	sub_blockX)global_blockopsr   attridblockvarsitemspersistable_clone_variabler   _remove_varr   r   desc	set_input)programr   _op	_block_id_blockpersistables_name_vars           r   $move_persistable_var_to_global_blockr      s   ''))L 2 28w--0I]]9--FL%{0022 / /t# / 00666 ''...% * *""5))))		#///HsL1112 2r   c                 6    | |z
  dz                                   S )N   rX   )gtpreds     r   l2_lossr     s    $Y1""$$$r   c                   *    e Zd Zd	dZd
dZd Zd ZdS )tqdmLoading|{bar}P   c                 >    || _         || _        || _        d| _        d S )Nr   )total
bar_formatncolsn)selfr   r   r   s       r   __init__ztqdm.__init__  s"    
$
r   r   c                    | xj         |z  c_         dt          | j         | j        z  | j        z            z  }d| j        t	          |          z
  z  }| j                            d          d         }t          j        	                    d| d| d| d| j          d| j         
           t          j        
                                 d S )	N=r   |r   z=>z| /)r   rK   r   r   rJ   r   splitsysstderrwriteflush)r   r   abprefixs        r   updateztqdm.update  s    !%$*,
:;;;4:A&'&&s++A.
FfFFqFFAFFFF$*FFGGG
r   c                     | S rB   r.   )r   s    r   	__enter__ztqdm.__enter__!  s    r   c                 D    t           j                            d           d S )N
)r   r   r   )r   exc_typeexc_valexc_tbs       r   __exit__ztqdm.__exit__$  s    
r   N)r   r   )r   )__name__
__module____qualname__r   r   r   r   r.   r   r   r   r     sZ                    r   r   )r   r?   F)r   r?   )r?   )r   numpyr0   base.frameworkr   r   quant_configr   _channelwise_quant_axis1_opsr   r!   r(   r,   r8   r>   rS   rU   rn   rs   r|   r   r   r   r.   r   r   <module>r      s^   


     . . . . . . . . 6 6 6 6 6 6        4  (  $  &
 
 

$ 
$ 
$% % % %P   "( ( ( (V  
  2 2 2$% % %         r   