



'''simple docstring'''

import argparse
import json
from pathlib import Path

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

from transformers import ConvNextConfig, ConvNextForImageClassification, ConvNextImageProcessor
from transformers.utils import logging


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



def   __lowerCamelCase  (   lowerCAmelCase_						)    ->   List[str]:
		_a  :   Optional[Any]				 =							ConvNextConfig()

		if "tiny" in checkpoint_url:
				_a  :   Tuple				 =							[3, 3, 9, 3]
				_a  :   List[Any]				 =							[96, 192, 384, 768]
		if "small" in checkpoint_url:
				_a  :   int				 =							[3, 3, 27, 3]
				_a  :   Any				 =							[96, 192, 384, 768]
		if "base" in checkpoint_url:
				_a  :   Any				 =							[3, 3, 27, 3]
				_a  :   Optional[int]				 =							[128, 256, 512, 1024]
		if "large" in checkpoint_url:
				_a  :   Optional[int]				 =							[3, 3, 27, 3]
				_a  :   Optional[int]				 =							[192, 384, 768, 1536]
		if "xlarge" in checkpoint_url:
				_a  :   str				 =							[3, 3, 27, 3]
				_a  :   int				 =							[256, 512, 1024, 2048]

		if "1k" in checkpoint_url:
				_a  :   List[Any]				 =							1000
				_a  :   List[str]				 =							'imagenet-1k-id2label.json'
				_a  :   Any				 =							(1, 1000)
		else:
				_a  :   str				 =							21841
				_a  :   Tuple				 =							'imagenet-22k-id2label.json'
				_a  :   List[Any]				 =							(1, 21841)

		_a  :   Any				 =							'huggingface/label-files'
		_a  :   str				 =							num_labels
		_a  :   List[str]				 =							json.load(open(hf_hub_download(lowerCAmelCase_		,    lowerCAmelCase_		,    repo_type='dataset'						)		,    'r'						)						)
		_a  :   List[str]				 =							{int(lowerCAmelCase_						): v for k, v in idalabel.items()}
		if "1k" not in checkpoint_url:
				# this dataset contains 21843 labels but the model only has 21841
				# we delete the classes as mentioned in https://github.com/google-research/big_transfer/issues/18
				del idalabel[9205]
				del idalabel[15027]
		_a  :   Dict				 =							idalabel
		_a  :   Any				 =							{v: k for k, v in idalabel.items()}
		_a  :   Dict				 =							hidden_sizes
		_a  :   List[str]				 =							depths

		return config, expected_shape



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

		return name



def   __lowerCamelCase  (   )    ->   Optional[Any]:
		_a  :   Tuple				 =							'http://images.cocodataset.org/val2017/000000039769.jpg'
		_a  :   List[Any]				 =							Image.open(requests.get(lowerCAmelCase_		,    stream=lowerCAmelCase_						).raw						)
		return im



@torch.no_grad()
def   __lowerCamelCase  (   lowerCAmelCase_		,    lowerCAmelCase_						)    ->   str:
		_a ,      _a  :   Dict				 =							get_convnext_config(lowerCAmelCase_						)
		# load original state_dict from URL
		_a  :   Tuple				 =							torch.hub.load_state_dict_from_url(lowerCAmelCase_						)['model']
		# rename keys
		for key in state_dict.copy().keys():
				_a  :   List[str]				 =							state_dict.pop(lowerCAmelCase_						)
				_a  :   Dict				 =							val
		# add prefix to all keys expect classifier head
		for key in state_dict.copy().keys():
				_a  :   Optional[Any]				 =							state_dict.pop(lowerCAmelCase_						)
				if not key.startswith('classifier'						):
						_a  :   Optional[Any]				 =							'convnext.' + key
				_a  :   Union[str, Any]				 =							val

		# load HuggingFace model
		_a  :   Optional[Any]				 =							ConvNextForImageClassification(lowerCAmelCase_						)
		model.load_state_dict(lowerCAmelCase_						)
		model.eval()

		# Check outputs on an image, prepared by ConvNextImageProcessor
		_a  :   Any				 =							224 if '224' in checkpoint_url else 384
		_a  :   str				 =							ConvNextImageProcessor(size=lowerCAmelCase_						)
		_a  :   Dict				 =							image_processor(images=prepare_img()		,    return_tensors='pt'						).pixel_values

		_a  :   Any				 =							model(lowerCAmelCase_						).logits

		# note: the logits below were obtained without center cropping
		if checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_tiny_1k_224_ema.pth":
				_a  :   List[Any]				 =							torch.tensor([-0.1_210, -0.6_605, 0.1_918]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_small_1k_224_ema.pth":
				_a  :   Optional[int]				 =							torch.tensor([-0.4_473, -0.1_847, -0.6_365]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_224_ema.pth":
				_a  :   Optional[int]				 =							torch.tensor([0.4_525, 0.7_539, 0.0_308]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_384.pth":
				_a  :   Tuple				 =							torch.tensor([0.3_561, 0.6_350, -0.0_384]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_224_ema.pth":
				_a  :   int				 =							torch.tensor([0.4_174, -0.0_989, 0.1_489]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_384.pth":
				_a  :   str				 =							torch.tensor([0.2_513, -0.1_349, -0.1_613]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_224.pth":
				_a  :   Optional[Any]				 =							torch.tensor([1.2_980, 0.3_631, -0.1_198]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_224.pth":
				_a  :   Union[str, Any]				 =							torch.tensor([1.2_963, 0.1_227, 0.1_723]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_224.pth":
				_a  :   List[Any]				 =							torch.tensor([1.7_956, 0.8_390, 0.2_820]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_224.pth":
				_a  :   Tuple				 =							torch.tensor([-0.2_822, -0.0_502, -0.0_878]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_384.pth":
				_a  :   Optional[int]				 =							torch.tensor([-0.5_672, -0.0_730, -0.4_348]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_224.pth":
				_a  :   int				 =							torch.tensor([0.2_681, 0.2_365, 0.6_246]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_384.pth":
				_a  :   List[str]				 =							torch.tensor([-0.2_642, 0.3_931, 0.5_116]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_224_ema.pth":
				_a  :   int				 =							torch.tensor([-0.6_677, -0.1_873, -0.8_379]						)
		elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_384_ema.pth":
				_a  :   List[Any]				 =							torch.tensor([-0.7_749, -0.2_967, -0.6_444]						)
		else:
				raise ValueError(f"""Unknown URL: {checkpoint_url}"""						)

		assert torch.allclose(logits[0, :3]		,    lowerCAmelCase_		,    atol=1E-3						)
		assert logits.shape == expected_shape

		Path(lowerCAmelCase_						).mkdir(exist_ok=lowerCAmelCase_						)
		print(f"""Saving model to {pytorch_dump_folder_path}"""						)
		model.save_pretrained(lowerCAmelCase_						)
		print(f"""Saving image processor to {pytorch_dump_folder_path}"""						)
		image_processor.save_pretrained(lowerCAmelCase_						)

		print('Pushing model to the hub...'						)
		_a  :   Optional[Any]				 =							'convnext'
		if "tiny" in checkpoint_url:
				model_name += "-tiny"
		elif "small" in checkpoint_url:
				model_name += "-small"
		elif "base" in checkpoint_url:
				model_name += "-base"
		elif "xlarge" in checkpoint_url:
				model_name += "-xlarge"
		elif "large" in checkpoint_url:
				model_name += "-large"
		if "224" in checkpoint_url:
				model_name += "-224"
		elif "384" in checkpoint_url:
				model_name += "-384"
		if "22k" in checkpoint_url and "1k" not in checkpoint_url:
				model_name += "-22k"
		if "22k" in checkpoint_url and "1k" in checkpoint_url:
				model_name += "-22k-1k"

		model.push_to_hub(
		    repo_path_or_name=Path(lowerCAmelCase_		,    lowerCAmelCase_						)		,    organization='nielsr'		,    commit_message='Add model'		,    )


if __name__ == "__main__":
							__lowerCAmelCase		    =     argparse.ArgumentParser()
							# Required parameters
							parser.add_argument(
							    '''--checkpoint_url''',
							    default='''https://dl.fbaipublicfiles.com/convnext/convnext_tiny_1k_224_ema.pth''',
							    type=str,
							    help='''URL of the original ConvNeXT checkpoint you\'d like to convert.''',
							)
							parser.add_argument(
							    '''--pytorch_dump_folder_path''',
							    default=None,
							    type=str,
							    required=True,
							    help='''Path to the output PyTorch model directory.''',
							)

							__lowerCAmelCase		    =     parser.parse_args()
							convert_convnext_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)









'''simple docstring'''

from __future__ import annotations

# Define the Gravitational Constant G and the function
__lowerCAmelCase		    =     6.6743e-11  # unit of G : m^3 * kg^-1 * s^-2



def   __lowerCamelCase  (   lowerCAmelCase_		,    lowerCAmelCase_		,    lowerCAmelCase_		,    lowerCAmelCase_						)    ->   dict[str, float]:
		_a  :   str				 =							mass_a * mass_a

		if (force, mass_a, mass_a, distance).count(0						) != 1:
				raise ValueError('One and only one argument must be 0'						)
		if force < 0:
				raise ValueError('Gravitational force can not be negative'						)
		if distance < 0:
				raise ValueError('Distance can not be negative'						)
		if mass_a < 0 or mass_a < 0:
				raise ValueError('Mass can not be negative'						)
		if force == 0:
				_a  :   List[Any]				 =							GRAVITATIONAL_CONSTANT * product_of_mass / (distance**2)
				return {"force": force}
		elif mass_a == 0:
				_a  :   Any				 =							(force) * (distance**2) / (GRAVITATIONAL_CONSTANT * mass_a)
				return {"mass_1": mass_a}
		elif mass_a == 0:
				_a  :   Tuple				 =							(force) * (distance**2) / (GRAVITATIONAL_CONSTANT * mass_a)
				return {"mass_2": mass_a}
		elif distance == 0:
				_a  :   str				 =							(GRAVITATIONAL_CONSTANT * product_of_mass / (force)) ** 0.5
				return {"distance": distance}
		raise ValueError('One and only one argument must be 0'						)


# Run doctest
if __name__ == "__main__":
							import doctest

							doctest.testmod()




