

from collections import OrderedDict
from typing import TYPE_CHECKING, Any, Mapping, Optional

from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfig
from ...utils import logging


if TYPE_CHECKING:
    from ... import FeatureExtractionMixin, TensorType

_lowerCamelCase    :       str        =							logging.get_logger(__name__)

_lowerCamelCase    :       Dict        =							{
    """openai/imagegpt-small""": """""",
    """openai/imagegpt-medium""": """""",
    """openai/imagegpt-large""": """""",
}





class  __UpperCAmelCase					(	__A						):
   UpperCamelCase       					=					'imagegpt'
   UpperCamelCase       					=					['past_key_values']
   UpperCamelCase       					=					{
       'hidden_size': 'n_embd',
       'max_position_embeddings': 'n_positions',
       'num_attention_heads': 'n_head',
       'num_hidden_layers': 'n_layer',
   }



   def __init__(							self							:					Tuple,		__A							:					Optional[int]=5_1_2 + 1,		__A							:					Optional[Any]=3_2 * 3_2,		__A							:					Optional[Any]=5_1_2,		__A							:					List[Any]=2_4,		__A							:					Tuple=8,		__A							:					Union[str, Any]=None,		__A							:					Optional[int]="quick_gelu",		__A							:					Any=0.1,		__A							:					str=0.1,		__A							:					Dict=0.1,		__A							:					Optional[Any]=1E-5,		__A							:					Dict=0.0_2,		__A							:					int=True,		__A							:					Optional[int]=True,		__A							:					List[Any]=False,		__A							:					List[Any]=False,		__A							:					Tuple=False,		**__A							:					List[str],		):
     UpperCAmelCase	:							Any						=			vocab_size
     UpperCAmelCase	:							List[Any]						=			n_positions
     UpperCAmelCase	:							Optional[Any]						=			n_embd
     UpperCAmelCase	:							Any						=			n_layer
     UpperCAmelCase	:							Dict						=			n_head
     UpperCAmelCase	:							int						=			n_inner
     UpperCAmelCase	:							Optional[int]						=			activation_function
     UpperCAmelCase	:							Optional[int]						=			resid_pdrop
     UpperCAmelCase	:							str						=			embd_pdrop
     UpperCAmelCase	:							Optional[int]						=			attn_pdrop
     UpperCAmelCase	:							Tuple						=			layer_norm_epsilon
     UpperCAmelCase	:							List[str]						=			initializer_range
     UpperCAmelCase	:							List[str]						=			scale_attn_weights
     UpperCAmelCase	:							List[Any]						=			use_cache
     UpperCAmelCase	:							List[Any]						=			scale_attn_by_inverse_layer_idx
     UpperCAmelCase	:							Dict						=			reorder_and_upcast_attn
     UpperCAmelCase	:							List[Any]						=			tie_word_embeddings

     super().__init__(tie_word_embeddings=__lowercase,		**__lowercase						)






class  __UpperCAmelCase					(	__A						):



   @property
   def 	__magic_name__   (							self							:					Dict						):
     return OrderedDict(
         [
             ('''input_ids''', {0: '''batch''', 1: '''sequence'''}),
         ]						)





   def 	__magic_name__   (							self							:					List[Any],		__A							:					Dict,		__A							:					Tuple = 1,		__A							:					List[Any] = -1,		__A							:					List[str] = False,		__A							:					Optional[Any] = None,		__A							:					Tuple = 3,		__A							:					int = 3_2,		__A							:					Tuple = 3_2,		):
     UpperCAmelCase	:							List[Any]						=			self._generate_dummy_images(__lowercase,		__lowercase,		__lowercase,		__lowercase						)
     UpperCAmelCase	:							Optional[Any]						=			dict(preprocessor(images=__lowercase,		return_tensors=__lowercase						)						)

     return inputs








import random
import unittest

import numpy as np

import transformers
from transformers import is_flax_available, is_torch_available
from transformers.testing_utils import is_pt_flax_cross_test, require_flax


if is_flax_available():
     import os

     import jax.numpy as jnp
     from jax import jit

     from transformers import AutoTokenizer, FlaxAutoModelForCausalLM
     from transformers.modeling_flax_pytorch_utils import load_flax_weights_in_pytorch_model

     _lowerCamelCase    :       Any        =							"0.12"  # assumed parallelism: 8


if is_torch_available():
     import torch

def       a__					(		UpperCAmelCase							:      int    ,			UpperCAmelCase							:      List[str]    ,			UpperCAmelCase							:      List[str]=None      )  ->						List[Any]:
  if rng is None:
    UpperCAmelCase	:							Dict						=			random.Random()

  UpperCAmelCase	:							Optional[Any]						=			1
  for dim in shape:
    total_dims *= dim

  UpperCAmelCase	:							List[str]						=			[]
  for _ in range(UpperCAmelCase      ):
    values.append(rng.randint(0    ,			vocab_size - 1      )      )

  UpperCAmelCase	:							List[str]						=			np.array(UpperCAmelCase    ,			dtype=jnp.intaa      ).reshape(UpperCAmelCase      )

  return output

def       a__					(		UpperCAmelCase							:      List[str]    ,			UpperCAmelCase							:      Optional[int]=None      )  ->						List[str]:
  UpperCAmelCase	:							Optional[int]						=			ids_tensor(UpperCAmelCase    ,			vocab_size=2    ,			rng=UpperCAmelCase      )
  # make sure that at least one token is attended to for each batch
  UpperCAmelCase	:							str						=			1
  return attn_mask





@require_flax
class  __UpperCAmelCase					:
   UpperCamelCase       					=					None
   UpperCamelCase       					=					()



   def 	__magic_name__   (							self							:					str						):
     UpperCAmelCase			,						UpperCAmelCase	:							Tuple						=			self.model_tester.prepare_config_and_inputs_for_common()

     # cut to half length & take max batch_size 3
     UpperCAmelCase	:							Optional[int]						=			2
     UpperCAmelCase	:							Dict						=			inputs['''input_ids'''].shape[-1] // 2
     UpperCAmelCase	:							Dict						=			inputs['''input_ids'''][:max_batch_size, :sequence_length]

     UpperCAmelCase	:							Optional[int]						=			jnp.ones_like(__A						)
     UpperCAmelCase	:							Optional[int]						=			attention_mask[:max_batch_size, :sequence_length]

     # generate max 5 tokens
     UpperCAmelCase	:							Optional[Any]						=			input_ids.shape[-1] + 5
     if config.eos_token_id is not None and config.pad_token_id is None:
       # hack to allow generate for models such as GPT2 as is done in `generate()`
       UpperCAmelCase	:							Optional[Any]						=			config.eos_token_id
     return config, input_ids, attention_mask, max_length



   @is_pt_flax_cross_test
   def 	__magic_name__   (							self							:					Union[str, Any]						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							Any						=			self._get_input_ids_and_config()
     UpperCAmelCase	:							Optional[Any]						=			False
     UpperCAmelCase	:							Any						=			max_length
     UpperCAmelCase	:							List[Any]						=			0

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							Union[str, Any]						=			model_class(__A						)

       UpperCAmelCase	:							List[str]						=			model_class.__name__[4:]  # Skip the "Flax" at the beginning
       UpperCAmelCase	:							List[Any]						=			getattr(__A,		__A						)
       UpperCAmelCase	:							Union[str, Any]						=			pt_model_class(__A						).eval()
       UpperCAmelCase	:							Tuple						=			load_flax_weights_in_pytorch_model(__A,		flax_model.params						)

       UpperCAmelCase	:							Dict						=			flax_model.generate(__A						).sequences
       UpperCAmelCase	:							str						=			pt_model.generate(torch.tensor(__A,		dtype=torch.long						)						)

       if flax_generation_outputs.shape[-1] > pt_generation_outputs.shape[-1]:
         UpperCAmelCase	:							Any						=			flax_generation_outputs[:, : pt_generation_outputs.shape[-1]]

       self.assertListEqual(pt_generation_outputs.numpy().tolist(),		flax_generation_outputs.tolist()						)



   def 	__magic_name__   (							self							:					Tuple						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							Union[str, Any]						=			self._get_input_ids_and_config()
     UpperCAmelCase	:							str						=			False
     UpperCAmelCase	:							Dict						=			max_length

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							Union[str, Any]						=			model_class(__A						)

       UpperCAmelCase	:							Optional[int]						=			model.generate(__A						).sequences
       self.assertEqual(generation_outputs.shape[-1],		__A						)

       UpperCAmelCase	:							List[Any]						=			jit(model.generate						)
       UpperCAmelCase	:							Optional[Any]						=			jit_generate(__A						).sequences

       self.assertListEqual(generation_outputs.tolist(),		jit_generation_outputs.tolist()						)



   def 	__magic_name__   (							self							:					str						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							List[Any]						=			self._get_input_ids_and_config()
     UpperCAmelCase	:							str						=			True
     UpperCAmelCase	:							Dict						=			max_length

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							Union[str, Any]						=			model_class(__A						)

       UpperCAmelCase	:							Optional[Any]						=			model.generate(__A						).sequences
       self.assertEqual(generation_outputs.shape[-1],		__A						)

       UpperCAmelCase	:							str						=			jit(model.generate						)
       UpperCAmelCase	:							List[Any]						=			jit_generate(__A						).sequences

       self.assertListEqual(generation_outputs.tolist(),		jit_generation_outputs.tolist()						)



   def 	__magic_name__   (							self							:					Union[str, Any]						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							int						=			self._get_input_ids_and_config()
     UpperCAmelCase	:							Dict						=			False
     UpperCAmelCase	:							Union[str, Any]						=			max_length
     UpperCAmelCase	:							List[Any]						=			2

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							int						=			model_class(__A						)

       UpperCAmelCase	:							str						=			model.generate(__A						).sequences
       self.assertEqual(generation_outputs.shape[-1],		__A						)

       UpperCAmelCase	:							int						=			jit(model.generate						)
       UpperCAmelCase	:							Union[str, Any]						=			jit_generate(__A						).sequences

       self.assertListEqual(generation_outputs.tolist(),		jit_generation_outputs.tolist()						)



   def 	__magic_name__   (							self							:					List[str]						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							Optional[Any]						=			self._get_input_ids_and_config()
     UpperCAmelCase	:							Any						=			False
     UpperCAmelCase	:							Optional[int]						=			max_length
     UpperCAmelCase	:							Optional[int]						=			2
     UpperCAmelCase	:							str						=			2

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							int						=			model_class(__A						)

       UpperCAmelCase	:							Optional[Any]						=			model.generate(__A						).sequences
       self.assertEqual(generation_outputs.shape[0],		input_ids.shape[0] * config.num_return_sequences						)



   def 	__magic_name__   (							self							:					Any						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							str						=			self._get_input_ids_and_config()
     UpperCAmelCase	:							str						=			True
     UpperCAmelCase	:							Union[str, Any]						=			max_length
     UpperCAmelCase	:							Union[str, Any]						=			0.8
     UpperCAmelCase	:							str						=			1_0
     UpperCAmelCase	:							Any						=			0.3
     UpperCAmelCase	:							str						=			1
     UpperCAmelCase	:							Union[str, Any]						=			8
     UpperCAmelCase	:							Optional[Any]						=			9

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							int						=			model_class(__A						)

       UpperCAmelCase	:							List[Any]						=			model.generate(__A						).sequences
       self.assertEqual(generation_outputs.shape[-1],		__A						)

       UpperCAmelCase	:							Optional[int]						=			jit(model.generate						)
       UpperCAmelCase	:							Any						=			jit_generate(__A						).sequences

       self.assertListEqual(generation_outputs.tolist(),		jit_generation_outputs.tolist()						)



   def 	__magic_name__   (							self							:					List[Any]						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							Dict						=			self._get_input_ids_and_config()
     UpperCAmelCase	:							Optional[Any]						=			max_length
     UpperCAmelCase	:							Tuple						=			1
     UpperCAmelCase	:							Optional[Any]						=			8
     UpperCAmelCase	:							Optional[int]						=			9

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							int						=			model_class(__A						)

       UpperCAmelCase	:							List[str]						=			model.generate(__A						).sequences
       self.assertEqual(generation_outputs.shape[-1],		__A						)

       UpperCAmelCase	:							Dict						=			jit(model.generate						)
       UpperCAmelCase	:							List[str]						=			jit_generate(__A						).sequences

       self.assertListEqual(generation_outputs.tolist(),		jit_generation_outputs.tolist()						)



   def 	__magic_name__   (							self							:					Optional[Any]						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							Union[str, Any]						=			self._get_input_ids_and_config()
     UpperCAmelCase	:							List[str]						=			max_length
     UpperCAmelCase	:							Union[str, Any]						=			2
     UpperCAmelCase	:							List[Any]						=			1
     UpperCAmelCase	:							List[str]						=			8
     UpperCAmelCase	:							int						=			9

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							Optional[Any]						=			model_class(__A						)

       UpperCAmelCase	:							Union[str, Any]						=			model.generate(__A						).sequences
       self.assertEqual(generation_outputs.shape[-1],		__A						)

       UpperCAmelCase	:							List[str]						=			jit(model.generate						)
       UpperCAmelCase	:							Tuple						=			jit_generate(__A						).sequences

       self.assertListEqual(generation_outputs.tolist(),		jit_generation_outputs.tolist()						)



   def 	__magic_name__   (							self							:					str						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							Optional[int]						=			self._get_input_ids_and_config()

     # pad attention mask on the left
     UpperCAmelCase	:							Union[str, Any]						=			attention_mask.at[(0, 0)].set(0						)

     UpperCAmelCase	:							Tuple						=			False
     UpperCAmelCase	:							str						=			max_length

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							Any						=			model_class(__A						)

       UpperCAmelCase	:							Union[str, Any]						=			model.generate(__A,		attention_mask=__A						).sequences
       self.assertEqual(generation_outputs.shape[-1],		__A						)

       UpperCAmelCase	:							List[Any]						=			jit(model.generate						)
       UpperCAmelCase	:							Optional[Any]						=			jit_generate(__A,		attention_mask=__A						).sequences

       self.assertListEqual(generation_outputs.tolist(),		jit_generation_outputs.tolist()						)



   def 	__magic_name__   (							self							:					Optional[int]						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							Optional[int]						=			self._get_input_ids_and_config()

     # pad attention mask on the left
     UpperCAmelCase	:							Union[str, Any]						=			attention_mask.at[(0, 0)].set(0						)

     UpperCAmelCase	:							Union[str, Any]						=			True
     UpperCAmelCase	:							Dict						=			max_length

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							Any						=			model_class(__A						)

       UpperCAmelCase	:							Optional[Any]						=			model.generate(__A,		attention_mask=__A						).sequences
       self.assertEqual(generation_outputs.shape[-1],		__A						)

       UpperCAmelCase	:							Optional[Any]						=			jit(model.generate						)
       UpperCAmelCase	:							Optional[Any]						=			jit_generate(__A,		attention_mask=__A						).sequences

       self.assertListEqual(generation_outputs.tolist(),		jit_generation_outputs.tolist()						)





   def 	__magic_name__   (							self							:					Tuple						):
     UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase			,						UpperCAmelCase	:							Union[str, Any]						=			self._get_input_ids_and_config()

     # pad attention mask on the left
     UpperCAmelCase	:							Dict						=			attention_mask.at[(0, 0)].set(0						)

     UpperCAmelCase	:							Union[str, Any]						=			2
     UpperCAmelCase	:							str						=			max_length

     for model_class in self.all_generative_model_classes:
       UpperCAmelCase	:							str						=			model_class(__A						)

       UpperCAmelCase	:							int						=			model.generate(__A,		attention_mask=__A						).sequences
       self.assertEqual(generation_outputs.shape[-1],		__A						)

       UpperCAmelCase	:							Optional[Any]						=			jit(model.generate						)
       UpperCAmelCase	:							Dict						=			jit_generate(__A,		attention_mask=__A						).sequences

       self.assertListEqual(generation_outputs.tolist(),		jit_generation_outputs.tolist()						)






@require_flax
class  __UpperCAmelCase					(	unittest.TestCase						):



   def 	__magic_name__   (							self							:					str						):
     UpperCAmelCase	:							Union[str, Any]						=			AutoTokenizer.from_pretrained('''hf-internal-testing/tiny-bert'''						)
     UpperCAmelCase	:							List[str]						=			FlaxAutoModelForCausalLM.from_pretrained('''hf-internal-testing/tiny-bert-flax-only'''						)

     UpperCAmelCase	:							int						=			'''Hello world'''
     UpperCAmelCase	:							Optional[int]						=			tokenizer(__A,		return_tensors='''np'''						).input_ids

     # typos are quickly detected (the correct argument is `do_sample`)
     with self.assertRaisesRegex(__A,		'''do_samples'''						):
       model.generate(__A,		do_samples=__A						)

     # arbitrary arguments that will not be used anywhere are also not accepted
     with self.assertRaisesRegex(__A,		'''foo'''						):
       UpperCAmelCase	:							Any						=			{'''foo''': '''bar'''}
       model.generate(__A,		**__A						)





