o
    Tӵi                     @   sr   d dl mZ d dlZd dlmZ d dlm  mZ d dlm	Z	 ddl
mZ G dd dejZG dd	 d	ejZdS )
    )ListN)	rearrange   )WNConv1dc                	       sP   e Zd Zddedededef fddZdd	 Zd
d Zdd Zdd Z  Z	S )VectorQuantizer   	input_dimcodebook_sizecodebook_dimstridec                    sN   t    || _|| _|| _t||dd| _t||dd| _t	||| _
d S )Nr   )kernel_size)super__init__r   r	   r
   r   in_projout_projnn	Embeddingcodebook)selfr   r   r	   r
   	__class__ ;/home/ubuntu/.local/lib/python3.10/site-packages/snac/vq.pyr      s   
zVectorQuantize.__init__c                 C   st   | j dkrtjj|| j | j }| |}| |\}}|||   }| |}| j dkr6|j	| j dd}||fS )Nr   dim)
r
   torchr   
functional
avg_pool1dr   decode_latentsdetachr   repeat_interleave)r   zz_ez_qindicesr   r   r   forward   s   



zVectorQuantize.forwardc                 C   s   t || jjS )N)F	embeddingr   weightr   embed_idr   r   r   
embed_code&   s   zVectorQuantize.embed_codec                 C   s   |  |ddS )Nr      )r+   	transposer)   r   r   r   decode_code)   s   zVectorQuantize.decode_codec                 C   s   t |d}| jj}t|}t|}|djdddd| |   |djddd  }t | dd d|	dd}| 
|}||fS )	Nzb d t -> (b t) dr,   r   T)keepdimz(b t) -> b tr   )b)r   r   r(   r&   	normalizepowsumtmaxsizer.   )r   latents	encodingsr   distr$   r#   r   r   r   r   ,   s   


 
zVectorQuantize.decode_latents)r   )
__name__
__module____qualname__intr   r%   r+   r.   r   __classcell__r   r   r   r   r      s     
r   c                
       sb   e Zd Zdddg dfdedededee f fd	d
Zdd Zdeej dejfddZ	  Z
S )ResidualVectorQuantizei   i      )r   r   r   r   r   r   r	   
vq_stridesc                    sB   t    t|| _ | _| _t fdd|D | _d S )Nc                    s   g | ]	}t  |qS r   )r   ).0r
   r	   r   r   r   r   
<listcomp>L   s    z3ResidualVectorQuantize.__init__.<locals>.<listcomp>)	r   r   lenn_codebooksr	   r   r   
ModuleList
quantizers)r   r   r   r	   rA   r   rC   r   r   @   s   


zResidualVectorQuantize.__init__c           	      C   sN   d}|}g }t | jD ]\}}||\}}|| }|| }|| q||fS )Nr   )	enumeraterH   append)	r   r!   r#   residualcodesi	quantizerz_q_i	indices_ir   r   r   r%   O   s   zResidualVectorQuantize.forwardrL   returnc                 C   sZ   d}t | jD ]#}| j| || }| j| |}|j| j| jdd}||7 }q|S )Ng        r   r   )rangerF   rH   r.   r   r    r
   )r   rL   r#   rM   z_p_irO   r   r   r   
from_codes[   s   
z!ResidualVectorQuantize.from_codes)r:   r;   r<   r=   r   r   r%   r   TensorrT   r>   r   r   r   r   r?   ?   s     "r?   )typingr   r   torch.nnr   torch.nn.functionalr   r&   einopsr   layersr   Moduler   r?   r   r   r   r   <module>   s    4