Ë
    P/æj¼v  ã            	       óš  — d Z ddlmZ ddlZddlZddlmZ ddlZddlm	Z	 ddl
mZ ddlmZmZ dd	lmZ dd
lmZmZ ddej*                  dej,                  eef   dedefd„Z G d„ de	j6                  «      Z G d„ de	j6                  «      Z G d„ de	j6                  «      Z G d„ de	j6                  «      Z G d„ de	j6                  «      Z y)zB
This code contains the spectrogram and Hybrid version of Demucs.
é    )ÚdeepcopyN)Úwiener)Únn)Ú
functionalé   )ÚDConvÚrescale_module)Úcapture_init)ÚspectroÚispectroÚxÚpaddingsÚmodeÚvaluec                 óv  — | }| j                   d   }|\  }}|dk(  rLt        ||«      }||k  r;||z
  dz   }	t        ||	«      }
|	|
z
  }||z
  ||
z
  f}t        j                  | ||
f«      } t        j                  | |||«      }|j                   d   ||z   |z   k(  sJ ‚|d|||z   …f   |k(  j                  «       sJ ‚|S )zªTiny wrapper around F.pad, just to allow for reflect padding on small input.
    If this is the case, we insert extra 0 padding to the right before the reflection happen.éÿÿÿÿÚreflectr   .)ÚshapeÚmaxÚminÚFÚpadÚall)r   r   r   r   Úx0ÚlengthÚpadding_leftÚpadding_rightÚmax_padÚ	extra_padÚextra_pad_rightÚextra_pad_leftÚouts                úQ/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/demucs/hdemucs.pyÚpad1dr$      sî   € ð 
€BØ�W‰W�R‰[€FØ"*Ñ€L�-ØˆyÒÜ�l MÓ2ˆØ�WÒØ &Ñ(¨1Ñ,ˆIÜ! -°Ó;ˆOØ&¨Ñ8ˆNØ$ ~Ñ5°}ÀÑ7VÐWˆHÜ—‘�a˜.¨/Ð:Ó;ˆAÜ
�%‰%��8˜T 5Ó
)€CØ�9‰9�R‰=˜F \Ñ1°MÑAÒAÐAÐAØ��\ <°&Ñ#8Ð8Ð8Ñ9¸RÑ?×DÑDÔFÐFÐFØ€Jó    c                   óJ   ‡ — e Zd ZdZ	 ddededefˆ fd„Zed„ «       Zd„ Z	ˆ xZ
S )	ÚScaledEmbeddingzt
    Boost learning rate for embeddings (with `scale`).
    Also, can make embeddings continuous with `smooth`.
    Únum_embeddingsÚembedding_dimÚscalec                 óì  •— t         ‰| �  «        t        j                  ||«      | _        |r˜t        j                  | j                  j                  j                  d¬«      }|t        j                  d|dz   «      j                  |«      j                  «       d d …d f   z  }|| j                  j                  j                  d d  | j                  j                  xj                  |z  c_        || _        y )Nr   ©Údimr   )ÚsuperÚ__init__r   Ú	EmbeddingÚ	embeddingÚtorchÚcumsumÚweightÚdataÚarangeÚtoÚsqrtr*   )Úselfr(   r)   r*   Úsmoothr4   Ú	__class__s         €r#   r/   zScaledEmbedding.__init__0   s¹   ø€ ä‰ÑÔÜŸ™ n°mÓDˆŒÙÜ—\‘\ $§.¡.×"7Ñ"7×"<Ñ"<À!ÔDˆFàœeŸl™l¨1¨n¸qÑ.@ÓA×DÑDÀVÓL×QÑQÓSÒTUÐW[ÐT[Ñ\Ñ\ˆFØ,2ˆD�N‰N×!Ñ!×&Ñ&¡qÐ)Ø�‰×Ñ×"Ò" eÑ+Õ"Øˆ�
r%   c                 óH   — | j                   j                  | j                  z  S ©N)r1   r4   r*   )r9   s    r#   r4   zScaledEmbedding.weight<   s   € à�~‰~×$Ñ$ t§z¡zÑ1Ð1r%   c                 óB   — | j                  |«      | j                  z  }|S r=   )r1   r*   )r9   r   r"   s      r#   ÚforwardzScaledEmbedding.forward@   s   € Ø�n‰n˜QÓ $§*¡*Ñ,ˆØˆ
r%   )g      $@F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚfloatr/   Úpropertyr4   r?   Ú__classcell__©r;   s   @r#   r'   r'   +   sA   ø„ ñð
 -2ñ
 sð 
¸3ð 
Øõ
ð ñ2ó ð2ör%   r'   c                   ó>   ‡ — e Zd Zddddddddi ddfˆ fd„	Zd	d„Zˆ xZS )
Ú	HEncLayeré   é   r   FTr   c                 óî  •‡— t         ‰| �  «        d„ }|	rˆfd„}|r|dz  }nd}t        j                  }|| _        || _        || _        || _        |	| _        || _	        |r|dg}|dg}|dg}t        j                  } ||||||«      | _        | j                  ry ||«      | _        d| _        |r* ||d|z  dd|
z  z   d|
«      | _         |d|z  «      | _        d| _        |rt!        |fi |¤Ž| _        yy)a#  Encoder layer. This used both by the time and the frequency branch.

        Args:
            chin: number of input channels.
            chout: number of output channels.
            norm_groups: number of groups for group norm.
            empty: used to make a layer with just the first conv. this is used
                before merging the time and freq. branches.
            freq: this is acting on frequencies.
            dconv: insert DConv residual branches.
            norm: use GroupNorm.
            context: context size for the 1x1 conv.
            dconv_kw: list of kwargs for the DConv class.
            pad: pad the input. Padding is done so that the output size is
                always the input size / stride.
            rewrite: add 1x1 conv at the end of the layer.
        c                 ó*   — t        j                  «       S r=   ©r   ÚIdentity©Úds    r#   ú<lambda>z$HEncLayer.__init__.<locals>.<lambda>[   ó   € œBŸK™K›M€ r%   c                 ó0   •— t        j                  ‰| «      S r=   ©r   Ú	GroupNorm©rR   Únorm_groupss    €r#   rS   z$HEncLayer.__init__.<locals>.<lambda>]   ó   ø€ ¤§¡¨[¸!Ó <€ r%   rL   r   r   Né   )r.   r/   r   ÚConv1dÚfreqÚkernel_sizeÚstrideÚemptyÚnormr   ÚConv2dÚconvÚnorm1ÚrewriteÚnorm2Údconvr   )r9   ÚchinÚchoutr^   r_   rY   r`   r]   rg   ra   ÚcontextÚdconv_kwr   re   Únorm_fnÚklassr;   s        `          €r#   r/   zHEncLayer.__init__F   s  ù€ ô( 	‰ÑÔÙ)ˆÙÛ<ˆGÙØ Ñ"‰CàˆCÜ—	‘	ˆØˆŒ	Ø&ˆÔØˆŒØˆŒ
ØˆŒ	ØˆŒÙØ&¨Ð*ˆKØ˜a�[ˆFØ˜�(ˆCÜ—I‘IˆEÙ˜$  {°F¸CÓ@ˆŒ	Ø�:Š:ØÙ˜U“^ˆŒ
ØˆŒÙÙ  ¨¨E©	°1°q¸7±{±?ÀAÀwÓOˆDŒLÙ   U¡Ó+ˆDŒJàˆŒ
ÙÜ˜uÑ1¨Ñ1ˆD�Jð r%   c                 ój  — | j                   s7|j                  «       dk(  r$|j                  \  }}}}|j                  |d|«      }| j                   sS|j                  d   }|| j                  z  dk(  s2t        j                  |d| j                  || j                  z  z
  f«      }| j                  |«      }| j                  r|S |�s|j                  d   |j                  d   k(  sJ |j                  |j                  f«       ‚|j                  «       dk(  r|j                  «       dk(  r|dd…dd…df   }||z   }t        j                  | j                  |«      «      }| j                  r…| j                   r6|j                  \  }}}}|j                  dddd«      j                  d||«      }| j                  |«      }| j                   r&|j                  «      j                  dddd«      }| j                  r9| j                  | j                  |«      «      }	t        j                   |	d¬«      }	|	S |}	|	S )	z�
        `inject` is used to inject the result from the time branch into the frequency branch,
        when both have the same stride.
        rL   r   r   Né   r[   r   r,   )r]   r-   r   Úviewr_   r   r   rc   r`   Úgelurd   rg   ÚpermuteÚreshapere   rf   Úglu)
r9   r   ÚinjectÚBÚCÚFrÚTÚleÚyÚzs
             r#   r?   zHEncLayer.forward{   sÙ  € ð
 �yŠy˜QŸU™U›W¨š\ØŸ'™'‰KˆAˆq�"�aØ—‘�q˜"˜aÓ ˆAà�yŠyØ—‘˜‘ˆBØ˜Ÿ™Ñ# qÒ(Ü—E‘E˜!˜a §¡°°T·[±[Ñ0@Ñ!AÐBÓC�Ø�I‰I�a‹LˆØ�:Š:ØˆHØÐØ—<‘< Ñ# q§w¡w¨r¡{Ò2ÐK°V·\±\À1Ç7Á7Ð4KÓKÐ2Ø�z‰z‹|˜qÒ  Q§U¡U£W°¢\Ø¢¢1 d 
Ñ+�Ø�F‘
ˆAÜ�F‰F�4—:‘:˜a“=Ó!ˆØ�:Š:Ø�yŠyØŸg™g‘��1�b˜!Ø—I‘I˜a  A qÓ)×1Ñ1°"°a¸Ó;�Ø—
‘
˜1“ˆAØ�yŠyØ—F‘F˜1˜b ! QÓ'×/Ñ/°°1°a¸Ó;�Ø�<Š<Ø—
‘
˜4Ÿ<™<¨›?Ó+ˆAÜ—‘�a˜Q”ˆAð ˆð ˆAØˆr%   r=   ©r@   rA   rB   r/   r?   rG   rH   s   @r#   rJ   rJ   E   s(   ø„ Ø01¸!ÈÐRWØ $¨T¸1ÀrÈtØõ32÷j"r%   rJ   c                   ó*   ‡ — e Zd ZdZˆ fd„Zdd„Zˆ xZS )Ú	MultiWrapa›  
    Takes one layer and replicate it N times. each replica will act
    on a frequency band. All is done so that if the N replica have the same weights,
    then this is exactly equivalent to applying the original module on all frequencies.

    This is a bit over-engineered to avoid edge artifacts when splitting
    the frequency bands, but it is possible the naive implementation would work as well...
    c                 óF  •— t         ‰| �  «        || _        t        j                  «       | _        t        |t        «      | _        |j                  rJ ‚|j                  sJ ‚|j                  sJ ‚| j                  s|j                  rJ ‚t        t        |«      dz   «      D ]  }t        |«      }| j                  rd|j                  _        nd|_        |j#                  «       D ]  }t%        |d«      sŒ|j'                  «        Œ! | j
                  j)                  |«       Œ� y)z¸
        Args:
            layer: module to clone, must be either HEncLayer or HDecLayer.
            split_ratios: list of float indicating which ratio to keep for each band.
        r   )r   r   FÚreset_parametersN)r.   r/   Úsplit_ratiosr   Ú
ModuleListÚlayersÚ
isinstancerJ   rc   ra   r]   r   Úcontext_freqÚrangeÚlenr   ÚpaddingÚmodulesÚhasattrr�   Úappend)r9   Úlayerr‚   ÚkÚlayÚmr;   s         €r#   r/   zMultiWrap.__init__©   sî   ø€ ô 	‰ÑÔØ(ˆÔÜ—m‘m“oˆŒÜ˜u¤iÓ0ˆŒ	Ø—:’:Ðˆ~Ø�zŠzÐˆzØ�yŠyÐˆyØ�yŠyØ×)Ò)Ð)Ð)Ü”s˜<Ó(¨1Ñ,Ó-ò 		$ˆAÜ˜5“/ˆCØ�yŠyØ#)�—‘Õ à�”Ø—[‘[“]ò )�Ü˜1Ð0Õ1Ø×&Ñ&Õ(ð)ð �K‰K×Ñ˜sÕ#ñ		$r%   c                 ó.  — |j                   \  }}}}t        | j                  «      dgz   }d}	g }
t        || j                  «      D �]‚  \  }}| j
                  �r6|j                  dz  }|dk(  r|}d}nzt        t        ||z  «      «      }||	z
  }|	dk(  r||z  }t        ||j                  z
  |j                  z  dz   «      }|	|dz
  |j                  z  z   |j                  z   }|	dk(  r||z  }||	z
  dkD  s	J ||	f«       ‚||k  s	J ||f«       ‚|d d …d d …|	|…d d …f   }|	dk(  rt        j                  |dd|df«      }|dk(  rt        j                  |ddd|f«      }|
j                   ||«      «       ||j                  z
  |j                  z   }	�ŒJ|dk(  r|}nt        t        ||z  «      «      }|j                  }d|_        |d d …d d …|	|…f   }|d d …d d …|	|…f   } |||d «      \  }}|
r{|
d   d d …d d …|j                   d …fxx   |d d …d d …d |j                  …f   |j                  j                  j!                  dddd«      z
  z  cc<   |d d …d d …|j                  d …f   }|dk(  r|d d …d d …d |j                   dz  …d d …f   }|	dk(  r|d d …d d …|j                  dz  d …d d …f   }|
j                  |«       ||_        |}	�Œ… t#        j$                  |
d¬«      }| j
                  sst        j&                  |«      }| j
                  r|S |d fS )Nr   r   rL   r   Tr[   r,   )r   Úlistr‚   Úzipr„   rc   r^   rD   Úroundr_   r   r   rŒ   ÚlastÚconv_trÚbiasrp   r2   Úcatrq   )r9   r   Úskipr   rv   rw   rx   ry   ÚratiosÚstartÚoutsÚratior�   r   ÚlimitÚframesrz   r{   r•   Úsr"   Ú_s                         r#   r?   zMultiWrap.forwardÃ   s4  € Ø—g‘g‰ˆˆ1ˆb�!ä�d×'Ñ'Ó(¨A¨3Ñ.ˆØˆØˆÜ ¨¯©Ó4ó -	‰LˆE�5Ø�y‹yØ×'Ñ'¨1Ñ,�Ø˜A’:Ø�EØ‘Fä¤ b¨5¡jÓ 1Ó2�EØ ™�BØ ’zØ˜c™	˜Ü" B¨×):Ñ):Ñ$:¸e¿l¹lÑ#JÈQÑ#NÓO�FØ! V¨a¡Z°5·<±<Ñ$?Ñ?À%×BSÑBSÑS�EØ ’zØ ™˜Ø˜u‘} qÒ(Ð8¨5°%¨.Ó8Ð(Ø ’{Ð/ U¨B KÓ/�{Ø’aš˜E %˜KªÐ*Ñ+�Ø˜A’:ÜŸ™˜a ! Q¨¨Q Ó0�AØ˜A’:ÜŸ™˜a ! Q¨¨3 Ó0�AØ—‘™E !›HÔ%Ø × 1Ñ 1Ñ1°E·L±LÑ@’à˜A’:Ø‘Eä¤ b¨5¡jÓ 1Ó2�EØ—z‘z�Ø!�”
à’aš˜E %˜KÐ'Ñ(�ØššA˜u U˜{Ð*Ñ+�Ù˜q ! TÓ*‘��QÙØ˜‘HšQ¢ E§L¡L =¡>Ð1Ó2ØšAšq - 5§<¡< -Ð/Ñ0°5·=±=×3EÑ3E×3JÑ3JÈ1ÈbÐRSÐUVÓ3WÑWñYÓ2àša¢ E§L¡L¡MÐ1Ñ2�CØ˜A’:Øša¢Ð$7 e§l¡l ]°aÑ%7Ð$7ºÐ:Ñ;�CØ˜A’:Øša¢ E§L¡L°AÑ$5Ñ$6ºÐ9Ñ:�CØ—‘˜CÔ Ø!�”
Ø’ð[-	ô\ �i‰i˜ !Ô$ˆØ�yŠy¡Ü—&‘&˜“+ˆCØ�9Š9ØˆJà˜�9Ðr%   )NN)r@   rA   rB   rC   r/   r?   rG   rH   s   @r#   r   r       s   ø„ ñô$÷4:r%   r   c                   ó@   ‡ — e Zd Zdddddddddi dddfˆ fd„	Zd„ Zˆ xZS )Ú	HDecLayerFrK   rL   r   Tc                 ó�  •‡— t         ‰| �  «        d„ }|
rˆfd„}|r|dz  }nd}|| _        || _        || _        || _        || _        || _        || _        |
| _	        || _
        t        j                  }t        j                  }|r(|dg}|dg}t        j                  }t        j                  } |||||«      | _         ||«      | _        | j                  ryd| _        |rK|r ||d|z  dd|z  z   d|«      | _        n ||d|z  ddd|z  z   gdd|g«      | _         |d|z  «      | _        d| _        |	rt+        |fi |¤Ž| _        yy)zW
        Same as HEncLayer but for decoder. See `HEncLayer` for documentation.
        c                 ó*   — t        j                  «       S r=   rO   rQ   s    r#   rS   z$HDecLayer.__init__.<locals>.<lambda>  rT   r%   c                 ó0   •— t        j                  ‰| «      S r=   rV   rX   s    €r#   rS   z$HDecLayer.__init__.<locals>.<lambda>
  rZ   r%   rL   r   r   Nr[   )r.   r/   r   r•   r]   rh   r`   r_   r^   ra   r†   r   r\   ÚConvTranspose1drb   ÚConvTranspose2dr–   rf   re   rd   rg   r   )r9   rh   ri   r•   r^   r_   rY   r`   r]   rg   ra   rj   rk   r   r†   re   rl   rm   Úklass_trr;   s         `            €r#   r/   zHDecLayer.__init__  s^  ù€ ô 	‰ÑÔÙ)ˆÙÛ<ˆGÙØ Ñ"‰CàˆCØˆŒØˆŒ	ØˆŒ	ØˆŒ	ØˆŒ
ØˆŒØ&ˆÔØˆŒ	Ø(ˆÔÜ—	‘	ˆÜ×%Ñ%ˆÙØ&¨Ð*ˆKØ˜a�[ˆFÜ—I‘IˆEÜ×)Ñ)ˆHÙ  e¨[¸&ÓAˆŒÙ˜U“^ˆŒ
Ø�:Š:ØØˆŒÙÙÙ$ T¨1¨t©8°Q¸¸W¹±_ÀaÈÓQ�•á$ T¨1¨t©8°a¸¸QÀ¹[¹Ð5IÈ1Ø&'¨ \ó 3�”á   T¡Ó*ˆDŒJàˆŒ
ÙÜ˜tÑ0 xÑ0ˆD�Jð r%   c                 ó  — | j                   rA|j                  «       dk(  r.|j                  \  }}}|j                  || j                  d|«      }| j
                  sÛ||z   }| j                  r6t        j                  | j                  | j                  |«      «      d¬«      }n|}| j                  rŒ| j                   r6|j                  \  }}}}|j                  dddd«      j                  d||«      }| j                  |«      }| j                   r-|j                  «      j                  dddd«      }n|}|�J ‚| j                  | j                  |«      «      }	| j                   r.| j                  rj|	d| j                  | j                   …d d …f   }	nH|	d| j                  | j                  |z   …f   }	|	j                  d   |k(  sJ |	j                  d   |f«       ‚| j                   st        j"                  |	«      }	|	|fS )Nro   r   r   r,   r   r[   .)r]   r-   r   rp   rh   r`   re   r   rt   rd   rg   rr   rs   rf   r–   r   r•   rq   )
r9   r   r™   r   rv   rw   ry   r{   rx   r|   s
             r#   r?   zHDecLayer.forward0  s­  € Ø�9Š9˜Ÿ™› AšØ—g‘g‰GˆAˆq�!Ø—‘�q˜$Ÿ)™) R¨Ó+ˆAà�zŠzØ�D‘ˆAà�|Š|Ü—E‘E˜$Ÿ*™* T§\¡\°!£_Ó5¸1Ô=‘à�Ø�zŠzØ—9’9Ø"#§'¡'‘K�A�q˜"˜aØŸ	™	 ! Q¨¨1Ó-×5Ñ5°b¸!¸QÓ?�AØ—J‘J˜q“M�Ø—9’9ØŸ™˜q " a¨Ó+×3Ñ3°A°q¸!¸QÓ?‘AàˆAØ�<Ð�<Ø�J‰J�t—|‘| A“Ó'ˆØ�9Š9Ø�xŠxØ�c˜4Ÿ8™8 T§X¡X IÐ-ªqÐ0Ñ1‘à�#�t—x‘x §¡¨6Ñ 1Ð1Ð1Ñ2ˆAØ—7‘7˜2‘; &Ò(Ð?¨1¯7©7°2©;¸Ð*?Ó?Ð(Ø�yŠyÜ—‘�q“	ˆAØ�!ˆtˆr%   r}   rH   s   @r#   r£   r£      s-   ø„ Ø).¸AÀaÐUVÐ^cØ $¨T¸1ÀrÈtØ"¨Dõ-1ö^r%   r£   c                   ó˜   ‡ — e Zd ZdZe	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	ˆ fd„	«       Zd„ Zd
d„Zd„ Zd„ Z	d„ Z
d„ Zˆ xZS )ÚHDemucsaV  
    Spectrogram and hybrid Demucs model.
    The spectrogram model has the same structure as Demucs, except the first few layers are over the
    frequency axis, until there is only 1 frequency, and then it moves to time convolutions.
    Frequency layers can still access information across time steps thanks to the DConv residual.

    Hybrid model have a parallel time branch. At some layer, the time branch has the same stride
    as the frequency branch and then the two are combined. The opposite happens in the decoder.

    Models can either use naive iSTFT from masking, Wiener filtering ([Ulhih et al. 2017]),
    or complex as channels (CaC) [Choi et al. 2020]. Wiener filtering is based on
    Open Unmix implementation [Stoter et al. 2019].

    The loss is always on the temporal domain, by backpropagating through the above
    output methods and iSTFT. This allows to define hybrid models nicely. However, this breaks
    a bit Wiener filtering, as doing more iteration at test time will change the spectrogram
    contribution, without changing the one from the waveform, which will lead to worse performance.
    I tried using the residual option in OpenUnmix Wiener implementation, but it didn't improve.
    CaC on the other hand provides similar performance for hybrid, and works naturally with
    hybrid models.

    This model also uses frequency embeddings are used to improve efficiency on convolutions
    over the freq. axis, following [Isik et al. 2020] (https://arxiv.org/pdf/2008.04470.pdf).

    Unlike classic Demucs, there is no resampling here, and normalization is always applied.
    c$                 ó¸  •— t         ‰:| �  «        |
| _        |	| _        || _        || _        || _        || _        || _        || _	        || _
        |"| _        |#| _        || _        |dz  | _        || _        || _        d| _        || _        || _        |r	|sJ d«       ‚|r||k(  sJ ‚t)        j*                  «       | _        t)        j*                  «       | _        |r2t)        j*                  «       | _        t)        j*                  «       | _        |}$|$}%| j                  r|%dz  }%|xs |}&|}'|dz  }(t5        |«      D �]  })|)|k\  }*|)|k\  }+|)|k\  },|(dkD  }-|}.|}/|-s|(dk(  sJ ‚|dz  }/|}.d}0d}1|-r|(|k  r|(}/d}0d}1|/|.|-|0|,|||*|+||| ddœd	œ}2t7        |2«      }3d
|3d<   ||3d<   ||3d<   d|3d<   t7        |2«      }4d}5|r|)|k  rd}5d|4d<   |1rt9        |&|'«      }'|'}&t;        |%|'f|dz  |dœ|2¤Ž}6|r1|-r/t;        |$|&f|dz  ||1dœ|3¤Ž}7| j0                  j=                  |7«       |5rt?        |6|«      }6| j,                  j=                  |6«       |)d
k(  r5| j                  tA        | j
                  «      z  }$|$}%| j                  r|%dz  }%tC        |'|%f|dz  |)d
k(  |dœ|4¤Ž}8|5rt?        |8|«      }8|r6|-r4tC        |&|$f|dz  |1|)d
k(  |dœ|3¤Ž}9| j2                  jE                  d
|9«       | j.                  jE                  d
|8«       |&}$|'}%tG        ||&z  «      }&tG        ||'z  «      }'|-r|(|k  rd}(n|(|z  }(|)d
k(  s�Œñ|s�ŒõtI        |(|%||¬«      | _        || _%        �Œ |!rtM        | |!¬«       yy)aa  
        Args:
            sources (list[str]): list of source names.
            audio_channels (int): input/output audio channels.
            channels (int): initial number of hidden channels.
            channels_time: if not None, use a different `channels` value for the time branch.
            growth: increase the number of hidden channels by this factor at each layer.
            nfft: number of fft bins. Note that changing this require careful computation of
                various shape parameters and will not work out of the box for hybrid models.
            wiener_iters: when using Wiener filtering, number of iterations at test time.
            end_iters: same but at train time. For a hybrid model, must be equal to `wiener_iters`.
            wiener_residual: add residual source before wiener filtering.
            cac: uses complex as channels, i.e. complex numbers are 2 channels each
                in input and output. no further processing is done before ISTFT.
            depth (int): number of layers in the encoder and in the decoder.
            rewrite (bool): add 1x1 convolution to each layer.
            hybrid (bool): make a hybrid time/frequency domain, otherwise frequency only.
            hybrid_old: some models trained for MDX had a padding bug. This replicates
                this bug to avoid retraining them.
            multi_freqs: list of frequency ratios for splitting frequency bands with `MultiWrap`.
            multi_freqs_depth: how many layers to wrap with `MultiWrap`. Only the outermost
                layers will be wrapped.
            freq_emb: add frequency embedding after the first frequency layer if > 0,
                the actual value controls the weight of the embedding.
            emb_scale: equivalent to scaling the embedding learning rate
            emb_smooth: initialize the embedding with a smooth one (with respect to frequencies).
            kernel_size: kernel_size for encoder and decoder layers.
            stride: stride for encoder and decoder layers.
            time_stride: stride for the final time layer, after the merge.
            context: context for 1x1 conv in the decoder.
            context_enc: context for 1x1 conv in the encoder.
            norm_starts: layer at which group norm starts being used.
                decoder layers are numbered in reverse order.
            norm_groups: number of groups for group norm.
            dconv_mode: if 1: dconv in encoder only, 2: decoder only, 3: both.
            dconv_depth: depth of residual DConv branch.
            dconv_comp: compression of DConv branch.
            dconv_attn: adds attention layers in DConv branch starting at this layer.
            dconv_lstm: adds a LSTM layer in DConv branch starting at this layer.
            dconv_init: initial scale for the DConv branch LayerScale.
            rescale: weight recaling trick

        rL   Nz%hybrid_old must come with hybrid=Truer[   r   TF)ÚlstmÚattnÚdepthÚcompressÚinitrq   )r^   r_   r]   r   ra   re   rY   rk   r   r]   r^   r_   r   r†   )rg   rj   )rg   rj   r`   )rg   r•   rj   )rg   r`   r•   rj   )r:   r*   )Ú	reference)'r.   r/   ÚcacÚwiener_residualÚaudio_channelsÚsourcesr^   rj   r_   r°   ÚchannelsÚ
samplerateÚsegmentÚnfftÚ
hop_lengthÚwiener_itersÚ	end_itersÚfreq_embÚhybridÚ
hybrid_oldr   rƒ   ÚencoderÚdecoderÚtencoderÚtdecoderr‡   Údictr   rJ   rŒ   r   rˆ   r£   ÚinsertrD   r'   Úfreq_emb_scaler	   );r9   r·   r¶   r¸   Úchannels_timeÚgrowthr»   r½   r¾   rµ   r´   r°   re   rÀ   rÁ   Úmulti_freqsÚmulti_freqs_depthr¿   Ú	emb_scaleÚ
emb_smoothr^   Útime_strider_   rj   Úcontext_encÚnorm_startsrY   Ú
dconv_modeÚdconv_depthÚ
dconv_compÚ
dconv_attnÚ
dconv_lstmÚ
dconv_initÚrescaler¹   rº   rh   Úchin_zri   Úchout_zÚfreqsÚindexr®   r¯   ra   r]   ÚstriÚkerr   Ú	last_freqÚkwÚkwtÚkw_decÚmultiÚencÚtencÚdecÚtdecr;   s;                                                             €r#   r/   zHDemucs.__init__m  s  ø€ ôr 	‰ÑÔØˆŒØ.ˆÔØ,ˆÔØˆŒØ&ˆÔØˆŒØˆŒØˆŒ
Ø ˆŒØ$ˆŒØˆŒàˆŒ	Ø !™)ˆŒØ(ˆÔØ"ˆŒØˆŒØˆŒØ$ˆŒÙÙÐBÐBÓB�6ÙØ 9Ò,Ð,Ð,ä—}‘}“ˆŒÜ—}‘}“ˆŒáÜŸM™M›OˆDŒMÜŸM™M›OˆDŒMàˆØˆØ�8Š8Ø�a‰KˆFØÒ) ˆØˆØ˜‘	ˆä˜5“\ó X	/ˆEØ˜JÑ&ˆDØ˜JÑ&ˆDØ˜KÑ'ˆDØ˜1‘9ˆDØˆDØˆCÙØ ’zÐ!�zØ! A‘o�Ø"�àˆCØˆIÙ˜ Ò,Ø�Ø�Ø �	ð  #ØØØØØ"Ø*à Ø Ø(Ø *Ø&Ø ññˆBô" �r“(ˆCØˆC�‰KØ!,ˆC�ÑØ"ˆC�‰MØˆC�‰JÜ˜"“XˆFØˆEÙ˜uÐ'8Ò8Ø�Ø).��~Ñ&áÜ˜e WÓ-�Ø�ä˜F Gð MØ",¨q¡.¸+ñMØIKñMˆCá™$Ü   uð 9°JÀ±NÈKØ'0ñ9Ø47ñ9�à—‘×$Ñ$ TÔ*áÜ  [Ó1�Ø�L‰L×Ñ Ô$Ø˜ŠzØ×*Ñ*¬S°·±Ó->Ñ>�Ø�Ø—8’8Ø˜a‘K�FÜ˜G Vð H°:À±>Ø!&¨!¡°WñHØ@FñHˆCáÜ  [Ó1�Ù™$Ü  ¨ð J°JÀ±NÈ)Ø&+¨q¡j¸'ñJØEHñJ�à—‘×$Ñ$ Q¨Ô-Ø�L‰L×Ñ  3Ô'àˆDØˆFÜ˜ ™Ó'ˆEÜ˜& 7Ñ*Ó+ˆGÙØ˜KÒ'Ø‘Eà˜fÑ$�EØ˜Œz›hÜ /Ø˜6¨*¸Iô!G�”à&.�Ö#ðqX	/ñt Ü˜4¨7Ö3ð r%   c                 óD  — | j                   }| j                  }|}| j                  r—||dz  k(  sJ ‚t        t	        j
                  |j                  d   |z  «      «      }|dz  dz  }| j                  s't        |||||z  z   |j                  d   z
  fd¬«      }n$t        |||||z  z   |j                  d   z
  f«      }t        |||«      dd d…d d …f   }| j                  r?|j                  d   dz   k(  sJ |j                  |j                  |f«       ‚|ddd|z   …f   }|S )NrL   r   r[   ro   r   )r   .)
r¼   r»   rÀ   rD   ÚmathÚceilr   rÁ   r$   r   )r9   r   Úhlr»   r   rz   r   r|   s           r#   Ú_speczHDemucs._specK  s   € Ø�_‰_ˆØ�y‰yˆØˆà�;Š;ð ˜ ™’?Ð"�?Ü”T—Y‘Y˜qŸw™w r™{¨RÑ/Ó0Ó1ˆBØ˜‘'˜A‘+ˆCØ—?’?Ü˜!˜c 3¨¨b©¡=°1·7±7¸2±;Ñ#>Ð?ÀiÔP‘ä˜!˜c 3¨¨b©¡=°1·7±7¸2±;Ñ#>Ð?Ó@�ä�A�t˜RÓ   c r cª1 Ñ-ˆØ�;Š;Ø—7‘7˜2‘; " q¡&Ò(Ð@¨1¯7©7°A·G±G¸RÐ*@Ó@Ð(Ø�#�q˜˜2™�v�+‘ˆAØˆr%   c                 óà  — | j                   d|z  z  }t        j                  |d«      }| j                  r¬t        j                  |d«      }|dz  dz  }| j                  s+|t        t        j                  ||z  «      «      z  d|z  z   }n$|t        t        j                  ||z  «      «      z  }t        |||¬«      }| j                  s|d|||z   …f   }|S |dd |…f   }|S t        |||«      }|S )NrL   )r   r   r   r   )r[   r[   r[   ro   )r   .)	r¼   r   r   rÀ   rÁ   rD   ré   rê   r   )r9   r|   r   r*   rë   r   rz   r   s           r#   Ú_ispeczHDemucs._ispecf  só   € Ø�_‰_  e¡Ñ,ˆÜ�E‰E�!�\Ó"ˆØ�;Š;Ü—‘�a˜Ó ˆAØ˜‘'˜A‘+ˆCØ—?’?Øœ#œdŸi™i¨°©Ó4Ó5Ñ5¸¸C¹Ñ?‘àœ#œdŸi™i¨°©Ó4Ó5Ñ5�Ü˜˜B rÔ*ˆAØ—?’?Ø�c˜3˜s V™|Ð+Ð+Ñ,�ð
 ˆð �c˜7˜F˜7�l‘O�ð ˆô ˜˜B Ó'ˆAØˆr%   c                 óâ   — | j                   rR|j                  \  }}}}t        j                  |«      j	                  ddddd«      }|j                  ||dz  ||«      }|S |j                  «       }|S )Nr   r   rL   r[   ro   )r´   r   r2   Úview_as_realrr   rs   Úabs)r9   r|   rv   rw   rx   ry   r�   s          r#   Ú
_magnitudezHDemucs._magnitudey  sp   € ð �8Š8ØŸ'™'‰KˆAˆq�"�aÜ×"Ñ" 1Ó%×-Ñ-¨a°°A°q¸!Ó<ˆAØ—	‘	˜!˜Q ™U B¨Ó*ˆAð ˆð —‘“ˆAØˆr%   c                 ó˜  — | j                   }| j                  ra|j                  \  }}}}}|j                  ||dd||«      j	                  dddddd«      }	t        j                  |	j                  «       «      }	|	S | j                  r| j                  }|dk  r"|d d …d f   }|d|j                  «       z   z  |z  S | j                  |||«      S )	Nr   r[   r   r   rL   é   ro   g:Œ0âŽyE>)r½   r´   r   rp   rr   r2   Úview_as_complexÚ
contiguousÚtrainingr¾   rñ   Ú_wiener)
r9   r|   r�   Únitersrv   ÚSrw   rx   ry   r"   s
             r#   Ú_maskzHDemucs._mask„  sÃ   € ð ×"Ñ"ˆØ�8Š8ØŸW™W‰NˆAˆq�!�R˜Ø—&‘&˜˜A˜r 1 b¨!Ó,×4Ñ4°Q¸¸1¸aÀÀAÓFˆCÜ×'Ñ'¨¯©Ó(8Ó9ˆCØˆJØ�=Š=Ø—^‘^ˆFØ�AŠ:Ø’!�T�'‘
ˆAØ˜˜qŸu™u›w™Ñ'¨!Ñ+Ð+à—<‘<  1 fÓ-Ð-r%   c                 ó  — |j                   }d}| j                  }|j                  \  }}}	}
}|j                  ddddd«      }t	        j
                  |j                  dddd«      «      }g }t        |«      D ]‡  }d}g }t        d||«      D ]K  }t        |||z   «      }t        |||f   |||f   ||¬«      }|j                  |j                  dd	«      «       ŒM |j                  t	        j                  |d¬
«      «       Œ‰ t	        j                  t	        j                  |d«      «      }|j                  ddddd«      j                  «       }|r|d d …d d…f   }t        |j                  «      |||	|
|gk(  sJ ‚|j!                  |«      S )Ni,  r   rL   ro   r[   r   )Úresidualr   éþÿÿÿr,   )Údtyperµ   r   rr   r2   rð   r‡   Úslicer   rŒ   Ú	transposer˜   rõ   Ústackrö   r’   r7   )r9   Úmag_outÚmix_stftrù   r²   Úwiener_win_lenrý   rv   rú   rw   ÚFqry   rœ   ÚsampleÚposr"   ÚframeÚz_outs                     r#   rø   zHDemucs._wiener•  s‡  € à�~‰~ˆØˆØ×'Ñ'ˆà Ÿ™‰ˆˆ1ˆa��QØ—/‘/ ! Q¨¨1¨aÓ0ˆÜ×%Ñ% h×&6Ñ&6°q¸!¸QÀÓ&BÓCˆàˆÜ˜A“hò 		/ˆFØˆCØˆCÜ˜Q  >Ó2ò 4�Ü˜c 3¨Ñ#7Ó8�ÜØ˜F E˜MÑ*¨H°V¸U°]Ñ,CÀVØ%ô'�ð —
‘
˜5Ÿ?™?¨2¨rÓ2Õ3ð4ð �K‰KœŸ	™	 #¨1Ô-Õ.ð		/ô ×#Ñ#¤E§K¡K°°aÓ$8Ó9ˆØ�k‰k˜!˜Q  1 aÓ(×3Ñ3Ó5ˆÙØ’a˜˜"˜�f‘+ˆCÜ�C—I‘I‹ 1 a¨¨B°Ð"2Ò2Ð2Ð2Ø�v‰v�d‹|Ðr%   c                 ó	  — |}|j                   d   }| j                  |«      }| j                  |«      j                  |j                  «      }|}|j                   \  }}}}	|j                  dd¬«      }
|j                  dd¬«      }||
z
  d|z   z  }| j                  r3|}|j                  dd¬«      }|j                  dd¬«      }||z
  d|z   z  }g }g }g }g }t        | j                  «      D �]C  \  }}|j                  |j                   d   «       d }| j                  rm|t        | j                  «      k  rU|j                  j                   d   «       | j                  |   } ||«      }|j                  s|j                  |«       n|} |||«      }|dk(  r…| j                  �yt        j                   |j                   d   |j                  ¬	«      }| j                  |«      j#                  «       d d d …d d …d f   j%                  |«      }|| j&                  |z  z   }|j                  |«       �ŒF t        j(                  |«      }| j                  rt        j(                  |«      }t        | j*                  «      D ]ý  \  }}|j-                  d«      } ||||j-                  d«      «      \  }}| j                  r"| j.                  t        | j0                  «      z
  }| j                  sŒn|k\  sŒt| j0                  ||z
     }|j-                  d«      }|j                  r=|j                   d
   dk(  sJ |j                   «       ‚|d d …d d …df   } ||d |«      \  }}Œà|j-                  d«      } |||«      \  }}Œÿ t        |«      dk(  sJ ‚t        |«      dk(  sJ ‚t        |«      dk(  sJ ‚t        | j2                  «      } |j5                  || d||	«      }||d d …d f   z  |
d d …d f   z   }|j                  j6                  dk(  }!|!r|j9                  «       }| j;                  ||«      }"| j=                  |"|«      }|!r|j                  d«      }| j                  r/j5                  || d|«      }|d d …d f   z  d d …d f   z   }||z   }|S )Nr   )r   r[   ro   T)r-   Úkeepdimgñhãˆµøä>)r   r[   r   rþ   )Údevicer[   r   Úmps)r   rì   rò   r7   r  ÚmeanÚstdrÀ   Ú	enumeraterÂ   rŒ   rˆ   rÄ   r`   r¿   r2   r6   ÚtÚ	expand_asrÈ   Ú
zeros_likerÃ   Úpopr°   rÅ   r·   rp   ÚtypeÚcpurû   rî   )#r9   Úmixr   r   r|   Úmagrv   rw   r  ry   r  r  ÚxtÚmeantÚstdtÚsavedÚsaved_tÚlengthsÚ	lengths_tÚidxÚencoderu   rå   ÚfrsÚembÚdecoder™   ÚpreÚoffsetrç   Úlength_tr¡   rú   Úx_is_mpsÚzouts#                                      r#   r?   zHDemucs.forward±  s9  € ØˆØ—‘˜‘ˆà�J‰J�s‹OˆØ�o‰o˜aÓ ×#Ñ# C§J¡JÓ/ˆØˆà—g‘g‰ˆˆ1ˆb�!ð �v‰v˜)¨TˆvÓ2ˆØ�e‰e˜	¨4ˆeÓ0ˆØ�‰X˜$ ™*Ñ%ˆð �;Š;àˆBØ—G‘G °�GÓ5ˆEØ—6‘6˜f¨d�6Ó3ˆDØ�u‘* ¨¡Ñ-ˆBð ˆØˆØˆØˆ	Ü$ T§\¡\Ó2ó 	‰KˆC�Ø�N‰N˜1Ÿ7™7 2™;Ô'ØˆFØ�{Š{˜s¤S¨¯©Ó%7Ò7à× Ñ  §¡¨"¡Ô.Ø—}‘} SÑ)�Ù˜"“X�Ø—z’zà—N‘N 2Õ&ð  �FÙ�q˜&Ó!ˆAØ�aŠx˜DŸM™MÐ5ô —l‘l 1§7¡7¨2¡;°q·x±xÔ@�Ø—m‘m CÓ(×*Ñ*Ó,¨T²1²a¸Ð-=Ñ>×HÑHÈÓK�Ø˜×+Ñ+¨cÑ1Ñ1�à�L‰L˜ŽOð/	ô2 ×Ñ˜QÓˆØ�;Š;Ü×!Ñ! !Ó$ˆBô % T§\¡\Ó2ò 	5‰KˆC�Ø—9‘9˜R“=ˆDÙ˜A˜t W§[¡[°£_Ó5‰FˆAˆsð �{Š{ØŸ™¤c¨$¯-©-Ó&8Ñ8�Ø�{‹{˜s f›}Ø—}‘} S¨6¡\Ñ2�Ø$Ÿ=™=¨Ó,�Ø—:’:ØŸ9™9 Q™<¨1Ò,Ð7¨c¯i©iÓ7Ð,Øša¢ A˜g™,�CÙ   d¨HÓ5‘E�B™à"Ÿ;™; r›?�DÙ   T¨8Ó4‘E�B™ð#	5ô( �5‹z˜QŠÐˆÜ�9‹~ Ò"Ð"Ð"Ü�7‹|˜qÒ Ð Ð ä�—‘ÓˆØ�F‰F�1�a˜˜R Ó#ˆØ�’A�t�G‘Ñ˜t¢A t G™}Ñ,ˆð —8‘8—=‘= EÑ)ˆÙØ—‘“ˆAà�z‰z˜!˜QÓˆØ�K‰K˜˜fÓ%ˆñ Ø—‘�U“ˆAà�;Š;Ø—‘˜˜A˜r 6Ó*ˆBØ�dš1˜d˜7‘mÑ# eªA¨t¨G¡nÑ4ˆBØ�Q‘ˆAØˆr%   )"r[   é0   Nr[   i   r   r   FTé   TTFNr[   gš™™™™™É?é
   TrK   r[   rL   r   r   rL   rL   r   r[   rL   rL   rL   g-Cëâ6?gš™™™™™¹?iD¬  é(   )Nr   )r@   rA   rB   rC   r
   r/   rì   rî   rò   rû   rø   r?   rG   rH   s   @r#   r¬   r¬   R  s§   ø„ ñð4 ð !"ØØ#ØàØØØ!&ØàØØØ!à!Ø#$ØØØ àØØØØàØàØØØØØ àà!ØôY[4ó ð[4òzó6ò&	ò.ò"ö8ir%   r¬   )Úconstantg        )!rC   Úcopyr   ré   ÚtypingÚtpÚopenunmix.filteringr   r2   r   Útorch.nnr   r   Údemucsr   r	   Ústatesr
   Úspecr   r   ÚTensorÚTuplerD   ÚstrrE   r$   ÚModuler'   rJ   r   r£   r¬   © r%   r#   ú<module>r=     s¸   ðñõ Û Û å &Û Ý Ý $ç )Ý  ß #ñˆU�\‰\ð  R§X¡X¨c°3¨hÑ%7ð ¸sð ÐX]ó ô(�b—i‘iô ô4X�—	‘	ô Xôv]�—	‘	ô ]ô@O�—	‘	ô OôdHˆb�i‰iõ Hr%   