






"""simple docstring"""

import inspect
import unittest

from transformers import ResNetConfig
from transformers.testing_utils import require_torch, require_vision, slow, torch_device
from transformers.utils import cached_property, is_torch_available, is_vision_available

from ...test_backbone_common import BackboneTesterMixin
from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
					import torch
					from torch import nn

					from transformers import ResNetBackbone, ResNetForImageClassification, ResNetModel
					from transformers.models.resnet.modeling_resnet import RESNET_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
					from PIL import Image

					from transformers import AutoImageProcessor


class 	__lowerCamelCase       :





		'''simple docstring'''






		def __init__(     self							:			List[Any]		,    a_							:			Union[str, Any]		,    a_							:			List[str]=3		,    a_							:			Optional[Any]=32		,    a_							:			str=3		,    a_							:			int=10		,    a_							:			Optional[Any]=[10, 20, 30, 40]		,    a_							:			Optional[int]=[1, 1, 2, 1]		,    a_							:			List[str]=True		,    a_							:			List[str]=True		,    a_							:			Any="relu"		,    a_							:			str=3		,    a_							:			int=None		,    a_							:			Any=["stage2", "stage3", "stage4"]		,    a_							:			Optional[int]=[2, 3, 4]		,    ):
				lowerCAmelCase_     :							Any             =    parent
				lowerCAmelCase_     :							List[Any]             =    batch_size
				lowerCAmelCase_     :							Any             =    image_size
				lowerCAmelCase_     :							Dict             =    num_channels
				lowerCAmelCase_     :							Optional[int]             =    embeddings_size
				lowerCAmelCase_     :							Tuple             =    hidden_sizes
				lowerCAmelCase_     :							List[str]             =    depths
				lowerCAmelCase_     :							Any             =    is_training
				lowerCAmelCase_     :							str             =    use_labels
				lowerCAmelCase_     :							Dict             =    hidden_act
				lowerCAmelCase_     :							List[Any]             =    num_labels
				lowerCAmelCase_     :							List[Any]             =    scope
				lowerCAmelCase_     :							Optional[Any]             =    len(a_			)
				lowerCAmelCase_     :							List[Any]             =    out_features
				lowerCAmelCase_     :							List[Any]             =    out_indices





		def      lowerCamelCase (     self							:			Union[str, Any]			):
				lowerCAmelCase_     :							str             =    floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]			)

				lowerCAmelCase_     :							Tuple             =    None
				if self.use_labels:
						lowerCAmelCase_     :							List[Any]             =    ids_tensor([self.batch_size]		,    self.num_labels			)

				lowerCAmelCase_     :							List[Any]             =    self.get_config()

				return config, pixel_values, labels





		def      lowerCamelCase (     self							:			Tuple			):
				return ResNetConfig(
				    num_channels=self.num_channels		,    embeddings_size=self.embeddings_size		,    hidden_sizes=self.hidden_sizes		,    depths=self.depths		,    hidden_act=self.hidden_act		,    num_labels=self.num_labels		,    out_features=self.out_features		,    out_indices=self.out_indices		,    )





		def      lowerCamelCase (     self							:			Optional[Any]		,    a_							:			str		,    a_							:			Union[str, Any]		,    a_							:			Any			):
				lowerCAmelCase_     :							Optional[int]             =    ResNetModel(config=a_			)
				model.to(a_			)
				model.eval()
				lowerCAmelCase_     :							Dict             =    model(a_			)
				# expected last hidden states: B, C, H // 32, W // 32
				self.parent.assertEqual(
				    result.last_hidden_state.shape		,    (self.batch_size, self.hidden_sizes[-1], self.image_size // 32, self.image_size // 32)		,    )





		def      lowerCamelCase (     self							:			str		,    a_							:			str		,    a_							:			Dict		,    a_							:			List[Any]			):
				lowerCAmelCase_     :							Optional[int]             =    self.num_labels
				lowerCAmelCase_     :							Any             =    ResNetForImageClassification(a_			)
				model.to(a_			)
				model.eval()
				lowerCAmelCase_     :							List[Any]             =    model(a_		,    labels=a_			)
				self.parent.assertEqual(result.logits.shape		,    (self.batch_size, self.num_labels)			)





		def      lowerCamelCase (     self							:			Any		,    a_							:			Tuple		,    a_							:			Union[str, Any]		,    a_							:			List[Any]			):
				lowerCAmelCase_     :							Optional[Any]             =    ResNetBackbone(config=a_			)
				model.to(a_			)
				model.eval()
				lowerCAmelCase_     :							Dict             =    model(a_			)

				# verify feature maps
				self.parent.assertEqual(len(result.feature_maps			)		,    len(config.out_features			)			)
				self.parent.assertListEqual(list(result.feature_maps[0].shape			)		,    [self.batch_size, self.hidden_sizes[1], 4, 4]			)

				# verify channels
				self.parent.assertEqual(len(model.channels			)		,    len(config.out_features			)			)
				self.parent.assertListEqual(model.channels		,    config.hidden_sizes[1:]			)

				# verify backbone works with out_features=None
				lowerCAmelCase_     :							str             =    None
				lowerCAmelCase_     :							str             =    ResNetBackbone(config=a_			)
				model.to(a_			)
				model.eval()
				lowerCAmelCase_     :							Optional[int]             =    model(a_			)

				# verify feature maps
				self.parent.assertEqual(len(result.feature_maps			)		,    1			)
				self.parent.assertListEqual(list(result.feature_maps[0].shape			)		,    [self.batch_size, self.hidden_sizes[-1], 1, 1]			)

				# verify channels
				self.parent.assertEqual(len(model.channels			)		,    1			)
				self.parent.assertListEqual(model.channels		,    [config.hidden_sizes[-1]]			)





		def      lowerCamelCase (     self							:			Union[str, Any]			):
				lowerCAmelCase_     :							int             =    self.prepare_config_and_inputs()
				lowerCAmelCase_       ,			lowerCAmelCase_       ,			lowerCAmelCase_     :							Tuple             =    config_and_inputs
				lowerCAmelCase_     :							Tuple             =    {"pixel_values": pixel_values}
				return config, inputs_dict







@require_torch
class 	__lowerCamelCase       (				A__				,							A__				,							unittest.TestCase    ):





		'''simple docstring'''






		a_			:       Optional[int]      =							(
		    (
		        ResNetModel,
		        ResNetForImageClassification,
		        ResNetBackbone,
		    )
		    if is_torch_available()
		    else ()
		)
		a_			:       Optional[Any]      =							(
		    {"""feature-extraction""": ResNetModel, """image-classification""": ResNetForImageClassification}
		    if is_torch_available()
		    else {}
		)

		a_			:       Tuple      =							True
		a_			:       Tuple      =							False
		a_			:       Tuple      =							False
		a_			:       List[Any]      =							False
		a_			:       Union[str, Any]      =							False





		def      lowerCamelCase (     self							:			str			):
				lowerCAmelCase_     :							List[Any]             =    ResNetModelTester(self			)
				lowerCAmelCase_     :							Tuple             =    ConfigTester(self		,    config_class=a_		,    has_text_modality=a_			)





		def      lowerCamelCase (     self							:			Any			):
				self.create_and_test_config_common_properties()
				self.config_tester.create_and_test_config_to_json_string()
				self.config_tester.create_and_test_config_to_json_file()
				self.config_tester.create_and_test_config_from_and_save_pretrained()
				self.config_tester.create_and_test_config_with_num_labels()
				self.config_tester.check_config_can_be_init_without_params()
				self.config_tester.check_config_arguments_init()





		def      lowerCamelCase (     self							:			Optional[int]			):
				return





		@unittest.skip(reason="ResNet does not use inputs_embeds"			)
		def      lowerCamelCase (     self							:			Optional[Any]			):
				pass





		@unittest.skip(reason="ResNet does not support input and output embeddings"			)
		def      lowerCamelCase (     self							:			Union[str, Any]			):
				pass





		def      lowerCamelCase (     self							:			List[str]			):
				lowerCAmelCase_       ,			lowerCAmelCase_     :							Optional[int]             =    self.model_tester.prepare_config_and_inputs_for_common()

				for model_class in self.all_model_classes:
						lowerCAmelCase_     :							int             =    model_class(a_			)
						lowerCAmelCase_     :							List[Any]             =    inspect.signature(model.forward			)
						# signature.parameters is an OrderedDict => so arg_names order is deterministic
						lowerCAmelCase_     :							Optional[Any]             =    [*signature.parameters.keys()]

						lowerCAmelCase_     :							Dict             =    ["pixel_values"]
						self.assertListEqual(arg_names[:1]		,    a_			)





		def      lowerCamelCase (     self							:			int			):
				lowerCAmelCase_     :							int             =    self.model_tester.prepare_config_and_inputs()
				self.model_tester.create_and_check_model(*a_			)





		def      lowerCamelCase (     self							:			int			):
				lowerCAmelCase_     :							Union[str, Any]             =    self.model_tester.prepare_config_and_inputs()
				self.model_tester.create_and_check_backbone(*a_			)





		def      lowerCamelCase (     self							:			Optional[int]			):
				lowerCAmelCase_       ,			lowerCAmelCase_     :							str             =    self.model_tester.prepare_config_and_inputs_for_common()

				for model_class in self.all_model_classes:
						lowerCAmelCase_     :							Dict             =    model_class(config=a_			)
						for name, module in model.named_modules():
								if isinstance(a_		,    (nn.BatchNormad, nn.GroupNorm)			):
										self.assertTrue(
										    torch.all(module.weight == 1			)		,    msg=f'''Parameter {name} of model {model_class} seems not properly initialized'''		,    )
										self.assertTrue(
										    torch.all(module.bias == 0			)		,    msg=f'''Parameter {name} of model {model_class} seems not properly initialized'''		,    )





		def      lowerCamelCase (     self							:			str			):
				def check_hidden_states_output(a_							:			Any		,    a_							:			Any		,    a_							:			Union[str, Any]			):
						lowerCAmelCase_     :							List[str]             =    model_class(a_			)
						model.to(a_			)
						model.eval()

						with torch.no_grad():
								lowerCAmelCase_     :							Optional[int]             =    model(**self._prepare_for_class(a_		,    a_			)			)

						lowerCAmelCase_     :							Optional[int]             =    outputs.encoder_hidden_states if config.is_encoder_decoder else outputs.hidden_states

						lowerCAmelCase_     :							Any             =    self.model_tester.num_stages
						self.assertEqual(len(a_			)		,    expected_num_stages + 1			)

						# ResNet's feature maps are of shape (batch_size, num_channels, height, width)
						self.assertListEqual(
						    list(hidden_states[0].shape[-2:]			)		,    [self.model_tester.image_size // 4, self.model_tester.image_size // 4]		,    )

				lowerCAmelCase_       ,			lowerCAmelCase_     :							int             =    self.model_tester.prepare_config_and_inputs_for_common()
				lowerCAmelCase_     :							str             =    ["basic", "bottleneck"]
				for model_class in self.all_model_classes:
						for layer_type in layers_type:
								lowerCAmelCase_     :							Optional[Any]             =    layer_type
								lowerCAmelCase_     :							Optional[int]             =    True
								check_hidden_states_output(a_		,    a_		,    a_			)

								# check that output_hidden_states also work using config
								del inputs_dict["output_hidden_states"]
								lowerCAmelCase_     :							Optional[Any]             =    True

								check_hidden_states_output(a_		,    a_		,    a_			)





		@unittest.skip(reason="ResNet does not use feedforward chunking"			)
		def      lowerCamelCase (     self							:			Optional[Any]			):
				pass





		def      lowerCamelCase (     self							:			Any			):
				lowerCAmelCase_     :							str             =    self.model_tester.prepare_config_and_inputs()
				self.model_tester.create_and_check_for_image_classification(*a_			)





		@slow
		def      lowerCamelCase (     self							:			Union[str, Any]			):
				for model_name in RESNET_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
						lowerCAmelCase_     :							str             =    ResNetModel.from_pretrained(a_			)
						self.assertIsNotNone(a_			)







def 	__lowerCamelCase			(						)		->					Any:

		"""simple docstring"""







		lowerCAmelCase_     :							Optional[Any]             =    Image.open("./tests/fixtures/tests_samples/COCO/000000039769.png" )
		return image


@require_torch
@require_vision
class 	__lowerCamelCase       (				unittest.TestCase    ):





		'''simple docstring'''






		@cached_property
		def      lowerCamelCase (     self							:			Any			):
				return (
				    AutoImageProcessor.from_pretrained(RESNET_PRETRAINED_MODEL_ARCHIVE_LIST[0]			)
				    if is_vision_available()
				    else None
				)





		@slow
		def      lowerCamelCase (     self							:			str			):
				lowerCAmelCase_     :							List[Any]             =    ResNetForImageClassification.from_pretrained(RESNET_PRETRAINED_MODEL_ARCHIVE_LIST[0]			).to(a_			)

				lowerCAmelCase_     :							List[str]             =    self.default_image_processor
				lowerCAmelCase_     :							Union[str, Any]             =    prepare_img()
				lowerCAmelCase_     :							Optional[int]             =    image_processor(images=a_		,    return_tensors="pt"			).to(a_			)

				# forward pass
				with torch.no_grad():
						lowerCAmelCase_     :							Tuple             =    model(**a_			)

				# verify the logits
				lowerCAmelCase_     :							Dict             =    torch.Size((1, 10_00)			)
				self.assertEqual(outputs.logits.shape		,    a_			)

				lowerCAmelCase_     :							int             =    torch.tensor([-11.1069, -9.7877, -8.3777]			).to(a_			)

				self.assertTrue(torch.allclose(outputs.logits[0, :3]		,    a_		,    atol=1e-4			)			)







@require_torch
class 	__lowerCamelCase       (				A__				,							unittest.TestCase    ):





		'''simple docstring'''






		a_			:       Union[str, Any]      =							(ResNetBackbone,) if is_torch_available() else ()
		a_			:       int      =							False
		a_			:       int      =							ResNetConfig





		def      lowerCamelCase (     self							:			Union[str, Any]			):
				lowerCAmelCase_     :							Optional[int]             =    ResNetModelTester(self			)








"""simple docstring"""

from __future__ import annotations

from PIL import Image

# Define the first generation of cells
# fmt: off
lowercase__      =				[[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 	__lowerCamelCase			(						__UpperCamelCase )		->					list[int]:

		"""simple docstring"""







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

def 	__lowerCamelCase			(						__UpperCamelCase   , __UpperCamelCase   , __UpperCamelCase )		->					list[int]:

		"""simple docstring"""







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

def 	__lowerCamelCase			(						__UpperCamelCase )		->					Image.Image:

		"""simple docstring"""







		lowerCAmelCase_     :							List[str]             =    Image.new("RGB"   , (len(cells[0] ), len(__UpperCamelCase )) )
		lowerCAmelCase_     :							List[str]             =    img.load()
		# Generates image
		for w in range(img.width ):
				for h in range(img.height ):
						lowerCAmelCase_     :							Union[str, Any]             =    255 - int(255 * cells[h][w] )
						lowerCAmelCase_     :							List[str]             =    (color, color, color)
		return img


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