o
    ߥiP                     @   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ejejejdG dd deZdS )    )AnyDictN)nn)CrossEntropyLoss)Models)Model)MODELS)
BertConfig)'AttentionTokenClassificationModelOutput)Tasks   )
PoNetModelPoNetPreTrainedModel)PoNetConfigPoNetForDocumentSegmentation)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                    sN   t  | |j| _t|dd| _t|j| _t	|j
|j| _|   d S )NF)add_pooling_layer)super__init__
num_labelsr   ponetr   Dropouthidden_dropout_probdropoutLinearhidden_size
classifierinit_weights)selfconfigkwargs	__class__ e/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/nlp/ponet/document_segmentation.pyr      s   z%PoNetForDocumentSegmentation.__init__Nc                 C   s  |dur|n| j j}| j||||||||	|
|d
}|d }| |}| |}d}|durft }|durY|ddk}|d| j}t	||dt
|j|}|||}n||d| j|d}|s||f|dd  }|durz|f| S |S t|||j|jdS )z
        labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
            Labels for computing the token classification loss. Indices should be in ``[0, ..., config.num_labels -
        1]``.
        N)	attention_masktoken_type_idssegment_idsposition_ids	head_maskinputs_embedsoutput_attentionsoutput_hidden_statesreturn_dictr   r      )losslogitshidden_states
attentions)r    use_return_dictr   r   r   r   viewr   torchwheretensorignore_indextype_asr
   r3   r4   )r   	input_idsr&   r'   r(   r)   r*   r+   labelsr,   r-   r.   outputssequence_outputr2   r1   loss_fctactive_lossactive_logitsactive_labelsoutputr$   r$   r%   forward&   sN   


z$PoNetForDocumentSegmentation.forwardmodel_configc                    sn   |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}||_||_|S )Ntypebertr0   )r   r   z0Expected config type bert and ponet, which is : )r    )r	   from_pretrainedr   
ValueErrorr   r   	model_dir	model_cfg)clsrK   rF   r!   r    modelr"   r$   r%   _instantiateg   s   z)PoNetForDocumentSegmentation._instantiate)NNNNNNNNNNN)__name__
__module____qualname__"_keys_to_ignore_on_load_unexpectedr   rE   classmethodr   strr   rO   __classcell__r$   r$   r"   r%   r      s"    
A$)typingr   r   r7   r   torch.nnr   modelscope.metainfor   modelscope.models.baser   modelscope.models.builderr   modelscope.models.nlp.bertr	   modelscope.outputsr
   modelscope.utils.constantr   backboner   r   configurationr   __all__register_moduledocument_segmentationponet_for_dsextractive_summarizationr   r$   r$   r$   r%   <module>   s(   