

'''simple docstring'''



import unittest

from transformers import MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING, AutoTokenizer, is_vision_available
from transformers.pipelines import pipeline
from transformers.pipelines.document_question_answering import apply_tesseract
from transformers.testing_utils import (
    is_pipeline_test,
    nested_simplify,
    require_detectrona,
    require_pytesseract,
    require_tf,
    require_torch,
    require_vision,
    slow,
)

from .test_pipelines_common import ANY


if is_vision_available():
     from PIL import Image

     from transformers.image_utils import load_image
else:



     class 				_snake_case					:

       @staticmethod
       def   _SCREAMING_SNAKE_CASE				(				*_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





           '''simple docstring'''

           pass



     def       snake_case   (	snake_case      : Tuple			) ->  Dict:


         """simple docstring"""


         return None


# This is a pinned image from a specific revision of a document question answering space, hosted by HuggingFace,
# so we can expect it to be available.
_UpperCamelCase						:  Optional[int]							       =				(
    "https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png"
)



@is_pipeline_test
@require_torch
@require_vision
class 				_snake_case					(   unittest.TestCase			):
  SCREAMING_SNAKE_CASE			:       Optional[int]				=     MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING

  @require_pytesseract
  @require_vision
  def   _SCREAMING_SNAKE_CASE				(				self      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      lowerCAmelCase 						=							pipeline(
          'document-question-answering'      , model=_SCREAMING_SNAKE_CASE      , tokenizer=_SCREAMING_SNAKE_CASE      , image_processor=_SCREAMING_SNAKE_CASE	)

      lowerCAmelCase 						=							INVOICE_URL
      lowerCAmelCase 						=							list(zip(*apply_tesseract(load_image(_SCREAMING_SNAKE_CASE	)      , _SCREAMING_SNAKE_CASE      , ''	)	)	)
      lowerCAmelCase 						=							'What is the placebo?'
      lowerCAmelCase 						=							[
          {
              'image': load_image(_SCREAMING_SNAKE_CASE	),
              'question': question,
          },
          {
              'image': image,
              'question': question,
          },
          {
              'image': image,
              'question': question,
              'word_boxes': word_boxes,
          },
      ]
      return dqa_pipeline, examples

  def   _SCREAMING_SNAKE_CASE				(				self      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      lowerCAmelCase 						=							dqa_pipeline(_SCREAMING_SNAKE_CASE      , top_k=2	)
      self.assertEqual(
          _SCREAMING_SNAKE_CASE      , [
              [
                  {'score': ANY(_SCREAMING_SNAKE_CASE	), 'answer': ANY(_SCREAMING_SNAKE_CASE	), 'start': ANY(_SCREAMING_SNAKE_CASE	), 'end': ANY(_SCREAMING_SNAKE_CASE	)},
                  {'score': ANY(_SCREAMING_SNAKE_CASE	), 'answer': ANY(_SCREAMING_SNAKE_CASE	), 'start': ANY(_SCREAMING_SNAKE_CASE	), 'end': ANY(_SCREAMING_SNAKE_CASE	)},
              ]
          ]
          * 3      , )

  @require_torch
  @require_detectrona
  @require_pytesseract
  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      lowerCAmelCase 						=							pipeline('document-question-answering'      , model='hf-internal-testing/tiny-random-layoutlmv2'	)
      lowerCAmelCase 						=							INVOICE_URL
      lowerCAmelCase 						=							'How many cats are there?'

      lowerCAmelCase 						=							[
          {'score': 0.0_001, 'answer': 'oy 2312/2019', 'start': 38, 'end': 39},
          {'score': 0.0_001, 'answer': 'oy 2312/2019 DUE', 'start': 38, 'end': 40},
      ]
      lowerCAmelCase 						=							dqa_pipeline(image=_SCREAMING_SNAKE_CASE      , question=_SCREAMING_SNAKE_CASE      , top_k=2	)
      self.assertEqual(nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , _SCREAMING_SNAKE_CASE	)

      lowerCAmelCase 						=							dqa_pipeline({'image': image, 'question': question}      , top_k=2	)
      self.assertEqual(nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , _SCREAMING_SNAKE_CASE	)

      # This image does not detect ANY text in it, meaning layoutlmv2 should fail.
      # Empty answer probably
      lowerCAmelCase 						=							'./tests/fixtures/tests_samples/COCO/000000039769.png'
      lowerCAmelCase 						=							dqa_pipeline(image=_SCREAMING_SNAKE_CASE      , question=_SCREAMING_SNAKE_CASE      , top_k=2	)
      self.assertEqual(_SCREAMING_SNAKE_CASE      , []	)

      # We can optionnally pass directly the words and bounding boxes
      lowerCAmelCase 						=							'./tests/fixtures/tests_samples/COCO/000000039769.png'
      lowerCAmelCase 						=							[]
      lowerCAmelCase 						=							[]
      lowerCAmelCase 						=							dqa_pipeline(image=_SCREAMING_SNAKE_CASE      , question=_SCREAMING_SNAKE_CASE      , words=_SCREAMING_SNAKE_CASE      , boxes=_SCREAMING_SNAKE_CASE      , top_k=2	)
      self.assertEqual(_SCREAMING_SNAKE_CASE      , []	)

  @slow
  @require_torch
  @require_detectrona
  @require_pytesseract
  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      lowerCAmelCase 						=							pipeline(
          'document-question-answering'      , model='tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'      , revision='9977165'      , )
      lowerCAmelCase 						=							INVOICE_URL
      lowerCAmelCase 						=							'What is the invoice number?'

      lowerCAmelCase 						=							dqa_pipeline(image=_SCREAMING_SNAKE_CASE      , question=_SCREAMING_SNAKE_CASE      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              {'score': 0.9_944, 'answer': 'us-001', 'start': 16, 'end': 16},
              {'score': 0.0_009, 'answer': 'us-001', 'start': 16, 'end': 16},
          ]      , )

      lowerCAmelCase 						=							dqa_pipeline({'image': image, 'question': question}      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              {'score': 0.9_944, 'answer': 'us-001', 'start': 16, 'end': 16},
              {'score': 0.0_009, 'answer': 'us-001', 'start': 16, 'end': 16},
          ]      , )

      lowerCAmelCase 						=							dqa_pipeline(
          [{'image': image, 'question': question}, {'image': image, 'question': question}]      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              [
                  {'score': 0.9_944, 'answer': 'us-001', 'start': 16, 'end': 16},
                  {'score': 0.0_009, 'answer': 'us-001', 'start': 16, 'end': 16},
              ],
          ]
          * 2      , )

  @slow
  @require_torch
  @require_detectrona
  @require_pytesseract
  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      lowerCAmelCase 						=							pipeline(
          'document-question-answering'      , model='tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'      , revision='9977165'      , max_seq_len=50      , )
      lowerCAmelCase 						=							INVOICE_URL
      lowerCAmelCase 						=							'What is the invoice number?'

      lowerCAmelCase 						=							dqa_pipeline(image=_SCREAMING_SNAKE_CASE      , question=_SCREAMING_SNAKE_CASE      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              {'score': 0.9_974, 'answer': '1110212019', 'start': 23, 'end': 23},
              {'score': 0.9_948, 'answer': 'us-001', 'start': 16, 'end': 16},
          ]      , )

      lowerCAmelCase 						=							dqa_pipeline({'image': image, 'question': question}      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              {'score': 0.9_974, 'answer': '1110212019', 'start': 23, 'end': 23},
              {'score': 0.9_948, 'answer': 'us-001', 'start': 16, 'end': 16},
          ]      , )

      lowerCAmelCase 						=							dqa_pipeline(
          [{'image': image, 'question': question}, {'image': image, 'question': question}]      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              [
                  {'score': 0.9_974, 'answer': '1110212019', 'start': 23, 'end': 23},
                  {'score': 0.9_948, 'answer': 'us-001', 'start': 16, 'end': 16},
              ]
          ]
          * 2      , )

  @slow
  @require_torch
  @require_pytesseract
  @require_vision
  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      lowerCAmelCase 						=							AutoTokenizer.from_pretrained(
          'impira/layoutlm-document-qa'      , revision='3dc6de3'      , add_prefix_space=_SCREAMING_SNAKE_CASE	)
      lowerCAmelCase 						=							pipeline(
          'document-question-answering'      , model='impira/layoutlm-document-qa'      , tokenizer=_SCREAMING_SNAKE_CASE      , revision='3dc6de3'      , )
      lowerCAmelCase 						=							INVOICE_URL
      lowerCAmelCase 						=							'What is the invoice number?'

      lowerCAmelCase 						=							dqa_pipeline(image=_SCREAMING_SNAKE_CASE      , question=_SCREAMING_SNAKE_CASE      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              {'score': 0.4_251, 'answer': 'us-001', 'start': 16, 'end': 16},
              {'score': 0.0_819, 'answer': '1110212019', 'start': 23, 'end': 23},
          ]      , )

      lowerCAmelCase 						=							dqa_pipeline({'image': image, 'question': question}      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              {'score': 0.4_251, 'answer': 'us-001', 'start': 16, 'end': 16},
              {'score': 0.0_819, 'answer': '1110212019', 'start': 23, 'end': 23},
          ]      , )

      lowerCAmelCase 						=							dqa_pipeline(
          [{'image': image, 'question': question}, {'image': image, 'question': question}]      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              [
                  {'score': 0.4_251, 'answer': 'us-001', 'start': 16, 'end': 16},
                  {'score': 0.0_819, 'answer': '1110212019', 'start': 23, 'end': 23},
              ]
          ]
          * 2      , )

      lowerCAmelCase 						=							list(zip(*apply_tesseract(load_image(_SCREAMING_SNAKE_CASE	)      , _SCREAMING_SNAKE_CASE      , ''	)	)	)

      # This model should also work if `image` is set to None
      lowerCAmelCase 						=							dqa_pipeline({'image': None, 'word_boxes': word_boxes, 'question': question}      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              {'score': 0.4_251, 'answer': 'us-001', 'start': 16, 'end': 16},
              {'score': 0.0_819, 'answer': '1110212019', 'start': 23, 'end': 23},
          ]      , )

  @slow
  @require_torch
  @require_pytesseract
  @require_vision
  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      lowerCAmelCase 						=							AutoTokenizer.from_pretrained(
          'impira/layoutlm-document-qa'      , revision='3dc6de3'      , add_prefix_space=_SCREAMING_SNAKE_CASE	)
      lowerCAmelCase 						=							pipeline(
          'document-question-answering'      , model='impira/layoutlm-document-qa'      , tokenizer=_SCREAMING_SNAKE_CASE      , revision='3dc6de3'      , max_seq_len=50      , )
      lowerCAmelCase 						=							INVOICE_URL
      lowerCAmelCase 						=							'What is the invoice number?'

      lowerCAmelCase 						=							dqa_pipeline(image=_SCREAMING_SNAKE_CASE      , question=_SCREAMING_SNAKE_CASE      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              {'score': 0.9_999, 'answer': 'us-001', 'start': 16, 'end': 16},
              {'score': 0.9_998, 'answer': 'us-001', 'start': 16, 'end': 16},
          ]      , )

      lowerCAmelCase 						=							dqa_pipeline(
          [{'image': image, 'question': question}, {'image': image, 'question': question}]      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              [
                  {'score': 0.9_999, 'answer': 'us-001', 'start': 16, 'end': 16},
                  {'score': 0.9_998, 'answer': 'us-001', 'start': 16, 'end': 16},
              ]
          ]
          * 2      , )

      lowerCAmelCase 						=							list(zip(*apply_tesseract(load_image(_SCREAMING_SNAKE_CASE	)      , _SCREAMING_SNAKE_CASE      , ''	)	)	)

      # This model should also work if `image` is set to None
      lowerCAmelCase 						=							dqa_pipeline({'image': None, 'word_boxes': word_boxes, 'question': question}      , top_k=2	)
      self.assertEqual(
          nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [
              {'score': 0.9_999, 'answer': 'us-001', 'start': 16, 'end': 16},
              {'score': 0.9_998, 'answer': 'us-001', 'start': 16, 'end': 16},
          ]      , )

  @slow
  @require_torch
  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      lowerCAmelCase 						=							pipeline(
          'document-question-answering'      , model='naver-clova-ix/donut-base-finetuned-docvqa'      , tokenizer=AutoTokenizer.from_pretrained('naver-clova-ix/donut-base-finetuned-docvqa'	)      , feature_extractor='naver-clova-ix/donut-base-finetuned-docvqa'      , )

      lowerCAmelCase 						=							INVOICE_URL
      lowerCAmelCase 						=							'What is the invoice number?'
      lowerCAmelCase 						=							dqa_pipeline(image=_SCREAMING_SNAKE_CASE      , question=_SCREAMING_SNAKE_CASE      , top_k=2	)
      self.assertEqual(nested_simplify(_SCREAMING_SNAKE_CASE      , decimals=4	)      , [{'answer': 'us-001'}]	)


  @require_tf
  @unittest.skip('Document question answering not implemented in TF'	)
  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      pass








'''simple docstring'''



def       snake_case   (	snake_case      : dict			) ->  set:


    """simple docstring"""


    lowerCAmelCase 						=							set()
    # edges = list of graph's edges
    lowerCAmelCase 						=							get_edges(snake_case			)

    # While there are still elements in edges list, take an arbitrary edge
    # (from_node, to_node) and add his extremity to chosen_vertices and then
    # remove all arcs adjacent to the from_node and to_node
    while edges:
        lowerCAmelCase						,   lowerCAmelCase 						=							edges.pop()
        chosen_vertices.add(snake_case			)
        chosen_vertices.add(snake_case			)
        for edge in edges.copy():
            if from_node in edge or to_node in edge:
                edges.discard(snake_case			)
    return chosen_vertices


def       snake_case   (	snake_case      : dict			) ->  set:


    """simple docstring"""


    lowerCAmelCase 						=							set()
    for from_node, to_nodes in graph.items():
        for to_node in to_nodes:
            edges.add((from_node, to_node)			)
    return edges


if __name__ == "__main__":
     import doctest

     doctest.testmod()

     # graph = {0: [1, 3], 1: [0, 3], 2: [0, 3, 4], 3: [0, 1, 2], 4: [2, 3]}
     # print(f"Matching vertex cover:\n{matching_min_vertex_cover(graph)}")





