

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     (			UpperCamelCase__				):







							'''simple docstring'''






							snake_case_          =   []
							snake_case_          =   []
							snake_case_          =   []

							for rt in rc.restypes:
														snake_case_          =   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]				)
														snake_case_          =   {name: i for i, name in enumerate(UpperCamelCase__				)}
														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				)

							snake_case_          =   torch.tensor(
							    UpperCamelCase__       ,							dtype=torch.intaa       ,							device=protein['aatype'].device       ,							)
							snake_case_          =   torch.tensor(
							    UpperCamelCase__       ,							dtype=torch.intaa       ,							device=protein['aatype'].device       ,							)
							snake_case_          =   torch.tensor(
							    UpperCamelCase__       ,							dtype=torch.floataa       ,							device=protein['aatype'].device       ,							)
							snake_case_          =   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
							snake_case_          =   restype_atomaa_to_atomaa[protein_aatype]
							snake_case_          =   restype_atomaa_mask[protein_aatype]

							snake_case_          =   residx_atomaa_mask
							snake_case_          =   residx_atomaa_to_atomaa.long()

							# create the gather indices for mapping back
							snake_case_          =   restype_atomaa_to_atomaa[protein_aatype]
							snake_case_          =   residx_atomaa_to_atomaa.long()

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

							snake_case_          =   restype_atomaa_mask[protein_aatype]
							snake_case_          =   residx_atomaa_mask

							return protein





def  __lowerCamelCase     (			UpperCamelCase__				):







							'''simple docstring'''






							snake_case_          =   tree_map(lambda UpperCamelCase__				: torch.tensor(UpperCamelCase__       ,							device=batch['aatype'].device				)       ,							UpperCamelCase__       ,							np.ndarray				)
							snake_case_          =   tensor_tree_map(lambda UpperCamelCase__				: np.array(UpperCamelCase__				)       ,							make_atomaa_masks(UpperCamelCase__				)				)
							return out







def  __lowerCamelCase     (			UpperCamelCase__				):







							'''simple docstring'''






							snake_case_          =   1
							snake_case_          =   2
							while i * i <= n:
														snake_case_          =   0
														while n % i == 0:
																					n //= i
																					multiplicity += 1
														n_divisors *= multiplicity + 1
														i += 1
							if n > 1:
														n_divisors *= 2
							return n_divisors





def  __lowerCamelCase     (			):







							'''simple docstring'''






							snake_case_          =   1
							snake_case_          =   1

							while True:
														i += 1
														t_num += i

														if count_divisors(UpperCamelCase__				) > 500:
																					break

							return t_num


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




