

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()
lowercase_     =       logging.get_logger(__name__)
def 					a				(      A__     :       Union[str, Any]					)   ->				List[Any]:





      """simple docstring"""



      _lowercase     	=ConvNextConfig()

      if "tiny" in checkpoint_url:
            _lowercase     	=[3, 3, 9, 3]
            _lowercase     	=[96, 192, 384, 768]
      if "small" in checkpoint_url:
            _lowercase     	=[3, 3, 27, 3]
            _lowercase     	=[96, 192, 384, 768]
      if "base" in checkpoint_url:
            _lowercase     	=[3, 3, 27, 3]
            _lowercase     	=[128, 256, 512, 1024]
      if "large" in checkpoint_url:
            _lowercase     	=[3, 3, 27, 3]
            _lowercase     	=[192, 384, 768, 1536]
      if "xlarge" in checkpoint_url:
            _lowercase     	=[3, 3, 27, 3]
            _lowercase     	=[256, 512, 1024, 2048]

      if "1k" in checkpoint_url:
            _lowercase     	=1000
            _lowercase     	='imagenet-1k-id2label.json'
            _lowercase     	=(1, 1000)
      else:
            _lowercase     	=21841
            _lowercase     	='imagenet-22k-id2label.json'
            _lowercase     	=(1, 21841)

      _lowercase     	='huggingface/label-files'
      _lowercase     	=num_labels
      _lowercase     	=json.load(open(hf_hub_download(A__				,       A__				,       repo_type='dataset'					)				,       'r'					)					)
      _lowercase     	={int(A__					): 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]
      _lowercase     	=idalabel
      _lowercase     	={v: k for k, v in idalabel.items()}
      _lowercase     	=hidden_sizes
      _lowercase     	=depths

      return config, expected_shape
def 					a				(      A__     :       str					)   ->				Optional[int]:





      """simple docstring"""



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

      return name
def 					a				(      )   ->				Dict:





      """simple docstring"""



      _lowercase     	='http://images.cocodataset.org/val2017/000000039769.jpg'
      _lowercase     	=Image.open(requests.get(A__				,       stream=A__					).raw					)
      return im
@torch.no_grad()
def 					a				(      A__     :       Optional[Any]				,       A__     :       int					)   ->				Any:





      """simple docstring"""



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

      # load HuggingFace model
      _lowercase     	=ConvNextForImageClassification(A__					)
      model.load_state_dict(A__					)
      model.eval()

      # Check outputs on an image, prepared by ConvNextImageProcessor
      _lowercase     	=224 if '224' in checkpoint_url else 384
      _lowercase     	=ConvNextImageProcessor(size=A__					)
      _lowercase     	=image_processor(images=prepare_img()				,       return_tensors='pt'					).pixel_values

      _lowercase     	=model(A__					).logits

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

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

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

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


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

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





from __future__ import annotations

import random
import string





class 			__lowerCAmelCase					:




  def __init__(    self							,       lowerCAmelCase = None )  ->			None:
        '''simple docstring'''






        _lowercase     	=passcode or self.__passcode_creator()
        _lowercase     	=self.__make_key_list()
        _lowercase     	=self.__make_shift_key()




  def __str__(    self )  ->			str:
        '''simple docstring'''






        return "".join(self.__passcode )




  def   A__					(    self							,       lowerCAmelCase )  ->			list[int]:
        '''simple docstring'''






        for i in range(1							,       len(lowerCAmelCase )							,       2 ):
              iterlist[i] *= -1
        return iterlist




  def   A__					(    self )  ->			list[str]:
        '''simple docstring'''






        _lowercase     	=string.ascii_letters + string.digits
        _lowercase     	=[random.choice(lowerCAmelCase ) for _ in range(random.randint(10							,       20 ) )]
        return password




  def   A__					(    self )  ->			list[str]:
        '''simple docstring'''






        _lowercase     	=(
            string.ascii_letters + string.digits + string.punctuation + ' \t\n'
        )

        _lowercase     	=[]

        # creates points known as breakpoints to break the key_list_options at those
        # points and pivot each substring
        _lowercase     	=sorted(set(self.__passcode ) )
        _lowercase     	=[]

        # algorithm for creating a new shuffled list, keys_l, out of key_list_options
        for i in key_list_options:
              temp_list.extend(lowerCAmelCase )

              # checking breakpoints at which to pivot temporary sublist and add it into
              # keys_l
              if i in breakpoints or i == key_list_options[-1]:
                    keys_l.extend(temp_list[::-1] )
                    temp_list.clear()

        # returning a shuffled keys_l to prevent brute force guessing of shift key
        return keys_l




  def   A__					(    self )  ->			int:
        '''simple docstring'''






        _lowercase     	=sum(self.__neg_pos([ord(lowerCAmelCase ) for x in self.__passcode] ) )
        return num if num > 0 else len(self.__passcode )




  def   A__					(    self							,       lowerCAmelCase )  ->			str:
        '''simple docstring'''






        _lowercase     	=''

        # decoding shift like Caesar cipher algorithm implementing negative shift or
        # reverse shift or left shift
        for i in encoded_message:
              _lowercase     	=self.__key_list.index(lowerCAmelCase )
              decoded_message += self.__key_list[
                  (position - self.__shift_key) % -len(self.__key_list )
              ]

        return decoded_message




  def   A__					(    self							,       lowerCAmelCase )  ->			str:
        '''simple docstring'''






        _lowercase     	=''

        # encoding shift like Caesar cipher algorithm implementing positive shift or
        # forward shift or right shift
        for i in plaintext:
              _lowercase     	=self.__key_list.index(lowerCAmelCase )
              encoded_message += self.__key_list[
                  (position + self.__shift_key) % len(self.__key_list )
              ]

        return encoded_message
def 					a				(      A__     :       str = "Hello, this is a modified Caesar cipher"					)   ->				str:





      """simple docstring"""



      _lowercase     	=ShuffledShiftCipher()
      return cipa.decrypt(cipa.encrypt(A__					)					)


if __name__ == "__main__":
  import doctest

  doctest.testmod()


