'''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()
__SCREAMING_SNAKE_CASE	:					Any					=  logging.get_logger(__name__)

def      UpperCamelCase_							( _UpperCAmelCase  :				List[str]   )   ->   Tuple:


       """simple docstring"""







       _UpperCAmelCase					:  Tuple											=   ConvNextConfig()

       if "tiny" in checkpoint_url:
              _UpperCAmelCase					:  int											=   [3, 3, 9, 3]
              _UpperCAmelCase					:  Optional[Any]											=   [96, 192, 384, 768]
       if "small" in checkpoint_url:
              _UpperCAmelCase					:  Any											=   [3, 3, 27, 3]
              _UpperCAmelCase					:  int											=   [96, 192, 384, 768]
       if "base" in checkpoint_url:
              _UpperCAmelCase					:  Optional[int]											=   [3, 3, 27, 3]
              _UpperCAmelCase					:  Optional[int]											=   [128, 256, 512, 1_024]
       if "large" in checkpoint_url:
              _UpperCAmelCase					:  int											=   [3, 3, 27, 3]
              _UpperCAmelCase					:  Tuple											=   [192, 384, 768, 1_536]
       if "xlarge" in checkpoint_url:
              _UpperCAmelCase					:  List[str]											=   [3, 3, 27, 3]
              _UpperCAmelCase					:  Optional[Any]											=   [256, 512, 1_024, 2_048]

       if "1k" in checkpoint_url:
              _UpperCAmelCase					:  str											=   1_000
              _UpperCAmelCase					:  Tuple											=   """imagenet-1k-id2label.json"""
              _UpperCAmelCase					:  Dict											=   (1, 1_000)
       else:
              _UpperCAmelCase					:  Optional[Any]											=   21_841
              _UpperCAmelCase					:  List[str]											=   """imagenet-22k-id2label.json"""
              _UpperCAmelCase					:  Tuple											=   (1, 21_841)

       _UpperCAmelCase					:  Any											=   """huggingface/label-files"""
       _UpperCAmelCase					:  int											=   num_labels
       _UpperCAmelCase					:  str											=   json.load(open(hf_hub_download(_UpperCAmelCase      ,     _UpperCAmelCase      ,     repo_type="dataset"   )      ,     "r"   )   )
       _UpperCAmelCase					:  Union[str, Any]											=   {int(_UpperCAmelCase   ): 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[9_205]
              del idalabel[15_027]
       _UpperCAmelCase					:  Tuple											=   idalabel
       _UpperCAmelCase					:  str											=   {v: k for k, v in idalabel.items()}
       _UpperCAmelCase					:  int											=   hidden_sizes
       _UpperCAmelCase					:  Any											=   depths

       return config, expected_shape

def      UpperCamelCase_							( _UpperCAmelCase  :				Optional[int]   )   ->   Optional[int]:


       """simple docstring"""







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

       return name

def      UpperCamelCase_							( )   ->   Any:


       """simple docstring"""







       _UpperCAmelCase					:  Optional[Any]											=   """http://images.cocodataset.org/val2017/000000039769.jpg"""
       _UpperCAmelCase					:  List[Any]											=   Image.open(requests.get(_UpperCAmelCase      ,     stream=_UpperCAmelCase   ).raw   )
       return im

@torch.no_grad()
def      UpperCamelCase_							( _UpperCAmelCase  :				Tuple      ,     _UpperCAmelCase  :				str   )   ->   Dict:


       """simple docstring"""







       _UpperCAmelCase					:  Dict											=   get_convnext_config(_UpperCAmelCase   )
       # load original state_dict from URL
       _UpperCAmelCase					:  int											=   torch.hub.load_state_dict_from_url(_UpperCAmelCase   )["""model"""]
       # rename keys
       for key in state_dict.copy().keys():
              _UpperCAmelCase					:  Optional[Any]											=   state_dict.pop(_UpperCAmelCase   )
              _UpperCAmelCase					:  Optional[int]											=   val
       # add prefix to all keys expect classifier head
       for key in state_dict.copy().keys():
              _UpperCAmelCase					:  Optional[Any]											=   state_dict.pop(_UpperCAmelCase   )
              if not key.startswith("classifier"   ):
                     _UpperCAmelCase					:  str											=   """convnext.""" + key
              _UpperCAmelCase					:  Any											=   val

       # load HuggingFace model
       _UpperCAmelCase					:  int											=   ConvNextForImageClassification(_UpperCAmelCase   )
       model.load_state_dict(_UpperCAmelCase   )
       model.eval()

       # Check outputs on an image, prepared by ConvNextImageProcessor
       _UpperCAmelCase					:  Optional[int]											=   224 if """224""" in checkpoint_url else 384
       _UpperCAmelCase					:  Any											=   ConvNextImageProcessor(size=_UpperCAmelCase   )
       _UpperCAmelCase					:  Optional[Any]											=   image_processor(images=prepare_img()      ,     return_tensors="pt"   ).pixel_values

       _UpperCAmelCase					:  str											=   model(_UpperCAmelCase   ).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					:  Tuple											=   torch.tensor([-0.1_2_1_0, -0.6_6_0_5, 0.1_9_1_8]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_small_1k_224_ema.pth":
              _UpperCAmelCase					:  Any											=   torch.tensor([-0.4_4_7_3, -0.1_8_4_7, -0.6_3_6_5]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_224_ema.pth":
              _UpperCAmelCase					:  Dict											=   torch.tensor([0.4_5_2_5, 0.7_5_3_9, 0.0_3_0_8]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_384.pth":
              _UpperCAmelCase					:  int											=   torch.tensor([0.3_5_6_1, 0.6_3_5_0, -0.0_3_8_4]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_224_ema.pth":
              _UpperCAmelCase					:  Optional[int]											=   torch.tensor([0.4_1_7_4, -0.0_9_8_9, 0.1_4_8_9]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_384.pth":
              _UpperCAmelCase					:  List[Any]											=   torch.tensor([0.2_5_1_3, -0.1_3_4_9, -0.1_6_1_3]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_224.pth":
              _UpperCAmelCase					:  str											=   torch.tensor([1.2_9_8_0, 0.3_6_3_1, -0.1_1_9_8]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_224.pth":
              _UpperCAmelCase					:  Optional[Any]											=   torch.tensor([1.2_9_6_3, 0.1_2_2_7, 0.1_7_2_3]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_224.pth":
              _UpperCAmelCase					:  str											=   torch.tensor([1.7_9_5_6, 0.8_3_9_0, 0.2_8_2_0]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_224.pth":
              _UpperCAmelCase					:  List[Any]											=   torch.tensor([-0.2_8_2_2, -0.0_5_0_2, -0.0_8_7_8]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_384.pth":
              _UpperCAmelCase					:  Union[str, Any]											=   torch.tensor([-0.5_6_7_2, -0.0_7_3_0, -0.4_3_4_8]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_224.pth":
              _UpperCAmelCase					:  Any											=   torch.tensor([0.2_6_8_1, 0.2_3_6_5, 0.6_2_4_6]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_384.pth":
              _UpperCAmelCase					:  int											=   torch.tensor([-0.2_6_4_2, 0.3_9_3_1, 0.5_1_1_6]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_224_ema.pth":
              _UpperCAmelCase					:  Union[str, Any]											=   torch.tensor([-0.6_6_7_7, -0.1_8_7_3, -0.8_3_7_9]   )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_384_ema.pth":
              _UpperCAmelCase					:  Optional[int]											=   torch.tensor([-0.7_7_4_9, -0.2_9_6_7, -0.6_4_4_4]   )
       else:
              raise ValueError(F"""Unknown URL: {checkpoint_url}"""   )

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

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

       print("Pushing model to the hub..."   )
       _UpperCAmelCase					:  Tuple											=   """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(_UpperCAmelCase      ,     _UpperCAmelCase   )      ,     organization="nielsr"      ,     commit_message="Add model"      ,     )


if __name__ == "__main__":
   __SCREAMING_SNAKE_CASE	:					List[Any]					=  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.""",
   )

   __SCREAMING_SNAKE_CASE	:					Any					=  parser.parse_args()
   convert_convnext_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)


'''simple docstring'''




def      UpperCamelCase_							( _UpperCAmelCase  :				int      ,     _UpperCAmelCase  :				list[tuple[int, int, int]]   )   ->   list[tuple[int, int, int]]:


       """simple docstring"""







       _UpperCAmelCase					:  Optional[int]											=   sorted(_UpperCAmelCase      ,     key=lambda _UpperCAmelCase   : edge[2]   )

       _UpperCAmelCase					:  Optional[int]											=   list(range(_UpperCAmelCase   )   )

       def find_parent(_UpperCAmelCase  :				Dict   ):
              if i != parent[i]:
                     _UpperCAmelCase					:  Tuple											=   find_parent(parent[i]   )
              return parent[i]

       _UpperCAmelCase					:  Union[str, Any]											=   0
       _UpperCAmelCase					:  Dict											=   []

       for edge in edges:
              _UpperCAmelCase					:  List[str]											=   find_parent(edge[0]   )
              _UpperCAmelCase					:  str											=   find_parent(edge[1]   )
              if parent_a != parent_b:
                     minimum_spanning_tree_cost += edge[2]
                     minimum_spanning_tree.append(_UpperCAmelCase   )
                     _UpperCAmelCase					:  Optional[Any]											=   parent_b

       return minimum_spanning_tree


if __name__ == "__main__":  # pragma: no cover
  __SCREAMING_SNAKE_CASE					, __SCREAMING_SNAKE_CASE	:					int					=  list(map(int, input().strip().split()))
  __SCREAMING_SNAKE_CASE	:					str					=  []

  for _ in range(num_edges):
    __SCREAMING_SNAKE_CASE					, __SCREAMING_SNAKE_CASE					, __SCREAMING_SNAKE_CASE	:					str					=  (int(x) for x in input().strip().split())
    edges.append((nodea, nodea, cost))

  kruskal(num_nodes, edges)

