

'''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()
_a			:	Optional[int]								=  logging.get_logger(__name__)


def  lowerCamelCase__						(  SCREAMING_SNAKE_CASE :				int  ):
  UpperCAmelCase  							=		ConvNextConfig()

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

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

  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[9205]
    del idalabel[1_5027]
  UpperCAmelCase  							=		idalabel
  UpperCAmelCase  							=		{v: k for k, v in idalabel.items()}
  UpperCAmelCase  							=		hidden_sizes
  UpperCAmelCase  							=		depths

  return config, expected_shape


def  lowerCamelCase__						(  SCREAMING_SNAKE_CASE :				int  ):
  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  lowerCamelCase__						(  ):
  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  lowerCamelCase__						(  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  							=		224 if '224' in checkpoint_url else 384
  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			:	Dict								=  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			:	Any								=  parser.parse_args()
  convert_convnext_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)





'''simple docstring'''




import argparse
import json
import re
import string
import sys
from collections import Counter


def  lowerCamelCase__						(  SCREAMING_SNAKE_CASE :				List[str]  ):

  def remove_articles(SCREAMING_SNAKE_CASE :				Union[str, Any]  ):
    return re.sub(R'\b(a|an|the)\b'    ,				' '    ,				SCREAMING_SNAKE_CASE  )

  def white_space_fix(SCREAMING_SNAKE_CASE :				Union[str, Any]  ):
    return " ".join(text.split()  )

  def remove_punc(SCREAMING_SNAKE_CASE :				List[Any]  ):
    UpperCAmelCase  							=		set(string.punctuation  )
    return "".join(ch for ch in text if ch not in exclude  )

  def lower(SCREAMING_SNAKE_CASE :				Any  ):
    return text.lower()

  return white_space_fix(remove_articles(remove_punc(lower(SCREAMING_SNAKE_CASE  )  )  )  )


def  lowerCamelCase__						(  SCREAMING_SNAKE_CASE :				Tuple    ,				SCREAMING_SNAKE_CASE :				Dict  ):
  UpperCAmelCase  							=		normalize_answer(SCREAMING_SNAKE_CASE  ).split()
  UpperCAmelCase  							=		normalize_answer(SCREAMING_SNAKE_CASE  ).split()
  UpperCAmelCase  							=		Counter(SCREAMING_SNAKE_CASE  ) & Counter(SCREAMING_SNAKE_CASE  )
  UpperCAmelCase  							=		sum(common.values()  )
  if num_same == 0:
    return 0
  UpperCAmelCase  							=		1.0 * num_same / len(SCREAMING_SNAKE_CASE  )
  UpperCAmelCase  							=		1.0 * num_same / len(SCREAMING_SNAKE_CASE  )
  UpperCAmelCase  							=		(2 * precision * recall) / (precision + recall)
  return fa


def  lowerCamelCase__						(  SCREAMING_SNAKE_CASE :				str    ,				SCREAMING_SNAKE_CASE :				int  ):
  return normalize_answer(SCREAMING_SNAKE_CASE  ) == normalize_answer(SCREAMING_SNAKE_CASE  )


def  lowerCamelCase__						(  SCREAMING_SNAKE_CASE :				Dict    ,				SCREAMING_SNAKE_CASE :				Tuple    ,				SCREAMING_SNAKE_CASE :				Dict  ):
  UpperCAmelCase  							=		[]
  for ground_truth in ground_truths:
    UpperCAmelCase  							=		metric_fn(SCREAMING_SNAKE_CASE    ,				SCREAMING_SNAKE_CASE  )
    scores_for_ground_truths.append(SCREAMING_SNAKE_CASE  )
  return max(SCREAMING_SNAKE_CASE  )


def  lowerCamelCase__						(  SCREAMING_SNAKE_CASE :				Optional[Any]    ,				SCREAMING_SNAKE_CASE :				Optional[int]  ):
  UpperCAmelCase  							=		UpperCAmelCase  							=		UpperCAmelCase  							=		0
  for article in dataset:
    for paragraph in article["paragraphs"]:
      for qa in paragraph["qas"]:
        total += 1
        if qa["id"] not in predictions:
          UpperCAmelCase  							=		'Unanswered question ' + qa['id'] + ' will receive score 0.'
          print(SCREAMING_SNAKE_CASE    ,				file=sys.stderr  )
          continue
        UpperCAmelCase  							=		[x['text'] for x in qa['answers']]
        UpperCAmelCase  							=		predictions[qa['id']]
        exact_match += metric_max_over_ground_truths(SCREAMING_SNAKE_CASE    ,				SCREAMING_SNAKE_CASE    ,				SCREAMING_SNAKE_CASE  )
        fa += metric_max_over_ground_truths(SCREAMING_SNAKE_CASE    ,				SCREAMING_SNAKE_CASE    ,				SCREAMING_SNAKE_CASE  )

  UpperCAmelCase  							=		100.0 * exact_match / total
  UpperCAmelCase  							=		100.0 * fa / total

  return {"exact_match": exact_match, "f1": fa}


if __name__ == "__main__":
  _a			:	Tuple								=  '1.1'
  _a			:	int								=  argparse.ArgumentParser(description='Evaluation for SQuAD ' + expected_version)
  parser.add_argument('dataset_file', help='Dataset file')
  parser.add_argument('prediction_file', help='Prediction File')
  _a			:	List[Any]								=  parser.parse_args()
  with open(args.dataset_file) as dataset_file:
    _a			:	Optional[int]								=  json.load(dataset_file)
    if dataset_json["version"] != expected_version:
      print(
          'Evaluation expects v-' + expected_version + ', but got dataset with v-' + dataset_json['version'],
          file=sys.stderr,
      )
    _a			:	Optional[Any]								=  dataset_json['data']
  with open(args.prediction_file) as prediction_file:
    _a			:	Optional[Any]								=  json.load(prediction_file)
  print(json.dumps(evaluate(dataset, predictions)))


