


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 						a__			(				A__				):
			SCREAMING_SNAKE_CASE_		:     Dict					=					[2, 2, 6, 2] if 'tiny' in model_name else [2, 2, 1_8, 2]
			SCREAMING_SNAKE_CASE_		:     Union[str, Any]					=					True if 'large' in model_name or 'huge' in model_name else False
			SCREAMING_SNAKE_CASE_		:     List[str]					=					True if 'large' in model_name or 'huge' in model_name else False
			SCREAMING_SNAKE_CASE_		:     Tuple					=					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_		:     Optional[int]					=					[3, 3, 3, 3]
									SCREAMING_SNAKE_CASE_		:     Optional[int]					=					[5, 5, 5, 5]
						elif "fl4" in model_name:
									SCREAMING_SNAKE_CASE_		:     Union[str, Any]					=					[4, 4, 4, 4]
									SCREAMING_SNAKE_CASE_		:     Tuple					=					[3, 3, 3, 3]

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

			if "tiny" in model_name:
						SCREAMING_SNAKE_CASE_		:     Any					=					9_6
			elif "small" in model_name:
						SCREAMING_SNAKE_CASE_		:     str					=					9_6
			elif "base" in model_name:
						SCREAMING_SNAKE_CASE_		:     Any					=					1_2_8
			elif "large" in model_name:
						SCREAMING_SNAKE_CASE_		:     List[Any]					=					1_9_2
			elif "xlarge" in model_name:
						SCREAMING_SNAKE_CASE_		:     Optional[int]					=					2_5_6
			elif "huge" in model_name:
						SCREAMING_SNAKE_CASE_		:     Union[str, Any]					=					3_5_2

			# set label information
			SCREAMING_SNAKE_CASE_		:     Union[str, Any]					=					'huggingface/label-files'
			if "large" in model_name or "huge" in model_name:
						SCREAMING_SNAKE_CASE_		:     Optional[Any]					=					'imagenet-22k-id2label.json'
			else:
						SCREAMING_SNAKE_CASE_		:     Optional[int]					=					'imagenet-1k-id2label.json'

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

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

			return config






def 						a__			(				A__				):
			if "patch_embed.proj" in name:
						SCREAMING_SNAKE_CASE_		:     str					=					name.replace('patch_embed.proj',      'embeddings.patch_embeddings.projection'				)
			if "patch_embed.norm" in name:
						SCREAMING_SNAKE_CASE_		:     int					=					name.replace('patch_embed.norm',      'embeddings.norm'				)
			if "layers" in name:
						SCREAMING_SNAKE_CASE_		:     Any					=					'encoder.' + name
			if "encoder.layers" in name:
						SCREAMING_SNAKE_CASE_		:     Optional[int]					=					name.replace('encoder.layers',      'encoder.stages'				)
			if "downsample.proj" in name:
						SCREAMING_SNAKE_CASE_		:     str					=					name.replace('downsample.proj',      'downsample.projection'				)
			if "blocks" in name:
						SCREAMING_SNAKE_CASE_		:     Any					=					name.replace('blocks',      'layers'				)
			if "modulation.f.weight" in name or "modulation.f.bias" in name:
						SCREAMING_SNAKE_CASE_		:     Optional[int]					=					name.replace('modulation.f',      'modulation.projection_in'				)
			if "modulation.h.weight" in name or "modulation.h.bias" in name:
						SCREAMING_SNAKE_CASE_		:     Dict					=					name.replace('modulation.h',      'modulation.projection_context'				)
			if "modulation.proj.weight" in name or "modulation.proj.bias" in name:
						SCREAMING_SNAKE_CASE_		:     Optional[Any]					=					name.replace('modulation.proj',      'modulation.projection_out'				)

			if name == "norm.weight":
						SCREAMING_SNAKE_CASE_		:     int					=					'layernorm.weight'
			if name == "norm.bias":
						SCREAMING_SNAKE_CASE_		:     List[Any]					=					'layernorm.bias'

			if "head" in name:
						SCREAMING_SNAKE_CASE_		:     List[Any]					=					name.replace('head',      'classifier'				)
			else:
						SCREAMING_SNAKE_CASE_		:     List[str]					=					'focalnet.' + name

			return name






def 						a__			(				A__,      A__,      A__=False				):
			# fmt: off
			SCREAMING_SNAKE_CASE_		:     List[Any]					=					{
			    '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_		:     Optional[int]					=					model_name_to_url[model_name]
			print('Checkpoint URL: ',      A__				)
			SCREAMING_SNAKE_CASE_		:     str					=					torch.hub.load_state_dict_from_url(A__,      map_location='cpu'				)['model']

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

			SCREAMING_SNAKE_CASE_		:     List[Any]					=					get_focalnet_config(A__				)
			SCREAMING_SNAKE_CASE_		:     int					=					FocalNetForImageClassification(A__				)
			model.eval()

			# load state dict
			model.load_state_dict(A__				)

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

			SCREAMING_SNAKE_CASE_		:     List[Any]					=					BitImageProcessor(
			    do_resize=A__,      size={'shortest_edge': 2_5_6},      resample=PILImageResampling.BILINEAR,      do_center_crop=A__,      crop_size=2_2_4,      do_normalize=A__,      image_mean=A__,      image_std=A__,      )
			SCREAMING_SNAKE_CASE_		:     List[Any]					=					Image.open(requests.get(A__,      stream=A__				).raw				)
			SCREAMING_SNAKE_CASE_		:     str					=					processor(images=A__,      return_tensors='pt'				)

			SCREAMING_SNAKE_CASE_		:     int					=					transforms.Compose(
			    [
			        transforms.Resize(2_5_6				),
			        transforms.CenterCrop(2_2_4				),
			        transforms.ToTensor(),
			        transforms.Normalize(mean=[0.4_85, 0.4_56, 0.4_06],      std=[0.2_29, 0.2_24, 0.2_25]				),
			    ]				)

			SCREAMING_SNAKE_CASE_		:     Optional[Any]					=					image_transforms(A__				).unsqueeze(0				)

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

			SCREAMING_SNAKE_CASE_		:     Union[str, Any]					=					model(**A__				)

			SCREAMING_SNAKE_CASE_		:     Optional[Any]					=					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_		:     Dict					=					torch.tensor([0.21_66, -0.43_68, 0.21_91]				)
			elif model_name == "focalnet-tiny-lrf":
						SCREAMING_SNAKE_CASE_		:     Any					=					torch.tensor([1.16_69, 0.01_25, -0.16_95]				)
			elif model_name == "focalnet-small":
						SCREAMING_SNAKE_CASE_		:     List[Any]					=					torch.tensor([0.49_17, -0.04_30, 0.13_41]				)
			elif model_name == "focalnet-small-lrf":
						SCREAMING_SNAKE_CASE_		:     Optional[int]					=					torch.tensor([-0.25_88, -0.53_42, -0.23_31]				)
			elif model_name == "focalnet-base":
						SCREAMING_SNAKE_CASE_		:     Optional[int]					=					torch.tensor([-0.16_55, -0.40_90, -0.17_30]				)
			elif model_name == "focalnet-base-lrf":
						SCREAMING_SNAKE_CASE_		:     Union[str, Any]					=					torch.tensor([0.53_06, -0.04_83, -0.39_28]				)
			assert torch.allclose(outputs.logits[0, :3],      A__,      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(A__				)
						processor.save_pretrained(A__				)

			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__			:      List[Any]								=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__			:      Optional[int]								=parser.parse_args()
				convert_focalnet_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)









def 						a__			(				A__ = 5_0_0_0_0_0_0_0				):
			SCREAMING_SNAKE_CASE_		:     Union[str, Any]					=					set()
			SCREAMING_SNAKE_CASE_		:     Optional[int]					=					int((limit - 2_4) ** (1 / 2)				)

			SCREAMING_SNAKE_CASE_		:     Dict					=					set(range(3,      prime_square_limit + 1,      2				)				)
			primes.add(2				)
			for p in range(3,      prime_square_limit + 1,      2				):
						if p not in primes:
									continue
						primes.difference_update(set(range(p * p,      prime_square_limit + 1,      A__				)				)				)

			for primea in primes:
						SCREAMING_SNAKE_CASE_		:     int					=					primea * primea
						for primea in primes:
									SCREAMING_SNAKE_CASE_		:     Dict					=					primea * primea * primea
									if square + cube >= limit - 1_6:
												break
									for primea in primes:
												SCREAMING_SNAKE_CASE_		:     Optional[int]					=					primea * primea * primea * primea
												SCREAMING_SNAKE_CASE_		:     str					=					square + cube + tetr
												if total >= limit:
															break
												ret.add(A__				)

			return len(A__				)


if __name__ == "__main__":
				print(F"""{solution() = }""")





