




from typing import Dict, Optional, Tuple

import torch
def 		a_       (   __lowerCAmelCase							):

  '''simple docstring'''





  lowerCAmelCase__								=			boundaries[1] - boundaries[0]
  lowerCAmelCase__								=			boundaries + step / 2
  lowerCAmelCase__								=			torch.cat([bin_centers, (bin_centers[-1] + step).unsqueeze(-1							)]      ,   dim=0							)
  return bin_centers
def 		a_       (   __lowerCAmelCase      ,   __lowerCAmelCase      ,   ):

  '''simple docstring'''





  lowerCAmelCase__								=			_calculate_bin_centers(__lowerCAmelCase							)
  return (
      torch.sum(aligned_distance_error_probs * bin_centers      ,   dim=-1							),
      bin_centers[-1],
  )
def 		a_       (   __lowerCAmelCase      ,   __lowerCAmelCase = 31      ,   __lowerCAmelCase = 64      ,   **__lowerCAmelCase      ,   ):

  '''simple docstring'''





  lowerCAmelCase__								=			torch.linspace(0      ,   __lowerCAmelCase      ,   steps=(no_bins - 1)      ,   device=logits.device							)

  lowerCAmelCase__								=			torch.nn.functional.softmax(__lowerCAmelCase      ,   dim=-1							)
  lowerCAmelCase__							,			lowerCAmelCase__								=			_calculate_expected_aligned_error(
      alignment_confidence_breaks=__lowerCAmelCase      ,   aligned_distance_error_probs=__lowerCAmelCase      ,   )

  return {
      "aligned_confidence_probs": aligned_confidence_probs,
      "predicted_aligned_error": predicted_aligned_error,
      "max_predicted_aligned_error": max_predicted_aligned_error,
  }




def 		a_       (   __lowerCAmelCase      ,   __lowerCAmelCase = None      ,   __lowerCAmelCase = 31      ,   __lowerCAmelCase = 64      ,   __lowerCAmelCase = 1E-8      ,   **__lowerCAmelCase      ,   ):

  '''simple docstring'''





  if residue_weights is None:
    lowerCAmelCase__								=			logits.new_ones(logits.shape[-2]							)

  lowerCAmelCase__								=			torch.linspace(0      ,   __lowerCAmelCase      ,   steps=(no_bins - 1)      ,   device=logits.device							)

  lowerCAmelCase__								=			_calculate_bin_centers(__lowerCAmelCase							)
  torch.sum(__lowerCAmelCase							)
  lowerCAmelCase__								=			logits.shape[-2]
  lowerCAmelCase__								=			max(__lowerCAmelCase      ,   19							)

  lowerCAmelCase__								=			1.24 * (clipped_n - 15) ** (1.0 / 3) - 1.8

  lowerCAmelCase__								=			torch.nn.functional.softmax(__lowerCAmelCase      ,   dim=-1							)

  lowerCAmelCase__								=			1.0 / (1 + (bin_centers**2) / (da**2))
  lowerCAmelCase__								=			torch.sum(probs * tm_per_bin      ,   dim=-1							)

  lowerCAmelCase__								=			residue_weights / (eps + residue_weights.sum())
  lowerCAmelCase__								=			torch.sum(predicted_tm_term * normed_residue_mask      ,   dim=-1							)

  lowerCAmelCase__								=			per_alignment * residue_weights

  lowerCAmelCase__								=			(weighted == torch.max(__lowerCAmelCase							)).nonzero()[0]
  return per_alignment[tuple(__lowerCAmelCase							)]







def 		a_       (   __lowerCAmelCase      ,   __lowerCAmelCase							):
  assert isinstance(__lowerCAmelCase      ,   __lowerCAmelCase							), F"""The input value of [set_a={set_a}] is not a set"""
  assert isinstance(__lowerCAmelCase      ,   __lowerCAmelCase							), F"""The input value of [set_b={set_b}] is not a set"""

  return {a + b for a in set_a for b in set_b}


if __name__ == "__main__":
      from doctest import testmod

      testmod()

