

lowerCamelCase      				=     {}


def        __lowercase    (  UpperCAmelCase__		,					UpperCAmelCase__		,					UpperCAmelCase__      ):

					"""simple docstring"""






					if late == 3 or absent == 2:
										return 0

					# if we have no days left, and have not failed any other rules,
					# we have a prize string
					if days == 0:
										return 1

					# No easy solution, so now we need to do the recursive calculation

					# First, check if the combination is already in the cache, and
					# if yes, return the stored value from there since we already
					# know the number of possible prize strings from this point on
					__lowerCAmelCase					=							(days, absent, late)
					if key in cache:
										return cache[key]

					# now we calculate the three possible ways that can unfold from
					# this point on, depending on our attendance today

					# 1) if we are late (but not absent), the "absent" counter stays as
					# it is, but the "late" counter increases by one
					__lowerCAmelCase					=							_calculate(days - 1		,					UpperCAmelCase__		,					late + 1      )

					# 2) if we are absent, the "absent" counter increases by 1, and the
					# "late" counter resets to 0
					__lowerCAmelCase					=							_calculate(days - 1		,					absent + 1		,					0      )

					# 3) if we are on time, this resets the "late" counter and keeps the
					# absent counter
					__lowerCAmelCase					=							_calculate(days - 1		,					UpperCAmelCase__		,					0      )

					__lowerCAmelCase					=							state_late + state_absent + state_ontime

					__lowerCAmelCase					=							prizestrings
					return prizestrings


def        __lowercase    (  UpperCAmelCase__ = 30      ):

					"""simple docstring"""






					return _calculate(UpperCAmelCase__		,					absent=0		,					late=0      )


if __name__ == "__main__":
		print(solution())









import argparse

import requests
import torch
from PIL import Image

from transformers import CLIPProcessor, GroupViTConfig, GroupViTModel


def        __lowercase    (  UpperCAmelCase__      ):

					"""simple docstring"""






					if "img_encoder.pos_embed" in name:
										__lowerCAmelCase					=							name.replace('img_encoder.pos_embed'		,					'vision_model.embeddings.position_embeddings'      )
					if "img_encoder.patch_embed.proj" in name:
										__lowerCAmelCase					=							name.replace('img_encoder.patch_embed.proj'		,					'vision_model.embeddings.patch_embeddings.projection'      )
					if "img_encoder.patch_embed.norm" in name:
										__lowerCAmelCase					=							name.replace('img_encoder.patch_embed.norm'		,					'vision_model.embeddings.layernorm'      )
					if "img_encoder.layers" in name:
										__lowerCAmelCase					=							name.replace('img_encoder.layers'		,					'vision_model.encoder.stages'      )
					if "blocks" in name and "res" not in name:
										__lowerCAmelCase					=							name.replace('blocks'		,					'layers'      )
					if "attn" in name and "pre_assign" not in name:
										__lowerCAmelCase					=							name.replace('attn'		,					'self_attn'      )
					if "proj" in name and "self_attn" in name and "text" not in name:
										__lowerCAmelCase					=							name.replace('proj'		,					'out_proj'      )
					if "pre_assign_attn.attn.proj" in name:
										__lowerCAmelCase					=							name.replace('pre_assign_attn.attn.proj'		,					'pre_assign_attn.attn.out_proj'      )
					if "norm1" in name:
										__lowerCAmelCase					=							name.replace('norm1'		,					'layer_norm1'      )
					if "norm2" in name and "pre_assign" not in name:
										__lowerCAmelCase					=							name.replace('norm2'		,					'layer_norm2'      )
					if "img_encoder.norm" in name:
										__lowerCAmelCase					=							name.replace('img_encoder.norm'		,					'vision_model.layernorm'      )
					# text encoder
					if "text_encoder.token_embedding" in name:
										__lowerCAmelCase					=							name.replace('text_encoder.token_embedding'		,					'text_model.embeddings.token_embedding'      )
					if "text_encoder.positional_embedding" in name:
										__lowerCAmelCase					=							name.replace('text_encoder.positional_embedding'		,					'text_model.embeddings.position_embedding.weight'      )
					if "text_encoder.transformer.resblocks." in name:
										__lowerCAmelCase					=							name.replace('text_encoder.transformer.resblocks.'		,					'text_model.encoder.layers.'      )
					if "ln_1" in name:
										__lowerCAmelCase					=							name.replace('ln_1'		,					'layer_norm1'      )
					if "ln_2" in name:
										__lowerCAmelCase					=							name.replace('ln_2'		,					'layer_norm2'      )
					if "c_fc" in name:
										__lowerCAmelCase					=							name.replace('c_fc'		,					'fc1'      )
					if "c_proj" in name:
										__lowerCAmelCase					=							name.replace('c_proj'		,					'fc2'      )
					if "text_encoder" in name:
										__lowerCAmelCase					=							name.replace('text_encoder'		,					'text_model'      )
					if "ln_final" in name:
										__lowerCAmelCase					=							name.replace('ln_final'		,					'final_layer_norm'      )
					# projection layers
					if "img_projector.linear_hidden." in name:
										__lowerCAmelCase					=							name.replace('img_projector.linear_hidden.'		,					'visual_projection.'      )
					if "img_projector.linear_out." in name:
										__lowerCAmelCase					=							name.replace('img_projector.linear_out.'		,					'visual_projection.3.'      )
					if "text_projector.linear_hidden" in name:
										__lowerCAmelCase					=							name.replace('text_projector.linear_hidden'		,					'text_projection'      )
					if "text_projector.linear_out" in name:
										__lowerCAmelCase					=							name.replace('text_projector.linear_out'		,					'text_projection.3'      )

					return name


def        __lowercase    (  UpperCAmelCase__		,					UpperCAmelCase__      ):

					"""simple docstring"""






					for key in orig_state_dict.copy().keys():
										__lowerCAmelCase					=							orig_state_dict.pop(UpperCAmelCase__      )

										if "qkv" in key:
															# weights and biases of the key, value and query projections of vision encoder's attention layers require special treatment:
															# we need to split them up into separate matrices/vectors
															__lowerCAmelCase					=							key.split('.'      )
															__lowerCAmelCase,	__lowerCAmelCase					=							int(key_split[2]      ), int(key_split[4]      )
															__lowerCAmelCase					=							config.vision_config.hidden_size
															if "weight" in key:
																				__lowerCAmelCase					=							val[:dim, :]
																				__lowerCAmelCase					=							val[dim : dim * 2, :]
																				__lowerCAmelCase					=							val[-dim:, :]
															else:
																				__lowerCAmelCase					=							val[:dim]
																				__lowerCAmelCase					=							val[dim : dim * 2]
																				__lowerCAmelCase					=							val[-dim:]
										elif "in_proj" in key:
															# weights and biases of the key, value and query projections of text encoder's attention layers require special treatment:
															# we need to split them up into separate matrices/vectors
															__lowerCAmelCase					=							key.split('.'      )
															__lowerCAmelCase					=							int(key_split[3]      )
															__lowerCAmelCase					=							config.text_config.hidden_size
															if "weight" in key:
																				__lowerCAmelCase					=							val[:dim, :]
																				__lowerCAmelCase					=							val[
																				    dim : dim * 2, :
																				]
																				__lowerCAmelCase					=							val[-dim:, :]
															else:
																				__lowerCAmelCase					=							val[:dim]
																				__lowerCAmelCase					=							val[dim : dim * 2]
																				__lowerCAmelCase					=							val[-dim:]
										else:
															__lowerCAmelCase					=							rename_key(UpperCAmelCase__      )
															# squeeze if necessary
															if (
															    "text_projection.0" in new_name
															    or "text_projection.3" in new_name
															    or "visual_projection.0" in new_name
															    or "visual_projection.3" in new_name
															):
																				__lowerCAmelCase					=							val.squeeze_()
															else:
																				__lowerCAmelCase					=							val

					return orig_state_dict


def        __lowercase    (  ):

					"""simple docstring"""






					__lowerCAmelCase					=							'http://images.cocodataset.org/val2017/000000039769.jpg'
					__lowerCAmelCase					=							Image.open(requests.get(UpperCAmelCase__		,					stream=UpperCAmelCase__      ).raw      )
					return im


@torch.no_grad()
def        __lowercase    (  UpperCAmelCase__		,					UpperCAmelCase__		,					UpperCAmelCase__="groupvit-gcc-yfcc"		,					UpperCAmelCase__=False      ):

					"""simple docstring"""






					__lowerCAmelCase					=							GroupViTConfig()
					__lowerCAmelCase					=							GroupViTModel(UpperCAmelCase__      ).eval()

					__lowerCAmelCase					=							torch.load(UpperCAmelCase__		,					map_location='cpu'      )['model']
					__lowerCAmelCase					=							convert_state_dict(UpperCAmelCase__		,					UpperCAmelCase__      )
					__lowerCAmelCase,	__lowerCAmelCase					=							model.load_state_dict(UpperCAmelCase__		,					strict=UpperCAmelCase__      )
					assert missing_keys == ["text_model.embeddings.position_ids"]
					assert (unexpected_keys == ["multi_label_logit_scale"]) or (len(UpperCAmelCase__      ) == 0)

					# verify result
					__lowerCAmelCase					=							CLIPProcessor.from_pretrained('openai/clip-vit-base-patch32'      )
					__lowerCAmelCase					=							prepare_img()
					__lowerCAmelCase					=							processor(text=['a photo of a cat', 'a photo of a dog']		,					images=UpperCAmelCase__		,					padding=UpperCAmelCase__		,					return_tensors='pt'      )

					with torch.no_grad():
										__lowerCAmelCase					=							model(**UpperCAmelCase__      )

					if model_name == "groupvit-gcc-yfcc":
										__lowerCAmelCase					=							torch.tensor([[13.3523, 6.3629]]      )
					elif model_name == "groupvit-gcc-redcaps":
										__lowerCAmelCase					=							torch.tensor([[16.1873, 8.6230]]      )
					else:
										raise ValueError(F"""Model name {model_name} not supported."""      )
					assert torch.allclose(outputs.logits_per_image		,					UpperCAmelCase__		,					atol=1E-3      )

					processor.save_pretrained(UpperCAmelCase__      )
					model.save_pretrained(UpperCAmelCase__      )
					print('Successfully saved processor and model to'		,					UpperCAmelCase__      )

					if push_to_hub:
										print('Pushing to the hub...'      )
										processor.push_to_hub(UpperCAmelCase__		,					organization='nielsr'      )
										model.push_to_hub(UpperCAmelCase__		,					organization='nielsr'      )


if __name__ == "__main__":
		lowerCamelCase      				=     argparse.ArgumentParser()
		parser.add_argument(
		    '''--pytorch_dump_folder_path''', default=None, type=str, help='''Path to dump the processor and PyTorch model.'''
		)
		parser.add_argument('''--checkpoint_path''', default=None, type=str, help='''Path to GroupViT checkpoint''')
		parser.add_argument(
		    '''--model_name''',
		    default='''groupvit-gccy-fcc''',
		    type=str,
		    help='''Name of the model. Expecting either \'groupvit-gcc-yfcc\' or \'groupvit-gcc-redcaps\'''',
		)
		parser.add_argument(
		    '''--push_to_hub''',
		    action='''store_true''',
		    help='''Whether or not to push the converted model and processor to the 🤗 hub using the provided `model_name`.''',
		)
		lowerCamelCase      				=     parser.parse_args()

		convert_groupvit_checkpoint(args.checkpoint_path, args.pytorch_dump_folder_path, args.model_name, args.push_to_hub)






