o
    i                     @   s   d dl Z d dlmZ d dlmZmZmZmZmZ d dl	Z	d dl
mZ er*ddlmZ e	jjddd	 e	jZd
ee defddZdedeeef deeef fddZdedeeef defddZdeeef deeeeef gdf fddZdS )    N)partial)TYPE_CHECKINGAnyCallableDictIterable)Language   CuratedTransformermodel_loadersT)entry_pointsiterablereturnc                 C   s    t | }t|dot|d S )ztReturn True if all the elements are equal to each other
    (or if the input is an empty sequence), False otherwise.TF)	itertoolsgroupbynext)r   g r   S/home/ubuntu/.local/lib/python3.10/site-packages/spacy_curated_transformers/util.py	all_equal   s   
r   nlpcallback_argsfreeze_paramsc                 C   s`   |d }ddl m} | jD ] \}}||}|d u rqt||s(td| d||k |_qd S )Nstepr	   r
   zEAttempting to perform gradual unfreezing of a non-transformer pipe ('z.'. Only transformer pipes support this feature)pipeline.transformerr   
componentsget
isinstance	TypeErrorfrozen)r   r   r   current_stepr   namepipeunfreeze_stepr   r   r   'gradual_transformer_unfreezing_per_pipe   s   

r%   r$   c                 C   s>   |d }ddl m} | jD ]\}}t||sq||k |_qd S )Nr   r	   r
   )r   r   r   r   r    )r   r   r$   r!   r   _r#   r   r   r   (gradual_transformer_unfreezing_all_pipes-   s   
r'   target_pipesc                 C   sP   |  d}|durt| dkrtd|durtt|dS tt| t|  dS )a  Construct a callback that can be used to gradually unfreeze the
    weights of one or more Transformer components during training. This
    can be used to prevent catastrophic forgetting during fine-tuning.

    target_pipes (Dict[str, int]):
        A dictionary whose keys and values correspond to the names of Transformer
        components and the training step at which they should be unfrozen respectively.
    *Nr	   zThe target pipe names for gradual transformer unfreezing contain both the wild-card operator ('*') and individual names. Use either of the two but not both)r$   )r   last_unfreeze_step)r   len
ValueErrorr   r'   r%   maxvalues)r(   unfreeze_step_all_pipesr   r   r   %create_gradual_transformer_unfreezing<   s   

r0   )r   	functoolsr   typingr   r   r   r   r   thincspacy.languager   r   r   registrycreateboolr   strintr%   r'   r0   r   r   r   r   <module>   s:    





