





'''simple docstring'''


import hashlib
import unittest
from typing import Dict

import numpy as np

from transformers import (
    MODEL_FOR_MASK_GENERATION_MAPPING,
    TF_MODEL_FOR_MASK_GENERATION_MAPPING,
    is_vision_available,
    pipeline,
)
from transformers.pipelines import MaskGenerationPipeline
from transformers.testing_utils import (
    is_pipeline_test,
    nested_simplify,
    require_tf,
    require_torch,
    require_vision,
    slow,
)


if is_vision_available():
    from PIL import Image
else:






    class     lowerCAmelCase__ :

           '''simple docstring'''

           @staticmethod
           def 			__snake_case      ( *a__					:				List[Any]       ,     **a__					:				Optional[int]						):
                  pass
def       __snake_case		( SCREAMING_SNAKE_CASE_ :			Image )							->     str:

       """simple docstring"""


       UpperCAmelCase  =						hashlib.mda(image.tobytes() )
       return m.hexdigest()[:10]
def       __snake_case		( SCREAMING_SNAKE_CASE_ :			Image )							->     Dict:

       """simple docstring"""


       UpperCAmelCase  =						np.array(SCREAMING_SNAKE_CASE_ )
       UpperCAmelCase  =						npimg.shape
       return {"hash": hashimage(SCREAMING_SNAKE_CASE_ ), "shape": shape}






@is_pipeline_test
@require_vision
@require_torch
class     lowerCAmelCase__ (				unittest.TestCase    ):

       '''simple docstring'''
       _lowerCamelCase								=dict(
           (list(MODEL_FOR_MASK_GENERATION_MAPPING.items()    ) if MODEL_FOR_MASK_GENERATION_MAPPING else [])    )
       _lowerCamelCase								=dict(
           (list(TF_MODEL_FOR_MASK_GENERATION_MAPPING.items()    ) if TF_MODEL_FOR_MASK_GENERATION_MAPPING else [])    )

       def 			__snake_case      ( self					:				Union[str, Any]       ,     a__					:				Optional[int]       ,     a__					:				Dict       ,     a__					:				int						):
              UpperCAmelCase  =						MaskGenerationPipeline(model=a__       ,     image_processor=a__						)
              return image_segmenter, [
                  "./tests/fixtures/tests_samples/COCO/000000039769.png",
                  "./tests/fixtures/tests_samples/COCO/000000039769.png",
              ]

       def 			__snake_case      ( self					:				int       ,     a__					:				Dict       ,     a__					:				Tuple						):
              pass

       @require_tf
       @unittest.skip('''Image segmentation not implemented in TF'''						)
       def 			__snake_case      ( self					:				str						):
              pass

       @slow
       @require_torch
       def 			__snake_case      ( self					:				Optional[Any]						):
              UpperCAmelCase  =						pipeline('''mask-generation'''       ,     model='''facebook/sam-vit-huge'''						)

              UpperCAmelCase  =						image_segmenter('''http://images.cocodataset.org/val2017/000000039769.jpg'''       ,     points_per_batch=256						)

              # Shortening by hashing
              UpperCAmelCase  =						[]
              for i, o in enumerate(outputs['''masks''']						):
                     new_outupt += [{"mask": mask_to_test_readable(a__						), "scores": outputs["scores"][i]}]

              # fmt: off
              self.assertEqual(
                  nested_simplify(a__       ,     decimals=4						)       ,     [
                      {'''mask''': {'''hash''': '''115ad19f5f''', '''shape''': (480, 640)}, '''scores''': 1.0_444},
                      {'''mask''': {'''hash''': '''6affa964c6''', '''shape''': (480, 640)}, '''scores''': 1.021},
                      {'''mask''': {'''hash''': '''dfe28a0388''', '''shape''': (480, 640)}, '''scores''': 1.0_167},
                      {'''mask''': {'''hash''': '''c0a5f4a318''', '''shape''': (480, 640)}, '''scores''': 1.0_132},
                      {'''mask''': {'''hash''': '''fe8065c197''', '''shape''': (480, 640)}, '''scores''': 1.0_053},
                      {'''mask''': {'''hash''': '''e2d0b7a0b7''', '''shape''': (480, 640)}, '''scores''': 0.9_967},
                      {'''mask''': {'''hash''': '''453c7844bd''', '''shape''': (480, 640)}, '''scores''': 0.993},
                      {'''mask''': {'''hash''': '''3d44f2926d''', '''shape''': (480, 640)}, '''scores''': 0.9_909},
                      {'''mask''': {'''hash''': '''64033ddc3f''', '''shape''': (480, 640)}, '''scores''': 0.9_879},
                      {'''mask''': {'''hash''': '''801064ff79''', '''shape''': (480, 640)}, '''scores''': 0.9_834},
                      {'''mask''': {'''hash''': '''6172f276ef''', '''shape''': (480, 640)}, '''scores''': 0.9_716},
                      {'''mask''': {'''hash''': '''b49e60e084''', '''shape''': (480, 640)}, '''scores''': 0.9_612},
                      {'''mask''': {'''hash''': '''a811e775fd''', '''shape''': (480, 640)}, '''scores''': 0.9_599},
                      {'''mask''': {'''hash''': '''a6a8ebcf4b''', '''shape''': (480, 640)}, '''scores''': 0.9_552},
                      {'''mask''': {'''hash''': '''9d8257e080''', '''shape''': (480, 640)}, '''scores''': 0.9_532},
                      {'''mask''': {'''hash''': '''32de6454a8''', '''shape''': (480, 640)}, '''scores''': 0.9_516},
                      {'''mask''': {'''hash''': '''af3d4af2c8''', '''shape''': (480, 640)}, '''scores''': 0.9_499},
                      {'''mask''': {'''hash''': '''3c6db475fb''', '''shape''': (480, 640)}, '''scores''': 0.9_483},
                      {'''mask''': {'''hash''': '''c290813fb9''', '''shape''': (480, 640)}, '''scores''': 0.9_464},
                      {'''mask''': {'''hash''': '''b6f0b8f606''', '''shape''': (480, 640)}, '''scores''': 0.943},
                      {'''mask''': {'''hash''': '''92ce16bfdf''', '''shape''': (480, 640)}, '''scores''': 0.943},
                      {'''mask''': {'''hash''': '''c749b25868''', '''shape''': (480, 640)}, '''scores''': 0.9_408},
                      {'''mask''': {'''hash''': '''efb6cab859''', '''shape''': (480, 640)}, '''scores''': 0.9_335},
                      {'''mask''': {'''hash''': '''1ff2eafb30''', '''shape''': (480, 640)}, '''scores''': 0.9_326},
                      {'''mask''': {'''hash''': '''788b798e24''', '''shape''': (480, 640)}, '''scores''': 0.9_262},
                      {'''mask''': {'''hash''': '''abea804f0e''', '''shape''': (480, 640)}, '''scores''': 0.8_999},
                      {'''mask''': {'''hash''': '''7b9e8ddb73''', '''shape''': (480, 640)}, '''scores''': 0.8_986},
                      {'''mask''': {'''hash''': '''cd24047c8a''', '''shape''': (480, 640)}, '''scores''': 0.8_984},
                      {'''mask''': {'''hash''': '''6943e6bcbd''', '''shape''': (480, 640)}, '''scores''': 0.8_873},
                      {'''mask''': {'''hash''': '''b5f47c9191''', '''shape''': (480, 640)}, '''scores''': 0.8_871}
                  ]       ,     )
              # fmt: on



       @require_torch
       @slow
       def 			__snake_case      ( self					:				Dict						):
              UpperCAmelCase  =						'''facebook/sam-vit-huge'''
              UpperCAmelCase  =						pipeline('''mask-generation'''       ,     model=a__						)

              UpperCAmelCase  =						image_segmenter(
                  '''http://images.cocodataset.org/val2017/000000039769.jpg'''       ,     pred_iou_thresh=1       ,     points_per_batch=256						)

              # Shortening by hashing
              UpperCAmelCase  =						[]
              for i, o in enumerate(outputs['''masks''']						):
                     new_outupt += [{"mask": mask_to_test_readable(a__						), "scores": outputs["scores"][i]}]

              self.assertEqual(
                  nested_simplify(a__       ,     decimals=4						)       ,     [
                      {'''mask''': {'''hash''': '''115ad19f5f''', '''shape''': (480, 640)}, '''scores''': 1.0_444},
                      {'''mask''': {'''hash''': '''6affa964c6''', '''shape''': (480, 640)}, '''scores''': 1.0_210},
                      {'''mask''': {'''hash''': '''dfe28a0388''', '''shape''': (480, 640)}, '''scores''': 1.0_167},
                      {'''mask''': {'''hash''': '''c0a5f4a318''', '''shape''': (480, 640)}, '''scores''': 1.0_132},
                      {'''mask''': {'''hash''': '''fe8065c197''', '''shape''': (480, 640)}, '''scores''': 1.0_053},
                  ]       ,     )






def       _lowerCAmelCase    (				lowerCAmelCase_				:List[str]		,    lowerCAmelCase_				:int				)->Optional[int]:
   '''simple docstring'''






   snake_case_            =       0
   while b > 0:
      if b & 1:
         res += a

      a += a
      b >>= 1

   return res



def       _lowerCAmelCase    (				lowerCAmelCase_				:int		,    lowerCAmelCase_				:List[str]		,    lowerCAmelCase_				:Dict				)->Dict:
   '''simple docstring'''






   snake_case_            =       0
   while b > 0:
      if b & 1:
         snake_case_            =       ((res % c) + (a % c)) % c

      a += a
      b >>= 1

   return res




