




'''simple docstring'''




import argparse
import json
import os

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

from transformers import ConvNextImageProcessor, ConvNextVaConfig, ConvNextVaForImageClassification
from transformers.image_utils import PILImageResampling
from transformers.utils import logging


logging.set_verbosity_info()
snake_case__ 							=    logging.get_logger(__name__)




def     snake_case__     (			lowerCamelCase__					: List[Any]      ) -> int:
					A_			:  Optional[Any]			=				ConvNextVaConfig()

					if "atto" in checkpoint_url:
										A_			:  str			=				[2, 2, 6, 2]
										A_			:  Any			=				[4_0, 8_0, 1_6_0, 3_2_0]
					if "femto" in checkpoint_url:
										A_			:  Optional[Any]			=				[2, 2, 6, 2]
										A_			:  List[Any]			=				[4_8, 9_6, 1_9_2, 3_8_4]
					if "pico" in checkpoint_url:
										A_			:  List[str]			=				[2, 2, 6, 2]
										A_			:  Optional[int]			=				[6_4, 1_2_8, 2_5_6, 5_1_2]
					if "nano" in checkpoint_url:
										A_			:  Optional[int]			=				[2, 2, 8, 2]
										A_			:  List[str]			=				[8_0, 1_6_0, 3_2_0, 6_4_0]
					if "tiny" in checkpoint_url:
										A_			:  Optional[int]			=				[3, 3, 9, 3]
										A_			:  Optional[Any]			=				[9_6, 1_9_2, 3_8_4, 7_6_8]
					if "base" in checkpoint_url:
										A_			:  Optional[int]			=				[3, 3, 2_7, 3]
										A_			:  Optional[int]			=				[1_2_8, 2_5_6, 5_1_2, 1_0_2_4]
					if "large" in checkpoint_url:
										A_			:  str			=				[3, 3, 2_7, 3]
										A_			:  Tuple			=				[1_9_2, 3_8_4, 7_6_8, 1_5_3_6]
					if "huge" in checkpoint_url:
										A_			:  Union[str, Any]			=				[3, 3, 2_7, 3]
										A_			:  List[Any]			=				[3_5_2, 7_0_4, 1_4_0_8, 2_8_1_6]

					A_			:  Dict			=				1_0_0_0
					A_			:  Dict			=				'''imagenet-1k-id2label.json'''
					A_			:  str			=				(1, 1_0_0_0)

					A_			:  str			=				'''huggingface/label-files'''
					A_			:  Dict			=				num_labels
					A_			:  List[str]			=				json.load(open(hf_hub_download(lowerCamelCase__      ,		lowerCamelCase__      ,		repo_type='''dataset'''      )      ,		'''r'''      )      )
					A_			:  Union[str, Any]			=				{int(lowerCamelCase__      ): v for k, v in idalabel.items()}

					A_			:  int			=				idalabel
					A_			:  Dict			=				{v: k for k, v in idalabel.items()}
					A_			:  Union[str, Any]			=				hidden_sizes
					A_			:  Any			=				depths

					return config, expected_shape




def     snake_case__     (			lowerCamelCase__					: Dict      ) -> Tuple:
					if "downsample_layers.0.0" in name:
										A_			:  Dict			=				name.replace('''downsample_layers.0.0'''      ,		'''embeddings.patch_embeddings'''      )
					if "downsample_layers.0.1" in name:
										A_			:  Optional[int]			=				name.replace('''downsample_layers.0.1'''      ,		'''embeddings.norm'''      )  # we rename to layernorm later on
					if "downsample_layers.1.0" in name:
										A_			:  List[str]			=				name.replace('''downsample_layers.1.0'''      ,		'''stages.1.downsampling_layer.0'''      )
					if "downsample_layers.1.1" in name:
										A_			:  List[str]			=				name.replace('''downsample_layers.1.1'''      ,		'''stages.1.downsampling_layer.1'''      )
					if "downsample_layers.2.0" in name:
										A_			:  List[Any]			=				name.replace('''downsample_layers.2.0'''      ,		'''stages.2.downsampling_layer.0'''      )
					if "downsample_layers.2.1" in name:
										A_			:  Optional[int]			=				name.replace('''downsample_layers.2.1'''      ,		'''stages.2.downsampling_layer.1'''      )
					if "downsample_layers.3.0" in name:
										A_			:  int			=				name.replace('''downsample_layers.3.0'''      ,		'''stages.3.downsampling_layer.0'''      )
					if "downsample_layers.3.1" in name:
										A_			:  int			=				name.replace('''downsample_layers.3.1'''      ,		'''stages.3.downsampling_layer.1'''      )
					if "stages" in name and "downsampling_layer" not in name:
										# stages.0.0. for instance should be renamed to stages.0.layers.0.
										A_			:  List[str]			=				name[: len('''stages.0'''      )] + '''.layers''' + name[len('''stages.0'''      ) :]
					if "gamma" in name:
										A_			:  str			=				name.replace('''gamma'''      ,		'''weight'''      )
					if "beta" in name:
										A_			:  Dict			=				name.replace('''beta'''      ,		'''bias'''      )
					if "stages" in name:
										A_			:  int			=				name.replace('''stages'''      ,		'''encoder.stages'''      )
					if "norm" in name:
										A_			:  Optional[Any]			=				name.replace('''norm'''      ,		'''layernorm'''      )
					if "head" in name:
										A_			:  List[Any]			=				name.replace('''head'''      ,		'''classifier'''      )

					return name




def     snake_case__     (			) -> List[Any]:
					A_			:  List[str]			=				'''http://images.cocodataset.org/val2017/000000039769.jpg'''
					A_			:  List[str]			=				Image.open(requests.get(lowerCamelCase__      ,		stream=lowerCamelCase__      ).raw      )
					return im




def     snake_case__     (			lowerCamelCase__					: Any      ) -> Dict:
					if "224" in checkpoint_url:
										A_			:  int			=				2_2_4
										A_			:  Dict			=				2_2_4 / 2_5_6
					elif "384" in checkpoint_url:
										A_			:  List[str]			=				3_8_4
										A_			:  Dict			=				None
					else:
										A_			:  List[str]			=				5_1_2
										A_			:  Dict			=				None

					return ConvNextImageProcessor(
					    size=lowerCamelCase__      ,		crop_pct=lowerCamelCase__      ,		image_mean=[0.485, 0.456, 0.406]      ,		image_std=[0.229, 0.224, 0.225]      ,		resample=PILImageResampling.BICUBIC      ,		)




@torch.no_grad()
def     snake_case__     (			lowerCamelCase__					: str      ,		lowerCamelCase__					: Union[str, Any]      ,		lowerCamelCase__					: Any      ,		lowerCamelCase__					: List[Any]      ) -> List[Any]:
					print('''Downloading original model from checkpoint...'''      )
					# define ConvNeXTV2 configuration based on URL
					A_			,A_			:  Optional[Any]			=				get_convnextva_config(lowerCamelCase__      )
					# load original state_dict from URL
					A_			:  List[str]			=				torch.hub.load_state_dict_from_url(lowerCamelCase__      )['''model''']

					print('''Converting model parameters...'''      )
					# rename keys
					for key in state_dict.copy().keys():
										A_			:  int			=				state_dict.pop(lowerCamelCase__      )
										A_			:  Optional[Any]			=				val
					# add prefix to all keys expect classifier head
					for key in state_dict.copy().keys():
										A_			:  Tuple			=				state_dict.pop(lowerCamelCase__      )
										if not key.startswith('''classifier'''      ):
															A_			:  Dict			=				'''convnextv2.''' + key
										A_			:  List[Any]			=				val

					# load HuggingFace model
					A_			:  Any			=				ConvNextVaForImageClassification(lowerCamelCase__      )
					model.load_state_dict(lowerCamelCase__      )
					model.eval()

					# Check outputs on an image, prepared by ConvNextImageProcessor
					A_			:  Union[str, Any]			=				convert_preprocessor(lowerCamelCase__      )
					A_			:  Dict			=				preprocessor(images=prepare_img()      ,		return_tensors='''pt'''      )
					A_			:  Optional[Any]			=				model(**lowerCamelCase__      ).logits

					# note: the logits below were obtained without center cropping
					if checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_atto_1k_224_ema.pt":
										A_			:  Union[str, Any]			=				torch.tensor([-0.3930, 0.1747, -0.5246, 0.4177, 0.4295]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_femto_1k_224_ema.pt":
										A_			:  List[Any]			=				torch.tensor([-0.1727, -0.5341, -0.7818, -0.4745, -0.6566]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_pico_1k_224_ema.pt":
										A_			:  Any			=				torch.tensor([-0.0333, 0.1563, -0.9137, 0.1054, 0.0381]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_nano_1k_224_ema.pt":
										A_			:  Tuple			=				torch.tensor([-0.1744, -0.1555, -0.0713, 0.0950, -0.1431]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_tiny_1k_224_ema.pt":
										A_			:  Any			=				torch.tensor([0.9996, 0.1966, -0.4386, -0.3472, 0.6661]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_base_1k_224_ema.pt":
										A_			:  List[str]			=				torch.tensor([-0.2553, -0.6708, -0.1359, 0.2518, -0.2488]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_large_1k_224_ema.pt":
										A_			:  int			=				torch.tensor([-0.0673, -0.5627, -0.3753, -0.2722, 0.0178]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_huge_1k_224_ema.pt":
										A_			:  Any			=				torch.tensor([-0.6377, -0.7458, -0.2150, 0.1184, -0.0597]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_224_ema.pt":
										A_			:  str			=				torch.tensor([1.0799, 0.2322, -0.8860, 1.0219, 0.6231]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_384_ema.pt":
										A_			:  Dict			=				torch.tensor([0.3766, 0.4917, -1.1426, 0.9942, 0.6024]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_224_ema.pt":
										A_			:  str			=				torch.tensor([0.4220, -0.6919, -0.4317, -0.2881, -0.6609]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_384_ema.pt":
										A_			:  Any			=				torch.tensor([0.1082, -0.8286, -0.5095, 0.4681, -0.8085]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_224_ema.pt":
										A_			:  Tuple			=				torch.tensor([-0.2419, -0.6221, 0.2176, -0.0980, -0.7527]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_384_ema.pt":
										A_			:  Any			=				torch.tensor([0.0391, -0.4371, 0.3786, 0.1251, -0.2784]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_224_ema.pt":
										A_			:  List[str]			=				torch.tensor([-0.0504, 0.5636, -0.1729, -0.6507, -0.3949]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_384_ema.pt":
										A_			:  Any			=				torch.tensor([0.3560, 0.9486, 0.3149, -0.2667, -0.5138]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_384_ema.pt":
										A_			:  Optional[int]			=				torch.tensor([-0.2469, -0.4550, -0.5853, -0.0810, 0.0309]      )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_512_ema.pt":
										A_			:  List[str]			=				torch.tensor([-0.3090, 0.0802, -0.0682, -0.1979, -0.2826]      )
					else:
										raise ValueError(f'Unknown URL: {checkpoint_url}'      )

					assert torch.allclose(logits[0, :5]      ,		lowerCamelCase__      ,		atol=1e-3      )
					assert logits.shape == expected_shape
					print('''Model outputs match the original results!'''      )

					if save_model:
										print('''Saving model to local...'''      )
										# Create folder to save model
										if not os.path.isdir(lowerCamelCase__      ):
															os.mkdir(lowerCamelCase__      )

										model.save_pretrained(lowerCamelCase__      )
										preprocessor.save_pretrained(lowerCamelCase__      )

					A_			:  Dict			=				'''convnextv2'''
					if "atto" in checkpoint_url:
										model_name += "-atto"
					if "femto" in checkpoint_url:
										model_name += "-femto"
					if "pico" in checkpoint_url:
										model_name += "-pico"
					if "nano" in checkpoint_url:
										model_name += "-nano"
					elif "tiny" in checkpoint_url:
										model_name += "-tiny"
					elif "base" in checkpoint_url:
										model_name += "-base"
					elif "large" in checkpoint_url:
										model_name += "-large"
					elif "huge" in checkpoint_url:
										model_name += "-huge"
					if "22k" in checkpoint_url and "1k" not in checkpoint_url:
										model_name += "-22k"
					elif "22k" in checkpoint_url and "1k" in checkpoint_url:
										model_name += "-22k-1k"
					elif "1k" in checkpoint_url:
										model_name += "-1k"
					if "224" in checkpoint_url:
										model_name += "-224"
					elif "384" in checkpoint_url:
										model_name += "-384"
					elif "512" in checkpoint_url:
										model_name += "-512"

					if push_to_hub:
										print(f'Pushing {model_name} to the hub...'      )
										model.push_to_hub(lowerCamelCase__      )
										preprocessor.push_to_hub(lowerCamelCase__      )


if __name__ == "__main__":
							snake_case__ 							=    argparse.ArgumentParser()
							# Required parameters
							parser.add_argument(
							    """--checkpoint_url""",
							    default="""https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_atto_1k_224_ema.pt""",
							    type=str,
							    help="""URL of the original ConvNeXTV2 checkpoint you'd like to convert.""",
							)
							parser.add_argument(
							    """--pytorch_dump_folder_path""",
							    default="""model""",
							    type=str,
							    help="""Path to the output PyTorch model directory.""",
							)
							parser.add_argument("""--save_model""", action="""store_true""", help="""Save model to local""")
							parser.add_argument("""--push_to_hub""", action="""store_true""", help="""Push model and image preprocessor to the hub""")

							snake_case__ 							=    parser.parse_args()
							convert_convnextva_checkpoint(
							    args.checkpoint_url, args.pytorch_dump_folder_path, args.save_model, args.push_to_hub
							)









'''simple docstring'''




from itertools import permutations




def     snake_case__     (			lowerCamelCase__					: int = 5      ) -> int:
					if gon_side < 3 or gon_side > 5:
										raise ValueError('''gon_side must be in the range [3, 5]'''      )

					# Since it's 16, we know 10 is on the outer ring
					# Put the big numbers at the end so that they are never the first number
					A_			:  int			=				list(range(gon_side + 1      ,		0      ,		-1      )      )
					A_			:  List[Any]			=				list(range(gon_side + 2      ,		gon_side * 2 + 1      )      )

					for perm in permutations(small_numbers + big_numbers      ):
										A_			:  Optional[int]			=				generate_gon_ring(lowerCamelCase__      ,		list(lowerCamelCase__      )      )
										if is_magic_gon(lowerCamelCase__      ):
															return int(''''''.join(str(lowerCamelCase__      ) for n in numbers      )      )

					A_			:  Optional[Any]			=				f'Magic {gon_side}-gon ring is impossible'
					raise ValueError(lowerCamelCase__      )




def     snake_case__     (			lowerCamelCase__					: int      ,		lowerCamelCase__					: list[int]      ) -> list[int]:
					A_			:  List[Any]			=				[0] * (gon_side * 3)
					A_			:  Optional[Any]			=				perm[0:3]
					perm.append(perm[1]      )

					A_			:  Optional[Any]			=				1 if gon_side < 5 else 2

					for i in range(1      ,		len(lowerCamelCase__      ) // 3 + magic_number      ):
										A_			:  List[str]			=				perm[2 * i + 1]
										A_			:  str			=				result[3 * i - 1]
										A_			:  Union[str, Any]			=				perm[2 * i + 2]

					return result




def     snake_case__     (			lowerCamelCase__					: list[int]      ) -> bool:
					if len(lowerCamelCase__      ) % 3 != 0:
										raise ValueError('''a gon ring should have a length that is a multiple of 3'''      )

					if min(numbers[::3]      ) != numbers[0]:
										return False

					A_			:  Union[str, Any]			=				sum(numbers[:3]      )

					return all(sum(numbers[i : i + 3]      ) == total for i in range(3      ,		len(lowerCamelCase__      )      ,		3      )      )


if __name__ == "__main__":
							print(solution())



