o
    ϯi*                     @   sz  d dl Z d dl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m	Z	 d dl
Z
d dlZddlmZmZ ddlmZ ddlmZmZ dd	lmZ eejd
 gZi add Zdd Ze  d.defddZdde
dddej ddddddfdedededede
jde!de!d ed!ed"ed#e!d$efd%d&Z"dde
dddfd'ededede
jde!de!fd(d)Z#d*d+ Z$d,d- Z%dS )/    N)deepcopy)Path)version   )CLAPconvert_weights_to_fp16)load_openai_model)get_pretrained_urldownload_pretrained)image_transformzmodel_configs/c                 C   s   dd t d|  D S )Nc                 S   s    g | ]}|  rt|n|qS  )isdigitint).0sr   r   R/home/ubuntu/.local/lib/python3.10/site-packages/laion_clap/clap_module/factory.py
<listcomp>   s     z _natural_key.<locals>.<listcomp>z(\d+))resplitlower)string_r   r   r   _natural_key   s   r   c               	      s   d} g }t D ]%}| r|j| v r|| q| r+| D ]}||d|  qq|D ],}t|d}t	| t
 fdddD rK t|j< W d    n1 sUw   Y  q.dd tt d	d
 dD ad S )N)z.json*rc                 3   s    | ]}| v V  qd S )Nr   )r   a	model_cfgr   r   	<genexpr>)   s    z(_rescan_model_configs.<locals>.<genexpr>)	embed_dim	audio_cfgtext_cfgc                 S   s   i | ]\}}||qS r   r   r   kvr   r   r   
<dictcomp>,   s    z)_rescan_model_configs.<locals>.<dictcomp>c                 S   s   t | d S )Nr   )r   )xr   r   r   <lambda>.   s    z'_rescan_model_configs.<locals>.<lambda>)key)_MODEL_CONFIG_PATHSis_filesuffixappendis_dirextendglobopenjsonloadall_MODEL_CONFIGSstemsorteditems)
config_extconfig_filesconfig_pathextcffr   r   r   _rescan_model_configs   s(   


r=   cpuTcheckpoint_pathc                 C   s   t j| |d}t|trd|v r|d }n|}|rAtt| d dr/dd | D }t	t
jt	dkrAd|v rA|d= |S )	Nmap_location
state_dictr   modulec                 S   s   i | ]\}}|d d |qS )   Nr   r!   r   r   r   r$   =   s    z#load_state_dict.<locals>.<dictcomp>z4.31.0z#text_branch.embeddings.position_ids)torchr1   
isinstancedictnextiterr6   
startswithr   parsetransformers__version__)r?   rA   skip_params
checkpointrB   r   r   r   load_state_dict5   s   
rP    fp32Fz~/.cache/clipNoneamodel_nametmodel_name
pretrained	precisiondevicejitforce_quick_geluopenai_model_cache_dirpretrained_audiopretrained_textenable_fusionfusion_typec              	   C   s  |  dd} |}| }|dkr_| tv r$td|  d tt|  }ntd|  dt  d td|  d	td
 ||d d< t	d||||||d}|dksW|dkr[|
 }||fS | tv rstd|  d tt|  }ntd|  dt  d td|  d	|rd|d< ||d d< ||d< ||d< td7i |}|rd}t| |}|rt||d}ntj|r|}|rtd|  d| d| d t|dd}|| dd | D }|D ]}t|d||v rdnd qntd | d!|  d td | d!|  d|	rT| d"rd#|	v rGtj|	d$d%}|d& }t| }|D ]}d'|vrDd(|vrD||}||d)| < q-ntj|	d"r~tj|	d$d%}|d* }t| }|D ]}|d+r{||}||d)|d,d   < qdntj|	d-rtj|	d$d%}ntd.| d/r#d0|	v rtj|	d$d%}|d* }t| }|D ]"}|d+rd'|vrd(|vr||}||d)|d,d   < qnOtj|	d/rtj|	d$d%}|d* }t| }|D ]}|d+r
||}||d)|d,d   < qntj|	d-rtj|	d$d%}ntd.d1|j|d2d3 td|  d|	 d d4d | D }|D ]}t|d||v rOdnd qC|j|d5 |d6krk|jd$ksgJ t| |rttj !|}||fS )8N/-openaizLoading z model config.zModel config for z not found; available models .z not found.z5Loading pretrained ViT-B-16 text encoder from OpenAI.r    
model_typezViT-B-16)rX   rY   	cache_dirr^   r_   amprR   T
quick_gelur^   r_   rQ   )rootzLoading pretrained z
 weights (z).)rN   c                 S      g | ]\}}|qS r   r   r   npr   r   r   r          z create_model.<locals>.<listcomp>	LoadedUnloadedzPretrained weights (z) not found for model PANN	Cnn14_mAPr>   r@   modelspectrogram_extractorlogmel_extractorzaudio_branch.rB   	sed_model
   	finetunedzUnknown audio checkpointHTSATHTSAT_AudioSet_Savedz7this audio encoder pretrained checkpoint is not supportF)strictc                 S   ri   r   r   rj   r   r   r   r      rm   )rX   fp16r   )"replacer   r3   logginginfor   errorlist_modelsRuntimeErrorr   floatr   r	   r
   ospathexistsrP   named_parametersprintwarningrJ   rE   r1   listkeyspopbasename
ValueErrortotyper   rY   script)rT   rU   rV   rW   rX   rY   rZ   r[   rN   r\   r]   r^   r_   pretrained_origr   rs   r?   urlckptparam_namesrk   
audio_ckptr   r'   r#   r   r   r   create_modelI   s   

m









r   
model_namec           	      C   s>   t | |||||d}t|jjdd}t|jjdd}|||fS )N)rZ   T)is_trainF)r   r   visual
image_size)	r   rV   rW   rX   rY   rZ   rs   preprocess_trainpreprocess_valr   r   r   create_model_and_transforms   s   		
r   c                   C   s   t t S )z=enumerate available model architectures based on config files)r   r3   r   r   r   r   r   r      s   r   c                 C   s&   t | ts	t| } t|  t  dS )z1add model config path or file and update registryN)rF   r   r(   r+   r=   )r   r   r   r   add_model_config  s   


r   )r>   T)&r0   r~   r   pathlibr   copyr   r   	packagingr   rE   rL   rs   r   r   rb   r   rV   r	   r
   	transformr   __file__parentr(   r3   r   r=   strrP   rX   r   
expanduserboolr   r   r   r   r   r   r   r   <module>   s    


  
