
"""simple docstring"""
from typing import Optional, Tuple

import flax.linen as nn
import jax
import jax.numpy as jnp
from configuration_hybrid_clip import HybridCLIPConfig
from flax.core.frozen_dict import FrozenDict

from transformers import FLAX_MODEL_MAPPING, FlaxCLIPVisionModel
from transformers.modeling_flax_utils import FlaxPreTrainedModel
from transformers.models.clip.modeling_flax_clip import FlaxCLIPOutput
from transformers.utils import logging


lowercase		:    Union[str, Any]			=       logging.get_logger(__name__)




class  _snake_case	(    nn.Module							):
							SCREAMING_SNAKE_CASE		  =    42
							SCREAMING_SNAKE_CASE		  =    jnp.floataa






							def 				__lowercase	(       self    :      Optional[Any]     ):






												"""simple docstring"""



												__a:    str		     =       self.config.text_config
												__a:    Union[str, Any]		     =       self.config.vision_config

												__a:    str		     =       self.config.projection_dim
												__a:    Optional[Any]		     =       text_config.hidden_size
												__a:    List[str]		     =       vision_config.hidden_size

												__a:    Optional[int]		     =       FLAX_MODEL_MAPPING[self.config.text_config.__class__].module_class
												__a:    Union[str, Any]		     =       FLAX_MODEL_MAPPING.get(self.config.vision_config.__class__    ,			lowercase_     ).module_class

												__a:    Dict		     =       text_module(lowercase_    ,			dtype=self.dtype     )
												__a:    Optional[int]		     =       vision_module(lowercase_    ,			dtype=self.dtype     )

												__a:    Optional[int]		     =       nn.Dense(
												    self.projection_dim    ,			dtype=self.dtype    ,			kernel_init=jax.nn.initializers.normal(0.02     )    ,			use_bias=lowercase_    ,			)
												__a:    Optional[Any]		     =       nn.Dense(
												    self.projection_dim    ,			dtype=self.dtype    ,			kernel_init=jax.nn.initializers.normal(0.02     )    ,			use_bias=lowercase_    ,			)
												__a:    Dict		     =       self.param("""logit_scale"""    ,			jax.nn.initializers.ones    ,			[]     )






							def __call__(       self    :      Dict    ,			snake_case__    :      int=None    ,			snake_case__    :      Dict=None    ,			snake_case__    :      Dict=None    ,			snake_case__    :      Optional[Any]=None    ,			snake_case__    :      List[Any]=None    ,			snake_case__    :      bool = True    ,			snake_case__    :      List[Any]=None    ,			snake_case__    :      str=None    ,			snake_case__    :      Tuple=None    ,			):






												"""simple docstring"""



												__a:    Union[str, Any]		     =       return_dict if return_dict is not None else self.config.return_dict

												__a:    Tuple		     =       self.vision_model(
												    pixel_values=lowercase_    ,			deterministic=lowercase_    ,			output_attentions=lowercase_    ,			output_hidden_states=lowercase_    ,			return_dict=lowercase_    ,			)

												__a:    Optional[Any]		     =       self.text_model(
												    input_ids=lowercase_    ,			attention_mask=lowercase_    ,			token_type_ids=lowercase_    ,			position_ids=lowercase_    ,			deterministic=lowercase_    ,			output_attentions=lowercase_    ,			output_hidden_states=lowercase_    ,			return_dict=lowercase_    ,			)

												__a:    List[Any]		     =       vision_outputs[1]
												__a:    Any		     =       self.visual_projection(lowercase_     )

												__a:    Optional[int]		     =       text_outputs[1]
												__a:    int		     =       self.text_projection(lowercase_     )

												# normalized features
												__a:    Optional[int]		     =       image_embeds / jnp.linalg.norm(lowercase_    ,			axis=-1    ,			keepdims=lowercase_     )
												__a:    Union[str, Any]		     =       text_embeds / jnp.linalg.norm(lowercase_    ,			axis=-1    ,			keepdims=lowercase_     )

												# cosine similarity as logits
												__a:    List[str]		     =       jnp.exp(self.logit_scale     )
												__a:    Any		     =       jnp.matmul(lowercase_    ,			image_embeds.T     ) * logit_scale
												__a:    Optional[int]		     =       logits_per_text.T

												if not return_dict:
																	return (logits_per_image, logits_per_text, text_embeds, image_embeds, text_outputs, vision_outputs)

												return FlaxCLIPOutput(
												    logits_per_image=lowercase_    ,			logits_per_text=lowercase_    ,			text_embeds=lowercase_    ,			image_embeds=lowercase_    ,			text_model_output=lowercase_    ,			vision_model_output=lowercase_    ,			)






class  _snake_case	(    SCREAMING_SNAKE_CASE_							):
							SCREAMING_SNAKE_CASE		  =    HybridCLIPConfig
							SCREAMING_SNAKE_CASE		  =    FlaxHybridCLIPModule






							def __init__(       self    :      Optional[int]    ,			snake_case__    :      HybridCLIPConfig    ,			snake_case__    :      Optional[Tuple] = None    ,			snake_case__    :      int = 0    ,			snake_case__    :      jnp.dtype = jnp.floataa    ,			**snake_case__    :      List[str]    ,			):






												"""simple docstring"""



												if input_shape is None:
																	__a:    Dict		     =       ((1, 1), (1, config.vision_config.image_size, config.vision_config.image_size, 3))

												__a:    Union[str, Any]		     =       self.module_class(config=lowercase_    ,			dtype=lowercase_    ,			**lowercase_     )
												super().__init__(lowercase_    ,			lowercase_    ,			input_shape=lowercase_    ,			seed=lowercase_    ,			dtype=lowercase_     )






							def 				__lowercase	(       self    :      Tuple    ,			snake_case__    :      jax.random.PRNGKey    ,			snake_case__    :      Tuple    ,			snake_case__    :      FrozenDict = None     ):






												"""simple docstring"""



												__a:    str		     =       jnp.zeros(input_shape[0]    ,			dtype="""i4"""     )
												__a:    Union[str, Any]		     =       jnp.broadcast_to(jnp.arange(jnp.atleast_ad(lowercase_     ).shape[-1]     )    ,			input_shape[0]     )
												__a:    Optional[int]		     =       jnp.ones_like(lowercase_     )
												__a:    Optional[int]		     =       jnp.ones_like(lowercase_     )

												__a:    List[Any]		     =       jax.random.normal(lowercase_    ,			input_shape[1]     )

												__a     ,					__a:    str		     =       jax.random.split(lowercase_     )
												__a:    Optional[int]		     =       {"""params""": params_rng, """dropout""": dropout_rng}

												return self.module.init(lowercase_    ,			lowercase_    ,			lowercase_    ,			lowercase_    ,			lowercase_    ,			lowercase_     )["params"]






							def __call__(       self    :      str    ,			snake_case__    :      Dict    ,			snake_case__    :      Optional[int]    ,			snake_case__    :      List[Any]=None    ,			snake_case__    :      Dict=None    ,			snake_case__    :      Tuple=None    ,			snake_case__    :      dict = None    ,			snake_case__    :      jax.random.PRNGKey = None    ,			snake_case__    :      bool = False    ,			snake_case__    :      Optional[bool] = None    ,			snake_case__    :      Optional[bool] = None    ,			snake_case__    :      Optional[bool] = None    ,			):






												"""simple docstring"""



												__a:    Optional[int]		     =       output_attentions if output_attentions is not None else self.config.output_attentions
												__a:    int		     =       (
												    output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
												)
												__a:    Optional[Any]		     =       return_dict if return_dict is not None else self.config.return_dict

												if position_ids is None:
																	__a:    Dict		     =       jnp.broadcast_to(jnp.arange(jnp.atleast_ad(lowercase_     ).shape[-1]     )    ,			input_ids.shape     )

												if token_type_ids is None:
																	__a:    Tuple		     =       jnp.zeros_like(lowercase_     )

												if attention_mask is None:
																	__a:    Tuple		     =       jnp.ones_like(lowercase_     )

												# Handle any PRNG if needed
												__a:    Union[str, Any]		     =       {}
												if dropout_rng is not None:
																	__a:    Optional[Any]		     =       dropout_rng

												return self.module.apply(
												    {"""params""": params or self.params}    ,			jnp.array(lowercase_    ,			dtype="""i4"""     )    ,			jnp.array(lowercase_    ,			dtype=jnp.floataa     )    ,			jnp.array(lowercase_    ,			dtype="""i4"""     )    ,			jnp.array(lowercase_    ,			dtype="""i4"""     )    ,			jnp.array(lowercase_    ,			dtype="""i4"""     )    ,			not train    ,			lowercase_    ,			lowercase_    ,			lowercase_    ,			rngs=lowercase_    ,			)






							def 				__lowercase	(       self    :      Tuple    ,			snake_case__    :      Tuple    ,			snake_case__    :      Optional[int]=None    ,			snake_case__    :      Union[str, Any]=None    ,			snake_case__    :      Tuple=None    ,			snake_case__    :      dict = None    ,			snake_case__    :      jax.random.PRNGKey = None    ,			snake_case__    :      Optional[Any]=False    ,			):






												"""simple docstring"""



												if position_ids is None:
																	__a:    Dict		     =       jnp.broadcast_to(jnp.arange(jnp.atleast_ad(lowercase_     ).shape[-1]     )    ,			input_ids.shape     )

												if token_type_ids is None:
																	__a:    Optional[int]		     =       jnp.zeros_like(lowercase_     )

												if attention_mask is None:
																	__a:    List[Any]		     =       jnp.ones_like(lowercase_     )

												# Handle any PRNG if needed
												__a:    Union[str, Any]		     =       {}
												if dropout_rng is not None:
																	__a:    List[Any]		     =       dropout_rng

												def _get_features(snake_case__    :      Dict    ,			snake_case__    :      List[Any]    ,			snake_case__    :      Union[str, Any]    ,			snake_case__    :      Union[str, Any]    ,			snake_case__    :      Any    ,			snake_case__    :      List[Any]     ):
																	__a:    Optional[Any]		     =       module.text_model(
																	    input_ids=lowercase_    ,			attention_mask=lowercase_    ,			position_ids=lowercase_    ,			token_type_ids=lowercase_    ,			deterministic=lowercase_    ,			)
																	__a:    Optional[Any]		     =       text_outputs[1]
																	__a:    int		     =       module.text_projection(lowercase_     )
																	return text_features

												return self.module.apply(
												    {"""params""": params or self.params}    ,			jnp.array(lowercase_    ,			dtype="""i4"""     )    ,			jnp.array(lowercase_    ,			dtype="""i4"""     )    ,			jnp.array(lowercase_    ,			dtype="""i4"""     )    ,			jnp.array(lowercase_    ,			dtype="""i4"""     )    ,			not train    ,			method=_get_features    ,			rngs=lowercase_    ,			)






							def 				__lowercase	(       self    :      Optional[Any]    ,			snake_case__    :      Optional[int]    ,			snake_case__    :      dict = None    ,			snake_case__    :      jax.random.PRNGKey = None    ,			snake_case__    :      int=False     ):






												"""simple docstring"""



												__a:    Optional[Any]		     =       {}
												if dropout_rng is not None:
																	__a:    int		     =       dropout_rng

												def _get_features(snake_case__    :      Any    ,			snake_case__    :      Union[str, Any]    ,			snake_case__    :      int     ):
																	__a:    List[str]		     =       module.vision_model(pixel_values=lowercase_    ,			deterministic=lowercase_     )
																	__a:    Dict		     =       vision_outputs[1]  # pooled_output
																	__a:    Dict		     =       module.visual_projection(lowercase_     )
																	return image_features

												return self.module.apply(
												    {"""params""": params or self.params}    ,			jnp.array(lowercase_    ,			dtype=jnp.floataa     )    ,			not train    ,			method=_get_features    ,			rngs=lowercase_    ,			)






							@classmethod
							def 				__lowercase	(       cls    :      str    ,			snake_case__    :      str = None    ,			snake_case__    :      str = None    ,			*snake_case__    :      Tuple    ,			**snake_case__    :      str    ,			):






												"""simple docstring"""



												__a:    Dict		     =       {
												    argument[len("""text_"""     ) :]: value for argument, value in kwargs.items() if argument.startswith("""text_"""     )
												}

												__a:    Any		     =       {
												    argument[len("""vision_"""     ) :]: value for argument, value in kwargs.items() if argument.startswith("""vision_"""     )
												}

												# remove text, vision kwargs from kwargs
												for key in kwargs_text.keys():
																	del kwargs["text_" + key]
												for key in kwargs_vision.keys():
																	del kwargs["vision_" + key]

												# Load and initialize the text and vision model
												__a:    Optional[Any]		     =       kwargs_text.pop("""model"""    ,			lowercase_     )
												if text_model is None:
																	assert (
																	    text_model_name_or_path is not None
																	), "If `model` is not defined as an argument, a `text_model_name_or_path` has to be defined"
																	from transformers import FlaxAutoModel

																	if "config" not in kwargs_text:
																						from transformers import AutoConfig

																						__a:    int		     =       AutoConfig.from_pretrained(lowercase_     )
																						__a:    Optional[Any]		     =       text_config

																	__a:    Any		     =       FlaxAutoModel.from_pretrained(lowercase_    ,			*lowercase_    ,			**lowercase_     )

												__a:    Union[str, Any]		     =       kwargs_vision.pop("""model"""    ,			lowercase_     )
												if vision_model is None:
																	assert (
																	    vision_model_name_or_path is not None
																	), "If `model` is not defined as an argument, a `vision_model_name_or_path` has to be defined"
																	from transformers import FlaxAutoModel

																	if "config" not in kwargs_vision:
																						from transformers import AutoConfig

																						__a:    List[str]		     =       AutoConfig.from_pretrained(lowercase_     )
																						__a:    Dict		     =       vision_config

																	__a:    str		     =       FlaxAutoModel.from_pretrained(lowercase_    ,			*lowercase_    ,			**lowercase_     )

												# instantiate config with corresponding kwargs
												__a:    str		     =       kwargs.pop("""dtype"""    ,			jnp.floataa     )
												__a:    Union[str, Any]		     =       HybridCLIPConfig.from_text_vision_configs(text_model.config    ,			vision_model.config    ,			**lowercase_     )

												# init model
												__a:    Tuple		     =       cls(lowercase_    ,			*lowercase_    ,			dtype=lowercase_    ,			**lowercase_     )

												if vision_config.model_type == "clip":
																	__a:    Any		     =       vision_model.params["""vision_model"""]
																	__a:    Dict		     =       vision_model.params["""visual_projection"""]["""kernel"""]
												else:
																	__a:    List[Any]		     =       vision_model.params

												__a:    Tuple		     =       text_model.params

												return model





"""simple docstring"""


import warnings
from typing import List, Optional, Union

import numpy as np
import PIL
import torch
from PIL import Image

from .configuration_utils import ConfigMixin, register_to_config
from .utils import CONFIG_NAME, PIL_INTERPOLATION, deprecate







class  A_     (	SCREAMING_SNAKE_CASE_							):



						"""simple docstring"""
						__UpperCamelCase													=				CONFIG_NAME






						@register_to_config
						def __init__(   self					:Tuple  ,    lowercase_					:bool = True  ,    lowercase_					:int = 8  ,    lowercase_					:str = "lanczos"  ,    lowercase_					:bool = True  ,    lowercase_					:bool = False  ,    )							->     Union[str, Any]:
												super().__init__()






						@staticmethod
						def       UpperCAmelCase__	(   lowercase_					:np.ndarray   )							->     PIL.Image.Image:
												if images.ndim == 3:
																		UpperCAmelCase			 =					images[None, ...]
												UpperCAmelCase			 =					(images * 2_55).round().astype('uint8'   )
												if images.shape[-1] == 1:
																		# special case for grayscale (single channel) images
																		UpperCAmelCase			 =					[Image.fromarray(image.squeeze()  ,    mode='L'   ) for image in images]
												else:
																		UpperCAmelCase			 =					[Image.fromarray(lowercase_   ) for image in images]

												return pil_images






						@staticmethod
						def       UpperCAmelCase__	(   lowercase_					:Union[List[PIL.Image.Image], PIL.Image.Image]   )							->     np.ndarray:
												if not isinstance(lowercase_  ,    lowercase_   ):
																		UpperCAmelCase			 =					[images]
												UpperCAmelCase			 =					[np.array(lowercase_   ).astype(np.floataa   ) / 255.0 for image in images]
												UpperCAmelCase			 =					np.stack(lowercase_  ,    axis=0   )

												return images






						@staticmethod
						def       UpperCAmelCase__	(   lowercase_					:np.ndarray   )							->     torch.FloatTensor:
												if images.ndim == 3:
																		UpperCAmelCase			 =					images[..., None]

												UpperCAmelCase			 =					torch.from_numpy(images.transpose(0  ,    3  ,    1  ,    2   )   )
												return images






						@staticmethod
						def       UpperCAmelCase__	(   lowercase_					:torch.FloatTensor   )							->     np.ndarray:
												UpperCAmelCase			 =					images.cpu().permute(0  ,    2  ,    3  ,    1   ).float().numpy()
												return images






						@staticmethod
						def       UpperCAmelCase__	(   lowercase_					:List[Any]   )							->     Optional[int]:
												return 2.0 * images - 1.0






						@staticmethod
						def       UpperCAmelCase__	(   lowercase_					:str   )							->     str:
												return (images / 2 + 0.5).clamp(0  ,    1   )






						@staticmethod
						def       UpperCAmelCase__	(   lowercase_					:PIL.Image.Image   )							->     PIL.Image.Image:
												UpperCAmelCase			 =					image.convert('RGB'   )
												return image






						def       UpperCAmelCase__	(   self					:Dict  ,    lowercase_					:PIL.Image.Image  ,    lowercase_					:Optional[int] = None  ,    lowercase_					:Optional[int] = None  ,    )							->     PIL.Image.Image:
												if height is None:
																		UpperCAmelCase			 =					image.height
												if width is None:
																		UpperCAmelCase			 =					image.width

												UpperCAmelCase ,       UpperCAmelCase			 =					(
												    x - x % self.config.vae_scale_factor for x in (width, height)
												)  # resize to integer multiple of vae_scale_factor
												UpperCAmelCase			 =					image.resize((width, height)  ,    resample=PIL_INTERPOLATION[self.config.resample]   )
												return image






						def       UpperCAmelCase__	(   self					:List[Any]  ,    lowercase_					:Union[torch.FloatTensor, PIL.Image.Image, np.ndarray]  ,    lowercase_					:Optional[int] = None  ,    lowercase_					:Optional[int] = None  ,    )							->     torch.Tensor:
												UpperCAmelCase			 =					(PIL.Image.Image, np.ndarray, torch.Tensor)
												if isinstance(lowercase_  ,    lowercase_   ):
																		UpperCAmelCase			 =					[image]
												elif not (isinstance(lowercase_  ,    lowercase_   ) and all(isinstance(lowercase_  ,    lowercase_   ) for i in image   )):
																		raise ValueError(
																		    f"""Input is in incorrect format: {[type(lowercase_   ) for i in image]}. Currently, we only support {', '.join(lowercase_   )}"""   )

												if isinstance(image[0]  ,    PIL.Image.Image   ):
																		if self.config.do_convert_rgb:
																								UpperCAmelCase			 =					[self.convert_to_rgb(lowercase_   ) for i in image]
																		if self.config.do_resize:
																								UpperCAmelCase			 =					[self.resize(lowercase_  ,    lowercase_  ,    lowercase_   ) for i in image]
																		UpperCAmelCase			 =					self.pil_to_numpy(lowercase_   )  # to np
																		UpperCAmelCase			 =					self.numpy_to_pt(lowercase_   )  # to pt

												elif isinstance(image[0]  ,    np.ndarray   ):
																		UpperCAmelCase			 =					np.concatenate(lowercase_  ,    axis=0   ) if image[0].ndim == 4 else np.stack(lowercase_  ,    axis=0   )
																		UpperCAmelCase			 =					self.numpy_to_pt(lowercase_   )
																		UpperCAmelCase ,       UpperCAmelCase ,       UpperCAmelCase ,       UpperCAmelCase			 =					image.shape
																		if self.config.do_resize and (
																		    height % self.config.vae_scale_factor != 0 or width % self.config.vae_scale_factor != 0
																		):
																								raise ValueError(
																								    f"""Currently we only support resizing for PIL image - please resize your numpy array to be divisible by {self.config.vae_scale_factor}"""
																								    f"""currently the sizes are {height} and {width}. You can also pass a PIL image instead to use resize option in VAEImageProcessor"""   )

												elif isinstance(image[0]  ,    torch.Tensor   ):
																		UpperCAmelCase			 =					torch.cat(lowercase_  ,    axis=0   ) if image[0].ndim == 4 else torch.stack(lowercase_  ,    axis=0   )
																		UpperCAmelCase ,       UpperCAmelCase ,       UpperCAmelCase ,       UpperCAmelCase			 =					image.shape

																		# don't need any preprocess if the image is latents
																		if channel == 4:
																								return image

																		if self.config.do_resize and (
																		    height % self.config.vae_scale_factor != 0 or width % self.config.vae_scale_factor != 0
																		):
																								raise ValueError(
																								    f"""Currently we only support resizing for PIL image - please resize your pytorch tensor to be divisible by {self.config.vae_scale_factor}"""
																								    f"""currently the sizes are {height} and {width}. You can also pass a PIL image instead to use resize option in VAEImageProcessor"""   )

        # expected range [0,1], normalize to [-1,1]
												UpperCAmelCase			 =					self.config.do_normalize
												if image.min() < 0:
																		warnings.warn(
																		    'Passing `image` as torch tensor with value range in [-1,1] is deprecated. The expected value range for image tensor is [0,1] '
																		    f"""when passing as pytorch tensor or numpy Array. You passed `image` with value range [{image.min()},{image.max()}]"""  ,    lowercase_  ,    )
																		UpperCAmelCase			 =					False

												if do_normalize:
																		UpperCAmelCase			 =					self.normalize(lowercase_   )

												return image






						def       UpperCAmelCase__	(   self					:Union[str, Any]  ,    lowercase_					:torch.FloatTensor  ,    lowercase_					:str = "pil"  ,    lowercase_					:Optional[List[bool]] = None  ,    )							->     List[str]:
												if not isinstance(lowercase_  ,    torch.Tensor   ):
																		raise ValueError(
																		    f"""Input for postprocessing is in incorrect format: {type(lowercase_   )}. We only support pytorch tensor"""   )
												if output_type not in ["latent", "pt", "np", "pil"]:
																		UpperCAmelCase			 =					(
																		    f"""the output_type {output_type} is outdated and has been set to `np`. Please make sure to set it to one of these instead: """
																		    '`pil`, `np`, `pt`, `latent`'
																		)
																		deprecate('Unsupported output_type'  ,    '1.0.0'  ,    lowercase_  ,    standard_warn=lowercase_   )
																		UpperCAmelCase			 =					'np'

												if output_type == "latent":
																		return image

												if do_denormalize is None:
																		UpperCAmelCase			 =					[self.config.do_normalize] * image.shape[0]

												UpperCAmelCase			 =					torch.stack(
												    [self.denormalize(image[i]   ) if do_denormalize[i] else image[i] for i in range(image.shape[0]   )]   )

												if output_type == "pt":
																		return image

												UpperCAmelCase			 =					self.pt_to_numpy(lowercase_   )

												if output_type == "np":
																		return image

												if output_type == "pil":
																		return self.numpy_to_pil(lowercase_   )







class  A_     (	SCREAMING_SNAKE_CASE_							):



						"""simple docstring"""
						__UpperCamelCase													=				CONFIG_NAME






						@register_to_config
						def __init__(   self					:Union[str, Any]  ,    lowercase_					:bool = True  ,    lowercase_					:int = 8  ,    lowercase_					:str = "lanczos"  ,    lowercase_					:bool = True  ,    )							->     List[Any]:
												super().__init__()






						@staticmethod
						def       UpperCAmelCase__	(   lowercase_					:Optional[int]   )							->     Optional[Any]:
												if images.ndim == 3:
																		UpperCAmelCase			 =					images[None, ...]
												UpperCAmelCase			 =					(images * 2_55).round().astype('uint8'   )
												if images.shape[-1] == 1:
																		# special case for grayscale (single channel) images
																		UpperCAmelCase			 =					[Image.fromarray(image.squeeze()  ,    mode='L'   ) for image in images]
												else:
																		UpperCAmelCase			 =					[Image.fromarray(image[:, :, :3]   ) for image in images]

												return pil_images






						@staticmethod
						def       UpperCAmelCase__	(   lowercase_					:Any   )							->     Union[str, Any]:
												return image[:, :, 1] * 2**8 + image[:, :, 2]






						def       UpperCAmelCase__	(   self					:Optional[Any]  ,    lowercase_					:int   )							->     Tuple:
												if images.ndim == 3:
																		UpperCAmelCase			 =					images[None, ...]
												UpperCAmelCase			 =					images[:, :, :, 3:]
												if images.shape[-1] == 6:
																		UpperCAmelCase			 =					(images_depth * 2_55).round().astype('uint8'   )
																		UpperCAmelCase			 =					[
																		    Image.fromarray(self.rgblike_to_depthmap(lowercase_   )  ,    mode='I;16'   ) for image_depth in images_depth
																		]
												elif images.shape[-1] == 4:
																		UpperCAmelCase			 =					(images_depth * 6_5535.0).astype(np.uintaa   )
																		UpperCAmelCase			 =					[Image.fromarray(lowercase_  ,    mode='I;16'   ) for image_depth in images_depth]
												else:
																		raise Exception('Not supported'   )

												return pil_images






						def       UpperCAmelCase__	(   self					:Optional[int]  ,    lowercase_					:torch.FloatTensor  ,    lowercase_					:str = "pil"  ,    lowercase_					:Optional[List[bool]] = None  ,    )							->     Dict:
												if not isinstance(lowercase_  ,    torch.Tensor   ):
																		raise ValueError(
																		    f"""Input for postprocessing is in incorrect format: {type(lowercase_   )}. We only support pytorch tensor"""   )
												if output_type not in ["latent", "pt", "np", "pil"]:
																		UpperCAmelCase			 =					(
																		    f"""the output_type {output_type} is outdated and has been set to `np`. Please make sure to set it to one of these instead: """
																		    '`pil`, `np`, `pt`, `latent`'
																		)
																		deprecate('Unsupported output_type'  ,    '1.0.0'  ,    lowercase_  ,    standard_warn=lowercase_   )
																		UpperCAmelCase			 =					'np'

												if do_denormalize is None:
																		UpperCAmelCase			 =					[self.config.do_normalize] * image.shape[0]

												UpperCAmelCase			 =					torch.stack(
												    [self.denormalize(image[i]   ) if do_denormalize[i] else image[i] for i in range(image.shape[0]   )]   )

												UpperCAmelCase			 =					self.pt_to_numpy(lowercase_   )

												if output_type == "np":
																		if image.shape[-1] == 6:
																								UpperCAmelCase			 =					np.stack([self.rgblike_to_depthmap(im[:, :, 3:]   ) for im in image]  ,    axis=0   )
																		else:
																								UpperCAmelCase			 =					image[:, :, :, 3:]
																		return image[:, :, :, :3], image_depth

												if output_type == "pil":
																		return self.numpy_to_pil(lowercase_   ), self.numpy_to_depth(lowercase_   )
												else:
																		raise Exception(f"""This type {output_type} is not supported"""   )





