



def 			lowerCAmelCase__	(					lowerCamelCase_):





				'''simple docstring'''

				if not isinstance(lowerCamelCase_ ,lowerCamelCase_):
								raise ValueError('''Input series is not valid, valid series - [2, 4, 6]''')
				if len(lowerCamelCase_) == 0:
								raise ValueError('''Input list must be a non empty list''')
				if len(lowerCamelCase_) == 1:
								return True
				lowerCAmelCase__  :       Tuple				=  series[1] - series[0]
				for index in range(len(lowerCamelCase_) - 1):
								if series[index + 1] - series[index] != common_diff:
												return False
				return True






def 			lowerCAmelCase__	(					lowerCamelCase_):





				'''simple docstring'''

				if not isinstance(lowerCamelCase_ ,lowerCamelCase_):
								raise ValueError('''Input series is not valid, valid series - [2, 4, 6]''')
				if len(lowerCamelCase_) == 0:
								raise ValueError('''Input list must be a non empty list''')
				lowerCAmelCase__  :       Optional[Any]				=  0
				for val in series:
								answer += val
				return answer / len(lowerCamelCase_)


if __name__ == "__main__":
							import doctest

							doctest.testmod()






from typing import Dict

import numpy as np
import torch

from . import residue_constants as rc
from .tensor_utils import tensor_tree_map, tree_map






def 			lowerCAmelCase__	(					lowerCamelCase_	:	Dict[str, torch.Tensor]):





				'''simple docstring'''

				lowerCAmelCase__  :       List[Any]				=  []
				lowerCAmelCase__  :       int				=  []
				lowerCAmelCase__  :       Optional[int]				=  []

				for rt in rc.restypes:
								lowerCAmelCase__  :       int				=  rc.restype_name_to_atomaa_names[rc.restype_atoa[rt]]
								restype_atomaa_to_atomaa_list.append([(rc.atom_order[name] if name else 0) for name in atom_names])
								lowerCAmelCase__  :       Any				=  {name: i for i, name in enumerate(lowerCamelCase_)}
								restype_atomaa_to_atomaa_list.append(
								    [(atom_name_to_idxaa[name] if name in atom_name_to_idxaa else 0) for name in rc.atom_types])

								restype_atomaa_mask_list.append([(1.0 if name else 0.0) for name in atom_names])

				# Add dummy mapping for restype 'UNK'
				restype_atomaa_to_atomaa_list.append([0] * 14)
				restype_atomaa_to_atomaa_list.append([0] * 37)
				restype_atomaa_mask_list.append([0.0] * 14)

				lowerCAmelCase__  :       Optional[Any]				=  torch.tensor(
				    lowerCamelCase_ ,dtype=torch.intaa ,device=protein['''aatype'''].device ,)
				lowerCAmelCase__  :       Optional[int]				=  torch.tensor(
				    lowerCamelCase_ ,dtype=torch.intaa ,device=protein['''aatype'''].device ,)
				lowerCAmelCase__  :       List[str]				=  torch.tensor(
				    lowerCamelCase_ ,dtype=torch.floataa ,device=protein['''aatype'''].device ,)
				lowerCAmelCase__  :       Optional[Any]				=  protein['''aatype'''].to(torch.long)

				# create the mapping for (residx, atom14) --> atom37, i.e. an array
				# with shape (num_res, 14) containing the atom37 indices for this protein
				lowerCAmelCase__  :       Optional[int]				=  restype_atomaa_to_atomaa[protein_aatype]
				lowerCAmelCase__  :       List[str]				=  restype_atomaa_mask[protein_aatype]

				lowerCAmelCase__  :       Tuple				=  residx_atomaa_mask
				lowerCAmelCase__  :       Dict				=  residx_atomaa_to_atomaa.long()

				# create the gather indices for mapping back
				lowerCAmelCase__  :       Union[str, Any]				=  restype_atomaa_to_atomaa[protein_aatype]
				lowerCAmelCase__  :       int				=  residx_atomaa_to_atomaa.long()

				# create the corresponding mask
				lowerCAmelCase__  :       List[str]				=  torch.zeros([21, 37] ,dtype=torch.floataa ,device=protein['''aatype'''].device)
				for restype, restype_letter in enumerate(rc.restypes):
								lowerCAmelCase__  :       List[str]				=  rc.restype_atoa[restype_letter]
								lowerCAmelCase__  :       List[str]				=  rc.residue_atoms[restype_name]
								for atom_name in atom_names:
												lowerCAmelCase__  :       List[Any]				=  rc.atom_order[atom_name]
												lowerCAmelCase__  :       Any				=  1

				lowerCAmelCase__  :       int				=  restype_atomaa_mask[protein_aatype]
				lowerCAmelCase__  :       int				=  residx_atomaa_mask

				return protein






def 			lowerCAmelCase__	(					lowerCamelCase_	:	Dict[str, torch.Tensor]):





				'''simple docstring'''

				lowerCAmelCase__  :       Optional[Any]				=  tree_map(lambda lowerCamelCase_: torch.tensor(lowerCamelCase_ ,device=batch['''aatype'''].device) ,lowerCamelCase_ ,np.ndarray)
				lowerCAmelCase__  :       Union[str, Any]				=  tensor_tree_map(lambda lowerCamelCase_: np.array(lowerCamelCase_) ,make_atomaa_masks(lowerCamelCase_))
				return out

