
"""simple docstring"""




import argparse
import json

import requests
import torch
from huggingface_hub import hf_hub_download
from PIL import Image
from torchvision import transforms

from transformers import BitImageProcessor, FocalNetConfig, FocalNetForImageClassification
from transformers.image_utils import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD, PILImageResampling



def        _lowerCamelCase ( __a    ):
		SCREAMING_SNAKE_CASE_						 = [2, 2, 6, 2] if '''tiny''' in model_name else [2, 2, 18, 2]
		SCREAMING_SNAKE_CASE_						 = True if '''large''' in model_name or '''huge''' in model_name else False
		SCREAMING_SNAKE_CASE_						 = True if '''large''' in model_name or '''huge''' in model_name else False
		SCREAMING_SNAKE_CASE_						 = True if '''large''' in model_name or '''huge''' in model_name else False

		if "large" in model_name or "xlarge" in model_name or "huge" in model_name:
				if "fl3" in model_name:
						SCREAMING_SNAKE_CASE_						 = [3, 3, 3, 3]
						SCREAMING_SNAKE_CASE_						 = [5, 5, 5, 5]
				elif "fl4" in model_name:
						SCREAMING_SNAKE_CASE_						 = [4, 4, 4, 4]
						SCREAMING_SNAKE_CASE_						 = [3, 3, 3, 3]

		if "tiny" in model_name or "small" in model_name or "base" in model_name:
				SCREAMING_SNAKE_CASE_						 = [3, 3, 3, 3]
				if "lrf" in model_name:
						SCREAMING_SNAKE_CASE_						 = [3, 3, 3, 3]
				else:
						SCREAMING_SNAKE_CASE_						 = [2, 2, 2, 2]

		if "tiny" in model_name:
				SCREAMING_SNAKE_CASE_						 = 96
		elif "small" in model_name:
				SCREAMING_SNAKE_CASE_						 = 96
		elif "base" in model_name:
				SCREAMING_SNAKE_CASE_						 = 128
		elif "large" in model_name:
				SCREAMING_SNAKE_CASE_						 = 192
		elif "xlarge" in model_name:
				SCREAMING_SNAKE_CASE_						 = 256
		elif "huge" in model_name:
				SCREAMING_SNAKE_CASE_						 = 352

		# set label information
		SCREAMING_SNAKE_CASE_						 = '''huggingface/label-files'''
		if "large" in model_name or "huge" in model_name:
				SCREAMING_SNAKE_CASE_						 = '''imagenet-22k-id2label.json'''
		else:
				SCREAMING_SNAKE_CASE_						 = '''imagenet-1k-id2label.json'''

		SCREAMING_SNAKE_CASE_						 = json.load(open(hf_hub_download(SCREAMING_SNAKE_CASE_,							SCREAMING_SNAKE_CASE_,							repo_type='''dataset'''    ),							'''r'''    )    )
		SCREAMING_SNAKE_CASE_						 = {int(SCREAMING_SNAKE_CASE_    ): v for k, v in idalabel.items()}
		SCREAMING_SNAKE_CASE_						 = {v: k for k, v in idalabel.items()}

		SCREAMING_SNAKE_CASE_						 = FocalNetConfig(
		    embed_dim=SCREAMING_SNAKE_CASE_,							depths=SCREAMING_SNAKE_CASE_,							focal_levels=SCREAMING_SNAKE_CASE_,							focal_windows=SCREAMING_SNAKE_CASE_,							use_conv_embed=SCREAMING_SNAKE_CASE_,							idalabel=SCREAMING_SNAKE_CASE_,							labelaid=SCREAMING_SNAKE_CASE_,							use_post_layernorm=SCREAMING_SNAKE_CASE_,							use_layerscale=SCREAMING_SNAKE_CASE_,							)

		return config



def        _lowerCamelCase ( __a    ):
		if "patch_embed.proj" in name:
				SCREAMING_SNAKE_CASE_						 = name.replace('''patch_embed.proj''',							'''embeddings.patch_embeddings.projection'''    )
		if "patch_embed.norm" in name:
				SCREAMING_SNAKE_CASE_						 = name.replace('''patch_embed.norm''',							'''embeddings.norm'''    )
		if "layers" in name:
				SCREAMING_SNAKE_CASE_						 = '''encoder.''' + name
		if "encoder.layers" in name:
				SCREAMING_SNAKE_CASE_						 = name.replace('''encoder.layers''',							'''encoder.stages'''    )
		if "downsample.proj" in name:
				SCREAMING_SNAKE_CASE_						 = name.replace('''downsample.proj''',							'''downsample.projection'''    )
		if "blocks" in name:
				SCREAMING_SNAKE_CASE_						 = name.replace('''blocks''',							'''layers'''    )
		if "modulation.f.weight" in name or "modulation.f.bias" in name:
				SCREAMING_SNAKE_CASE_						 = name.replace('''modulation.f''',							'''modulation.projection_in'''    )
		if "modulation.h.weight" in name or "modulation.h.bias" in name:
				SCREAMING_SNAKE_CASE_						 = name.replace('''modulation.h''',							'''modulation.projection_context'''    )
		if "modulation.proj.weight" in name or "modulation.proj.bias" in name:
				SCREAMING_SNAKE_CASE_						 = name.replace('''modulation.proj''',							'''modulation.projection_out'''    )

		if name == "norm.weight":
				SCREAMING_SNAKE_CASE_						 = '''layernorm.weight'''
		if name == "norm.bias":
				SCREAMING_SNAKE_CASE_						 = '''layernorm.bias'''

		if "head" in name:
				SCREAMING_SNAKE_CASE_						 = name.replace('''head''',							'''classifier'''    )
		else:
				SCREAMING_SNAKE_CASE_						 = '''focalnet.''' + name

		return name



def        _lowerCamelCase ( __a,							__a,							__a=False    ):
		# fmt: off
		SCREAMING_SNAKE_CASE_						 = {
		    '''focalnet-tiny''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_tiny_srf.pth''',
		    '''focalnet-tiny-lrf''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_tiny_lrf.pth''',
		    '''focalnet-small''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_small_srf.pth''',
		    '''focalnet-small-lrf''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_small_lrf.pth''',
		    '''focalnet-base''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_base_srf.pth''',
		    '''focalnet-base-lrf''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_base_lrf.pth''',
		    '''focalnet-large-lrf-fl3''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_large_lrf_384.pth''',
		    '''focalnet-large-lrf-fl4''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_large_lrf_384_fl4.pth''',
		    '''focalnet-xlarge-lrf-fl3''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_xlarge_lrf_384.pth''',
		    '''focalnet-xlarge-lrf-fl4''': '''https://projects4jw.blob.core.windows.net/focalnet/release/classification/focalnet_xlarge_lrf_384_fl4.pth''',
		}
		# fmt: on

		SCREAMING_SNAKE_CASE_						 = model_name_to_url[model_name]
		print('''Checkpoint URL: ''',							SCREAMING_SNAKE_CASE_    )
		SCREAMING_SNAKE_CASE_						 = torch.hub.load_state_dict_from_url(SCREAMING_SNAKE_CASE_,							map_location='''cpu'''    )['''model''']

		# rename keys
		for key in state_dict.copy().keys():
				SCREAMING_SNAKE_CASE_						 = state_dict.pop(SCREAMING_SNAKE_CASE_    )
				SCREAMING_SNAKE_CASE_						 = val

		SCREAMING_SNAKE_CASE_						 = get_focalnet_config(SCREAMING_SNAKE_CASE_    )
		SCREAMING_SNAKE_CASE_						 = FocalNetForImageClassification(SCREAMING_SNAKE_CASE_    )
		model.eval()

		# load state dict
		model.load_state_dict(SCREAMING_SNAKE_CASE_    )

		# verify conversion
		SCREAMING_SNAKE_CASE_						 = '''http://images.cocodataset.org/val2017/000000039769.jpg'''

		SCREAMING_SNAKE_CASE_						 = BitImageProcessor(
		    do_resize=SCREAMING_SNAKE_CASE_,							size={'''shortest_edge''': 256},							resample=PILImageResampling.BILINEAR,							do_center_crop=SCREAMING_SNAKE_CASE_,							crop_size=224,							do_normalize=SCREAMING_SNAKE_CASE_,							image_mean=SCREAMING_SNAKE_CASE_,							image_std=SCREAMING_SNAKE_CASE_,							)
		SCREAMING_SNAKE_CASE_						 = Image.open(requests.get(SCREAMING_SNAKE_CASE_,							stream=SCREAMING_SNAKE_CASE_    ).raw    )
		SCREAMING_SNAKE_CASE_						 = processor(images=SCREAMING_SNAKE_CASE_,							return_tensors='''pt'''    )

		SCREAMING_SNAKE_CASE_						 = transforms.Compose(
		    [
		        transforms.Resize(256    ),
		        transforms.CenterCrop(224    ),
		        transforms.ToTensor(),
		        transforms.Normalize(mean=[0.4_8_5, 0.4_5_6, 0.4_0_6],							std=[0.2_2_9, 0.2_2_4, 0.2_2_5]    ),
		    ]    )

		SCREAMING_SNAKE_CASE_						 = image_transforms(SCREAMING_SNAKE_CASE_    ).unsqueeze(0    )

		# verify pixel_values
		assert torch.allclose(inputs.pixel_values,							SCREAMING_SNAKE_CASE_,							atol=1E-4    )

		SCREAMING_SNAKE_CASE_						 = model(**SCREAMING_SNAKE_CASE_    )

		SCREAMING_SNAKE_CASE_						 = outputs.logits.argmax(-1    ).item()
		print('''Predicted class:''',							model.config.idalabel[predicted_class_idx]    )

		print('''First values of logits:''',							outputs.logits[0, :3]    )

		if model_name == "focalnet-tiny":
				SCREAMING_SNAKE_CASE_						 = torch.tensor([0.2_1_6_6, -0.4_3_6_8, 0.2_1_9_1]    )
		elif model_name == "focalnet-tiny-lrf":
				SCREAMING_SNAKE_CASE_						 = torch.tensor([1.1_6_6_9, 0.0_1_2_5, -0.1_6_9_5]    )
		elif model_name == "focalnet-small":
				SCREAMING_SNAKE_CASE_						 = torch.tensor([0.4_9_1_7, -0.0_4_3_0, 0.1_3_4_1]    )
		elif model_name == "focalnet-small-lrf":
				SCREAMING_SNAKE_CASE_						 = torch.tensor([-0.2_5_8_8, -0.5_3_4_2, -0.2_3_3_1]    )
		elif model_name == "focalnet-base":
				SCREAMING_SNAKE_CASE_						 = torch.tensor([-0.1_6_5_5, -0.4_0_9_0, -0.1_7_3_0]    )
		elif model_name == "focalnet-base-lrf":
				SCREAMING_SNAKE_CASE_						 = torch.tensor([0.5_3_0_6, -0.0_4_8_3, -0.3_9_2_8]    )
		assert torch.allclose(outputs.logits[0, :3],							SCREAMING_SNAKE_CASE_,							atol=1E-4    )
		print('''Looks ok!'''    )

		if pytorch_dump_folder_path is not None:
				print(F'Saving model and processor of {model_name} to {pytorch_dump_folder_path}'    )
				model.save_pretrained(SCREAMING_SNAKE_CASE_    )
				processor.save_pretrained(SCREAMING_SNAKE_CASE_    )

		if push_to_hub:
				print(F'Pushing model and processor of {model_name} to the hub...'    )
				model.push_to_hub(F'{model_name}'    )
				processor.push_to_hub(F'{model_name}'    )


if __name__ == "__main__":
						lowerCAmelCase__							=				argparse.ArgumentParser()
						# Required parameters
						parser.add_argument(
						    '--model_name',
						    default='focalnet-tiny',
						    type=str,
						    help='Name of the FocalNet model you\'d like to convert.',
						)
						parser.add_argument(
						    '--pytorch_dump_folder_path', default=None, type=str, help='Path to the output PyTorch model directory.'
						)
						parser.add_argument(
						    '--push_to_hub',
						    action='store_true',
						    help='Whether to push the model and processor to the hub.',
						)

						lowerCAmelCase__							=				parser.parse_args()
						convert_focalnet_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)


"""simple docstring"""




import os
import unittest

from transformers.models.transfo_xl.tokenization_transfo_xl import VOCAB_FILES_NAMES, TransfoXLTokenizer

from ...test_tokenization_common import TokenizerTesterMixin





class  snake_case     (							__lowercase       ,			unittest.TestCase   ):
							UpperCAmelCase__						     =      TransfoXLTokenizer
							UpperCAmelCase__						     =      False
							UpperCAmelCase__						     =      False

							def _lowercase					(self    ):

									"""simple docstring"""







									super().setUp()

									SCREAMING_SNAKE_CASE_						 = [
									    '''<unk>''',
									    '''[CLS]''',
									    '''[SEP]''',
									    '''want''',
									    '''unwanted''',
									    '''wa''',
									    '''un''',
									    '''running''',
									    ''',''',
									    '''low''',
									    '''l''',
									]
									SCREAMING_SNAKE_CASE_						 = 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]    )    )

							def _lowercase					(self       ,       **SCREAMING_SNAKE_CASE_    ):

									"""simple docstring"""







									SCREAMING_SNAKE_CASE_						 = True
									return TransfoXLTokenizer.from_pretrained(self.tmpdirname       ,       **SCREAMING_SNAKE_CASE_    )

							def _lowercase					(self       ,       SCREAMING_SNAKE_CASE_    ):

									"""simple docstring"""







									SCREAMING_SNAKE_CASE_						 = '''<unk> UNwanted , running'''
									SCREAMING_SNAKE_CASE_						 = '''<unk> unwanted, running'''
									return input_text, output_text

							def _lowercase					(self    ):

									"""simple docstring"""







									SCREAMING_SNAKE_CASE_						 = TransfoXLTokenizer(vocab_file=self.vocab_file       ,       lower_case=SCREAMING_SNAKE_CASE_    )

									SCREAMING_SNAKE_CASE_						 = tokenizer.tokenize('''<unk> UNwanted , running'''    )
									self.assertListEqual(SCREAMING_SNAKE_CASE_       ,       ['''<unk>''', '''unwanted''', ''',''', '''running''']    )

									self.assertListEqual(tokenizer.convert_tokens_to_ids(SCREAMING_SNAKE_CASE_    )       ,       [0, 4, 8, 7]    )

							def _lowercase					(self    ):

									"""simple docstring"""







									SCREAMING_SNAKE_CASE_						 = TransfoXLTokenizer(lower_case=SCREAMING_SNAKE_CASE_    )

									self.assertListEqual(
									    tokenizer.tokenize(''' \tHeLLo ! how  \n Are yoU ?  '''    )       ,       ['''hello''', '''!''', '''how''', '''are''', '''you''', '''?''']    )

							def _lowercase					(self    ):

									"""simple docstring"""







									SCREAMING_SNAKE_CASE_						 = TransfoXLTokenizer(lower_case=SCREAMING_SNAKE_CASE_    )

									self.assertListEqual(
									    tokenizer.tokenize(''' \tHeLLo ! how  \n Are yoU ?  '''    )       ,       ['''HeLLo''', '''!''', '''how''', '''Are''', '''yoU''', '''?''']    )

							def _lowercase					(self    ):

									"""simple docstring"""







									SCREAMING_SNAKE_CASE_						 = TransfoXLTokenizer(lower_case=SCREAMING_SNAKE_CASE_    )
									SCREAMING_SNAKE_CASE_						 = '''Hello (bracket) and side-scrolled [and] Henry\'s $5,000 with 3.34 m. What\'s up!?'''
									SCREAMING_SNAKE_CASE_						 = [
									    '''Hello''',
									    '''(''',
									    '''bracket''',
									    ''')''',
									    '''and''',
									    '''side''',
									    '''@-@''',
									    '''scrolled''',
									    '''[''',
									    '''and''',
									    ''']''',
									    '''Henry''',
									    '''\'s''',
									    '''$''',
									    '''5''',
									    '''@,@''',
									    '''000''',
									    '''with''',
									    '''3''',
									    '''@.@''',
									    '''34''',
									    '''m''',
									    '''.''',
									    '''What''',
									    '''\'s''',
									    '''up''',
									    '''!''',
									    '''?''',
									]

									self.assertListEqual(tokenizer.tokenize(SCREAMING_SNAKE_CASE_    )       ,       SCREAMING_SNAKE_CASE_    )

									self.assertEqual(tokenizer.convert_tokens_to_string(SCREAMING_SNAKE_CASE_    )       ,       SCREAMING_SNAKE_CASE_    )







							def _lowercase					(self    ):

									"""simple docstring"""







									SCREAMING_SNAKE_CASE_						 = self.get_tokenizer()
									SCREAMING_SNAKE_CASE_						 = len(SCREAMING_SNAKE_CASE_    )

									tokenizer.add_tokens(['''new1''', '''new2''']    )
									tokenizer.move_added_token('''new1'''       ,       1    )

									# Check that moved token is not copied (duplicate)
									self.assertEqual(len(SCREAMING_SNAKE_CASE_    )       ,       original_len + 2    )
									# Check that token is moved to specified id
									self.assertEqual(tokenizer.encode('''new1'''    )       ,       [1]    )
									self.assertEqual(tokenizer.decode([1]    )       ,       '''new1'''    )