§
    ‚Štj:6  ã                   ó8  — 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j        e¦  «        Z G d„ de	d¬¦  «        Ze ed¬¦  «         G d„ de
¦  «        ¦   «         ¦   «         ZdgZdS )é    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                   ó6   — e Zd ZU eed<   dddœddii ddidœZdS )Ú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© ó    új/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/gemma4/processing_gemma4.pyr   r   "   sS   € € € € € € Ø-Ð-Ð-Ñ-ð Ø(,ð
ð 
ð
 ˜dð
ð Ø+¨TÐ2ð
ð 
€I€I€Ir%   r   F)Útotal)Úvision)Úbackendsc                   óž  ‡ — 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        | _        |                     ddgi¦  «         d| _        |                     | j        ¦  «        | _        || _	        || _
        t          |dd¦  «        | _        t          |dd¦  «        | _        t          |dd¦  «        | _        t          |dd¦  «        | _         t!          ¦   «         j        d	|||||dœ|	¤Ž dS )
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_idr0   r1   Úgetattrr4   r5   r6   r7   ÚsuperÚ__init__)Úselfr8   r9   r:   r;   r<   r/   r0   r1   ÚkwargsÚ	__class__s             €r&   rG   zGemma4Processor.__init__6   s!  ø€ ð. !1ˆÔØ'Ô6ˆÔØ"Ô,ˆŒØ"Ô,ˆŒØ$Ô0ˆÔð 	×$Ò$Ð&AÀKÀ=Ð%QÑRÔRÐRØ&ˆÔØ'×=Ò=¸dÔ>NÑOÔOˆÔð !1ˆÔð #5ˆÔÝ% iÐ1AÀ4ÑHÔHˆÔÝ" 9¨m¸TÑBÔBˆÔÝ  ¨K¸Ñ>Ô>ˆŒÝ  ¨K¸Ñ>Ô>ˆŒà�‰ŒÔð 	
Ø/Ø+ØØ+Ø'ð	
ð 	
ð ð	
ð 	
ð 	
ð 	
ð 	
r%   ÚimagesÚtextÚvideosÚaudioc                 óÖ   •‡ —  t          ¦   «         j        d||||dœ|¤Ž\  }}}}|�t          |¦  «        }|r|sˆ fd„|D ¦   «         }|r|s‰ j        gt	          |¦  «        z  }||||fS )N)rK   rL   rM   rN   c                 óf   •— g | ]-}d                       ‰j        gt          |¦  «        z  ¦  «        ‘Œ.S ©ú )Újoinr@   Úlen)Ú.0Ú
image_listrH   s     €r&   ú
<listcomp>z9Gemma4Processor.prepare_inputs_layout.<locals>.<listcomp>€   s6   ø€ Ð\Ð\Ð\Àz�C—H’H˜dÔ.Ð/µ#°j±/´/ÑAÑBÔBÐ\Ð\Ð\r%   r$   )rF   Úprepare_inputs_layoutr   r5   rT   )rH   rK   rL   rM   rN   rI   rJ   s   `     €r&   rX   z%Gemma4Processor.prepare_inputs_layoutn   s¹   øø€ ð 'D¥e¡g¤gÔ&Cð '
Ø ¨V¸5ð'
ð '
ØDJð'
ð '
Ñ#ˆ��f˜eð
 ÐÝ/°Ñ7Ô7ˆFð ð 	]˜$ð 	]Ø\Ð\Ð\Ð\ÐU[Ð\Ñ\Ô\ˆDØð 	3˜ð 	3ØÔ$Ð%­¨E©
¬
Ñ2ˆDà�t˜V UÐ*Ð*r%   rI   c                 óf  •‡ —  t          ¦   «         j        d||dœ|¤Ž |€|€t          d¦  «        ‚|�‰ j        �‰ j        �‰ j        €t          d¦  «        ‚|�Óˆ fd„|D ¦   «         }|�Št          |¦  «        t          |¦  «        k    r0t          dt          |¦  «        › dt          |¦  «        › d�¦  «        ‚d„ |D ¦   «         }||k    r&t          d	‰ j        › d
|› d‰ j        › d|› d�	¦  «        ‚d S |€9t          |¦  «        r,t          dt          |¦  «        › d‰ j        › d�¦  «        ‚d S d S d S )N)rK   rL   z+You must provide either `text` or `images`.zUAudio inputs were provided, but the tokenizer does not have an `audio_token` defined.c                 óD   •— g | ]}|                      ‰j        ¦  «        ‘ŒS r$   )Úcountr@   )rU   ÚsamplerH   s     €r&   rW   z3Gemma4Processor.validate_inputs.<locals>.<listcomp>—   s(   ø€ ÐRÐRÐRÀ6 §¢¨TÔ-=Ñ >Ô >ÐRÐRÐRr%   z1Received inconsistently sized batches of images (z) and text (z).c                 ó,   — g | ]}t          |¦  «        ‘ŒS r$   )rT   )rU   Úsublists     r&   rW   z3Gemma4Processor.validate_inputs.<locals>.<listcomp>ž   s   € Ð%IÐ%IÐ%I°w¥c¨'¡l¤lÐ%IÐ%IÐ%Ir%   zThe total number of zP tokens in the prompts should be the same as the number of images passed. Found rR   z tokens and z images per sample.zFound z. tokens in the text but no images were passed.r$   )
rF   Úvalidate_inputsÚ
ValueErrorr5   r6   r7   rT   r@   ÚanyÚsum)	rH   rK   rL   rM   rN   rI   Ún_images_in_textÚn_images_in_imagesrJ   s	   `       €r&   r_   zGemma4Processor.validate_inputs†   sÊ  øø€ ð 	 �‰ŒÔÐC v°DÐCÐC¸FÐCÐCÐCàˆ<˜F˜NÝÐJÑKÔKÐKàÐ Ô!1Ð!9¸T¼^Ð=SÐW[ÔWeÐWmÝÐtÑuÔuÐuàÐØRÐRÐRÐRÈTÐRÑRÔRÐØÐ!Ý�v‘;”;¥# d¡)¤)Ò+Ð+Ý$ØrÍCÐPVÉKÌKÐrÐrÕehÐimÑenÔenÐrÐrÐrñô ð ð &JÐ%IÀ&Ð%IÑ%IÔ%IÐ"Ø#Ð'9Ò9Ð9Ý$ð{¨tÔ/?ð {ð {Ø"2ð{ð {Ø59Ô5Eð{ð {ØSeð{ð {ð {ñô ð ð :Ð9ð
 �¥CÐ(8Ñ$9Ô$9�Ý Øu�SÐ!1Ñ2Ô2ÐuÐu°TÔ5EÐuÐuÐuñô ð ð Ðð  ���r%   Úimage_inputsÚ	image_idxÚreturnc                 óR   — |d         |         }| j         › | j        |z  › | j        › �S )NÚnum_soft_tokens_per_image)r>   r@   r?   )rH   re   rf   Únum_soft_tokenss       r&   Úreplace_image_tokenz#Gemma4Processor.replace_image_token©   s4   € Ø&Ð'BÔCÀIÔNˆØ”.ÐV $Ô"2°_Ñ"DÐVÀdÄnÐVÐVÐVr%   Úvideo_inputsÚ	video_idxc                 ó  ‡ ‡— |d         |         Š|d         |         }|j         €t                               d¦  «         |j         €dn|j         |_         d„ |j        D ¦   «         }d                     ˆˆ fd„|D ¦   «         ¦  «        }|S )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.é   c                 ó`   — g | ]+}t          |d z  ¦  «        d›dt          |d z  ¦  «        d›�‘Œ,S )é<   Ú02dú:)Úint)rU   Úsecondss     r&   rW   z7Gemma4Processor.replace_video_token.<locals>.<listcomp>º   sE   € ÐpÐpÐpÐQX�C ¨2¡Ñ.Ô.ÐLÐLÐLµS¸À2¹Ñ5FÔ5FÐLÐLÐLÐpÐpÐpr%   rR   c                 óJ   •— g | ]}|› d ‰j         › ‰j        ‰z  › ‰j        › �‘Œ S rQ   )r>   rB   r?   )rU   Útrj   rH   s     €€r&   rW   z7Gemma4Processor.replace_video_token.<locals>.<listcomp>¼   s>   ø€ ÐpÐpÐpÐ]^�ÐXÐX�D”NÐX DÔ$4°Ñ$FÐXÈÌÐXÐXÐpÐpÐpr%   )ÚfpsÚloggerÚwarning_onceÚ
timestampsrS   )rH   rl   rm   ÚmetadataÚtimestamp_strÚvideo_replacementrj   s   `     @r&   Úreplace_video_tokenz#Gemma4Processor.replace_video_token­   s±   øø€ Ø&Ð'BÔCÀIÔNˆØÐ 0Ô1°)Ô<ˆàŒ<ÐÝ×Òðeñô ð ð
 &œ\Ð1�r�r°x´|ˆŒð qÐpÐ\dÔ\oÐpÑpÔpˆØŸHšHØpÐpÐpÐpÐpÐboÐpÑpÔpñ
ô 
Ðð !Ð r%   Úaudio_inputsÚ	audio_idxc                 ó2  — |d         |         }t          |¦  «        }t          d¦  «        D ]2}|dz   dz
  dz  dz   }|d d d…         d |…         }t          |¦  «        }Œ3| j        › | j        t	          |                     ¦   «         ¦  «        z  › | j        › �S )NÚinput_features_maské   r   r   )rT   Úranger6   r5   rv   rb   r7   )rH   r‚   rƒ   Úmaskry   Ú_Út_outs          r&   Úreplace_audio_tokenz#Gemma4Processor.replace_audio_tokenÀ   s    € àÐ1Ô2°9Ô=ˆõ �‰IŒIˆÝ�q‘”ð 	ð 	ˆAØ˜‘U˜Q‘Y 1Ñ$ qÑ(ˆEØ˜˜˜!˜”9˜V˜e˜VÔ$ˆDÝ�D‘	”	ˆAˆAà”.ÐV $Ô"2µS¸¿º¹¼±_´_Ñ"DÐVÀdÄnÐVÐVÐVr%   c                 óâ  ‡ ‡— t           j                             di ¦  «        }|                     |¦  «         |                     dd¦  «        p‰ j        j        }|                     dd¦  «        p‰ j        j        }|                     dd¦  «        p‰ j        j        }||dz  z  }i }	|�}g }
|D ]M}t          |d         |d         |||¬	¦  «        \  }}||z  }||z  }|
 	                    ||z  |dz  z  ¦  «         ŒNdgt          |¦  «        z  }|	                     |
|d
œ¦  «         |�<t          ‰ j        dd¦  «        Šˆˆ fd„|D ¦   «         }|	                     d|i¦  «         t          di |	¤ŽS )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€>  c                 ó`   •— g | ]*}‰                      t          j        |¦  «        ‰¦  «        ‘Œ+S r$   )Ú_compute_audio_num_tokensÚnpÚzeros)rU   Úlengthr•   rH   s     €€r&   rW   z>Gemma4Processor._get_num_multimodal_tokens.<locals>.<listcomp>ý   s@   ø€ ð  ð  ð  ØTZ�×.Ò.­r¬x¸Ñ/?Ô/?ÀÑOÔOð ð  ð  r%   Únum_audio_tokensr$   )r   r#   ÚgetÚupdater9   r�   rŽ   r�   r   ÚappendrT   rE   r8   r   )rH   Úimage_sizesÚaudio_lengthsrI   r   r�   rŽ   r�   r’   Úvision_datar“   Ú
image_sizeÚtarget_hÚtarget_wÚpatch_heightÚpatch_widthr”   r›   r•   s   `                 @r&   Ú_get_num_multimodal_tokensz*Gemma4Processor._get_num_multimodal_tokensÍ   sç  øø€ õ  .Ô7×;Ò;¸OÈRÑPÔPˆØ×Ò˜VÑ$Ô$Ð$Ø"×&Ò& |°TÑ:Ô:Ð]¸dÔ>RÔ>]ˆ
à×ÒÐ3°TÑ:Ô:Ðf¸dÔ>RÔ>fð 	ð (×+Ò+Ð,=¸tÑDÔDÐlÈÔH\ÔHlˆà%Ð(;¸QÑ(>Ñ>ˆàˆØÐ"Ø!ÐØ)ð 
^ð 
^�
Ý%EØ% aœ=Ø$ Qœ-Ø)Ø +Ø(;ð&ñ &ô &Ñ"�˜(ð  (¨:Ñ5�Ø&¨*Ñ4�Ø ×'Ò'¨°{Ñ(BÐFYÐ[\ÑF\Ñ(\Ñ]Ô]Ð]Ð]à!" ¥c¨+Ñ&6Ô&6Ñ 6ÐØ×ÒÐ4DÐ[lÐmÐmÑnÔnÐnàÐ$õ $ DÔ$:¸OÈVÑTÔTˆMð ð  ð  ð  ð  Ø^kð ñ  ô  Ðð ×ÒÐ 2Ð4DÐEÑFÔFÐFåÐ,Ð, Ð,Ð,Ð,r%   r•   c                 ó   — t          |¦  «        }| j        j        dz   }| j        j        dz  }||z   |z
  | j        j        z  dz   }|dk    rdS 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   )rT   r8   Úframe_lengthÚ
hop_lengthr‡   Úminr0   )rH   Úaudio_waveformr•   Únum_samplesÚframe_size_for_unfoldÚpad_leftÚnum_mel_framesÚsscp_num_layersÚsscp_kernelÚsscp_strideÚsscp_paddingry   r‰   s                r&   r—   z)Gemma4Processor._compute_audio_num_tokens  sË   € õ ˜.Ñ)Ô)ˆð !%Ô 6Ô CÀaÑ GÐØÔ)Ô6¸!Ñ;ˆØ%¨Ñ0Ð3HÑHÈTÔMcÔMnÑnÐqrÑrˆØ˜QÒÐØ�1ð ˆØ18Ñ.ˆ�[ ,ØˆÝ�Ñ'Ô'ð 	Hð 	HˆAà�Q˜Ñ%Ñ%¨Ñ3¸ÑCÀaÑGˆAˆAõ �1�dÔ+Ñ,Ô,Ð,r%   c                 ó2   •— t          ¦   «         j        dgz   S )NÚmm_token_type_ids)rF   Úmodel_input_names)rH   rJ   s    €r&   r·   z!Gemma4Processor.model_input_names,  s   ø€ å‰wŒwÔ(Ð,?Ð+@Ñ@Ð@r%   c                 ó
   — ddgS )Nri   ro   r$   )rH   s    r&   Úunused_input_namesz"Gemma4Processor.unused_input_names0  s   € à+Ð-HÐIÐIr%   )Nr,   r-   r.   )NNNN)NN)r   r    r!   r   Úvalid_processor_kwargsrv   rG   r   r   r   Úlistr   r   rX   r
   r   r_   ÚdictÚstrrk   r�   r‹   r§   r—   Úpropertyr·   r¹   Ú__classcell__)rJ   s   @r&   r+   r+   1   s�  ø€ € € € € ð 3Ðð Ø #Ø #Ø"$ð6
ð 6
ð ð6
ð ð6
ð  ð6
ð 6
ð 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°ð WÀð WÈð Wð Wð Wð Wð5-ð 5-ð 5-ð 5-ðn&-Àsð &-Èsð &-ð &-ð &-ð &-ðP ðAð Að Að Añ „XðAð ðJ D¨¤Ið Jð Jð Jñ „XðJð Jð Jð 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   r{   r   r+   Ú__all__r$   r%   r&   ú<module>rË      sš  ðð  Ð Ð Ð à %Ð %Ð %Ð %Ð %Ð %Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ *Ð *Ð *Ð *Ð *Ð *Ø %Ð %Ð %Ð %Ð %Ð %ð ÐÑÔð fØeÐeÐeÐeÐeÐeÐeÐeð 
ˆÔ	˜HÑ	%Ô	%€ðð ð ð ð Ð,°Eð ñ ô ð ð Ø	€�;ÐÑÔðJð Jð Jð Jð J�nñ Jô Jñ  Ôñ „ðJðD Ð
€€€r%   