o
    h                     @   s   d Z ddlmZ ddlmZ ddlZddlZddlmZ ddl	m
Z
 ddlmZ edZed	g d
ZG dd dZG dd deZdddZdddZdddZdddZdS )z>
Keeps BERT, charlm, word embedings in a cache to save memory
    )
namedtuple)deepcopyN)bert_embedding)CharacterLanguageModel)Pretrainstanza
BertRecord)model	tokenizerpeft_idsc                   @   s:   e Zd ZdddZdddZdddZd	d
 Zdd ZdS )FoundationCacheNFc                 C   sP   |d u ri | _ i | _i | _t | _n|j | _ |j| _|j| _|j| _|| _d S N)bertcharlms	pretrains	threadingLocklocklocal_files_only)selfotherr    r   `/var/www/html/env_mimamsha/lib/python3.10/site-packages/stanza/models/common/foundation_cache.py__init__   s   
zFoundationCache.__init__c                 C   s   | j |d |d\}}}||fS Nr   )load_bert_with_peft)r   transformer_namer   mt_r   r   r   	load_bert"   s   zFoundationCache.load_bertc                 C   s   |du rdS | j g || jvr)|du r| j}tj||d\}}t||i | j|< ntd| | j| }|sD|j|j	dfW  d   S ||j
vrOd|j
|< n
|j
| d |j
|< d||j
| f }|j|j	|fW  d   S 1 ssw   Y  dS )zU
        Load a transformer only once

        Uses a lock for thread safety
        N)NNNr   zReusing bert %sr      z%s_%d)r   r   r   r   r!   r   loggerdebugr	   r
   r   )r   r   	peft_namer   r	   r
   bert_recordr   r   r   r   &   s&   


$z#FoundationCache.load_bert_with_peftc                 C   st   |sd S | j ) || jvrtd| tj|dd| j|< ntd| | j| W  d    S 1 s3w   Y  d S )NLoading charlm from %sFfinetunezReusing charlm from %s)r   r   r#   r$   r   loadr   filenamer   r   r   load_charlmA   s   
$zFoundationCache.load_charlmc                 C   sr   |du rdS | j & || jvrtd| t|| j|< ntd| | j| W  d   S 1 s2w   Y  dS )zc
        Load a pretrained word embedding only once

        Uses a lock for thread safety
        NzLoading pretrain %szReusing pretrain %s)r   r   r#   r$   r   r+   r   r   r   load_pretrainN   s   
$zFoundationCache.load_pretrainNFr   )__name__
__module____qualname__r   r!   r   r-   r.   r   r   r   r   r      s    


r   c                   @   s$   e Zd ZdZdddZdddZdS )NoTransformerFoundationCachea3  
    Uses the underlying FoundationCache, but hiding the transformer.

    Useful for when loading a downstream model such as POS which has a
    finetuned transformer, and we don't want the transformer reused
    since it will then have the finetuned weights for other models
    which don't want them
    Nc                 C   s   t ||d u r| jdS |dS r   )r!   r   )r   r   r   r   r   r   r!   h   s   z&NoTransformerFoundationCache.load_bertc                 C   s    t |||d u r| jdS |dS r   )r   r   )r   r   r%   r   r   r   r   r   k   s    z0NoTransformerFoundationCache.load_bert_with_peftr   )r0   r1   r2   __doc__r!   r   r   r   r   r   r3   _   s    
r3   c                 C   s$   |du rt j| |dS |j| |dS )zT
    Load a bert, possibly using a foundation cache, ignoring the cache if None
    Nr   )r   r!   )
model_namefoundation_cacher   r   r   r   r!   n   s   r!   c                 C   s4   |d u rt j| |d\}}|||fS |j| ||dS r   )r   r!   r   )r5   r%   r6   r   r   r   r   r   r   r   w   s   
r   Fc                 C   sF   | sd S |rt j| ddS |d ur|| S td|  t j| ddS )NTr(   r'   F)r   r*   r-   r#   r$   )charlm_filer6   r)   r   r   r   r-   }   s   
r-   c                 C   s.   | sd S |d ur| | S td|  t| S )NzLoading pretrain from %s)r.   r#   r$   r   )r,   r6   r   r   r   r.      s   
r.   )NNr/   r   )r4   collectionsr   copyr   loggingr   stanza.models.commonr   stanza.models.common.char_modelr   stanza.models.common.pretrainr   	getLoggerr#   r   r   r3   r!   r   r-   r.   r   r   r   r   <module>   s     
M

	
