o
    sh                     @   sb   d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ	 d dlm
Z
mZ G dd dejZdS )    N)Dict)
load_model)
save_model)Tensornnc                       st   e Zd ZdZ	ddedef fddZd	eeef fd
dZ	dd Z
dd ZddedefddZedd Z  ZS )WeightedLayerPoolingzRToken embeddings are weighted mean of their different hidden layer representations      Nnum_hidden_layerslayer_startc                    sf   t t|   g d| _|| _|| _|| _|d ur|| _d S tt	j
dg|d |  t	jd| _d S )N)word_embedding_dimensionr   r
      )dtype)superr   __init__config_keysr   r   r
   r   	Parametertorchtensorfloatlayer_weights)selfr   r
   r   r   	__class__ o/var/www/html/alpaca_bot/venv/lib/python3.10/site-packages/sentence_transformers/models/WeightedLayerPooling.pyr      s   
"zWeightedLayerPooling.__init__featuresc                 C   s   |d }t |}|| jd d d d d d d f }| jddd| }|| jdd| j  }|d|i |S )Nall_layer_embeddingsr   )dimtoken_embeddings)	r   stackr   r   	unsqueezeexpandsizesumupdate)r   r   ft_all_layersall_layer_embeddingweight_factorweighted_averager   r   r   forward   s   
""zWeightedLayerPooling.forwardc                 C   s   | j S )N)r   r   r   r   r   get_word_embedding_dimension(   s   z1WeightedLayerPooling.get_word_embedding_dimensionc                    s    fdd j D S )Nc                    s   i | ]}| j | qS r   )__dict__).0keyr,   r   r   
<dictcomp>,   s    z8WeightedLayerPooling.get_config_dict.<locals>.<dictcomp>)r   r,   r   r,   r   get_config_dict+   s   z$WeightedLayerPooling.get_config_dictToutput_pathsafe_serializationc                 C   s   t tj|dd}tj|  |dd W d    n1 sw   Y  |r2t| tj|d d S t	| 
 tj|d d S )Nconfig.jsonw   )indentmodel.safetensorspytorch_model.bin)openospathjoinjsondumpr2   save_safetensors_modelr   save
state_dict)r   r3   r4   fOutr   r   r   rB   .   s   zWeightedLayerPooling.savec                 C   s   t tj| d}t|}W d    n1 sw   Y  tdi |}tjtj| dr<t|tj| d |S |	t
jtj| dt
dd |S )Nr5   r9   r:   cpu)map_locationr   )r;   r<   r=   r>   r?   loadr   existsload_safetensors_modelload_state_dictr   device)
input_pathfInconfigmodelr   r   r   rG   7   s   zWeightedLayerPooling.load)r   r	   N)T)__name__
__module____qualname____doc__intr   r   strr   r+   r-   r2   boolrB   staticmethodrG   __classcell__r   r   r   r   r      s    	r   )r?   r<   typingr   r   safetensors.torchr   rI   r   rA   r   r   Moduler   r   r   r   r   <module>   s    