


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


def 					_snake_case   (     A       )						->    List[Any]:
							lowerCAmelCase__          =	ConvNextConfig()

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

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

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

							return config, expected_shape


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

							return name


def 					_snake_case   (     )						->    Optional[Any]:
							lowerCAmelCase__          =	'''http://images.cocodataset.org/val2017/000000039769.jpg'''
							lowerCAmelCase__          =	Image.open(requests.get(A ,    stream=A       ).raw       )
							return im


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

							# load HuggingFace model
							lowerCAmelCase__          =	ConvNextForImageClassification(A       )
							model.load_state_dict(A       )
							model.eval()

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

							lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	torch.tensor([0.4_525, 0.7_539, 0.0_308]       )
							elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_384.pth":
														lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	torch.tensor([0.4_174, -0.0_989, 0.1_489]       )
							elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_384.pth":
														lowerCAmelCase__          =	torch.tensor([0.2_513, -0.1_349, -0.1_613]       )
							elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_224.pth":
														lowerCAmelCase__          =	torch.tensor([1.2_980, 0.3_631, -0.1_198]       )
							elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_224.pth":
														lowerCAmelCase__          =	torch.tensor([1.2_963, 0.1_227, 0.1_723]       )
							elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_224.pth":
														lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	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":
														lowerCAmelCase__          =	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] ,    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...'''       )
							lowerCAmelCase__          =	'''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__":
		__UpperCAmelCase    				=							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.''',
		)

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

'''simple docstring'''
from __future__ import annotations

from PIL import Image

# Define the first generation of cells
# fmt: off
lowerCAmelCase :  Union[str, Any]      =      [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]







def 						A_(			A		:						int):
							return [int(A) for c in f'''{ruleset:08}'''[:8]]







def 						A_(			A		:						list[list[int]]						,			A		:						list[int]						,			A		:						int):
							UpperCamelCase					       =			len(cells[0])  # 31
							UpperCamelCase					       =			[]
							for i in range(A):
														# Get the neighbors of each cell
														# Handle neighbours outside bounds by using 0 as their value
														UpperCamelCase					       =			0 if i == 0 else cells[time][i - 1]
														UpperCamelCase					       =			0 if i == population - 1 else cells[time][i + 1]
														# Define a new cell and add it to the new generation
														UpperCamelCase					       =			7 - int(f'''{left_neighbor}{cells[time][i]}{right_neighbor}'''						,			2)
														next_generation.append(rule[situation])
							return next_generation







def 						A_(			A		:						list[list[int]]):
							UpperCamelCase					       =			Image.new('RGB'						,			(len(cells[0]), len(A)))
							UpperCamelCase					       =			img.load()
							# Generates image
							for w in range(img.width):
														for h in range(img.height):
																					UpperCamelCase					       =			255 - int(255 * cells[h][w])
																					UpperCamelCase					       =			(color, color, color)
							return img


if __name__ == "__main__":
						lowerCAmelCase :  Optional[int]      =      bin(int(input('Rule:\n').strip()))[2:]
						lowerCAmelCase :  Tuple      =      format_ruleset(int(rule_num))
						for time in range(16):
												CELLS.append(new_generation(CELLS, rule, time))
						lowerCAmelCase :  List[str]      =      generate_image(CELLS)
						# Uncomment to save the image
						# img.save(f"rule_{rule_num}.png")
						img.show()




