Ë
    P/æjH*  ã                   ó¢  — d Z ddlmZ ddlZddlZ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 dd	lmZ dd
lmZmZ ej,                  eeef   Z G d„ dej0                  «      Z G d„ d«      Zd„ Z	 	 	 	 	 ddej,                  eef   dej,                  ej8                  ef   dededededededej@                  e   dej8                  fd„Z!y)z‡
Code to apply a model to a mix. It will handle chunking with overlaps and
inteprolation between chunks, as well as the "shift trick".
é    )ÚThreadPoolExecutorN)Únn)Ú
functionalé   )ÚDemucs)ÚHDemucs)ÚHTDemucs)Úcenter_trimÚDummyPoolExecutorc                   óÐ   ‡ — e Zd Z	 	 ddej                  e   dej                  ej                  ej                  e         dej                  e   fˆ fd„Ze	defd„«       Z
d„ Zˆ xZS )	ÚBagOfModelsÚmodelsÚweightsÚsegmentc                 ó´  •— t         ‰| �  «        t        |«      dkD  sJ ‚|d   }|D ]]  }|j                  |j                  k(  sJ ‚|j                  |j                  k(  sJ ‚|j
                  |j
                  k(  sJ ‚|€ŒW||_        Œ_ |j
                  | _        |j                  | _        |j                  | _        t        j                  |«      | _	        |€/|D �cg c]  }|j                  D �cg c]  }d‘Œ c}‘Œ }}|| _
        yt        |«      t        |«      k(  sJ ‚|D ]%  }t        |«      t        |j                  «      k(  rŒ%J ‚ || _
        yc c}w c c}w )a¢  
        Represents a bag of models with specific weights.
        You should call `apply_model` rather than calling directly the forward here for
        optimal performance.

        Args:
            models (list[nn.Module]): list of Demucs/HDemucs models.
            weights (list[list[float]]): list of weights. If None, assumed to
                be all ones, otherwise it should be a list of N list (N number of models),
                each containing S floats (S number of sources).
            segment (None or float): overrides the `segment` attribute of each model
                (this is performed inplace, be careful is you reuse the models passed).
        r   Nç      ð?)ÚsuperÚ__init__ÚlenÚsourcesÚ
samplerateÚaudio_channelsr   r   Ú
ModuleListr   r   )	Úselfr   r   r   ÚfirstÚotherÚ_ÚweightÚ	__class__s	           €úO/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/demucs/apply.pyr   zBagOfModels.__init__   sH  ø€ ô  	‰ÑÔÜ�6‹{˜QŠÐˆØ�q‘	ˆØò 	(ˆEØ—=‘= E§M¡MÒ1Ð1Ð1Ø×#Ñ# u×'7Ñ'7Ò7Ð7Ð7Ø×'Ñ'¨5×+?Ñ+?Ò?Ð?Ð?ØÑ"Ø '�•ð	(ð $×2Ñ2ˆÔØ×*Ñ*ˆŒØ—}‘}ˆŒÜ—m‘m FÓ+ˆŒàˆ?Ø<BÖC°q E§M¡MÖ2˜qšÔ2ÐCˆGÐCð
 ˆ�ô �w“<¤3 v£;Ò.Ð.Ð.Ø!ò 9�Ü˜6“{¤c¨%¯-©-Ó&8Ó8Ð8Ð8ð9àˆ�ùò 3ùÒCs   ÃEÃ-	E
Ã6EÅEÚreturnc                 óž   — t        d«      }| j                  D ]2  }t        |t        «      sŒt	        |t        |j
                  «      «      }Œ4 |S )NÚinf)Úfloatr   Ú
isinstancer	   Úminr   )r   Úmax_allowed_segmentÚmodels      r    r'   zBagOfModels.max_allowed_segmentC   sJ   € ä# E›lÐØ—[‘[ò 	UˆEÜ˜%¤Õ*Ü&)Ð*=¼uÀUÇ]Á]Ó?SÓ&TÑ#ð	Uð #Ð"ó    c                 ó   — t        d«      ‚)NzCall `apply_model` on this.)ÚNotImplementedError)r   Úxs     r    ÚforwardzBagOfModels.forwardK   s   € Ü!Ð"?Ó@Ð@r)   )NN)Ú__name__Ú
__module__Ú__qualname__ÚtpÚListÚModelÚOptionalr$   r   Úpropertyr'   r-   Ú__classcell__)r   s   @r    r   r      sr   ø„ àAEØ/3ñ%˜rŸw™w u™~ð %ØŸ+™+ b§g¡g¨b¯g©g°e©nÑ&=Ñ>ð%àŸ+™+ eÑ,õ%ðN ð# Uò #ó ð#öAr)   r   c                   ó*   — e Zd Zdd„Zed„ «       Zd„ Zy)ÚTensorChunkNc                 ó$  — |j                   d   }|dk\  sJ ‚||k  sJ ‚|€||z
  }nt        ||z
  |«      }t        |t        «      r&|j                  | _        ||j
                  z   | _        n|| _        || _        || _        |j                  | _        y )Néÿÿÿÿr   )Úshaper&   r%   r8   ÚtensorÚoffsetÚlengthÚdevice)r   r<   r=   r>   Útotal_lengths        r    r   zTensorChunk.__init__P   s�   € Ø—|‘| BÑ'ˆØ˜Š{Ðˆ{Ø˜Ò$Ð$Ð$àˆ>Ø! FÑ*‰Fä˜¨Ñ.°Ó7ˆFä�fœkÔ*Ø Ÿ-™-ˆDŒKØ  6§=¡=Ñ0ˆD�Kà ˆDŒKØ ˆDŒKØˆŒØ—m‘mˆ�r)   c                 ób   — t        | j                  j                  «      }| j                  |d<   |S )Nr:   )Úlistr<   r;   r>   )r   r;   s     r    r;   zTensorChunk.shapec   s(   € ä�T—[‘[×&Ñ&Ó'ˆØ—K‘Kˆˆb‰	Øˆr)   c                 óP  — || j                   z
  }| j                  j                  d   }|dk\  sJ ‚| j                  |dz  z
  }||z   }t	        d|«      }t        ||«      }||z
  }||z
  }	t        j                  | j                  d||…f   ||	f«      }
|
j                  d   |k(  sJ ‚|
S )Nr:   r   é   .)r>   r<   r;   r=   Úmaxr&   ÚFÚpad)r   Útarget_lengthÚdeltar@   ÚstartÚendÚcorrect_startÚcorrect_endÚpad_leftÚ	pad_rightÚouts              r    ÚpaddedzTensorChunk.paddedi   sº   € Ø §¡Ñ+ˆØ—{‘{×(Ñ(¨Ñ,ˆØ˜ŠzÐˆzà—‘˜e q™jÑ(ˆØ�mÑ#ˆä˜A˜u›ˆÜ˜,¨Ó,ˆà  5Ñ(ˆØ˜+Ñ%ˆ	ä�e‰e�D—K‘K  ]°;Ð%>Ð >Ñ?À(ÈIÐAVÓWˆØ�y‰y˜‰} Ò-Ð-Ð-Øˆ
r)   )r   N)r.   r/   r0   r   r5   r;   rQ   © r)   r    r8   r8   O   s    „ ó$ð& ñó ðó
r)   r8   c                 ót   — t        | t        «      r| S t        | t        j                  «      sJ ‚t        | «      S )N)r%   r8   ÚthÚTensor)Útensor_or_chunks    r    Útensor_chunkrW   |   s1   € Ü�/¤;Ô/ØÐä˜/¬2¯9©9Ô5Ð5Ð5Ü˜?Ó+Ð+r)   r(   ÚmixÚshiftsÚsplitÚoverlapÚtransition_powerÚprogressÚnum_workersr   r!   c           	      óà  — |€|j                   }nt        j                   |«      }|
€*|dkD  r|j                  dk(  rt        |«      }
n
t	        «       }
|||||||
|	dœ}t        | t        «      �r0d}dgt        | j                  «      z  }t        | j                  | j                  «      D ]�  \  }}t        t        |j                  «       «      «      j                   }|j                  |«       t!        ||fi |¤Ž}|j                  |«       t#        |«      D ])  \  }}|dd…|dd…dd…fxx   |z  cc<   ||xx   |z  cc<   Œ+ ||z  }~ŒŸ t        |t        j$                  «      sJ ‚t'        |j(                  d   «      D ]  }|dd…|dd…dd…fxx   ||   z  cc<   Œ |S | j                  |«       | j+                  «        |dk\  sJ d«       ‚|j(                  \  }}}|rËd|d<   t-        d	| j.                  z  «      }t1        |«      }t        |t2        «      sJ ‚|j5                  |d
|z  z   «      }d}t'        |«      D ]G  }t7        j8                  d|«      }t3        ||||z   |z
  «      }t!        | |fi |¤Ž}||d||z
  d…f   z  }ŒI ||z  }t        |t        j$                  «      sJ ‚|S |�red|d<   t        j:                  |t        | j                  «      |||j                   ¬«      }t        j:                  ||j                   ¬«      }|	€| j<                  }	|	�|	dkD  sJ ‚t-        | j.                  |	z  «      }t-        d|z
  |z  «      }t'        d||«      } t?        tA        || j.                  z  d«      «      }!t        jB                  t        jD                  d|d
z  dz   |¬«      t        jD                  ||d
z  z
  dd|¬«      g«      }"t        |"«      |k(  sJ ‚|"|"jG                  «       z  |z  }"g }#| D ]@  }t3        |||«      }$ |
jH                  t         | |$fi |¤Ž}%|#jK                  |%|f«       ||z  }ŒB |rtM        jL                  |#|!dd¬«      }#|#D ]„  \  }%}|%jO                  «       }&|&j(                  d   }'|d|||z   …fxx   |"d|' |&z  j                  |j                   «      z  cc<   ||||z   xxx |"d|' j                  |j                   «      z  ccc Œ† |jQ                  «       dkD  sJ ‚||z  }t        |t        j$                  «      sJ ‚|S t        | tR        «      r|	�t-        |	| j.                  z  «      }(n tU        | d«      r| jW                  |«      }(n|}(t1        |«      }t        |t2        «      sJ ‚|j5                  |(«      j                  |«      }t        jX                  «       5   | |«      }ddd«       t        t        j$                  «      sJ ‚t[        ||«      S # 1 sw Y   Œ1xY w)a©  
    Apply model to a given mixture.

    Args:
        shifts (int): if > 0, will shift in time `mix` by a random amount between 0 and 0.5 sec
            and apply the oppositve shift to the output. This is repeated `shifts` time and
            all predictions are averaged. This effectively makes the model time equivariant
            and improves SDR by up to 0.2 points.
        split (bool): if True, the input will be broken down in 8 seconds extracts
            and predictions will be performed individually on each and concatenated.
            Useful for model with large memory footprint like Tasnet.
        progress (bool): if True, show a progress bar (requires split=True)
        device (torch.device, str, or None): if provided, device on which to
            execute the computation, otherwise `mix.device` is assumed.
            When `device` is different from `mix.device`, only local computations will
            be on `device`, while the entire tracks will be stored on `mix.device`.
        num_workers (int): if non zero, device is 'cpu', how many threads to
            use in parallel.
        segment (float or None): override the model segment parameter.
    Nr   Úcpu)rY   rZ   r[   r\   r]   r?   Úpoolr   g        r   z-transition_power < 1 leads to weird behavior.rY   g      à?rD   .FrZ   )r?   z.2fr:   éx   Úseconds)Ú
unit_scaleÚncolsÚunitÚvalid_length).r?   rT   Útyper   r   r%   r   r   r   Úzipr   r   ÚnextÚiterÚ
parametersÚtoÚapply_modelÚ	enumeraterU   Úranger;   ÚevalÚintr   rW   r8   rQ   ÚrandomÚrandintÚzerosr   r$   ÚformatÚcatÚarangerE   ÚsubmitÚappendÚtqdmÚresultr&   r	   Úhasattrrg   Úno_gradr
   ))r(   rX   rY   rZ   r[   r\   r]   r?   r^   r   ra   ÚkwargsÚ	estimatesÚtotalsÚ	sub_modelÚmodel_weightsÚoriginal_model_devicerP   ÚkÚinst_weightÚbatchÚchannelsr>   Ú	max_shiftÚ
padded_mixr   r=   ÚshiftedÚshifted_outÚ
sum_weightÚsegment_lengthÚstrideÚoffsetsÚscaler   ÚfuturesÚchunkÚfutureÚ	chunk_outÚchunk_lengthrg   s)                                            r    rn   rn   „   sè  € ð6 €~Ø—‘‰ä—‘˜6Ó"ˆØ€|Ø˜Š?˜vŸ{™{¨eÒ3Ü% kÓ2‰Dä$Ó&ˆDàØØØ,ØØØØñ	$€Fô �%œÕ%ð 13ˆ	Ø�œ˜EŸM™MÓ*Ñ*ˆÜ(+¨E¯L©L¸%¿-¹-Ó(Hò 
	Ñ$ˆI�}Ü$(¬¨i×.BÑ.BÓ.DÓ)EÓ$F×$MÑ$MÐ!Ø�L‰L˜Ô ä˜i¨Ñ7°Ñ7ˆCØ�L‰LÐ.Ô/Ü"+¨MÓ":ò )‘��;Ø’A�qš!šQ�J“ ;Ñ.“Ø�q“	˜[Ñ(”	ð)ð ˜ÑˆIÙð
	ô ˜)¤R§Y¡YÔ/Ð/Ð/Ü�y—‘ qÑ)Ó*ò 	/ˆAØ’a˜šAšq�jÓ! V¨A¡YÑ.Ô!ð	/àÐà	‡H�HˆVÔØ	‡J�J„LØ˜qÒ ÐQÐ"QÓQÐ Ø!Ÿi™iÑ€Eˆ8�VÙØˆˆxÑÜ˜˜e×.Ñ.Ñ.Ó/ˆ	Ü˜3ÓˆÜ˜#œ{Ô+Ð+Ð+Ø—Z‘Z ¨¨Y©Ñ 6Ó7ˆ
ØˆÜ�v“ò 	9ˆAÜ—^‘^ A yÓ1ˆFÜ! *¨f°f¸yÑ6HÈ6Ñ6QÓRˆGÜ% e¨WÑ?¸Ñ?ˆKØ�;˜s I°Ñ$6Ñ$7Ð7Ñ8Ñ8‰Cð		9ð
 	ˆv‰ˆÜ˜#œrŸy™yÔ)Ð)Ð)Øˆ
Ú	Øˆˆw‰Ü�h‰h�uœc %§-¡-Ó0°(¸FÈ3Ï:É:ÔVˆÜ—X‘X˜f¨S¯Z©ZÔ8ˆ
Øˆ?Ø—m‘mˆGØÐ" w°¢|Ð3Ð3Ü! %×"2Ñ"2°WÑ"<Ó=ˆÜ�a˜'‘k ^Ñ3Ó4ˆÜ˜˜6 6Ó*ˆÜ”f˜V e×&6Ñ&6Ñ6¸Ó>Ó?ˆô —‘œŸ™ 1 n¸Ñ&9¸AÑ&=ÀfÔMÜŸ™ >°NÀaÑ4GÑ#GÈÈBÐW]Ô^ð`ó aˆä�6‹{˜nÒ,Ð,Ð,ð ˜6Ÿ:™:›<Ñ'Ð*:Ñ:ˆØˆØò 	%ˆFÜ  V¨^Ó<ˆEØ �T—[‘[¤¨e°UÑE¸fÑEˆFØ�N‰N˜F FÐ+Ô,Ø�nÑ$‰Fð		%ñ
 Ü—i‘i °EÀÈ9ÔUˆGØ%ò 	_‰NˆF�FØŸ™›ˆIØ$Ÿ?™?¨2Ñ.ˆLØ��V˜F ^Ñ3Ð3Ð3Ó4Ø�}˜Ð%¨	Ñ1·2±2°c·j±j³>ñBÓ4à�v˜f ~Ñ5Ó6¸&ÀÀ,Ð:O×:RÑ:RÐSV×S]ÑS]Ó:^Ñ^Ô6ð	_ð �~‰~Ó !Ò#Ð#Ð#ØˆzÑˆÜ˜#œrŸy™yÔ)Ð)Ð)Øˆ
ô �eœXÔ&¨7Ð+>Ü˜w¨×)9Ñ)9Ñ9Ó:‰LÜ�U˜NÔ+Ø ×-Ñ-¨fÓ5‰Là!ˆLÜ˜3ÓˆÜ˜#œ{Ô+Ð+Ð+Ø—Z‘Z Ó-×0Ñ0°Ó8ˆ
Ü�Z‰Z‹\ñ 	$Ù˜
Ó#ˆC÷	$ä˜#œrŸy™yÔ)Ð)Ð)Ü˜3 Ó'Ð'÷	$ð 	$ús   Ö+	W$×$W-)	r   Tg      Ð?r   FNr   NN)"Ú__doc__Úconcurrent.futuresr   rs   Útypingr1   ÚtorchrT   r   Útorch.nnr   rF   r{   Údemucsr   Úhdemucsr   Úhtdemucsr	   Úutilsr
   r   ÚUnionr3   ÚModuler   r8   rW   rU   rr   Úboolr$   r4   rn   rR   r)   r    ú<module>r£      s  ðñõ 2Û Û ã Ý Ý $Û å Ý Ý ß 1à
�‰�˜ (Ð*Ñ+€ô1A�"—)‘)ô 1A÷h*ñ *òZ,ð 04ØACØ/3ØDHØñM(�r—x‘x ¨UÐ 2Ñ3ð M(Ø—X‘X˜bŸi™i¨Ð4Ñ5ðM(àðM(à(,ðM(ð ðM(ð :?ðM(ð ð	M(ð
 !ðM(ð
 02¯{©{¸5Ñ/AðM(ð !Ÿi™iôM(r)   