
    miw                        d Z ddlmZ ddlmZ ddlZddlZddlZddl	m
Z
mZ ddlmZ ej                  ee
f   Z G d d	e      Zd
edefdZ G d d      Z G d de      Z G d de      Z G d d      Z G d d      Zy)zRepresents a model repository, including pre-trained models and bags of models.
A repo can either be the main remote repository stored in AWS, or a local repository
with your own models.
    )sha256)PathN   )BagOfModelsModel)
load_modelc                       e Zd Zy)ModelLoadingErrorN)__name__
__module____qualname__     E/var/www/stems/demucs_env/lib/python3.12/site-packages/demucs/repo.pyr
   r
      s    r   r
   pathchecksumc                    t               }t        | d      5 }	 |j                  d      }|sn|j                  |       &	 d d d        |j	                         d t        |       }||k7  rt        d|  d| d|       y # 1 sw Y   ?xY w)Nrbi   zInvalid checksum for file z, expected z	 but got )r   openreadupdate	hexdigestlenr
   )r   r   shafilebufactual_checksums         r   check_checksumr      s    
(C	dD	 T))E"CJJsO	  	 mmons8}5O(""<TF C,,4:Y>O!Q R 	R # s   (A>>Bc                   0    e Zd ZdZdedefdZdedefdZy)ModelOnlyRepoz)Base class for all model only repos.
    sigreturnc                     t               NNotImplementedErrorselfr!   s     r   	has_modelzModelOnlyRepo.has_model.       !##r   c                     t               r$   r%   r'   s     r   	get_modelzModelOnlyRepo.get_model1   r*   r   N)	r   r   r   __doc__strboolr)   r   r,   r   r   r   r    r    +   s-    $S $T $$S $U $r   r    c                   V    e Zd Zdej                  eef   fdZdedefdZdede	fdZ
y)
RemoteRepomodelsc                     || _         y r$   _models)r(   r2   s     r   __init__zRemoteRepo.__init__6   s	    r   r!   r"   c                     || j                   v S r$   r4   r'   s     r   r)   zRemoteRepo.has_model9       dll""r   c                     	 | j                   |   }t        j                  j                  |dd      }t        |      S # t        $ r t        d| d      w xY w)Nz2Could not find a pre-trained model with signature .cpuT)map_location
check_hash)r5   KeyErrorr
   torchhubload_state_dict_from_urlr   )r(   r!   urlpkgs       r   r,   zRemoteRepo.get_model<   sm    	a,,s#C ii00e 1 6#	  	a#&XY\X]]^$_``	as	   > AN)r   r   r   tpDictr.   r6   r/   r)   r   r,   r   r   r   r1   r1   5   sA    rwwsCx0 #S #T #S U r   r1   c                   >    e Zd ZdefdZd ZdedefdZdede	fdZ
y)		LocalReporootc                 2    || _         | j                          y r$   )rH   scan)r(   rH   s     r   r6   zLocalRepo.__init__G   s    			r   c                 f   i | _         i | _        | j                  j                         D ]  }|j                  dk(  sd|j
                  v r.|j
                  j                  d      \  }}|| j                  |<   n|j
                  }|| j                   v rt        d| d      || j                   |<    y )Nz.th-z0Duplicate pre-trained model exist for signature z. Please delete all but one.)r5   
_checksumsrH   iterdirsuffixstemsplitr
   )r(   r   xp_sigr   s       r   rJ   zLocalRepo.scanK   s    II%%' 	,D{{e#$))#'+yys';$FH.6DOOF+!YYFT\\)+J6( S5 56 6 (,V$	,r   r!   r"   c                     || j                   v S r$   r4   r'   s     r   r)   zLocalRepo.has_model[   r8   r   c                     	 | j                   |   }|| j                  v rt	        || j                  |          t        |      S # t        $ r t        d| d      w xY w)Nz0Could not find pre-trained model with signature r:   )r5   r>   r
   rM   r   r   )r(   r!   r   s      r   r,   zLocalRepo.get_model^   sm    	_<<$D $//!4!56$	  	_#&VWZV[[\$]^^	_s   A AN)r   r   r   r   r6   rJ   r.   r/   r)   r   r,   r   r   r   rG   rG   F   s9    T , #S #T # S  U  r   rG   c                   F    e Zd ZdZdedefdZd Zdede	fdZ
dedefd	Zy
)BagOnlyRepoziHandles only YAML files containing bag of models, leaving the actual
    model loading to some Repo.
    rH   
model_repoc                 @    || _         || _        | j                          y r$   )rH   rW   rJ   )r(   rH   rW   s      r   r6   zBagOnlyRepo.__init__l   s    	$		r   c                     i | _         | j                  j                         D ]+  }|j                  dk(  s|| j                   |j                  <   - y )Nz.yaml)_bagsrH   rN   rO   rP   )r(   r   s     r   rJ   zBagOnlyRepo.scanq   sC    
II%%' 	-D{{g%(,

499%	-r   namer"   c                     || j                   v S r$   )rZ   )r(   r[   s     r   r)   zBagOnlyRepo.has_modelw   s    tzz!!r   c                 V   	 | j                   |   }t        j                  t        |            }|d   }|D cg c]  }| j                  j                  |       }}|j                  d      }|j                  d      }t        |||      S # t        $ r t        | d      w xY wc c}w )Nz: is neither a single pre-trained model or a bag of models.r2   weightssegment)
rZ   r>   r
   yaml	safe_loadr   rW   r,   getr   )	r(   r[   	yaml_filebag
signaturesr!   r2   r^   r_   s	            r   r,   zBagOnlyRepo.get_modelz   s    	8

4(I nnT)_-]
<FGS$//++C0GG'')$'')$67G44  	8#tf -7 %7 8 8	8
 Hs   B "B&B#N)r   r   r   r-   r   r    r6   rJ   r.   r/   r)   r   r,   r   r   r   rV   rV   h   sE    T } 
-"c "d "5c 5k 5r   rV   c                   <    e Zd ZdedefdZdedefdZdede	fdZ
y)	AnyModelReporW   bag_repoc                      || _         || _        y r$   )rW   rh   )r(   rW   rh   s      r   r6   zAnyModelRepo.__init__   s    $ r   name_or_sigr"   c                 r    | j                   j                  |      xs | j                  j                  |      S r$   )rW   r)   rh   r(   rj   s     r   r)   zAnyModelRepo.has_model   s,    ((5]9P9PQ\9]]r   c                     | j                   j                  |      r| j                   j                  |      S | j                  j                  |      S r$   )rW   r)   r,   rh   rl   s     r   r,   zAnyModelRepo.get_model   s>    ??$$[1??,,[99==**;77r   N)r   r   r   r    rV   r6   r.   r/   r)   AnyModelr,   r   r   r   rg   rg      s>    != !K !^S ^T ^8S 8X 8r   rg   )r-   hashlibr   pathlibr   typingrD   r?   r`   applyr   r   statesr   Unionrn   RuntimeErrorr
   r.   r   r    r1   rG   rV   rg   r   r   r   <module>rv      s   
      %  88E;&'	 	R R R$ $ "   D5 5@8 8r   