





"""simple docstring"""
import unittest

import numpy as np

from transformers import BertConfig, is_flax_available
from transformers.testing_utils import require_flax, slow

from ...test_modeling_flax_common import FlaxModelTesterMixin, floats_tensor, ids_tensor, random_attention_mask


if is_flax_available():
       from transformers.models.bert.modeling_flax_bert import (
           FlaxBertForMaskedLM,
           FlaxBertForMultipleChoice,
           FlaxBertForNextSentencePrediction,
           FlaxBertForPreTraining,
           FlaxBertForQuestionAnswering,
           FlaxBertForSequenceClassification,
           FlaxBertForTokenClassification,
           FlaxBertModel,
       )







class       a							(   unittest.TestCase  ):



 def __init__(     self				,       _snake_case				,       _snake_case=13				,       _snake_case=7				,       _snake_case=True				,       _snake_case=True				,       _snake_case=True				,       _snake_case=True				,       _snake_case=99				,       _snake_case=32				,       _snake_case=5				,       _snake_case=4				,       _snake_case=37				,       _snake_case="gelu"				,       _snake_case=0.1				,       _snake_case=0.1				,       _snake_case=5_12				,       _snake_case=16				,       _snake_case=2				,       _snake_case=0.02				,       _snake_case=4				,       ):







  """simple docstring"""






  lowerCAmelCase    				= parent
  lowerCAmelCase    				= batch_size
  lowerCAmelCase    				= seq_length
  lowerCAmelCase    				= is_training
  lowerCAmelCase    				= use_attention_mask
  lowerCAmelCase    				= use_token_type_ids
  lowerCAmelCase    				= use_labels
  lowerCAmelCase    				= vocab_size
  lowerCAmelCase    				= hidden_size
  lowerCAmelCase    				= num_hidden_layers
  lowerCAmelCase    				= num_attention_heads
  lowerCAmelCase    				= intermediate_size
  lowerCAmelCase    				= hidden_act
  lowerCAmelCase    				= hidden_dropout_prob
  lowerCAmelCase    				= attention_probs_dropout_prob
  lowerCAmelCase    				= max_position_embeddings
  lowerCAmelCase    				= type_vocab_size
  lowerCAmelCase    				= type_sequence_label_size
  lowerCAmelCase    				= initializer_range
  lowerCAmelCase    				= num_choices



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= ids_tensor([self.batch_size, self.seq_length]				,       self.vocab_size     )

  lowerCAmelCase    				= None
  if self.use_attention_mask:
   lowerCAmelCase    				= random_attention_mask([self.batch_size, self.seq_length]     )

  lowerCAmelCase    				= None
  if self.use_token_type_ids:
   lowerCAmelCase    				= ids_tensor([self.batch_size, self.seq_length]				,       self.type_vocab_size     )

  lowerCAmelCase    				= BertConfig(
      vocab_size=self.vocab_size				,       hidden_size=self.hidden_size				,       num_hidden_layers=self.num_hidden_layers				,       num_attention_heads=self.num_attention_heads				,       intermediate_size=self.intermediate_size				,       hidden_act=self.hidden_act				,       hidden_dropout_prob=self.hidden_dropout_prob				,       attention_probs_dropout_prob=self.attention_probs_dropout_prob				,       max_position_embeddings=self.max_position_embeddings				,       type_vocab_size=self.type_vocab_size				,       is_decoder=_snake_case				,       initializer_range=self.initializer_range				,       )

  return config, input_ids, token_type_ids, attention_mask



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= self.prepare_config_and_inputs()
  lowerCAmelCase				,lowerCAmelCase				,lowerCAmelCase				,lowerCAmelCase    				= config_and_inputs
  lowerCAmelCase    				= {'input_ids': input_ids, 'token_type_ids': token_type_ids, 'attention_mask': attention_mask}
  return config, inputs_dict



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= self.prepare_config_and_inputs()
  lowerCAmelCase				,lowerCAmelCase				,lowerCAmelCase				,lowerCAmelCase    				= config_and_inputs

  lowerCAmelCase    				= True
  lowerCAmelCase    				= floats_tensor([self.batch_size, self.seq_length, self.hidden_size]     )
  lowerCAmelCase    				= ids_tensor([self.batch_size, self.seq_length]				,       vocab_size=2     )

  return (
      config,
      input_ids,
      attention_mask,
      encoder_hidden_states,
      encoder_attention_mask,
  )







@require_flax
class       a							(   a__   , unittest.TestCase  ):
 snake_case__             =       True

 snake_case__             =       (
     (
         FlaxBertModel,
         FlaxBertForPreTraining,
         FlaxBertForMaskedLM,
         FlaxBertForMultipleChoice,
         FlaxBertForQuestionAnswering,
         FlaxBertForNextSentencePrediction,
         FlaxBertForSequenceClassification,
         FlaxBertForTokenClassification,
         FlaxBertForQuestionAnswering,
     )
     if is_flax_available()
     else ()
 )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= FlaxBertModelTester(self     )



 @slow
 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= FlaxBertModel.from_pretrained('bert-base-cased'     )
  lowerCAmelCase    				= model(np.ones((1, 1)     )     )
  self.assertIsNotNone(_snake_case     )







from typing import List, Union

from ..utils import (
    add_end_docstrings,
    is_tf_available,
    is_torch_available,
    is_vision_available,
    logging,
    requires_backends,
)
from .base import PIPELINE_INIT_ARGS, Pipeline


if is_vision_available():
    from PIL import Image

    from ..image_utils import load_image

if is_tf_available():
    from ..models.auto.modeling_tf_auto import TF_MODEL_FOR_VISION_2_SEQ_MAPPING

if is_torch_available():
    import torch

    from ..models.auto.modeling_auto import MODEL_FOR_VISION_2_SEQ_MAPPING

lowerCamelCase  =logging.get_logger(__name__)




@add_end_docstrings(UpperCamelCase_			)
class 					_lowerCamelCase			(   UpperCamelCase_			):





     """simple docstring"""







     def __init__(				self    ,    *__SCREAMING_SNAKE_CASE    ,    **__SCREAMING_SNAKE_CASE	)	-> Dict:




           """simple docstring"""







           super().__init__(*__SCREAMING_SNAKE_CASE    ,    **__SCREAMING_SNAKE_CASE	)
           requires_backends(self    ,    '''vision'''	)
           self.check_model_type(
               TF_MODEL_FOR_VISION_2_SEQ_MAPPING if self.framework == '''tf''' else MODEL_FOR_VISION_2_SEQ_MAPPING	)






     def  __SCREAMING_SNAKE_CASE      (				self    ,    __SCREAMING_SNAKE_CASE=None    ,    __SCREAMING_SNAKE_CASE=None    ,    __SCREAMING_SNAKE_CASE=None	)	-> List[Any]:




           """simple docstring"""







           UpperCamelCase__     : Tuple											=					{}
           UpperCamelCase__     : int											=					{}

           if prompt is not None:
                 UpperCamelCase__     : int											=					prompt

           if generate_kwargs is not None:
                 UpperCamelCase__     : int											=					generate_kwargs
           if max_new_tokens is not None:
                 if "generate_kwargs" not in forward_kwargs:
                       UpperCamelCase__     : Union[str, Any]											=					{}
                 if "max_new_tokens" in forward_kwargs["generate_kwargs"]:
                       raise ValueError(
                           '''\'max_new_tokens\' is defined twice, once in \'generate_kwargs\' and once as a direct parameter,'''
                           ''' please use only one'''	)
                 UpperCamelCase__     : Dict											=					max_new_tokens
           return preprocess_params, forward_kwargs, {}






     def __call__(				self    ,    __SCREAMING_SNAKE_CASE    ,    **__SCREAMING_SNAKE_CASE	)	-> List[str]:




           """simple docstring"""







           return super().__call__(__SCREAMING_SNAKE_CASE    ,    **__SCREAMING_SNAKE_CASE	)






     def  __SCREAMING_SNAKE_CASE      (				self    ,    __SCREAMING_SNAKE_CASE    ,    __SCREAMING_SNAKE_CASE=None	)	-> List[Any]:




           """simple docstring"""







           UpperCamelCase__     : List[Any]											=					load_image(__SCREAMING_SNAKE_CASE	)

           if prompt is not None:
                 if not isinstance(__SCREAMING_SNAKE_CASE    ,    __SCREAMING_SNAKE_CASE	):
                       raise ValueError(
                           F'''Received an invalid text input, got - {type(__SCREAMING_SNAKE_CASE	)} - but expected a single string. '''
                           '''Note also that one single text can be provided for conditional image to text generation.'''	)

                 UpperCamelCase__     : Optional[int]											=					self.model.config.model_type

                 if model_type == "git":
                       UpperCamelCase__     : Optional[int]											=					self.image_processor(images=__SCREAMING_SNAKE_CASE    ,    return_tensors=self.framework	)
                       UpperCamelCase__     : str											=					self.tokenizer(text=__SCREAMING_SNAKE_CASE    ,    add_special_tokens=__SCREAMING_SNAKE_CASE	).input_ids
                       UpperCamelCase__     : Dict											=					[self.tokenizer.cls_token_id] + input_ids
                       UpperCamelCase__     : int											=					torch.tensor(__SCREAMING_SNAKE_CASE	).unsqueeze(0	)
                       model_inputs.update({'''input_ids''': input_ids}	)

                 elif model_type == "pix2struct":
                       UpperCamelCase__     : Tuple											=					self.image_processor(images=__SCREAMING_SNAKE_CASE    ,    header_text=__SCREAMING_SNAKE_CASE    ,    return_tensors=self.framework	)

                 elif model_type != "vision-encoder-decoder":
                       # vision-encoder-decoder does not support conditional generation
                       UpperCamelCase__     : int											=					self.image_processor(images=__SCREAMING_SNAKE_CASE    ,    return_tensors=self.framework	)
                       UpperCamelCase__     : int											=					self.tokenizer(__SCREAMING_SNAKE_CASE    ,    return_tensors=self.framework	)
                       model_inputs.update(__SCREAMING_SNAKE_CASE	)

                 else:
                       raise ValueError(F'''Model type {model_type} does not support conditional text generation'''	)

           else:
                 UpperCamelCase__     : str											=					self.image_processor(images=__SCREAMING_SNAKE_CASE    ,    return_tensors=self.framework	)

           if self.model.config.model_type == "git" and prompt is None:
                 UpperCamelCase__     : Optional[Any]											=					None

           return model_inputs






     def  __SCREAMING_SNAKE_CASE      (				self    ,    __SCREAMING_SNAKE_CASE    ,    __SCREAMING_SNAKE_CASE=None	)	-> Optional[Any]:




           """simple docstring"""







           if (
               "input_ids" in model_inputs
               and isinstance(model_inputs['''input_ids''']    ,    __SCREAMING_SNAKE_CASE	)
               and all(x is None for x in model_inputs['''input_ids''']	)
           ):
                 UpperCamelCase__     : Union[str, Any]											=					None

           if generate_kwargs is None:
                 UpperCamelCase__     : Optional[Any]											=					{}
           # FIXME: We need to pop here due to a difference in how `generation.py` and `generation.tf_utils.py`
           #  parse inputs. In the Tensorflow version, `generate` raises an error if we don't use `input_ids` whereas
           #  the PyTorch version matches it with `self.model.main_input_name` or `self.model.encoder.main_input_name`
           #  in the `_prepare_model_inputs` method.
           UpperCamelCase__     : Any											=					model_inputs.pop(self.model.main_input_name	)
           UpperCamelCase__     : Any											=					self.model.generate(__SCREAMING_SNAKE_CASE    ,    **__SCREAMING_SNAKE_CASE    ,    **__SCREAMING_SNAKE_CASE	)
           return model_outputs






     def  __SCREAMING_SNAKE_CASE      (				self    ,    __SCREAMING_SNAKE_CASE	)	-> int:




           """simple docstring"""







           UpperCamelCase__     : Union[str, Any]											=					[]
           for output_ids in model_outputs:
                 UpperCamelCase__     : str											=					{
                     '''generated_text''': self.tokenizer.decode(
                         __SCREAMING_SNAKE_CASE    ,    skip_special_tokens=__SCREAMING_SNAKE_CASE    ,    )
                 }
                 records.append(__SCREAMING_SNAKE_CASE	)
           return records


