o
    h1                     @   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
J dt| }t|j|j|j|j|j|j|j|\|_|_|S NzFusion only for eval!)	trainingcopydeepcopyfuse_conv_bn_weightsweightbiasrunning_meanrunning_vareps)convbn	transpose
fused_conv r   K/var/www/html/ai/venv/lib/python3.10/site-packages/torch/nn/utils/fusion.pyfuse_conv_bn_eval   s   


r   c                 C   s   | j }|d ur
|j n|}	|d u rt|}|d u rt|}|d u r't|}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_like	ones_likersqrtlenshapereshapetonn	Parameterrequires_grad)conv_wconv_bbn_rmbn_rvbn_epsbn_wbn_br   conv_weight_dtypeconv_bias_dtypebn_var_rsqrtr   fused_conv_wfused_conv_br   r   r   r      s   


 r   c                 C   sL   | j s|j r
J dt| }t|j|j|j|j|j|j|j\|_|_|S r   )	r   r   r   fuse_linear_bn_weightsr   r   r	   r
   r   )linearr   fused_linearr   r   r   fuse_linear_bn_eval%   s   
r1   c           
      C   sb   |d u r	t |}|t ||  }| |d }|| | | }	t j|| jt j|	|jfS )Nr   )r   r   r   	unsqueezer   r    r!   )
linear_wlinear_br$   r%   r&   r'   r(   bn_scalefused_wfused_br   r   r   r.   /   s   
 r.   )F)r   r   r   r   r1   r.   r   r   r   r   <module>   s   



