o
    ߥi                     @   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   poolerc                    s^   t  | |j| _d | _t|dd| _|j}t|| _	t
|j|j| _d | _|   d S )NF)add_pooling_layer)super__init__
num_labelssentence_pooler_typer   berthidden_dropout_probr   DropoutdropoutLinearhidden_size
classifierclass_weightsinit_weights)selfconfigkwargsclassifier_dropout	__class__ d/home/ubuntu/.local/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"   use_return_dictr   r   NotImplementedErrorr   r   r   r   viewr   torchwheretensorignore_indextype_asr
   r6   r7   )r!   	input_idsr)   r*   r+   r,   sentence_attention_maskr-   labelsr.   r/   r0   outputssequence_outputr5   r4   loss_fctactive_lossactive_logits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   r3   )r   ponetz0Expected config type bert and ponet, which is : F)from_tfr"   )r   from_pretrainedr	   
ValueErrorr   r   	model_dir	model_cfg)clsrQ   rK   r#   r"   modelr%   r'   r(   _instantiateb   s   
z(BertForDocumentSegmentation._instantiate)NNNNNNNNNNN)__name__
__module____qualname__"_keys_to_ignore_on_load_unexpectedr   rJ   classmethodr   strr   rU   __classcell__r'   r'   r%   r(   r      s"    
;$)typingr   r   r;   r   torch.nnr   modelscope.metainfor   modelscope.modelsr   modelscope.models.builderr   modelscope.models.nlp.ponetr	   modelscope.outputsr
   modelscope.utils.constantr   backboner   r   configurationr   __all__register_moduledocument_segmentationbert_for_dsr   r'   r'   r'   r(   <module>   s"   