U
    •Ê¹j1  ã                   @   s8   d dl Z d dlZddd„Zddd„Zdd„ Zd	d
„ ZdS )é    NFc              	   C   sN   | j s|j rtdƒ‚t | ¡}t|j|j|j|j|j	|j|j|ƒ\|_|_|S ©NzFusion only for eval!)
ÚtrainingÚAssertionErrorÚcopyÚdeepcopyÚfuse_conv_bn_weightsÚweightÚbiasÚrunning_meanÚrunning_varÚeps)ÚconvÚbnÚ	transposeZ
fused_conv© r   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/nn/utils/fusion.pyÚfuse_conv_bn_eval   s    

     ÿÿ
r   c                 C   sð   | j }|d k	r|j n|}	|d kr*t |¡}|d kr<t |¡}|d krNt |¡}t || ¡}
|r~ddgdgt| jƒd   }nddgdgt| jƒd   }| ||
  |¡ j|d�}|| |
 | | j|	d�}tj	 
|| j¡tj	 
||j¡fS )Né   éÿÿÿÿé   )Údtype)r   ÚtorchÚ
zeros_likeZ	ones_likeÚrsqrtÚlenÚshapeZreshapeÚtoÚnnÚ	ParameterÚrequires_grad)Zconv_wZconv_bÚbn_rmÚbn_rvÚbn_epsÚbn_wÚbn_br   Zconv_weight_dtypeZconv_bias_dtypeZbn_var_rsqrtr   Zfused_conv_wZfused_conv_br   r   r   r      s    


r   c                 C   sL   | j s|j rtdƒ‚t | ¡}t|j|j|j|j|j	|j|jƒ\|_|_|S r   )
r   r   r   r   Úfuse_linear_bn_weightsr   r	   r
   r   r   )Zlinearr   Zfused_linearr   r   r   Úfuse_linear_bn_eval%   s    
     þr&   c           
      C   sb   |d krt  |¡}|t  || ¡ }| | d¡ }|| | | }	t j || j¡t j |	|j¡fS )Nr   )r   r   r   Z	unsqueezer   r   r   )
Zlinear_wZlinear_br    r!   r"   r#   r$   Zbn_scaleZfused_wZfused_br   r   r   r%   /   s    
r%   )F)F)r   r   r   r   r&   r%   r   r   r   r   Ú<module>   s
   



