
from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_tf_available, is_torch_available


__lowerCAmelCase   :     Tuple      =						{
    "configuration_esm": ["ESM_PRETRAINED_CONFIG_ARCHIVE_MAP", "EsmConfig"],
    "tokenization_esm": ["EsmTokenizer"],
}

try:
 if not is_torch_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 __lowerCAmelCase   :     List[Any]      =						[
     "ESM_PRETRAINED_MODEL_ARCHIVE_LIST",
     "EsmForMaskedLM",
     "EsmForSequenceClassification",
     "EsmForTokenClassification",
     "EsmModel",
     "EsmPreTrainedModel",
 ]
 __lowerCAmelCase   :     List[Any]      =						["EsmForProteinFolding", "EsmFoldPreTrainedModel"]

try:
 if not is_tf_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 __lowerCAmelCase   :     str      =						[
     "TF_ESM_PRETRAINED_MODEL_ARCHIVE_LIST",
     "TFEsmForMaskedLM",
     "TFEsmForSequenceClassification",
     "TFEsmForTokenClassification",
     "TFEsmModel",
     "TFEsmPreTrainedModel",
 ]

if TYPE_CHECKING:
 from .configuration_esm import ESM_PRETRAINED_CONFIG_ARCHIVE_MAP, EsmConfig
 from .tokenization_esm import EsmTokenizer

 try:
  if not is_torch_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .modeling_esm import (
      ESM_PRETRAINED_MODEL_ARCHIVE_LIST,
      EsmForMaskedLM,
      EsmForSequenceClassification,
      EsmForTokenClassification,
      EsmModel,
      EsmPreTrainedModel,
  )
  from .modeling_esmfold import EsmFoldPreTrainedModel, EsmForProteinFolding

 try:
  if not is_tf_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .modeling_tf_esm import (
      TF_ESM_PRETRAINED_MODEL_ARCHIVE_LIST,
      TFEsmForMaskedLM,
      TFEsmForSequenceClassification,
      TFEsmForTokenClassification,
      TFEsmModel,
      TFEsmPreTrainedModel,
  )


else:
 import sys

 __lowerCAmelCase   :     Optional[int]      =						_LazyModule(__name__, globals()["__file__"], _import_structure)




from __future__ import annotations

from math import pi, pow


def       UpperCAmelCase_					(  __lowerCAmelCase		)	->  float:
    if side_length < 0:
        raise ValueError('''vol_cube() only accepts non-negative values'''		)
    return pow(__lowerCAmelCase		,   3		)


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    if height < 0 or radius < 0:
        raise ValueError('''vol_spherical_cap() only accepts non-negative values'''		)
    # Volume is 1/3 pi * height squared * (3 * radius - height)
    return 1 / 3 * pi * pow(__lowerCAmelCase		,   2		) * (3 * radius - height)


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    if radius_a < 0 or radius_a < 0 or centers_distance < 0:
        raise ValueError('''vol_spheres_intersect() only accepts non-negative values'''		)
    if centers_distance == 0:
        return vol_sphere(min(__lowerCAmelCase		,   __lowerCAmelCase		)		)

    __lowercase						:     Dict		      =    (
        (radius_a - radius_a + centers_distance)
        * (radius_a + radius_a - centers_distance)
        / (2 * centers_distance)
    )
    __lowercase						:     Optional[int]		      =    (
        (radius_a - radius_a + centers_distance)
        * (radius_a + radius_a - centers_distance)
        / (2 * centers_distance)
    )

    return vol_spherical_cap(__lowerCAmelCase		,   __lowerCAmelCase		) + vol_spherical_cap(__lowerCAmelCase		,   __lowerCAmelCase		)


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:

    if radius_a <= 0 or radius_a <= 0 or centers_distance < 0:
        raise ValueError(
            '''vol_spheres_union() only accepts non-negative values, non-zero radius'''		)

    if centers_distance == 0:
        return vol_sphere(max(__lowerCAmelCase		,   __lowerCAmelCase		)		)

    return (
        vol_sphere(__lowerCAmelCase		)
        + vol_sphere(__lowerCAmelCase		)
        - vol_spheres_intersect(__lowerCAmelCase		,   __lowerCAmelCase		,   __lowerCAmelCase		)
    )


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    if width < 0 or height < 0 or length < 0:
        raise ValueError('''vol_cuboid() only accepts non-negative values'''		)
    return float(width * height * length		)


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    if height < 0 or area_of_base < 0:
        raise ValueError('''vol_cone() only accepts non-negative values'''		)
    return area_of_base * height / 3.0


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    if height < 0 or radius < 0:
        raise ValueError('''vol_right_circ_cone() only accepts non-negative values'''		)
    return pi * pow(__lowerCAmelCase		,   2		) * height / 3.0


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    if height < 0 or area_of_base < 0:
        raise ValueError('''vol_prism() only accepts non-negative values'''		)
    return float(area_of_base * height		)


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    if height < 0 or area_of_base < 0:
        raise ValueError('''vol_pyramid() only accepts non-negative values'''		)
    return area_of_base * height / 3.0


def       UpperCAmelCase_					(  __lowerCAmelCase		)	->  float:
    if radius < 0:
        raise ValueError('''vol_sphere() only accepts non-negative values'''		)
    # Volume is 4/3 * pi * radius cubed
    return 4 / 3 * pi * pow(__lowerCAmelCase		,   3		)


def       UpperCAmelCase_					(  __lowerCAmelCase		)	->  float:
    if radius < 0:
        raise ValueError('''vol_hemisphere() only accepts non-negative values'''		)
    # Volume is radius cubed * pi * 2/3
    return pow(__lowerCAmelCase		,   3		) * pi * 2 / 3


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    if height < 0 or radius < 0:
        raise ValueError('''vol_circular_cylinder() only accepts non-negative values'''		)
    # Volume is radius squared * height * pi
    return pow(__lowerCAmelCase		,   2		) * height * pi


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    # Volume - (outer_radius squared - inner_radius squared) * pi * height
    if inner_radius < 0 or outer_radius < 0 or height < 0:
        raise ValueError(
            '''vol_hollow_circular_cylinder() only accepts non-negative values'''		)
    if outer_radius <= inner_radius:
        raise ValueError('''outer_radius must be greater than inner_radius'''		)
    return pi * (pow(__lowerCAmelCase		,   2		) - pow(__lowerCAmelCase		,   2		)) * height


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    # Volume is 1/3 * pi * height *
    #           (radius_1 squared + radius_2 squared + radius_1 * radius_2)
    if radius_a < 0 or radius_a < 0 or height < 0:
        raise ValueError('''vol_conical_frustum() only accepts non-negative values'''		)
    return (
        1
        / 3
        * pi
        * height
        * (pow(__lowerCAmelCase		,   2		) + pow(__lowerCAmelCase		,   2		) + radius_a * radius_a)
    )


def       UpperCAmelCase_					(  __lowerCAmelCase		,   __lowerCAmelCase		)	->  float:
    if torus_radius < 0 or tube_radius < 0:
        raise ValueError('''vol_torus() only accepts non-negative values'''		)
    return 2 * pow(__lowerCAmelCase		,   2		) * torus_radius * pow(__lowerCAmelCase		,   2		)


def       UpperCAmelCase_					(  )	->  Optional[Any]:
    print('''Volumes:'''		)
    print(F'Cube: {vol_cube(2		) = }'		)  # = 8
    print(F'Cuboid: {vol_cuboid(2		,   2		,   2		) = }'		)  # = 8
    print(F'Cone: {vol_cone(2		,   2		) = }'		)  # ~= 1.33
    print(F'Right Circular Cone: {vol_right_circ_cone(2		,   2		) = }'		)  # ~= 8.38
    print(F'Prism: {vol_prism(2		,   2		) = }'		)  # = 4
    print(F'Pyramid: {vol_pyramid(2		,   2		) = }'		)  # ~= 1.33
    print(F'Sphere: {vol_sphere(2		) = }'		)  # ~= 33.5
    print(F'Hemisphere: {vol_hemisphere(2		) = }'		)  # ~= 16.75
    print(F'Circular Cylinder: {vol_circular_cylinder(2		,   2		) = }'		)  # ~= 25.1
    print(F'Torus: {vol_torus(2		,   2		) = }'		)  # ~= 157.9
    print(F'Conical Frustum: {vol_conical_frustum(2		,   2		,   4		) = }'		)  # ~= 58.6
    print(F'Spherical cap: {vol_spherical_cap(1		,   2		) = }'		)  # ~= 5.24
    print(F'Spheres intersetion: {vol_spheres_intersect(2		,   2		,   1		) = }'		)  # ~= 21.21
    print(F'Spheres union: {vol_spheres_union(2		,   2		,   1		) = }'		)  # ~= 45.81
    print(
        F'Hollow Circular Cylinder: {vol_hollow_circular_cylinder(1		,   2		,   3		) = }'		)  # ~= 28.3


if __name__ == "__main__":
 main()


