Ë
    ÛÓ^j]*  ã                   ó>  — d dl 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mZ ddlmZmZmZ  ej&                  e«      Zd	Zd
edededededeeef   fd„Zdddeddfd„Zdddddeded   fd„Z G d„ ded¬«      Z ed¬«       G d„ de«      «       ZdgZy) é    N)Ú
functionalé   )ÚTorchvisionBackend)ÚBatchFeature)Ú
ImageInputÚPILImageResampling)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstringÚlogging)éF   éŒ   é  i0  i`  ÚheightÚwidthÚ
patch_sizeÚmax_patchesÚpooling_kernel_sizeÚreturnc                 óp  — | |z  }||dz  z  }t        j                  ||z  «      }|| z  }||z  }	||z  }
t        t        j                  ||
z  «      «      |
z  }t        t        j                  |	|
z  «      «      |
z  }|dk(  r|dk(  rt	        d||z  › d�«      ‚||dz  z  |
z  }|dk(  r1|
}t        t        t        j                  || z  «      «      |
z  |«      }n5|dk(  r0|
}t        t        t        j                  | |z  «      «      |
z  |«      }||z  |kD  rt	        d| › d|› d|› d|› d|› d	|› �«      ‚||fS )
a  
    Image is resized to preserve aspect ratio so it fits within the patch budget.
    Target dimensions are the largest that:
    1) Produce at most `max_patches` patches when patchified with `patch_size`
    2) Have height and width divisible by `pooling_kernel_size * patch_size`
    é   r   zpAttempting to resize to a 0 x 0 image. Resized height should be divisible by `pooling_kernel_size * patch_size`=ú.z
Resizing [Úxz] to [z] but this exceeds z patches with patch_size )ÚmathÚsqrtÚintÚfloorÚ
ValueErrorÚmin)r   r   r   r   r   Útotal_pxÚ	target_pxÚfactorÚideal_heightÚideal_widthÚ	side_multÚtarget_heightÚtarget_widthÚmax_side_lengths                 ú}/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/gemma4/image_processing_gemma4.pyÚ get_aspect_ratio_preserving_sizer+   !   s˜  € ð ˜‰~€HØ˜z¨1™}Ñ-€IÜ�Y‰Y�y 8Ñ+Ó,€FØ˜F‘?€LØ˜5‘.€KØ# jÑ0€Iô œŸ
™
 <°)Ñ#;Ó<Ó=À	ÑI€MÜ”t—z‘z +°	Ñ"9Ó:Ó;¸iÑG€Lð ˜Ò˜l¨aÒ/Üð2Ø2EÈ
Ñ2RÐ1SÐSTðVó
ð 	
ð
 #Ð&9¸1Ñ&<Ñ<À	ÑI€OØ˜ÒØ!ˆÜÜ”—
‘
˜5 6™>Ó*Ó+¨iÑ7Øó
‰ð 
˜Ò	Ø ˆÜÜ”—
‘
˜6 E™>Ó*Ó+¨iÑ7Øó
ˆð
 �|Ñ# iÒ/ÜØ˜˜  % ¨¨}¨o¸Q¸|¸nð M Ø +˜}Ð,EÀjÀ\ðSó
ð 	
ð
 ˜,Ð&Ð&ó    Úimageútorch.Tensorc                 ó¸   — | j                   \  }}}||z  }||z  }| j                  |||||«      }|j                  ddddd«      }|j                  ||z  d«      }|S )zÍ
    Convert 3D tensor image of shape (num_channels, image_height, image_width) into 2D tensor of patches of shape
    (num_patches_height * num_patches_width, patch_size * patch_size * num_channels).
    é   r   r   é   r   éÿÿÿÿ)ÚshapeÚreshapeÚpermute)r-   r   Únum_channelsÚimage_heightÚimage_widthÚnum_patches_heightÚnum_patches_widthÚpatched_images           r*   Úconvert_image_to_patchesr<   X   s{   € ð
 /4¯k©kÑ+€L�, Ø%¨Ñ3ÐØ# zÑ1ÐØ—M‘M ,Ð0BÀJÐPaÐcmÓn€MØ!×)Ñ)¨!¨Q°°1°aÓ8€MØ!×)Ñ)Ð*<Ð?PÑ*PÐRTÓU€MØÐr,   Ú	positionsÚtarget_length)r.   r.   c                 ó.  — | j                   d   }||z
  }|dkD  ryddg| j                  dz
  z  d|gz   }ddd|f}t        j                  j                  j                  | |dd¬«      } t        j                  j                  j                  ||dd¬«      }| |fS )z3
    Pad the tensor along the first dimension.
    r   r0   Úconstant)ÚmodeÚvaluer2   )r3   ÚndimÚtorchÚnnr   Úpad)r-   r=   r>   Úcurrent_lengthÚpadding_lengthÚpaddingÚpos_paddings          r*   Úpad_along_first_dimrK   g   s£   € ð —[‘[ ‘^€NØ" ^Ñ3€NØ˜ÒØ�a�&˜EŸJ™J¨™NÑ+¨q°.Ð.AÑAˆØ˜!˜Q Ð/ˆÜ—‘×#Ñ#×'Ñ'¨¨w¸ZÈqÐ'ÓQˆÜ—H‘H×'Ñ'×+Ñ+¨I°{ÈÐ[]Ð+Ó^ˆ	Ø�)ÐÐr,   c                   ó0   — e Zd ZU dZeed<   eed<   eed<   y)ÚGemma4ImageProcessorKwargsaY  
    patch_size (`int`, *optional*):
        Size of each image patch in pixels.
    max_soft_tokens (`int`, *optional*):
        Maximum number of soft (vision) tokens per image.
        Must be one of {70, 140, 280, 560, 1120}.
    pooling_kernel_size (`int`, *optional*):
        Spatial pooling kernel size applied after patchification.
    r   Úmax_soft_tokensr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__© r,   r*   rM   rM   w   s   … ñð ƒOØÓØÔr,   rM   F)Útotalz$Constructs a Gemma4 image processor.)Úcustom_introc                   ó’  ‡ — e Zd Zej                  Zg d¢Zg d¢ZdZdZ	dZ
dZdZdZdZdZdZeZg d	¢Zd
ee   fˆ fd„Zˆ fd„Zdej0                  dedededej6                  dej0                  fd„Zded
ee   defˆ fd„Z	 	 	 d!de d   de!ddde!de"de!de"e e"   z  dz  de"e e"   z  dz  de#e$z  dz  dedz  dedz  dedz  defd „Z%ˆ xZ&S )"ÚGemma4ImageProcessor)ç        rY   rY   )ç      ð?rZ   rZ   NTFé   r   r   ©Úpixel_valuesÚimage_position_idsÚnum_soft_tokens_per_imageÚkwargsc                 óˆ   •— t        ‰| �  di |¤Ž | j                  t        vr t	        dt        › d| j                  › d�«      ‚y )Nú!`max_soft_tokens` must be one of ú, got r   rT   )ÚsuperÚ__init__rN   Ú_SUPPORTED_SOFT_TOKENSr   ©Úselfr`   Ú	__class__s     €r*   re   zGemma4ImageProcessor.__init__˜   sN   ø€ Ü‰ÑÑ"˜6Ò"à×ÑÔ'=Ñ=ÜÐ@ÔAWÐ@XÐX^Ð_c×_sÑ_sÐ^tÐtuÐvÓwÐwð >r,   c                 ó.   •— d|d<   t        ‰| �  di |¤Ž y )NFÚ	do_resizerT   )rd   Ú_validate_preprocess_kwargsrg   s     €r*   rl   z0Gemma4ImageProcessor._validate_preprocess_kwargsž   s   ø€ ð
 $ˆˆ{ÑÜ‰Ñ+Ñ5¨fÓ5r,   r-   r   r   r   Úresampler   c                 ó²   — |j                   d   |j                   d   }}t        |||||¬«      \  }}	||k(  r|	|k(  r|S t        j                  |||	g|d¬«      S )Néþÿÿÿr2   )r   r   r   r   r   T)ÚsizeÚinterpolationÚ	antialias)r3   r+   ÚtvFÚresize)
rh   r-   r   r   r   rm   r   r   r'   r(   s
             r*   Úaspect_ratio_preserving_resizez3Gemma4ImageProcessor.aspect_ratio_preserving_resize¦   ss   € ð Ÿ™ B™¨¯©°R©�ˆÜ&FØØØ!Ø#Ø 3ô'
Ñ#ˆ�|ð ˜FÒ" |°uÒ'<ØˆLä�z‰zØØ Ð.Ø"Øô	
ð 	
r,   Úimagesc                 ó$   •— t        ‰| �  |fi |¤ŽS )N)rd   Ú
preprocess)rh   rv   r`   ri   s      €r*   rx   zGemma4ImageProcessor.preprocessÁ   s   ø€ ô
 ‰wÑ! &Ñ3¨FÑ3Ð3r,   r.   rk   z7PILImageResampling | tvF.InterpolationMode | int | NoneÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanÚ	image_stdÚreturn_tensorsrN   c           	      ó^  — |t         vrt        dt         › d|› d�«      ‚||dz  z  }g }g }g }|D �];  }|r| j                  ||
|||¬«      }| j                  ||||||«      }|j                  d   |
z  }|j                  d   |
z  }t        ||
«      }|j                  |j                  d   |dz  z  «       |j                  }t        j                  t        j                  ||¬	«      t        j                  ||¬	«      d
¬«      }t        j                  |d¬«      }|j                  |j                  d   d«      }t        |||«      \  }}|j                  |«       |j                  |«       �Œ> t        j                  |d¬«      }t        j                  |d¬«      }|||dœ}t        ||	¬«      S )Nrb   rc   r   r   )r-   r   r   r   rm   ro   r2   r   )ÚdeviceÚxy)Úindexing)Údimr\   )ÚdataÚtensor_type)rf   r   ru   Úrescale_and_normalizer3   r<   Úappendr€   rD   ÚmeshgridÚarangeÚstackr4   rK   r   )rh   rv   rk   rm   ry   rz   r{   r|   r}   r~   r   rN   r   r`   r   r]   Úposition_idsr_   r-   Úpatch_heightÚpatch_widthÚpatchesr€   Ú
patch_gridÚstacked_gridÚreal_positionsr=   r„   s                               r*   Ú_preprocessz Gemma4ImageProcessor._preprocessÈ   s×  € ð  Ô"8Ñ8ÜÐ@ÔAWÐ@XÐX^Ð_nÐ^oÐopÐqÓrÐrð &Ð(;¸QÑ(>Ñ>ˆð
 ˆØˆØ$&Ð!àó "	+ˆEáØ×;Ñ;ØØ)Ø +Ø(;Ø%ð <ó �ð ×.Ñ.¨u°jÀ.ÐR^Ð`jÐluÓvˆEð !Ÿ;™; r™?¨jÑ8ˆLØŸ+™+ b™/¨ZÑ7ˆKÜ.¨u°jÓAˆGØ%×,Ñ,¨W¯]©]¸1Ñ-=ÐATÐVWÑAWÑ-WÔXð —\‘\ˆFÜŸ™Ü—‘˜[°Ô8Ü—‘˜\°&Ô9ØôˆJô
 !Ÿ;™; z°rÔ:ˆLØ)×1Ñ1°'·-±-ÀÑ2BÀAÓFˆNô "5°W¸nÈkÓ!ZÑˆG�YØ×Ñ Ô(Ø×Ñ 	Ö*ðE"	+ôJ —{‘{ <°QÔ7ˆÜ—{‘{ <°QÔ7ˆð )Ø".Ø)Bñ
ˆô
  °>ÔBÐBr,   )NNN)'rO   rP   rQ   r   ÚBICUBICrm   r|   r}   rp   Údefault_to_squareÚdo_convert_rgbrk   ry   r{   r   rN   r   rM   Úvalid_kwargsÚmodel_input_namesr
   re   rl   rD   ÚTensorr   rs   ÚInterpolationModeru   r   r   rx   ÚlistÚboolÚfloatÚstrr   r’   Ú__classcell__)ri   s   @r*   rX   rX   ‡   sÃ  ø„ à!×)Ñ)€HÚ €JÚ€IØ€DØÐØ€NØ€IØ€JØ€LØ€JØ€OØÐØ-€LÚ[Ððx Ð(BÑ!Cõ xô6ð
à�|‰|ð
ð ð
ð ð	
ð
 !ð
ð ×'Ñ'ð
ð 
�‰ó
ð64àð4ð Ð3Ñ4ð4ð 
õ	4ð$ "&Ø&*Ø*.ñJCà�^Ñ$ðJCð ðJCð Lð	JCð
 ðJCð ðJCð ðJCð ˜D ™KÑ'¨$Ñ.ðJCð ˜4 ™;Ñ&¨Ñ-ðJCð ˜jÑ(¨4Ñ/ðJCð ˜$‘JðJCð ˜t™ðJCð ! 4™ZðJCð 
÷JCr,   rX   )r   rD   Útorchvision.transforms.v2r   rs   Úimage_processing_backendsr   Úimage_processing_utilsr   Úimage_utilsr   r   Úprocessing_utilsr	   r
   Úutilsr   r   r   Ú
get_loggerrO   Úloggerrf   r   Útupler+   r<   rK   rM   rX   Ú__all__rT   r,   r*   ú<module>r©      s  ðó ã Ý 7å ;Ý 2ß 9ß 4ß 8Ñ 8ð 
ˆ×	Ñ	˜HÓ	%€ð 3Ð ð3'Øð3'àð3'ð ð3'ð ð	3'ð
 ð3'ð ˆ3�ˆ8�_ó3'ðn Nð Àð Èó ðØðØ&4ðØEHðà
Ð)Ñ*óô  °Uõ ñ  ÐCÔDôJCÐ-ó JCó EðJCðZ "Ð
"�r,   