
'''simple docstring'''



import os
import unicodedata
from shutil import copyfile
from typing import Any, Dict, List, Optional, Tuple

import sentencepiece as spm

from ...tokenization_utils import AddedToken, PreTrainedTokenizer
from ...utils import logging


_lowercase          =						logging.get_logger(__name__)
_lowercase          =						{"""vocab_file""": """spiece.model"""}

_lowercase          =						{
    """vocab_file""": {
        """albert-base-v1""": """https://huggingface.co/albert-base-v1/resolve/main/spiece.model""",
        """albert-large-v1""": """https://huggingface.co/albert-large-v1/resolve/main/spiece.model""",
        """albert-xlarge-v1""": """https://huggingface.co/albert-xlarge-v1/resolve/main/spiece.model""",
        """albert-xxlarge-v1""": """https://huggingface.co/albert-xxlarge-v1/resolve/main/spiece.model""",
        """albert-base-v2""": """https://huggingface.co/albert-base-v2/resolve/main/spiece.model""",
        """albert-large-v2""": """https://huggingface.co/albert-large-v2/resolve/main/spiece.model""",
        """albert-xlarge-v2""": """https://huggingface.co/albert-xlarge-v2/resolve/main/spiece.model""",
        """albert-xxlarge-v2""": """https://huggingface.co/albert-xxlarge-v2/resolve/main/spiece.model""",
    }
}

_lowercase          =						{
    """albert-base-v1""": 512,
    """albert-large-v1""": 512,
    """albert-xlarge-v1""": 512,
    """albert-xxlarge-v1""": 512,
    """albert-base-v2""": 512,
    """albert-large-v2""": 512,
    """albert-xlarge-v2""": 512,
    """albert-xxlarge-v2""": 512,
}

_lowercase          =						"""▁"""




class     UpperCAmelCase_	(						_SCREAMING_SNAKE_CASE					):






						'''simple docstring'''






						_lowercase						: Any										=  VOCAB_FILES_NAMES
						_lowercase						: int										=  PRETRAINED_VOCAB_FILES_MAP
						_lowercase						: Union[str, Any]										=  PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES




						def __init__(   self       ,  _lowercase       ,  _lowercase=True       ,  _lowercase=True       ,  _lowercase=False       ,  _lowercase="[CLS]"       ,  _lowercase="[SEP]"       ,  _lowercase="<unk>"       ,  _lowercase="[SEP]"       ,  _lowercase="<pad>"       ,  _lowercase="[CLS]"       ,  _lowercase="[MASK]"       ,  _lowercase = None       ,  **_lowercase       ,  ):

												"""simple docstring"""



												_lowerCAmelCase    		=					(
												    AddedToken(_lowercase       ,  lstrip=_lowercase       ,  rstrip=_lowercase       ,  normalized=_lowercase )
												    if isinstance(_lowercase       ,  _lowercase )
												    else mask_token
												)

												_lowerCAmelCase    		=					{} if sp_model_kwargs is None else sp_model_kwargs

												super().__init__(
												    do_lower_case=_lowercase       ,  remove_space=_lowercase       ,  keep_accents=_lowercase       ,  bos_token=_lowercase       ,  eos_token=_lowercase       ,  unk_token=_lowercase       ,  sep_token=_lowercase       ,  pad_token=_lowercase       ,  cls_token=_lowercase       ,  mask_token=_lowercase       ,  sp_model_kwargs=self.sp_model_kwargs       ,  **_lowercase       ,  )

												_lowerCAmelCase    		=					do_lower_case
												_lowerCAmelCase    		=					remove_space
												_lowerCAmelCase    		=					keep_accents
												_lowerCAmelCase    		=					vocab_file

												_lowerCAmelCase    		=					spm.SentencePieceProcessor(**self.sp_model_kwargs )
												self.sp_model.Load(_lowercase )




						@property
						def    _lowercase      (   self ):

												"""simple docstring"""



												return len(self.sp_model )




						def    _lowercase      (   self ):

												"""simple docstring"""



												_lowerCAmelCase    		=					{self.convert_ids_to_tokens(_lowercase ): i for i in range(self.vocab_size )}
												vocab.update(self.added_tokens_encoder )
												return vocab




						def __getstate__(   self ):

												"""simple docstring"""



												_lowerCAmelCase    		=					self.__dict__.copy()
												_lowerCAmelCase    		=					None
												return state




						def __setstate__(   self       ,  _lowercase ):

												"""simple docstring"""



												_lowerCAmelCase    		=					d

												# for backward compatibility
												if not hasattr(self       ,  """sp_model_kwargs""" ):
																		_lowerCAmelCase    		=					{}

												_lowerCAmelCase    		=					spm.SentencePieceProcessor(**self.sp_model_kwargs )
												self.sp_model.Load(self.vocab_file )




						def    _lowercase      (   self       ,  _lowercase ):

												"""simple docstring"""



												if self.remove_space:
																		_lowerCAmelCase    		=					""" """.join(inputs.strip().split() )
												else:
																		_lowerCAmelCase    		=					inputs
												_lowerCAmelCase    		=					outputs.replace("""``"""       ,  """\"""" ).replace("""''"""       ,  """\"""" )

												if not self.keep_accents:
																		_lowerCAmelCase    		=					unicodedata.normalize("""NFKD"""       ,  _lowercase )
																		_lowerCAmelCase    		=					"""""".join([c for c in outputs if not unicodedata.combining(_lowercase )] )
												if self.do_lower_case:
																		_lowerCAmelCase    		=					outputs.lower()

												return outputs




						def    _lowercase      (   self       ,  _lowercase ):

												"""simple docstring"""



												_lowerCAmelCase    		=					self.preprocess_text(_lowercase )
												_lowerCAmelCase    		=					self.sp_model.encode(_lowercase       ,  out_type=_lowercase )
												_lowerCAmelCase    		=					[]
												for piece in pieces:
																		if len(_lowercase ) > 1 and piece[-1] == str(""",""" ) and piece[-2].isdigit():
																								_lowerCAmelCase    		=					self.sp_model.EncodeAsPieces(piece[:-1].replace(_lowercase       ,  """""" ) )
																								if piece[0] != SPIECE_UNDERLINE and cur_pieces[0][0] == SPIECE_UNDERLINE:
																														if len(cur_pieces[0] ) == 1:
																																				_lowerCAmelCase    		=					cur_pieces[1:]
																														else:
																																				_lowerCAmelCase    		=					cur_pieces[0][1:]
																								cur_pieces.append(piece[-1] )
																								new_pieces.extend(_lowercase )
																		else:
																								new_pieces.append(_lowercase )

												return new_pieces




						def    _lowercase      (   self       ,  _lowercase ):

												"""simple docstring"""



												return self.sp_model.PieceToId(_lowercase )




						def    _lowercase      (   self       ,  _lowercase ):

												"""simple docstring"""



												return self.sp_model.IdToPiece(_lowercase )




						def    _lowercase      (   self       ,  _lowercase ):

												"""simple docstring"""



												_lowerCAmelCase    		=					[]
												_lowerCAmelCase    		=					""""""
												_lowerCAmelCase    		=					False
												for token in tokens:
																		# make sure that special tokens are not decoded using sentencepiece model
																		if token in self.all_special_tokens:
																								if not prev_is_special:
																														out_string += " "
																								out_string += self.sp_model.decode(_lowercase ) + token
																								_lowerCAmelCase    		=					True
																								_lowerCAmelCase    		=					[]
																		else:
																								current_sub_tokens.append(_lowercase )
																								_lowerCAmelCase    		=					False
												out_string += self.sp_model.decode(_lowercase )
												return out_string.strip()




						def    _lowercase      (   self       ,  _lowercase       ,  _lowercase = None ):

												"""simple docstring"""



												_lowerCAmelCase    		=					[self.sep_token_id]
												_lowerCAmelCase    		=					[self.cls_token_id]
												if token_ids_a is None:
																		return cls + token_ids_a + sep
												return cls + token_ids_a + sep + token_ids_a + sep




						def    _lowercase      (   self       ,  _lowercase       ,  _lowercase = None       ,  _lowercase = False ):

												"""simple docstring"""



												if already_has_special_tokens:
																		return super().get_special_tokens_mask(
																		    token_ids_a=_lowercase       ,  token_ids_a=_lowercase       ,  already_has_special_tokens=_lowercase )

												if token_ids_a is not None:
																		return [1] + ([0] * len(_lowercase )) + [1] + ([0] * len(_lowercase )) + [1]
												return [1] + ([0] * len(_lowercase )) + [1]




						def    _lowercase      (   self       ,  _lowercase       ,  _lowercase = None ):

												"""simple docstring"""



												_lowerCAmelCase    		=					[self.sep_token_id]
												_lowerCAmelCase    		=					[self.cls_token_id]

												if token_ids_a is None:
																		return len(cls + token_ids_a + sep ) * [0]
												return len(cls + token_ids_a + sep ) * [0] + len(token_ids_a + sep ) * [1]




						def    _lowercase      (   self       ,  _lowercase       ,  _lowercase = None ):

												"""simple docstring"""



												if not os.path.isdir(_lowercase ):
																		logger.error(F'Vocabulary path ({save_directory}) should be a directory' )
																		return
												_lowerCAmelCase    		=					os.path.join(
												    _lowercase       ,  (filename_prefix + """-""" if filename_prefix else """""") + VOCAB_FILES_NAMES["""vocab_file"""] )

												if os.path.abspath(self.vocab_file ) != os.path.abspath(_lowercase ) and os.path.isfile(self.vocab_file ):
																		copyfile(self.vocab_file       ,  _lowercase )
												elif not os.path.isfile(self.vocab_file ):
																		with open(_lowercase       ,  """wb""" ) as fi:
																								_lowerCAmelCase    		=					self.sp_model.serialized_model_proto()
																								fi.write(_lowercase )

												return (out_vocab_file,)




'''simple docstring'''



from dataclasses import asdict, dataclass
from typing import Optional

from ...configuration_utils import PretrainedConfig
from ...utils import logging


A__						:   List[str]				=    logging.get_logger(__name__)

# TODO Update this
A__						:   Tuple				=    {
    """facebook/esm-1b""": """https://huggingface.co/facebook/esm-1b/resolve/main/config.json""",
    # See all ESM models at https://huggingface.co/models?filter=esm
}





class   UpperCAmelCase_    (_UpperCAmelCase    ):





    """simple docstring"""






    lowerCamelCase    :   Tuple					=     'esm'







    def __init__(				self     ,	SCREAMING_SNAKE_CASE_=None     ,	SCREAMING_SNAKE_CASE_=None     ,	SCREAMING_SNAKE_CASE_=None     ,	SCREAMING_SNAKE_CASE_=7_68     ,	SCREAMING_SNAKE_CASE_=12     ,	SCREAMING_SNAKE_CASE_=12     ,	SCREAMING_SNAKE_CASE_=30_72     ,	SCREAMING_SNAKE_CASE_=0.1     ,	SCREAMING_SNAKE_CASE_=0.1     ,	SCREAMING_SNAKE_CASE_=10_26     ,	SCREAMING_SNAKE_CASE_=0.0_2     ,	SCREAMING_SNAKE_CASE_=1E-12     ,	SCREAMING_SNAKE_CASE_="absolute"     ,	SCREAMING_SNAKE_CASE_=True     ,	SCREAMING_SNAKE_CASE_=None     ,	SCREAMING_SNAKE_CASE_=False     ,	SCREAMING_SNAKE_CASE_=False     ,	SCREAMING_SNAKE_CASE_=None     ,	SCREAMING_SNAKE_CASE_=None     ,	**SCREAMING_SNAKE_CASE_     ,	)							->	List[str]:
         super().__init__(pad_token_id=SCREAMING_SNAKE_CASE_     ,	mask_token_id=SCREAMING_SNAKE_CASE_     ,	**SCREAMING_SNAKE_CASE_      )

         __lowerCamelCase  :      int														=						vocab_size
         __lowerCamelCase  :      List[Any]														=						hidden_size
         __lowerCamelCase  :      str														=						num_hidden_layers
         __lowerCamelCase  :      List[str]														=						num_attention_heads
         __lowerCamelCase  :      Any														=						intermediate_size
         __lowerCamelCase  :      Optional[Any]														=						hidden_dropout_prob
         __lowerCamelCase  :      Tuple														=						attention_probs_dropout_prob
         __lowerCamelCase  :      Optional[int]														=						max_position_embeddings
         __lowerCamelCase  :      str														=						initializer_range
         __lowerCamelCase  :      Optional[int]														=						layer_norm_eps
         __lowerCamelCase  :      List[str]														=						position_embedding_type
         __lowerCamelCase  :      int														=						use_cache
         __lowerCamelCase  :      Optional[Any]														=						emb_layer_norm_before
         __lowerCamelCase  :      Optional[Any]														=						token_dropout
         __lowerCamelCase  :      str														=						is_folding_model
         if is_folding_model:
              if esmfold_config is None:
                   logger.info('No esmfold_config supplied for folding model, using default values.'      )
                   __lowerCamelCase  :      Dict														=						EsmFoldConfig()
              elif isinstance(SCREAMING_SNAKE_CASE_     ,	SCREAMING_SNAKE_CASE_      ):
                   __lowerCamelCase  :      Optional[int]														=						EsmFoldConfig(**SCREAMING_SNAKE_CASE_      )
              __lowerCamelCase  :      List[Any]														=						esmfold_config
              if vocab_list is None:
                   logger.warning('No vocab_list supplied for folding model, assuming the ESM-2 vocabulary!'      )
                   __lowerCamelCase  :      List[str]														=						get_default_vocab_list()
              else:
                   __lowerCamelCase  :      Optional[Any]														=						vocab_list
         else:
              __lowerCamelCase  :      Dict														=						None
              __lowerCamelCase  :      Optional[Any]														=						None
         if self.esmfold_config is not None and getattr(self.esmfold_config     ,	'use_esm_attn_map'     ,	SCREAMING_SNAKE_CASE_      ):
              raise ValueError('The HuggingFace port of ESMFold does not support use_esm_attn_map at this time!'      )







    def  lowercase_							(				self      )							->	Any:
         __lowerCamelCase  :      Any														=						super().to_dict()
         if isinstance(self.esmfold_config     ,	SCREAMING_SNAKE_CASE_      ):
              __lowerCamelCase  :      int														=						self.esmfold_config.to_dict()
         return output







@dataclass
class   UpperCAmelCase_    :





    """simple docstring"""






    lowerCamelCase    :   str					=     None
    lowerCamelCase    :   bool					=     True
    lowerCamelCase    :   bool					=     False
    lowerCamelCase    :   bool					=     False
    lowerCamelCase    :   bool					=     False
    lowerCamelCase    :   float					=     0

    lowerCamelCase    :   bool					=     True
    lowerCamelCase    :   bool					=     False

    lowerCamelCase    :   int					=     1_2_8
    lowerCamelCase    :   "TrunkConfig"					=     None







    def  lowercase_							(				self      )							->	Any:
         if self.trunk is None:
              __lowerCamelCase  :      List[str]														=						TrunkConfig()
         elif isinstance(self.trunk     ,	SCREAMING_SNAKE_CASE_      ):
              __lowerCamelCase  :      Any														=						TrunkConfig(**self.trunk      )







    def  lowercase_							(				self      )							->	int:
         __lowerCamelCase  :      Optional[int]														=						asdict(self      )
         __lowerCamelCase  :      str														=						self.trunk.to_dict()
         return output







@dataclass
class   UpperCAmelCase_    :





    """simple docstring"""






    lowerCamelCase    :   int					=     4_8
    lowerCamelCase    :   int					=     1_0_2_4
    lowerCamelCase    :   int					=     1_2_8
    lowerCamelCase    :   int					=     3_2
    lowerCamelCase    :   int					=     3_2
    lowerCamelCase    :   int					=     3_2
    lowerCamelCase    :   float					=     0
    lowerCamelCase    :   float					=     0
    lowerCamelCase    :   bool					=     False
    lowerCamelCase    :   int					=     4
    lowerCamelCase    :   Optional[int]					=     1_2_8
    lowerCamelCase    :   "StructureModuleConfig"					=     None







    def  lowercase_							(				self      )							->	Optional[int]:
         if self.structure_module is None:
              __lowerCamelCase  :      Dict														=						StructureModuleConfig()
         elif isinstance(self.structure_module     ,	SCREAMING_SNAKE_CASE_      ):
              __lowerCamelCase  :      Optional[Any]														=						StructureModuleConfig(**self.structure_module      )

         if self.max_recycles <= 0:
              raise ValueError(f'`max_recycles` should be positive, got {self.max_recycles}.'      )
         if self.sequence_state_dim % self.sequence_state_dim != 0:
              raise ValueError(
                  '`sequence_state_dim` should be a round multiple of `sequence_state_dim`, got'
                  f' {self.sequence_state_dim} and {self.sequence_state_dim}.'      )
         if self.pairwise_state_dim % self.pairwise_state_dim != 0:
              raise ValueError(
                  '`pairwise_state_dim` should be a round multiple of `pairwise_state_dim`, got'
                  f' {self.pairwise_state_dim} and {self.pairwise_state_dim}.'      )

         __lowerCamelCase  :      Tuple														=						self.sequence_state_dim // self.sequence_head_width
         __lowerCamelCase  :      str														=						self.pairwise_state_dim // self.pairwise_head_width

         if self.sequence_state_dim != sequence_num_heads * self.sequence_head_width:
              raise ValueError(
                  '`sequence_state_dim` should be equal to `sequence_num_heads * sequence_head_width, got'
                  f' {self.sequence_state_dim} != {sequence_num_heads} * {self.sequence_head_width}.'      )
         if self.pairwise_state_dim != pairwise_num_heads * self.pairwise_head_width:
              raise ValueError(
                  '`pairwise_state_dim` should be equal to `pairwise_num_heads * pairwise_head_width, got'
                  f' {self.pairwise_state_dim} != {pairwise_num_heads} * {self.pairwise_head_width}.'      )
         if self.pairwise_state_dim % 2 != 0:
              raise ValueError(f'`pairwise_state_dim` should be even, got {self.pairwise_state_dim}.'      )

         if self.dropout >= 0.4:
              raise ValueError(f'`dropout` should not be greater than 0.4, got {self.dropout}.'      )







    def  lowercase_							(				self      )							->	List[Any]:
         __lowerCamelCase  :      List[str]														=						asdict(self      )
         __lowerCamelCase  :      int														=						self.structure_module.to_dict()
         return output







@dataclass
class   UpperCAmelCase_    :





    """simple docstring"""






    lowerCamelCase    :   int					=     3_8_4
    lowerCamelCase    :   int					=     1_2_8
    lowerCamelCase    :   int					=     1_6
    lowerCamelCase    :   int					=     1_2_8
    lowerCamelCase    :   int					=     1_2
    lowerCamelCase    :   int					=     4
    lowerCamelCase    :   int					=     8
    lowerCamelCase    :   float					=     0.1
    lowerCamelCase    :   int					=     8
    lowerCamelCase    :   int					=     1
    lowerCamelCase    :   int					=     2
    lowerCamelCase    :   int					=     7
    lowerCamelCase    :   int					=     1_0
    lowerCamelCase    :   float					=     1e-8
    lowerCamelCase    :   float					=     1e5







    def  lowercase_							(				self      )							->	Any:
         return asdict(self      )







def      UpperCAmelCase__   (      )	->						Optional[Any]:
     return (
         "<cls>",
         "<pad>",
         "<eos>",
         "<unk>",
         "L",
         "A",
         "G",
         "V",
         "S",
         "E",
         "R",
         "T",
         "I",
         "D",
         "P",
         "K",
         "Q",
         "N",
         "F",
         "Y",
         "M",
         "H",
         "W",
         "C",
         "X",
         "B",
         "U",
         "Z",
         "O",
         ".",
         "-",
         "<null_1>",
         "<mask>",
     )






