U
    l,5_ã  ã                   @   s´   d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ d dlZ	ddd„Z
G dd„ dejƒZG d	d
„ d
eƒZddd„ZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZdS )é    N)ÚVariable)ÚFunctionÚdetc                 C   sR   |dkr|   ¡ S |  d¡ d¡ t |  ¡ ¡ d¡¡ dd¡ ¡  	d¡ d¡S d S )Nr   é   é   ç      à¿r   éÿÿÿÿ)
ÚsignÚadd_Údiv_ÚtorchÚrandÚsizeÚaddÚclamp_ÚroundÚmul_)ÚtensorÚ
quant_mode© r   ú</nfs/NASDELL/best/cacha_detec/custom_NN/binarized_modules.pyÚBinarize   s    r   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )Ú	HingeLossc                    s   t t| ƒ ¡  d| _d S ©Ng      ð?)Úsuperr   Ú__init__Úmargin©Úself©Ú	__class__r   r   r      s    zHingeLoss.__init__c                 C   s&   | j | |¡ }d|| d¡< | ¡ S )Nr   )r   ÚmulÚleÚmean)r   ÚinputÚtargetÚoutputr   r   r   Ú
hinge_loss   s    zHingeLoss.hinge_lossc                 C   s   |   ||¡S ©N)r'   )r   r$   r%   r   r   r   Úforward"   s    zHingeLoss.forward)Ú__name__Ú
__module__Ú__qualname__r   r'   r)   Ú__classcell__r   r   r   r   r      s   r   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚSqrtHingeLossFunctionc                    s   t t| ƒ ¡  d| _d S r   )r   r.   r   r   r   r   r   r   r   &   s    zSqrtHingeLossFunction.__init__c                 C   sN   | j | |¡ }d|| d¡< |  ||¡ | |¡ d¡ d¡ | ¡ ¡}|S )Nr   r   )r   r!   r"   Úsave_for_backwardÚsumÚdivÚnumel)r   r$   r%   r&   Úlossr   r   r   r)   *   s
     zSqrtHingeLossFunction.forwardc                 C   s~   | j \}}| j| |¡ }d|| d¡< dd l}| ¡  | |¡ |¡ d¡ |¡ | | 	d¡ 
¡ ¡ | | ¡ ¡ ||fS )Nr   éþÿÿÿ)Úsaved_tensorsr   r!   r"   ÚpdbÚ	set_traceÚ
resize_as_Úcopy_r   ÚneÚfloatr   r2   )r   Úgrad_outputr$   r%   r&   r6   r   r   r   Úbackward1   s    
 zSqrtHingeLossFunction.backward)r*   r+   r,   r   r)   r=   r-   r   r   r   r   r.   %   s   r.   é   c                 C   s”   |   d|d   d|d  ¡ |dkrL|  d|d  ¡ ¡  d|d  ¡} nD|  d|d  ¡ ¡  t |  ¡ ¡ d¡¡ d|d  ¡} t| |ƒ | S )Nr   r   r   r   )	r   r!   r   r1   r   r   r   r   Zquant_fixed)r   r   ÚparamsZnumBitsr   r   r   ÚQuantize;   s    &:
r@   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚBinarizeLinearc                    s   t t| ƒj||Ž d S r(   )r   rA   r   ©r   ÚkargsÚkwargsr   r   r   r   G   s    zBinarizeLinear.__init__c                 C   sŒ   |  d¡dkrt|jƒ|_t| jdƒs6| jj ¡ | j_t| jjƒ| j_tj 	|| j¡}| j
d k	rˆ| j
j ¡ | j
_|| j
 dd¡ |¡7 }|S )Nr   i  Úorgr   )r   r   ÚdataÚhasattrÚweightÚclonerE   ÚnnÚ
functionalÚlinearÚbiasÚviewÚ	expand_as©r   r$   Úoutr   r   r   r)   J   s    
zBinarizeLinear.forward©r*   r+   r,   r   r)   r-   r   r   r   r   rA   E   s   rA   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚBinarizeConv2dc                    s   t t| ƒj||Ž d S r(   )r   rS   r   rB   r   r   r   r   Z   s    zBinarizeConv2d.__init__c              	   C   s¢   |  d¡dkrt|jƒ|_t| jdƒs6| jj ¡ | j_t| jjƒ| j_tj 	|| jd | j
| j| j| j¡}| jd k	rž| jj ¡ | j_|| j dddd¡ |¡7 }|S ©Nr   é   rE   r   )r   r   rF   rG   rH   rI   rE   rJ   rK   Úconv2dÚstrideÚpaddingÚdilationÚgroupsrM   rN   rO   rP   r   r   r   r)   ^   s      ÿ
zBinarizeConv2d.forwardrR   r   r   r   r   rS   X   s   rS   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚBinarizeConv1dc                    s   t t| ƒj||Ž d S r(   )r   r[   r   rB   r   r   r   r   p   s    zBinarizeConv1d.__init__c              	   C   s    |  d¡dkrt|jƒ|_t| jdƒs6| jj ¡ | j_t| jjƒ| j_tj 	|| jd | j
| j| j| j¡}| jd k	rœ| jj ¡ | j_|| j ddd¡ |¡7 }|S rT   )r   r   rF   rG   rH   rI   rE   rJ   rK   Úconv1drW   rX   rY   rZ   rM   rN   rO   rP   r   r   r   r)   s   s      ÿ
zBinarizeConv1d.forwardrR   r   r   r   r   r[   o   s   r[   )r   )r   Nr>   )r   r6   Útorch.nnrJ   ÚmathZtorch.autogradr   r   ÚnumpyÚnpr   ÚModuler   r.   r@   ÚLinearrA   ÚConv2drS   ÚConv1dr[   r   r   r   r   Ú<module>   s   
	

