






"""simple docstring"""



from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_tf_available,
    is_torch_available,
    is_vision_available,
)


_UpperCamelCase						:    List[str]		=						{
    'configuration_sam': [
        'SAM_PRETRAINED_CONFIG_ARCHIVE_MAP',
        'SamConfig',
        'SamMaskDecoderConfig',
        'SamPromptEncoderConfig',
        'SamVisionConfig',
    ],
    'processing_sam': ['SamProcessor'],
}


try:
    if not is_torch_available():
        raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
    pass
else:
    _UpperCamelCase						:    Tuple		=						[
        'SAM_PRETRAINED_MODEL_ARCHIVE_LIST',
        'SamModel',
        'SamPreTrainedModel',
    ]
try:
    if not is_tf_available():
        raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
    pass
else:
    _UpperCamelCase						:    str		=						[
        'TF_SAM_PRETRAINED_MODEL_ARCHIVE_LIST',
        'TFSamModel',
        'TFSamPreTrainedModel',
    ]
try:
    if not is_vision_available():
        raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
    pass
else:
    _UpperCamelCase						:    int		=						['SamImageProcessor']


if TYPE_CHECKING:
    from .configuration_sam import (
        SAM_PRETRAINED_CONFIG_ARCHIVE_MAP,
        SamConfig,
        SamMaskDecoderConfig,
        SamPromptEncoderConfig,
        SamVisionConfig,
    )
    from .processing_sam import SamProcessor

    try:
        if not is_torch_available():
            raise OptionalDependencyNotAvailable()
    except OptionalDependencyNotAvailable:
        pass
    else:
        from .modeling_sam import SAM_PRETRAINED_MODEL_ARCHIVE_LIST, SamModel, SamPreTrainedModel

    try:
        if not is_tf_available():
            raise OptionalDependencyNotAvailable()
    except OptionalDependencyNotAvailable:
        pass
    else:
        from .modeling_tf_sam import TF_SAM_PRETRAINED_MODEL_ARCHIVE_LIST, TFSamModel, TFSamPreTrainedModel

    try:
        if not is_vision_available():
            raise OptionalDependencyNotAvailable()
    except OptionalDependencyNotAvailable:
        pass
    else:
        from .image_processing_sam import SamImageProcessor

else:
    import sys

    _UpperCamelCase						:    Optional[Any]		=						_LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)









"""simple docstring"""






from __future__ import annotations

def    __lowerCamelCase     (							SCREAMING_SNAKE_CASE,SCREAMING_SNAKE_CASE				)		->							list:






       """simple docstring"""




       _UpperCAmelCase			     =  [None] * (len(SCREAMING_SNAKE_CASE				) + len(SCREAMING_SNAKE_CASE				))

       _UpperCAmelCase			     =  0  # pointer to current index for left Half
       _UpperCAmelCase			     =  0  # pointer to current index for the right Half
       _UpperCAmelCase			     =  0  # pointer to current index for the sorted array Half

       while pointera < len(SCREAMING_SNAKE_CASE				) and pointera < len(SCREAMING_SNAKE_CASE				):
              if left_half[pointera] < right_half[pointera]:
                     _UpperCAmelCase			     =  left_half[pointera]
                     pointera += 1
                     index += 1
              else:
                     _UpperCAmelCase			     =  right_half[pointera]
                     pointera += 1
                     index += 1
       while pointera < len(SCREAMING_SNAKE_CASE				):
              _UpperCAmelCase			     =  left_half[pointera]
              pointera += 1
              index += 1

       while pointera < len(SCREAMING_SNAKE_CASE				):
              _UpperCAmelCase			     =  right_half[pointera]
              pointera += 1
              index += 1

       return sorted_array

def    __lowerCamelCase     (							SCREAMING_SNAKE_CASE				)		->							list:






       """simple docstring"""




       if len(SCREAMING_SNAKE_CASE				) <= 1:
              return array
       # the actual formula to calculate the middle element = left + (right - left) // 2
       # this avoids integer overflow in case of large N
       _UpperCAmelCase			     =  0 + (len(SCREAMING_SNAKE_CASE				) - 0) // 2

       # Split the array into halves till the array length becomes equal to One
       # merge the arrays of single length returned by mergeSort function and
       # pass them into the merge arrays function which merges the array
       _UpperCAmelCase			     =  array[:middle]
       _UpperCAmelCase			     =  array[middle:]

       return merge(merge_sort(SCREAMING_SNAKE_CASE				),merge_sort(SCREAMING_SNAKE_CASE				)				)


if __name__ == "__main__":
    import doctest

    doctest.testmod()






