"""simple docstring"""







from typing import Dict, Tuple, overload

import torch
import torch.types
from torch import nn

from . import residue_constants as rc
from .rigid_utils import Rigid, Rotation
from .tensor_utils import batched_gather



@overload
def       A__    (	lowercase_     :	torch.Tensor      , lowercase_     :	torch.Tensor      , lowercase_     :	None						)  ->							torch.Tensor:
   ...



@overload
def       A__    (	lowercase_     :	torch.Tensor      , lowercase_     :	torch.Tensor      , lowercase_     :	torch.Tensor						)  ->							Tuple[torch.Tensor, torch.Tensor]:
   ...



def       A__    (	lowercase_     :	int      , lowercase_     :	Tuple      , lowercase_     :	Optional[int]						)  ->							int:
   __lowerCamelCase    		=					aatype == rc.restype_order['G']
   __lowerCamelCase    		=					rc.atom_order['CA']
   __lowerCamelCase    		=					rc.atom_order['CB']
   __lowerCamelCase    		=					torch.where(
       is_gly[..., None].expand(*((-1,) * len(is_gly.shape						))      , 3						)      , all_atom_positions[..., ca_idx, :]      , all_atom_positions[..., cb_idx, :]      , )

   if all_atom_masks is not None:
      __lowerCamelCase    		=					torch.where(
          lowercase_      , all_atom_masks[..., ca_idx]      , all_atom_masks[..., cb_idx]      , )
      return pseudo_beta, pseudo_beta_mask
   else:
      return pseudo_beta



def       A__    (	lowercase_     :	torch.Tensor      , lowercase_     :	Dict[str, torch.Tensor]						)  ->							torch.Tensor:
   __lowerCamelCase    		=					batched_gather(
       lowercase_      , batch['residx_atom37_to_atom14']      , dim=-2      , no_batch_dims=len(atomaa.shape[:-2]						)      , )

   __lowerCamelCase    		=					atomaa_data * batch['atom37_atom_exists'][..., None]

   return atomaa_data



def       A__    (	lowercase_     :	Dict[str, torch.Tensor]						)  ->							torch.Tensor:
   __lowerCamelCase    		=					template_feats['template_aatype']
   __lowerCamelCase    		=					template_feats['template_torsion_angles_sin_cos']
   __lowerCamelCase    		=					template_feats['template_alt_torsion_angles_sin_cos']
   __lowerCamelCase    		=					template_feats['template_torsion_angles_mask']
   __lowerCamelCase    		=					torch.cat(
       [
           nn.functional.one_hot(lowercase_      , 22						),
           torsion_angles_sin_cos.reshape(*torsion_angles_sin_cos.shape[:-2]      , 14						),
           alt_torsion_angles_sin_cos.reshape(*alt_torsion_angles_sin_cos.shape[:-2]      , 14						),
           torsion_angles_mask,
       ]      , dim=-1      , )

   return template_angle_feat



def       A__    (	lowercase_     :	Dict[str, torch.Tensor]      , lowercase_     :	torch.types.Number      , lowercase_     :	torch.types.Number      , lowercase_     :	int      , lowercase_     :	bool = False      , lowercase_     :	float = 1e-20      , lowercase_     :	float = 1e8      , )  ->							torch.Tensor:
   __lowerCamelCase    		=					batch['template_pseudo_beta_mask']
   __lowerCamelCase    		=					template_mask[..., None] * template_mask[..., None, :]

   # Compute distogram (this seems to differ slightly from Alg. 5)
   __lowerCamelCase    		=					batch['template_pseudo_beta']
   __lowerCamelCase    		=					torch.sum((tpb[..., None, :] - tpb[..., None, :, :]) ** 2      , dim=-1      , keepdim=lowercase_						)
   __lowerCamelCase    		=					torch.linspace(lowercase_      , lowercase_      , lowercase_      , device=tpb.device						) ** 2
   __lowerCamelCase    		=					torch.cat([lower[1:], lower.new_tensor([inf]						)]      , dim=-1						)
   __lowerCamelCase    		=					((dgram > lower) * (dgram < upper)).type(dgram.dtype						)

   __lowerCamelCase    		=					[dgram, template_mask_ad[..., None]]

   __lowerCamelCase    		=					nn.functional.one_hot(
       batch['template_aatype']      , rc.restype_num + 2      , )

   __lowerCamelCase    		=					batch['template_aatype'].shape[-1]
   to_concat.append(aatype_one_hot[..., None, :, :].expand(*aatype_one_hot.shape[:-2]      , lowercase_      , -1      , -1						)						)
   to_concat.append(aatype_one_hot[..., None, :].expand(*aatype_one_hot.shape[:-2]      , -1      , lowercase_      , -1						)						)

   __lowerCamelCase		,__lowerCamelCase		,__lowerCamelCase    		=					[rc.atom_order[a] for a in ['N', 'CA', 'C']]
   __lowerCamelCase    		=					Rigid.make_transform_from_reference(
       n_xyz=batch['template_all_atom_positions'][..., n, :]      , ca_xyz=batch['template_all_atom_positions'][..., ca, :]      , c_xyz=batch['template_all_atom_positions'][..., c, :]      , eps=lowercase_      , )
   __lowerCamelCase    		=					rigids.get_trans()[..., None, :, :]
   __lowerCamelCase    		=					rigids[..., None].invert_apply(lowercase_						)

   __lowerCamelCase    		=					torch.rsqrt(eps + torch.sum(rigid_vec**2      , dim=-1						)						)

   __lowerCamelCase    		=					batch['template_all_atom_mask']
   __lowerCamelCase    		=					t_aa_masks[..., n] * t_aa_masks[..., ca] * t_aa_masks[..., c]
   __lowerCamelCase    		=					template_mask[..., None] * template_mask[..., None, :]

   __lowerCamelCase    		=					inv_distance_scalar * template_mask_ad
   __lowerCamelCase    		=					rigid_vec * inv_distance_scalar[..., None]

   if not use_unit_vector:
      __lowerCamelCase    		=					unit_vector * 0.0

   to_concat.extend(torch.unbind(unit_vector[..., None, :]      , dim=-1						)						)
   to_concat.append(template_mask_ad[..., None]						)

   __lowerCamelCase    		=					torch.cat(lowercase_      , dim=-1						)
   __lowerCamelCase    		=					act * template_mask_ad[..., None]

   return act



def       A__    (	lowercase_     :	Dict[str, torch.Tensor]						)  ->							torch.Tensor:
   __lowerCamelCase    		=					nn.functional.one_hot(batch['extra_msa']      , 23						)
   __lowerCamelCase    		=					[
       msa_ahot,
       batch['extra_has_deletion'].unsqueeze(-1						),
       batch['extra_deletion_value'].unsqueeze(-1						),
   ]
   return torch.cat(lowercase_      , dim=-1						)



def       A__    (	lowercase_     :	Rigid      , lowercase_     :	torch.Tensor      , lowercase_     :	torch.Tensor      , lowercase_     :	torch.Tensor      , )  ->							Rigid:
   # [*, N, 8, 4, 4]
   __lowerCamelCase    		=					rrgdf[aatype, ...]

   # [*, N, 8] transformations, i.e.
   #   One [*, N, 8, 3, 3] rotation matrix and
   #   One [*, N, 8, 3]    translation matrix
   __lowerCamelCase    		=					r.from_tensor_axa(lowercase_						)

   __lowerCamelCase    		=					alpha.new_zeros((*((1,) * len(alpha.shape[:-1]						)), 2)						)
   __lowerCamelCase    		=					1

   # [*, N, 8, 2]
   __lowerCamelCase    		=					torch.cat([bb_rot.expand(*alpha.shape[:-2]      , -1      , -1						), alpha]      , dim=-2						)

   # [*, N, 8, 3, 3]
   # Produces rotation matrices of the form:
   # [
   #   [1, 0  , 0  ],
   #   [0, a_2,-a_1],
   #   [0, a_1, a_2]
   # ]
   # This follows the original code rather than the supplement, which uses
   # different indices.

   __lowerCamelCase    		=					alpha.new_zeros(default_r.get_rots().get_rot_mats().shape						)
   __lowerCamelCase    		=					1
   __lowerCamelCase    		=					alpha[..., 1]
   __lowerCamelCase    		=					-alpha[..., 0]
   __lowerCamelCase    		=					alpha

   __lowerCamelCase    		=					default_r.compose(Rigid(Rotation(rot_mats=lowercase_						)      , lowercase_						)						)

   __lowerCamelCase    		=					all_frames[..., 5]
   __lowerCamelCase    		=					all_frames[..., 6]
   __lowerCamelCase    		=					all_frames[..., 7]

   __lowerCamelCase    		=					all_frames[..., 4]
   __lowerCamelCase    		=					chia_frame_to_bb.compose(lowercase_						)
   __lowerCamelCase    		=					chia_frame_to_bb.compose(lowercase_						)
   __lowerCamelCase    		=					chia_frame_to_bb.compose(lowercase_						)

   __lowerCamelCase    		=					Rigid.cat(
       [
           all_frames[..., :5],
           chia_frame_to_bb.unsqueeze(-1						),
           chia_frame_to_bb.unsqueeze(-1						),
           chia_frame_to_bb.unsqueeze(-1						),
       ]      , dim=-1      , )

   __lowerCamelCase    		=					r[..., None].compose(lowercase_						)

   return all_frames_to_global



def       A__    (	lowercase_     :	Rigid      , lowercase_     :	torch.Tensor      , lowercase_     :	torch.Tensor      , lowercase_     :	torch.Tensor      , lowercase_     :	torch.Tensor      , lowercase_     :	torch.Tensor      , )  ->							torch.Tensor:
   # [*, N, 14]
   __lowerCamelCase    		=					group_idx[aatype, ...]

   # [*, N, 14, 8]
   __lowerCamelCase    		=					nn.functional.one_hot(
       lowercase_      , num_classes=default_frames.shape[-3]      , )

   # [*, N, 14, 8]
   __lowerCamelCase    		=					r[..., None, :] * group_mask_one_hot

   # [*, N, 14]
   __lowerCamelCase    		=					t_atoms_to_global.map_tensor_fn(lambda lowercase_						: torch.sum(lowercase_      , dim=-1						)						)

   # [*, N, 14, 1]
   __lowerCamelCase    		=					atom_mask[aatype, ...].unsqueeze(-1						)

   # [*, N, 14, 3]
   __lowerCamelCase    		=					lit_positions[aatype, ...]
   __lowerCamelCase    		=					t_atoms_to_global.apply(lowercase_						)
   __lowerCamelCase    		=					pred_positions * atom_mask

   return pred_positions














'''simple docstring'''





def  lowerCamelCase_  (     lowercase__):
 return int(lowercase__) if x - int(lowercase__) <= 0 else int(lowercase__) + 1


if __name__ == "__main__":
 import doctest

 doctest.testmod()

