ó
    qyüi  ã                   ó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   ó    Ús/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/models/imagegpt/image_processing_imagegpt.pyr   r   !   s2   ‡ ñð �B—J‘J  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Ü	�Š�1�a‘4˜QÑ	€BÜ	�Š�1�a‘4˜QÑ	€BÜ	�Š�aÓ	€BØ
Š1ˆdˆ7‰�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   € ô 	)¨Ó5€AÜ�<Š<˜˜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!$ ) ÚImageGPTImageProcessoréQ   Ú	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ÑEY”5—?’? 8´5·=±=ÒAÐ_cˆÜ‰ÒÑ5 (Ð5¨fÓ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XxXšU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Ø 
¸LÐV_óˆNð /=Ð$ UÓ+ñ &<ô &Ð&>Ð@TÓUˆ÷ àÑÜ Ð!TÓUÐUô GQÐQYÔ[`×[gÑ[g×FhÑFh”—’ ´·±Ò>Ðnvß‰b�˜a‘×'Ñ'¨|¸A©×/DÑ/DˆbÐEð ô 4IØÐ/?ñ4Ñ0ˆNÐ0ð !#Ðà)7×)=Ñ)=Ö)?Ñ%��~Ü0Ø"×*Ñ*¨1¨a°°AÓ6×>Ñ>¸rÀ1ÓEÀ~ó�	ð ,5×+<Ñ+<¸^×=QÑ=QÐRSÑ=TÐVXÓ+Y×+aÑ+aØ"×(Ñ(¨Ñ+¨Ró,Ð! %Ó(ñ	 *@ô 'Ð'8Ð:NÓOˆIä k°9Ð%=È>Ñ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Ó!Ñ-´*¸VÀJÑ=OÔQV×Q]Ñ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à˜Ÿ™Ñ# e§l¡lÑ2°TÑ9ð6ð Ð5Ñ6÷6ð 6ð8 *.Ø<@ñ!I]à�^Ñ$ðI]ð ðI]ð ð	I]ð
 LðI]ð ðI]ð ðI]ð ðI]ð ðI]ð ðI]ð ˜D ™KÑ'¨$Ñ.ðI]ð ˜4 ™;Ñ&¨Ñ-ðI]ð  ™+ðI]ð ˜jÑ(¨4Ñ/ðI]ð   $™;ðI]ð  ˜Ÿ™Ñ# e§l¡lÑ2°TÑ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ò ð¨¯©ð ¸¿¹ð È%Ï,É,ô ð&"˜EŸL™Lð "°E·L±Lð "ÀUÇ\Á\ô "ð ôkÐ/ó kó ðkð\ $Ð
$�r#   