





from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_sentencepiece_available,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


__UpperCAmelCase			:  Union[str, Any]										=				{
    "configuration_big_bird": ["BIG_BIRD_PRETRAINED_CONFIG_ARCHIVE_MAP", "BigBirdConfig", "BigBirdOnnxConfig"],
}

try:
      if not is_sentencepiece_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      __UpperCAmelCase			:  Tuple										=				["BigBirdTokenizer"]

try:
      if not is_tokenizers_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      __UpperCAmelCase			:  Tuple										=				["BigBirdTokenizerFast"]

try:
      if not is_torch_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      __UpperCAmelCase			:  str										=				[
          "BIG_BIRD_PRETRAINED_MODEL_ARCHIVE_LIST",
          "BigBirdForCausalLM",
          "BigBirdForMaskedLM",
          "BigBirdForMultipleChoice",
          "BigBirdForPreTraining",
          "BigBirdForQuestionAnswering",
          "BigBirdForSequenceClassification",
          "BigBirdForTokenClassification",
          "BigBirdLayer",
          "BigBirdModel",
          "BigBirdPreTrainedModel",
          "load_tf_weights_in_big_bird",
      ]

try:
      if not is_flax_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      __UpperCAmelCase			:  Any										=				[
          "FlaxBigBirdForCausalLM",
          "FlaxBigBirdForMaskedLM",
          "FlaxBigBirdForMultipleChoice",
          "FlaxBigBirdForPreTraining",
          "FlaxBigBirdForQuestionAnswering",
          "FlaxBigBirdForSequenceClassification",
          "FlaxBigBirdForTokenClassification",
          "FlaxBigBirdModel",
          "FlaxBigBirdPreTrainedModel",
      ]

if TYPE_CHECKING:
      from .configuration_big_bird import BIG_BIRD_PRETRAINED_CONFIG_ARCHIVE_MAP, BigBirdConfig, BigBirdOnnxConfig

      try:
            if not is_sentencepiece_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .tokenization_big_bird import BigBirdTokenizer

      try:
            if not is_tokenizers_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .tokenization_big_bird_fast import BigBirdTokenizerFast

      try:
            if not is_torch_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_big_bird import (
                BIG_BIRD_PRETRAINED_MODEL_ARCHIVE_LIST,
                BigBirdForCausalLM,
                BigBirdForMaskedLM,
                BigBirdForMultipleChoice,
                BigBirdForPreTraining,
                BigBirdForQuestionAnswering,
                BigBirdForSequenceClassification,
                BigBirdForTokenClassification,
                BigBirdLayer,
                BigBirdModel,
                BigBirdPreTrainedModel,
                load_tf_weights_in_big_bird,
            )

      try:
            if not is_flax_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_flax_big_bird import (
                FlaxBigBirdForCausalLM,
                FlaxBigBirdForMaskedLM,
                FlaxBigBirdForMultipleChoice,
                FlaxBigBirdForPreTraining,
                FlaxBigBirdForQuestionAnswering,
                FlaxBigBirdForSequenceClassification,
                FlaxBigBirdForTokenClassification,
                FlaxBigBirdModel,
                FlaxBigBirdPreTrainedModel,
            )

else:
      import sys

      __UpperCAmelCase			:  Union[str, Any]										=				_LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)













from __future__ import annotations

from collections import deque
from enum import Enum
from math import atana, degrees
from sys import maxsize







class        __snake_case			(				__lowerCamelCase     ):





       '''simple docstring'''







       lowerCAmelCase__ 						=	1
       lowerCAmelCase__ 						=	2
       lowerCAmelCase__ 						=	3




       def __repr__(    self					:       Optional[int]						):
         return f'''{self.__class__.__name__}.{self.name}'''







def      A__				(       SCREAMING_SNAKE_CASE__   ,   SCREAMING_SNAKE_CASE__   ,   SCREAMING_SNAKE_CASE__)  ->       float:
  __snake_case    ,  __snake_case:		Union[str, Any]					    =		point
  return degrees(atana(y - miny   ,   x - minx))







def      A__				(       SCREAMING_SNAKE_CASE__   ,   SCREAMING_SNAKE_CASE__   ,   SCREAMING_SNAKE_CASE__)  ->       Direction:
  __snake_case    ,  __snake_case:		Dict					    =		starting
  __snake_case    ,  __snake_case:		List[str]					    =		via
  __snake_case    ,  __snake_case:		Optional[int]					    =		target
  __snake_case:		int					    =		degrees(atana(ya - ya   ,   xa - xa))
  via_angle %= 360
  __snake_case:		List[Any]					    =		degrees(atana(ya - ya   ,   xa - xa))
  target_angle %= 360
  # t-
  #  \ \
  #   \ v
  #    \|
  #     s
  # via_angle is always lower than target_angle, if direction is left.
  # If they are same, it means they are on a same line of convex hull.
  if target_angle > via_angle:
    return Direction.left
  elif target_angle == via_angle:
    return Direction.straight
  else:
    return Direction.right







def      A__				(       SCREAMING_SNAKE_CASE__)  ->       list[tuple[int, int]]:

  if len(SCREAMING_SNAKE_CASE__) <= 2:
    # There is no convex hull
    raise ValueError("""graham_scan: argument must contain more than 3 points.""")
  if len(SCREAMING_SNAKE_CASE__) == 3:
    return points
  # find the lowest and the most left point
  __snake_case:		Optional[int]					    =		0
  __snake_case    ,  __snake_case:		Optional[int]					    =		maxsize, maxsize
  for i, point in enumerate(SCREAMING_SNAKE_CASE__):
    __snake_case:		Tuple					    =		point[0]
    __snake_case:		Optional[Any]					    =		point[1]
    if y < miny:
      __snake_case:		Optional[Any]					    =		y
      __snake_case:		Union[str, Any]					    =		x
      __snake_case:		Any					    =		i
    if y == miny and x < minx:
      __snake_case:		Optional[Any]					    =		x
      __snake_case:		str					    =		i

    # remove the lowest and the most left point from points for preparing for sort
  points.pop(SCREAMING_SNAKE_CASE__)

  __snake_case:		Optional[int]					    =		sorted(SCREAMING_SNAKE_CASE__   ,   key=lambda SCREAMING_SNAKE_CASE__: angle_comparer(SCREAMING_SNAKE_CASE__   ,   SCREAMING_SNAKE_CASE__   ,   SCREAMING_SNAKE_CASE__))
  # This insert actually costs complexity,
  # and you should instead add (minx, miny) into stack later.
  # I'm using insert just for easy understanding.
  sorted_points.insert(0   ,   (minx, miny))

  __snake_case:		deque[tuple[int, int]]					    =		deque()
  stack.append(sorted_points[0])
  stack.append(sorted_points[1])
  stack.append(sorted_points[2])
  # In any ways, the first 3 points line are towards left.
  # Because we sort them the angle from minx, miny.
  __snake_case:		Optional[Any]					    =		Direction.left

  for i in range(3   ,   len(SCREAMING_SNAKE_CASE__)):
    while True:
      __snake_case:		Optional[Any]					    =		stack[-2]
      __snake_case:		List[Any]					    =		stack[-1]
      __snake_case:		int					    =		sorted_points[i]
      __snake_case:		Union[str, Any]					    =		check_direction(SCREAMING_SNAKE_CASE__   ,   SCREAMING_SNAKE_CASE__   ,   SCREAMING_SNAKE_CASE__)

      if next_direction == Direction.left:
        __snake_case:		Dict					    =		Direction.left
        break
      if next_direction == Direction.straight:
        if current_direction == Direction.left:
          # We keep current_direction as left.
          # Because if the straight line keeps as straight,
          # we want to know if this straight line is towards left.
          break
        elif current_direction == Direction.right:
          # If the straight line is towards right,
          # every previous points on those straigh line is not convex hull.
          stack.pop()
      if next_direction == Direction.right:
        stack.pop()
    stack.append(sorted_points[i])
  return list(SCREAMING_SNAKE_CASE__)






