
    miH*                        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	           F/var/www/stems/demucs_env/lib/python3.12/site-packages/demucs/apply.pyr   zBagOfModels.__init__   sH     	6{Qq	 	(E==EMM111##u'7'7777''5+?+????" '	( $22**}}mmF+?<BCqEMM2q2CGC
  w<3v;...! 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    #El[[ 	UE%*&)*=uU]]?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%rwwu~ %++bggbggen&=>%++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 )Nr   )shaper&   r%   r8   tensoroffsetlengthdevice)r   r<   r=   r>   total_lengths        r    r   zTensorChunk.__init__P   s    ||B'{{$$$>!F*F.7Ffk* --DK 6==0DK DK DKmmr)   c                 b    t        | j                  j                        }| j                  |d<   |S )Nr:   )listr<   r;   r>   )r   r;   s     r    r;   zTensorChunk.shapec   s(    T[[&&'KK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eqj(m#Au,, 5(+%	eeDKK];%> >?(IAVWyy}---
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    /;//299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(                  \  }}}|rd|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2D$&D,	$F %% 13	EMM**(+ELL%--(H 
	$I}$(i.B.B.D)E$F$M$M!LL i77CLL./"+M": );Aq!QJ;.q	[(	) I
	 )RYY///yq)* 	/AaAqj!VAY.!	/	HHV	JJLq Q"QQ !iiE8Vxe.../	3#{+++ZZY 67
v 	9A^^Ay1F!*ffy6H66QRG%eW??K;sI$6$7788C		9
 	v#ryy)))
	whhuc%--0(F3::VXXfSZZ8
?mmG"w|33!%"2"2W"<=a'k^3466*fVe&6&66>? 1n&9A&=fM>Na4G#GBW]^` a6{n,,, 6::<'*:: 	%FV^<E T[[eUEfEFNNFF+,n$F		%
 iiE9UG% 	_NFFI$??2.LVF^3334}%	122cjj>B4vf~56&,:O:R:RSVS]S]:^^6	_ ~~!###z#ryy)))
 eX&7+>w)9)99:LUN+ --f5L!L3#{+++ZZ-008
ZZ\ 	$
#C	$#ryy)))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, 04AC/3DHM(rxxU 23 M(XXbii45M(M((,M( M( :?M( 	M(
 !M(
 02{{5/AM( !iiM(r)   