


import enum
import inspect
import warnings
from functools import wraps
from typing import Callable, Optional

from .logging import get_logger


snake_case__									= set()
snake_case__									= get_logger(__name__)
def  __SCREAMING_SNAKE_CASE       (				lowercase__  :Optional[str] = None				)       ->  Union[str, Any]:

						def decorator(lowercase__  :Callable				):
												global _emitted_deprecation_warnings

												if inspect.isclass(lowercase__				):
																		__magic_name__				:							List[Any]				=      deprecated_class_or_function.__init__
																		__magic_name__				:							Optional[int]				=      deprecated_class_or_function.__name__
												else:
																		__magic_name__				:							List[str]				=      deprecated_class_or_function
																		__magic_name__				:							Optional[Any]				=      deprecated_function.__name__
																		# Support deprecating __init__ class method: class name instead
																		__magic_name__				:							Dict				=      name if name != '__init__' else deprecated_function.__qualname__.split('.'				)[-2]

												__magic_name__				:							Optional[int]				=      (
												    f"{name} is deprecated and will be removed in the next major version of datasets." + f" {help_message}"
												    if help_message
												    else ''
												)

												@wraps(lowercase__				)
												def wrapper(*lowercase__  :str      ,						**lowercase__  :Tuple				):
																		__magic_name__				:							int				=      hash(lowercase__				)
																		if func_hash not in _emitted_deprecation_warnings:
																								warnings.warn(lowercase__      ,						category=lowercase__      ,						stacklevel=2				)
																								_emitted_deprecation_warnings.add(lowercase__				)
																		return deprecated_function(*lowercase__      ,						**lowercase__				)

												__magic_name__				:							Tuple				=      'deprecated'

												if inspect.isclass(lowercase__				):
																		__magic_name__				:							Optional[int]				=      wrapper
																		return deprecated_class_or_function
												else:
																		return wrapper

						return decorator



class     snake_case__  (      enum.EnumMeta  ):
				def __getattribute__(  cls     ,      _UpperCAmelCase      ):




										"""simple docstring"""




										__magic_name__				:							Optional[int]				=      super().__getattribute__(_UpperCAmelCase      )
										if isinstance(_UpperCAmelCase     ,      enum.Enum      ) and obj._on_access:
																obj._on_access()
										return obj
				def __getitem__(  cls     ,      _UpperCAmelCase      ):




										"""simple docstring"""




										__magic_name__				:							Optional[int]				=      super().__getitem__(_UpperCAmelCase      )
										if member._on_access:
																member._on_access()
										return member





				def __call__(  cls     ,      _UpperCAmelCase     ,      _UpperCAmelCase=None     ,      *, _UpperCAmelCase=None     ,      _UpperCAmelCase=None     ,      _UpperCAmelCase=None     ,      _UpperCAmelCase=1      ):




										"""simple docstring"""




										__magic_name__				:							Union[str, Any]				=      super().__call__(_UpperCAmelCase     ,      _UpperCAmelCase     ,      module=_UpperCAmelCase     ,      qualname=_UpperCAmelCase     ,      type=_UpperCAmelCase     ,      start=_UpperCAmelCase      )
										if isinstance(_UpperCAmelCase     ,      enum.Enum      ) and obj._on_access:
																obj._on_access()
										return obj






class     snake_case__  (      enum.Enum						,       metaclass=_A  ):
				def __new__(  cls     ,      _UpperCAmelCase      ):




										"""simple docstring"""




										__magic_name__				:							List[Any]				=      object.__new__(cls      )
										__magic_name__				:							List[Any]				=      value
										__magic_name__				:							Tuple				=      member.deprecate
										return member
				@property
				def  UpperCamelCase_						(  self      ):




										"""simple docstring"""




										return ""





				def  UpperCamelCase_						(  self      ):




										"""simple docstring"""




										__magic_name__				:							List[Any]				=      F" {self.help_message}" if self.help_message else ''
										warnings.warn(
										    F"'{self.__objclass__.__name__}' is deprecated and will be removed in the next major version of datasets."
										    + help_message     ,      _UpperCAmelCase     ,      stacklevel=3     ,      )






import numpy as np
import torch
import torch.nn as nn
from transformers import CLIPConfig, CLIPVisionModel, PreTrainedModel

from ...utils import logging


snake_case__     							= logging.get_logger(__name__)
def  __SCREAMING_SNAKE_CASE       (				lowercase__  :Optional[Any]      ,						lowercase__  :List[str]				)       ->  Tuple:
						__magic_name__				:							List[str]				=      nn.functional.normalize(lowercase__				)
						__magic_name__				:							Union[str, Any]				=      nn.functional.normalize(lowercase__				)
						return torch.mm(lowercase__      ,						normalized_text_embeds.t()				)



class     snake_case__  (      _A  ):
				__lowerCAmelCase		=      CLIPConfig

				__lowerCAmelCase		=      ['''CLIPEncoderLayer''']
				def __init__(  self     ,      _UpperCAmelCase      ):




										"""simple docstring"""




										super().__init__(_UpperCAmelCase      )

										__magic_name__				:							List[Any]				=      CLIPVisionModel(config.vision_config      )
										__magic_name__				:							Tuple				=      nn.Linear(config.vision_config.hidden_size     ,      config.projection_dim     ,      bias=_UpperCAmelCase      )

										__magic_name__				:							str				=      nn.Parameter(torch.ones(17     ,      config.projection_dim      )     ,      requires_grad=_UpperCAmelCase      )
										__magic_name__				:							Optional[Any]				=      nn.Parameter(torch.ones(3     ,      config.projection_dim      )     ,      requires_grad=_UpperCAmelCase      )

										__magic_name__				:							Optional[Any]				=      nn.Parameter(torch.ones(17      )     ,      requires_grad=_UpperCAmelCase      )
										__magic_name__				:							str				=      nn.Parameter(torch.ones(3      )     ,      requires_grad=_UpperCAmelCase      )
				@torch.no_grad()
				def  UpperCamelCase_						(  self     ,      _UpperCAmelCase     ,      _UpperCAmelCase      ):




										"""simple docstring"""




										__magic_name__				:							Union[str, Any]				=      self.vision_model(_UpperCAmelCase      )[1]  # pooled_output
										__magic_name__				:							Any				=      self.visual_projection(_UpperCAmelCase      )

										# we always cast to float32 as this does not cause significant overhead and is compatible with bfloat16
										__magic_name__				:							Union[str, Any]				=      cosine_distance(_UpperCAmelCase     ,      self.special_care_embeds      ).cpu().float().numpy()
										__magic_name__				:							int				=      cosine_distance(_UpperCAmelCase     ,      self.concept_embeds      ).cpu().float().numpy()

										__magic_name__				:							str				=      []
										__magic_name__				:							List[Any]				=      image_embeds.shape[0]
										for i in range(_UpperCAmelCase      ):
																__magic_name__				:							Optional[Any]				=      {'special_scores': {}, 'special_care': [], 'concept_scores': {}, 'bad_concepts': []}

																# increase this value to create a stronger `nfsw` filter
																# at the cost of increasing the possibility of filtering benign images
																__magic_name__				:							Optional[int]				=      0.0

																for concept_idx in range(len(special_cos_dist[0]      )      ):
																						__magic_name__				:							Any				=      special_cos_dist[i][concept_idx]
																						__magic_name__				:							Tuple				=      self.special_care_embeds_weights[concept_idx].item()
																						__magic_name__				:							Dict				=      round(concept_cos - concept_threshold + adjustment     ,      3      )
																						if result_img["special_scores"][concept_idx] > 0:
																												result_img["special_care"].append({concept_idx, result_img['special_scores'][concept_idx]}      )
																												__magic_name__				:							str				=      0.01

																for concept_idx in range(len(cos_dist[0]      )      ):
																						__magic_name__				:							Optional[Any]				=      cos_dist[i][concept_idx]
																						__magic_name__				:							Tuple				=      self.concept_embeds_weights[concept_idx].item()
																						__magic_name__				:							Optional[int]				=      round(concept_cos - concept_threshold + adjustment     ,      3      )
																						if result_img["concept_scores"][concept_idx] > 0:
																												result_img["bad_concepts"].append(_UpperCAmelCase      )

																result.append(_UpperCAmelCase      )

										__magic_name__				:							Union[str, Any]				=      [len(res['bad_concepts']      ) > 0 for res in result]

										for idx, has_nsfw_concept in enumerate(_UpperCAmelCase      ):
																if has_nsfw_concept:
																						if torch.is_tensor(_UpperCAmelCase      ) or torch.is_tensor(images[0]      ):
																												__magic_name__				:							Union[str, Any]				=      torch.zeros_like(images[idx]      )  # black image
																						else:
																												__magic_name__				:							Optional[int]				=      np.zeros(images[idx].shape      )  # black image

										if any(_UpperCAmelCase      ):
																logger.warning(
																    'Potential NSFW content was detected in one or more images. A black image will be returned instead.'
																    ' Try again with a different prompt and/or seed.'      )

										return images, has_nsfw_concepts





				@torch.no_grad()
				def  UpperCamelCase_						(  self     ,      _UpperCAmelCase     ,      _UpperCAmelCase      ):




										"""simple docstring"""




										__magic_name__				:							List[str]				=      self.vision_model(_UpperCAmelCase      )[1]  # pooled_output
										__magic_name__				:							List[str]				=      self.visual_projection(_UpperCAmelCase      )

										__magic_name__				:							Union[str, Any]				=      cosine_distance(_UpperCAmelCase     ,      self.special_care_embeds      )
										__magic_name__				:							Optional[int]				=      cosine_distance(_UpperCAmelCase     ,      self.concept_embeds      )

										# increase this value to create a stronger `nsfw` filter
										# at the cost of increasing the possibility of filtering benign images
										__magic_name__				:							int				=      0.0

										__magic_name__				:							Optional[int]				=      special_cos_dist - self.special_care_embeds_weights + adjustment
										# special_scores = special_scores.round(decimals=3)
										__magic_name__				:							int				=      torch.any(special_scores > 0     ,      dim=1      )
										__magic_name__				:							Optional[Any]				=      special_care * 0.01
										__magic_name__				:							Any				=      special_adjustment.unsqueeze(1      ).expand(-1     ,      cos_dist.shape[1]      )

										__magic_name__				:							Optional[int]				=      (cos_dist - self.concept_embeds_weights) + special_adjustment
										# concept_scores = concept_scores.round(decimals=3)
										__magic_name__				:							Union[str, Any]				=      torch.any(concept_scores > 0     ,      dim=1      )

										__magic_name__				:							Dict				=      0.0  # black image

										return images, has_nsfw_concepts


