
    Z j                     f   S r SSKJr  SSKrSSKrSSKJr  SSK	J
r
  SSKJr  SSKJrJr  SS	KJrJr  SS
KJrJr  SSKJrJr   " S S\SS9rS\R4                  S\R4                  S\R4                  4S jrS\R4                  S\R4                  S\R4                  4S jr\ " S S\
5      5       rS/rg)z#Image processor class for ImageGPT.    )UnionN)
functional   )TorchvisionBackend)BatchFeature)group_images_by_shapereorder_images)PILImageResamplingSizeDict)ImagesKwargsUnpack)
TensorTypeauto_docstringc                   `    \ rS rSr% Sr\\R                  \\\	      S4   S-  \
S'   \\
S'   Srg)ImageGPTImageProcessorKwargs!   a   
clusters (`np.ndarray` or `list[list[int]]` or `torch.Tensor`, *optional*, defaults to `self.clusters`):
    The color clusters to use, of shape `(n_clusters, 3)` when color quantizing. Can be overridden by `clusters`
    in `preprocess`.
do_color_quantize (`bool`, *optional*, defaults to `self.do_color_quantize`):
    Controls whether to apply color quantization to convert continuous pixel values to discrete cluster indices.
    When True, each pixel is assigned to its nearest color cluster, enabling ImageGPT's discrete token modeling.
torch.TensorNclustersdo_color_quantize )__name__
__module____qualname____firstlineno____doc__r   npndarraylistint__annotations__bool__static_attributes__r       ڇ/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/transformers/models/imagegpt/image_processing_imagegpt.pyr   r   !   s2     BJJT#Y?@4GGr#   r   F)totalabreturnc                     UR                  5       n[        R                  " U S-  SS9n[        R                  " US-  SS9n[        R                  " X5      nUSS2S4   SU-  -
  USSS24   -   nU$ )z
Compute squared Euclidean distances between all pixels and clusters.

Args:
    a: (N, 3) tensor of pixel RGB values
    b: (M, 3) tensor of cluster RGB values

Returns:
    (N, M) tensor of squared distances
      dimr   N)ttorchsummatmul)r&   r'   a2b2abds         r$    squared_euclidean_distance_torchr6   /   sm     	
A	1a4Q	B	1a4Q	B	a	B
1d7a"fr$'{*AHr#   xr   c                 B    [        X5      n[        R                  " USS9$ )z
Assign each pixel to its nearest color cluster.

Args:
    x: (H*W, 3) tensor of flattened pixel RGB values
    clusters: (n_clusters, 3) tensor of cluster RGB values

Returns:
    (H*W,) tensor of cluster indices
r+   r,   )r6   r/   argmin)r7   r   r5   s      r$   color_quantize_torchr:   B   s     	)5A<<q!!r#   c                      ^  \ rS rSrS/r\r\R                  r	Sr
Sr/ SQr/ SQrSrSrSSS.rSr SS\\R(                  -  \R,                  -  S-  S	\\   4U 4S
 jjjr  SS\S   S\S\SSS\S\S\S\S\S\\\   -  S-  S\\\   -  S-  S\S-  S\\-  S-  S\S-  S\\R(                  -  \R,                  -  S-  4S jjrU 4S jrSr U =r!$ ) ImageGPTImageProcessorQ   	input_idsTN)      ?r?   r?      )heightwidthr   kwargsc                 z   > Ub#  [         R                  " U[         R                  S9OSn[        TU ]  " SSU0UD6  g)z
clusters (`np.ndarray` or `list[list[int]]` or `torch.Tensor`, *optional*):
    The color clusters to use, of shape `(n_clusters, 3)` when color quantizing. Can be overridden by `clusters`
    in `preprocess`.
Ndtyper   r   )r/   	as_tensorfloat32super__init__)selfr   rC   	__class__s      r$   rJ   ImageGPTImageProcessor.__init___   s8     FNEY5??85==A_c5(5f5r#   imagesr   	do_resizesizeresamplez7PILImageResampling | tvF.InterpolationMode | int | Nonedo_center_crop	crop_size
do_rescalerescale_factordo_normalize
image_mean	image_stddisable_groupingreturn_tensorsr   c           	         [        XS9u  nn0 nUR                  5        H"  u  nnU(       a  U R                  UX4S9nUUU'   M$     [        UU5      n[        UUS9u  nn0 nUR                  5        H8  u  nnU(       a  U R	                  UU5      nU R                  UXxXU5      nUUU'   M:     [        UU5      nU(       Ga(  Uc  [        S5      e[        U[        R                  5      (       d#  [        R                  " U[        R                  S9OUR                  US   R                  US   R                  S9n[        UUS9u  nn0 nUR                  5        Hs  u  nn[        UR!                  SSSS5      R#                  S	S5      U5      nUR#                  UR$                  S   S	5      R#                  UR$                  S   S	5      UU'   Mu     [        UU5      n['        S
U0US9$ ['        SU0US9$ )N)rY   )imagerP   rQ   z1Clusters must be provided for color quantization.rE   r   r*   r   r+   r>   )datatensor_typepixel_values)r   itemsresizer	   center_croprescale_and_normalize
ValueError
isinstancer/   TensorrG   rH   todevicerF   r:   permutereshapeshaper   )rK   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r   r   rC   grouped_imagesgrouped_images_indexresized_images_groupedrl   stacked_imagesresized_imagesprocessed_images_groupedr`   clusters_torchinput_ids_groupedr>   s                               r$   _preprocess"ImageGPTImageProcessor._preprocessl   s+   ( 0EV/o,,!#%3%9%9%;!E>!%>!`,:"5) &< ((>@TU 0E^fv/w,,#% %3%9%9%;!E>!%!1!1.)!L!77
LV_N /=$U+ &< &&>@TU  !TUU GQQY[`[g[gFhFh>nvba''|A/D/DbE  4I/?40N0 !#)7)=)=)?%~0"**1aA6>>r1E~	 ,5+<+<^=Q=QRS=TVX+Y+a+a"((+R,!%(	 *@ ''8:NOIk9%=>ZZ.,!?^\\r#   c                    > [         TU ]  5       nUR                  S5      b8  [        US   [        R
                  5      (       a  US   R                  5       US'   U$ )Nr   )rI   to_dictgetrf   r/   rg   tolist)rK   outputrL   s     r$   rx   ImageGPTImageProcessor.to_dict   sS    "::j!-*VJ=OQVQ]Q]2^2^!'
!3!:!:!<F:r#   r   )N)NN)"r   r   r   r   model_input_namesr   valid_kwargsr
   BILINEARrQ   r   r   rW   rX   rT   rV   rP   rO   r   r   r   r/   rg   r   rJ   r!   r   floatstrr   ru   rx   r"   __classcell__)rL   s   @r$   r<   r<   Q   s   $/L!**HH JIJLC(DI =A6#ell2T96 566 68 *.<@!I]^$I] I] 	I]
 LI] I] I] I] I] I] DK'$.I] 4;&-I] +I] j(4/I]  $;I]  #ell2T9!I]V r#   r<   )r   typingr   numpyr   r/   torchvision.transforms.v2r   tvFimage_processing_backendsr   image_processing_utilsr   image_transformsr   r	   image_utilsr
   r   processing_utilsr   r   utilsr   r   r   rg   r6   r:   r<   __all__r   r#   r$   <module>r      s    *    7 ; 2 E 7 4<u   %,, &"ELL "ELL "U\\ " k/ k k\ $
$r#   