


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

def 		_UpperCAmelCase							(     SCREAMING_SNAKE_CASE__     :   Optional[int]							):
     __UpperCamelCase       				=ConvNextConfig()

     if "tiny" in checkpoint_url:
          __UpperCamelCase       				=[3, 3, 9, 3]
          __UpperCamelCase       				=[96, 1_92, 3_84, 7_68]
     if "small" in checkpoint_url:
          __UpperCamelCase       				=[3, 3, 27, 3]
          __UpperCamelCase       				=[96, 1_92, 3_84, 7_68]
     if "base" in checkpoint_url:
          __UpperCamelCase       				=[3, 3, 27, 3]
          __UpperCamelCase       				=[1_28, 2_56, 5_12, 10_24]
     if "large" in checkpoint_url:
          __UpperCamelCase       				=[3, 3, 27, 3]
          __UpperCamelCase       				=[1_92, 3_84, 7_68, 15_36]
     if "xlarge" in checkpoint_url:
          __UpperCamelCase       				=[3, 3, 27, 3]
          __UpperCamelCase       				=[2_56, 5_12, 10_24, 20_48]

     if "1k" in checkpoint_url:
          __UpperCamelCase       				=10_00
          __UpperCamelCase       				='imagenet-1k-id2label.json'
          __UpperCamelCase       				=(1, 10_00)
     else:
          __UpperCamelCase       				=2_18_41
          __UpperCamelCase       				='imagenet-22k-id2label.json'
          __UpperCamelCase       				=(1, 2_18_41)

     __UpperCamelCase       				='huggingface/label-files'
     __UpperCamelCase       				=num_labels
     __UpperCamelCase       				=json.load(open(hf_hub_download(SCREAMING_SNAKE_CASE__     ,	SCREAMING_SNAKE_CASE__     ,	repo_type='dataset'							)     ,	'r'							)							)
     __UpperCamelCase       				={int(SCREAMING_SNAKE_CASE__							): 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[92_05]
          del idalabel[1_50_27]
     __UpperCamelCase       				=idalabel
     __UpperCamelCase       				={v: k for k, v in idalabel.items()}
     __UpperCamelCase       				=hidden_sizes
     __UpperCamelCase       				=depths

     return config, expected_shape

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

     return name

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

@torch.no_grad()
def 		_UpperCAmelCase							(     SCREAMING_SNAKE_CASE__     :   List[Any]     ,	SCREAMING_SNAKE_CASE__     :   Any							):
     __UpperCamelCase				, __UpperCamelCase       				=get_convnext_config(SCREAMING_SNAKE_CASE__							)
     # load original state_dict from URL
     __UpperCamelCase       				=torch.hub.load_state_dict_from_url(SCREAMING_SNAKE_CASE__							)['model']
     # rename keys
     for key in state_dict.copy().keys():
          __UpperCamelCase       				=state_dict.pop(SCREAMING_SNAKE_CASE__							)
          __UpperCamelCase       				=val
     # add prefix to all keys expect classifier head
     for key in state_dict.copy().keys():
          __UpperCamelCase       				=state_dict.pop(SCREAMING_SNAKE_CASE__							)
          if not key.startswith('classifier'							):
               __UpperCamelCase       				='convnext.' + key
          __UpperCamelCase       				=val

     # load HuggingFace model
     __UpperCamelCase       				=ConvNextForImageClassification(SCREAMING_SNAKE_CASE__							)
     model.load_state_dict(SCREAMING_SNAKE_CASE__							)
     model.eval()

     # Check outputs on an image, prepared by ConvNextImageProcessor
     __UpperCamelCase       				=2_24 if '224' in checkpoint_url else 3_84
     __UpperCamelCase       				=ConvNextImageProcessor(size=SCREAMING_SNAKE_CASE__							)
     __UpperCamelCase       				=image_processor(images=prepare_img()     ,	return_tensors='pt'							).pixel_values

     __UpperCamelCase       				=model(SCREAMING_SNAKE_CASE__							).logits

     # note: the logits below were obtained without center cropping
     if checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_tiny_1k_224_ema.pth":
          __UpperCamelCase       				=torch.tensor([-0.1210, -0.6605, 0.1918]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_small_1k_224_ema.pth":
          __UpperCamelCase       				=torch.tensor([-0.4473, -0.1847, -0.6365]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_224_ema.pth":
          __UpperCamelCase       				=torch.tensor([0.4525, 0.7539, 0.0308]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_384.pth":
          __UpperCamelCase       				=torch.tensor([0.3561, 0.6350, -0.0384]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_224_ema.pth":
          __UpperCamelCase       				=torch.tensor([0.4174, -0.0989, 0.1489]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_384.pth":
          __UpperCamelCase       				=torch.tensor([0.2513, -0.1349, -0.1613]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_224.pth":
          __UpperCamelCase       				=torch.tensor([1.2980, 0.3631, -0.1198]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_224.pth":
          __UpperCamelCase       				=torch.tensor([1.2963, 0.1227, 0.1723]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_224.pth":
          __UpperCamelCase       				=torch.tensor([1.7956, 0.8390, 0.2820]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_224.pth":
          __UpperCamelCase       				=torch.tensor([-0.2822, -0.0502, -0.0878]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_384.pth":
          __UpperCamelCase       				=torch.tensor([-0.5672, -0.0730, -0.4348]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_224.pth":
          __UpperCamelCase       				=torch.tensor([0.2681, 0.2365, 0.6246]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_384.pth":
          __UpperCamelCase       				=torch.tensor([-0.2642, 0.3931, 0.5116]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_224_ema.pth":
          __UpperCamelCase       				=torch.tensor([-0.6677, -0.1873, -0.8379]							)
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_384_ema.pth":
          __UpperCamelCase       				=torch.tensor([-0.7749, -0.2967, -0.6444]							)
     else:
          raise ValueError(F'Unknown URL: {checkpoint_url}'							)

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

     Path(SCREAMING_SNAKE_CASE__							).mkdir(exist_ok=SCREAMING_SNAKE_CASE__							)
     print(F'Saving model to {pytorch_dump_folder_path}'							)
     model.save_pretrained(SCREAMING_SNAKE_CASE__							)
     print(F'Saving image processor to {pytorch_dump_folder_path}'							)
     image_processor.save_pretrained(SCREAMING_SNAKE_CASE__							)

     print('Pushing model to the hub...'							)
     __UpperCamelCase       				='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(SCREAMING_SNAKE_CASE__     ,	SCREAMING_SNAKE_CASE__							)     ,	organization='nielsr'     ,	commit_message='Add model'     ,	)


if __name__ == "__main__":
   _A									=		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.',
   )

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









import math

def 		_UpperCAmelCase							(     SCREAMING_SNAKE_CASE__     :   int							):
     __UpperCamelCase       				=math.log(2     ,	10							) * number
     __UpperCamelCase       				=round((log_number - int(SCREAMING_SNAKE_CASE__							))     ,	15							)

     return difference

def 		_UpperCAmelCase							(     SCREAMING_SNAKE_CASE__     :   int = 67_89_10							):
     __UpperCamelCase       				=90
     __UpperCamelCase       				=0

     __UpperCamelCase       				=math.log(1.23     ,	10							)
     __UpperCamelCase       				=math.log(1.24     ,	10							)
     __UpperCamelCase       				=0

     while position < number:
          __UpperCamelCase       				=log_difference(SCREAMING_SNAKE_CASE__							)

          if difference >= upper_limit:
               power_iterator += 93

          elif difference < lower_limit:
               power_iterator += 1_96

          else:
               __UpperCamelCase       				=power_iterator
               power_iterator += 1_96
               position += 1

     return previous_power


if __name__ == "__main__":
   import doctest

   doctest.testmod()

   print(f"""{solution() = }""")





