


import tempfile
import unittest

import numpy as np

import transformers
from transformers import GPTaTokenizer, GPTJConfig, is_flax_available, is_torch_available
from transformers.testing_utils import is_pt_flax_cross_test, require_flax, tooslow

from ...generation.test_flax_utils import FlaxGenerationTesterMixin
from ...test_modeling_flax_common import FlaxModelTesterMixin, ids_tensor, random_attention_mask


if is_flax_available():
			import jax
			import jax.numpy as jnp

			from transformers.modeling_flax_pytorch_utils import (
			    convert_pytorch_state_dict_to_flax,
			    load_flax_weights_in_pytorch_model,
			)
			from transformers.models.gptj.modeling_flax_gptj import FlaxGPTJForCausalLM, FlaxGPTJModel

if is_torch_available():
			import torch







class lowerCAmelCase_		:

	'''simple docstring'''

	def __init__(			self	,   _UpperCAmelCase	,   _UpperCAmelCase=14	,   _UpperCAmelCase=7	,   _UpperCAmelCase=True	,   _UpperCAmelCase=True	,   _UpperCAmelCase=False	,   _UpperCAmelCase=True	,   _UpperCAmelCase=99	,   _UpperCAmelCase=32	,   _UpperCAmelCase=4	,   _UpperCAmelCase=4	,   _UpperCAmelCase=4	,   _UpperCAmelCase=37	,   _UpperCAmelCase="gelu"	,   _UpperCAmelCase=0.1	,   _UpperCAmelCase=0.1	,   _UpperCAmelCase=5_12	,   _UpperCAmelCase=0.02	,   ):
							snake_case_ =   parent
							snake_case_ =   batch_size
							snake_case_ =   seq_length
							snake_case_ =   is_training
							snake_case_ =   use_input_mask
							snake_case_ =   use_token_type_ids
							snake_case_ =   use_labels
							snake_case_ =   vocab_size
							snake_case_ =   hidden_size
							snake_case_ =   rotary_dim
							snake_case_ =   num_hidden_layers
							snake_case_ =   num_attention_heads
							snake_case_ =   intermediate_size
							snake_case_ =   hidden_act
							snake_case_ =   hidden_dropout_prob
							snake_case_ =   attention_probs_dropout_prob
							snake_case_ =   max_position_embeddings
							snake_case_ =   initializer_range
							snake_case_ =   None
							snake_case_ =   vocab_size - 1
							snake_case_ =   vocab_size - 1
							snake_case_ =   vocab_size - 1



	def 		UpperCamelCase__  (			self      ):
							snake_case_ =   ids_tensor([self.batch_size, self.seq_length]	,   self.vocab_size      )

							snake_case_ =   None
							if self.use_input_mask:
													snake_case_ =   random_attention_mask([self.batch_size, self.seq_length]      )

							snake_case_ =   GPTJConfig(
							    vocab_size=self.vocab_size	,   n_embd=self.hidden_size	,   n_layer=self.num_hidden_layers	,   n_head=self.num_attention_heads	,   n_positions=self.max_position_embeddings	,   use_cache=_UpperCAmelCase	,   bos_token_id=self.bos_token_id	,   eos_token_id=self.eos_token_id	,   pad_token_id=self.pad_token_id	,   rotary_dim=self.rotary_dim	,   )

							return (config, input_ids, input_mask)



	def 		UpperCamelCase__  (			self      ):
							snake_case_ =   self.prepare_config_and_inputs()
							snake_case_ ,					snake_case_ ,					snake_case_ =   config_and_inputs
							snake_case_ =   {'''input_ids''': input_ids, '''attention_mask''': attention_mask}
							return config, inputs_dict



	def 		UpperCamelCase__  (			self	,   _UpperCAmelCase	,   _UpperCAmelCase	,   _UpperCAmelCase	,   _UpperCAmelCase      ):
							snake_case_ =   20
							snake_case_ =   model_class_name(_UpperCAmelCase      )

							snake_case_ =   model.init_cache(input_ids.shape[0]	,   _UpperCAmelCase      )
							snake_case_ =   jnp.ones((input_ids.shape[0], max_decoder_length)	,   dtype='''i4'''      )

							snake_case_ =   jnp.broadcast_to(
							    jnp.arange(input_ids.shape[-1] - 1      )[None, :]	,   (input_ids.shape[0], input_ids.shape[-1] - 1)      )
							snake_case_ =   model(
							    input_ids[:, :-1]	,   attention_mask=_UpperCAmelCase	,   past_key_values=_UpperCAmelCase	,   position_ids=_UpperCAmelCase	,   )

							snake_case_ =   jnp.array(input_ids.shape[0] * [[input_ids.shape[-1] - 1]]	,   dtype='''i4'''      )
							snake_case_ =   model(
							    input_ids[:, -1:]	,   attention_mask=_UpperCAmelCase	,   past_key_values=outputs_cache.past_key_values	,   position_ids=_UpperCAmelCase	,   )

							snake_case_ =   model(_UpperCAmelCase      )

							snake_case_ =   np.max(np.abs((outputs_cache_next[0][:, -1, :5] - outputs[0][:, -1, :5])      )      )
							self.parent.assertTrue(diff < 1E-3	,   msg=F'''Max diff is {diff}'''      )





	def 		UpperCamelCase__  (			self	,   _UpperCAmelCase	,   _UpperCAmelCase	,   _UpperCAmelCase	,   _UpperCAmelCase      ):
							snake_case_ =   20
							snake_case_ =   model_class_name(_UpperCAmelCase      )

							snake_case_ =   jnp.concatenate(
							    [attention_mask, jnp.zeros((attention_mask.shape[0], max_decoder_length - attention_mask.shape[1])      )]	,   axis=-1	,   )

							snake_case_ =   model.init_cache(input_ids.shape[0]	,   _UpperCAmelCase      )
							snake_case_ =   jnp.broadcast_to(
							    jnp.arange(input_ids.shape[-1] - 1      )[None, :]	,   (input_ids.shape[0], input_ids.shape[-1] - 1)      )

							snake_case_ =   model(
							    input_ids[:, :-1]	,   attention_mask=_UpperCAmelCase	,   past_key_values=_UpperCAmelCase	,   position_ids=_UpperCAmelCase	,   )
							snake_case_ =   jnp.array(input_ids.shape[0] * [[input_ids.shape[-1] - 1]]	,   dtype='''i4'''      )
							snake_case_ =   model(
							    input_ids[:, -1:]	,   past_key_values=outputs_cache.past_key_values	,   attention_mask=_UpperCAmelCase	,   position_ids=_UpperCAmelCase	,   )

							snake_case_ =   model(_UpperCAmelCase	,   attention_mask=_UpperCAmelCase      )

							snake_case_ =   np.max(np.abs((outputs_cache_next[0][:, -1, :5] - outputs[0][:, -1, :5])      )      )
							self.parent.assertTrue(diff < 1E-3	,   msg=F'''Max diff is {diff}'''      )







@require_flax
class lowerCAmelCase_		(				lowerCamelCase__      ,		lowerCamelCase__      ,		unittest.TestCase ):

	'''simple docstring'''

	__snake_case				=						(FlaxGPTJModel, FlaxGPTJForCausalLM) if is_flax_available() else ()
	__snake_case				=						(FlaxGPTJForCausalLM,) if is_flax_available() else ()



	def 		UpperCamelCase__  (			self      ):
							snake_case_ =   FlaxGPTJModelTester(self      )



	def 		UpperCamelCase__  (			self      ):
							for model_class_name in self.all_model_classes:
													snake_case_ ,					snake_case_ ,					snake_case_ =   self.model_tester.prepare_config_and_inputs()
													self.model_tester.check_use_cache_forward(_UpperCAmelCase	,   _UpperCAmelCase	,   _UpperCAmelCase	,   _UpperCAmelCase      )



	def 		UpperCamelCase__  (			self      ):
							for model_class_name in self.all_model_classes:
													snake_case_ ,					snake_case_ ,					snake_case_ =   self.model_tester.prepare_config_and_inputs()
													self.model_tester.check_use_cache_forward_with_attn_mask(
													    _UpperCAmelCase	,   _UpperCAmelCase	,   _UpperCAmelCase	,   _UpperCAmelCase      )



	@tooslow
	def 		UpperCamelCase__  (			self      ):
							snake_case_ =   GPTaTokenizer.from_pretrained('''gpt2'''	,   pad_token='''<|endoftext|>'''	,   padding_side='''left'''      )
							snake_case_ =   tokenizer(['''Hello this is a long string''', '''Hey''']	,   return_tensors='''np'''	,   padding=_UpperCAmelCase	,   truncation=_UpperCAmelCase      )

							snake_case_ =   FlaxGPTJForCausalLM.from_pretrained('''EleutherAI/gpt-j-6B'''      )
							snake_case_ =   False
							snake_case_ =   model.config.eos_token_id

							snake_case_ =   jax.jit(model.generate      )

							snake_case_ =   jit_generate(
							    inputs['''input_ids''']	,   attention_mask=inputs['''attention_mask''']	,   pad_token_id=tokenizer.pad_token_id      ).sequences

							snake_case_ =   tokenizer.batch_decode(_UpperCAmelCase	,   skip_special_tokens=_UpperCAmelCase      )

							snake_case_ =   [
							    '''Hello this is a long string of text.\n\nI\'m trying to get the text of the''',
							    '''Hey, I\'m a little late to the party. I\'m going to''',
							]

							self.assertListEqual(_UpperCAmelCase	,   _UpperCAmelCase      )



	@is_pt_flax_cross_test
	def 		UpperCamelCase__  (			self      ):
							snake_case_ ,					snake_case_ =   self.model_tester.prepare_config_and_inputs_for_common()

							for model_class in self.all_model_classes:
													with self.subTest(model_class.__name__      ):
																			# prepare inputs
																			snake_case_ =   self._prepare_for_class(_UpperCAmelCase	,   _UpperCAmelCase      )
																			snake_case_ =   {k: torch.tensor(v.tolist()      ) for k, v in prepared_inputs_dict.items()}

																			# load corresponding PyTorch class
																			snake_case_ =   model_class.__name__[4:]  # Skip the "Flax" at the beginning
																			snake_case_ =   getattr(_UpperCAmelCase	,   _UpperCAmelCase      )

																			snake_case_ ,					snake_case_ =   pt_inputs['''input_ids'''].shape
																			snake_case_ =   np.random.randint(0	,   seq_length - 1	,   size=(batch_size,)      )
																			for batch_idx, start_index in enumerate(_UpperCAmelCase      ):
																									snake_case_ =   0
																									snake_case_ =   1
																									snake_case_ =   0
																									snake_case_ =   1
																			snake_case_ =   pt_model_class(_UpperCAmelCase      ).eval()
																			snake_case_ =   model_class(_UpperCAmelCase	,   dtype=jnp.floataa      )

																			snake_case_ =   convert_pytorch_state_dict_to_flax(pt_model.state_dict()	,   _UpperCAmelCase      )
																			snake_case_ =   fx_state

																			with torch.no_grad():
																									snake_case_ =   pt_model(**_UpperCAmelCase      ).to_tuple()

																			snake_case_ =   fx_model(**_UpperCAmelCase      ).to_tuple()
																			self.assertEqual(len(_UpperCAmelCase      )	,   len(_UpperCAmelCase      )	,   '''Output lengths differ between Flax and PyTorch'''      )
																			for fx_output, pt_output in zip(_UpperCAmelCase	,   _UpperCAmelCase      ):
																									self.assert_almost_equals(fx_output[:, -1]	,   pt_output[:, -1].numpy()	,   4E-2      )

																			with tempfile.TemporaryDirectory() as tmpdirname:
																									pt_model.save_pretrained(_UpperCAmelCase      )
																									snake_case_ =   model_class.from_pretrained(_UpperCAmelCase	,   from_pt=_UpperCAmelCase      )

																			snake_case_ =   fx_model_loaded(**_UpperCAmelCase      ).to_tuple()
																			self.assertEqual(
																			    len(_UpperCAmelCase      )	,   len(_UpperCAmelCase      )	,   '''Output lengths differ between Flax and PyTorch'''      )
																			for fx_output_loaded, pt_output in zip(_UpperCAmelCase	,   _UpperCAmelCase      ):
																									self.assert_almost_equals(fx_output_loaded[:, -1]	,   pt_output[:, -1].numpy()	,   4E-2      )



	@is_pt_flax_cross_test
	def 		UpperCamelCase__  (			self      ):
							snake_case_ ,					snake_case_ =   self.model_tester.prepare_config_and_inputs_for_common()
							for model_class in self.all_model_classes:
													with self.subTest(model_class.__name__      ):
																			# prepare inputs
																			snake_case_ =   self._prepare_for_class(_UpperCAmelCase	,   _UpperCAmelCase      )
																			snake_case_ =   {k: torch.tensor(v.tolist()      ) for k, v in prepared_inputs_dict.items()}

																			# load corresponding PyTorch class
																			snake_case_ =   model_class.__name__[4:]  # Skip the "Flax" at the beginning
																			snake_case_ =   getattr(_UpperCAmelCase	,   _UpperCAmelCase      )

																			snake_case_ =   pt_model_class(_UpperCAmelCase      ).eval()
																			snake_case_ =   model_class(_UpperCAmelCase	,   dtype=jnp.floataa      )

																			snake_case_ =   load_flax_weights_in_pytorch_model(_UpperCAmelCase	,   fx_model.params      )
																			snake_case_ ,					snake_case_ =   pt_inputs['''input_ids'''].shape
																			snake_case_ =   np.random.randint(0	,   seq_length - 1	,   size=(batch_size,)      )
																			for batch_idx, start_index in enumerate(_UpperCAmelCase      ):
																									snake_case_ =   0
																									snake_case_ =   1
																									snake_case_ =   0
																									snake_case_ =   1

																			# make sure weights are tied in PyTorch
																			pt_model.tie_weights()

																			with torch.no_grad():
																									snake_case_ =   pt_model(**_UpperCAmelCase      ).to_tuple()

																			snake_case_ =   fx_model(**_UpperCAmelCase      ).to_tuple()
																			self.assertEqual(len(_UpperCAmelCase      )	,   len(_UpperCAmelCase      )	,   '''Output lengths differ between Flax and PyTorch'''      )
																			for fx_output, pt_output in zip(_UpperCAmelCase	,   _UpperCAmelCase      ):
																									self.assert_almost_equals(fx_output[:, -1]	,   pt_output[:, -1].numpy()	,   4E-2      )

																			with tempfile.TemporaryDirectory() as tmpdirname:
																									fx_model.save_pretrained(_UpperCAmelCase      )
																									snake_case_ =   pt_model_class.from_pretrained(_UpperCAmelCase	,   from_flax=_UpperCAmelCase      )

																			with torch.no_grad():
																									snake_case_ =   pt_model_loaded(**_UpperCAmelCase      ).to_tuple()

																			self.assertEqual(
																			    len(_UpperCAmelCase      )	,   len(_UpperCAmelCase      )	,   '''Output lengths differ between Flax and PyTorch'''      )
																			for fx_output, pt_output in zip(_UpperCAmelCase	,   _UpperCAmelCase      ):
																									self.assert_almost_equals(fx_output[:, -1]	,   pt_output[:, -1].numpy()	,   4E-2      )





	@tooslow
	def 		UpperCamelCase__  (			self      ):
							for model_class_name in self.all_model_classes:
													snake_case_ =   model_class_name.from_pretrained('''EleutherAI/gpt-j-6B'''      )
													snake_case_ =   model(np.ones((1, 1)      )      )
													self.assertIsNotNone(_UpperCAmelCase      )



from __future__ import annotations

import json

import requests
from bsa import BeautifulSoup
from fake_useragent import UserAgent

UpperCAmelCase    =					{"""UserAgent""": UserAgent().random}






def  __lowerCAmelCase					(SCREAMING_SNAKE_CASE      )->						dict:




      """simple docstring"""

      snake_case_ =   script.contents[0]
      snake_case_ =   json.loads(data[data.find('''{"config"'''      ) : -1]      )
      return info["entry_data"]["ProfilePage"][0]["graphql"]["user"]







class lowerCAmelCase_		:

 '''simple docstring'''

 def __init__(			self	,   _UpperCAmelCase      ):
       snake_case_ =   F'''https://www.instagram.com/{username}/'''
       snake_case_ =   self.get_json()



 def 		UpperCamelCase__  (			self      ):
       snake_case_ =   requests.get(self.url	,   headers=_UpperCAmelCase      ).text
       snake_case_ =   BeautifulSoup(_UpperCAmelCase	,   '''html.parser'''      ).find_all('''script'''      )
       try:
             return extract_user_profile(scripts[4]      )
       except (json.decoder.JSONDecodeError, KeyError):
             return extract_user_profile(scripts[3]      )



 def __repr__(			self      ):
       return F'''{self.__class__.__name__}(\'{self.username}\')'''



 def __str__(			self      ):
       return F'''{self.fullname} ({self.username}) is {self.biography}'''



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["username"]



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["full_name"]



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["biography"]



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["business_email"]



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["external_url"]



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["edge_followed_by"]["count"]



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["edge_follow"]["count"]



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["edge_owner_to_timeline_media"]["count"]



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["profile_pic_url_hd"]



 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["is_verified"]





 @property
 def 		UpperCamelCase__  (			self      ):
       return self.user_data["is_private"]






def  __lowerCAmelCase					(SCREAMING_SNAKE_CASE = "github"      )->						None:




      """simple docstring"""

      import os

      if os.environ.get('''CI'''      ):
            return  # test failing on GitHub Actions
      snake_case_ =   InstagramUser(SCREAMING_SNAKE_CASE      )
      assert instagram_user.user_data
      assert isinstance(instagram_user.user_data      ,      SCREAMING_SNAKE_CASE      )
      assert instagram_user.username == username
      if username != "github":
            return
      assert instagram_user.fullname == "GitHub"
      assert instagram_user.biography == "Built for developers."
      assert instagram_user.number_of_posts > 150
      assert instagram_user.number_of_followers > 12_0000
      assert instagram_user.number_of_followings > 15
      assert instagram_user.email == "support@github.com"
      assert instagram_user.website == "https://github.com/readme"
      assert instagram_user.profile_picture_url.startswith('''https://instagram.'''      )
      assert instagram_user.is_verified is True
      assert instagram_user.is_private is False


if __name__ == "__main__":
   import doctest

   doctest.testmod()
   UpperCAmelCase    =					InstagramUser("""github""")
   print(instagram_user)
   print(f'''{instagram_user.number_of_posts = }''')
   print(f'''{instagram_user.number_of_followers = }''')
   print(f'''{instagram_user.number_of_followings = }''')
   print(f'''{instagram_user.email = }''')
   print(f'''{instagram_user.website = }''')
   print(f'''{instagram_user.profile_picture_url = }''')
   print(f'''{instagram_user.is_verified = }''')
   print(f'''{instagram_user.is_private = }''')