o
    pi$                     @   s   d dl Z d dlZddlmZmZ ddlmZ g dZdd Z	d	d
 Z
dd Zdd Zdd Zdd Zd%ddZd&ddZd'ddZdd Zdd Zdd  Zd!d" ZG d#d$ d$ZdS )(    N   )IrNodeOperator   )SUPPORT_QUANTIZATION_OP_DICT)Zconv2d_transposemulmatmulZ	matmul_v2c                 C      t | ttfsJ dg }t | tr|  n| j}|tvrg S t| d }|D ]}| |}t |tr9|| q'|	| q'|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_name r   g/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/paddle/static/quantization/utils.py_get_op_input_var_names   s   

r   c                 C   r	   ) r
   r   )
r   r   r   r   r   r   outputr   r   r   r   r   r   r   _get_op_output_var_names8   s   

r   c                 C   s   t | ttfsJ dt | tr|  n| j}|tvrdS d}t| d D ]}| |}t|D ]\}}||kr<||f}q0q%|S )z6Get the input name and index of the var_name in the opr
   Nr   )r   r   r   r   r   r   r   	enumerate)r   Zinput_var_namer   resargnamer   indexr   r   r   r   _get_input_name_indexL   s   
r"   c           	      C   s   t | ttfsJ dt | tr|  n| j}|tvrdS t| d }d}|D ]}| |}t|D ]\}}||kr>||f}q2q'|S )z7Get the output name and index of the var_name in the opr
   Nr   )r   r   r   r   r   r   r   r   )	r   Zoutput_var_namer   r   r   r   r   r!   valr   r   r   _get_output_name_index^   s    
r$   c                 C   sH   |  |}|dusJ d| d t| }|jdkr"|dS |S )z(
    Load variable value from scope
    NzCannot find z
 in scope.r   r   )find_varnparray
get_tensorshapereshape)scoper   var_nodetensorr   r   r   load_variable_dataq   s   


r.   c                 C   sB   t |tjs
J d| |}|dur| }||| 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   r&   Zndarrayr%   r(   set)r+   Zplacer   Znp_valuer,   r-   r   r   r   set_variable_data~   s   
r0      Fc           	      C   s  dd }d|d > d }t |trt|dkr|d }t |tr|dv s(J dt|D ]\}}|dkr6d}|dkrl|rXt| | | | | |< t| | | d || |< q,|| | || |< | | | | | |< q,|rt| d d |f | | | d d |f< t| d d |f | d || d d |f< q,|| d d |f || d d |f< | d d |f | | | d d |f< q,| S |dkrdn|}|rt| | | } t| | d |} | S || |} | | | } | S )	Nc                 S   s    || | |k< | | | | k < | S Nr   )xscaler   r   r   _clip   s   zquant_tensor.<locals>._clipr   r   )r   r   $quant_axis should be 0 or 1 for now.        :0yE>)r   r   lenr   r&   roundZclip)	r3   r4   
quant_axisweight_bitsZonnx_formatr5   bntisr   r   r   quant_tensor   s:   
*."&	
rA   c                 C   s   |dv sJ dd|d > d }t |trGt|D ]+\}}|dkr#d}|dkr2| | | | | |< q| d d |f | | | d d |f< q| S |dkrMdn|}| | | } | S )N)r   r   r7   r   r8   r9   r   )r   r   r   )r3   r4   r<   r=   r>   r?   r@   r   r   r   dequant_tensor   s   
&rB   c                    s  d}d|d > d }|  t|tr|dkrYt|D ]\}}| | | |< q    jd dd}	jd dd}
jd dd}|
||  }not|D ]\}}|dd|f | | dd|f< q]  t	 fddt
 jd D }	t	fddt
jd D }
t	fd	dt
jd D }|
||  }n|| |   }	  |  }|	jdkrt|j}t|	j}	|	 | t|||}|S )
z$
    Bias correction for weight
    r9   r   r   r6   Nc                        g | ]} d d |f   qS r2   mean.0r?   )
quant_biasr   r   
<listcomp>        z%bias_correction_w.<locals>.<listcomp>c                    rC   r2   stdrF   )r3   r   r   rI      rJ   c                    rC   r2   rK   rF   )	x_dequantr   r   rI      rJ   )copyr   r   r   r*   r)   rE   rL   r&   r'   rangendimresizerA   )r3   Zx_quantZscale_vr<   r=   Zepsr>   r?   r@   Z	mean_biasZstd_origZ	std_quantZstd_biasZquantized_param_vr   )rH   r3   rM   r   bias_correction_w   sD   
&"
rR   c              	   C   s:   t | dk t | dt |   ddt |    }|S )Nr   r   )r&   whereexp)r3   sigr   r   r   stable_sigmoid   s   6rV   c                 C   s8   t |  | t j|  t j|   }|S r2   )r&   innerflattenZlinalgZnorm)Zorig_tensorZ
qdq_tensorZcos_simr   r   r   calculate_quant_cos_error   s   rY   c                 C   s   |   }|jD ]D}|jdkrK|dj}| |}g }|j D ]\}}|jr1|	| |
| q |D ]}|| q4||d |jd| qd S )NwhileZ	sub_blockX)global_blockopsr   attridblockvarsitemsZpersistableZ_clone_variabler   Z_remove_varr   r   ZdescZ	set_input)programr\   Z_opZ	_block_id_blockZpersistables_nameZ_varr   r   r   $move_persistable_var_to_global_block   s"   




rf   c                 C   s   | | d   S )N   rD   )gtpredr   r   r   l2_loss     rj   c                   @   s0   e Zd ZdddZdddZdd	 Zd
d ZdS )tqdmLoading|{bar}P   c                 C   s   || _ || _|| _d| _d S )Nr   )total
bar_formatncolsn)selfro   rp   rq   r   r   r   __init__  s   
ztqdm.__init__r   c                 C   s   |  j |7  _ dt| j | j | j  }d| jt|  }| jdd }tj	d| d| d| d| j  d| j 
 tj
  d S )	N=r   |r   z=>z| /)rr   r;   ro   rq   r:   rp   splitsysstderrwriteflush)rs   rr   abprefixr   r   r   update  s   .ztqdm.updatec                 C   s   | S r2   r   )rs   r   r   r   	__enter__!  s   ztqdm.__enter__c                 C   s   t jd d S )N
)rz   r{   r|   )rs   exc_typeexc_valexc_tbr   r   r   __exit__$  rk   ztqdm.__exit__N)rm   rn   )r   )__name__
__module____qualname__rt   r   r   r   r   r   r   r   rl     s
    

rl   )r   r1   F)r   r1   )r1   )rz   numpyr&   Zbase.frameworkr   r   Zquant_configr   Z_channelwise_quant_axis1_opsr   r   r"   r$   r.   r0   rA   rB   rR   rV   rY   rf   rj   rl   r   r   r   r   <module>   s&   

(
+