# Copyright 2023 The HuggingFace Inc. team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import TYPE_CHECKING

import torch

from ..models.auto import AutoModelForVisualQuestionAnswering, AutoProcessor
from ..utils import requires_backends
from .base import PipelineTool


if TYPE_CHECKING:
      from PIL import Image





class      lowerCAmelCase						(					_a			):
     _SCREAMING_SNAKE_CASE     :     str		="""dandelin/vilt-b32-finetuned-vqa"""
     _SCREAMING_SNAKE_CASE     :     Any		=(
         """This is a tool that answers a question about an image. It takes an input named `image` which should be the """
         """image containing the information, as well as a `question` which should be the question in English. It """
         """returns a text that is the answer to the question."""
     )
     _SCREAMING_SNAKE_CASE     :     str		="""image_qa"""
     _SCREAMING_SNAKE_CASE     :     int		=AutoProcessor
     _SCREAMING_SNAKE_CASE     :     Union[str, Any]		=AutoModelForVisualQuestionAnswering

     _SCREAMING_SNAKE_CASE     :     Tuple		=["""image""", """text"""]
     _SCREAMING_SNAKE_CASE     :     Dict		=["""text"""]



     def __init__(					self				,      *lowerCAmelCase__				,      **lowerCAmelCase__       ):
            requires_backends(self				,      ['vision']       )
            super().__init__(*lowerCAmelCase__				,      **lowerCAmelCase__       )



     def 			a__  (					self				,      lowerCAmelCase__				,      lowerCAmelCase__       ):
            return self.pre_processor(lowerCAmelCase__				,      lowerCAmelCase__				,      return_tensors='pt'       )



     def 			a__  (					self				,      lowerCAmelCase__       ):
            with torch.no_grad():
                   return self.model(**lowerCAmelCase__       ).logits





     def 			a__  (					self				,      lowerCAmelCase__       ):
            _A=	outputs.argmax(-1       ).item()
            return self.model.config.idalabel[idx]
import pickle
import unittest

import torch

from accelerate import Accelerator
from accelerate.state import AcceleratorState
from accelerate.test_utils import require_cpu





@require_cpu
class      lowerCAmelCase						(					unittest.TestCase			):



     def 			a__  (					self       ):
            _A=	torch.nn.Linear(10				,      10       )
            _A=	torch.optim.SGD(model.parameters()				,      0.1       )
            _A=	Accelerator()
            _A=	accelerator.prepare(lowerCAmelCase__       )
            try:
                   pickle.loads(pickle.dumps(lowerCAmelCase__       )       )
            except Exception as e:
                   self.fail(f"Accelerated optimizer pickling failed with {e}"       )
            AcceleratorState._reset_state()