

'''simple docstring'''

import json
import os
import tempfile

from transformers.testing_utils import check_json_file_has_correct_format, require_torch, require_vision
from transformers.utils import is_torch_available, is_vision_available


if is_torch_available():
						import numpy as np
						import torch

if is_vision_available():
						from PIL import Image

def      __magic_name__							(			A       , A=False       , A=False       , A=False				)      ->		List[Any]:
	assert not (numpify and torchify), "You cannot specify both numpy and PyTorch tensors at the same time"

	snake_case							=					[]
	for i in range(image_processor_tester.batch_size				):
		if equal_resolution:
			snake_case							=					snake_case							=					image_processor_tester.max_resolution
		else:
			# To avoid getting image width/height 0
			snake_case							=					image_processor_tester.min_resolution
			if getattr(A       , 'size_divisor'       , A				):
				# If `size_divisor` is defined, the image needs to have width/size >= `size_divisor`
				snake_case							=					max(image_processor_tester.size_divisor       , A				)
			snake_case			,			snake_case							=					np.random.choice(np.arange(A       , image_processor_tester.max_resolution				)       , 2				)
		image_inputs.append(
		    np.random.randint(2_5_5       , size=(image_processor_tester.num_channels, width, height)       , dtype=np.uinta				)				)

	if not numpify and not torchify:
		# PIL expects the channel dimension as last dimension
		snake_case							=					[Image.fromarray(np.moveaxis(A       , 0       , -1				)				) for image in image_inputs]

	if torchify:
		snake_case							=					[torch.from_numpy(A				) for image in image_inputs]

	return image_inputs

def      __magic_name__							(			A       , A=1_0       , A=1_0       , A=False       , A=False				)      ->		List[Any]:
	snake_case							=					[]
	for i in range(image_processor_tester.num_frames				):
		video.append(np.random.randint(2_5_5       , size=(image_processor_tester.num_channels, width, height)       , dtype=np.uinta				)				)

	if not numpify and not torchify:
		# PIL expects the channel dimension as last dimension
		snake_case							=					[Image.fromarray(np.moveaxis(A       , 0       , -1				)				) for frame in video]

	if torchify:
		snake_case							=					[torch.from_numpy(A				) for frame in video]

	return video

def      __magic_name__							(			A       , A=False       , A=False       , A=False				)      ->		Union[str, Any]:
	assert not (numpify and torchify), "You cannot specify both numpy and PyTorch tensors at the same time"

	snake_case							=					[]
	for i in range(image_processor_tester.batch_size				):
		if equal_resolution:
			snake_case							=					snake_case							=					image_processor_tester.max_resolution
		else:
			snake_case			,			snake_case							=					np.random.choice(
			    np.arange(image_processor_tester.min_resolution       , image_processor_tester.max_resolution				)       , 2				)
			snake_case							=					prepare_video(
			    image_processor_tester=A       , width=A       , height=A       , numpify=A       , torchify=A       , )
		video_inputs.append(A				)

	return video_inputs







class lowerCamelCase   :
				snake_case_							     = None

				def 					_lowerCamelCase    (       self )    ->							Dict:
					snake_case							=					self.image_processing_class(**self.image_processor_dict )
					snake_case							=					json.loads(image_processor.to_json_string() )
					for key, value in self.image_processor_dict.items():
						self.assertEqual(obj[key],						lowercase_ )

				def 					_lowerCamelCase    (       self )    ->							Optional[Any]:
					snake_case							=					self.image_processing_class(**self.image_processor_dict )

					with tempfile.TemporaryDirectory() as tmpdirname:
						snake_case							=					os.path.join(lowercase_,						'image_processor.json' )
						image_processor_first.to_json_file(lowercase_ )
						snake_case							=					self.image_processing_class.from_json_file(lowercase_ )

					self.assertEqual(image_processor_second.to_dict(),						image_processor_first.to_dict() )

				def 					_lowerCamelCase    (       self )    ->							Dict:
					snake_case							=					self.image_processing_class(**self.image_processor_dict )

					with tempfile.TemporaryDirectory() as tmpdirname:
						snake_case							=					image_processor_first.save_pretrained(lowercase_ )[0]
						check_json_file_has_correct_format(lowercase_ )
						snake_case							=					self.image_processing_class.from_pretrained(lowercase_ )

					self.assertEqual(image_processor_second.to_dict(),						image_processor_first.to_dict() )

				def 					_lowerCamelCase    (       self )    ->							Union[str, Any]:
					snake_case							=					self.image_processing_class()
					self.assertIsNotNone(lowercase_ )






				@require_torch
				@require_vision
				def 					_lowerCamelCase    (       self )    ->							Tuple:
					if self.test_cast_dtype is not None:
						# Initialize image_processor
						snake_case							=					self.image_processing_class(**self.image_processor_dict )

						# create random PyTorch tensors
						snake_case							=					prepare_image_inputs(self.image_processor_tester,						equal_resolution=lowercase_,						torchify=lowercase_ )

						snake_case							=					image_processor(lowercase_,						return_tensors='pt' )
						# for layoutLM compatiblity
						self.assertEqual(encoding.pixel_values.device,						torch.device('cpu' ) )
						self.assertEqual(encoding.pixel_values.dtype,						torch.floataa )

						snake_case							=					image_processor(lowercase_,						return_tensors='pt' ).to(torch.floataa )
						self.assertEqual(encoding.pixel_values.device,						torch.device('cpu' ) )
						self.assertEqual(encoding.pixel_values.dtype,						torch.floataa )

						snake_case							=					image_processor(lowercase_,						return_tensors='pt' ).to('cpu',						torch.bfloataa )
						self.assertEqual(encoding.pixel_values.device,						torch.device('cpu' ) )
						self.assertEqual(encoding.pixel_values.dtype,						torch.bfloataa )

						with self.assertRaises(lowercase_ ):
							snake_case							=					image_processor(lowercase_,						return_tensors='pt' ).to(torch.bfloataa,						'cpu' )

						# Try with text + image feature
						snake_case							=					image_processor(lowercase_,						return_tensors='pt' )
						encoding.update({'input_ids': torch.LongTensor([[1, 2, 3], [4, 5, 6]] )} )
						snake_case							=					encoding.to(torch.floataa )

						self.assertEqual(encoding.pixel_values.device,						torch.device('cpu' ) )
						self.assertEqual(encoding.pixel_values.dtype,						torch.floataa )
						self.assertEqual(encoding.input_ids.dtype,						torch.long )











import os
from typing import List, Union

import tensorflow as tf
from tensorflow_text import BertTokenizer as BertTokenizerLayer
from tensorflow_text import FastBertTokenizer, ShrinkLongestTrimmer, case_fold_utfa, combine_segments, pad_model_inputs

from .tokenization_bert import BertTokenizer







class __snake_case     (     tf.keras.layers.Layer						):







   def __init__( self						:		Optional[int]   ,		_snake_case						:		List   ,		_snake_case						:		bool   ,		_snake_case						:		int = None   ,		_snake_case						:		int = None   ,		_snake_case						:		int = None   ,		_snake_case						:		str = "longest"   ,		_snake_case						:		bool = True   ,		_snake_case						:		int = 512   ,		_snake_case						:		int = None   ,		_snake_case						:		bool = True   ,		_snake_case						:		bool = True   ,		_snake_case						:		bool = True   ,		**_snake_case						:		Any   ,		):

        """simple docstring"""


        super().__init__()
        if use_fast_bert_tokenizer:
             UpperCAmelCase_		=				FastBertTokenizer(
                 _snake_case   ,		token_out_type=tf.intaa   ,		lower_case_nfd_strip_accents=_snake_case   ,		**_snake_case)
        else:
             UpperCAmelCase_		=				tf.lookup.StaticVocabularyTable(
                 tf.lookup.KeyValueTensorInitializer(
                     keys=_snake_case   ,		key_dtype=tf.string   ,		values=tf.range(tf.size(_snake_case   ,		out_type=tf.intaa)   ,		dtype=tf.intaa)   ,		value_dtype=tf.intaa   ,		)   ,		num_oov_buckets=1   ,		)
             UpperCAmelCase_		=				BertTokenizerLayer(
                 _snake_case   ,		token_out_type=tf.intaa   ,		lower_case=_snake_case   ,		**_snake_case)

        UpperCAmelCase_		=				vocab_list
        UpperCAmelCase_		=				do_lower_case
        UpperCAmelCase_		=				cls_token_id or vocab_list.index('''[CLS]''')
        UpperCAmelCase_		=				sep_token_id or vocab_list.index('''[SEP]''')
        UpperCAmelCase_		=				pad_token_id or vocab_list.index('''[PAD]''')
        UpperCAmelCase_		=				ShrinkLongestTrimmer(max_length - 3   ,		axis=1)  # Allow room for special tokens
        UpperCAmelCase_		=				max_length
        UpperCAmelCase_		=				padding
        UpperCAmelCase_		=				truncation
        UpperCAmelCase_		=				pad_to_multiple_of
        UpperCAmelCase_		=				return_token_type_ids
        UpperCAmelCase_		=				return_attention_mask







   @classmethod
   def lowerCamelCase		( cls						:		Optional[Any]   ,		_snake_case						:		"PreTrainedTokenizerBase"   ,		**_snake_case						:		str):  # noqa: F821

        """simple docstring"""


        UpperCAmelCase_		=				kwargs.pop('''do_lower_case'''   ,		_snake_case)
        UpperCAmelCase_		=				tokenizer.do_lower_case if do_lower_case is None else do_lower_case
        UpperCAmelCase_		=				kwargs.pop('''cls_token_id'''   ,		_snake_case)
        UpperCAmelCase_		=				tokenizer.cls_token_id if cls_token_id is None else cls_token_id
        UpperCAmelCase_		=				kwargs.pop('''sep_token_id'''   ,		_snake_case)
        UpperCAmelCase_		=				tokenizer.sep_token_id if sep_token_id is None else sep_token_id
        UpperCAmelCase_		=				kwargs.pop('''pad_token_id'''   ,		_snake_case)
        UpperCAmelCase_		=				tokenizer.pad_token_id if pad_token_id is None else pad_token_id

        UpperCAmelCase_		=				tokenizer.get_vocab()
        UpperCAmelCase_		=				sorted([(wordpiece, idx) for wordpiece, idx in vocab.items()]   ,		key=lambda _snake_case: x[1])
        UpperCAmelCase_		=				[entry[0] for entry in vocab]
        return cls(
            vocab_list=_snake_case   ,		do_lower_case=_snake_case   ,		cls_token_id=_snake_case   ,		sep_token_id=_snake_case   ,		pad_token_id=_snake_case   ,		**_snake_case   ,		)







   @classmethod
   def lowerCamelCase		( cls						:		List[str]   ,		_snake_case						:		Union[str, os.PathLike]   ,		*_snake_case						:		Union[str, Any]   ,		**_snake_case						:		Union[str, Any]):

        """simple docstring"""


        try:
             UpperCAmelCase_		=				BertTokenizer.from_pretrained(_snake_case   ,		*_snake_case   ,		**_snake_case)
        except:  # noqa: E722
             from .tokenization_bert_fast import BertTokenizerFast

             UpperCAmelCase_		=				BertTokenizerFast.from_pretrained(_snake_case   ,		*_snake_case   ,		**_snake_case)
        return cls.from_tokenizer(_snake_case   ,		**_snake_case)







   def lowerCamelCase		( self						:		int   ,		_snake_case						:		str):

        """simple docstring"""


        if self.do_lower_case:
             UpperCAmelCase_		=				case_fold_utfa(_snake_case)
        UpperCAmelCase_		=				self.tf_tokenizer.tokenize(_snake_case)
        return tokens.merge_dims(1   ,		-1)







   def lowerCamelCase		( self						:		int   ,		_snake_case						:		str   ,		_snake_case						:		str=None   ,		_snake_case						:		Union[str, Any]=None   ,		_snake_case						:		str=None   ,		_snake_case						:		int=None   ,		_snake_case						:		Optional[int]=None   ,		_snake_case						:		Optional[Any]=None   ,		_snake_case						:		List[str]=None   ,		):

        """simple docstring"""


        if padding is None:
             UpperCAmelCase_		=				self.padding
        if padding not in ("longest", "max_length"):
             raise ValueError('''Padding must be either \'longest\' or \'max_length\'!''')
        if max_length is not None and text_pair is not None:
             # Because we have to instantiate a Trimmer to do it properly
             raise ValueError('''max_length cannot be overridden at call time when truncating paired texts!''')
        if max_length is None:
             UpperCAmelCase_		=				self.max_length
        if truncation is None:
             UpperCAmelCase_		=				self.truncation
        if pad_to_multiple_of is None:
             UpperCAmelCase_		=				self.pad_to_multiple_of
        if return_token_type_ids is None:
             UpperCAmelCase_		=				self.return_token_type_ids
        if return_attention_mask is None:
             UpperCAmelCase_		=				self.return_attention_mask
        if not isinstance(_snake_case   ,		tf.Tensor):
             UpperCAmelCase_		=				tf.convert_to_tensor(_snake_case)
        if text_pair is not None and not isinstance(_snake_case   ,		tf.Tensor):
             UpperCAmelCase_		=				tf.convert_to_tensor(_snake_case)
        if text_pair is not None:
             if text.shape.rank > 1:
                  raise ValueError('''text argument should not be multidimensional when a text pair is supplied!''')
             if text_pair.shape.rank > 1:
                  raise ValueError('''text_pair should not be multidimensional!''')
        if text.shape.rank == 2:
             UpperCAmelCase_	,			UpperCAmelCase_		=				text[:, 0], text[:, 1]
        UpperCAmelCase_		=				self.unpaired_tokenize(_snake_case)
        if text_pair is None:  # Unpaired text
             if truncation:
                  UpperCAmelCase_		=				text[:, : max_length - 2]  # Allow room for special tokens
             UpperCAmelCase_	,			UpperCAmelCase_		=				combine_segments(
                 (text,)   ,		start_of_sequence_id=self.cls_token_id   ,		end_of_segment_id=self.sep_token_id)
        else:  # Paired text
             UpperCAmelCase_		=				self.unpaired_tokenize(_snake_case)
             if truncation:
                  UpperCAmelCase_	,			UpperCAmelCase_		=				self.paired_trimmer.trim([text, text_pair])
             UpperCAmelCase_	,			UpperCAmelCase_		=				combine_segments(
                 (text, text_pair)   ,		start_of_sequence_id=self.cls_token_id   ,		end_of_segment_id=self.sep_token_id)
        if padding == "longest":
             UpperCAmelCase_		=				input_ids.bounding_shape(axis=1)
             if pad_to_multiple_of is not None:
                  # No ceiling division in tensorflow, so we negate floordiv instead
                  UpperCAmelCase_		=				pad_to_multiple_of * (-tf.math.floordiv(-pad_length   ,		_snake_case))
        else:
             UpperCAmelCase_		=				max_length

        UpperCAmelCase_	,			UpperCAmelCase_		=				pad_model_inputs(_snake_case   ,		max_seq_length=_snake_case   ,		pad_value=self.pad_token_id)
        UpperCAmelCase_		=				{'''input_ids''': input_ids}
        if return_attention_mask:
             UpperCAmelCase_		=				attention_mask
        if return_token_type_ids:
             UpperCAmelCase_	,			UpperCAmelCase_		=				pad_model_inputs(
                 _snake_case   ,		max_seq_length=_snake_case   ,		pad_value=self.pad_token_id)
             UpperCAmelCase_		=				token_type_ids
        return output







   def lowerCamelCase		( self						:		Optional[Any]):

        """simple docstring"""


        return {
            "vocab_list": self.vocab_list,
            "do_lower_case": self.do_lower_case,
            "cls_token_id": self.cls_token_id,
            "sep_token_id": self.sep_token_id,
            "pad_token_id": self.pad_token_id,
        }






