



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()
_lowercase:				Dict       =	logging.get_logger(__name__)






def 					a(   A :					Any )	-> Union[str, Any]:
					"""simple docstring"""





					a        =     ConvNextVaConfig()

					if "atto" in checkpoint_url:
										a        =     [2, 2, 6, 2]
										a        =     [40, 80, 160, 320]
					if "femto" in checkpoint_url:
										a        =     [2, 2, 6, 2]
										a        =     [48, 96, 192, 384]
					if "pico" in checkpoint_url:
										a        =     [2, 2, 6, 2]
										a        =     [64, 128, 256, 512]
					if "nano" in checkpoint_url:
										a        =     [2, 2, 8, 2]
										a        =     [80, 160, 320, 640]
					if "tiny" in checkpoint_url:
										a        =     [3, 3, 9, 3]
										a        =     [96, 192, 384, 768]
					if "base" in checkpoint_url:
										a        =     [3, 3, 27, 3]
										a        =     [128, 256, 512, 1024]
					if "large" in checkpoint_url:
										a        =     [3, 3, 27, 3]
										a        =     [192, 384, 768, 1536]
					if "huge" in checkpoint_url:
										a        =     [3, 3, 27, 3]
										a        =     [352, 704, 1408, 2816]

					a        =     1000
					a        =     '''imagenet-1k-id2label.json'''
					a        =     (1, 1000)

					a        =     '''huggingface/label-files'''
					a        =     num_labels
					a        =     json.load(open(hf_hub_download(SCREAMING_SNAKE_CASE__				,  SCREAMING_SNAKE_CASE__				,  repo_type="dataset" )				,  "r" ) )
					a        =     {int(SCREAMING_SNAKE_CASE__ ): v for k, v in idalabel.items()}

					a        =     idalabel
					a        =     {v: k for k, v in idalabel.items()}
					a        =     hidden_sizes
					a        =     depths

					return config, expected_shape






def 					a(   A :					List[Any] )	-> str:
					"""simple docstring"""





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

					return name






def 					a(   )	-> Optional[int]:
					"""simple docstring"""





					a        =     '''http://images.cocodataset.org/val2017/000000039769.jpg'''
					a        =     Image.open(requests.get(SCREAMING_SNAKE_CASE__				,  stream=SCREAMING_SNAKE_CASE__ ).raw )
					return im






def 					a(   A :					Tuple )	-> Tuple:
					"""simple docstring"""





					if "224" in checkpoint_url:
										a        =     224
										a        =     224 / 256
					elif "384" in checkpoint_url:
										a        =     384
										a        =     None
					else:
										a        =     512
										a        =     None

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






@torch.no_grad()
def 					a(   A :					Optional[Any]				,  A :					Dict				,  A :					Tuple				,  A :					Any )	-> Union[str, Any]:
					"""simple docstring"""





					print("Downloading original model from checkpoint..." )
					# define ConvNeXTV2 configuration based on URL
					a        =     get_convnextva_config(SCREAMING_SNAKE_CASE__ )
					# load original state_dict from URL
					a        =     torch.hub.load_state_dict_from_url(SCREAMING_SNAKE_CASE__ )['''model''']

					print("Converting model parameters..." )
					# rename keys
					for key in state_dict.copy().keys():
										a        =     state_dict.pop(SCREAMING_SNAKE_CASE__ )
										a        =     val
					# add prefix to all keys expect classifier head
					for key in state_dict.copy().keys():
										a        =     state_dict.pop(SCREAMING_SNAKE_CASE__ )
										if not key.startswith("classifier" ):
															a        =     '''convnextv2.''' + key
										a        =     val

					# load HuggingFace model
					a        =     ConvNextVaForImageClassification(SCREAMING_SNAKE_CASE__ )
					model.load_state_dict(SCREAMING_SNAKE_CASE__ )
					model.eval()

					# Check outputs on an image, prepared by ConvNextImageProcessor
					a        =     convert_preprocessor(SCREAMING_SNAKE_CASE__ )
					a        =     preprocessor(images=prepare_img()				,  return_tensors="pt" )
					a        =     model(**SCREAMING_SNAKE_CASE__ ).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        =     torch.tensor([-0.3_930, 0.1_747, -0.5_246, 0.4_177, 0.4_295] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_femto_1k_224_ema.pt":
										a        =     torch.tensor([-0.1_727, -0.5_341, -0.7_818, -0.4_745, -0.6_566] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_pico_1k_224_ema.pt":
										a        =     torch.tensor([-0.0_333, 0.1_563, -0.9_137, 0.1_054, 0.0_381] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_nano_1k_224_ema.pt":
										a        =     torch.tensor([-0.1_744, -0.1_555, -0.0_713, 0.0_950, -0.1_431] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_tiny_1k_224_ema.pt":
										a        =     torch.tensor([0.9_996, 0.1_966, -0.4_386, -0.3_472, 0.6_661] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_base_1k_224_ema.pt":
										a        =     torch.tensor([-0.2_553, -0.6_708, -0.1_359, 0.2_518, -0.2_488] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_large_1k_224_ema.pt":
										a        =     torch.tensor([-0.0_673, -0.5_627, -0.3_753, -0.2_722, 0.0_178] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_huge_1k_224_ema.pt":
										a        =     torch.tensor([-0.6_377, -0.7_458, -0.2_150, 0.1_184, -0.0_597] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_224_ema.pt":
										a        =     torch.tensor([1.0_799, 0.2_322, -0.8_860, 1.0_219, 0.6_231] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_384_ema.pt":
										a        =     torch.tensor([0.3_766, 0.4_917, -1.1_426, 0.9_942, 0.6_024] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_224_ema.pt":
										a        =     torch.tensor([0.4_220, -0.6_919, -0.4_317, -0.2_881, -0.6_609] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_384_ema.pt":
										a        =     torch.tensor([0.1_082, -0.8_286, -0.5_095, 0.4_681, -0.8_085] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_224_ema.pt":
										a        =     torch.tensor([-0.2_419, -0.6_221, 0.2_176, -0.0_980, -0.7_527] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_384_ema.pt":
										a        =     torch.tensor([0.0_391, -0.4_371, 0.3_786, 0.1_251, -0.2_784] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_224_ema.pt":
										a        =     torch.tensor([-0.0_504, 0.5_636, -0.1_729, -0.6_507, -0.3_949] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_384_ema.pt":
										a        =     torch.tensor([0.3_560, 0.9_486, 0.3_149, -0.2_667, -0.5_138] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_384_ema.pt":
										a        =     torch.tensor([-0.2_469, -0.4_550, -0.5_853, -0.0_810, 0.0_309] )
					elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_512_ema.pt":
										a        =     torch.tensor([-0.3_090, 0.0_802, -0.0_682, -0.1_979, -0.2_826] )
					else:
										raise ValueError(f'''Unknown URL: {checkpoint_url}''' )

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

										model.save_pretrained(SCREAMING_SNAKE_CASE__ )
										preprocessor.save_pretrained(SCREAMING_SNAKE_CASE__ )

					a        =     '''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(SCREAMING_SNAKE_CASE__ )
										preprocessor.push_to_hub(SCREAMING_SNAKE_CASE__ )


if __name__ == "__main__":
				_lowercase:				List[str]       =	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")

				_lowercase:				List[Any]       =	parser.parse_args()
				convert_convnextva_checkpoint(
				    args.checkpoint_url, args.pytorch_dump_folder_path, args.save_model, args.push_to_hub
				)





import torch

from diffusers import EulerAncestralDiscreteScheduler
from diffusers.utils import torch_device

from .test_schedulers import SchedulerCommonTest



class 			_lowercase							(     lowerCAmelCase			):





	"""simple docstring"""
	__A					=							(EulerAncestralDiscreteScheduler,)
	__A					=							10




	def   UpperCamelCase_ (self	, **lowerCamelCase_	):
						"""simple docstring"""

						a        =     {
						    "num_train_timesteps": 1100,
						    "beta_start": 0.0001,
						    "beta_end": 0.02,
						    "beta_schedule": "linear",
						}

						config.update(**lowerCamelCase_	)
						return config




	def   UpperCamelCase_ (self	):
						"""simple docstring"""

						for timesteps in [10, 50, 100, 1000]:
											self.check_over_configs(num_train_timesteps=lowerCamelCase_	)




	def   UpperCamelCase_ (self	):
						"""simple docstring"""

						for beta_start, beta_end in zip([0.0_0001, 0.0001, 0.001]	, [0.0002, 0.002, 0.02]	):
											self.check_over_configs(beta_start=lowerCamelCase_	, beta_end=lowerCamelCase_	)




	def   UpperCamelCase_ (self	):
						"""simple docstring"""

						for schedule in ["linear", "scaled_linear"]:
											self.check_over_configs(beta_schedule=lowerCamelCase_	)




	def   UpperCamelCase_ (self	):
						"""simple docstring"""

						for prediction_type in ["epsilon", "v_prediction"]:
											self.check_over_configs(prediction_type=lowerCamelCase_	)




	def   UpperCamelCase_ (self	):
						"""simple docstring"""

						a        =     self.scheduler_classes[0]
						a        =     self.get_scheduler_config()
						a        =     scheduler_class(**lowerCamelCase_	)

						scheduler.set_timesteps(self.num_inference_steps	)

						a        =     torch.manual_seed(0	)

						a        =     self.dummy_model()
						a        =     self.dummy_sample_deter * scheduler.init_noise_sigma.cpu()
						a        =     sample.to(lowerCamelCase_	)

						for i, t in enumerate(scheduler.timesteps	):
											a        =     scheduler.scale_model_input(lowerCamelCase_	, lowerCamelCase_	)

											a        =     model(lowerCamelCase_	, lowerCamelCase_	)

											a        =     scheduler.step(lowerCamelCase_	, lowerCamelCase_	, lowerCamelCase_	, generator=lowerCamelCase_	)
											a        =     output.prev_sample

						a        =     torch.sum(torch.abs(lowerCamelCase_	)	)
						a        =     torch.mean(torch.abs(lowerCamelCase_	)	)

						assert abs(result_sum.item() - 152.3192	) < 1E-2
						assert abs(result_mean.item() - 0.1983	) < 1E-3




	def   UpperCamelCase_ (self	):
						"""simple docstring"""

						a        =     self.scheduler_classes[0]
						a        =     self.get_scheduler_config(prediction_type="v_prediction"	)
						a        =     scheduler_class(**lowerCamelCase_	)

						scheduler.set_timesteps(self.num_inference_steps	)

						a        =     torch.manual_seed(0	)

						a        =     self.dummy_model()
						a        =     self.dummy_sample_deter * scheduler.init_noise_sigma
						a        =     sample.to(lowerCamelCase_	)

						for i, t in enumerate(scheduler.timesteps	):
											a        =     scheduler.scale_model_input(lowerCamelCase_	, lowerCamelCase_	)

											a        =     model(lowerCamelCase_	, lowerCamelCase_	)

											a        =     scheduler.step(lowerCamelCase_	, lowerCamelCase_	, lowerCamelCase_	, generator=lowerCamelCase_	)
											a        =     output.prev_sample

						a        =     torch.sum(torch.abs(lowerCamelCase_	)	)
						a        =     torch.mean(torch.abs(lowerCamelCase_	)	)

						assert abs(result_sum.item() - 108.4439	) < 1E-2
						assert abs(result_mean.item() - 0.1412	) < 1E-3




	def   UpperCamelCase_ (self	):
						"""simple docstring"""

						a        =     self.scheduler_classes[0]
						a        =     self.get_scheduler_config()
						a        =     scheduler_class(**lowerCamelCase_	)

						scheduler.set_timesteps(self.num_inference_steps	, device=lowerCamelCase_	)
						a        =     torch.manual_seed(0	)

						a        =     self.dummy_model()
						a        =     self.dummy_sample_deter * scheduler.init_noise_sigma.cpu()
						a        =     sample.to(lowerCamelCase_	)

						for t in scheduler.timesteps:
											a        =     scheduler.scale_model_input(lowerCamelCase_	, lowerCamelCase_	)

											a        =     model(lowerCamelCase_	, lowerCamelCase_	)

											a        =     scheduler.step(lowerCamelCase_	, lowerCamelCase_	, lowerCamelCase_	, generator=lowerCamelCase_	)
											a        =     output.prev_sample

						a        =     torch.sum(torch.abs(lowerCamelCase_	)	)
						a        =     torch.mean(torch.abs(lowerCamelCase_	)	)

						assert abs(result_sum.item() - 152.3192	) < 1E-2
						assert abs(result_mean.item() - 0.1983	) < 1E-3
