U
    9%e1                     @   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/Darija-Ai-API/env/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
   



