
    ^j(                     &   d dl mZ d dlZd dlmc 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dlmZ dd	lmZ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mZ ddl m!Z!  ejD                  e#      Z$ddgZ%e G d de             Z& G d dejN                        Z( G d dejN                        Z) G d de      Z* G d de      Z+ G d de      Z, G d de      Z- G d  d!e      Z.e G d" de             Z/ G d# d$e/      Z0e G d% de/             Z1y)&    )	dataclassN)nn   )initialization)BaseModelOutputModelOutput)PreTrainedModel)Unpack)TransformersKwargsauto_docstringcan_return_tuplelogging)merge_with_config_defaults)capture_outputs   )Dinov2AttentionDinov2LayerDinov2LayerScale	Dinov2MLPDinov2SelfAttention   )RadioConfig
RadioModelRadioPreTrainedModelc                       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)RadioModelOutputa  Output of [`RadioModel`].

    Args:
        summary (`torch.FloatTensor` of shape `(batch_size, num_summary_idxs * hidden_size)`):
            Flattened summary embedding, gathered from the cls tokens selected by `config.summary_idxs`.
        features (`torch.FloatTensor` of shape `(batch_size, num_patches, hidden_size)`):
            Dense spatial patch features.
        last_hidden_state (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`):
            Full token sequence (prefix tokens + patches) from the final encoder layer.
        hidden_states (`tuple[torch.FloatTensor]`, *optional*, returned when `output_hidden_states=True`):
            Tuple of `(batch_size, sequence_length, hidden_size)` tensors, one for the embedding output plus one for
            each encoder layer.
        attentions (`tuple[torch.FloatTensor]`, *optional*, returned when `output_attentions=True`):
            Tuple of `(batch_size, num_heads, sequence_length, sequence_length)` attention weights, one per layer.
    Nsummaryfeatureslast_hidden_statehidden_states
attentions)__name__
__module____qualname____doc__r   torchFloatTensor__annotations__r   r   r    tupler!        r/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/radio/modular_radio.pyr   r   +   s}      )-GU%,)-He$&-26u((4/659M5**+d2926Je''(4/6r+   r   c                   `     e Zd ZdZdef fdZdej                  dej                  fdZ xZ	S )RadioInputConditionerzFNormalizes pixel values; arithmetic is done in float32 then cast back.configc                 *   t         |           | j                  dt        j                  |j
                        j                  ddd      d       | j                  dt        j                  |j                        j                  ddd      d       y )N	norm_meanr   T
persistentnorm_std)super__init__register_bufferr&   tensorr1   viewr5   selfr/   	__class__s     r,   r7   zRadioInputConditioner.__init__G   sx    [%,,v7G7G*H*M*MbRSUV*WdhiZfoo)F)K)KBPQST)Ubfgr+   pixel_valuesreturnc                     |j                         | j                  j                         z
  | j                  j                         z  }|j                  |j                        S N)floatr1   r5   todtype)r<   r>   
normalizeds      r,   forwardzRadioInputConditioner.forwardL   sI    "((*T^^-A-A-CCt}}GZGZG\\
}}\//00r+   )
r"   r#   r$   r%   r   r7   r&   TensorrF   __classcell__r=   s   @r,   r.   r.   D   s/    Ph{ h
1ELL 1U\\ 1r+   r.   c                        e Zd ZdZdef fdZdej                  dej                  fdZde	e
e
f   dej                  dej                  fd	Zdej                  dej                  fd
Z xZS )RadioPatchEmbeddingszCropped Position Embedding (CPE) patch generator.

    Splits the image into patches, projects them, adds a resolution-interpolated
    absolute position embedding, and prepends learned cls + register tokens.
    r/   c                    t         |           |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  |j                  z  | _        |j                  |j                  z  | _	        | j                  | j                  z  }t        j                  |j                  |j                  dz  z  |j                  d      | _        t        j                  t        j                   d||j                              | _        t        j                  t        j                   |j
                  |j                  z   |j                              | _        y )Nr   F)biasr   )r6   r7   
patch_sizehidden_size	embed_dimnum_cls_tokensnum_registersmax_img_sizemax_rowsmax_colsr   Linearnum_channelspatch_projection	Parameterr&   zerosposition_embeddingcls_register_token)r<   r/   num_positionsr=   s      r,   r7   zRadioPatchEmbeddings.__init__X   s    ++++$33#11++v/@/@@++v/@/@@5 "		&*=*=@Q@QST@T*TV\VhVhot u"$,,u{{1mVM_M_/`"a"$,,KK--0D0DDfFXFXY#
r+   r>   r?   c                     | j                   }|j                  \  }}}}||z  ||z  }}|j                  ||||||      }	|	j                  dddddd      j                  |||z  ||z  |z        }	|	S )Nr   r      r   r      )rN   shapereshapepermute)
r<   r>   psbatchchannelsheightwidthrowscolspatchess
             r,   _image_to_patchesz&RadioPatchEmbeddings._image_to_patchesi   s    __)5););&xr\5B;d&&uhb$K//!Q1a3;;E4$;PX[]P]`bPbcr+   
input_dimsrD   c                    | j                   j                  d| j                  | j                  d      j	                  dddd      }t        |      }t        j                  |j                         ||fdd      j                  |      }|d   |j                  d	   k  r|d
d |d   d d f   }|d   |j                  d   k  r|d
d d d |d   f   }|j                  d	d  t        |      k7  r?t        j                  |j                         t        |      dd      j                  |      }|j                  d      j	                  ddd      S )Nr   r2   r   r   r   bilinearF)sizemodealign_corners.)r[   rb   rT   rU   rc   maxFinterpolaterB   rC   ra   r)   flatten)r<   rm   rD   posmax_dims        r,   _interpolate_position_embeddingz4RadioPatchEmbeddings._interpolate_position_embeddingq   s*   %%--arRZZ[\^_abdefj/mmCIIKw.@zafgjjkpqa=399R=(c?Z]?A-.Ca=399R=(c1o
1o-.C99RS>U:..--		%
2C*dijmmnstC{{1~%%aA..r+   c                    | j                  | j                  |            }|j                  d   | j                  z  |j                  d   | j                  z  f}|| j	                  ||j
                        z   }| j                  j                  d      j                  |j                  d   dd      }t        j                  ||gd      S )Nrs   r2   r   r   )dim)rX   rl   ra   rN   rz   rD   r\   	unsqueezeexpandr&   cat)r<   r>   rk   rm   prefixs        r,   rF   zRadioPatchEmbeddings.forward}   s    ''(>(>|(LM"((,?ASASTVAW[_[j[jAjk
D@@W]][[((2215<<W]]1=MrSUVyy&'*22r+   )r"   r#   r$   r%   r   r7   r&   rG   rl   r)   intrD   rz   rF   rH   rI   s   @r,   rK   rK   Q   sz    
{ 
"ell u|| 
/%S/ 
/RWR]R] 
/bgbnbn 
/3ELL 3U\\ 3r+   rK   c                       e Zd Zy)RadioMLPNr"   r#   r$   r*   r+   r,   r   r          r+   r   c                       e Zd Zy)RadioLayerScaleNr   r*   r+   r,   r   r      r   r+   r   c                       e Zd Zy)RadioSelfAttentionNr   r*   r+   r,   r   r      r   r+   r   c                       e Zd Zy)RadioAttentionNr   r*   r+   r,   r   r      r   r+   r   c                       e Zd Zy)
RadioLayerNr   r*   r+   r,   r   r      r   r+   r   c                   h    e Zd ZeZdZdZdZdgZdgZ	dZ
dZeedZ ej                          d        Zy)	r   modelr>   Tr   zlayer_scale\d+\.lambda1)r    r!   c                 :   | j                   j                  }t        |t        j                        rOt        j                  |j                  d|       |j                   t        j                  |j                         y y t        |t        j                        r?t        j                  |j                         t        j                  |j                         y t        |t              rEt        j                  |j                  d|       t        j                  |j                  d|       y t        |t              r5t        j                   |j"                  | j                   j$                         y t        |t&              rt        j(                  |j*                  t-        j.                  | j                   j*                        j1                  ddd             t        j(                  |j2                  t-        j.                  | j                   j2                        j1                  ddd             y t        |t4              rXt        j(                  |j6                  t-        j.                  | j                   j6                  t,        j8                               y y )Ng        )meanstdr2   r   rD   )r/   initializer_range
isinstancer   rV   inittrunc_normal_weightrM   zeros_	LayerNormones_rK   r[   r\   r   	constant_lambda1layerscale_valuer.   copy_r1   r&   r9   r:   r5   r   summary_idxslong)r<   moduler   s      r,   _init_weightsz"RadioPreTrainedModel._init_weights   s    kk++fbii(v}}3C@{{&FKK( '-KK$JJv}}% 45v88sLv88sL0NN6>>4;;+G+GH 56JJv''dkk6K6K)L)Q)QRTVWYZ)[\JJvT[[5I5I(J(O(OPRTUWX(YZ
+JJv**ELL9Q9QY^YcYc,de ,r+   N)r"   r#   r$   r   config_classbase_model_prefixmain_input_namesupports_gradient_checkpointing_no_split_modules_keys_to_ignore_on_load_missing_supports_sdpa_supports_flash_attnr   r   _can_record_outputsr&   no_gradr   r*   r+   r,   r   r      s`    L$O&*#%'A&B#N#(
 U]]_f fr+   c                   t     e Zd Zdef fdZe ed      dej                  de	e
   defd              Z xZS )	RadioEncoderr/   c                     t         |   |       t        j                  t	        |j
                        D cg c]  }t        |       c}      | _        | j                          y c c}w rA   )	r6   r7   r   
ModuleListrangenum_hidden_layersr   layer	post_init)r<   r/   _r=   s      r,   r7   zRadioEncoder.__init__   sK     ]]fF^F^@_#`1Jv$6#`a
 $as   A&F)tie_last_hidden_statesr    kwargsr?   c                 L    | j                   D ]
  } ||      } t        |      S )N)r   )r   r   )r<   r    r   r   s       r,   rF   zRadioEncoder.forward   s,     ZZ 	1E!-0M	1??r+   )r"   r#   r$   r   r7   r   r   r&   rG   r
   r   r   rF   rH   rI   s   @r,   r   r      sU    { 
  E2@U\\ @VDV=W @\k @ 3  @r+   r   c                        e Zd Zdef fdZedefd       Zd Ze	e
dej                  dee   defd              Z xZS )	r   r/   c                 4   t         |   |       || _        t        |      | _        t        |      | _        t        |      | _        | j                  dt        j                  |j                  t        j                        d       | j                          y )Nr   r   Tr3   )r6   r7   r/   r.   input_conditionerrK   
embeddingsr   encoderr8   r&   r9   r   r   r   r;   s     r,   r7   zRadioModel.__init__   st     !6v!>.v6#F+^U\\&:M:MUZU_U_-`mqrr+   r?   c                 .    | j                   j                  S rA   )r/   rN   )r<   s    r,   rN   zRadioModel.patch_size   s    {{%%%r+   c                 P    | j                   }t        j                         | _         |S )zCDetach the input conditioner (caller applies normalization itself).)r   r   Identity)r<   conditioners     r,   make_preprocessor_externalz%RadioModel.make_preprocessor_external   s!    ,,!#r+   r>   r   c                    | j                  |      }| j                  |      } | j                  |fi |}|j                  }| j                  j
                  }|d d d | j                  j                  f   }|d d | j                  f   j                  d      }|d d |d f   }	t        ||	||j                  |j                        S )Nr   )r   r   r   r    r!   )r   r   r   r   r/   num_summary_tokensrQ   r   rw   r   r    r!   )
r<   r>   r   r    encoder_outputsr   num_skipall_summaryr   r   s
             r,   rF   zRadioModel.forward   s     --l;5+74<<+P+P+==;;11'+GT[[-G-G+G(GHa!2!223;;A>$Q	\2/)77&11
 	
r+   )r"   r#   r$   r   r7   propertyr   rN   r   r   r   r&   rG   r
   r   r   rF   rH   rI   s   @r,   r   r      sk    {  &C & & 
ELL 
FCU<V 
[k 
  
r+   )2dataclassesr   r&   torch.nn.functionalr   
functionalru    r   r   modeling_outputsr   r   modeling_utilsr	   processing_utilsr
   utilsr   r   r   r   utils.genericr   utils.output_capturingr   dinov2.modeling_dinov2r   r   r   r   r   configuration_radior   
get_loggerr"   logger__all__r   Moduler.   rK   r   r   r   r   r   r   r   r   r*   r+   r,   <module>r      s    "     & < - & R R 7 5  - 
		H	%/
0 7{ 7 70
1BII 
113299 13h	y 		& 		, 		_ 		 	 #f? #f #fL@' @ '
% '
 '
r+   