





import json
import os
import shutil
import tempfile
import unittest

import numpy as np

from transformers import BertTokenizerFast
from transformers.models.bert.tokenization_bert import VOCAB_FILES_NAMES, BertTokenizer
from transformers.testing_utils import require_tokenizers, require_vision
from transformers.utils import IMAGE_PROCESSOR_NAME, is_vision_available


if is_vision_available():
   from PIL import Image

   from transformers import VisionTextDualEncoderProcessor, ViTImageProcessor




@require_tokenizers
@require_vision
class 			__UpperCamelCase    (							unittest.TestCase    ):





     def 		UpperCamelCase(     self					):
        _UpperCAmelCase           =   tempfile.mkdtemp()

        # fmt: off
        _UpperCAmelCase           =   ['''[UNK]''', '''[CLS]''', '''[SEP]''', '''[PAD]''', '''[MASK]''', '''want''', '''##want''', '''##ed''', '''wa''', '''un''', '''runn''', '''##ing''', ''',''', '''low''', '''lowest''']
        # fmt: on
        _UpperCAmelCase           =   os.path.join(self.tmpdirname				,							VOCAB_FILES_NAMES['''vocab_file''']					)
        with open(self.vocab_file				,							'''w'''				,							encoding='''utf-8'''					) as vocab_writer:
           vocab_writer.write(''''''.join([x + '''\n''' for x in vocab_tokens]					)					)

        _UpperCAmelCase           =   {
            '''do_resize''': True,
            '''size''': {'''height''': 18, '''width''': 18},
            '''do_normalize''': True,
            '''image_mean''': [0.5, 0.5, 0.5],
            '''image_std''': [0.5, 0.5, 0.5],
        }
        _UpperCAmelCase           =   os.path.join(self.tmpdirname				,							_UpperCamelCase					)
        with open(self.image_processor_file				,							'''w'''				,							encoding='''utf-8'''					) as fp:
           json.dump(_UpperCamelCase				,							_UpperCamelCase					)





     def 		UpperCamelCase(     self				,							**_UpperCamelCase					):
        return BertTokenizer.from_pretrained(self.tmpdirname				,							**_UpperCamelCase					)





     def 		UpperCamelCase(     self				,							**_UpperCamelCase					):
        return ViTImageProcessor.from_pretrained(self.tmpdirname				,							**_UpperCamelCase					)





     def 		UpperCamelCase(     self					):
        shutil.rmtree(self.tmpdirname					)





     def 		UpperCamelCase(     self					):
        _UpperCAmelCase           =   [np.random.randint(255				,							size=(3, 30, 400)				,							dtype=np.uinta					)]

        _UpperCAmelCase           =   [Image.fromarray(np.moveaxis(_UpperCamelCase				,							0				,							-1					)					) for x in image_inputs]

        return image_inputs





     def 		UpperCamelCase(     self					):
        _UpperCAmelCase           =   self.get_tokenizer()
        _UpperCAmelCase           =   self.get_image_processor()

        _UpperCAmelCase           =   VisionTextDualEncoderProcessor(tokenizer=_UpperCamelCase				,							image_processor=_UpperCamelCase					)

        processor.save_pretrained(self.tmpdirname					)
        _UpperCAmelCase           =   VisionTextDualEncoderProcessor.from_pretrained(self.tmpdirname					)

        self.assertEqual(processor.tokenizer.get_vocab()				,							tokenizer.get_vocab()					)
        self.assertIsInstance(processor.tokenizer				,							(BertTokenizer, BertTokenizerFast)					)

        self.assertEqual(processor.image_processor.to_json_string()				,							image_processor.to_json_string()					)
        self.assertIsInstance(processor.image_processor				,							_UpperCamelCase					)





     def 		UpperCamelCase(     self					):
        _UpperCAmelCase           =   VisionTextDualEncoderProcessor(
            tokenizer=self.get_tokenizer()				,							image_processor=self.get_image_processor()					)
        processor.save_pretrained(self.tmpdirname					)

        _UpperCAmelCase           =   self.get_tokenizer(bos_token='''(BOS)'''				,							eos_token='''(EOS)'''					)
        _UpperCAmelCase           =   self.get_image_processor(do_normalize=_UpperCamelCase				,							padding_value=1.0					)

        _UpperCAmelCase           =   VisionTextDualEncoderProcessor.from_pretrained(
            self.tmpdirname				,							bos_token='''(BOS)'''				,							eos_token='''(EOS)'''				,							do_normalize=_UpperCamelCase				,							padding_value=1.0					)

        self.assertEqual(processor.tokenizer.get_vocab()				,							tokenizer_add_kwargs.get_vocab()					)
        self.assertIsInstance(processor.tokenizer				,							(BertTokenizer, BertTokenizerFast)					)

        self.assertEqual(processor.image_processor.to_json_string()				,							image_processor_add_kwargs.to_json_string()					)
        self.assertIsInstance(processor.image_processor				,							_UpperCamelCase					)





     def 		UpperCamelCase(     self					):
        _UpperCAmelCase           =   self.get_image_processor()
        _UpperCAmelCase           =   self.get_tokenizer()

        _UpperCAmelCase           =   VisionTextDualEncoderProcessor(tokenizer=_UpperCamelCase				,							image_processor=_UpperCamelCase					)

        _UpperCAmelCase           =   self.prepare_image_inputs()

        _UpperCAmelCase           =   image_processor(_UpperCamelCase				,							return_tensors='''np'''					)
        _UpperCAmelCase           =   processor(images=_UpperCamelCase				,							return_tensors='''np'''					)

        for key in input_feat_extract.keys():
           self.assertAlmostEqual(input_feat_extract[key].sum()				,							input_processor[key].sum()				,							delta=1e-2					)





     def 		UpperCamelCase(     self					):
        _UpperCAmelCase           =   self.get_image_processor()
        _UpperCAmelCase           =   self.get_tokenizer()

        _UpperCAmelCase           =   VisionTextDualEncoderProcessor(tokenizer=_UpperCamelCase				,							image_processor=_UpperCamelCase					)

        _UpperCAmelCase           =   '''lower newer'''

        _UpperCAmelCase           =   processor(text=_UpperCamelCase					)

        _UpperCAmelCase           =   tokenizer(_UpperCamelCase					)

        for key in encoded_tok.keys():
           self.assertListEqual(encoded_tok[key]				,							encoded_processor[key]					)





     def 		UpperCamelCase(     self					):
        _UpperCAmelCase           =   self.get_image_processor()
        _UpperCAmelCase           =   self.get_tokenizer()

        _UpperCAmelCase           =   VisionTextDualEncoderProcessor(tokenizer=_UpperCamelCase				,							image_processor=_UpperCamelCase					)

        _UpperCAmelCase           =   '''lower newer'''
        _UpperCAmelCase           =   self.prepare_image_inputs()

        _UpperCAmelCase           =   processor(text=_UpperCamelCase				,							images=_UpperCamelCase					)

        self.assertListEqual(list(inputs.keys()					)				,							['''input_ids''', '''token_type_ids''', '''attention_mask''', '''pixel_values''']					)

        # test if it raises when no input is passed
        with self.assertRaises(_UpperCamelCase					):
           processor()





     def 		UpperCamelCase(     self					):
        _UpperCAmelCase           =   self.get_image_processor()
        _UpperCAmelCase           =   self.get_tokenizer()

        _UpperCAmelCase           =   VisionTextDualEncoderProcessor(tokenizer=_UpperCamelCase				,							image_processor=_UpperCamelCase					)

        _UpperCAmelCase           =   [[1, 4, 5, 8, 1, 0, 8], [3, 4, 3, 1, 1, 8, 9]]

        _UpperCAmelCase           =   processor.batch_decode(_UpperCamelCase					)
        _UpperCAmelCase           =   tokenizer.batch_decode(_UpperCamelCase					)

        self.assertListEqual(_UpperCamelCase				,							_UpperCamelCase					)





     def 		UpperCamelCase(     self					):
        _UpperCAmelCase           =   self.get_image_processor()
        _UpperCAmelCase           =   self.get_tokenizer()

        _UpperCAmelCase           =   VisionTextDualEncoderProcessor(tokenizer=_UpperCamelCase				,							image_processor=_UpperCamelCase					)

        _UpperCAmelCase           =   '''lower newer'''
        _UpperCAmelCase           =   self.prepare_image_inputs()

        _UpperCAmelCase           =   processor(text=_UpperCamelCase				,							images=_UpperCamelCase					)

        self.assertListEqual(list(inputs.keys()					)				,							processor.model_input_names					)






from ...configuration_utils import PretrainedConfig
from ...utils import logging


UpperCAmelCase_           =	logging.get_logger(__name__)

UpperCAmelCase_           =	{
    "tiiuae/falcon-40b": "https://huggingface.co/tiiuae/falcon-40b/resolve/main/config.json",
    "tiiuae/falcon-7b": "https://huggingface.co/tiiuae/falcon-7b/resolve/main/config.json",
}




class 			__UpperCamelCase    (							A__    ):
     __A	:  Dict							  =   """falcon"""
     __A	:  Any							  =   ["""past_key_values"""]





     def __init__(     self				,							_UpperCamelCase=65024				,							_UpperCamelCase=4544				,							_UpperCamelCase=32				,							_UpperCamelCase=71				,							_UpperCamelCase=1e-5				,							_UpperCamelCase=0.02				,							_UpperCamelCase=True				,							_UpperCamelCase=0.0				,							_UpperCamelCase=0.0				,							_UpperCamelCase=None				,							_UpperCamelCase=False				,							_UpperCamelCase=False				,							_UpperCamelCase=True				,							_UpperCamelCase=True				,							_UpperCamelCase=False				,							_UpperCamelCase=11				,							_UpperCamelCase=11				,							**_UpperCamelCase				,							):
        _UpperCAmelCase           =   vocab_size
        # Backward compatibility with n_embed kwarg
        _UpperCAmelCase           =   kwargs.pop('''n_embed'''				,							_UpperCamelCase					)
        _UpperCAmelCase           =   hidden_size if n_embed is None else n_embed
        _UpperCAmelCase           =   num_hidden_layers
        _UpperCAmelCase           =   num_attention_heads
        _UpperCAmelCase           =   layer_norm_epsilon
        _UpperCAmelCase           =   initializer_range
        _UpperCAmelCase           =   use_cache
        _UpperCAmelCase           =   hidden_dropout
        _UpperCAmelCase           =   attention_dropout

        _UpperCAmelCase           =   bos_token_id
        _UpperCAmelCase           =   eos_token_id
        _UpperCAmelCase           =   num_attention_heads if num_kv_heads is None else num_kv_heads
        _UpperCAmelCase           =   alibi
        _UpperCAmelCase           =   new_decoder_architecture
        _UpperCAmelCase           =   multi_query  # Ignored when new_decoder_architecture is True
        _UpperCAmelCase           =   parallel_attn
        _UpperCAmelCase           =   bias

        super().__init__(bos_token_id=_UpperCamelCase				,							eos_token_id=_UpperCamelCase				,							**_UpperCamelCase					)





     @property
     def 		UpperCamelCase(     self					):
        return self.hidden_size // self.num_attention_heads





     @property
     def 		UpperCamelCase(     self					):
        return not self.alibi