
    NgI                    x    d dl m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
mZ  G d dej                  ZdS )    )annotationsN)
load_model)
save_model)Tensornnc                  \     e Zd ZdZ	 dd fdZddZd Zd ZdddZe	d             Z
 xZS )WeightedLayerPoolingzRToken embeddings are weighted mean of their different hidden layer representations      Nnum_hidden_layersintlayer_startc                   t                                                       g d| _        || _        || _        || _        ||n;t          j        t          j	        dg|dz   |z
  z  t          j
                            | _        d S )N)word_embedding_dimensionr   r      )dtype)super__init__config_keysr   r   r   r   	Parametertorchtensorfloatlayer_weights)selfr   r   r   r   	__class__s        m/var/www/html/ai-engine/env/lib/python3.11/site-packages/sentence_transformers/models/WeightedLayerPooling.pyr   zWeightedLayerPooling.__init__   s     	[[[(@%&!2 ( MelA32Ca2G+2U+V^c^ijjjkk 	    featuresdict[str, Tensor]c                   |d         }t          j        |          }|| j        d d d d d d d f         }| j                            d                              d                              d                              |                                          }||z                      d          | j                                        z  }|                    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_averages         r   forwardzWeightedLayerPooling.forward   s     !78#k-881$2B2D2DaaaAAA2MN*44R88BB2FFPPQSTT[[\o\t\t\v\vww),??DDDKKdN`NdNdNfNff+-=>???r   c                    | j         S )N)r   r   s    r   get_word_embedding_dimensionz1WeightedLayerPooling.get_word_embedding_dimension)   s    ,,r   c                *      fd j         D             S )Nc                ,    i | ]}|j         |         S  )__dict__).0keyr   s     r   
<dictcomp>z8WeightedLayerPooling.get_config_dict.<locals>.<dictcomp>-   s"    DDDCT]3'DDDr   )r   r2   s   `r   get_config_dictz$WeightedLayerPooling.get_config_dict,   s     DDDD43CDDDDr   Toutput_pathstrsafe_serializationboolc                   t          t          j                            |d          d          5 }t	          j        |                                 |d           d d d            n# 1 swxY w Y   |r0t          | t          j                            |d                     d S t          j	        | 
                                t          j                            |d                     d S )Nconfig.jsonw   )indentmodel.safetensorspytorch_model.bin)openospathjoinjsondumpr;   save_safetensors_modelr   save
state_dict)r   r<   r>   fOuts       r   rN   zWeightedLayerPooling.save/   s    "',,{M::C@@ 	>DId**,,d1====	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>  	Z"4kCV)W)WXXXXXJt(("',,{DW*X*XYYYYYs   *A%%A),A)c                \   t          t          j                            | d                    5 }t	          j        |          }d d d            n# 1 swxY w Y   t          di |}t          j                            t          j                            | d                    r/t          |t          j                            | d                     nZ|	                    t          j        t          j                            | d          t          j        d          d                     |S )NrA   rE   rF   cpuT)map_locationweights_onlyr6   )rG   rH   rI   rJ   rK   loadr	   existsload_safetensors_modelload_state_dictr   device)
input_pathfInconfigmodels       r   rU   zWeightedLayerPooling.load8   s8   "',,z=99:: 	$cYs^^F	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ %..v..7>>"',,z3FGGHH 	"5"',,zCV*W*WXXXX!!
GLL-@AAPUP\]bPcPcrv    
 s   AAA)r
   r   N)r   r   r   r   )r   r    )T)r<   r=   r>   r?   )__name__
__module____qualname____doc__r   r0   r3   r;   rN   staticmethodrU   __classcell__)r   s   @r   r	   r	      s        \\ jn
 
 
 
 
 
 

 
 
 
- - -E E EZ Z Z Z Z   \    r   r	   )
__future__r   rK   rH   r   safetensors.torchr   rW   r   rM   r   r   Moduler	   r6   r   r   <module>rg      s    " " " " " "  				  B B B B B B B B B B B B        : : : : :29 : : : : :r   