
"""simple docstring"""


from ..utils import DummyObject, requires_backends







class 	lowerCamelCase__      (      metaclass=__magic_name__       ):





			'''simple docstring'''
			lowerCamelCase						      =	['''tensorflow_text''']



			def __init__(							self  ,  *__UpperCAmelCase  ,  **__UpperCAmelCase						)				->  Any:
				requires_backends(self  ,  ["""tensorflow_text"""]						)





"""simple docstring"""


from typing import Dict, Optional, Tuple

import torch



def 					_lowerCamelCase(__UpperCamelCase )       ->				torch.Tensor:
	_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 					_lowerCamelCase(__UpperCamelCase					,				__UpperCamelCase					,				)       ->				Tuple[torch.Tensor, torch.Tensor]:
	_lowerCAmelCase			=_calculate_bin_centers(__UpperCamelCase )
	return (
	    torch.sum(aligned_distance_error_probs * bin_centers					,				dim=-1 ),
	    bin_centers[-1],
	)



def 					_lowerCamelCase(__UpperCamelCase					,				__UpperCamelCase = 31					,				__UpperCamelCase = 64					,				**__UpperCamelCase					,				)       ->				Dict[str, torch.Tensor]:
	_lowerCAmelCase			=torch.linspace(0					,				__UpperCamelCase					,				steps=(no_bins - 1)					,				device=logits.device )

	_lowerCAmelCase			=torch.nn.functional.softmax(__UpperCamelCase					,				dim=-1 )
	_lowerCAmelCase		,							_lowerCAmelCase			=_calculate_expected_aligned_error(
	    alignment_confidence_breaks=__UpperCamelCase					,				aligned_distance_error_probs=__UpperCamelCase					,				)

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



def 					_lowerCamelCase(__UpperCamelCase					,				__UpperCamelCase = None					,				__UpperCamelCase = 31					,				__UpperCamelCase = 64					,				__UpperCamelCase = 1E-8					,				**__UpperCamelCase					,				)       ->				torch.Tensor:
	if residue_weights is None:
		_lowerCAmelCase			=logits.new_ones(logits.shape[-2] )

	_lowerCAmelCase			=torch.linspace(0					,				__UpperCamelCase					,				steps=(no_bins - 1)					,				device=logits.device )

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

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

	_lowerCAmelCase			=torch.nn.functional.softmax(__UpperCamelCase					,				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(__UpperCamelCase )).nonzero()[0]
	return per_alignment[tuple(__UpperCamelCase )]



