





import unittest

from transformers import EsmConfig, is_torch_available
from transformers.testing_utils import TestCasePlus, require_torch, slow, torch_device

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, ids_tensor, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
							import torch

							from transformers.models.esm.modeling_esmfold import EsmForProteinFolding
class     UpperCamelCase__					:






		'''simple docstring'''






		def __init__(							self,   snake_case__,   snake_case__=13,   snake_case__=7,   snake_case__=False,   snake_case__=True,   snake_case__=False,   snake_case__=False,   snake_case__=19,   snake_case__=32,   snake_case__=5,   snake_case__=4,   snake_case__=37,   snake_case__="gelu",   snake_case__=0.1,   snake_case__=0.1,   snake_case__=5_12,   snake_case__=16,   snake_case__=2,   snake_case__=0.02,   snake_case__=3,   snake_case__=4,   snake_case__=None,   )       -> List[Any]:






									"""simple docstring"""
									lowercase_	:   Union[str, Any]  				=     parent
									lowercase_	:   List[Any]  				=     batch_size
									lowercase_	:   Any  				=     seq_length
									lowercase_	:   Any  				=     is_training
									lowercase_	:   str  				=     use_input_mask
									lowercase_	:   List[Any]  				=     use_token_type_ids
									lowercase_	:   Union[str, Any]  				=     use_labels
									lowercase_	:   int  				=     vocab_size
									lowercase_	:   Union[str, Any]  				=     hidden_size
									lowercase_	:   Optional[int]  				=     num_hidden_layers
									lowercase_	:   Dict  				=     num_attention_heads
									lowercase_	:   List[str]  				=     intermediate_size
									lowercase_	:   str  				=     hidden_act
									lowercase_	:   Optional[int]  				=     hidden_dropout_prob
									lowercase_	:   Union[str, Any]  				=     attention_probs_dropout_prob
									lowercase_	:   Dict  				=     max_position_embeddings
									lowercase_	:   List[Any]  				=     type_vocab_size
									lowercase_	:   Any  				=     type_sequence_label_size
									lowercase_	:   Dict  				=     initializer_range
									lowercase_	:   str  				=     num_labels
									lowercase_	:   List[Any]  				=     num_choices
									lowercase_	:   List[str]  				=     scope






		def 						snake_case__				(							self  )       -> Dict:






									"""simple docstring"""
									lowercase_	:   List[str]  				=     ids_tensor([self.batch_size, self.seq_length],   self.vocab_size  )

									lowercase_	:   Dict  				=     None
									if self.use_input_mask:
																lowercase_	:   List[Any]  				=     random_attention_mask([self.batch_size, self.seq_length]  )

									lowercase_	:   List[Any]  				=     None
									lowercase_	:   str  				=     None
									lowercase_	:   Tuple  				=     None
									if self.use_labels:
																lowercase_	:   Any  				=     ids_tensor([self.batch_size],   self.type_sequence_label_size  )
																lowercase_	:   List[Any]  				=     ids_tensor([self.batch_size, self.seq_length],   self.num_labels  )
																lowercase_	:   Any  				=     ids_tensor([self.batch_size],   self.num_choices  )

									lowercase_	:   Tuple  				=     self.get_config()

									return config, input_ids, input_mask, sequence_labels, token_labels, choice_labels






		def 						snake_case__				(							self  )       -> Any:






									"""simple docstring"""
									lowercase_	:   int  				=     EsmConfig(
									    vocab_size=33,   hidden_size=self.hidden_size,   pad_token_id=1,   num_hidden_layers=self.num_hidden_layers,   num_attention_heads=self.num_attention_heads,   intermediate_size=self.intermediate_size,   hidden_act=self.hidden_act,   hidden_dropout_prob=self.hidden_dropout_prob,   attention_probs_dropout_prob=self.attention_probs_dropout_prob,   max_position_embeddings=self.max_position_embeddings,   type_vocab_size=self.type_vocab_size,   initializer_range=self.initializer_range,   is_folding_model=__SCREAMING_SNAKE_CASE,   esmfold_config={"""trunk""": {"""num_blocks""": 2}, """fp16_esm""": False},   )
									return config






		def 						snake_case__				(							self,   snake_case__,   snake_case__,   snake_case__,   snake_case__,   snake_case__,   snake_case__  )       -> Optional[Any]:






									"""simple docstring"""
									lowercase_	:   int  				=     EsmForProteinFolding(config=__SCREAMING_SNAKE_CASE  ).float()
									model.to(__SCREAMING_SNAKE_CASE  )
									model.eval()
									lowercase_	:   Dict  				=     model(__SCREAMING_SNAKE_CASE,   attention_mask=__SCREAMING_SNAKE_CASE  )
									lowercase_	:   int  				=     model(__SCREAMING_SNAKE_CASE  )
									lowercase_	:   Tuple  				=     model(__SCREAMING_SNAKE_CASE  )

									self.parent.assertEqual(result.positions.shape,   (8, self.batch_size, self.seq_length, 14, 3)  )
									self.parent.assertEqual(result.angles.shape,   (8, self.batch_size, self.seq_length, 7, 2)  )






		def 						snake_case__				(							self  )       -> Optional[int]:






									"""simple docstring"""
									lowercase_	:   Optional[Any]  				=     self.prepare_config_and_inputs()
									(
									    (
									    lowercase_     
									)				,		(
									    lowercase_     
									)				,		(
									    lowercase_     
									)				,		(
									    lowercase_     
									)				,		(
									    lowercase_     
									)				,		(
									    lowercase_     
									)				,		     
									)	:   Optional[int]  				=     config_and_inputs
									lowercase_	:   Any  				=     {"""input_ids""": input_ids, """attention_mask""": input_mask}
									return config, inputs_dict




@require_torch
class     UpperCamelCase__					(     __lowerCAmelCase				, __lowerCAmelCase				, unittest.TestCase				):






		'''simple docstring'''






		__a       :       List[str]       =	False

		__a       :       Dict       =	(EsmForProteinFolding,) if is_torch_available() else ()
		__a       :       Union[str, Any]       =	()
		__a       :       List[str]       =	{} if is_torch_available() else {}
		__a       :       List[Any]       =	False






		def 						snake_case__				(							self  )       -> Any:






									"""simple docstring"""
									lowercase_	:   Optional[int]  				=     EsmFoldModelTester(self  )
									lowercase_	:   Union[str, Any]  				=     ConfigTester(self,   config_class=__SCREAMING_SNAKE_CASE,   hidden_size=37  )






		def 						snake_case__				(							self  )       -> List[Any]:






									"""simple docstring"""
									self.config_tester.run_common_tests()






		def 						snake_case__				(							self  )       -> Optional[Any]:






									"""simple docstring"""
									lowercase_	:   Any  				=     self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_model(*__SCREAMING_SNAKE_CASE  )






		@unittest.skip("""Does not support attention outputs"""  )
		def 						snake_case__				(							self  )       -> Dict:






									"""simple docstring"""
									pass






		@unittest.skip
		def 						snake_case__				(							self  )       -> Union[str, Any]:






									"""simple docstring"""
									pass






		@unittest.skip("""Esm does not support embedding resizing"""  )
		def 						snake_case__				(							self  )       -> List[Any]:






									"""simple docstring"""
									pass






		@unittest.skip("""Esm does not support embedding resizing"""  )
		def 						snake_case__				(							self  )       -> str:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold does not support passing input embeds!"""  )
		def 						snake_case__				(							self  )       -> Tuple:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold does not support head pruning."""  )
		def 						snake_case__				(							self  )       -> Optional[int]:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold does not support head pruning."""  )
		def 						snake_case__				(							self  )       -> List[str]:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold does not support head pruning."""  )
		def 						snake_case__				(							self  )       -> int:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold does not support head pruning."""  )
		def 						snake_case__				(							self  )       -> Optional[Any]:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold does not support head pruning."""  )
		def 						snake_case__				(							self  )       -> str:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold does not output hidden states in the normal way."""  )
		def 						snake_case__				(							self  )       -> str:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMfold does not output hidden states in the normal way."""  )
		def 						snake_case__				(							self  )       -> Tuple:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold only has one output format."""  )
		def 						snake_case__				(							self  )       -> Optional[Any]:






									"""simple docstring"""
									pass






		@unittest.skip("""This test doesn\'t work for ESMFold and doesn\'t test core functionality"""  )
		def 						snake_case__				(							self  )       -> Dict:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold does not support input chunking."""  )
		def 						snake_case__				(							self  )       -> Optional[Any]:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold doesn\'t respect you and it certainly doesn\'t respect your initialization arguments."""  )
		def 						snake_case__				(							self  )       -> Optional[int]:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold doesn\'t support torchscript compilation."""  )
		def 						snake_case__				(							self  )       -> Any:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold doesn\'t support torchscript compilation."""  )
		def 						snake_case__				(							self  )       -> int:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold doesn\'t support torchscript compilation."""  )
		def 						snake_case__				(							self  )       -> List[Any]:






									"""simple docstring"""
									pass






		@unittest.skip("""ESMFold doesn\'t support data parallel."""  )
		def 						snake_case__				(							self  )       -> Any:






									"""simple docstring"""
									pass






		@unittest.skip("""Will be fixed soon by reducing the size of the model used for common tests."""  )
		def 						snake_case__				(							self  )       -> Tuple:






									"""simple docstring"""
									pass




@require_torch
class     UpperCamelCase__					(     __lowerCAmelCase				):






		'''simple docstring'''






		@slow
		def 						snake_case__				(							self  )       -> str:






									"""simple docstring"""
									lowercase_	:   str  				=     EsmForProteinFolding.from_pretrained("""facebook/esmfold_v1"""  ).float()
									model.eval()
									lowercase_	:   Dict  				=     torch.tensor([[0, 6, 4, 13, 5, 4, 16, 12, 11, 7, 2]]  )
									lowercase_	:   str  				=     model(__SCREAMING_SNAKE_CASE  )["""positions"""]
									lowercase_	:   str  				=     torch.tensor([2.5828, 0.7993, -10.9334],   dtype=torch.floataa  )
									self.assertTrue(torch.allclose(position_outputs[0, 0, 0, 0],   __SCREAMING_SNAKE_CASE,   atol=1E-4  )  )





'''simple docstring'''



import argparse
import re
from pathlib import Path

import requests
import torch
from PIL import Image
from torchvision.transforms import CenterCrop, Compose, Normalize, Resize, ToTensor

from transformers import (
    EfficientFormerConfig,
    EfficientFormerForImageClassificationWithTeacher,
    EfficientFormerImageProcessor,
)
from transformers.image_utils import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD, PILImageResampling







def       _UpperCamelCase			(_lowerCamelCase				:  int ,						_lowerCamelCase				:  str						)-> List[str]:




     '''simple docstring'''





     __snake_case            =	old_name

     if "patch_embed" in old_name:
          __snake_case       ,     __snake_case       ,     __snake_case            =	old_name.split('''.'''						)

          if layer == "0":
               __snake_case            =	old_name.replace('''0''' ,						'''convolution1'''						)
          elif layer == "1":
               __snake_case            =	old_name.replace('''1''' ,						'''batchnorm_before'''						)
          elif layer == "3":
               __snake_case            =	old_name.replace('''3''' ,						'''convolution2'''						)
          else:
               __snake_case            =	old_name.replace('''4''' ,						'''batchnorm_after'''						)

     if "network" in old_name and re.search(R'''\d\.\d''' ,						_lowerCamelCase						):
          __snake_case            =	R'''\b\d{2}\b'''
          if bool(re.search(_lowerCamelCase ,						_lowerCamelCase						)						):
               __snake_case            =	re.search(R'''\d\.\d\d.''' ,						_lowerCamelCase						).group()
          else:
               __snake_case            =	re.search(R'''\d\.\d.''' ,						_lowerCamelCase						).group()
          if int(match[0]						) < 6:
               __snake_case            =	old_name.replace(_lowerCamelCase ,						''''''						)
               __snake_case            =	trimmed_name.replace('''network''' ,						match[0] + '''.meta4D_layers.blocks.''' + match[2:-1]						)
               __snake_case            =	'''intermediate_stages.''' + trimmed_name
          else:
               __snake_case            =	old_name.replace(_lowerCamelCase ,						''''''						)
               if int(match[2]						) < num_meta4D_last_stage:
                    __snake_case            =	trimmed_name.replace('''network''' ,						'''meta4D_layers.blocks.''' + match[2]						)
               else:
                    __snake_case            =	str(int(match[2]						) - num_meta4D_last_stage						)
                    __snake_case            =	trimmed_name.replace('''network''' ,						'''meta3D_layers.blocks.''' + layer_index						)
                    if "norm1" in old_name:
                         __snake_case            =	trimmed_name.replace('''norm1''' ,						'''layernorm1'''						)
                    elif "norm2" in old_name:
                         __snake_case            =	trimmed_name.replace('''norm2''' ,						'''layernorm2'''						)
                    elif "fc1" in old_name:
                         __snake_case            =	trimmed_name.replace('''fc1''' ,						'''linear_in'''						)
                    elif "fc2" in old_name:
                         __snake_case            =	trimmed_name.replace('''fc2''' ,						'''linear_out'''						)

               __snake_case            =	'''last_stage.''' + trimmed_name

     elif "network" in old_name and re.search(R'''.\d.''' ,						_lowerCamelCase						):
          __snake_case            =	old_name.replace('''network''' ,						'''intermediate_stages'''						)

     if "fc" in new_name:
          __snake_case            =	new_name.replace('''fc''' ,						'''convolution'''						)
     elif ("norm1" in new_name) and ("layernorm1" not in new_name):
          __snake_case            =	new_name.replace('''norm1''' ,						'''batchnorm_before'''						)
     elif ("norm2" in new_name) and ("layernorm2" not in new_name):
          __snake_case            =	new_name.replace('''norm2''' ,						'''batchnorm_after'''						)
     if "proj" in new_name:
          __snake_case            =	new_name.replace('''proj''' ,						'''projection'''						)
     if "dist_head" in new_name:
          __snake_case            =	new_name.replace('''dist_head''' ,						'''distillation_classifier'''						)
     elif "head" in new_name:
          __snake_case            =	new_name.replace('''head''' ,						'''classifier'''						)
     elif "patch_embed" in new_name:
          __snake_case            =	'''efficientformer.''' + new_name
     elif new_name == "norm.weight" or new_name == "norm.bias":
          __snake_case            =	new_name.replace('''norm''' ,						'''layernorm'''						)
          __snake_case            =	'''efficientformer.''' + new_name
     else:
          __snake_case            =	'''efficientformer.encoder.''' + new_name

     return new_name







def       _UpperCamelCase			(_lowerCamelCase				:  str ,						_lowerCamelCase				:  Tuple						)-> List[str]:




     '''simple docstring'''





     for key in checkpoint.copy().keys():
          __snake_case            =	checkpoint.pop(_lowerCamelCase						)
          __snake_case            =	val

     return checkpoint







def       _UpperCamelCase			()-> Tuple:




     '''simple docstring'''





     __snake_case            =	'''http://images.cocodataset.org/val2017/000000039769.jpg'''
     __snake_case            =	Image.open(requests.get(_lowerCamelCase ,						stream=_lowerCamelCase						).raw						)

     return image







def       _UpperCamelCase			(_lowerCamelCase				:  Path ,						_lowerCamelCase				:  Path ,						_lowerCamelCase				:  Path ,						_lowerCamelCase				:  bool						)-> Optional[Any]:




     '''simple docstring'''





     __snake_case            =	torch.load(_lowerCamelCase ,						map_location='''cpu'''						)['''model''']
     __snake_case            =	EfficientFormerConfig.from_json_file(_lowerCamelCase						)
     __snake_case            =	EfficientFormerForImageClassificationWithTeacher(_lowerCamelCase						)
     __snake_case            =	'''_'''.join(checkpoint_path.split('''/'''						)[-1].split('''.'''						)[0].split('''_'''						)[:-1]						)

     __snake_case            =	config.depths[-1] - config.num_metaad_blocks + 1
     __snake_case            =	convert_torch_checkpoint(_lowerCamelCase ,						_lowerCamelCase						)

     model.load_state_dict(_lowerCamelCase						)
     model.eval()

     __snake_case            =	{
         '''bilinear''': PILImageResampling.BILINEAR,
         '''bicubic''': PILImageResampling.BICUBIC,
         '''nearest''': PILImageResampling.NEAREST,
     }

     # prepare image
     __snake_case            =	prepare_img()
     __snake_case            =	2_56
     __snake_case            =	2_24
     __snake_case            =	EfficientFormerImageProcessor(
         size={'''shortest_edge''': image_size} ,						crop_size={'''height''': crop_size, '''width''': crop_size} ,						resample=pillow_resamplings['''bicubic'''] ,						)
     __snake_case            =	processor(images=_lowerCamelCase ,						return_tensors='''pt'''						).pixel_values

     # original processing pipeline
     __snake_case            =	Compose(
         [
             Resize(_lowerCamelCase ,						interpolation=pillow_resamplings['''bicubic''']						),
             CenterCrop(_lowerCamelCase						),
             ToTensor(),
             Normalize(_lowerCamelCase ,						_lowerCamelCase						),
         ]						)
     __snake_case            =	image_transforms(_lowerCamelCase						).unsqueeze(0						)

     assert torch.allclose(_lowerCamelCase ,						_lowerCamelCase						)

     __snake_case            =	model(_lowerCamelCase						)
     __snake_case            =	outputs.logits

     __snake_case            =	(1, 10_00)

     if "l1" in model_name:
          __snake_case            =	torch.Tensor(
              [-0.1312, 0.4353, -1.0499, -0.5124, 0.4183, -0.6793, -1.3777, -0.0893, -0.7358, -2.4328]						)
          assert torch.allclose(logits[0, :10] ,						_lowerCamelCase ,						atol=1E-3						)
          assert logits.shape == expected_shape
     elif "l3" in model_name:
          __snake_case            =	torch.Tensor(
              [-1.3150, -1.5456, -1.2556, -0.8496, -0.7127, -0.7897, -0.9728, -0.3052, 0.3751, -0.3127]						)
          assert torch.allclose(logits[0, :10] ,						_lowerCamelCase ,						atol=1E-3						)
          assert logits.shape == expected_shape
     elif "l7" in model_name:
          __snake_case            =	torch.Tensor(
              [-1.0283, -1.4131, -0.5644, -1.3115, -0.5785, -1.2049, -0.7528, 0.1992, -0.3822, -0.0878]						)
          assert logits.shape == expected_shape
     else:
          raise ValueError(
              f'''Unknown model checkpoint: {checkpoint_path}. Supported version of efficientformer are l1, l3 and l7'''						)

     # Save Checkpoints
     Path(_lowerCamelCase						).mkdir(exist_ok=_lowerCamelCase						)
     model.save_pretrained(_lowerCamelCase						)
     print(f'''Checkpoint successfuly converted. Model saved at {pytorch_dump_path}'''						)
     processor.save_pretrained(_lowerCamelCase						)
     print(f'''Processor successfuly saved at {pytorch_dump_path}'''						)

     if push_to_hub:
          print('''Pushing model to the hub...'''						)

          model.push_to_hub(
              repo_id=f'''Bearnardd/{pytorch_dump_path}''' ,						commit_message='''Add model''' ,						use_temp_dir=_lowerCamelCase ,						)
          processor.push_to_hub(
              repo_id=f'''Bearnardd/{pytorch_dump_path}''' ,						commit_message='''Add image processor''' ,						use_temp_dir=_lowerCamelCase ,						)


if __name__ == "__main__":
     UpperCAmelCase_							:	Optional[int]	     =		argparse.ArgumentParser()
     # Required parameters
     parser.add_argument(
         '''--pytorch_model_path''',
         default=None,
         type=str,
         required=True,
         help='''Path to EfficientFormer pytorch checkpoint.''',
     )
     parser.add_argument(
         '''--config_file''',
         default=None,
         type=str,
         required=True,
         help='''The json file for EfficientFormer model config.''',
     )
     parser.add_argument(
         '''--pytorch_dump_path''', default=None, type=str, required=True, help='''Path to the output PyTorch model.'''
     )

     parser.add_argument('''--push_to_hub''', action='''store_true''', help='''Push model and image processor to the hub''')
     parser.add_argument(
         '''--no-push_to_hub''',
         dest='''push_to_hub''',
         action='''store_false''',
         help='''Do not push model and image processor to the hub''',
     )
     parser.set_defaults(push_to_hub=True)

     UpperCAmelCase_							:	Union[str, Any]	     =		parser.parse_args()
     convert_efficientformer_checkpoint(
         checkpoint_path=args.pytorch_model_path,
         efficientformer_config_file=args.config_file,
         pytorch_dump_path=args.pytorch_dump_path,
         push_to_hub=args.push_to_hub,
     )






