
    Nj                     z   d Z ddlZddlZddlmZ ddlmZ ddlmZ d Z	dej                  dej                  defd	Z G d
 dej                        Z G d dej                        Z G d dej                        Z G d dej                        Z G d dej                        Z G d dej                        Zy)zk
Taken from
https://github.com/LTH14/mar/blob/fe470ac24afbee924668d8c5c83e9fec60af3a73/models/diffloss.py

    N)Self)FlowLMConfigc                     | d|z   z  |z   S N    )xshiftscales      g/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/pocket_tts/modules/mlp.pymodulater      s    E	?U""    r	   alphaepsc                    | j                         |j                         k\  sJ | j                  }|| j                  dd      z   }| |j                  |      t	        j
                  |      z  z  j                  |      }|S )NTdimkeepdim)r   dtypevartotorchrsqrt)r	   r   r   x_dtyper   ys         r   	_rms_normr      sl    557eiik!!!ggG
"d+
+C	
ehhsmekk#..	/33G<AHr   c                   J     e Zd Zddedef fdZdej                  fdZ xZ	S )RMSNormr   r   c                     t         |           || _        |f}t        j                  t        j                  |dd            | _        y )Ng      ?T)requires_grad)super__init__r   nn	Parameterr   fullr   )selfr   r   alpha_shape	__class__s       r   r#   zRMSNorm.__init__   s9    f\\%**[#T"RS
r   r	   c                 D    t        || j                  | j                        S N)r   r   r   )r'   r	   s     r   forwardzRMSNorm.forward#   s    DJJ11r   )gh㈵>)
__name__
__module____qualname__intfloatr#   r   Tensorr,   __classcell__r)   s   @r   r   r      s)    TC Te T2 2r   r   c                   *     e Zd ZdZd fd	Zd Z xZS )	LayerNormzJReimplementation of LayerNorm because the default one doesn't support jvp.c                     t         |           || _        |r[t        j                  t        j                  |            | _        t        j                  t        j                  |            | _	        y y r+   )
r"   r#   r   r$   r%   r   onesweightzerosbias)r'   channelsr   elementwise_affiner)   s       r   r#   zLayerNorm.__init__*   sO    ,,uzz(';<DKU[[%:;DI r   c                     |j                  dd      }|j                  ddd      }||z
  t        j                  || j                  z         z  }t        | d      r|| j                  z  | j                  z   }|S )Nr   Tr   F)r   unbiasedr   r9   )meanr   r   sqrtr   hasattrr9   r;   )r'   r	   r@   r   s       r   r,   zLayerNorm.forward1   sl    vv"dv+eeUDe9XC$((N334"DKK$))+Ar   )ư>Tr-   r.   r/   __doc__r#   r,   r3   r4   s   @r   r6   r6   '   s    T<r   r6   c                   :     e Zd ZdZ	 ddededef fdZd Z xZS )TimestepEmbedderz4Embeds scalar timesteps into vector representations.hidden_sizefrequency_embedding_size
max_periodc           
         t         |           t        j                  ||d      t        j                         t        j                  ||d      g}|j                  t        |             t        j                  | | _        || _	        |dz  }| j                  dt        j                  t        j                  |       t        j                  d|      z  |z               y )NTr;      freqsr   )startend)r"   r#   r$   LinearSiLUappendr   
SequentialmlprI   register_bufferr   expmathlogarange)r'   rH   rI   rJ   blockshalfr)   s         r   r#   zTimestepEmbedder.__init__=   s     	II.$GGGIIIk;T:

 	gk*+==&)(@%'1,UYY 44u||!QU7VVY]]^	
r   c                    || j                   j                  |j                        z  }t        j                  t        j
                  |      t        j                  |      gd      }| j                  dz  rJ | j                  |      }|S )Nr   r   rM   )	rN   r   r   r   catcossinrI   rU   )r'   targs	embeddingt_embs        r   r,   zTimestepEmbedder.forwardN   si    4::==))IIuyy		$@bI	11A566#r   )   i'  )r-   r.   r/   rE   r0   r#   r,   r3   r4   s   @r   rG   rG   :   s/    > X]

:=
QT
"r   rG   c                   (     e Zd ZdZ fdZd Z xZS )ResBlockz
    A residual block that can optionally change the number of channels.
    :param channels: the number of input channels.
    c           	         t         |           || _        t        |d      | _        t        j                  t        j                  ||d      t        j                         t        j                  ||d            | _	        t        j                  t        j                         t        j                  |d|z  d            | _
        y )NrC   )r   TrL      )r"   r#   r<   r6   in_lnr$   rT   rQ   rR   rU   adaLN_modulation)r'   r<   r)   s     r   r#   zResBlock.__init__\   s     xT2
==IIht4GGIIIht4
 !#GGIryy1x<dC!
r   c                     | j                  |      j                  dd      \  }}}t        | j                  |      ||      }| j	                  |      }|||z  z   S )Nrj   r   r^   )rl   chunkr   rk   rU   )r'   r	   r   	shift_mlp	scale_mlpgate_mlphs          r   r,   zResBlock.forwardk   s[    )-)>)>q)A)G)Gr)G)R&	9hTZZ]Iy9HHQK8a<r   rD   r4   s   @r   rh   rh   V   s    

 r   rh   c                   (     e Zd ZdZ fdZd Z xZS )
FinalLayerz+
    The final layer adopted from DiT.
    c                    t         |           t        |dd      | _        t	        j
                  ||d      | _        t	        j                  t	        j                         t	        j
                  |d|z  d            | _	        y )NFrC   )r=   r   TrL   rM   )
r"   r#   r6   
norm_finalr$   rQ   linearrT   rR   rl   )r'   model_channelsout_channelsr)   s      r   r#   zFinalLayer.__init__w   sa    #NuRVWii4H "GGIryy^1C$O!
r   c                     | j                  |      j                  dd      \  }}t        | j                  |      ||      }| j	                  |      }|S )NrM   r   r^   )rl   rn   r   rv   rw   )r'   r	   cr
   r   s        r   r,   zFinalLayer.forward   sO    ,,Q/55aR5@uT__Q'6KKNr   rD   r4   s   @r   rt   rt   r   s    
r   rt   c            
            e Zd ZdZ	 d fd	Zededededefd       Z	de
j                  d	e
j                  d
e
j                  de
j                  de
j                  f
dZ xZS )SimpleMLPAdaLNaw  Taken from https://arxiv.org/abs/2406.11838.

    The MLP for Diffusion Loss.
    :param in_channels: channels in the input Tensor.
    :param model_channels: base channel count for the model.
    :param out_channels: channels in the output Tensor.
    :param cond_channels: channels in the condition.
    :param num_res_blocks: number of residual blocks per downsample.
    c                    t         
|           || _        || _        || _        || _        || _        |dk7  sJ t        j                  t        |      D cg c]  }t        |       c}      | _        t        j                  ||      | _        t        j                  ||      | _        g }t        |      D ]  }	|j                  t!        |              t        j                  |      | _        t%        ||      | _        y c c}w r   )r"   r#   in_channelsrx   ry   num_res_blocksnum_time_condsr$   
ModuleListrangerG   
time_embedrQ   
cond_embed
input_projrS   rh   
res_blocksrt   final_layer)r'   r   rx   ry   cond_channelsr   r   _r   ir)   s             r   r#   zSimpleMLPAdaLN.__init__   s     	&,(,,"""--7<^7LM7L!n-7LM
 ))M>B))K@
~&Ah~67 ' --
3%nlC Ns   Dcfg
latent_dimcond_dimreturnc                 p    |j                   }|j                  }|j                  }d}t        ||||||      S )NrM   )r   )flowr   depthr}   )clsr   r   r   configflow_dim
flow_depthr   s           r   from_pydantic_configz#SimpleMLPAdaLN.from_pydantic_config   s=    ::\\
*h
Sa
 	
r   r{   srb   r	   c                     ||g j                  |      }t               j                  k(  s J d j                   dt                       j                  dk7  sJ t         fdt	         j                        D               j                  z  } j                  |      }||z   } j                  D ]  } |||      }  j                  ||      S )a  
        Apply the model to an input batch.
        :param c: conditioning from AR transformer.
        :param s: start time tensor.
        :param t: target time tensor.
        :param x: an [N x C] Tensor of inputs.
        :return: an [N x C] Tensor of outputs.
        z	Expected z time conditions, got r   c              3   N   K   | ]  } j                   |   |           y wr+   )r   ).0r   r'   tss     r   	<genexpr>z)SimpleMLPAdaLN.forward.<locals>.<genexpr>   s)     N3Ma""2a5)3Ms   "%)r   lenr   sumr   r   r   r   )	r'   r{   r   rb   r	   
t_combinedr   blockr   s	   `       @r   r,   zSimpleMLPAdaLN.forward   s     VOOA2w$--- 	
++,,B3r7)L	
- ""a'''N59L9L3MNNQUQdQdd 	 OOAN__EaA % 1%%r   )r   )r-   r.   r/   rE   r#   classmethodr   r0   r   r   r   r2   r,   r3   r4   s   @r   r}   r}      s    " D@ 
| 
 
PS 
X\ 
 
&&"',,&38<<&DILL&	&r   r}   )rE   rX   r   torch.nnr$   typing_extensionsr   pocket_tts.utils.configr   r   r2   r1   r   Moduler   r6   rG   rh   rt   r}   r   r   r   <module>r      s       " 0# ell  2bii 2		 &ryy 8 ryy  8 (Q&RYY Q&r   