


'''simple docstring'''






# 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

from ..models.auto import AutoModelForVisionaSeq
from ..utils import requires_backends
from .base import PipelineTool


if TYPE_CHECKING:
  from PIL import Image






class        __snake_case	(       _SCREAMING_SNAKE_CASE):







    """simple docstring"""



    lowercase       			= 'Salesforce/blip-image-captioning-base'
    lowercase       			= (
        'This is a tool that generates a description of an image. It takes an input named `image` which should be the '
        'image to caption, and returns a text that contains the description in English.'
    )
    lowercase       			= 'image_captioner'
    lowercase       			= AutoModelForVisionaSeq

    lowercase       			= ['image']
    lowercase       			= ['text']

    def __init__(       self   :  List[Any]   ,						*lowerCamelCase   :  Optional[int]   ,						**lowerCamelCase   :  Optional[int]		)       ->  str:
      requires_backends(self   ,						["""vision"""]		)
      super().__init__(*lowerCamelCase   ,						**lowerCamelCase		)

    def __lowercase       (       self   :  str   ,						lowerCamelCase   :  "Image"		)       ->  Tuple:
      return self.pre_processor(images=lowerCamelCase   ,						return_tensors="""pt"""		)

    def __lowercase       (       self   :  Optional[Any]   ,						lowerCamelCase   :  Union[str, Any]		)       ->  str:
      return self.model.generate(**lowerCamelCase		)





    def __lowercase       (       self   :  List[str]   ,						lowerCamelCase   :  List[str]		)       ->  Union[str, Any]:
      return self.pre_processor.batch_decode(lowerCamelCase   ,						skip_special_tokens=lowerCamelCase		)[0].strip()







'''simple docstring'''






import unittest

import numpy as np
import torch

from diffusers import PNDMPipeline, PNDMScheduler, UNetaDModel
from diffusers.utils.testing_utils import enable_full_determinism, require_torch, slow, torch_device


enable_full_determinism()






class        __snake_case	(       unittest.TestCase):







    """simple docstring"""



    @property
    def __lowercase       (       self   :  str		)       ->  List[Any]:
      torch.manual_seed(0		)
      lowerCAmelCase_      :				Optional[Any]      =       UNetaDModel(
          block_out_channels=(32, 64)   ,						layers_per_block=2   ,						sample_size=32   ,						in_channels=3   ,						out_channels=3   ,						down_block_types=("""DownBlock2D""", """AttnDownBlock2D""")   ,						up_block_types=("""AttnUpBlock2D""", """UpBlock2D""")   ,						)
      return model





    def __lowercase       (       self   :  Tuple		)       ->  Optional[Any]:
      lowerCAmelCase_      :				Optional[int]      =       self.dummy_uncond_unet
      lowerCAmelCase_      :				Tuple      =       PNDMScheduler()

      lowerCAmelCase_      :				List[Any]      =       PNDMPipeline(unet=lowerCamelCase   ,						scheduler=lowerCamelCase		)
      pndm.to(lowerCamelCase		)
      pndm.set_progress_bar_config(disable=lowerCamelCase		)

      lowerCAmelCase_      :				Dict      =       torch.manual_seed(0		)
      lowerCAmelCase_      :				List[Any]      =       pndm(generator=lowerCamelCase   ,						num_inference_steps=20   ,						output_type="""numpy"""		).images

      lowerCAmelCase_      :				str      =       torch.manual_seed(0		)
      lowerCAmelCase_      :				int      =       pndm(generator=lowerCamelCase   ,						num_inference_steps=20   ,						output_type="""numpy"""   ,						return_dict=lowerCamelCase		)[0]

      lowerCAmelCase_      :				Optional[int]      =       image[0, -3:, -3:, -1]
      lowerCAmelCase_      :				Optional[Any]      =       image_from_tuple[0, -3:, -3:, -1]

      assert image.shape == (1, 32, 32, 3)
      lowerCAmelCase_      :				int      =       np.array([1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0]		)

      assert np.abs(image_slice.flatten() - expected_slice		).max() < 1E-2
      assert np.abs(image_from_tuple_slice.flatten() - expected_slice		).max() < 1E-2







@slow
@require_torch
class        __snake_case	(       unittest.TestCase):







    """simple docstring"""



    def __lowercase       (       self   :  str		)       ->  Tuple:
      lowerCAmelCase_      :				str      =       """google/ddpm-cifar10-32"""

      lowerCAmelCase_      :				Dict      =       UNetaDModel.from_pretrained(lowerCamelCase		)
      lowerCAmelCase_      :				Dict      =       PNDMScheduler()

      lowerCAmelCase_      :				Union[str, Any]      =       PNDMPipeline(unet=lowerCamelCase   ,						scheduler=lowerCamelCase		)
      pndm.to(lowerCamelCase		)
      pndm.set_progress_bar_config(disable=lowerCamelCase		)
      lowerCAmelCase_      :				Any      =       torch.manual_seed(0		)
      lowerCAmelCase_      :				Union[str, Any]      =       pndm(generator=lowerCamelCase   ,						output_type="""numpy"""		).images

      lowerCAmelCase_      :				Optional[int]      =       image[0, -3:, -3:, -1]

      assert image.shape == (1, 32, 32, 3)
      lowerCAmelCase_      :				List[Any]      =       np.array([0.1_564, 0.14_645, 0.1_406, 0.14_715, 0.12_425, 0.14_045, 0.13_115, 0.12_175, 0.125]		)

      assert np.abs(image_slice.flatten() - expected_slice		).max() < 1E-2



