



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()
__A             =logging.get_logger(__name__)

def 	a						(				_UpperCAmelCase							: List[Any]						):







		'''simple docstring'''





		__UpperCAmelCase   :					str													=     ConvNextVaConfig()

		if "atto" in checkpoint_url:
				__UpperCAmelCase   :					Optional[Any]													=     [2, 2, 6, 2]
				__UpperCAmelCase   :					List[Any]													=     [40, 80, 1_60, 3_20]
		if "femto" in checkpoint_url:
				__UpperCAmelCase   :					Any													=     [2, 2, 6, 2]
				__UpperCAmelCase   :					Dict													=     [48, 96, 1_92, 3_84]
		if "pico" in checkpoint_url:
				__UpperCAmelCase   :					Union[str, Any]													=     [2, 2, 6, 2]
				__UpperCAmelCase   :					int													=     [64, 1_28, 2_56, 5_12]
		if "nano" in checkpoint_url:
				__UpperCAmelCase   :					Union[str, Any]													=     [2, 2, 8, 2]
				__UpperCAmelCase   :					List[str]													=     [80, 1_60, 3_20, 6_40]
		if "tiny" in checkpoint_url:
				__UpperCAmelCase   :					Dict													=     [3, 3, 9, 3]
				__UpperCAmelCase   :					Union[str, Any]													=     [96, 1_92, 3_84, 7_68]
		if "base" in checkpoint_url:
				__UpperCAmelCase   :					List[Any]													=     [3, 3, 27, 3]
				__UpperCAmelCase   :					List[str]													=     [1_28, 2_56, 5_12, 10_24]
		if "large" in checkpoint_url:
				__UpperCAmelCase   :					List[str]													=     [3, 3, 27, 3]
				__UpperCAmelCase   :					Dict													=     [1_92, 3_84, 7_68, 15_36]
		if "huge" in checkpoint_url:
				__UpperCAmelCase   :					List[str]													=     [3, 3, 27, 3]
				__UpperCAmelCase   :					Union[str, Any]													=     [3_52, 7_04, 14_08, 28_16]

		__UpperCAmelCase   :					str													=     10_00
		__UpperCAmelCase   :					List[Any]													=     '''imagenet-1k-id2label.json'''
		__UpperCAmelCase   :					List[Any]													=     (1, 10_00)

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

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

		return config, expected_shape

def 	a						(				_UpperCAmelCase							: Dict						):







		'''simple docstring'''





		if "downsample_layers.0.0" in name:
				__UpperCAmelCase   :					Union[str, Any]													=     name.replace('''downsample_layers.0.0'''			,       '''embeddings.patch_embeddings'''						)
		if "downsample_layers.0.1" in name:
				__UpperCAmelCase   :					List[Any]													=     name.replace('''downsample_layers.0.1'''			,       '''embeddings.norm'''						)  # we rename to layernorm later on
		if "downsample_layers.1.0" in name:
				__UpperCAmelCase   :					Optional[int]													=     name.replace('''downsample_layers.1.0'''			,       '''stages.1.downsampling_layer.0'''						)
		if "downsample_layers.1.1" in name:
				__UpperCAmelCase   :					List[Any]													=     name.replace('''downsample_layers.1.1'''			,       '''stages.1.downsampling_layer.1'''						)
		if "downsample_layers.2.0" in name:
				__UpperCAmelCase   :					List[Any]													=     name.replace('''downsample_layers.2.0'''			,       '''stages.2.downsampling_layer.0'''						)
		if "downsample_layers.2.1" in name:
				__UpperCAmelCase   :					Optional[int]													=     name.replace('''downsample_layers.2.1'''			,       '''stages.2.downsampling_layer.1'''						)
		if "downsample_layers.3.0" in name:
				__UpperCAmelCase   :					Any													=     name.replace('''downsample_layers.3.0'''			,       '''stages.3.downsampling_layer.0'''						)
		if "downsample_layers.3.1" in name:
				__UpperCAmelCase   :					Dict													=     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.
				__UpperCAmelCase   :					Dict													=     name[: len('''stages.0'''						)] + '''.layers''' + name[len('''stages.0'''						) :]
		if "gamma" in name:
				__UpperCAmelCase   :					Union[str, Any]													=     name.replace('''gamma'''			,       '''weight'''						)
		if "beta" in name:
				__UpperCAmelCase   :					Union[str, Any]													=     name.replace('''beta'''			,       '''bias'''						)
		if "stages" in name:
				__UpperCAmelCase   :					Any													=     name.replace('''stages'''			,       '''encoder.stages'''						)
		if "norm" in name:
				__UpperCAmelCase   :					Tuple													=     name.replace('''norm'''			,       '''layernorm'''						)
		if "head" in name:
				__UpperCAmelCase   :					List[str]													=     name.replace('''head'''			,       '''classifier'''						)

		return name

def 	a						(				):







		'''simple docstring'''





		__UpperCAmelCase   :					List[str]													=     '''http://images.cocodataset.org/val2017/000000039769.jpg'''
		__UpperCAmelCase   :					List[Any]													=     Image.open(requests.get(_UpperCAmelCase			,       stream=_UpperCAmelCase						).raw						)
		return im

def 	a						(				_UpperCAmelCase							: str						):







		'''simple docstring'''





		if "224" in checkpoint_url:
				__UpperCAmelCase   :					Union[str, Any]													=     2_24
				__UpperCAmelCase   :					Tuple													=     2_24 / 2_56
		elif "384" in checkpoint_url:
				__UpperCAmelCase   :					Optional[int]													=     3_84
				__UpperCAmelCase   :					int													=     None
		else:
				__UpperCAmelCase   :					Optional[Any]													=     5_12
				__UpperCAmelCase   :					Optional[Any]													=     None

		return ConvNextImageProcessor(
		    size=_UpperCAmelCase			,       crop_pct=_UpperCAmelCase			,       image_mean=[0.4_85, 0.4_56, 0.4_06]			,       image_std=[0.2_29, 0.2_24, 0.2_25]			,       resample=PILImageResampling.BICUBIC			,       )

@torch.no_grad()
def 	a						(				_UpperCAmelCase							: Tuple			,       _UpperCAmelCase							: Tuple			,       _UpperCAmelCase							: Tuple			,       _UpperCAmelCase							: List[str]						):







		'''simple docstring'''





		print('''Downloading original model from checkpoint...'''						)
		# define ConvNeXTV2 configuration based on URL
		__UpperCAmelCase							, __UpperCAmelCase   :					Optional[Any]													=     get_convnextva_config(_UpperCAmelCase						)
		# load original state_dict from URL
		__UpperCAmelCase   :					Optional[int]													=     torch.hub.load_state_dict_from_url(_UpperCAmelCase						)['''model''']

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

		# load HuggingFace model
		__UpperCAmelCase   :					Optional[Any]													=     ConvNextVaForImageClassification(_UpperCAmelCase						)
		model.load_state_dict(_UpperCAmelCase						)
		model.eval()

		# Check outputs on an image, prepared by ConvNextImageProcessor
		__UpperCAmelCase   :					Dict													=     convert_preprocessor(_UpperCAmelCase						)
		__UpperCAmelCase   :					str													=     preprocessor(images=prepare_img()			,       return_tensors='''pt'''						)
		__UpperCAmelCase   :					Optional[int]													=     model(**_UpperCAmelCase						).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":
				__UpperCAmelCase   :					Optional[Any]													=     torch.tensor([-0.39_30, 0.17_47, -0.52_46, 0.41_77, 0.42_95]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_femto_1k_224_ema.pt":
				__UpperCAmelCase   :					str													=     torch.tensor([-0.17_27, -0.53_41, -0.78_18, -0.47_45, -0.65_66]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_pico_1k_224_ema.pt":
				__UpperCAmelCase   :					List[Any]													=     torch.tensor([-0.03_33, 0.15_63, -0.91_37, 0.10_54, 0.03_81]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_nano_1k_224_ema.pt":
				__UpperCAmelCase   :					List[Any]													=     torch.tensor([-0.17_44, -0.15_55, -0.07_13, 0.09_50, -0.14_31]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_tiny_1k_224_ema.pt":
				__UpperCAmelCase   :					Optional[int]													=     torch.tensor([0.99_96, 0.19_66, -0.43_86, -0.34_72, 0.66_61]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_base_1k_224_ema.pt":
				__UpperCAmelCase   :					Union[str, Any]													=     torch.tensor([-0.25_53, -0.67_08, -0.13_59, 0.25_18, -0.24_88]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_large_1k_224_ema.pt":
				__UpperCAmelCase   :					int													=     torch.tensor([-0.06_73, -0.56_27, -0.37_53, -0.27_22, 0.01_78]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_huge_1k_224_ema.pt":
				__UpperCAmelCase   :					str													=     torch.tensor([-0.63_77, -0.74_58, -0.21_50, 0.11_84, -0.05_97]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_224_ema.pt":
				__UpperCAmelCase   :					List[Any]													=     torch.tensor([1.07_99, 0.23_22, -0.88_60, 1.02_19, 0.62_31]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_384_ema.pt":
				__UpperCAmelCase   :					Dict													=     torch.tensor([0.37_66, 0.49_17, -1.14_26, 0.99_42, 0.60_24]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_224_ema.pt":
				__UpperCAmelCase   :					Tuple													=     torch.tensor([0.42_20, -0.69_19, -0.43_17, -0.28_81, -0.66_09]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_384_ema.pt":
				__UpperCAmelCase   :					int													=     torch.tensor([0.10_82, -0.82_86, -0.50_95, 0.46_81, -0.80_85]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_224_ema.pt":
				__UpperCAmelCase   :					List[str]													=     torch.tensor([-0.24_19, -0.62_21, 0.21_76, -0.09_80, -0.75_27]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_384_ema.pt":
				__UpperCAmelCase   :					Dict													=     torch.tensor([0.03_91, -0.43_71, 0.37_86, 0.12_51, -0.27_84]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_224_ema.pt":
				__UpperCAmelCase   :					List[Any]													=     torch.tensor([-0.05_04, 0.56_36, -0.17_29, -0.65_07, -0.39_49]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_384_ema.pt":
				__UpperCAmelCase   :					Optional[Any]													=     torch.tensor([0.35_60, 0.94_86, 0.31_49, -0.26_67, -0.51_38]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_384_ema.pt":
				__UpperCAmelCase   :					int													=     torch.tensor([-0.24_69, -0.45_50, -0.58_53, -0.08_10, 0.03_09]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_512_ema.pt":
				__UpperCAmelCase   :					str													=     torch.tensor([-0.30_90, 0.08_02, -0.06_82, -0.19_79, -0.28_26]						)
		else:
				raise ValueError(f'Unknown URL: {checkpoint_url}'						)

		assert torch.allclose(logits[0, :5]			,       _UpperCAmelCase			,       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(_UpperCAmelCase						):
						os.mkdir(_UpperCAmelCase						)

				model.save_pretrained(_UpperCAmelCase						)
				preprocessor.save_pretrained(_UpperCAmelCase						)

		__UpperCAmelCase   :					str													=     '''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(_UpperCAmelCase						)
				preprocessor.push_to_hub(_UpperCAmelCase						)


if __name__ == "__main__":
				__A             =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")

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










def 	a						(				_UpperCAmelCase							: Optional[int]			,       _UpperCAmelCase							: List[Any]						):







		'''simple docstring'''





		__UpperCAmelCase   :					int													=     len(_UpperCAmelCase						)
		# Create a stack and push index of fist element to it
		__UpperCAmelCase   :					List[Any]													=     []
		st.append(0						)

		# Span value of first element is always 1
		__UpperCAmelCase   :					Any													=     1

		# Calculate span values for rest of the elements
		for i in range(1			,       _UpperCAmelCase						):
				# Pop elements from stack while stack is not
				# empty and top of stack is smaller than price[i]
				while len(_UpperCAmelCase						) > 0 and price[st[0]] <= price[i]:
						st.pop()

				# If stack becomes empty, then price[i] is greater
				# than all elements on left of it, i.e. price[0],
				# price[1], ..price[i-1]. Else the price[i]  is
				# greater than elements after top of stack
				__UpperCAmelCase   :					int													=     i + 1 if len(_UpperCAmelCase						) <= 0 else (i - st[0])

				# Push this element to stack
				st.append(_UpperCAmelCase						)

def 	a						(				_UpperCAmelCase							: Dict			,       _UpperCAmelCase							: List[str]						):







		'''simple docstring'''





		for i in range(0			,       _UpperCAmelCase						):
				print(arr[i]			,       end=''' '''						)


# Driver program to test above function
__A             =[1_0, 4, 5, 9_0, 1_2_0, 8_0]
__A             =[0 for i in range(len(price) + 1)]

# Fill the span values in array S[]
calculation_span(price, S)
print_array(S, len(price))





