o
    ϯiq                     @   s   d dl Z d dlZd dlmZ d dlm  mZ d dlmZ ej	j
dd ZdefddZG dd	 d	ejZddejdefddZG dd dejZG dd dejZG dd dejjZdS )    Nweight_normc                 C   sN   | j }| |d |d d} | |d  t||  d  } | |} | S )Nr      g&.>   )shapereshape
reciprocaltorchsinpow)xalphar    r   D/home/ubuntu/.local/lib/python3.10/site-packages/dacvae/nn/layers.pysnake   s
   $
r   actc                 K   sL   | dkrt jdi |S | dkrtdi |S | dkrt  S td|  )NELUSnakeTanhzUnsupported activation: r   )nnr   Snake1dr   
ValueError)r   
act_paramsr   r   r   
activation   s   r   c                       s$   e Zd Z fddZdd Z  ZS )r   c                    s$   t    ttd|d| _d S )Nr   )super__init__r   	Parameterr
   onesr   )selfchannels	__class__r   r   r   '   s   
zSnake1d.__init__c                 C   s   t || jS N)r   r   r   r   r   r   r   forward+   s   zSnake1d.forward)__name__
__module____qualname__r   r%   __classcell__r   r   r!   r   r   &   s    r   nonemodulenormc                 C   s    |dv sJ |dkrt | S | S )N)r*   r   r   r   )r+   r,   r   r   r   apply_parametrization_norm/   s   r-   c                       sr   e Zd ZdZ					ddededed	ed
edededef fddZdej	fddZ
dej	f fddZ  ZS )
NormConv1dz"1D Causal Convolution with paddingr   r   Fr*   in_channelsout_channelskernel_sizestridedilationr,   causalpad_modec	              	      sX   |dkr|| | d }
nd}
t  jd|||||
|d|	 t| | || _|| _d S )Nr*   r   r   )r/   r0   r1   r2   paddingr3   r   r   r   r-   r4   r5   )r   r/   r0   r1   r2   r3   r,   r4   r5   kwargspadr!   r   r   r   9   s    


zNormConv1d.__init__r   c                 C   s   | j dkr|S |jd }t| jtr| jn| jd }t| jtr#| jn| jd }t| jtr1| jn| jd }|d | d }|| }|| | | d }t|d | ||  }	|	| }
| j	rjt
|||
f}|S |
d }|| }t
||||
 f}|S )Nr*   r   r   r   r   )r5   r   
isinstancer1   intr3   r2   mathceilr4   Fr9   )r   r   lengthr1   r3   r2   effective_kernel_sizepadding_totaln_framesideal_lengthextra_paddingpad_xpadding_rightpadding_leftr   r   r   r9   Y   s$   

zNormConv1d.padc                    s   |  |}t |S r#   )r9   r   r%   r$   r!   r   r   r%   q   s   
zNormConv1d.forwardr   r   r   Fr*   )r&   r'   r(   __doc__r;   strboolr   r
   Tensorr9   r%   r)   r   r   r!   r   r.   6   s4    	 r.   c                       sj   e Zd ZdZ					ddededed	ed
edededef fddZdej	fddZ
 fddZ  ZS )NormConvTranspose1dz&1D Transposed Convolution with paddingr   r   Fr*   r/   r0   r1   r2   r3   r,   r4   r5   c	              
      sj   |dkr|d d }
|d rdnd}nd}
d}t  jd||||||
|d|	 t| |} || _|| _d S )Nr*   r   r   r   )r/   r0   r1   r2   r3   r6   output_paddingr   r7   )r   r/   r0   r1   r2   r3   r,   r4   r5   r8   r6   rN   r!   r   r   r   x   s&   

zNormConvTranspose1d.__init__r   c           	      C   s   | j dkr|S |jd }t| jtr| jn| jd }t| jtr#| jn| jd }|| }| jr6d}|| }n|d }|| }|| }|d||f }|S )Nr*   r   r   r   .)r5   r   r:   r1   r;   r2   r4   )	r   r   r?   r1   r2   rA   rG   endrF   r   r   r   unpad   s   


zNormConvTranspose1d.unpadc                    s   t  |}| |S r#   )r   r%   rP   )r   r   yr!   r   r   r%      s   
zNormConvTranspose1d.forwardrH   )r&   r'   r(   rI   r;   rJ   rK   r   r
   rL   rP   r%   r)   r   r   r!   r   rM   u   s4    	"rM   c                       sF   e Zd ZdZdedef fddZdejdejdejfd	d
Z  Z	S )MsgProcessorz
    Apply the secret message to the encoder output.
    Args:
        nbits: Number of bits used to generate the message. Must be non-zero
        hidden_size: Dimension of the encoder output
    nbitshidden_sizec                    s<   t    |dksJ d|| _|| _td| || _d S )Nr   z5MsgProcessor should not be built in 0bit watermarkingr   )r   r   rS   rT   r   	Embeddingmsg_processor)r   rS   rT   r!   r   r   r      s
   
zMsgProcessor.__init__hiddenmsgreturnc                 C   sv   dt |jd |j }||jd d}||  }| |}|jdd}|	ddd|jd }|| }|S )z
        Build the embedding map: 2 x k -> k x h, then sum on the first dim
        Args:
            hidden: The encoder output, size: batch x hidden x frames
            msg: The secret message, size: batch x k
        r   r   r   r   )dim)
r
   aranger   todevicerepeatlongrV   sum	unsqueeze)r   rW   rX   indicesmsg_auxr   r   r   r%      s   	

zMsgProcessor.forward)
r&   r'   r(   rI   r;   r   r
   rL   r%   r)   r   r   r!   r   rR      s    $rR   )r*   )r<   r
   torch.nnr   torch.nn.functional
functionalr>   torch.nn.utilsr   jitscriptr   rJ   r   Moduler   r-   Conv1dr.   ConvTranspose1drM   rR   r   r   r   r   <module>   s   
	?>