Ë
    ÛÓ^jX%  ã                   ó”   — d dl ZddlmZmZmZ ddlmZmZ  ej                  e
«      Z G d„ ded¬«      Ze G d	„ d
e«      «       Zd
gZy)é    Né   )ÚMultiModalDataÚProcessingKwargsÚProcessorMixin)Úauto_docstringÚloggingc                   ó"   — e Zd ZddddœddidœZy)ÚGlm4vProcessorKwargsFT)ÚpaddingÚreturn_token_type_idsÚreturn_mm_token_type_idsÚreturn_metadata)Útext_kwargsÚvideos_kwargsN)Ú__name__Ú
__module__Ú__qualname__Ú	_defaults© ó    úu/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/glm4v/processing_glm4v.pyr
   r
      s#   „ ð Ø%*Ø(,ñ
ð
 ,¨TÐ2ñ�Ir   r
   F)Útotalc                   óœ   ‡ — e Zd ZeZdˆ 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d
„Zeˆ fd„«       Zdedeee      fd„Zddefd„Zˆ xZS )ÚGlm4vProcessorc                 óä  •— t        |d«      sdn|j                  | _        t        |d«      sdn|j                  | _        t        |dd «      r|j                  n|j                  | j                  «      | _        t        |dd «      r|j                  n|j                  | j                  «      | _        t        ‰| �!  ||||¬«       |j                  d«      | _	        |j                  d	«      | _
        y )
NÚimage_tokenz	<|image|>Úvideo_tokenz	<|video|>Úimage_token_idÚvideo_token_id)Úchat_templatez<|begin_of_video|>z<|end_of_video|>)Úhasattrr   r   Úgetattrr   Úconvert_tokens_to_idsr   ÚsuperÚ__init__Úvideo_start_idÚvideo_end_id)ÚselfÚimage_processorÚ	tokenizerÚvideo_processorr    ÚkwargsÚ	__class__s         €r   r%   zGlm4vProcessor.__init__-   sä   ø€ Ü.5°iÀÔ.O™;ÐU^×UjÑUjˆÔÜ.5°iÀÔ.O™;ÐU^×UjÑUjˆÔô �yÐ"2°DÔ9ð ×$Ò$à×0Ñ0°×1AÑ1AÓBð 	Ôô �yÐ"2°DÔ9ð ×$Ò$à×0Ñ0°×1AÑ1AÓBð 	Ôô
 	‰Ñ˜¨)°_ÐTaÐÔbØ'×=Ñ=Ð>RÓSˆÔØ%×;Ñ;Ð<NÓOˆÕr   Úimage_inputsÚ	image_idxÚreturnc                 ó„   — | j                   j                  dz  }|d   |   j                  «       |z  }| j                  |z  S )Né   Úimage_grid_thw)r)   Ú
merge_sizeÚprodr   )r(   r.   r/   Úmerge_lengthÚnum_image_tokenss        r   Úreplace_image_tokenz"Glm4vProcessor.replace_image_token>   sI   € Ø×+Ñ+×6Ñ6¸Ñ9ˆØ'Ð(8Ñ9¸)ÑD×IÑIÓKÈ|Ñ[ÐØ×ÑÐ"2Ñ2Ð2r   Úvideo_inputsÚ	video_idxc                 ól  — | j                   j                  dz  }|d   |   d   }|d   |   j                  «       |z  |z  }|d   |   }d}|j                  €t        j                  d«       |j                  €dn|j                  |_        |j                  d d d…   }g }	t        dt        |«      «      D ]  }
|	j                  ||
   «       Œ |	d | }t        |«      |k  r'|j                  |r|d   nd«       t        |«      |k  rŒ't        |«      D ]  }||   }| j                  ||¬	«      }||z  }Œ! |S )
Nr2   Úvideo_grid_thwr   Úvideo_metadataÚ a  GLM4V 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.é   éÿÿÿÿ)r7   )r+   r4   r5   ÚfpsÚloggerÚwarning_onceÚ
timestampsÚrangeÚlenÚappendÚreplace_frame_token_id)r(   r9   r:   r6   Ú
num_framesr7   ÚmetadataÚvideo_structurerD   Úunique_timestampsÚidxÚselected_timestampsÚ	frame_idxÚtimestamp_secÚframe_structures                  r   Úreplace_video_tokenz"Glm4vProcessor.replace_video_tokenC   sr  € Ø×+Ñ+×6Ñ6¸Ñ9ˆØ!Ð"2Ñ3°IÑ>¸qÑAˆ
Ø'Ð(8Ñ9¸)ÑD×IÑIÓKÈ|Ñ[Ð_iÑiÐØÐ 0Ñ1°)Ñ<ˆØˆà�<‰<ÐÜ×Ñðeôð
 &Ÿ\™\Ð1‘r°x·|±|ˆŒØ×(Ñ(©¨1¨Ñ-ˆ
àÐÜ˜œC 
›OÓ,ò 	6ˆCØ×$Ñ$ Z°¡_Õ5ð	6ð 0°°Ð<ÐÜÐ%Ó&¨Ò3Ø×&Ñ&ÑBUÐ':¸2Ò'>Ð[\Ô]ô Ð%Ó&¨Ó3ô ˜zÓ*ò 	/ˆIØ/°	Ñ:ˆMØ"×9Ñ9¸-ÐZjÐ9ÓkˆOØ˜Ñ.‰Oð	/ð
 Ðr   c                 ó–  — i }|�¯t         j                  j                  di «      }|j                  |«       |j                  dd«      xs | j                  j
                  }|D �cg c]   } | j                  j                  g |¢|‘­Ž ‘Œ" }}|D �	cg c]
  }	|	|dz  z  ‘Œ }
}	|j                  |
|dœ«       |�vt         j                  j                  di «      }|j                  |«       |D �cg c]   } | j                  j                  g |¢|‘­Ž ‘Œ" }}|D �	cg c]
  }	|	dz  z  ‘Œ }}	||d<   t        di |¤ŽS c c}w c c}	w c c}w c c}	w )	aK  
        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.
            video_sizes (`list[list[int]]`, *optional*):
                The input sizes formatted as (num_frames, height, width) per each video.
        Returns:
            `MultiModalData`: A `MultiModalData` object holding number of tokens per each of the provided
            input modalities, along with other useful data.
        NÚimages_kwargsr4   r2   )r7   Únum_image_patchesr   Únum_video_tokensr   )
r
   r   ÚgetÚupdater)   r4   Úget_number_of_image_patchesr+   Úget_number_of_video_patchesr   )r(   Úimage_sizesÚvideo_sizesr,   Úvision_datarT   r4   Ú
image_sizerU   Únum_patchesr7   r   Ú
video_sizeÚnum_video_patchesrV   s                  r   Ú_get_num_multimodal_tokensz)Glm4vProcessor._get_num_multimodal_tokensb   s„  € ð ˆØÐ"Ü0×:Ñ:×>Ñ>¸ÐPRÓSˆMØ× Ñ  Ô(Ø&×*Ñ*¨<¸Ó>ÒaÀ$×BVÑBV×BaÑBaˆJð #.ö!àð A�×$Ñ$×@Ñ@Ð\À*Ð\ÈmÔ\ð!Ðð !ð SdÖdÀ; °
¸A±Ó!=ÐdÐÐdØ×ÑÐ4DÐ[lÑmÔnàÐ"Ü0×:Ñ:×>Ñ>¸ÐPRÓSˆMØ× Ñ  Ô(ð #.ö!àð A�×$Ñ$×@Ñ@Ð\À*Ð\ÈmÔ\ð!Ðð !ð SdÖdÀ; °
¸A±Ó!=ÐdÐÐdØ.>ˆKÐ*Ñ+äÑ, Ñ,Ð,ùò#!ùò  eùò!ùò  es   Á$%D7ÂD<Ã+%EÄEc                 óB   —  | j                   j                  |f||dœ|¤ŽS )aš  
        Post-process the output of the model to decode the text.

        Args:
            generated_outputs (`torch.Tensor` or `np.ndarray`):
                The output of the model `generate` function. The output is expected to be a tensor of shape `(batch_size, sequence_length)`
                or `(sequence_length,)`.
            skip_special_tokens (`bool`, *optional*, defaults to `True`):
                Whether or not to remove special tokens in the output. Argument passed to the tokenizer's `batch_decode` method.
            clean_up_tokenization_spaces (`bool`, *optional*, defaults to `False`):
                Whether or not to clean up the tokenization spaces. Argument passed to the tokenizer's `batch_decode` method.
            **kwargs:
                Additional arguments to be passed to the tokenizer's `batch_decode method`.

        Returns:
            `list[str]`: The decoded text.
        )Úskip_special_tokensÚclean_up_tokenization_spaces)r*   Úbatch_decode)r(   Úgenerated_outputsrd   re   r,   s        r   Úpost_process_image_text_to_textz.Glm4vProcessor.post_process_image_text_to_textˆ   s5   € ð( +ˆt�~‰~×*Ñ*Øð
à 3Ø)Eñ
ð ñ	
ð 	
r   c                 ó    •— t         ‰| �  dgz   S )NÚmm_token_type_ids)r$   Úmodel_input_names)r(   r-   s    €r   rk   z Glm4vProcessor.model_input_names£   s   ø€ ä‰wÑ(Ð,?Ð+@Ñ@Ð@r   Ú	input_idsc                 óš  — g }|D ]Ã  }t        j                  |«      }t        j                  |«      }t        j                  || j                  k(  d¬«      }t        j                  || j
                  k(  d¬«      }||kD  }d||| j                  k(  |z  <   d||| j                  k(  | z  <   |j                  |j                  «       «       ŒÅ |S )Nr   )Úaxisr2   é   )	ÚnpÚarrayÚ
zeros_likeÚcumsumr&   r'   r   rG   Útolist)	r(   rl   rj   ÚinputÚ	array_idsÚmm_token_typesÚstartsÚendsÚis_video_modalitys	            r   Úcreate_mm_token_type_idsz'Glm4vProcessor.create_mm_token_type_ids§   sÎ   € ð ÐØò 	>ˆEÜŸ™ ›ˆIÜŸ]™]¨5Ó1ˆNô
 —Y‘Y˜y¨D×,?Ñ,?Ñ?ÀaÔHˆFÜ—9‘9˜Y¨$×*;Ñ*;Ñ;À!ÔDˆDØ &¨¡ÐàUVˆN˜I¨×)<Ñ)<Ñ<Ð@QÑQÑRØXYˆN˜I¨×)<Ñ)<Ñ<ÐBSÐASÑTÑUØ×$Ñ$ ^×%:Ñ%:Ó%<Õ=ð	>ð !Ð r   r7   c                 ó>   — d| j                   |z  › dt        |«      › �S )Nz<|begin_of_image|>z<|end_of_image|>)r   Úint)r(   rP   r7   s      r   rH   z%Glm4vProcessor.replace_frame_token_id¼   s+   € Ø# D×$4Ñ$4Ð7GÑ$GÐ#HÐHXÔY\Ð]jÓYkÐXlÐmÐmr   )NNNN)NN)TF)ro   )r   r   r   r
   Úvalid_processor_kwargsr%   Údictr}   Ústrr8   rR   rb   rh   Úpropertyrk   Úlistr{   rH   Ú__classcell__)r-   s   @r   r   r   )   s”   ø„ à1ÐõPð"3°ð 3Àð 3Èó 3ð
°ð Àð Èó ó>$-ðN Y^ó
ð6 óAó ðAð!°$ð !¸4ÀÀSÁ	¹?ó !ñ*nÀc÷ nr   r   )Únumpyrp   Úprocessing_utilsr   r   r   Úutilsr   r   Ú
get_loggerr   rB   r
   r   Ú__all__r   r   r   ú<module>r‰      sb   ðó* ç PÑ Pß ,ð 
ˆ×	Ñ	˜HÓ	%€ôÐ+°5õ ð ôSn�^ó Snó ðSnðl Ð
�r   