
    Pi!                         d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlmZm	Z	 d dl
mc mZ d dlmZ d dlmZ d dlmZmZmZmZmZ d d	lmZ d
 Zd Zd Z G d de          Z G d de          ZdS )    N)log2)partial)nn)Module
ModuleList)autocast)LFQ)	rearrangerepeatreducepackunpack)get_atc                 
    | d uS N )vals    x/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vector_quantize_pytorch/residual_lfq.pyexistsr      s    d?    c                 (    t          |           r| n|S r   )r   )r   ds     r   defaultr      s    ++$331$r   c                 ,    t          | |z            |z  S r   )ceil)nummults     r   round_up_multipler      s    d
d""r   c                   ^     e Zd ZdZddddd fd
Zed             Zd	 Zd
 Z	 	 	 ddZ	 xZ
S )ResidualLFQz> Follows Algorithm 1. in https://arxiv.org/pdf/2107.03312.pdf Fr      N)quantize_dropoutquantize_dropout_cutoff_indexquantize_dropout_multiple_ofsoft_clamp_input_valuec                   t                                                       t          t          |                    }	|	|k    }
|
rt	          j        ||	          nt	          j                    | _        |
rt	          j        |	|          nt	          j                    | _        |
| _	        || _
        t	          j        g           | _        t          |          D ]F}d| z  }t          d|	||d|}| j                            |           t!          |          r|dz  }Gt#          d | j        D                       sJ |o|dk    | _        |dk    sJ || _        || _        d S )N   )dimcodebook_scaler%   g      ?c                     g | ]
}|j          S r   )has_projections).0lfqs     r   
<listcomp>z(ResidualLFQ.__init__.<locals>.<listcomp>H   s    CCC++CCCr   r!   r   r   )super__init__intr   r   LinearIdentity
project_inproject_outr+   num_quantizersr   layersranger	   appendr   allr"   r#   r$   )selfr(   r6   codebook_sizer"   r#   r$   r%   kwargscodebook_dimrequires_projectionindr)   r-   	__class__s                 r   r0   zResidualLFQ.__init__!   s    	4..//*c1:M`")C666SUS^S`S`;Na29\3777TVT_TaTa2,mB''(( 	. 	.C3$YN "!/)?  	 C Ks###,-- .&#-&CCt{CCCDDDDD 0 G^a5G,1111-J*,H)))r   c                 T    d | j         D             }t          j        |d          }|S )Nc                     g | ]	}|j         
S r   )codebook)r,   layers     r   r.   z)ResidualLFQ.codebooks.<locals>.<listcomp>S   s    ===U^===r   r   r(   )r7   torchstack)r;   	codebookss     r   rI   zResidualLFQ.codebooksQ   s1    =====	K	333	r   c                    |j         d         |j         d         }}t          |gd          \  }}|| j        k     r6| j        dk    s
J d            t	          j        |d| j        |z
  fd          }|dk    }|                    |d          }t          d| j        |          }|                    t          |d	          d          }t          ||d
          \  }|S )Nr   zb * q        zmquantize dropout must be greater than 0 if you wish to reconstruct from a signal with less fine quantizations)value      zq [c] d, b n q -> q b n dzb n q -> q b n 1zq b * d)shaper   r6   r"   Fpadmasked_fillr   rI   r
   r   )r;   indicesbatchquantize_dimpsmask	all_codess          r   get_codes_from_indicesz"ResidualLFQ.get_codes_from_indicesW   s    %mA.b0A| G9g..
 $---(2---  0_---eGa)<|)K%LVXYYYG #~%%dA..6PP	 )))D:L*M*MrRR	 Ir955
	r   c                 x    |                      |          }t          |dd          }|                     |          S )Nzq ... -> ...sum)rY   r   r5   )r;   rS   codescodes_summeds       r   get_output_from_indicesz#ResidualLFQ.get_output_from_indicesw   s:    ++G44e^U;;---r   c                 J   | j         | j        |j        }}}|                     |          }d}|}	g }
g }| j        o| j        }|rt          |          rt          j        |          nt          }|	                    | j
        |          }|dk    rt          |dz   |          dz
  }t          j        |j        d d         d|t          j                  }t          j        d||j                  }t%          dd          5  t'          | j                  D ]\  }}|r1||k    r+|                    |           |
                    |           8 ||	|	          \  }}}|	|                                z
  }	||z   }|                    |           |
                    |           	 d d d            n# 1 swxY w Y   |                     |          }t1          t3          t          j        d
          |
|f          \  }
}|||
f}|s|S |                     |          }g ||R S )NrL   r!   r'   rN   )devicedtypecudaF)enabled)rW   rK   rF   )r6   r$   r`   r4   trainingr"   r   randomRandom	randranger#   r   rG   fullrO   longtensorra   r   	enumerater7   r9   detachr5   mapr   rH   rY   )r;   xrW   return_all_codes rand_quantize_dropout_fixed_seed	num_quantquant_dropout_multiple_ofr`   quantized_outresidual
all_lossesall_indicesshould_quantize_dropoutrandrand_quantize_dropout_indexnull_indices	null_lossquantizer_indexrE   	quantizedrS   lossretrX   s                           r   forwardzResidualLFQ.forward|   s    8<7JDLmopowf,	OOA
"&-"ID4I
 # 		KFLMmFnFnz6=!ABBBtzD*...9[]f*g*g'(A--.?@[^_@_az.{.{~.+ :agbqbk3QVQ[\\\LR&!'JJJI f... 	( 	(*3DK*@*@ ( (&* A\/\/\&&|444%%i000+05$+G+G+G(	7D#i&6&6&8&88 -	 9""7+++!!$''''(	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	($ ((77 #&gek&D&D&DzS^F_"`"`
Kk:6 	J //<<	 ! i   s    B%F22F69F6)NFN)__name__
__module____qualname____doc__r0   propertyrI   rY   r^   r   __classcell__rA   s   @r   r    r       s        HH !()'(!%.I .I .I .I .I .I .I`   X
  @. . .  +/F! F! F! F! F! F! F! F!r   r    c                   j     e Zd Zddd fd
Zed             Zed             Zd Zd Z	 	 dd
Z	 xZ
S )GroupedResidualLFQr!   F)groupsaccept_image_fmapc                4   t                                                       || _        || _        ||z  dk    sJ ||z  }|| _        t          j        g           | _        t          |          D ](}| j        	                    t          dd|i|           )d S )Nr   r(   r   )r/   r0   r(   r   r   r   r   rvqsr8   r9   r    )r;   r(   r   r   r=   dim_per_group_rA   s          r   r0   zGroupedResidualLFQ.__init__   s     	f""""v!2M"%%	v 	 	AI[  #     	 	r   c                 b    t          j        t          d | j        D                                 S )Nc              3   $   K   | ]}|j         V  d S r   )rI   )r,   rvqs     r   	<genexpr>z/GroupedResidualLFQ.codebooks.<locals>.<genexpr>   s$       D D3 D D D D D Dr   )rG   rH   tupler   r;   s    r   rI   zGroupedResidualLFQ.codebooks   s+    {5 D D$) D D DDDEEEr   c                     | j         rdndS )Nr!   rK   )r   r   s    r   	split_dimzGroupedResidualLFQ.split_dim   s    *2qq2r   c                     t          d t          | j        |          D                       }t          j        |          S )Nc              3   F   K   | ]\  }}|                     |          V  d S r   )rY   r,   r   chunk_indicess      r   r   z<GroupedResidualLFQ.get_codes_from_indices.<locals>.<genexpr>   s5      rrDVCc00??rrrrrrr   )r   zipr   rG   rH   )r;   rS   r\   s      r   rY   z)GroupedResidualLFQ.get_codes_from_indices   s>    rrZ]^b^gipZqZqrrrrr{5!!!r   c                     t          d t          | j        |          D                       }t          j        || j                  S )Nc              3   F   K   | ]\  }}|                     |          V  d S r   )r^   r   s      r   r   z=GroupedResidualLFQ.get_output_from_indices.<locals>.<genexpr>   s5      uuGYsM33MBBuuuuuur   rF   )r   r   r   rG   catr   )r;   rS   outputss      r   r^   z*GroupedResidualLFQ.get_output_from_indices   sE    uu]`aeajls]t]tuuuuuy7777r   Nc           
         |j         | j        }}||         | j        k    sJ |                    | j        |          }t          ||t          j        dt          d                              t          fdt          | j        |          D                       }t          t          |           }|^}}}	}
t          j        ||          }t          j        |          }t          j        |	          }	|||	g|
R }|S )NrF   r   g    cA)rW   ro   rp   c              3   0   K   | ]\  }} ||fi V  d S r   r   )r,   r   chunkforward_kwargss      r   r   z-GroupedResidualLFQ.forward.<locals>.<genexpr>  s9      UUZS%CC0000UUUUUUr   )rO   r   r(   r   r   dictre   randintr1   r   r   r   rG   r   rH   )r;   rn   rW   ro   rO   r   outr}   rv   commit_lossesmaybe_all_codesr   r   s               @r   r   zGroupedResidualLFQ.forward   s    7DNyY48++++ GGDKyG11//5~aS/J/J
 
 
 UUUU3tyRSCTCTUUUUUCI CF?	;Iiy999	k+..M22+}GGG
r   )NF)r   r   r   r0   r   rI   r   rY   r^   r   r   r   s   @r   r   r      s        
 !      0 F F XF 3 3 X3" " "8 8 8  	! ! ! ! ! ! ! !r   r   )re   mathr   	functoolsr   rG   r   torch.nnr   r   torch.nn.functional
functionalrP   	torch.ampr   0vector_quantize_pytorch.lookup_free_quantizationr	   einopsr
   r   r   r   r   einxr   r   r   r   r    r   r   r   r   <module>r      s~                       ' ' ' ' ' ' ' '                @ @ @ @ @ @ : : : : : : : : : : : : : :        % % %# # #
d! d! d! d! d!& d! d! d!PJ J J J J J J J J Jr   