Ë
    ÛÓ^j:6  ã                   ó  — d dl ZddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZmZ ddlmZ dd	lmZ  e«       rd
dlmZmZ  ej4                  e«      Z G d„ de	d¬«      Ze ed¬«       G d„ de
«      «       «       ZdgZy)é    Né   )Ú
AudioInput)Ú
ImageInputÚmake_nested_list_of_images)ÚMultiModalDataÚProcessingKwargsÚProcessorMixinÚUnpack)ÚPreTokenizedInputÚ	TextInput)Úauto_docstringÚis_vision_availableÚlogging)Úrequires)Ú
VideoInputé   )ÚGemma4ImageProcessorKwargsÚ get_aspect_ratio_preserving_sizec                   ó4   — e Zd ZU eed<   dddœddii ddidœZy)ÚGemma4ProcessorKwargsÚimages_kwargsT)ÚpaddingÚreturn_mm_token_type_idsÚdo_convert_rgbÚreturn_metadata)Útext_kwargsr   Úaudio_kwargsÚvideos_kwargsN)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__Ú	_defaults© ó    úw/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/gemma4/processing_gemma4.pyr   r   "   s5   … Ø-Ó-ð Ø(,ñ
ð
 ˜dð
ð Ø+¨TÐ2ñ
�Ir%   r   F)Útotal)Úvision)Úbackendsc                   óh  ‡ — e Zd ZeZ	 	 	 	 ddededefˆ fd„Z	 	 	 	 ddedz  dee	z  e
e   z  e
e	   z  ded	efˆ fd
„Z	 	 	 	 ddee
e   z  dz  dee	z  e
e   z  e
e	   z  ded	edee   f
ˆ fd„Zdededefd„Zdededefd„Zdededefd„Zdd„Zdedefd„Zeˆ fd„«       Zede
e   fd„«       Zˆ xZS )ÚGemma4ProcessorNÚimage_seq_lengthÚaudio_seq_lengthÚaudio_ms_per_tokenc	           	      óè  •— || _         |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  ddgi«       d| _        |j                  | j                  «      | _        || _	        || _
        t        |dd«      | _        t        |dd«      | _        t        |dd«      | _        t        |dd«      | _        t!        ‰
| �D  d	|||||dœ|	¤Ž y)
uÏ  
        image_seq_length (`int`, *optional*, defaults to 280):
            The number of soft tokens per image used for placeholder expansion.
        audio_seq_length (`int`, *optional*, defaults to 750):
            The maximum number of audio soft tokens per audio segment. Serves as an
            upper-bound cap when dynamic audio token counts are computed.
        audio_ms_per_token (`int`, *optional*, defaults to 40):
            Milliseconds of audio per output soft token. Used to dynamically compute
            the number of audio placeholder tokens as ``ceil(duration_ms / audio_ms_per_token)``.
            The default of 40 comes from the SSCP convolution's 4Ã— time reduction on 10ms frames.
        Úadditional_special_tokensz	<|video|>Úaudio_token_idNÚaudio_tokenÚ	boa_tokenÚ	eoa_token)Úfeature_extractorÚimage_processorÚ	tokenizerÚvideo_processorÚchat_templater$   )r,   Úimage_token_idÚ	boi_tokenÚ	eoi_tokenÚimage_tokenÚadd_special_tokensÚvideo_tokenÚconvert_tokens_to_idsÚvideo_token_idr-   r.   Úgetattrr1   r2   r3   r4   ÚsuperÚ__init__)Úselfr5   r6   r7   r8   r9   r,   r-   r.   ÚkwargsÚ	__class__s             €r&   rD   zGemma4Processor.__init__6   sþ   ø€ ð. !1ˆÔØ'×6Ñ6ˆÔØ"×,Ñ,ˆŒØ"×,Ñ,ˆŒØ$×0Ñ0ˆÔð 	×$Ñ$Ð&AÀKÀ=Ð%QÔRØ&ˆÔØ'×=Ñ=¸d×>NÑ>NÓOˆÔð !1ˆÔð #5ˆÔÜ% iÐ1AÀ4ÓHˆÔÜ" 9¨m¸TÓBˆÔÜ  ¨K¸Ó>ˆŒÜ  ¨K¸Ó>ˆŒä‰Ñð 	
Ø/Ø+ØØ+Ø'ñ	
ð ó	
r%   ÚimagesÚtextÚvideosÚaudioc           	      ó  •— t        ‰| �  d||||dœ|¤Ž\  }}}}|�t        |«      }|r7|s5|D �cg c]*  }dj                  | j                  gt        |«      z  «      ‘Œ, }}|r|s| j                  gt        |«      z  }||||fS c c}w )N)rH   rI   rJ   rK   ú r$   )rC   Úprepare_inputs_layoutr   Újoinr=   Úlenr2   )rE   rH   rI   rJ   rK   rF   Ú
image_listrG   s          €r&   rN   z%Gemma4Processor.prepare_inputs_layoutn   s«   ø€ ô ',¡gÑ&Cð '
Ø ¨V¸5ñ'
ØDJñ'
Ñ#ˆ��f˜eð
 ÐÜ/°Ó7ˆFñ ™$ØU[Ö\Àz�C—H‘H˜d×.Ñ.Ð/´#°j³/ÑAÕBÐ\ˆDÐ\Ù™Ø×$Ñ$Ð%¬¨E«
Ñ2ˆDà�t˜V UÐ*Ð*ùò	 ]s   °/BrF   c                 óˆ  •— t        ‰
| �  d||dœ|¤Ž |€|€t        d«      ‚|�| j                  �| j                  �| j
                  €t        d«      ‚|�ã|D �cg c]  }|j                  | j                  «      ‘Œ }}|�…t        |«      t        |«      k7  r$t        dt        |«      › dt        |«      › d�«      ‚|D �cg c]  }t        |«      ‘Œ }	}||	k7  r,t        d| j                  › d|› d	| j                  › d
|	› d�	«      ‚y |€1t        |«      r%t        dt        |«      › d	| j                  › d�«      ‚y y y c c}w c c}w )N)rH   rI   z+You must provide either `text` or `images`.zUAudio inputs were provided, but the tokenizer does not have an `audio_token` defined.z1Received inconsistently sized batches of images (z) and text (z).zThe total number of zP tokens in the prompts should be the same as the number of images passed. Found rM   z tokens and z images per sample.zFound z. tokens in the text but no images were passed.r$   )rC   Úvalidate_inputsÚ
ValueErrorr2   r3   r4   Úcountr=   rP   ÚanyÚsum)rE   rH   rI   rJ   rK   rF   ÚsampleÚn_images_in_textÚsublistÚn_images_in_imagesrG   s             €r&   rS   zGemma4Processor.validate_inputs†   s‘  ø€ ô 	‰ÑÐC v°DÑC¸FÒCàˆ<˜F˜NÜÐJÓKÐKàÐ ×!1Ñ!1Ð!9¸T¿^¹^Ð=SÐW[×WeÑWeÐWmÜÐtÓuÐuàÐØMQÖRÀ6 §¡¨T×-=Ñ-=Õ >ÐRÐÐRØÐ!Ü�v“;¤# d£)Ò+Ü$ØKÌCÐPVËKÈ=ÐXdÔehÐimÓenÐdoÐoqÐróð ð CIÖ%I°w¤c¨'¥lÐ%IÐ"Ð%IØ#Ð'9Ò9Ü$Ø.¨t×/?Ñ/?Ð.@ð A"Ø"2Ð!3°1°T×5EÑ5EÐ4FÀlÐSeÐRfÐfyð{óð ð :ð
 �¤CÐ(8Ô$9Ü ØœSÐ!1Ó2Ð3°1°T×5EÑ5EÐ4FÐFtÐuóð ð %:�ð ùÚRùò &Js   Á"D:Â?D?Úimage_inputsÚ	image_idxÚreturnc                 ód   — |d   |   }| j                   › | j                  |z  › | j                  › �S )NÚnum_soft_tokens_per_image)r;   r=   r<   )rE   r\   r]   Únum_soft_tokenss       r&   Úreplace_image_tokenz#Gemma4Processor.replace_image_token©   s;   € Ø&Ð'BÑCÀIÑNˆØ—.‘.Ð! $×"2Ñ"2°_Ñ"DÐ!EÀdÇnÁnÐEUÐVÐVr%   Úvideo_inputsÚ	video_idxc           
      ó¼  — |d   |   }|d   |   }|j                   €t        j                  d«       |j                   €dn|j                   |_         |j                  D �cg c]#  }t	        |dz  «      d›dt	        |dz  «      d›�‘Œ% }}dj                  |D �cg c].  }|› d| j                  › | j                  |z  › | j                  › �‘Œ0 c}«      }|S c c}w c c}w )	NÚnum_soft_tokens_per_videoÚvideo_metadataa  Gemma4 requires frame timestamps to construct prompts, but the `fps` of the input video could not be inferred. Probably `video_metadata` was missing from inputs and you passed pre-sampled frames. Defaulting to `fps=24`. Please provide `video_metadata` for more accurate results.é   é<   Ú02dú:rM   )	ÚfpsÚloggerÚwarning_onceÚ
timestampsÚintrO   r;   r?   r<   )	rE   rc   rd   ra   ÚmetadataÚsecondsÚtimestamp_strÚtÚvideo_replacements	            r&   Úreplace_video_tokenz#Gemma4Processor.replace_video_token­   sñ   € Ø&Ð'BÑCÀIÑNˆØÐ 0Ñ1°)Ñ<ˆà�<‰<ÐÜ×Ñðeôð
 &Ÿ\™\Ð1‘r°x·|±|ˆŒð ]e×\oÑ\oÖpÐQXœC ¨2¡Ó.¨sÐ3°1´S¸À2¹Ó5FÀsÐ4KÒLÐpˆÐpØŸH™HØboÖpÐ]^�ˆs�!�D—N‘NÐ# D×$4Ñ$4°Ñ$FÐ#GÈÏÉÐGWÒXÒpó
Ðð !Ð ùò	 qùâps   Á(CÂ3CÚaudio_inputsÚ	audio_idxc                 ó  — |d   |   }t        |«      }t        d«      D ]&  }|dz   dz
  dz  dz   }|d d d…   d | }t        |«      }Œ( | j                  › | j                  t	        |j                  «       «      z  › | j                  › �S )NÚinput_features_maské   r   r   )rP   Úranger3   r2   rp   rW   r4   )rE   rw   rx   Úmaskrt   Ú_Út_outs          r&   Úreplace_audio_tokenz#Gemma4Processor.replace_audio_tokenÀ   s™   € àÐ1Ñ2°9Ñ=ˆô �‹IˆÜ�q“ò 	ˆAØ˜‘U˜Q‘Y 1Ñ$ qÑ(ˆEØ™˜!˜‘9˜V˜eÐ$ˆDÜ�D“	‰Að	ð
 —.‘.Ð! $×"2Ñ"2´S¸¿¹»³_Ñ"DÐ!EÀdÇnÁnÐEUÐVÐVr%   c                 ó&  — t         j                  j                  di «      }|j                  |«       |j                  dd«      xs | j                  j
                  }|j                  dd«      xs | j                  j                  }|j                  dd«      xs | j                  j                  }||dz  z  }i }	|�ig }
|D ]?  }t        |d   |d   |||¬	«      \  }}||z  }||z  }|
j                  ||z  |dz  z  «       ŒA dgt        |«      z  }|	j                  |
|d
œ«       |�\t        | j                  dd«      }|D �cg c]'  }| j                  t        j                  |«      |«      ‘Œ) }}|	j                  d|i«       t!        di |	¤ŽS c c}w )av  
        Computes the number of placeholder tokens needed for multimodal inputs with the given sizes.

        Args:
            image_sizes (`list[list[int]]`, *optional*):
                The input sizes formatted as (height, width) per each image.
            audio_lengths (`list[int]`, *optional*):
                The lengths of audio inputs in number of samples. Used to dynamically
                compute per-audio token counts.

        Returns:
            `MultiModalData`: A `MultiModalData` object holding number of tokens per each of the provided
            input modalities, along with other useful data.
        r   Ú
patch_sizeNÚpooling_kernel_sizeÚmax_soft_tokensr{   r   r   )ÚheightÚwidthr‚   Úmax_patchesrƒ   )Únum_image_tokensÚnum_image_patchesÚsampling_ratei€>  Únum_audio_tokensr$   )r   r#   ÚgetÚupdater6   r‚   rƒ   r„   r   ÚappendrP   rB   r5   Ú_compute_audio_num_tokensÚnpÚzerosr   )rE   Úimage_sizesÚaudio_lengthsrF   r   r‚   rƒ   r„   r‡   Úvision_datarˆ   Ú
image_sizeÚtarget_hÚtarget_wÚpatch_heightÚpatch_widthr‰   rŠ   Úlengthr‹   s                       r&   Ú_get_num_multimodal_tokensz*Gemma4Processor._get_num_multimodal_tokensÍ   sÇ  € ô  .×7Ñ7×;Ñ;¸OÈRÓPˆØ×Ñ˜VÔ$Ø"×&Ñ& |°TÓ:Ò]¸d×>RÑ>R×>]Ñ>]ˆ
à×ÑÐ3°TÓ:Òf¸d×>RÑ>R×>fÑ>fð 	ð (×+Ñ+Ð,=¸tÓDÒlÈ×H\ÑH\×HlÑHlˆà%Ð(;¸QÑ(>Ñ>ˆàˆØÐ"Ø!ÐØ)ò 
^�
Ü%EØ% a™=Ø$ Q™-Ø)Ø +Ø(;ô&Ñ"�˜(ð  (¨:Ñ5�Ø&¨*Ñ4�Ø ×'Ñ'¨°{Ñ(BÐFYÐ[\ÑF\Ñ(\Õ]ð
^ð "# ¤c¨+Ó&6Ñ 6ÐØ×ÑÐ4DÐ[lÑmÔnàÐ$ô $ D×$:Ñ$:¸OÈVÓTˆMà^kö ØTZ�×.Ñ.¬r¯x©x¸Ó/?ÀÕOð Ðð  ð ×ÑÐ 2Ð4DÐEÔFäÑ, Ñ,Ð,ùò s   Å,FrŠ   c                 óN  — t        |«      }| j                  j                  dz   }| j                  j                  dz  }||z   |z
  | j                  j                  z  dz   }|dk  ryd}d\  }}	}
|}t	        |«      D ]  }|d|
z  z   |z
  |	z  dz   }Œ t        || j                  «      S )a   Number of audio soft tokens, replicating the encoder's seq-length arithmetic.

        Mirrors Gemma4AudioFeatureExtractor mel framing + the two stride-2 Conv2d
        subsampling layers in Gemma4AudioSubSampleConvProjection, capped at
        ``audio_seq_length``. Must match ``audio_mask.sum()`` from the audio tower or
        vLLM's ``_merge_multimodal_embeddings`` will raise on a length mismatch.

        Args:
            audio_waveform: A 1-D array or list containing the raw audio samples.
            sampling_rate: The sampling rate of the audio waveform in Hz.

        Returns:
            The number of audio soft tokens to insert as placeholders.
        r   r{   r   )r   r{   r   )rP   r5   Úframe_lengthÚ
hop_lengthr|   Úminr-   )rE   Úaudio_waveformrŠ   Únum_samplesÚframe_size_for_unfoldÚpad_leftÚnum_mel_framesÚsscp_num_layersÚsscp_kernelÚsscp_strideÚsscp_paddingrt   r~   s                r&   r�   z)Gemma4Processor._compute_audio_num_tokens  sÐ   € ô ˜.Ó)ˆð !%× 6Ñ 6× CÑ CÀaÑ GÐØ×)Ñ)×6Ñ6¸!Ñ;ˆØ%¨Ñ0Ð3HÑHÈT×McÑMc×MnÑMnÑnÐqrÑrˆØ˜QÒØð ˆØ18Ñ.ˆ�[ ,ØˆÜ�Ó'ò 	HˆAà�Q˜Ñ%Ñ%¨Ñ3¸ÑCÀaÑG‰Að	Hô
 �1�d×+Ñ+Ó,Ð,r%   c                 ó    •— t         ‰| �  dgz   S )NÚmm_token_type_ids)rC   Úmodel_input_names)rE   rG   s    €r&   r«   z!Gemma4Processor.model_input_names,  s   ø€ ä‰wÑ(Ð,?Ð+@Ñ@Ð@r%   c                 ó
   — ddgS )Nr`   rf   r$   )rE   s    r&   Úunused_input_namesz"Gemma4Processor.unused_input_names0  s   € à+Ð-HÐIÐIr%   )Ni  iî  é(   )NNNN)NN)r   r    r!   r   Úvalid_processor_kwargsrp   rD   r   r   r   Úlistr   r   rN   r
   r   rS   ÚdictÚstrrb   rv   r€   r›   r�   Úpropertyr«   r­   Ú__classcell__)rG   s   @r&   r+   r+   1   s°  ø„ ð 3Ðð Ø #Ø #Ø"$ñ6
ð ð6
ð ð6
ð  õ6
ðt %)ØZ^Ø!Ø ñ+à˜TÑ!ð+ð Ð+Ñ+¨d°9©oÑ=ÀÐEVÑ@WÑWð+ð ð	+ð
 õ+ð4 8<ØZ^Ø!Ø ñ!à˜T *Ñ-Ñ-°Ñ4ð!ð Ð+Ñ+¨d°9©oÑ=ÀÐEVÑ@WÑWð!ð ð	!ð
 ð!ð Ð)Ñ*õ!ðFW°ð WÀð WÈó Wð!°ð !Àð !Èó !ð&W°ð WÀð WÈó Wó5-ðn&-Àsð &-Èsó &-ðP óAó ðAð ðJ D¨¡Iò Jó ôJr%   r+   ) Únumpyr�   Úaudio_utilsr   Úimage_utilsr   r   Úprocessing_utilsr   r   r	   r
   Útokenization_utils_baser   r   Úutilsr   r   r   Úutils.import_utilsr   Úvideo_utilsr   Úimage_processing_gemma4r   r   Ú
get_loggerr   rm   r   r+   Ú__all__r$   r%   r&   ú<module>rÀ      sŒ   ðó  å %ß Aß XÓ Xß Cß AÑ AÝ *Ý %ñ Ôßeð 
ˆ×	Ñ	˜HÓ	%€ôÐ,°Eõ ð Ù	�;ÔôJ�nó Jó  ó ðJðD Ð
�r%   