o
    ϯi                     @   s   d dl Z d dlZd dlZd dlmZ G dd dejZG dd dejZG dd dejZ	G dd	 d	ejZ
d
ejdejdejfddZG dd dejZG dd dejZG dd dejZdS )    Nc                       .   e Zd Zdeddf fddZdd Z  ZS )	NormalizedimreturnNc                       t    || _d S N)super__init__r   )selfr   	__class__ L/home/ubuntu/.local/lib/python3.10/site-packages/imagebind/models/helpers.pyr	         

zNormalize.__init__c                 C   s   t jjj|| jddS )N   )r   p)torchnn
functional	normalizer   r
   xr   r   r   forward   s   zNormalize.forward)__name__
__module____qualname__intr	   r   __classcell__r   r   r   r   r      s    r   c                	       sF   e Zd Z			ddedededdf fd	d
Zdd Zdd Z  ZS )LearnableLogitScaling$I$I,@Td   logit_scale_init	learnablemax_logit_scaler   Nc                    sV   t    || _|| _|| _tg t| j }|r#t	
|| _d S | d| d S )Nlog_logit_scale)r   r	   r#   r!   r"   r   onesnplogr   	Parameterr$   register_buffer)r
   r!   r"   r#   r$   r   r   r   r	      s   
zLearnableLogitScaling.__init__c                 C   s   t j| j | jd| S )N)max)r   clipr$   expr#   r   r   r   r   r   )   s   zLearnableLogitScaling.forwardc                 C   s    d| j  d| j d| j }|S )Nzlogit_scale_init=z,learnable=z, max_logit_scale=)r!   r"   r#   )r
   str   r   r   
extra_repr,   s   z LearnableLogitScaling.extra_repr)r   Tr    )	r   r   r   floatboolr	   r   r.   r   r   r   r   r   r      s    r   c                       r   )EinOpsRearrangerearrange_exprr   Nc                    s   t    || _|| _d S r   )r   r	   r2   kwargs)r
   r2   r3   r   r   r   r	   3   s   

zEinOpsRearrange.__init__c                 C   s(   t |tjsJ tj|| jfi | jS r   )
isinstancer   Tensoreinops	rearranger2   r3   r   r   r   r   r   8   s   zEinOpsRearrange.forward)r   r   r   strr	   r   r   r   r   r   r   r1   2   s    r1   c                   @   s:   e Zd ZdZededejdefddZdefddZ	d	S )
VerboseNNModulezV
    Wrapper around nn.Module that prints registered buffers and parameter names.
    nametensorr   c                 C   s<   d|  d d t t|d j d t |d j d }|S )N(z): ztensor(   z, requires_grad=z)
)r8   tupleshaperequires_grad)r:   r;   r-   r   r   r   get_readable_tensor_reprB   s"   
z(VerboseNNModule.get_readable_tensor_reprc                 C   s   t  }|  D ]
}||d g qt|}d}|  D ]}|d dd }||vr3|| ||7 }q|  D ]}|d dd }|| ||7 }q8|S )Nr    .)setnamed_modulesupdatelistnamed_parameterssplitrA   named_buffers)r
   rE   r   string_reprr:   r   r   r   r.   P   s   zVerboseNNModule.extra_reprN)
r   r   r   __doc__staticmethodr8   r   r5   rA   r.   r   r   r   r   r9   =   s
    r9   r;   	src_dtype	tgt_dtypec                 C   s&   d}| j |kr| j|d} d}| |fS )NF)dtypeT)rP   to)r;   rN   rO   updatedr   r   r   cast_if_src_dtypec   s
   
rS   c                   @   s   e Zd ZdejfddZdS )	QuickGELUr   c                 C   s   |t d|  S )NgZd;?)r   sigmoidr   r   r   r   r   o   s   zQuickGELU.forwardN)r   r   r   r   r5   r   r   r   r   r   rT   m   s    rT   c                       s&   e Zd Zd fddZdd Z  ZS )SelectElementr   Nc                    r   r   )r   r	   index)r
   rW   r   r   r   r	   t   r   zSelectElement.__init__c                 C   s"   |j dksJ |d d | jdf S )N   .)ndimrW   r   r   r   r   r   x   s   zSelectElement.forward)r   N)r   r   r   r	   r   r   r   r   r   r   rV   s   s    rV   c                       s4   e Zd ZdZdejddf fddZdd Z  ZS )	SelectEOSAndProjectz'
    Text Pooling used in OpenCLIP
    projr   Nc                    r   r   )r   r	   r[   )r
   r[   r   r   r   r	      r   zSelectEOSAndProject.__init__c                 C   s4   |j dksJ |t|jd |f }| |}|S )NrX   r   )rY   r   aranger?   r[   )r
   r   seq_lenr   r   r   r      s   
zSelectEOSAndProject.forward)	r   r   r   rL   r   Moduler	   r   r   r   r   r   r   rZ   }   s    rZ   )r6   numpyr&   r   torch.nnr   r^   r   r   r1   r9   r5   rP   rS   rT   rV   rZ   r   r   r   r   <module>   s$   	&


