o
    *jP                     @   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   Zpoolerc                    sN   t  | |j| _t|dd| _t|j| _t	|j
|j| _|   d S )NF)Zadd_pooling_layer)super__init__
num_labelsr   ponetr   ZDropoutZhidden_dropout_probdropoutZLinearZhidden_size
classifierZinit_weights)selfconfigkwargs	__class__ r/var/www/html/Deteccion_Ine/venv/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   Zuse_return_dictr   r   r   r   viewr   torchwhereZtensorZignore_indexZtype_asr
   r,   r-   )r   Z	input_idsr   r    r!   r"   r#   r$   labelsr%   r&   r'   ZoutputsZsequence_outputr+   r*   Zloss_fctZactive_lossZactive_logitsZ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typeZbertr)   )r   r   z0Expected config type bert and ponet, which is : )r   )r	   Zfrom_pretrainedr   
ValueErrorr   r   	model_dirZ	model_cfg)clsr7   r4   r   r   modelr   r   r   _instantiateg   s   z)PoNetForDocumentSegmentation._instantiate)NNNNNNNNNNN)__name__
__module____qualname__Z"_keys_to_ignore_on_load_unexpectedr   r3   classmethodr   strr   r:   __classcell__r   r   r   r   r      s"    
A$)typingr   r   r/   r   Ztorch.nnr   Zmodelscope.metainfor   Zmodelscope.models.baser   Zmodelscope.models.builderr   Zmodelscope.models.nlp.bertr	   Zmodelscope.outputsr
   Zmodelscope.utils.constantr   Zbackboner   r   configurationr   __all__Zregister_moduleZdocument_segmentationZponet_for_dsZextractive_summarizationr   r   r   r   r   <module>   s(   