o
    9wiw                     @   s   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	 d	eZd
edefddZG dd dZG dd deZG dd deZG dd dZG dd dZdS )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                   @   s   e Zd ZdS )ModelLoadingErrorN)__name__
__module____qualname__ r   r   H/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/demucs/repo.pyr      s    r   pathchecksumc                 C   s   t  }t| d}	 |d}|sn|| q
W d    n1 s"w   Y  | d t| }||krBtd|  d| d| d S )NrbTi   zInvalid checksum for file z, expected z	 but got )r   openreadupdate	hexdigestlenr   )r   r   shafilebufactual_checksumr   r   r   check_checksum   s$   


r   c                   @   s4   e Zd ZdZdedefddZdedefddZdS )	ModelOnlyRepoz)Base class for all model only repos.
    sigreturnc                 C      t  NNotImplementedErrorselfr   r   r   r   	has_model.      zModelOnlyRepo.has_modelc                 C   r   r   r    r"   r   r   r   	get_model1   r%   zModelOnlyRepo.get_modelN)	r	   r
   r   __doc__strboolr$   r   r&   r   r   r   r   r   +   s    r   c                   @   sH   e Zd Zdejeef fddZdedefddZdede	fdd	Z
d
S )
RemoteRepomodelsc                 C   s
   || _ d S r   _models)r#   r+   r   r   r   __init__6      
zRemoteRepo.__init__r   r   c                 C   
   || j v S r   r,   r"   r   r   r   r$   9   r/   zRemoteRepo.has_modelc                 C   sH   z| j | }W n ty   td| dw tjj|ddd}t|S )Nz2Could not find a pre-trained model with signature .cpuT)map_location
check_hash)r-   KeyErrorr   torchhubload_state_dict_from_urlr   )r#   r   urlpkgr   r   r   r&   <   s   zRemoteRepo.get_modelN)r	   r
   r   tpDictr(   r.   r)   r$   r   r&   r   r   r   r   r*   5   s    r*   c                   @   sF   e Zd ZdefddZdd Zdedefdd	Zdede	fd
dZ
dS )	LocalReporootc                 C   s   || _ |   d S r   )r>   scan)r#   r>   r   r   r   r.   G   s   zLocalRepo.__init__c                 C   sz   i | _ i | _| j D ]/}|jdkr:d|jv r%|jd\}}|| j|< n|j}|| j v r5td| d|| j |< qd S )Nz.th-z0Duplicate pre-trained model exist for signature z. Please delete all but one.)r-   
_checksumsr>   iterdirsuffixstemsplitr   )r#   r   xp_sigr   r   r   r   r?   K   s   




zLocalRepo.scanr   r   c                 C   r0   r   r,   r"   r   r   r   r$   [   r/   zLocalRepo.has_modelc                 C   sP   z| j | }W n ty   td| dw || jv r$t|| j|  t|S )Nz0Could not find pre-trained model with signature r1   )r-   r5   r   rA   r   r   )r#   r   r   r   r   r   r&   ^   s   
zLocalRepo.get_modelN)r	   r
   r   r   r.   r?   r(   r)   r$   r   r&   r   r   r   r   r=   F   s
    r=   c                   @   sN   e Zd ZdZdedefddZdd Zded	e	fd
dZ
ded	efddZdS )BagOnlyRepoziHandles only YAML files containing bag of models, leaving the actual
    model loading to some Repo.
    r>   
model_repoc                 C   s   || _ || _|   d S r   )r>   rH   r?   )r#   r>   rH   r   r   r   r.   l   s   zBagOnlyRepo.__init__c                 C   s0   i | _ | j D ]}|jdkr|| j |j< qd S )Nz.yaml)_bagsr>   rB   rC   rD   )r#   r   r   r   r   r?   q   s   
zBagOnlyRepo.scannamer   c                 C   r0   r   )rI   )r#   rJ   r   r   r   r$   w   r/   zBagOnlyRepo.has_modelc                    st   z j | }W n ty   t| dw tt|}|d } fdd|D }|d}|d}t|||S )Nz: is neither a single pre-trained model or a bag of models.r+   c                    s   g | ]} j |qS r   )rH   r&   ).0r   r#   r   r   
<listcomp>   s    z)BagOnlyRepo.get_model.<locals>.<listcomp>weightssegment)rI   r5   r   yaml	safe_loadr   getr   )r#   rJ   	yaml_filebag
signaturesr+   rN   rO   r   rL   r   r&   z   s   

zBagOnlyRepo.get_modelN)r	   r
   r   r'   r   r   r.   r?   r(   r)   r$   r   r&   r   r   r   r   rG   h   s    rG   c                   @   sB   e Zd ZdedefddZdedefddZdede	fd	d
Z
dS )AnyModelReporH   bag_repoc                 C   s   || _ || _d S r   )rH   rW   )r#   rH   rW   r   r   r   r.      s   
zAnyModelRepo.__init__name_or_sigr   c                 C   s   | j |p| j|S r   )rH   r$   rW   r#   rX   r   r   r   r$      s   zAnyModelRepo.has_modelc                 C   s$   | j |r| j |S | j|S r   )rH   r$   r&   rW   rY   r   r   r   r&      s   zAnyModelRepo.get_modelN)r	   r
   r   r   rG   r.   r(   r)   r$   AnyModelr&   r   r   r   r   rV      s    rV   )r'   hashlibr   pathlibr   typingr;   r6   rP   applyr   r   statesr   UnionrZ   RuntimeErrorr   r(   r   r   r*   r=   rG   rV   r   r   r   r   <module>   s    
" 