B
    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   é   é   g      à¿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 )Ng      ð?)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
   r-   )r   Úgrad_outputr    r!   r"   r1   r   r   r   Úbackward1   s    
 zSqrtHingeLossFunction.backward)r%   r&   r'   r   r$   r8   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   g      à¿)	r   r   r   r,   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 )N)r   r<   r   )r   ÚkargsÚkwargs)r   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Úcloner?   Ú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   r<   E   s   r<   c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚBinarizeConv2dc                s   t t| ƒj||Ž d S )N)r   rK   r   )r   r=   r>   )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   é   r?   r   )r   r   r@   rA   rB   rC   r?   rD   rE   Úconv2dÚstrideÚpaddingÚdilationÚgroupsrG   rH   rI   )r   r    rJ   r   r   r   r$   ^   s    
zBinarizeConv2d.forward)r%   r&   r'   r   r$   r(   r   r   )r   r   rK   X   s   rK   c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚBinarizeConv1dc                s   t t| ƒj||Ž d S )N)r   rR   r   )r   r=   r>   )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 )Nr   rL   r?   r   )r   r   r@   rA   rB   rC   r?   rD   rE   Úconv1drN   rO   rP   rQ   rG   rH   rI   )r   r    rJ   r   r   r   r$   s   s    
zBinarizeConv1d.forward)r%   r&   r'   r   r$   r(   r   r   )r   r   rR   o   s   rR   )r   )r   Nr9   )r   r1   Útorch.nnrD   ÚmathZtorch.autogradr   r   ÚnumpyÚnpr   ÚModuler   r)   r;   ÚLinearr<   ÚConv2drK   ÚConv1drR   r   r   r   r   Ú<module>   s   
	

