o
    *j                     @   s   d dl mZmZ d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ ddlmZmZ ddlmZ dgZejejejdG dd deZdS )    )AnyDictN)nn)CrossEntropyLoss)Models)Model)MODELS)PoNetConfig)'AttentionTokenClassificationModelOutput)Tasks   )	BertModelBertPreTrainedModel)
BertConfigBertForDocumentSegmentation)module_namec                       s`   e Zd ZdgZ fddZ											d
ddZedeee	f f fdd	Z
  ZS )r   Zpoolerc                    s^   t  | |j| _d | _t|dd| _|j}t|| _	t
|j|j| _d | _|   d S )NF)Zadd_pooling_layer)super__init__
num_labelssentence_pooler_typer   bertZhidden_dropout_probr   ZDropoutdropoutZLinearZhidden_size
classifierclass_weightsZinit_weights)selfconfigkwargsZclassifier_dropout	__class__ q/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/nlp/bert/document_segmentation.pyr      s   z$BertForDocumentSegmentation.__init__Nc                 C   s  |d ur|n| j j}| j|||||||	|
|d	}|d }| jd ur#t| |}| |}d }|d urot| jd}|d urb|	ddk}|	d| j
}t||	dt|j|}|||}n||	d| j
|	d}|s|f|dd   }|d ur|f| S |S t|||j|jdS )N)attention_masktoken_type_idsposition_ids	head_maskinputs_embedsoutput_attentionsoutput_hidden_statesreturn_dictr   )weightr      )losslogitshidden_states
attentions)r   Zuse_return_dictr   r   NotImplementedErrorr   r   r   r   viewr   torchwhereZtensorZignore_indexZtype_asr
   r.   r/   )r   Z	input_idsr!   r"   r#   r$   Zsentence_attention_maskr%   labelsr&   r'   r(   ZoutputsZsequence_outputr-   r,   Zloss_fctZactive_lossZactive_logitsZactive_labelsoutputr   r   r    forward'   sP   



z#BertForDocumentSegmentation.forwardmodel_configc                    sp   |d dkrt j|dd}n|d dkrtj|dd}n	td|d  tt| j|d|d}||_||_|S )	Ntyper   r+   )r   Zponetz0Expected config type bert and ponet, which is : F)Zfrom_tfr   )r   Zfrom_pretrainedr	   
ValueErrorr   r   	model_dirZ	model_cfg)clsr:   r7   r   r   modelr   r   r    _instantiateb   s   
z(BertForDocumentSegmentation._instantiate)NNNNNNNNNNN)__name__
__module____qualname__Z"_keys_to_ignore_on_load_unexpectedr   r6   classmethodr   strr   r=   __classcell__r   r   r   r    r      s"    
;$)typingr   r   r2   r   Ztorch.nnr   Zmodelscope.metainfor   Zmodelscope.modelsr   Zmodelscope.models.builderr   Zmodelscope.models.nlp.ponetr	   Zmodelscope.outputsr
   Zmodelscope.utils.constantr   Zbackboner   r   configurationr   __all__Zregister_moduleZdocument_segmentationZbert_for_dsr   r   r   r   r    <module>   s"   