
    ^j1H                        d dl mZmZ d dlZd dlmZ ddlmZ ddlm	Z	 ddl
mZ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mZ ddlmZ ddlmZmZmZ ddlmZm Z  ddl!m"Z" ddl#m$Z$  G d dejJ                        Z& G d dejJ                        Z'	 	 d0dejJ                  dejP                  dejP                  dejP                  dejP                  dz  de)dz  de)dee   fdZ* G d d ejJ                        Z+ G d! d"ejJ                        Z, G d# d$ejJ                        Z- G d% d&e      Z.e G d' d(e             Z/e G d) d*e/             Z0 ed+,       G d- d.ee/             Z1g d/Z2y)1    )CallableIterableN)nn   )initialization)ACT2FN)BackboneMixinfilter_output_hidden_states)create_bidirectional_mask)GradientCheckpointingLayer)BackboneOutputBaseModelOutputBaseModelOutputWithPooling)ALL_ATTENTION_FUNCTIONSPreTrainedModel)Unpack)TransformersKwargsauto_docstring
is_tracing)can_return_tuplemerge_with_config_defaults)capture_outputs   )PixioConfigc                   `     e Zd ZdZdef fdZdej                  dej                  fdZ xZ	S )PixioPatchEmbeddingsz
    This class turns `pixel_values` of shape `(batch_size, num_channels, height, width)` into the initial
    `hidden_states` (patch embeddings) of shape `(batch_size, seq_length, hidden_size)` to be consumed by a
    Transformer.
    configc                    t         |           |j                  }|j                  }t	        |t
              r|n||f}t	        |t
              r|n||f}|d   |d   z  |d   |d   z  z  | _        || _        || _        |j                  | _        t        j                  |j                  |j                  ||      | _        y )Nr   r   )kernel_sizestride)super__init__
image_size
patch_size
isinstancer   num_patchesnum_channelsr   Conv2dhidden_size
projection)selfr   r#   r$   	__class__s       s/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/pixio/modeling_pixio.pyr"   zPixioPatchEmbeddings.__init__/   s    &&
&&
#-j(#CZ*V`Ia
#-j(#CZ*V`Ia
&qMZ]:z!}PZ[\P]?]^$$"//))F$7$79K9KYclvw    pixel_valuesreturnc                     |j                   d   }|| j                  k7  rt        d| j                   d| d      | j                  |      j	                  d      j                  dd      S )Nr   zoMake sure that the channel dimension of the pixel values match with the one set in the configuration. Expected z	 but got .   )shaper'   
ValueErrorr*   flatten	transpose)r+   r/   r'   s      r-   forwardzPixioPatchEmbeddings.forward<   su    #))!,4,,,!../yaI  |,44Q7AA!QGGr.   )
__name__
__module____qualname____doc__r   r"   torchTensorr8   __classcell__r,   s   @r-   r   r   (   s4    x{ xHELL HU\\ Hr.   r   c                        e Zd ZdZdeddf fdZdej                  dededej                  fd	Z	d
ej                  dej                  fdZ
 xZS )PixioEmbeddingszB
    Construct the CLS tokens, position and patch embeddings.
    r   r0   Nc                 (   t         |           t        j                  t	        j
                  d|j                  |j                              | _        d | _	        t        |      | _        | j                  j                  }t        j                  t	        j
                  d||j                  z   |j                              | _        t        j                  |j                        | _        |j                  | _        |j"                  | _        || _        y )Nr   )r!   r"   r   	Parameterr=   randnn_cls_tokensr)   	cls_token
mask_tokenr   patch_embeddingsr&   position_embeddingsDropouthidden_dropout_probdropoutr$   r   )r+   r   r&   r,   s      r-   r"   zPixioEmbeddings.__init__K   s    ekk!V5H5H&J\J\&]^ 4V <++77#%<<A{VM`M`?`bhbtbt0u#v zz&"<"<="// ++r.   
embeddingsheightwidthc                 @   |j                   d   | j                  z
  }| j                  j                   d   | j                  z
  }t               s||k(  r||k(  r| j                  S | j                  ddd| j                  f   }| j                  dd| j                  df   }|j                   d   }|| j                  z  }	|| j                  z  }
t        |dz        }|j                  d|||      }|j                  dddd      }|j                  }t        j                  j                  |j                  t        j                        |	|
fdd	
      j                  |      }|j                  dddd      j                  dd|      }t        j                   ||fd      S )a#  
        This method allows to interpolate the pre-trained position encodings, to be able to use the model on higher
        resolution images. This method is also adapted to support tracing and interpolation at torch.float32 precision.

        Adapted from:
        - https://github.com/facebookresearch/dino/blob/de9ee3df6cf39fac952ab558447af1fa1365362a/vision_transformer.py#L174-L194, and
        - https://github.com/facebookresearch/dinov2/blob/e1277af2ba9496fbadf7aec6eba56e8d882d1e35/dinov2/models/vision_transformer.py#L179-L211
        r   Ng      ?r   r   r3   bicubicF)sizemodealign_cornersdtypedim)r4   rF   rJ   r   r$   intreshapepermuterX   r   
functionalinterpolatetor=   float32viewcat)r+   rN   rO   rP   r&   num_positionsclass_pos_embedpatch_pos_embedrZ   
new_height	new_widthsqrt_num_positionstarget_dtypes                r-   interpolate_pos_encodingz(PixioEmbeddings.interpolate_pos_encodingX   s    !&&q)D,=,==0066q9D<M<MM|} <5+++2216I8I8I6I3IJ221d6G6G6I3IJr"t.
T__,	 !34)11!5GI[]`a)11!Q1=&,,--33u}}-i(	 4 

 "<"
  	 *11!Q1=BB1b#Nyy/?;CCr.   r/   c                 x   |j                   \  }}}}| j                  j                  j                  j                  }| j                  |j                  |            }| j                  j                  |dd      }t        j                  ||fd      }|| j                  |||      z   }| j                  |      }|S )NrW   rR   r   rY   )r4   rI   r*   weightrX   r`   rG   expandr=   rc   rk   rM   )	r+   r/   
batch_size_rO   rP   rj   rN   
cls_tokenss	            r-   r8   zPixioEmbeddings.forward~   s    '3'9'9$
Avu,,77>>DD**<???+NO
^^**:r2>
YY
J7Q?
$"?"?
FTY"ZZ
\\*-
r.   )r9   r:   r;   r<   r   r"   r=   r>   r[   rk   r8   r?   r@   s   @r-   rB   rB   F   si    { t $D5<< $D $DUX $D]b]i]i $DLELL U\\ r.   rB   modulequerykeyvalueattention_maskscalingrM   kwargsc                    ||j                  d      dz  }t        j                  ||j                  dd            |z  }|||z   }t        j
                  j                  |dt        j                        j                  |j                        }t        j
                  j                  ||| j                        }t        j                  ||      }	|	j                  dd      j                         }	|	|fS )NrR         r3   r   )rZ   rX   )ptrainingr   )rT   r=   matmulr7   r   r^   softmaxra   r`   rX   rM   r|   
contiguous)
rr   rs   rt   ru   rv   rw   rM   rx   attn_weightsattn_outputs
             r-   eager_attention_forwardr      s     **R.D( <<s}}Q':;gEL!#n4==((2U]](SVVW\WbWbcL==((6??([L,,|U3K''1-88:K$$r.   c                        e Zd Zdef fdZ	 d	dej                  dej                  dz  dee   de	ej                  ej                  f   fdZ
 xZS )
PixioAttentionr   c                 (   t         |           || _        |j                  | _        t	        |d|j
                  |j                  z        | _        |j                  | _        | j                  dz  | _	        d| _
        t        j                  |j
                  |j                  | j                  z  |j                        | _        t        j                  |j
                  |j                  | j                  z  |j                        | _        t        j                  |j
                  |j                  | j                  z  |j                        | _        t        j                  |j                  | j                  z  |j
                  d      | _        y )Nhead_dimrz   FbiasT)r!   r"   r   num_attention_headsgetattrr)   r   attention_probs_dropout_probattention_dropoutrw   	is_causalr   Linearqkv_biasq_projk_projv_projo_projr+   r   r,   s     r-   r"   zPixioAttention.__init__   s,   #)#=#= 
F4F4F&JdJd4de!'!D!D}}d*ii 2 2F4N4NQUQ^Q^4^eketetuii 2 2F4N4NQUQ^Q^4^eketetuii 2 2F4N4NQUQ^Q^4^eketetuii : :T]] JFL^L^eijr.   Nhidden_statesrv   rx   r0   c                    |j                   d d }g |d| j                  }| j                  |      j                  |      j	                  dd      }| j                  |      j                  |      j	                  dd      }| j                  |      j                  |      j	                  dd      }t        j                  | j                  j                  t              }	 |	| ||||f| j                  sdn| j                  | j                  d|\  }
} |
j                  g |d j!                         }
| j#                  |
      }
|
|fS )NrR   r   r3           )rM   rw   )r4   r   r   rb   r7   r   r   r   get_interfacer   _attn_implementationr   r|   r   rw   r\   r   r   )r+   r   rv   rx   input_shapehidden_shapequery_states
key_statesvalue_statesattention_interfacer   r   s               r-   r8   zPixioAttention.forward   sK    $))#2.88b8$--8{{=166|DNNqRST[[/44\BLLQPQR
{{=166|DNNqRST(?(M(MKK,,.E)
 %8	%
  $}}C$2H2HLL	%
 	%
!\ *k));;;;FFHkk+.L((r.   N)r9   r:   r;   r   r"   r=   r>   r   r   tupler8   r?   r@   s   @r-   r   r      sf    k{ k" /3)||) t+) +,	)
 
u||U\\)	*)r.   r   c                   X     e Zd Zd fdZdej
                  dej
                  fdZ xZS )PixioMLPr0   c                 ~   t         |           |j                  x}}t        |j                  |j                  z        }t        j                  ||d      | _        t        |j                  t              rt        |j                     | _        n|j                  | _        t        j                  ||d      | _        y )NTr   )r!   r"   r)   r[   	mlp_ratior   r   fc1r%   
hidden_actstrr   
activationfc2)r+   r   in_featuresout_featureshidden_featuresr,   s        r-   r"   zPixioMLP.__init__   s    %+%7%77lf0063C3CCD99[/Ef''-$V%6%67DO$//DO99_lFr.   hidden_statec                 l    | j                  |      }| j                  |      }| j                  |      }|S r   )r   r   r   )r+   r   s     r-   r8   zPixioMLP.forward   s2    xx-|4xx-r.   )r0   N)r9   r:   r;   r"   r=   r>   r8   r?   r@   s   @r-   r   r      s$    	GELL U\\ r.   r   c                   r     e Zd ZdZd	deddf fdZdej                  dej                  fdZde	fdZ
 xZS )
PixioDropPathzStochastic depth (DropPath) per sample, for residual blocks.

    Identity when ``drop_prob`` is 0 or outside training. See `Deep Networks with Stochastic Depth
    <https://arxiv.org/abs/1603.09382>`_.
    	drop_probr0   Nc                 0    t         |           || _        y r   )r!   r"   r   )r+   r   r,   s     r-   r"   zPixioDropPath.__init__   s    "r.   r   c                 P   | j                   dk(  s| j                  s|S d| j                   z
  }|j                  d   fd|j                  dz
  z  z   }t	        j
                  ||j                  |j                        }t	        j                  ||z         }|j                  |      |z  S )Nr   r   r   )r   )rX   device)
r   r|   r4   ndimr=   randrX   r   floordiv)r+   r   	keep_probr4   random_tensors        r-   r8   zPixioDropPath.forward   s    >>S   &	$$Q')DM4F4F4J,KK

50C0CML`L`aMI$=>  +m;;r.   c                      d| j                    S )Nzp=)r   )r+   s    r-   
extra_reprzPixioDropPath.extra_repr  s    DNN#$$r.   )r   )r9   r:   r;   r<   floatr"   r=   r>   r8   r   r   r?   r@   s   @r-   r   r      sB    #% #$ #<U\\ <ell <%C %r.   r   c            	            e Zd Zdef fdZ	 d	dej                  dej                  dz  dee   dej                  fdZ	 xZ
S )

PixioLayerr   c                    t         |           t        |      | _        t	        j
                  |j                  |j                        | _        t	        j
                  |j                  |j                        | _	        t        |      | _        t	        j                  |j                        | _        |j                  dkD  rt!        |j                        | _        y t	        j"                         | _        y )Nepsr   )r!   r"   r   	attentionr   	LayerNormr)   layer_norm_epslayernorm_beforelayernorm_afterr   mlprK   rL   rM   drop_path_rater   Identity	drop_pathr   s     r-   r"   zPixioLayer.__init__  s    '/ "V-?-?VEZEZ [!||F,>,>FDYDYZF#zz&"<"<=AGAVAVY\A\v'<'<=bdbmbmbor.   Nr   rv   rx   r0   c                 6   |}| j                  |      } | j                  ||fi |\  }}| j                  |      }| j                  |      |z   }|}| j	                  |      }| j                  |      }| j                  |      }| j                  |      |z   }|S r   )r   r   rM   r   r   r   )r+   r   rv   rx   residualrp   s         r-   r8   zPixioLayer.forward  s     !--m<)4>>-R6Rq]3}5@ ,,];/]3}5@r.   r   )r9   r:   r;   r   r"   r=   r>   r   r   r8   r?   r@   s   @r-   r   r     sX    p{ p /3|| t+ +,	
 
r.   r   c                        e Zd ZU eed<   dZdZdZdZddgZ	dZ
dZdZdZdZeedZd	Z ej(                          fd
       Z xZS )PixioPreTrainedModelr   pixior/   )imageTrB   r   )r   
attentionsrI   c                    t         |   |       t        |t              r|j                  6t        j                  |j                  d| j                  j                         t        j                  |j                  d| j                  j                         |j                   t        j                  |j                         yyy)zInitialize the weightsNr   )meanstd)r!   _init_weightsr%   rB   rJ   inittrunc_normal_r   initializer_rangerG   rH   zeros_)r+   rr   r,   s     r-   r   z"PixioPreTrainedModel._init_weights7  s     	f%fo.))5""6#=#=CT[[MjMjkv//ct{{?\?\]  ,F--. -	 /r.   )r9   r:   r;   r   __annotations__base_model_prefixmain_input_nameinput_modalitiessupports_gradient_checkpointing_no_split_modules_supports_sdpa_supports_flash_attn_supports_flex_attn_supports_attention_backend_can_compile_fullgraphr   r   _can_record_outputs_input_embed_layerr=   no_gradr   r?   r@   s   @r-   r   r   $  sx    $O!&*#*L9N"&!#$ ,U]]_/ /r.   r   c                        e Zd Zdef fdZe ed      e	 	 ddej                  dz  dej                  dz  de
e   d	efd
                     Z xZS )
PixioModelr   c                 d   t         |   |       || _        t        |      | _        t        j                  t        |j                        D cg c]  }t        |       c}      | _
        t        j                  |j                  |j                        | _        | j                          y c c}w )Nr   )r!   r"   r   rB   rN   r   
ModuleListrangenum_hidden_layersr   layersr   r)   r   	layernorm	post_initr+   r   rp   r,   s      r-   r"   zPixioModel.__init__E  s|     )&1mmvG_G_A`$aAZ%7$abf&8&8f>S>ST	 %bs   B-F)tie_last_hidden_statesNr/   rv   rx   r0   c                 H   |t        d      | j                  |      }t        | j                  ||      }|}| j                  D ]  } |||fi |} | j                  |      }|d d d | j                  j                  d d f   j                  d      }t        ||      S )Nz You have to specify pixel_values)r   inputs_embedsrv   r   rY   )last_hidden_statepooler_output)	r5   rN   r   r   r   r   rF   r   r   )r+   r/   rv   rx   embedding_outputr   layerpooled_outputs           r-   r8   zPixioModel.forwardP  s     ?@@??<82;;*)

 )[[ 	KE!-J6JM	K}5%a)G4??+G+G)G&JKPPUVPW)+'
 	
r.   )NN)r9   r:   r;   r   r"   r   r   r   r=   r>   r   r   r   r8   r?   r@   s   @r-   r   r   C  s~    	{ 	  E2 -1.2
llT)
 t+
 +,	

 
$
  3  
r.   r   zN
    Pixio backbone, to be used with frameworks like DETR and MaskFormer.
    )custom_introc                        e Zd Zdef fdZeee	 d	dej                  dej                  dz  de
e   defd                     Z xZS )
PixioBackboner   c                 8   t         |   |       t        |j                  dz         D cg c]  }|j                   c}| _        t        |      | _        t        j                  |j                  |j                        | _        | j                          y c c}w )Nr   r   )r!   r"   r   r   r)   num_featuresr   r   r   r   r   r   r   r   s      r-   r"   zPixioBackbone.__init__t  st     9>v?W?WZ[?[9\]AV//]'
f&8&8f>S>ST	 ^s   BNr/   rv   rx   r0   c                    d|d<    | j                   ||fi |}|j                  }g }t        | j                  |      D ]  \  }}|| j                  v s| j
                  j                  r| j                  |      }| j
                  j                  r|dd| j                   j                  j                  df   }|j                  \  }	}
}}| j
                  j                  }|j                  |	||z  ||z  d      }|j                  dddd      j                         }|j!                  |        t#        t%        |      |j                  |j&                  	      S )
aw  
        Examples:

        ```python
        >>> from transformers import AutoImageProcessor, AutoBackbone
        >>> import torch
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read()))

        >>> processor = AutoImageProcessor.from_pretrained("facebook/pixio-huge")
        >>> model = AutoBackbone.from_pretrained(
        ...     "facebook/pixio-huge", out_features=["stage7", "stage15", "stage23", "stage31"]
        ... )

        >>> inputs = processor(image, return_tensors="pt")

        >>> outputs = model(**inputs)
        >>> feature_maps = outputs.feature_maps
        >>> list(feature_maps[-1].shape)
        [1, 1280, 16, 16]
        ```Toutput_hidden_statesNrR   r   r   r   r3   )feature_mapsr   r   )r   r   zipstage_namesr   r   apply_layernormr   reshape_hidden_statesrN   rF   r4   r$   r\   r]   r   appendr   r   r   )r+   r/   rv   rx   outputr   r  stager   ro   rp   rO   rP   r$   s                 r-   r8   zPixioBackbone.forward}  sL   F *.%&",$**\>"TV"T,,#&t'7'7#G 
	2E<)));;..#'>>,#?L;;44#/4::3H3H3U3U3W0W#XL3?3E3E0J65!%!7!7J#/#7#7
FjDXZ_cmZmoq#rL#/#7#71a#C#N#N#PL##L1
	2 |, ..((
 	
r.   r   )r9   r:   r;   r   r"   r   r
   r   r=   r>   r   r   r   r8   r?   r@   s   @r-   r   r   n  sq    {    /36
ll6
 t+6
 +,	6

 
6
  ! 6
r.   r   )r   r   r   )Nr   )3collections.abcr   r   r=   r    r   r   activationsr   backbone_utilsr	   r
   masking_utilsr   modeling_layersr   modeling_outputsr   r   r   modeling_utilsr   r   processing_utilsr   utilsr   r   r   utils.genericr   r   utils.output_capturingr   configuration_pixior   Moduler   rB   r>   r   r   r   r   r   r   r   r   r   __all__ r.   r-   <module>r     s  * /   & ! H 6 9 [ [ F & C C I 5 ,H299 H<Dbii DZ !%II%<<% 
% <<	%
 LL4'% T\% % '(%8.)RYY .)bryy &%BII %0+ > /? / /< '
% '
 '
T 
C
M#7 C

C
L Br.   