o
    ̳i                     @   s>   d dl Z d dlZd dlmZ ddlmZ G dd dejZdS )    N)nn   )FactorizedVectorQuantizec                       s6   e Zd Z fddZdd Zd
ddZdd	 Z  ZS )
ResidualVQc                   sJ   t    t t|tkr|g| }t fdd|D | _|| _d S )Nc                    s   g | ]} dd |iqS )codebook_size r   ).0sizeVQkwargsr   J/home/ubuntu/.local/lib/python3.10/site-packages/xcodec2/vq/residual_vq.py
<listcomp>   s    z'ResidualVQ.__init__.<locals>.<listcomp>)	super__init__r   typeintr   
ModuleListlayersnum_quantizers)selfr   r   r   	__class__r
   r   r      s   


zResidualVQ.__init__c                 C   s|   d}|}g }g }t | jD ]!\}}||\}}	}
|| }|| }|
 }
||	 ||
 qttj||f\}}|||fS )N        )	enumerater   meanappendmaptorchstack)r   xquantized_outresidual
all_lossesall_indicesidxlayer	quantizedindiceslossr   r   r   forward   s   

zResidualVQ.forwardTc                 C   sD   d}t | jD ]\}}|j|d d d d |f |d}|| }q|S )Nr   )proj)r   r   vq2emb)r   vqr+   r!   r%   r&   r'   r   r   r   r,   *   s
    
zResidualVQ.vq2embc                 C   s*   g }t | jD ]\}}||  q|S )N)r   r   r   get_emb)r   embsr%   r&   r   r   r   r.   1   s   zResidualVQ.get_emb)T)__name__
__module____qualname__r   r*   r,   r.   __classcell__r   r   r   r   r      s
    
r   )mathr   r   factorized_vector_quantizer   Moduler   r   r   r   r   <module>   s
    