
    9ij                        S SK r S SKrS SKrS SKrS SKJr  S SKJs  Jr	  S SKJ
r
Jr  SSKJr  SrS*S jrS r " S S	\R"                  5      r " S
 S\
5      r " S S\R"                  5      r " S S\R                  R"                  5      r " S S\R"                  5      rS+S jrS,S jr " S S\R                  R"                  5      r " S S\R                  R"                  5      r " S S\R"                  5      r  " S S\R                  R"                  5      r " S S\R                  R"                  5      r " S S\R                  R"                  5      r " S  S!\R                  R"                  5      r " S" S#\R                  R"                  5      r  " S$ S%\R"                  5      r! " S& S'\R"                  5      r" " S( S)\R"                  5      r#g)-    N)Conv1dConvTranspose1d   )	Generator皙?c                 v  ^^ U4S jmUU4S jn[         R                  " [        U 5       Vs/ s H
  oC" U5      PM     sn5      n[         R                  " USS2SSS24   5      USS2SSS24'   [         R                  " USS2SSS24   5      USS2SSS24'   Ub  SXR'   [
        R                  " U5      $ s  snf )z Sinusoid position encoding tablec                 J   > U [         R                  " SSUS-  -  T-  5      -  $ )N'     )nppower)positionhid_idxd_hids     f/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/models/audio/vc/src/vocoder.py	cal_angle.get_sinusoid_encoding_table.<locals>.cal_angle   s'    "((5!w!|*<u*DEEE    c                 R   > [        T5       Vs/ s H  nT" X5      PM     sn$ s  snf N)range)r   hid_jr   r   s     r   get_posi_angle_vec7get_sinusoid_encoding_table.<locals>.get_posi_angle_vec   s$    8=eEu	(*EEEs   $Nr   r   r           )r   arrayr   sincostorchFloatTensor)
n_positionr   padding_idxr   pos_isinusoid_tabler   s    `    @r   get_sinusoid_encoding_tabler%      s    FF XX05j0AB0Au	E	"0ABDN !ff^Aqt!tG%<=N1add7 ff^Aqt!tG%<=N1add7&)#^,, 	Cs   B6c                 V   U R                  5       S S nU R                  5       SS  u  p4[        R                  " XA5      nX-  nXE-  nXS-
  -  U-   nX-  n	U R                  " / UQSPUP76 n
[        R
                  " SU	5      R                  SUU5      nU R                  U5      R                  5       nUR                  5       R                  S5      nU R                  " / UQU	PUP76 nUR                  nUR                  SUR                  U5      U
5        UR                  " / UQSP76 nU$ )Nr   r   )sizemathgcdviewr   arangeunfold
new_tensorlong
contiguous	new_zerosdevice
index_add_to)signal
frame_stepouter_dimensionsframesframe_lengthsubframe_lengthsubframe_stepsubframes_per_frameoutput_sizeoutput_subframessubframe_signalframeresultdevice_of_results                 r   overlap_and_addrD   '   sB   {{}Sb)!;;=-F hh|8O1M&9
+l:K"5kkI#3IRIIOLL,-44Q8K5BDEe$))+E##B'E // /1A /-/F}}
b%((#34oF[[/*/B/FMr   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )	LastLayerB   c	                   > [         [        U ]  5         [        [        R
                  U5      " S0 UD6U l        [        [        R
                  U5      " US-
  S-  40 UD6U l        [        R
                  R                  XXhS9U l	        g )Nr   r   bias )
superrF   __init__getattrr   nn
activationpadr   conv)
selfin_channelsout_channelsnonlinear_activationnonlinear_activation_paramsrQ   kernel_size
pad_paramsrJ   	__class__s
            r   rM   LastLayer.__init__D   sz     	i')!HH*, K.IK588S);?q*@OJOHHOO{ $ ?	r   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ r   )rP   rQ   rR   rS   xs     r   forwardLastLayer.forwardN   s/    OOAHHQKIIaLr   )rP   rR   rQ   __name__
__module____qualname____firstlineno__rM   r_   __static_attributes____classcell__rZ   s   @r   rF   rF   B   s    ? r   rF   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )	Conv1d1x1U   z*1x1 Conv1d with customized initialization.c           	      2   > [         [        U ]  UUSSSUS9  g)zInitialize 1x1 Conv1d module.r   r   )rX   paddingdilationrJ   N)rL   rj   rM   )rS   rT   rU   rJ   rZ   s       r   rM   Conv1d1x1.__init__X   s)    i' 	( 	r   rK   )rb   rc   rd   re   __doc__rM   rf   rg   rh   s   @r   rj   rj   U   s    4 r   rj   c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )
LastLinearc   c                   > [         [        U ]  5         [        R                  " SS9U l        [        R                  " U5      U l        [        XUS9U l	        [        R                  " U5      U l
        [        XUS9U l        g )N皙?)negative_sloperI   )rL   rr   rM   rO   	LeakyReLUrP   BatchNorm1dbn_1rj   linear_1bn_2linear_2)rS   hidden_channelout_channelrJ   rZ   s       r   rM   LastLinear.__init__e   s\    j$(*,,c:NN>2	!.tLNN>2	!.DIr   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU$ r   )rP   ry   rz   r{   r|   r]   s     r   r_   LastLinear.forwardm   sY    OOAIIaLMM!OOAIIaLMM!r   )rP   ry   r{   rz   r|   Tra   rh   s   @r   rr   rr   c   s    J r   rr   c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )	Stretch2dw   zStretch2d module.c                 N   > [         [        U ]  5         Xl        X l        X0l        g)zInitialize Stretch2d module.
Args:
    x_scale (int): X scaling factor (Time axis in spectrogram).
    y_scale (int): Y scaling factor (Frequency axis in spectrogram).
    mode (str): Interpolation mode.
N)rL   r   rM   x_scaley_scalemode)rS   r   r   r   rZ   s       r   rM   Stretch2d.__init__z   s!     	i')	r   c                 l    [         R                  " XR                  U R                  4U R                  S9$ )zCalculate forward propagation.
Args:
    x (Tensor): Input tensor (B, C, F, T).
Returns:
    Tensor: Interpolated tensor (B, C, F * y_scale, T * x_scale),
)scale_factorr   )Finterpolater   r   r   r]   s     r   r_   Stretch2d.forward   s-     }}\\4<<8tyyJ 	Jr   )r   r   r   )nearest	rb   rc   rd   re   rp   rM   r_   rf   rg   rh   s   @r   r   r   w   s    
J Jr   r   c                   6   ^  \ rS rSr  SU 4S jjrS rSrU =r$ )UpsampleLayer   c	           
         > [         [        U ]  5         [        USSS9U l        [
        R                  " UUUUUUUS9U l        g )Nr   r   )r   rn   rJ   )rL   r   rM   r   upsamplerO   r   rR   )
rS   
in_channelr~   upsample_raterX   striderm   rn   rJ   rZ   s
            r   rM   UpsampleLayer.__init__   sG     	mT+-!-CII	r   c                     U R                  UR                  S5      5      nU R                  UR                  S5      5      nU$ )Nr   )r   	unsqueezerR   squeezer]   s     r   r_   UpsampleLayer.forward   s3    MM!++a.)IIaiil#r   )rR   r   )r   Tra   rh   s   @r   r   r      s     ( r   r   c                     U R                   R                  nUR                  S5      S:w  a&  U R                  R                  R                  X5        g g )NConvr(   )rZ   rb   findweightdatanormal_)mmeanstd	classnames       r   init_weightsr      s=    $$I~~f#	d( $r   c                 (    [        X-  U-
  S-  5      $ Nr   )int)rX   rn   s     r   get_paddingr      s    &1Q677r   c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )	ResBlock1   c                   > [         [        U ]  5         [        R                  " [        UUUSUS   [        X#S   5      US9[        UUUSUS   [        X#S   5      US9[        UUUSUS   [        X#S   5      US9/5      U l        [        R                  " [        UUUSS[        US5      US9[        UUUSS[        US5      US9[        UUUSS[        US5      US9/5      U l        g )Nr   r   rn   rm   rJ   r   )	rL   r   rM   rO   
ModuleListr   r   convs1convs2rS   channelsrX   rn   rJ   rZ   s        r   rM   ResBlock1.__init__   s.   i')mm!!#K!= !!#K!= !!#K!=#%
 6 mm#K3 #K3 #K3#%
 r   c                     [        U R                  U R                  5       HO  u  p#[        R                  " U[
        5      nU" U5      n[        R                  " U[
        5      nU" U5      nXA-   nMQ     U$ r   )zipr   r   r   
leaky_reluLRELU_SLOPE)rS   r^   c1c2xts        r   r_   ResBlock1.forward   s]    $++t{{3FBa-BBBb+.BBBA 4 r   )r   r   )   r   r      Tra   rh   s   @r   r   r      s    6p r   r   c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )	ResBlock2   c                    > [         [        U ]  5         [        R                  " [        UUUSUS   [        X#S   5      US9[        UUUSUS   [        X#S   5      US9/5      U l        g )Nr   r   r   )rL   r   rM   rO   r   r   r   convsr   s        r   rM   ResBlock2.__init__   s{    i')]]!!#K!= !!#K!=$
 
r   c                 z    U R                    H*  n[        R                  " U[        5      nU" U5      nX1-   nM,     U$ r   )r   r   r   r   )rS   r^   cr   s       r   r_   ResBlock2.forward  s7    Aa-B2BA  r   )r   )r   )r   r   Tra   rh   s   @r   r   r      s    * r   r   c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )BasisSignalLayeri  zBasis Signalc                    > [         [        U ]  5         [        R                  " UR                  S5      UR                  S5      SS9U l        [        R                  " U5      U R                  l        X l	        g )Nr   r   FrI   )
rL   r   rM   rO   Linearr)   layer	Parameterr   L)rS   basis_signal_weightr   rZ   s      r   rM   BasisSignalLayer.__init__  s]    .0YY$$Q'$$Q'
 LL)<=

r   c                 X    U R                  U5      n[        X R                  S-  5      nU$ r   )r   rD   r   )rS   r   sources      r   r_   BasisSignalLayer.forward&  s'    F# 15r   )r   r   )@   r   rh   s   @r   r   r     s     r   r   c                   B   ^  \ rS rSrSrSSSSS04U 4S jjrS	 rS
rU =r$ )CausalConv1di/  z3CausalConv1d module with customized initialization.r   TConstantPad1dvaluer   c                    > [         [        U ]  5         [        [        R
                  U5      " US-
  U-  40 UD6U l        [        R
                  R                  UUUUUS9U l        g)zInitialize CausalConv1d module.r   r   N)	rL   r   rM   rN   r   rO   rQ   r   rR   )	rS   rT   rU   rX   rn   rJ   rQ   rY   rZ   s	           r   rM   CausalConv1d.__init__2  sd     	lD*,588S);?h*F 8,68HHOO $ 	r   c                 x    U R                  U R                  U5      5      SS2SS2SUR                  S5      24   $ )zCalculate forward propagation.
Args:
    x (Tensor): Input tensor (B, in_channels, T).
Returns:
    Tensor: Output tensor (B, out_channels, T).
Nr   )rR   rQ   r)   r]   s     r   r_   CausalConv1d.forwardE  s3     yy!%aJQVVAYJ&677r   )rR   rQ   r   rh   s   @r   r   r   /  s'    = $$cN&8 8r   r   c                   8   ^  \ rS rSrSr SU 4S jjrS rSrU =r$ )CausalConvTranspose1diO  z<CausalConvTranspose1d module with customized initialization.c                 ~   > [         [        U ]  5         [        R                  R                  XX4US9U l        X@l        g)z(Initialize CausalConvTranspose1d module.rI   N)rL   r   rM   r   rO   r   deconvr   )rS   rT   rU   rX   r   rJ   rZ   s         r   rM   CausalConvTranspose1d.__init__R  s;     	#T35hh..{ / Gr   c                 R    U R                  U5      SS2SS2SU R                  * 24   $ )zCalculate forward propagation.
Args:
    x (Tensor): Input tensor (B, in_channels, T_in).
Returns:
    Tensor: Output tensor (B, out_channels, T_out).
Nr   r   r]   s     r   r_   CausalConvTranspose1d.forward^  s(     {{1~aMdkk\M122r   r   r   r   rh   s   @r   r   r   O  s    F 
3 3r   r   c            	       L   ^  \ rS rSrSrSSSSSSS	0S
0 S4	U 4S jjrS rSrU =r$ )ResidualStackih  z+Residual stack module introduced in MelGAN.r       r   Trw   rv   ru   ReflectionPad1dFc
                 R  > [         [        U ]  5         U	(       d  US-
  S-  S:X  d   S5       e[        R                  R                  [        [        R                  U5      " S	0 UD6[        [        R                  U5      " US-
  S-  U-  40 UD6[        R                  R                  UUUUUS9[        [        R                  U5      " S	0 UD6[        R                  R                  X"SUS95      U l        O[        R                  R                  [        [        R                  U5      " S	0 UD6[        UUUUUUUS9[        [        R                  U5      " S	0 UD6[        R                  R                  X"SUS95      U l        [        R                  R                  X"SUS9U l
        g)
an  Initialize ResidualStack module.
Args:
    kernel_size (int): Kernel size of dilation convolution layer.
    channels (int): Number of channels of convolution layers.
    dilation (int): Dilation factor.
    bias (bool): Whether to add bias parameter in convolution layers.
    nonlinear_activation (str): Activation function module name.
    nonlinear_activation_params (dict): Hyperparameters for activation function.
    pad (str): Padding function module name before dilated convolution layer.
    pad_params (dict): Hyperparameters for padding function.
    use_causal_conv (bool): Whether to use causal convolution.
r   r   r   z$Not support even number kernel size.r   rI   )rn   rJ   rQ   rY   NrK   )rL   r   rM   r   rO   
SequentialrN   r   stackr   
skip_layer)rS   rX   r   rn   rJ   rV   rW   rQ   rY   use_causal_convrZ   s             r   rM   ResidualStack.__init__k  s   0 	mT+-  !" J#IJ ",,,. M0KM#&aA'='H 5)35%    ,. M0KMADADJ  ,,,. M0KM%)+ ,. M0KMADADJ"  ((//(ad/Kr   c                 H    U R                  U5      U R                  U5      -   $ )zCalculate forward propagation.
Args:
    c (Tensor): Input tensor (B, channels, T).
Returns:
    Tensor: Output tensor (B, chennels, T).
)r   r   )rS   r   s     r   r_   ResidualStack.forward  s      zz!}tq111r   )r   r   r   rh   s   @r   r   r   h  s9    5 (%5s$;?LB2 2r   r   c            
       z   ^  \ rS rSrS/ SQ/ SQSS/ SQ/ SQ/ SQ/ SQ/S	S	4	U 4S
 jjrS rS rS rS rS r	Sr
U =r$ )HiFiGANGeneratori  P   r         )r      r   r      1)
      r  r   r   Tc
                 x  > [         [        U ]  5         [        U5      U l        [        U5      U l        [        UUSSSU	S9U l        US:X  a  [        O[        n
[        R                  " 5       U l        [        [        X65      5       Hq  u  nu  pU R                  R                  USL a!  [!        USU-  -  USUS-   -  -  UUSUS-  U	S9O)[#        USU-  -  USUS-   -  -  UUUS-  US-  -   US-  U	S	95        Ms     [        R                  " 5       U l        ['        [        U R                  5      5       HP  nUSUS-   -  -  n[        [        X'5      5       H*  u  nu  nnU R$                  R                  U
" XUU	S
95        M,     MR     [        WSSSSU	S9U l        U R+                  5         U R-                  5         g )Nr   r   r   rm   rJ   r   Fr   r   rX   r   rm   rJ   rm   output_paddingrJ   rI   )rL   r   rM   lennum_kernelsnum_upsamplesr   conv_prer   r   rO   r   ups	enumerater   appendr   r   	resblocksr   	conv_postapply_weight_normreset_parameters)rS   input_channelsresblock_kernel_sizesupsample_ratesupsample_initial_channelresblock_typeupsample_kernel_sizesresblock_dilation_sizestransposedconvrJ   resblockiukchjdrZ   s                    r   rM   HiFiGANGenerator.__init__  s    	.045 0$ !. 49)==?"3~#MNIAvHHOO #1E"9 ,A6,QU<"# !F @O0QT:0QQZ@!"a!a%'(1u!@#$ O$ s488}%A)a!a%j9B&-GI	6Aq%%hrad&CDI &  Aq!QTB r   c                 ,    S nU R                  U5        g)z:Remove weight normalization module from all of the layers.c                      [         R                  " SU  S35        [        R                  R                  R                  U 5        g ! [         a     g f = f)NzWeight norm is removed from .)loggingdebugr   rO   utilsremove_weight_norm
ValueErrorr   s    r   _remove_weight_norm@HiFiGANGenerator.remove_weight_norm.<locals>._remove_weight_norm  sE     <QCqAB11!4 s   AA 
AANapply)rS   r+  s     r   r(  #HiFiGANGenerator.remove_weight_norm  s    	 	

&'r   c                 ,    S nU R                  U5        g)z9Apply weight normalization module from all of the layers.c                 0   [        U [        R                  R                  5      (       d)  [        U [        R                  R                  5      (       aD  [        R                  R
                  R                  U 5        [        R                  " SU  S35        g g )NzWeight norm is applied to r$  )	
isinstancer   rO   r   r   r'  weight_normr%  r&  r*  s    r   _apply_weight_norm>HiFiGANGenerator.apply_weight_norm.<locals>._apply_weight_norm  sc    !UXX__--uxx//21 21**1- :1#Q?@21r   Nr-  )rS   r4  s     r   r  "HiFiGANGenerator.apply_weight_norm  s    	A 	

%&r   c                 ,    S nU R                  U5        g)zReset parameters.
This initialization follows official implementation manner.
https://github.com/descriptinc/melgan-neurips/blob/master/mel2wav/modules.py
c                 *   [        U [        R                  R                  5      (       d)  [        U [        R                  R                  5      (       aA  U R
                  R                  R                  SS5        [        R                  " SU  S35        g g )Nr   {Gz?zReset parameters in r$  )
r2  r   rO   r   r   r   r   r   r%  r&  r*  s    r   _reset_parameters<HiFiGANGenerator.reset_parameters.<locals>._reset_parameters  se    !UXX__--uxx//21 21%%c40 4QCq9:21r   Nr-  )rS   r:  s     r   r  !HiFiGANGenerator.reset_parameters  s    	; 	

$%r   c                    U R                  U5      n[        U R                  5       H  n[        R                  " U[
        5      nU R                  U   " U5      nS n[        U R                  5       HR  nUc&  U R                  X R                  -  U-      " U5      nM,  X0R                  X R                  -  U-      " U5      -  nMT     X0R                  -  nM     [        R                  " U5      nU R                  U5      nU$ r   )
r
  r   r	  r   r   r   r  r  r  r  rS   r^   r  xsr  s        r   r_   HiFiGANGenerator.forward  s    MM!t))*AQ,AAAB4++,:,<,<(<q(@A!DB..-=-=)=)AB1EEB	 -
 %%%A + LLONN1 r   c                 *   [        U[        R                  5      (       dS  [        R                  " U[        R                  S9R                  [        U R                  5       5      R                  5      nUR                  SS5      R                  S5      nU R                  U5      n[        U R                  5       H  n[        R                  " U[         5      nU R"                  U   " U5      nS n[        U R$                  5       HR  nUc&  U R&                  X R$                  -  U-      " U5      nM,  X0R&                  X R$                  -  U-      " U5      -  nMT     X0R$                  -  nM     [        R                  " U5      nU R)                  U5      nU$ N)dtyper   r   r2  r   Tensortensorfloatr5   next
parametersr3   	transposer   r
  r   r	  r   r   r   r  r  r  r  r>  s        r   	inferenceHiFiGANGenerator.inference'  @   !U\\**&&(bdoo.?)@)G)G&H KK1''*MM!t))*AQ,AAAB4++,:,<,<(<q(@A!DB..-=-=)=)AB1EEB	 -
 %%%A + LLONN1 r   )r  r
  r  r	  r  r  )rb   rc   rd   re   rM   r(  r  r  r_   rK  rf   rg   rh   s   @r   r   r     sK     (#!$+!*Iy A6 p
(	'&$ r   r   c                   p   ^  \ rS rSrS/ SQSS/SSSS// S	Q/ S	Q/ S	Q/S
SSS
4U 4S jjrSS jrS rSrU =r$ )ConditionGeneratori>  i   r   r   r   r      r   r   TFc                 N  > [         [        U ]  5         [        U5      U l        [        U5      U l        [        UUSSSUS9U l        [        SUSS5      U l        US:X  a  [        O[        n[        R                  R                  [        R                  " / SQ5      5      U l        [        R                   " 5       U l        [%        ['        X65      5       Hq  u  nu  pU R"                  R)                  USL a!  [+        US	U-  -  US	US-   -  -  UUSUS	-  US
9O)[-        US	U-  -  US	US-   -  -  UUUS	-  US	-  -   US	-  US95        Ms     [        R                   " 5       U l        [1        [        U R"                  5      5       HQ  nUS	US-   -  -  n[%        ['        X'5      5       H+  u  nu  nnU R.                  R)                  U" UUUUS95        M-     MS     [        WSSSSUS9U l        U	(       a  [5        SSSS9U l        OS U l        U
(       a  [9        5       U l        g S U l        g )Nr   r   r   r     r   )r   r
   rR  Fr   r  r  rI   r   r   r   )dim_in	style_dimmax_conv_dim)rL   rO  rM   r  r  r	  r   r
  spk_fcr   r   r   rO   r   randnspk_infor   r  r  r   r  r   r   r  r   r  r   unetFsmnEncoderV2extra_layer)rS   r  r  r  r  r  r  r  r  rY  
extra_inforJ   r  r  r  r  r  r  r   rZ   s                      r   rM   ConditionGenerator.__init__@  s    	 $0245 0$ S":AqA - 49)**5;;+GH==?"3~#MNIAvHHOO #1E"9 ,A6,QU<"# !F @O0QT:0QQZ@!"a!a%'(1u!@#$ O$ s488}%A)a!a%j9B&-GI	6Aq%%hr1ad&CDI &  B1adC!sMDIDI,D#Dr   c                 &   UR                  / SQ5      n[        R                  " UR                  S5      U R                  -  SSS9n[        R
                  " USS9nX`R                  -  n[        R                  " USS9nX$-  Xu-  -   nUb  U R                  U5      n	X-  nU R                  U5      U R                  UR                  S5      5      -   n
[        U R                  5       H  n[        R                  " U
[        5      n
U R                  U   " U
5      n
S n[        U R                  5       HR  nUc&  U R                   XR                  -  U-      " U
5      nM,  XR                   XR                  -  U-      " U
5      -  nMT     XR                  -  n
M     [        R                  " U
5      n
U R#                  U
5      n
U R$                  b2  U R%                  U
R                  S5      U5      n
U
R'                  S5      n
U
R                  / SQ5      n
U
$ )N)r   r   r   r   r(   T)dimkeepdimr_  )permuter   sumr   rX  softmaxr[  r
  rV  r   r	  r   r   r   r  r  r  r  rY  r   )rS   inpsextra_mcabscorer   spk_inpr\  r^   r  r?  r  s                 r   r_   ConditionGenerator.forward  s   kk)$		!++a.4==8b$Oe+%		%Q'%%)#))(3J!GMM#W->->r-B!CCt))*AQ,AAAB4++,:,<,<(<q(@A!DB..-=-=)=)AB1EEB	 -
 %%%A + LLONN199 		!++a.'2A		!AIIi  r   c                 *   [        U[        R                  5      (       dS  [        R                  " U[        R                  S9R                  [        U R                  5       5      R                  5      nUR                  SS5      R                  S5      nU R                  U5      n[        U R                  5       H  n[        R                  " U[         5      nU R"                  U   " U5      nS n[        U R$                  5       HR  nUc&  U R&                  X R$                  -  U-      " U5      nM,  X0R&                  X R$                  -  U-      " U5      -  nMT     X0R$                  -  nM     [        R                  " U5      nU R)                  U5      nU$ rB  rD  r>  s        r   rK  ConditionGenerator.inference  rM  r   )
r  r
  r[  r  r	  r  rV  rX  rY  r  )N      ?ro  )	rb   rc   rd   re   rM   r_   rK  rf   rg   rh   s   @r   rO  rO  >  sK     (1v!$ !f!*Iy A=$~!F r   rO  c                   >   ^  \ rS rSrSrSS/S4U 4S jjrS rSrU =r$ )FeedForwardNeti  zA two-feed-forward-layer moduler   r   c                    > [         TU ]  5         [        R                  " UUUS   US   S-
  S-  S9U l        [        R                  " UUUS   US   S-
  S-  SS9U l        [        R                  " U5      U l        g )Nr   r   r   )rX   rm   F)rX   rm   rJ   )rL   rM   rO   r   w_1w_2Dropoutdropout)rS   d_inr   d_outrX   rv  rZ   s         r   rM   FeedForwardNet.__init__  s     99#A ^a'A-	
 99#A ^a'A-
 zz'*r   c                     UR                  SS5      n[        R                  " U R                  U5      5      nU R	                  U5      nU R                  U5      nUR                  SS5      nU$ )Nr   r   )rJ  r   relurs  rv  rt  )rS   r^   outputs      r   r_   FeedForwardNet.forward  s\    Q"()f%&!!!!Q'r   )rv  rs  rt  r   rh   s   @r   rq  rq    s    )891vs +, r   rq  c                   6   ^  \ rS rSrSU 4S jjrSS jrSrU =r$ )MemoryBlockV2i  c           
      *  > [         [        U ]  5         [        [	        US-
  S-  5      5      n[        US-
  S-  5      nUS:  a  XS-  nXc-  nXVsU l        U l        [        R                  " XUSSUSS9U l	        [        R                  " U5      U l        g )Nr   r   r   F)groupsrJ   )rL   r  rM   r   roundlprprO   r   conv_dwru  rv  )rS   r   filter_sizeshiftrv  left_paddingright_paddingrZ   s          r   rM   MemoryBlockV2.__init__  s    mT+-5+/Q!678[1_1219!L"M'yy{AqOzz'*r   c           	         Ub!  UR                  UR                  S5      S5      n[        R                  " USSU R                  U R
                  SS4SSS9nU R                  UR                  5       R                  SS5      5      R                  5       R                  SS5      nXA-  nU R                  U5      nUb!  UR                  UR                  S5      S5      nU$ )Nr(   r   constantr   )r   r   r   r   )
masked_fillr   r   rQ   r  r  r  r1   rJ  rv  )rS   inputmaskr^   r|  s        r   r_   MemoryBlockV2.forward  s    %%dnnR&8!<EEEAq$''477Aq1
#Oalln66q :<		!Q 	f%''r(:A>Fr   )r  rv  r  r  )r   r   ra   rh   s   @r   r  r    s    + r   r  c                   F   ^  \ rS rSr        SU 4S jjrSS jrSrU =r$ )rZ  i  c	           
      V  > [         [        U ]  5         Xl        X l        X@l        XPl        X`l        Xl        [        U[        5      (       d*  [        U R                  5       V	s/ s H  oPM     sn	U l        [        R                  " 5       U l        [        R                  " 5       U l        [        R                   " X45      U l        U R                  R%                  ['        UUUUS95        [        SU5       H(  n
U R                  R%                  ['        UUUUS95        M*     [        R                  " 5       U l        [        U5       H6  n
U R(                  R%                  [+        XAU R                  U
   U5      5        M8     [,        R                  R!                  XGSS9U l        g s  sn	f )N)rv  r   FrI   )rL   rZ  rM   r  fsmn_num_layersnum_memory_unitsffn_inner_dimrv  r  r2  listr   rO   r   adapterffn_lstr   projr  rq  memory_block_lstr  r   fc)rS   r  r  	input_dimr  r  rv  spk_dimr  _r  rZ   s              r   rM   FsmnEncoderV2.__init__  sY    	mT+-&. 0*
%&&).t/C/C)DE)DA%)DEDJ}}}}IIi:	  	!	" q/*ALL$!$#	%& + !#'A!!((.TZZ]%'( (
 ((//"2%/H3 Fs   $F&c                    [         R                  " XR                  U R                  5      nU R                  U5      n[	        U R
                  U R                  5       Hj  u  pEU" U5      nU" Xb5      n[         R                  " XpR                  U R                  5      nUR                  S5      UR                  S5      :X  d  Mf  Xs-  nMl     U R                  U5      n[        R                  " USS9nU$ )Nr(   r   ra  )r   rv  trainingr  r   r  r  r)   r  r   r   )rS   r  r  r^   ffnmemory_blockcontextmemorys           r   r_   FsmnEncoderV2.forward/  s    IIe\\4==9IIaL!$T\\43H3H!IC!fG!'0FYYv||T]]CF{{2!&&*, "J GGAJJJqa r   )r  rv  r  r  r  r  r  r  r  r  r  )r   r  i0  r   i   r   rR  r   r   ra   rh   s   @r   rZ  rZ    s.     -I` r   rZ  r   )r   r9  )r   )$r%  r*   numpyr   r   torch.nnrO   torch.nn.functional
functionalr   r   r   	Starganv3r   r   r%   rD   ModulerF   rj   rr   r   r   r   r   r   r   r   r   r   r   r   rO  rq  r  rZ  rK   r   r   <module>r     so          ,  -,6		 &  (J J4BII 8)8A AH >ryy $ '8588?? 8@3EHHOO 32K2EHHOO K2\Euxx EPx xv RYY  FBII B@BII @r   