o
    #j4                     @   s   d dl Z d dl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 dd	 ZG d
d deZG dd deZG dd deZG dd deZdS )    N)PyLayer)	ParamAttr)Constant)unique_name   )Layerc                 C   s&   t | }|t t | d  } | S )Ng      ?)paddlesignfloorabs)xr	    r   T/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/nn/quant/lsq.pyround   s   
r   c                   @   s&   e Zd ZedddZedd ZdS )	LsqFuncFr   c           
      C   s   |  || |||||f| _|rE|j}||j| df}|d}t||j}tt||	||}	|	| }	|	d}	|	|}	|	S tt||	||}	|	| }	|	S )N   r   )
save_for_backwardothershapereshape	transposer   broadcast_tor   divideclip)
ctxweightalphagQnQpper_channel
quant_axissizesZquant_wr   r   r   forward!   s   


zLsqFunc.forwardc                 C   sF  |   \}}| j\}}}}}|r:|j}	||j| df}|d}t||j}t||}
|
d}
|
|	}
nt||}
t|
|k d}t|
|kd}d| | }|r}|| ||  |t	|
  ||
  | | }||j| dfj
dd}n|| ||  |t	|
  ||
  | | 
 jddd }|| }||fS )Nr   r   float32      ?r   Zaxisr   )saved_tensorr   r   r   r   r   r   r   castr   sum	unsqueeze)r   Zgrad_weightr   r   r   r    r!   r"   r#   r$   Zq_w
lower_flag
upper_flagmiddle_flag
grad_alphar   r   r   backward3   sf   




	zLsqFunc.backwardN)Fr   __name__
__module____qualname__staticmethodr%   r1   r   r   r   r   r       s
    r   c                   @   s$   e Zd Zedd Zedd ZdS )LsqPlusActFuncc                 C   sB   |  ||| |||f| _tt|| |||}|| | S )N)r   r   r   r   r   r   )r   r   r   betar   r    r!   Zquant_xr   r   r   r%   f   s   zLsqPlusActFunc.forwardc                 C   s   |   \}}}| j\}}}|| | }t||k d}	t||kd}
d|	 |
 }|	| |
|  |t|  ||  | |  jddd }|	|
 | |  jddd }|| }|||fS )Nr&   r'   r   r(   )r)   r   r   r*   r   r+   r,   )r   Zgrad_xr   r   r8   r   r    r!   Zq_xr-   r.   r/   r0   Z	grad_betar   r   r   r1   m   s6   
	
zLsqPlusActFunc.backwardNr2   r   r   r   r   r7   e   s
    
r7   c                       s2   e Zd Z						d	 fdd	Zdd Z  ZS )
FakeQuantActLSQPlusF   r&   Nc                    s  t    	 || _|| _|| _|| _|| _|| _| jr'd| _d| j d | _	nd| jd   | _d| jd  d | _	|rA| dnd}t
|| _t| jtddd}	| jg |	d	d
| _d| j_| js|rj| dnd}
t
|
| _t| jtddd}| jg |d	d
| _d| j_d| _d S )Nr   r   r   .scalequant_dequant.scaler'   TnameZinitializerZ	trainabler&   r   attrdtypeFz.betazquant_dequant.betag        )super__init__bitsall_positive	symmetric
batch_initr>   reduce_typer    r!   r   generate_scale_namer   r   create_parametersstop_gradientZ
_beta_namer8   
init_state)self
quant_bitsall_postiverF   rG   rA   r>   rH   scale_prefixs_attrZbeta_prefixZ	beta_attr	__class__r   r   rC      s>   



zFakeQuantActLSQPlus.__init__c                 C   s  | j dkrtjj| jtjjjd | js%| j dkr%tjj| jtjjjd | j	dkrmt
dt| | j  | _t| }t| }| j|| | j| j   | jse| j|| j| j   |  j	d7  _	nN| j	| jk rt| }t| }| j| jd d||  | j| j    | js| j| jd d|| j| j     |  j	d7  _	n|  j	d7  _	d|_| jst|| j| j| j| j| j}|S tj|| j| j| j| jdd	}|S )
Nmaxopr   r'   r   ?皙?F)r"   )rH   r   distributed
all_reducerL   ReduceOpMAXrF   r8   rN   	to_tensormathsqrtnumelr!   r   mindetachrV   	set_valuer    rG   rM   r7   applyr   )rO   Z
activationZmin_aZmax_aZq_ar   r   r   r%      sP   

 zFakeQuantActLSQPlus.forward)FFr:   r&   NNr3   r4   r5   rC   r%   __classcell__r   r   rT   r   r9      s    <r9   c                       s6   e Zd Z								d	 fdd	Zdd Z  ZS )
FakeQuantWeightLSQPlusFr:   Nr&   c
                    s   t    	 || _|| _|| _|| _|| _|| _|rdnd| _|r#dnd| _	|	| _
| jr8d| _d| j d | _nd| jd   | _d| jd  d | _d| _|rU| dnd}
t|
| _t| jtddd}| j|g||d	| _d
| j_d S )Nr   r   r   r;   r<   r'   Tr=   r?   F)rB   rC   rD   rE   r"   quant_linearrG   r>   r#   collect_axisrH   r    r!   rN   r   rI   rJ   r   r   rK   rL   rM   )rO   rP   rQ   r"   rG   Zchannel_numrj   rA   r>   rH   rR   rS   rT   r   r   rC      s4   
zFakeQuantWeightLSQPlus.__init__c                 C   s  | j dkrtjj| jtjjjd | jdkrtdt	
| | j  | _d| j d | _| jrq| |jd df}tj|| jd}tj|| jd}tjtt|d	|  t|d	|  gdd}| j|| j  n)t| }t| }| jtt|d	|  t|d	|  g| j  |  jd7  _n| j| jk r2d| j d | _| jr| |jd df}tj|| jd}tj|| jd}tjtt|d	|  t|d	|  gdd}| j|d
 d| | j   n0t| }t| }| j| jd
 dtt|d	|  t|d	|  g | j   |  jd7  _n| j| jkr@|  jd7  _d|_t|| j| j| j| j| j| j }|S )NrV   rW   r   r'   r   r   r   r(      rY   rZ   F)!rH   r   r[   r\   rL   r]   r^   rN   r_   r`   ra   rb   r!   r   rD   divr"   rd   r   r   meanrk   stdrV   stackr   re   rG   rM   r   rf   r    r#   )rO   r   Z
weight_tmprn   ro   rL   Zw_qr   r   r   r%   .  s   

 """ "	zFakeQuantWeightLSQPlus.forward)FFr:   NFr&   NNrg   r   r   rT   r   ri      s    8ri   )r`   r   Zpaddle.autogradr   Zpaddle.frameworkr   Zpaddle.nn.initializerr   Zpaddle.utilsr   Zlayer.layersr   r   r   r7   r9   ri   r   r   r   r   <module>   s   E%k