o
    ϯi                  
   @   s   d Z ddlmZ ddlmZ zddlZddlmZmZ ddl	m
Z
 ddl	mZ W n ey< Z zdZW Y dZ[ndZ[ww ddlmZ G d	d
 d
ejZdS )z timm model adapter

Wraps timm (https://github.com/rwightman/pytorch-image-models) models for use as a vision tower in CLIP model.
    )OrderedDictN)Mlp	to_2tuple)RotAttentionPool2d)AttentionPool2d   )freeze_batch_norm_2dc                       s>   e Zd ZdZ					d fdd	Zdd
dZdd Z  ZS )	TimmModelzt timm model adapter
    # FIXME this adapter is a work in progress, may change in ways that break weight compat
       avglinear        Fc                    sJ  t    td u rtdt|| _tj||d| _| jj	dd }|s&dnd}	|dv r;|	dks2J | jj
ddd	 n|rBt|d	ni }
| jj
di |
 | jj}t }|d
krdt|||d|d< |}n|dkrst||d|d< |}n|syJ d|dkrt||d< t|||d< n|dkrt|d| ||d|d< t|| _d S )Nz-Please `pip install timm` to use timm models.)
pretrained	pool_sizer      )abs_attnrot_attnr    )global_poolr   )	feat_sizeout_featurespoolr   )r   z9projection layer needed if non-attention pooling is used.r   dropprojmlp)r   )r   )super__init__timmRuntimeErrorr   
image_sizecreate_modeltrunkdefault_cfggetreset_classifierdictnum_featuresr   AbsAttentionPool2dr   nnDropoutLinearr   
Sequentialhead)self
model_name	embed_dimr   r   r   r   r   r   feature_ndimreset_kwargsprev_chshead_layers	__class__ U/home/ubuntu/.local/lib/python3.10/site-packages/laion_clap/clap_module/timm_model.pyr      s6   
	
zTimmModel.__init__r   c                    s   |s| j  D ]}d|_q|rt| j  d
S d
S z
ddlm}m} W n ty-   tdw | j 	 }|| j |}t
|   |  t d D ]}|| }	|	D ]	}d| j |_qQqI|ry|| j |dd}
 fdd	|
 D }
t| j |
 d
S d
S )zw lock modules
        Args:
            unlocked_groups (int): leave last n layer groups unlocked (default: 0)
        Fr   )group_parametersgroup_modulesz^Please install latest timm `pip install git+https://github.com/rwightman/pytorch-image-models`r   T)reversec                    s   h | ]
\}}| kr|qS r6   r6   ).0kvmax_layer_idr6   r7   	<setcomp>d   s    z!TimmModel.lock.<locals>.<setcomp>N)r!   
parametersrequires_gradr   timm.models.helpersr8   r9   ImportErrorr   group_matchermaxkeysrangeget_parameteritems)r-   unlocked_groupsfreeze_bn_statsparamr8   r9   matchergparams	group_idxgroupgmodulesr6   r>   r7   lockG   s6   
zTimmModel.lockc                 C   s   |  |}| |}|S )N)r!   r,   )r-   xr6   r6   r7   forwardg   s   

zTimmModel.forward)r
   r   r   r   F)r   F)__name__
__module____qualname____doc__r   rS   rU   __classcell__r6   r6   r4   r7   r	      s    
. r	   )rY   collectionsr   torch.nnr(   r   timm.models.layersr   r   #timm.models.layers.attention_pool2dr   r   r'   rD   eutilsr   Moduler	   r6   r6   r6   r7   <module>   s    