o
    h@                     @   s   d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZmZmZmZ ddlmZmZ ddlmZmZ dd	lmZmZm Z  dd
l!m"Z"m#Z# e$dZ%e$dZ&G dd deZ'dS )a6  
This file includes a variety of methods needed to train new
constituency parsers.  It also includes a method to load an
already-trained parser.

See the `train` method for the code block which starts from
  raw treebank and returns a new parser.
`evaluate` reads a treebank and gives a score for those trees.
    N)	load_bertload_bert_with_peftload_charlmload_pretrainNoTransformerFoundationCache)build_peft_wrapperload_peft_wrapperpop_peft_args)BaseTrainer	ModelType)	LSTMModelSentenceBoundaryStackHistoryConstituencyComposition)
TransitionTransitionScheme)build_optimizerbuild_scheduler)find_wordvec_pretrainchoose_charlmfind_charlm_file)default_charlmsdefault_pretrainsstanzazstanza.constituency.trainerc                       s   e Zd ZdZd fdd	Zd fd	d
	Zdd Zedd Ze	dd Z
e	dd Zdd Ze	dd Ze	dd Ze	dddZe	dd Z  ZS ) Trainerz
    Stores a constituency model and its optimizer

    Not inheriting from common/trainer.py because there's no concept of change_lr (yet?)
    Nr           Fc	           	   
      s   t  |||||||| d S N)super__init__)	selfmodel	optimizer	schedulerepochs_trainedbatches_trainedbest_f1
best_epochfirst_optimizer	__class__ ]/var/www/html/env_mimamsha/lib/python3.10/site-packages/stanza/models/constituency/trainer.pyr   $      zTrainer.__init__Tc                    s   t  || dS )zQ
        Save the model (and by default the optimizer) to the given path
        N)r   save)r   filenamesave_optimizerr(   r*   r+   r-   '   s   zTrainer.savec                 C   s4   | j jddrddlm} || j j| j jdS d S )Nuse_peftFr   )get_peft_model_state_dictadapter_name)r    argsgetpeftr1   
bert_model	peft_name)r   r1   r*   r*   r+   get_peft_params-   s   zTrainer.get_peft_paramsc                 C   s   t jS r   )r   LSTM)r   r*   r*   r+   
model_type4   s   zTrainer.model_typec                 C   sV   d| vrd S t j| d rt| d |S td| d  | d }t|t}t||S )Nwordvec_pretrain_filezRUnable to find pretrain in %s  Will try to load from the default resources insteadlang)ospathexistsr   loggerinfor   r   )
saved_argsfoundation_cachelanguagewordvec_pretrainr*   r*   r+   find_and_load_pretrain8   s   

zTrainer.find_and_load_pretrainc              
   C   s~   zt | |W S  ty> } z,td|  |d }|d dd }t||dti }t|||} t | |W  Y d }~S d }~ww )NzRUnable to load charlm from %s  Will try to load from the default resources insteadr=   	shorthand_   default)r   FileNotFoundErrorrA   rB   splitr   r   r   )charlm_file	directionrC   rD   erE   datasetcharlmr*   r*   r+   find_and_load_charlmC   s   zTrainer.find_and_load_charlmc                 C   s   t d| j|t| d S )NzHNumber of words in the training set found in the embedding: %d out of %d)tloggerrB   r    num_words_knownlen)r   wordsr*   r*   r+   log_num_words_knownO   r,   zTrainer.log_num_words_knownc              
   C   sh   t | j| |}|dd d ur-z
||d  W |S  ty, } ztd| |d }~ww td |S )Noptimizer_state_dictz Failed to load optimizer from %sz`Attempted to load optimizer to resume training, but optimizer not saved.  Creating new optimizer)r   r4   r5   load_state_dict
ValueErrorrA   rB   )r    
checkpointr'   r.   r!   rP   r*   r*   r+   load_optimizerR   s   
zTrainer.load_optimizerc                 C   s*   t | j||d}d|v r||d  |S )Nr'   scheduler_state_dict)r   r4   rZ   )r    r!   r\   r'   r"   r*   r*   r+   load_scheduler^   s   zTrainer.load_schedulerc                 C   s  t | d }t|d trt|d  |d< t|d tr$t|d  |d< t|d tr3t|d  |d< t|d trBt|d  |d< t|d trQt|d  |d< |du rWi }t|}t	| |
dd |
d	d |
dd |
dd |
d
d |
dd |
dd |
dd d|v r|d du r|
d d|v r|d du r|
d d|v r|d du r|
d || |dddu rd|d< |dddu rd|d< | d }|dkrt||}|ddr|du rt|d	dd|\}	}
}nt|d	d|\}	}
t|	||t|}	d}n2|d s1|d s1tdd | d  D r>t|d	d\}	}
d}nt|d	d|\}	}
d}t|d d||}t|d d||}| d }tdd |D rtdd |D }td1i d |d!|d"|d	|	d#|
d$|d%|d|d&| d& d'| d' d(| d( d)t| d) d*| d* d+| d+ d,| d, d-|}ntd.||j| d dd/ ||d0d}|S )2z
        Build a new model just from the saved params and some extra args

        Refactoring allows other processors to include a constituency parser as a module
        configsentence_boundary_vectorsconstituency_compositiontransition_stackconstituent_stacktransition_schemeNbert_hidden_layersr7   num_tree_lstm_layersmaxout_kr<   charlm_forward_filecharlm_backward_filebert_finetuneFstage1_bert_finetuner;   r:   r0   constituencyTc                 s   s    | ]}| d V  qdS )zbert_model.N)
startswith.0xr*   r*   r+   	<genexpr>       z,Trainer.model_from_params.<locals>.<genexpr>r    forwardbackwardtransitionsc                 s   s    | ]}t |tV  qd S r   )
isinstancestrrp   r*   r*   r+   rs      rt   c                 S   s   g | ]}t |qS r*   )r   	from_reprrp   r*   r*   r+   
<listcomp>   s    z-Trainer.model_from_params.<locals>.<listcomp>pretrainforward_charlmbackward_charlmbert_tokenizerforce_bert_savedr8   constituentstagsrW   
rare_wordsroot_labelsconstituent_opensunary_limitr4   zUnknown model type {})strictdevicer*   )dictrx   ry   r   r   r   r   copydeepcopyr	   popupdater5   r   rG   r   r   r   rA   anykeysrS   allr   setr[   formatrZ   to)paramspeft_paramsr4   rD   r8   rC   update_argsr;   ptr7   r   
bert_savedr}   r~   rw   r    r*   r*   r+   model_from_paramse   s   






0	
zTrainer.model_from_paramsc                 C   s  | d r%| d r%t j| d r%td| d  tj| d | d|	d}|S |	| d }|	| d }|	| d }| d	 rTtd
|
 tj|
| dt	|	d}d|_
|S | d rtd|
 t| }|dd  |dd  tj|
|dt	|	d}t||||jj|jj|jj|jj|jj|jj|jj|jj|jj|jj|jj|j | }|| d }||j t| |d}t| |}t|||}|S | d rtd| d d  t| }d|d< d|d< |} d }| d rd}t| d \}}t ||t|d}n| d s| d rt| d \}}n	t| d |	\}}t|||||d|||||||||| }|| d }t| || d d}t| || d d}t|||| d d}|S )Nr\   checkpoint_save_namez)Found checkpoint to continue training: %sT)r]   rD   r<   rj   rk   finetunezLoading model to finetune: %sr   relearn_structurez=Loading model to continue training with new structure from %spattn_num_layerslattn_d_projFr   
multistagezIWarming up model for %d iterations using AdaDelta to train the embeddingsepochs   r0   rn   r7   r2   rl   rm   )build_simple_adadeltar^   )!r>   r?   r@   rT   rB   r   loadr   r   r   r#   r   r   r   r    r7   r   r   r8   rw   r   r   delta_wordsr   r   r   r   r   copy_with_new_structurer   r   r   r   )r4   train_transitionstrain_constituentsr   rW   r   r   
open_nodesr   rD   model_load_filetrainerr   r}   r~   	temp_argsr    r!   r"   r8   r7   r   r*   r*   r+   build_trainer   s    
zTrainer.build_trainer)NNr   r   r   r   F)T)NN)__name__
__module____qualname____doc__r   r-   r9   propertyr;   staticmethodrG   rS   rX   r]   r`   r   r   __classcell__r*   r*   r(   r+   r      s(    





gr   )(r   r   loggingr>   torch%stanza.models.common.foundation_cacher   r   r   r   r    stanza.models.common.peft_configr   r   r	   'stanza.models.constituency.base_trainerr
   r   %stanza.models.constituency.lstm_modelr   r   r   r   ,stanza.models.constituency.parse_transitionsr   r    stanza.models.constituency.utilsr   r   stanza.utils.training.commonr   r   r   !stanza.resources.default_packagesr   r   	getLoggerrA   rT   r   r*   r*   r*   r+   <module>   s     


