o
    wik                     @   sH  d Z ddlZddlmZ ddlmZmZ ddl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mZmZ ddlmZ ddlmZmZmZ ddlmZmZmZ ddlmZ e e!Z"eeddG dd deZ#G dd de	j$Z%G dd de	j$Z&G dd de	j$Z'G dd de	j$Z(G dd de	j$Z)G dd de	j$Z*G d d! d!e	j$Z+G d"d# d#e	j$Z,G d$d% d%e	j$Z-G d&d' d'eZ.G d(d) d)e	j$Z/G d*d+ d+e	j$Z0G d,d- d-e	j$Z1eG d.d/ d/eZ2eG d0d1 d1e2Z3eG d2d3 d3e2Z4ed4dG d5d6 d6e2Z5ed7dG d8d9 d9e2Z6g d:Z7dS );zPyTorch Bros model.    N)	dataclass)OptionalUnion)nn)CrossEntropyLoss   )ACT2FN)GradientCheckpointingLayer))BaseModelOutputWithPastAndCrossAttentions,BaseModelOutputWithPoolingAndCrossAttentionsTokenClassifierOutput)PreTrainedModel)apply_chunking_to_forward find_pruneable_heads_and_indicesprune_linear_layer)ModelOutputauto_docstringlogging   )
BrosConfigz@
    Base class for outputs of token classification models.
    )custom_introc                   @   st   e Zd ZU dZdZeej ed< dZ	eej ed< dZ
eej ed< dZeeej  ed< dZeeej  ed< dS )BrosSpadeOutputa  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided):
        Classification loss.
    initial_token_logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.num_labels)`):
        Classification scores for entity initial tokens (before SoftMax).
    subsequent_token_logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, sequence_length+1)`):
        Classification scores for entity sequence tokens (before SoftMax).
    Nlossinitial_token_logitssubsequent_token_logitshidden_states
attentions)__name__
__module____qualname____doc__r   r   torchFloatTensor__annotations__r   r   r   tupler    r%   r%   c/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/transformers/models/bros/modeling_bros.pyr   *   s   
 	r   c                       2   e Zd Z fddZdejdejfddZ  ZS )BrosPositionalEmbedding1Dc                    s@   t    |j| _ddtd| jd| j   }| d| d S )Nr   i'          g       @inv_freq)super__init__dim_bbox_sinusoid_emb_1dr!   arangeregister_buffer)selfconfigr*   	__class__r%   r&   r,   D   s   
z"BrosPositionalEmbedding1D.__init__pos_seqreturnc                 C   sX   |  }|\}}}||||d| jddd| jd  }tj| | gdd}|S )Nr      dim)sizeviewr*   r-   r!   catsincos)r0   r4   seq_sizeb1b2b3sinusoid_inppos_embr%   r%   r&   forwardN   s
   
(z!BrosPositionalEmbedding1D.forwardr   r   r   r,   r!   TensorrE   __classcell__r%   r%   r2   r&   r(   A   s    
r(   c                       r'   )BrosPositionalEmbedding2Dc                    s*   t    |j| _t|| _t|| _d S N)r+   r,   dim_bboxr(   	x_pos_emb	y_pos_embr0   r1   r2   r%   r&   r,   W   s   

z"BrosPositionalEmbedding2D.__init__bboxr5   c                 C   sd   g }t | jD ]!}|d dkr|| |d|f  q|| |d|f  qtj|dd}|S )Nr6   r   .r7   r8   )rangerK   appendrL   rM   r!   r<   )r0   rO   stackibbox_pos_embr%   r%   r&   rE   ^   s   z!BrosPositionalEmbedding2D.forwardrF   r%   r%   r2   r&   rI   V   s    rI   c                       s,   e Zd Z fddZdejfddZ  ZS )BrosBboxEmbeddingsc                    s.   t    t|| _tj|j|jdd| _d S )NF)bias)	r+   r,   rI   bbox_sinusoid_embr   Lineardim_bbox_sinusoid_emb_2ddim_bbox_projectionbbox_projectionrN   r2   r%   r&   r,   j   s   

zBrosBboxEmbeddings.__init__rO   c                 C   s\   | dd}|d d d d d d d f |d d d d d d d f  }| |}| |}|S )Nr   r   )	transposerW   r[   )r0   rO   bbox_tbbox_posrT   r%   r%   r&   rE   o   s
   8

zBrosBboxEmbeddings.forwardrF   r%   r%   r2   r&   rU   i   s    rU   c                       sh   e Zd ZdZ fddZ					ddeej deej deej d	eej d
edejfddZ	  Z
S )BrosTextEmbeddingszGConstruct the embeddings from word, position and token_type embeddings.c                    s   t    tj|j|j|jd| _t|j|j| _	t|j
|j| _tj|j|jd| _t|j| _t|dd| _| dt|jd | jdtj| j tj| jjdd	d
 d S )N)padding_idxepsposition_embedding_typeabsoluteposition_ids)r   r7   token_type_idsdtypedeviceF)
persistent)r+   r,   r   	Embedding
vocab_sizehidden_sizepad_token_idword_embeddingsmax_position_embeddingsposition_embeddingstype_vocab_sizetoken_type_embeddings	LayerNormlayer_norm_epsDropouthidden_dropout_probdropoutgetattrrc   r/   r!   r.   expandzerosre   r:   longri   rN   r2   r%   r&   r,   {   s"   

zBrosTextEmbeddings.__init__Nr   	input_idsrf   re   inputs_embedspast_key_values_lengthr5   c                 C   s   |d ur	|  }n|  d d }|d }|d u r&| jd d ||| f }|d u rPt| drE| jd d d |f }||d |}	|	}ntj|tj| jjd}|d u rY| 	|}| 
|}
||
 }| jdkrp| |}||7 }| |}| |}|S )Nr7   r   rf   r   rg   rd   )r:   re   hasattrrf   rz   r!   r{   r|   ri   ro   rs   rc   rq   rt   rx   )r0   r}   rf   re   r~   r   input_shape
seq_lengthbuffered_token_type_ids buffered_token_type_ids_expandedrs   
embeddingsrq   r%   r%   r&   rE      s,   







zBrosTextEmbeddings.forward)NNNNr   )r   r   r   r    r,   r   r!   rG   intrE   rH   r%   r%   r2   r&   r_   x   s*    r_   c                       s   e Zd Z fddZdejfddZ						ddejd	ejd
eej deej deej deej deeeej	   deej deej fddZ
  ZS )BrosSelfAttentionc                    s   t    |j|j dkrt|dstd|j d|j d|j| _t|j|j | _| j| j | _t	
|j| j| _t	
|j| j| _t	
|j| j| _t	|j| _t|dd| _| jdksf| jd	krw|j| _t	d
|j d | j| _|j| _d S )Nr   embedding_sizezThe hidden size (z6) is not a multiple of the number of attention heads ()rc   rd   relative_keyrelative_key_queryr6   r   )r+   r,   rm   num_attention_headsr   
ValueErrorr   attention_head_sizeall_head_sizer   rX   querykeyvaluerv   attention_probs_dropout_probrx   ry   rc   rp   rk   distance_embedding
is_decoderrN   r2   r%   r&   r,      s&   

zBrosSelfAttention.__init__xc                 C   s6   |  d d | j| jf }|j| }|ddddS )Nr7   r   r6   r   r   )r:   r   r   r;   permute)r0   r   new_x_shaper%   r%   r&   transpose_for_scores   s   
z&BrosSelfAttention.transpose_for_scoresNFr   rT   attention_mask	head_maskencoder_hidden_statesencoder_attention_maskpast_key_valueoutput_attentionsr5   c	                 C   s  |  |}	|d u}
|
r|d ur|d }|d }|}nP|
r/| | |}| | |}|}n;|d urZ| | |}| | |}tj|d |gdd}tj|d |gdd}n| | |}| | |}| |	}| jrv||f}t||dd}| j	dks| j	dkr|
 d }tj|tj|jd	dd}tj|tj|jd	dd}|| }| || j d }|j|jd
}| j	dkrtd||}|| }n| j	dkrtd||}td||}|| | }|j\}}}}|||||}|g d}td||f}|| }|t| j }|d ur|| }tjdd|}| |}|d ur4|| }t||}|dddd }|
 d d | jf }|j| }|r\||fn|f}| jrh||f }|S )Nr   r   r6   r8   r7   r   r   rg   )rh   zbhld,lrd->bhlrzbhrd,lrd->bhlr)r6   r   r   r   zbnid,bijd->bnijr   )r   r   r   r   r!   r<   r   matmulr\   rc   r:   r.   r|   ri   r;   r   rp   torh   einsumshaper   mathsqrtr   r   Softmaxrx   
contiguousr   )r0   r   rT   r   r   r   r   r   r   mixed_query_layeris_cross_attention	key_layervalue_layerquery_layerattention_scoresr   position_ids_lposition_ids_rdistancepositional_embeddingrelative_position_scoresrelative_position_scores_queryrelative_position_scores_key
batch_sizen_headd_headbbox_pos_scoresattention_probscontext_layernew_context_layer_shapeoutputsr%   r%   r&   rE      sn   









zBrosSelfAttention.forwardNNNNNF)r   r   r   r,   r!   rG   r   r   r$   r"   rE   rH   r%   r%   r2   r&   r      s8    	
r   c                       8   e Zd Z fddZdejdejdejfddZ  ZS )BrosSelfOutputc                    sB   t    t|j|j| _tj|j|jd| _t|j	| _
d S Nra   )r+   r,   r   rX   rm   densert   ru   rv   rw   rx   rN   r2   r%   r&   r,   F     
zBrosSelfOutput.__init__r   input_tensorr5   c                 C   &   |  |}| |}| || }|S rJ   r   rx   rt   r0   r   r   r%   r%   r&   rE   L     

zBrosSelfOutput.forwardrF   r%   r%   r2   r&   r   E      $r   c                       s   e Zd Z fddZdd Z						ddejdejd	eej d
eej deej deej deeeej	   dee
 deej fddZ  ZS )BrosAttentionc                    s*   t    t|| _t|| _t | _d S rJ   )r+   r,   r   r0   r   outputsetpruned_headsrN   r2   r%   r&   r,   T  s   


zBrosAttention.__init__c                 C   s   t |dkrd S t|| jj| jj| j\}}t| jj|| j_t| jj|| j_t| jj	|| j_	t| j
j|dd| j
_| jjt | | j_| jj| jj | j_| j|| _d S )Nr   r   r8   )lenr   r0   r   r   r   r   r   r   r   r   r   r   union)r0   headsindexr%   r%   r&   prune_headsZ  s   zBrosAttention.prune_headsNFr   rT   r   r   r   r   r   r   r5   c	              
   C   s@   | j ||||||||d}	| |	d |}
|
f|	dd   }|S )N)r   rT   r   r   r   r   r   r   r   r   )r0   r   )r0   r   rT   r   r   r   r   r   r   self_outputsattention_outputr   r%   r%   r&   rE   o  s   
zBrosAttention.forwardr   )r   r   r   r,   r   r!   rG   r   r$   r"   boolrE   rH   r%   r%   r2   r&   r   S  s8    	
r   c                       r'   )BrosIntermediatec                    sD   t    t|j|j| _t|jt	rt
|j | _d S |j| _d S rJ   )r+   r,   r   rX   rm   intermediate_sizer   
isinstance
hidden_actstrr   intermediate_act_fnrN   r2   r%   r&   r,     s
   
zBrosIntermediate.__init__r   r5   c                 C   s   |  |}| |}|S rJ   )r   r   )r0   r   r%   r%   r&   rE     s   

zBrosIntermediate.forwardrF   r%   r%   r2   r&   r     s    r   c                       r   )
BrosOutputc                    sB   t    t|j|j| _tj|j|jd| _t	|j
| _d S r   )r+   r,   r   rX   r   rm   r   rt   ru   rv   rw   rx   rN   r2   r%   r&   r,     r   zBrosOutput.__init__r   r   r5   c                 C   r   rJ   r   r   r%   r%   r&   rE     r   zBrosOutput.forwardrF   r%   r%   r2   r&   r     r   r   c                       s   e Zd Z fddZ						ddejdejdeej deej d	eej d
eej deeeej   dee	 deej fddZ
dd Z  ZS )	BrosLayerc                    sn   t    |j| _d| _t|| _|j| _|j| _| jr+| js&t|  dt|| _	t
|| _t|| _d S )Nr   z> should be used as a decoder model if cross attention is added)r+   r,   chunk_size_feed_forwardseq_len_dimr   	attentionr   add_cross_attention	Exceptioncrossattentionr   intermediater   r   rN   r2   r%   r&   r,     s   



zBrosLayer.__init__NFr   rT   r   r   r   r   r   r   r5   c	              	   C   s  |d ur
|d d nd }	| j ||||||	d}
|
d }| jr)|
dd }|
d }n|
dd  }d }| jrp|d urpt| drEtd|  d|d urO|d	d  nd }| |||||||}|d }||dd  }|d }|| }t| j| j| j|}|f| }| jr||f }|S )
Nr6   )rT   r   r   r   r   r   r   r7   r   z'If `encoder_hidden_states` are passed, z` has to be instantiated with cross-attention layers by setting `config.add_cross_attention=True`r   )	r   r   r   r   r   r   feed_forward_chunkr   r   )r0   r   rT   r   r   r   r   r   r   self_attn_past_key_valueself_attention_outputsr   r   present_key_valuecross_attn_present_key_valuecross_attn_past_key_valuecross_attention_outputslayer_outputr%   r%   r&   rE     sX   


	

zBrosLayer.forwardc                 C   s   |  |}| ||}|S rJ   )r   r   )r0   r   intermediate_outputr   r%   r%   r&   r     s   
zBrosLayer.feed_forward_chunkr   )r   r   r   r,   r!   rG   r   r"   r$   r   rE   r   rH   r%   r%   r2   r&   r     s8    	

Er   c                       s   e Zd Z fddZ									ddejdejdeej d	eej d
eej deej deeeej   dee	 dee	 dee	 dee	 de
eej ef fddZ  ZS )BrosEncoderc                    s4   t     | _t fddt jD | _d S )Nc                    s   g | ]}t  qS r%   )r   ).0_r1   r%   r&   
<listcomp>  s    z(BrosEncoder.__init__.<locals>.<listcomp>)r+   r,   r1   r   
ModuleListrP   num_hidden_layerslayerrN   r2   r   r&   r,     s   
$zBrosEncoder.__init__NFTr   rT   r   r   r   r   past_key_values	use_cacher   output_hidden_statesreturn_dictr5   c                 C   s  |
rdnd }|	r
dnd }|	r| j jrdnd }|rdnd }t| jD ]L\}}|
r,||f }|d ur4|| nd }|d ur>|| nd }|||||||||	d}|d }|rY||d f7 }|	rm||d f }| j jrm||d f }q!|
ru||f }|stdd |||||fD S t|||||d	S )
Nr%   )r   r   r   r   r7   r   r6   c                 s   s    | ]	}|d ur|V  qd S rJ   r%   )r   vr%   r%   r&   	<genexpr>8  s    z&BrosEncoder.forward.<locals>.<genexpr>)last_hidden_stater   r   r   cross_attentions)r1   r   	enumerater   r$   r
   )r0   r   rT   r   r   r   r   r   r   r   r   r   all_hidden_statesall_self_attentionsall_cross_attentionsnext_decoder_cacherS   layer_modulelayer_head_maskr   layer_outputsr%   r%   r&   rE     sZ   

zBrosEncoder.forward)	NNNNNNFFT)r   r   r   r,   r!   rG   r   r"   r$   r   r   r
   rE   rH   r%   r%   r2   r&   r     sH    		
r   c                       r'   )
BrosPoolerc                    s*   t    t|j|j| _t | _d S rJ   )r+   r,   r   rX   rm   r   Tanh
activationrN   r2   r%   r&   r,   N  s   
zBrosPooler.__init__r   r5   c                 C   s(   |d d df }|  |}| |}|S )Nr   )r   r  )r0   r   first_token_tensorpooled_outputr%   r%   r&   rE   S  s   

zBrosPooler.forwardrF   r%   r%   r2   r&   r  M  s    r  c                       r'   )BrosRelationExtractorc                    s   t    |j| _|j| _|j| _|j| _t| j| _	t
| j| j| j | _t
| j| j| j | _ttd| j| _d S )Nr   )r+   r,   n_relationsrm   backbone_hidden_sizehead_hidden_sizeclassifier_dropout_probr   rv   droprX   r   r   	Parameterr!   r{   
dummy_noderN   r2   r%   r&   r,   ]  s   
zBrosRelationExtractor.__init__r   r   c              	   C   s   |  | |}| jdd|dd}tj||gdd}| | |}|	|d|d| j
| j}|	|d|d| j
| j}t|dddd|dddd}|S )Nr   r   axisr6   r   )r   r  r  	unsqueezerepeatr:   r!   r<   r   r;   r  r  r   r   )r0   r   r   	dummy_vecrelation_scorer%   r%   r&   rE   k  s    zBrosRelationExtractor.forwardrF   r%   r%   r2   r&   r  \  s    r  c                   @   s   e Zd ZeZdZdd ZdS )BrosPreTrainedModelbrosc                 C   s   t |tjr |jjjd| jjd |jdur|jj	  dS dS t |tj
rC|jjjd| jjd |jdurA|jj|j 	  dS dS t |tjrX|jj	  |jjd dS dS )zInitialize the weightsr)   )meanstdNg      ?)r   r   rX   weightdatanormal_r1   initializer_rangerV   zero_rk   r`   rt   fill_)r0   moduler%   r%   r&   _init_weights  s   

z!BrosPreTrainedModel._init_weightsN)r   r   r   r   config_classbase_model_prefixr$  r%   r%   r%   r&   r  ~  s    r  c                "       s   e Zd Zd fdd	Zdd Zdd Zdd	 Ze	
	
	
	
	
	
	
	
	
	
	
	
	
	
ddee	j
 dee	j
 dee	j
 dee	j
 dee	j
 dee	j
 dee	j
 dee	j
 dee	j
 deee	j  dee dee dee dee deee	j
 ef fddZ  ZS )	BrosModelTc                    sN   t  | || _t|| _t|| _t|| _|rt	|nd| _
|   dS )zv
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        N)r+   r,   r1   r_   r   rU   bbox_embeddingsr   encoderr  poolerinit_weights)r0   r1   add_pooling_layerr2   r%   r&   r,     s   


zBrosModel.__init__c                 C   s   | j jS rJ   r   ro   )r0   r%   r%   r&   get_input_embeddings  s   zBrosModel.get_input_embeddingsc                 C   s   || j _d S rJ   r-  )r0   r   r%   r%   r&   set_input_embeddings  s   zBrosModel.set_input_embeddingsc                 C   s*   |  D ]\}}| jj| j| qdS )z
        Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base
        class PreTrainedModel
        N)itemsr)  r   r   r   )r0   heads_to_pruner   r   r%   r%   r&   _prune_heads  s   zBrosModel._prune_headsNr}   rO   r   rf   re   r   r~   r   r   r   r   r   r   r   r5   c           "      C   s  |dur|n| j j}|dur|n| j j}|dur|n| j j}| j jr-|dur(|n| j j}nd}|dur;|dur;td|durD| }n|durQ| dd }ntd|du r]td|\}}|durh|jn|j}|
durx|
d d j	d nd}|du rt
j||d	}|du rt| jd
r| jjddd|f }|||}|}n	t
j|t
j|d}| |||}| j jr|dur| \}}}||f}|	du rt
j||d	}	| |	}nd}| || j j}| j|||||d}|j	d dkr|ddddg df }|| j j }| |}| j|||||||
||||d}|d } | jdur+| | nd}!|s:| |!f|dd  S t| |!|j|j|j|jdS )a  
        bbox ('torch.FloatTensor' of shape '(batch_size, num_boxes, 4)'):
            Bounding box coordinates for each token in the input sequence. Each bounding box is a list of four values
            (x1, y1, x2, y2), where (x1, y1) is the top left corner, and (x2, y2) is the bottom right corner of the
            bounding box.

        Examples:

        ```python
        >>> import torch
        >>> from transformers import BrosProcessor, BrosModel

        >>> processor = BrosProcessor.from_pretrained("jinho8345/bros-base-uncased")

        >>> model = BrosModel.from_pretrained("jinho8345/bros-base-uncased")

        >>> encoding = processor("Hello, my dog is cute", add_special_tokens=False, return_tensors="pt")
        >>> bbox = torch.tensor([[[0, 0, 1, 1]]]).repeat(1, encoding["input_ids"].shape[-1], 1)
        >>> encoding["bbox"] = bbox

        >>> outputs = model(**encoding)
        >>> last_hidden_states = outputs.last_hidden_state
        ```NFzDYou cannot specify both input_ids and inputs_embeds at the same timer7   z5You have to specify either input_ids or inputs_embedszYou have to specify bboxr   r6   )ri   rf   rg   )r}   re   rf   r~   r      )r   r   r6   r   r6   r   r   r   )
rT   r   r   r   r   r   r   r   r   r   r   )r   pooler_outputr   r   r   r   )r1   r   r   use_return_dictr   r   r   r:   ri   r   r!   onesr   r   rf   rz   r{   r|   get_extended_attention_maskinvert_attention_maskget_head_maskr   
bbox_scaler(  r)  r*  r   r   r   r   r   )"r0   r}   rO   r   rf   re   r   r~   r   r   r   r   r   r   r   r   r   r   ri   r   r   r   extended_attention_maskencoder_batch_sizeencoder_sequence_lengthr   encoder_hidden_shapeencoder_extended_attention_maskembedding_outputscaled_bboxbbox_position_embeddingsencoder_outputssequence_outputr
  r%   r%   r&   rE     s   )
	
zBrosModel.forward)T)NNNNNNNNNNNNNN)r   r   r   r,   r.  r/  r2  r   r   r!   rG   listr"   r   r   r$   r   rE   rH   r%   r%   r2   r&   r'    sf    	
r'  c                          e Zd ZdgZ fddZe												ddeej deej deej deej d	eej d
eej deej deej deej dee	 dee	 dee	 de
eej ef fddZ  ZS )BrosForTokenClassificationr*  c                    s^   t  | |j| _t|| _t|dr|jn|j}t	|| _
t|j|j| _|   d S Nclassifier_dropout)r+   r,   
num_labelsr'  r  r   rI  rw   r   rv   rx   rX   rm   
classifierr+  r0   r1   rI  r2   r%   r&   r,   J  s   
z#BrosForTokenClassification.__init__Nr}   rO   r   bbox_first_token_maskrf   re   r   r~   labelsr   r   r   r5   c                 C   s   |dur|n| j j}| j||||||||
||d
}|d }| |}| |}d}|	durXt }|durK|d}||d| j| |	d| }n||d| j|	d}|sn|f|dd  }|durl|f| S |S t|||j	|j
dS )a  
        bbox ('torch.FloatTensor' of shape '(batch_size, num_boxes, 4)'):
            Bounding box coordinates for each token in the input sequence. Each bounding box is a list of four values
            (x1, y1, x2, y2), where (x1, y1) is the top left corner, and (x2, y2) is the bottom right corner of the
            bounding box.
        bbox_first_token_mask (`torch.FloatTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Mask to indicate the first token of each bounding box. Mask values selected in `[0, 1]`:

            - 1 for tokens that are **not masked**,
            - 0 for tokens that are **masked**.

        Examples:

        ```python
        >>> import torch
        >>> from transformers import BrosProcessor, BrosForTokenClassification

        >>> processor = BrosProcessor.from_pretrained("jinho8345/bros-base-uncased")

        >>> model = BrosForTokenClassification.from_pretrained("jinho8345/bros-base-uncased")

        >>> encoding = processor("Hello, my dog is cute", add_special_tokens=False, return_tensors="pt")
        >>> bbox = torch.tensor([[[0, 0, 1, 1]]]).repeat(1, encoding["input_ids"].shape[-1], 1)
        >>> encoding["bbox"] = bbox

        >>> outputs = model(**encoding)
        ```N)	rO   r   rf   re   r   r~   r   r   r   r   r7   r6   r   logitsr   r   )r1   r5  r  rx   rK  r   r;   rJ  r   r   r   )r0   r}   rO   r   rM  rf   re   r   r~   rN  r   r   r   r   rD  rP  r   loss_fctr   r%   r%   r&   rE   W  sD   ,


z"BrosForTokenClassification.forwardNNNNNNNNNNNNr   r   r   "_keys_to_ignore_on_load_unexpectedr,   r   r   r!   rG   r   r   r$   r   rE   rH   r%   r%   r2   r&   rG  F  sV    	
rG  a  
    Bros Model with a token classification head on top (initial_token_layers and subsequent_token_layer on top of the
    hidden-states output) e.g. for Named-Entity-Recognition (NER) tasks. The initial_token_classifier is used to
    predict the first token of each entity, and the subsequent_token_classifier is used to predict the subsequent
    tokens within an entity. Compared to BrosForTokenClassification, this model is more robust to serialization errors
    since it predicts next token from one token.
    c                        s   e Zd ZdgZ fddZe													ddeej deej deej deej d	eej d
eej deej deej deej deej dee	 dee	 dee	 de
eej ef fddZ  ZS )!BrosSpadeEEForTokenClassificationr*  c              	      s   t  | || _|j| _|j| _|j| _t|| _t	|dr"|j
n|j}tt|t|j|jt|t|j|j| _t|| _|   d S rH  )r+   r,   r1   rJ  r  rm   r  r'  r  r   rI  rw   r   
Sequentialrv   rX   initial_token_classifierr  subsequent_token_classifierr+  rL  r2   r%   r&   r,     s    

z*BrosSpadeEEForTokenClassification.__init__Nr}   rO   r   rM  rf   re   r   r~   initial_token_labelssubsequent_token_labelsr   r   r   r5   c                 C   s  |dur|n| j j}| j||||||||||d
}|d }|dd }| |dd }| ||d}d| }|j\}}|j	}t
j|t
|dg|gdd }||dddddf t
|jj}t
||d j|t
jd}||dddddf t
|jj}|d }d}|	dur|
durt }|	d}	|dur|d}||d| j| |	| }n
||d| j|	}|
d}
||d|d | |
| }|| }|s||f|dd  }|dur|f| S |S t||||j|jd	S )
a>  
        bbox ('torch.FloatTensor' of shape '(batch_size, num_boxes, 4)'):
            Bounding box coordinates for each token in the input sequence. Each bounding box is a list of four values
            (x1, y1, x2, y2), where (x1, y1) is the top left corner, and (x2, y2) is the bottom right corner of the
            bounding box.
        bbox_first_token_mask (`torch.FloatTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Mask to indicate the first token of each bounding box. Mask values selected in `[0, 1]`:

            - 1 for tokens that are **not masked**,
            - 0 for tokens that are **masked**.
        initial_token_labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for the initial token classification.
        subsequent_token_labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for the subsequent token classification.

        Examples:

        ```python
        >>> import torch
        >>> from transformers import BrosProcessor, BrosSpadeEEForTokenClassification

        >>> processor = BrosProcessor.from_pretrained("jinho8345/bros-base-uncased")

        >>> model = BrosSpadeEEForTokenClassification.from_pretrained("jinho8345/bros-base-uncased")

        >>> encoding = processor("Hello, my dog is cute", add_special_tokens=False, return_tensors="pt")
        >>> bbox = torch.tensor([[[0, 0, 1, 1]]]).repeat(1, encoding["input_ids"].shape[-1], 1)
        >>> encoding["bbox"] = bbox

        >>> outputs = model(**encoding)
        ```N
r}   rO   r   rf   re   r   r~   r   r   r   r   r   r  ri   rh   r7   r6   )r   r   r   r   r   )r1   r5  r  r\   r   rW  rX  squeezer   ri   r!   r<   r{   r   r   masked_fillfinforh   mineyer;   r   rJ  r   r   r   )r0   r}   rO   r   rM  rf   re   r   r~   rY  rZ  r   r   r   r   last_hidden_statesr   r   inv_attention_maskr   max_seq_lengthri   invalid_token_maskself_token_masksubsequent_token_maskr   rQ  initial_token_losssubsequent_token_lossr   r%   r%   r&   rE     sp   1
&  


z)BrosSpadeEEForTokenClassification.forward)NNNNNNNNNNNNN)r   r   r   rT  r,   r   r   r!   rG   r   r   r$   r   rE   rH   r%   r%   r2   r&   rU    s\    
	
rU  z
    Bros Model with a token classification head on top (a entity_linker layer on top of the hidden-states output) e.g.
    for Entity-Linking. The entity_linker is used to predict intra-entity links (one entity to another entity).
    c                       rF  )!BrosSpadeELForTokenClassificationr*  c                    sx   t  | || _|j| _|j| _|j| _t|| _t	|dr"|j
n|j t|| _|   d S  t|| _|   d S rH  )r+   r,   r1   rJ  r  rm   r  r'  r  r   rI  rw   r  entity_linkerr+  rN   r2   r%   r&   r,   S  s   


z*BrosSpadeELForTokenClassification.__init__Nr}   rO   r   rM  rf   re   r   r~   rN  r   r   r   r5   c                 C   s~  |dur|n| j j}| j||||||||
||d
}|d }|dd }| ||d}d}|	durt }|j\}}|j	}t
||d j|t
jd}|d}t
j| t
j|dgt
j|dgdd}||dddddf t
|jj}||dddddf t
|jj}||d|d | |	d| }|s|f|d	d  }|dur|f| S |S t|||j|jd
S )a  
        bbox ('torch.FloatTensor' of shape '(batch_size, num_boxes, 4)'):
            Bounding box coordinates for each token in the input sequence. Each bounding box is a list of four values
            (x1, y1, x2, y2), where (x1, y1) is the top left corner, and (x2, y2) is the bottom right corner of the
            bounding box.
        bbox_first_token_mask (`torch.FloatTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Mask to indicate the first token of each bounding box. Mask values selected in `[0, 1]`:

            - 1 for tokens that are **not masked**,
            - 0 for tokens that are **masked**.

        Examples:

        ```python
        >>> import torch
        >>> from transformers import BrosProcessor, BrosSpadeELForTokenClassification

        >>> processor = BrosProcessor.from_pretrained("jinho8345/bros-base-uncased")

        >>> model = BrosSpadeELForTokenClassification.from_pretrained("jinho8345/bros-base-uncased")

        >>> encoding = processor("Hello, my dog is cute", add_special_tokens=False, return_tensors="pt")
        >>> bbox = torch.tensor([[[0, 0, 1, 1]]]).repeat(1, encoding["input_ids"].shape[-1], 1)
        >>> encoding["bbox"] = bbox

        >>> outputs = model(**encoding)
        ```Nr[  r   r   r\  r7   rg   r  r6   rO  )r1   r5  r  r\   r   rk  r]  r   r   ri   r!   ra  r   r   r;   r<   r{   r^  r_  rh   r`  r   r   r   )r0   r}   rO   r   rM  rf   re   r   r~   rN  r   r   r   r   rb  rP  r   rQ  r   rd  ri   rf  maskr   r%   r%   r&   rE   a  sR   +

(($z)BrosSpadeELForTokenClassification.forwardrR  rS  r%   r%   r2   r&   rj  J  sV    	
rj  )r  r'  rG  rU  rj  )8r    r   dataclassesr   typingr   r   r!   torch.utils.checkpointr   torch.nnr   activationsr   modeling_layersr	   modeling_outputsr
   r   r   modeling_utilsr   pytorch_utilsr   r   r   utilsr   r   r   configuration_brosr   
get_loggerr   loggerr   Moduler(   rI   rU   r_   r   r   r   r   r   r   r   r  r  r  r'  rG  rU  rj  __all__r%   r%   r%   r&   <module>   sh   
B 7ZL" 2g	 r