




"""simple docstring"""




import re

from flax.core.frozen_dict import freeze
from flax.traverse_util import flatten_dict, unflatten_dict
from jax.experimental import PartitionSpec as P


# Sentinels
lowerCAmelCase				:     List[str]					=				object()

# For specifying empty leaf dict `{}`
lowerCAmelCase				:     Any					=				object()



def        a__					(							snake_case__			,					snake_case__							)		->   List[Any]:
			lowerCamelCase      =   tuple((re.compile(x + """$"""							) for x in qs)							)
			for i in range(len(snake_case__							) - len(snake_case__							) + 1							):
						lowerCamelCase      =   [x.match(snake_case__							) for x, y in zip(snake_case__			,					ks[i:]							)]
						if matches and all(snake_case__							):
									return True
			return False



def        a__					(							snake_case__							)		->   str:
			def replace(snake_case__			,					snake_case__							):
						for rule, replacement in rules:
									if _match(snake_case__			,					snake_case__							):
												return replacement
						return val

			return replace



def        a__					(							)		->   Union[str, Any]:
			return [
			    # embeddings
			    (("transformer", "wpe", "embedding"), P("""mp"""			,					snake_case__							)),
			    (("transformer", "wte", "embedding"), P("""mp"""			,					snake_case__							)),
			    # atention
			    (("attention", "(q_proj|k_proj|v_proj)", "kernel"), P(snake_case__			,					"""mp"""							)),
			    (("attention", "out_proj", "kernel"), P("""mp"""			,					snake_case__							)),
			    (("attention", "out_proj", "bias"), None),
			    # mlp
			    (("mlp", "c_fc", "kernel"), P(snake_case__			,					"""mp"""							)),
			    (("mlp", "c_fc", "bias"), P("""mp"""							)),
			    (("mlp", "c_proj", "kernel"), P("""mp"""			,					snake_case__							)),
			    (("mlp", "c_proj", "bias"), None),
			    # layer norms
			    ((r"ln_\d+", "bias"), None),
			    ((r"\d+", r"ln_\d+", "scale"), None),
			    (("ln_f", "bias"), None),
			    (("ln_f", "scale"), None),
			]



def        a__					(							snake_case__							)		->   Optional[Any]:
			lowerCamelCase      =   _get_partition_rules()
			lowerCamelCase      =   _replacement_rules(snake_case__							)
			lowerCamelCase      =   {k: _unmatched for k in flatten_dict(snake_case__							)}
			lowerCamelCase      =   {k: replace(snake_case__			,					snake_case__							) for k, v in initd.items()}
			assert _unmatched not in result.values(), "Incomplete partition spec."
			return freeze(unflatten_dict(snake_case__							)							)









"""simple docstring"""




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        a__					(							snake_case__							)		->   Dict[str, torch.Tensor]:
			lowerCamelCase      =   []
			lowerCamelCase      =   []
			lowerCamelCase      =   []

			for rt in rc.restypes:
						lowerCamelCase      =   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      =   {name: i for i, name in enumerate(snake_case__							)}
						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      =   torch.tensor(
			    snake_case__			,					dtype=torch.intaa			,					device=protein["""aatype"""].device			,					)
			lowerCamelCase      =   torch.tensor(
			    snake_case__			,					dtype=torch.intaa			,					device=protein["""aatype"""].device			,					)
			lowerCamelCase      =   torch.tensor(
			    snake_case__			,					dtype=torch.floataa			,					device=protein["""aatype"""].device			,					)
			lowerCamelCase      =   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      =   restype_atomaa_to_atomaa[protein_aatype]
			lowerCamelCase      =   restype_atomaa_mask[protein_aatype]

			lowerCamelCase      =   residx_atomaa_mask
			lowerCamelCase      =   residx_atomaa_to_atomaa.long()

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

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

			lowerCamelCase      =   restype_atomaa_mask[protein_aatype]
			lowerCamelCase      =   residx_atomaa_mask

			return protein



def        a__					(							snake_case__							)		->   Dict[str, np.ndarray]:
			lowerCamelCase      =   tree_map(lambda snake_case__							: torch.tensor(snake_case__			,					device=batch["""aatype"""].device							)			,					snake_case__			,					np.ndarray							)
			lowerCamelCase      =   tensor_tree_map(lambda snake_case__							: np.array(snake_case__							)			,					make_atomaa_masks(snake_case__							)							)
			return out



