
    qi                        d Z ddlZddl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mZmZ ddlmZ ddlmZ ddlmZmZmZmZ ddlmZ  ej<                  e      Z e ed       G d de                    Z! G d dejD                        Z# G d dejD                        Z$ G d dejD                        Z% G d dejD                        Z& G d dejD                        Z' G d dejD                        Z( G d  d!ejD                        Z) G d" d#ejD                        Z* G d$ d%ejD                        Z+ G d& d'e      Z, G d( d)ejD                        Z- G d* d+ejD                        Z. G d, d-ejD                        Z/e G d. d/e             Z0e G d0 d1e0             Z1e G d2 d3e0             Z2 ed4       G d5 d6e0             Z3 ed7       G d8 d9e0             Z4g d:Z5y);zPyTorch Bros model.    N)	dataclass)nn)CrossEntropyLoss   )initialization)ACT2FN)GradientCheckpointingLayer)"BaseModelOutputWithCrossAttentions,BaseModelOutputWithPoolingAndCrossAttentionsTokenClassifierOutput)PreTrainedModel)apply_chunking_to_forward)ModelOutputauto_docstringcan_return_tuplelogging   )
BrosConfigz@
    Base class for outputs of token classification models.
    )custom_introc                       e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	ej                  dz  ed<   dZ
eej                     dz  ed<   dZeej                     dz  ed<   y)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   torchFloatTensor__annotations__r   r   r   tupler        X/opt/pipecat/venv/lib/python3.12/site-packages/transformers/models/bros/modeling_bros.pyr   r   (   s~     &*D%

d
")59%++d298<U..5<59M5**+d2926Je''(4/6r&   r   c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )BrosPositionalEmbedding1Dc                     t         |           |j                  | _        ddt        j                  d| j                  d      | j                  z  z  z  }| j                  d|       y )Nr   '                 @inv_freq)super__init__dim_bbox_sinusoid_emb_1dr!   arangeregister_buffer)selfconfigr.   	__class__s      r'   r0   z"BrosPositionalEmbedding1D.__init__B   s^    (.(G(G%ell3(E(EsKdNkNkkl
 	Z2r&   pos_seqreturnc                    |j                         }|\  }}}|j                  |||d      | j                  j                  ddd| j                  dz        z  }t	        j
                  |j                         |j                         gd      }|S )Nr      dim)sizeviewr.   r1   r!   catsincos)r4   r7   seq_sizeb1b2b3sinusoid_inppos_embs           r'   forwardz!BrosPositionalEmbedding1D.forwardL   s    <<>
B||BB2T]]5G5G1aQUQnQnrsQs5tt))\--/1A1A1CD"Mr&   r   r   r   r0   r!   TensorrI   __classcell__r6   s   @r'   r)   r)   ?   s#    3u||  r&   r)   c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )BrosPositionalEmbedding2Dc                     t         |           |j                  | _        t        |      | _        t        |      | _        y N)r/   r0   dim_bboxr)   	x_pos_emb	y_pos_embr4   r5   r6   s     r'   r0   z"BrosPositionalEmbedding2D.__init__U   s1    26:26:r&   bboxr8   c                    g }t        | j                        D ]U  }|dz  dk(  r&|j                  | j                  |d|f                1|j                  | j	                  |d|f                W t        j                  |d      }|S )Nr:   r   .r;   r<   )rangerR   appendrS   rT   r!   r@   )r4   rV   stackibbox_pos_embs        r'   rI   z!BrosPositionalEmbedding2D.forward\   s|    t}}% 	;A1uzT^^DaL9:T^^DaL9:		;
 yyB/r&   rJ   rM   s   @r'   rO   rO   T   s#    ;ELL U\\ r&   rO   c                   >     e Zd Z fdZdej
                  fdZ xZS )BrosBboxEmbeddingsc                     t         |           t        |      | _        t	        j
                  |j                  |j                  d      | _        y )NF)bias)	r/   r0   rO   bbox_sinusoid_embr   Lineardim_bbox_sinusoid_emb_2ddim_bbox_projectionbbox_projectionrU   s     r'   r0   zBrosBboxEmbeddings.__init__h   s=    !:6!B!yy)H)H&JdJdkpqr&   rV   c                     |j                  dd      }|d d d d d d d f   |d d d d d d d f   z
  }| j                  |      }| j                  |      }|S )Nr   r   )	transposera   re   )r4   rV   bbox_tbbox_posr\   s        r'   rI   zBrosBboxEmbeddings.forwardm   s\    1%$1a-(6!T1a-+@@--h7++L9r&   rJ   rM   s   @r'   r^   r^   g   s    r
ELL r&   r^   c                        e Zd ZdZ fdZ	 	 	 	 d
dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  f
d	Z xZS )BrosTextEmbeddingszGConstruct the embeddings from word, position and token_type embeddings.c                 @   t         |           t        j                  |j                  |j
                  |j                        | _        t        j                  |j                  |j
                        | _	        t        j                  |j                  |j
                        | _        t        j                  |j
                  |j                        | _        t        j                  |j                        | _        | j#                  dt%        j&                  |j                        j)                  d             | j#                  dt%        j*                  | j,                  j/                         t$        j0                  | j,                  j2                        d       y )	N)padding_idxepsposition_idsr   r;   token_type_idsdtypedeviceF)
persistent)r/   r0   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dropoutr3   r!   r2   expandzerosrp   r>   longru   rU   s     r'   r0   zBrosTextEmbeddings.__init__y   s#   !||F,=,=v?Q?Q_e_r_rs#%<<0N0NPVPbPb#c %'\\&2H2H&J\J\%]"f&8&8f>S>STzz&"<"<=^U\\&:X:X-Y-`-`ah-ijKK!!&&(jj((//
  	 	
r&   N	input_idsrr   rp   inputs_embedsr8   c                 6   ||j                         }n|j                         d d }|d   }|| j                  d d d |f   }|st        | d      r-| j                  d d d |f   }|j	                  |d   |      }|}n:t        j                  |t
        j                  | j                  j                        }|| j                  |      }| j                  |      }	||	z   }
| j                  |      }|
|z  }
| j                  |
      }
| j                  |
      }
|
S )Nr;   r   rr   r   rs   )r>   rp   hasattrrr   r   r!   r   r   ru   r{   r   r}   r   r   )r4   r   rr   rp   r   input_shape
seq_lengthbuffered_token_type_ids buffered_token_type_ids_expandedr   
embeddingsr}   s               r'   rI   zBrosTextEmbeddings.forward   s/     #..*K',,.s3K ^
,,Q^<L!t-.*.*=*=a*n*M'3J3Q3QR]^_R`bl3m0!A!&[

SWSdSdSkSk!l  00;M $ : :> J"%::
"66|D))
^^J/
\\*-
r&   )NNNN)	r   r   r   r    r0   r!   rK   rI   rL   rM   s   @r'   rk   rk   v   sv    Q
. *..2,0-1#<<$&# t+# llT)	#
 ||d*# 
#r&   rk   c                        e Zd Z fdZ	 	 	 	 ddej
                  dej
                  dej
                  dz  dej
                  dz  dej
                  dz  dej
                  dz  d	eej
                     fd
Z xZS )BrosSelfAttentionc                    t         |           |j                  |j                  z  dk7  r2t	        |d      s&t        d|j                   d|j                   d      |j                  | _        t        |j                  |j                  z        | _        | j                  | j                  z  | _        t        j                  |j                  | j                        | _        t        j                  |j                  | j                        | _        t        j                  |j                  | j                        | _        t        j                  |j                        | _        |j"                  | _        y )Nr   embedding_sizezThe hidden size (z6) is not a multiple of the number of attention heads ())r/   r0   ry   num_attention_headsr   
ValueErrorintattention_head_sizeall_head_sizer   rb   querykeyvaluer   attention_probs_dropout_probr   
is_decoderrU   s     r'   r0   zBrosSelfAttention.__init__   s)    : ::a?PVXhHi#F$6$6#7 8 445Q8 
 $*#=#= #&v'9'9F<V<V'V#W !558P8PPYYv1143E3EF
99V//1C1CDYYv1143E3EF
zz&"E"EF ++r&   Nr   r\   attention_maskencoder_hidden_statesencoder_attention_maskoutput_attentionsr8   c                    |j                   d   d| j                  | j                  f}| j                  |      j	                  |      j                  dd      }|d u}	|	rc| j                  |      j	                  |      j                  dd      }
| j                  |      j	                  |      j                  dd      }|}n`| j                  |      j	                  |      j                  dd      }
| j                  |      j	                  |      j                  dd      }t        j                  ||
j                  dd            }|j                   \  }}}}|j	                  ||||      }|j                  g d      }t        j                  d||f      }||z   }|t        j                  | j                        z  }|||z   } t        j                  d      |      }| j!                  |      }t        j                  ||      }|j                  dddd	      j#                         }|j%                         d d | j&                  fz   } |j                  | }|r||fn|f}| j(                  r|d
z   }|S )Nr   r;   r   r:   )r:   r   r   r   zbnid,bijd->bnijr<   r   rQ   )shaper   r   r   r?   rg   r   r   r!   matmulpermuteeinsummathsqrtr   Softmaxr   
contiguousr>   r   r   )r4   r   r\   r   r   r   r   hidden_shapequery_layeris_cross_attention	key_layervalue_layerattention_scores
batch_sizen_headr   d_headbbox_pos_scoresattention_probscontext_layernew_context_layer_shapeoutputss                         r'   rI   zBrosSelfAttention.forward   sc    &++A.D4L4LdNfNfgjj/44\BLLQPQR
 3$>!67<<\JTTUVXYZI**%:;@@NXXYZ\]^K3N/44\BLLQPQRI**]388FPPQRTUVK !<<Y5H5HR5PQ 2=1B1B.
FJ#((ZVT#++L9,,'8;:UV+o=+dii8P8P.QQ%/.@ -"**,-=> ,,7_kB%--aAq9DDF"/"4"4"6s";t?Q?Q>S"S***,CD6G=/2mM]??'Gr&   NNNF)	r   r   r   r0   r!   rK   r$   rI   rL   rM   s   @r'   r   r      s    ,0 /3596:16:||: ll: t+	:
  %||d2: !&t 3: !<<$.: 
u||	:r&   r   c                   n     e Zd Z fdZdej
                  dej
                  dej
                  fdZ xZS )BrosSelfOutputc                 (   t         |           t        j                  |j                  |j                        | _        t        j                  |j                  |j                        | _        t        j                  |j                        | _
        y Nrn   )r/   r0   r   rb   ry   denser   r   r   r   r   rU   s     r'   r0   zBrosSelfOutput.__init__  s`    YYv1163E3EF
f&8&8f>S>STzz&"<"<=r&   r   input_tensorr8   c                 r    | j                  |      }| j                  |      }| j                  ||z         }|S rQ   r   r   r   r4   r   r   s      r'   rI   zBrosSelfOutput.forward  7    

=1]3}|'CDr&   rJ   rM   s   @r'   r   r     1    >U\\  RWR^R^ r&   r   c                        e Zd Z fdZ	 	 	 	 ddej
                  dej
                  dej
                  dz  dej
                  dz  dej
                  dz  dedz  d	eej
                     fd
Z xZ	S )BrosAttentionc                 b    t         |           t        |      | _        t	        |      | _        y rQ   )r/   r0   r   r4   r   outputrU   s     r'   r0   zBrosAttention.__init__  s&    %f-	$V,r&   Nr   r\   r   r   r   r   r8   c                 p    | j                  ||||||      }| j                  |d   |      }|f|dd  z   }	|	S )Nr   r\   r   r   r   r   r   r   )r4   r   )
r4   r   r\   r   r   r   r   self_outputsattention_outputr   s
             r'   rI   zBrosAttention.forward  sY     yy'%)"7#9/ ! 
  ;;|AF#%QR(88r&   r   )
r   r   r   r0   r!   rK   boolr$   rI   rL   rM   s   @r'   r   r     s    - /3596:).|| ll t+	
  %||d2 !&t 3  $; 
u||	r&   r   c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )BrosIntermediatec                    t         |           t        j                  |j                  |j
                        | _        t        |j                  t              rt        |j                     | _        y |j                  | _        y rQ   )r/   r0   r   rb   ry   intermediate_sizer   
isinstance
hidden_actstrr   intermediate_act_fnrU   s     r'   r0   zBrosIntermediate.__init__3  s]    YYv1163K3KL
f''-'-f.?.?'@D$'-'8'8D$r&   r   r8   c                 J    | j                  |      }| j                  |      }|S rQ   )r   r   )r4   r   s     r'   rI   zBrosIntermediate.forward;  s&    

=100?r&   rJ   rM   s   @r'   r   r   2  s#    9U\\ ell r&   r   c                   n     e Zd Z fdZdej
                  dej
                  dej
                  fdZ xZS )
BrosOutputc                 (   t         |           t        j                  |j                  |j
                        | _        t        j                  |j
                  |j                        | _        t        j                  |j                        | _        y r   )r/   r0   r   rb   r   ry   r   r   r   r   r   r   rU   s     r'   r0   zBrosOutput.__init__B  s`    YYv779K9KL
f&8&8f>S>STzz&"<"<=r&   r   r   r8   c                 r    | j                  |      }| j                  |      }| j                  ||z         }|S rQ   r   r   s      r'   rI   zBrosOutput.forwardH  r   r&   rJ   rM   s   @r'   r   r   A  r   r&   r   c                        e Zd Z fdZ	 	 	 	 ddej
                  dej
                  dej                  dz  dej                  dz  dej                  dz  dedz  d	eej
                     fd
Z	d Z
 xZS )	BrosLayerc                 b   t         |           |j                  | _        d| _        t	        |      | _        |j                  | _        |j                  | _        | j                  r*| j                  st        |  d      t	        |      | _	        t        |      | _        t        |      | _        y )Nr   z> should be used as a decoder model if cross attention is added)r/   r0   chunk_size_feed_forwardseq_len_dimr   	attentionr   add_cross_attention	Exceptioncrossattentionr   intermediater   r   rU   s     r'   r0   zBrosLayer.__init__P  s    '-'E'E$&v. ++#)#=#= ##??4&(f ghh"/"7D,V4 (r&   Nr   r\   r   r   r   r   r8   c                    | j                  ||||      }|d   }| j                  r|dd }	n|dd  }	| j                  r@|>t        | d      rt        d|  d      | j	                  |||||      }
|
d   }|	|
dd z   }	t        | j                  | j                  | j                  |      }|f|	z   }	| j                  r|	d	z   }	|	S )
N)r\   r   r   r   r   r;   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   rQ   )	r   r   r   r   r   r   feed_forward_chunkr   r   )r4   r   r\   r   r   r   r   self_attention_outputsr   r   cross_attention_outputslayer_outputs               r'   rI   zBrosLayer.forward^  s    "&%)/	 "0 "
 2!4 ??,Qr2G,QR0G??4@t-.=dV  Dd  e  '+&9&9 -&;'="3 ': '#  7q9 7" ==G0##((	
  /G+ ??'Gr&   c                 L    | j                  |      }| j                  ||      }|S rQ   )r   r   )r4   r   intermediate_outputr   s       r'   r   zBrosLayer.feed_forward_chunk  s,    "//0@A{{#68HIr&   r   )r   r   r   r0   r!   rK   r"   r   r$   rI   r   rL   rM   s   @r'   r   r   O  s    )$ 48:>;?).3||3 ll3 ))D0	3
  %00473 !& 1 1D 83  $;3 
u||	3jr&   r   c                   
    e Zd Z fdZe	 	 	 	 	 	 ddej                  dej                  dej                  dz  dej                  dz  dej                  dz  dedz  d	edz  d
edz  de	ej                     e
z  fd       Z xZS )BrosEncoderc                     t         |           || _        t        j                  t        |j                        D cg c]  }t        |       c}      | _        y c c}w rQ   )	r/   r0   r5   r   
ModuleListrX   num_hidden_layersr   layer)r4   r5   _r6   s      r'   r0   zBrosEncoder.__init__  sC    ]]uVE]E]?^#_!If$5#_`
#_s   ANr   r\   r   r   r   r   output_hidden_statesreturn_dictr8   c	           	      H   |rdnd }	|rdnd }
|r| j                   j                  rdnd }t        | j                        D ]L  \  }}|r|	|fz   }	 |||||||      }|d   }|s$|
|d   fz   }
| j                   j                  sD||d   fz   }N |r|	|fz   }	t	        ||	|
|      S )Nr%   r   r   r   r:   )last_hidden_stater   r   cross_attentions)r5   r   	enumerater   r
   )r4   r   r\   r   r   r   r   r   r   all_hidden_statesall_self_attentionsall_cross_attentionsr[   layer_modulelayer_outputss                  r'   rI   zBrosEncoder.forward  s     #7BD$5b4%64;;;Z;Zr`d(4 	VOA|#$58H$H!(+)-&;'="3M *!,M &9]1=M<O&O#;;22+?=QRCSBU+U(#	V&   1]4D D1++*1	
 	
r&   )NNNFFT)r   r   r   r0   r   r!   rK   r"   r   r$   r
   rI   rL   rM   s   @r'   r   r     s    a
 
 48:>;?).,1#'*
||*
 ll*
 ))D0	*

  %0047*
 !& 1 1D 8*
  $;*
 #Tk*
 D[*
 
u||	A	A*
 *
r&   r   c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )
BrosPoolerc                     t         |           t        j                  |j                  |j                        | _        t        j                         | _        y rQ   )r/   r0   r   rb   ry   r   Tanh
activationrU   s     r'   r0   zBrosPooler.__init__  s9    YYv1163E3EF
'')r&   r   r8   c                 \    |d d df   }| j                  |      }| j                  |      }|S )Nr   )r   r  )r4   r   first_token_tensorpooled_outputs       r'   rI   zBrosPooler.forward  s6     +1a40

#566r&   rJ   rM   s   @r'   r  r    s#    $
U\\ ell r&   r  c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )BrosRelationExtractorc                 R   t         |           |j                  | _        |j                  | _        |j                  | _        |j                  | _        t        j                  | j                        | _	        t        j                  | j                  | j                  | j
                  z        | _        t        j                  | j                  | j                  | j
                  z        | _        t        j                  t        j                  d| j                              | _        y )Nr   )r/   r0   n_relationsry   backbone_hidden_sizehead_hidden_sizeclassifier_dropout_probr   r   droprb   r   r   	Parameterr!   r   
dummy_noderU   s     r'   r0   zBrosRelationExtractor.__init__  s    !--$*$6$6! & 2 2'-'E'E$JJt;;<	YYt88$:J:JTMbMb:bc
99T668H8H4K`K`8`a,,u{{1d6O6O'PQr&   r   r   c           	         | j                  | j                  |            }| j                  j                  d      j	                  d|j                  d      d      }t        j                  ||gd      }| j                  | j                  |            }|j                  |j                  d      |j                  d      | j                  | j                        }|j                  |j                  d      |j                  d      | j                  | j                        }t        j                  |j                  dddd      |j                  dddd            }|S )Nr   r   axisr:   r   )r   r  r  	unsqueezerepeatr>   r!   r@   r   r?   r  r  r   r   )r4   r   r   	dummy_vecrelation_scores        r'   rI   zBrosRelationExtractor.forward  s   jj;!78OO--a0779>>!;LaP	IIy)41=	HHTYYy12	!&&Q!1!1!!4d6F6FH]H]
 NN9>>!#4innQ6GIYIY[_[p[pq	1a+Y->->q!Q-J
 r&   rJ   rM   s   @r'   r
  r
    s$    R5<< ELL r&   r
  c                   p     e Zd ZU eed<   dZ ej                         dej                  f fd       Z
 xZS )BrosPreTrainedModelr5   brosmodulec                    t         |   |       | j                  j                  }t	        |t
              r"t        j                  |j                  |       yt	        |t              ryt        j                  |j                  t        j                  |j                  j                  d         j                  d             t        j                   |j"                         yt	        |t$              rUddt        j                  d|j&                  d      |j&                  z  z  z  }t        j                  |j(                  |       yy)	zInitialize the weights)stdr;   rq   r   r+   r,   r-   N)r/   _init_weightsr5   initializer_ranger   r
  initnormal_r  rk   copy_rp   r!   r2   r   r   zeros_rr   r)   r1   r.   )r4   r  r  r.   r6   s       r'   r   z!BrosPreTrainedModel._init_weights  s     	f%kk++f34LL**4 23JJv**ELL9L9L9R9RSU9V,W,^,^_f,ghKK--. 9:%,,sF,K,KSQTZTsTsstH JJv1	 ;r&   )r   r   r   r   r#   base_model_prefixr!   no_gradr   Moduler   rL   rM   s   @r'   r  r    s4    U]]_2BII 2 2r&   r  c                       e Zd Zd fd	Zd Zd Zee	 	 	 	 	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  d	ej                  dz  d
ej                  dz  dej                  dz  dej                  dz  de
dz  de
dz  de
dz  deej                     ez  fd              Z xZS )	BrosModelc                     t         |   |       || _        t        |      | _        t        |      | _        t        |      | _        |rt        |      nd| _
        | j                          y)zv
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        N)r/   r0   r5   rk   r   r^   bbox_embeddingsr   encoderr  pooler	post_init)r4   r5   add_pooling_layerr6   s      r'   r0   zBrosModel.__init__  sX    
 	 ,V41&9"6*,=j(4r&   c                 .    | j                   j                  S rQ   r   r{   )r4   s    r'   get_input_embeddingszBrosModel.get_input_embeddings'  s    ...r&   c                 &    || j                   _        y rQ   r2  )r4   r   s     r'   set_input_embeddingszBrosModel.set_input_embeddings*  s    */'r&   Nr   rV   r   rr   rp   r   r   r   r   r   r   r8   c           
         |	|	n| j                   j                  }	|
|
n| j                   j                  }
||n| j                   j                  }||t	        d      ||j                         }n!||j                         dd }nt	        d      |t	        d      |\  }}||j                  n|j                  }|t        j                  ||      }|pt        | j                  d      r4| j                  j                  ddd|f   }|j                  ||      }|}n&t        j                  |t        j                  |      }| j                  ||      }| j                   j                   rE|C|j                         \  }}}||f}|t        j                  ||      }| j#                  |      }nd}| j                  ||||	      }|j$                  d   d
k(  r|ddddg df   }|| j                   j&                  z  }| j)                  |      }| j+                  ||||||	|
d      }|d   }| j,                  | j-                  |      nd}t/        |||j0                  |j2                  |j4                        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
        ```NzDYou cannot specify both input_ids and inputs_embeds at the same timer;   z5You have to specify either input_ids or inputs_embedszYou have to specify bbox)ru   rr   rs   )r   rp   rr   r      )r   r   r:   r   r:   r   r   r   T)r\   r   r   r   r   r   r   r   )r   pooler_outputr   r   r   )r5   r   r   use_return_dictr   r>   ru   r!   onesr   r   rr   r   r   r   get_extended_attention_maskr   invert_attention_maskr   
bbox_scaler,  r-  r.  r   r   r   r   )r4   r   rV   r   rr   rp   r   r   r   r   r   r   kwargsr   r   r   ru   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  s                                  r'   rI   zBrosModel.forward-  s   P 2C1N-TXT_T_TqTq$8$D $++JjJj 	 &1%<k$++B]B] ]%>cdd"#..*K&',,.s3KTUU<788!,
J%.%:!!@T@T!"ZZFCN!t(89*.//*H*HKZK*X'3J3Q3QR\^h3i0!A!&[

SY!Z 150P0PQ_al0m ;;!!&;&G=R=W=W=Y: 7$68O#P %-).4HQW)X&.2.H.HI_.`+.2+??%)'	 + 
 ::b>Q1667DT[[333#'#7#7#D ,,12"7#B/!5 ' 	
 *!,8<8OO4UY;-')77&11,==
 	
r&   )TNNNNNNNNNNN)r   r   r   r0   r3  r5  r   r   r!   rK   r   r$   r   rI   rL   rM   s   @r'   r*  r*    s8    /0  *.$(.2.2,0-1596:)-,0#'u
<<$&u
 llT!u
 t+	u

 t+u
 llT)u
 ||d*u
  %||d2u
 !&t 3u
  $;u
 #Tku
 D[u
 
u||	K	Ku
  u
r&   r*  c                       e Zd ZdgZ fdZee	 	 	 	 	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	ej                  dz  d
ej                  dz  dej                  dz  de	dz  de	dz  de	dz  de
ej                     ez  fd              Z xZS )BrosForTokenClassificationr.  c                 `   t         |   |       |j                  | _        t        |      | _        t        |d      r|j                  n|j                  }t        j                  |      | _
        t        j                  |j                  |j                        | _        | j                          y Nclassifier_dropout)r/   r0   
num_labelsr*  r  r   rN  r   r   r   r   rb   ry   
classifierr/  r4   r5   rN  r6   s      r'   r0   z#BrosForTokenClassification.__init__  s      ++f%	)09M)NF%%TZTnTn 	 zz"45))F$6$68I8IJr&   Nr   rV   r   bbox_first_token_maskrr   rp   r   labelsr   r   r   r8   c                    ||n| j                   j                  }| j                  |||||||	|
d	      }|d   }| j                  |      }| j	                  |      }d}|t               }|J|j                  d      } ||j                  d| j                        |   |j                  d      |         }n2 ||j                  d| j                        |j                  d            }t        |||j                  |j                        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)
        ```NT)rV   r   rr   rp   r   r   r   r   r   r;   r   logitsr   r   )r5   r9  r  r   rP  r   r?   rO  r   r   r   )r4   r   rV   r   rR  rr   rp   r   rS  r   r   r   r>  r   rH  rV  r   loss_fcts                     r'   rI   z"BrosForTokenClassification.forward  s   Z &1%<k$++B]B]))))%'/!5  

 "!*,,71')H$0(=(B(B2(F%KKDOO45JKV[[Y[_]rMs  B @&++b/R$!//))	
 	
r&   rI  r   r   r   "_keys_to_ignore_on_load_unexpectedr0   r   r   r!   rK   r   r$   r   rI   rL   rM   s   @r'   rK  rK    s6   *3&  *.$(.259.2,0-1&*)-,0#'N
<<$&N
 llT!N
 t+	N

  %||d2N
 t+N
 llT)N
 ||d*N
 t#N
  $;N
 #TkN
 D[N
 
u||	4	4N
  N
r&   rK  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                       e Zd ZdgZ fdZee	 	 	 	 	 	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	ej                  dz  d
ej                  dz  dej                  dz  dej                  dz  de	dz  de	dz  de	dz  de
ej                     ez  fd              Z xZS )!BrosSpadeEEForTokenClassificationr.  c           	      f   t         |   |       || _        |j                  | _        |j                  | _        |j
                  | _        t        |      | _        t        |d      r|j                  n|j                  }t        j                  t        j                  |      t        j                  |j
                  |j
                        t        j                  |      t        j                  |j
                  |j                              | _        t#        |      | _        | j'                          y rM  )r/   r0   r5   rO  r  ry   r  r*  r  r   rN  r   r   
Sequentialr   rb   initial_token_classifierr
  subsequent_token_classifierr/  rQ  s      r'   r0   z*BrosSpadeEEForTokenClassification.__init__  s      ++!--$*$6$6!f%	)09M)NF%%TZTnTn 	
 )+JJ)*IIf((&*<*<=JJ)*IIf((&*;*;<	)
% ,A+H(r&   Nr   rV   r   rR  rr   rp   r   initial_token_labelssubsequent_token_labelsr   r   r   r8   c                    ||n| j                   j                  }| j                  |||||||
|d	      }|d   }|j                  dd      j	                         }| j                  |      j                  dd      j	                         }| j                  ||      j                  d      }d|z
  }|j                  \  }}|j                  }t        j                  |t        j                  |dg      j                  |      gd      j                         }|j                  |dddddf   t        j                   |j"                        j$                        }t        j&                  ||dz         j                  |t        j                        }|j                  |dddddf   t        j                   |j"                        j$                        }|j)                  d      j                         }d}||	t+               }|j)                  d      }|;|j)                  d      } ||j)                  d| j,                        |   ||         }n# ||j)                  d| j,                        |      }|	j)                  d      }	 ||j)                  d|dz         |   |	|         }||z   }t/        ||||j0                  |j2                  	      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)
        ```NT	r   rV   r   rr   rp   r   r   r   r   r   r   r  ru   rt   r;   )r   r   r   r   r   )r5   r9  r  rg   r   r^  r_  squeezer   ru   r!   r@   r   tor   masked_fillfinfort   mineyer?   r   rO  r   r   r   )r4   r   rV   r   rR  rr   rp   r   r`  ra  r   r   r   r>  r   last_hidden_statesr   r   inv_attention_maskr   max_seq_lengthru   invalid_token_maskself_token_masksubsequent_token_maskr   rW  initial_token_losssubsequent_token_losss                                r'   rI   z)BrosSpadeEEForTokenClassification.forward0  s   d &1%<k$++B]B]))))%'/!5  

 %QZ/99!Q?JJL#<<=OPZZ[\^_`kkm"&"B"BCUWi"j"r"rst"u /%7%=%="
N#**"YY(:EKKUV<X<[<[\b<c'dklmrrt"9"E"Eq$z*EKK8O8U8U,V,Z,Z#
  ))NNQ4FGJJRX`e`j`jJk"9"E"ED!QJ'5L5R5R)S)W)W#
 !/ 3 3B 7 < < >+0G0S')H $8#<#<R#@ $0(=(B(B2(F%%-(--b$//BCXY()>?&"
 &..B.G.GDOO.\^r%s"&=&B&B2&F#$,',,R!1CDEZ['(=>%!
 &(==D!5$;!//))
 	
r&   )NNNNNNNNNNNN)r   r   r   rY  r0   r   r   r!   rK   r   r$   r   rI   rL   rM   s   @r'   r[  r[    sN    +4&2  *.$(.259.2,0-1487;)-,0#'n
<<$&n
 llT!n
 t+	n

  %||d2n
 t+n
 llT)n
 ||d*n
 $llT1n
 "'!4n
  $;n
 #Tkn
 D[n
 
u||		.n
  n
r&   r[  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                       e Zd ZdgZ fdZee	 	 	 	 	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	ej                  dz  d
ej                  dz  dej                  dz  de	dz  de	dz  de	dz  de
ej                     ez  fd              Z xZS )!BrosSpadeELForTokenClassificationr.  c                 @   t         |   |       || _        |j                  | _        |j                  | _        |j
                  | _        t        |      | _        t        |d      r|j                  n|j                   t        |      | _        | j                          y rM  )r/   r0   r5   rO  r  ry   r  r*  r  r   rN  r   r
  entity_linkerr/  rU   s     r'   r0   z*BrosSpadeELForTokenClassification.__init__  s      ++!--$*$6$6!f%	&-f6J&K	"	"QWQkQk26:r&   Nr   rV   r   rR  rr   rp   r   rS  r   r   r   r8   c                    ||n| j                   j                  }| j                  |||||||	|
d	      }|d   }|j                  dd      j	                         }| j                  ||      j                  d      }d}|et               }|j                  \  }}|j                  }t        j                  ||dz         j                  |t        j                        }|j                  d      }t        j                  | t        j                   |dgt        j                  |      gd	      }|j#                  |dddddf   t        j$                  |j&                        j(                        }|j#                  |dddddf   t        j$                  |j&                        j(                        } ||j                  d|dz         |   |j                  d      |         }t+        |||j,                  |j.                  
      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)
        ```NTrc  r   r   rd  r;   rs   r  rU  )r5   r9  r  rg   r   rv  re  r   r   ru   r!   rj  rf  r   r?   r@   r   rg  rh  rt   ri  r   r   r   )r4   r   rV   r   rR  rr   rp   r   rS  r   r   r   r>  r   rk  rV  r   rW  r   rm  ru   ro  masks                          r'   rI   z)BrosSpadeELForTokenClassification.forward  s   X &1%<k$++B]B]))))%'/!5  

 %QZ/99!Q?JJL##$68JKSSTUV')H)7)=)=&J#**F#ii8JKNNV\didndnNoO(--b1D$)II**KKQuzz&Q %! ''(=aqj(I5;;W]WcWcKdKhKhiF''a
(CU[[QWQ]Q]E^EbEbcFFKKNQ,>?Ev{{SUW[G\]D$!//))	
 	
r&   rI  rX  rM   s   @r'   rt  rt    s8    +4&  *.$(.259.2,0-1&*)-,0#'X
<<$&X
 llT!X
 t+	X

  %||d2X
 t+X
 llT)X
 ||d*X
 t#X
  $;X
 #TkX
 D[X
 
u||	4	4X
  X
r&   rt  )r  r*  rK  r[  rt  )6r    r   dataclassesr   r!   r   torch.nnr    r   r"  activationsr   modeling_layersr	   modeling_outputsr
   r   r   modeling_utilsr   pytorch_utilsr   utilsr   r   r   r   configuration_brosr   
get_loggerr   loggerr   r(  r)   rO   r^   rk   r   r   r   r   r   r   r   r  r
  r  r*  rK  r[  rt  __all__r%   r&   r'   <module>r     s
     !   % & ! 9 
 . 6 K K * 
		H	% 
7k 7 7"		 *		 & ; ;|O		 OfRYY BII :ryy  G* GT1
")) 1
j BII D 2/ 2 2* N
# N
 N
b `
!4 `
 `
F L
(; L
L
^ k
(; k
k
\r&   