



from dataclasses import dataclass
from typing import List, Optional, Union

import numpy as np
import PIL
from PIL import Image

from ...utils import BaseOutput, is_torch_available, is_transformers_available





@dataclass
# Copied from diffusers.pipelines.stable_diffusion.__init__.StableDiffusionPipelineOutput with Stable->Alt
class    __lowerCAmelCase					(	lowerCamelCase__			):
				__lowerCamelCase					=							42
				__lowerCamelCase					=							42


if is_transformers_available() and is_torch_available():
	from .modeling_roberta_series import RobertaSeriesModelWithTransformation
	from .pipeline_alt_diffusion import AltDiffusionPipeline
	from .pipeline_alt_diffusion_imgaimg import AltDiffusionImgaImgPipeline




"""simple docstring"""




from collections import OrderedDict
from typing import Any, Mapping, Optional

from ... import PreTrainedTokenizer
from ...configuration_utils import PretrainedConfig
from ...file_utils import TensorType, is_torch_available
from ...onnx import OnnxConfig, OnnxConfigWithPast, OnnxSeqaSeqConfigWithPast
from ...onnx.utils import compute_effective_axis_dimension
from ...utils import logging


__lowerCamelCase									=	logging.get_logger(__name__)

__lowerCamelCase									=	{
    "facebook/blenderbot-3B": "https://huggingface.co/facebook/blenderbot-3B/resolve/main/config.json",
    # See all Blenderbot models at https://huggingface.co/models?filter=blenderbot
}
class      UpperCamelCase__(      __A			):
						lowerCAmelCase__	:    List[str]    				=		'blenderbot'
						lowerCAmelCase__	:    Union[str, Any]    				=		['past_key_values']
						lowerCAmelCase__	:    Optional[Any]    				=		{'num_attention_heads': 'encoder_attention_heads', 'hidden_size': 'd_model'}





						def __init__(							self		,__UpperCAmelCase=80_08		,__UpperCAmelCase=1_28		,__UpperCAmelCase=2		,__UpperCAmelCase=1_02_40		,__UpperCAmelCase=32		,__UpperCAmelCase=24		,__UpperCAmelCase=1_02_40		,__UpperCAmelCase=32		,__UpperCAmelCase=0.0		,__UpperCAmelCase=0.0		,__UpperCAmelCase=True		,__UpperCAmelCase=True		,__UpperCAmelCase="gelu"		,__UpperCAmelCase=25_60		,__UpperCAmelCase=0.1		,__UpperCAmelCase=0.0		,__UpperCAmelCase=0.0		,__UpperCAmelCase=0.0_2		,__UpperCAmelCase=1		,__UpperCAmelCase=False		,__UpperCAmelCase=0		,__UpperCAmelCase=1		,__UpperCAmelCase=2		,__UpperCAmelCase=3		,__UpperCAmelCase=2		,**__UpperCAmelCase		,)       ->					Any:
													A__						  =				vocab_size
													A__						  =				max_position_embeddings
													A__						  =				d_model
													A__						  =				encoder_ffn_dim
													A__						  =				encoder_layers
													A__						  =				encoder_attention_heads
													A__						  =				decoder_ffn_dim
													A__						  =				decoder_layers
													A__						  =				decoder_attention_heads
													A__						  =				dropout
													A__						  =				attention_dropout
													A__						  =				activation_dropout
													A__						  =				activation_function
													A__						  =				init_std
													A__						  =				encoder_layerdrop
													A__						  =				decoder_layerdrop
													A__						  =				use_cache
													A__						  =				encoder_layers
													A__						  =				scale_embedding  # scale factor will be sqrt(d_model) if True

													super().__init__(
													    pad_token_id=__UpperCAmelCase		,bos_token_id=__UpperCAmelCase		,eos_token_id=__UpperCAmelCase		,is_encoder_decoder=__UpperCAmelCase		,decoder_start_token_id=__UpperCAmelCase		,encoder_no_repeat_ngram_size=__UpperCAmelCase		,forced_eos_token_id=__UpperCAmelCase		,**__UpperCAmelCase		,)






class      UpperCamelCase__(      __A			):





						@property
						def 					snake_case__						(							self  )       ->					Mapping[str, Mapping[int, str]]:
													if self.task in ["default", "seq2seq-lm"]:
																				A__						  =				OrderedDict(
																				    [
																				        ('input_ids', {0: 'batch', 1: 'encoder_sequence'}),
																				        ('attention_mask', {0: 'batch', 1: 'encoder_sequence'}),
																				    ]  )
																				if self.use_past:
																											A__						  =				{0: 'batch'}
																											A__						  =				{0: 'batch', 1: 'past_decoder_sequence + sequence'}
																				else:
																											A__						  =				{0: 'batch', 1: 'decoder_sequence'}
																											A__						  =				{0: 'batch', 1: 'decoder_sequence'}
																				if self.use_past:
																											self.fill_with_past_key_values_(__UpperCAmelCase		,direction='inputs'  )
													elif self.task == "causal-lm":
																				A__						  =				OrderedDict(
																				    [
																				        ('input_ids', {0: 'batch', 1: 'encoder_sequence'}),
																				        ('attention_mask', {0: 'batch', 1: 'encoder_sequence'}),
																				    ]  )
																				if self.use_past:
																											A__  ,	A__						  =				self.num_layers
																											for i in range(__UpperCAmelCase  ):
																																		A__						  =				{0: 'batch', 2: 'past_sequence + sequence'}
																																		A__						  =				{0: 'batch', 2: 'past_sequence + sequence'}
													else:
																				A__						  =				OrderedDict(
																				    [
																				        ('input_ids', {0: 'batch', 1: 'encoder_sequence'}),
																				        ('attention_mask', {0: 'batch', 1: 'encoder_sequence'}),
																				        ('decoder_input_ids', {0: 'batch', 1: 'decoder_sequence'}),
																				        ('decoder_attention_mask', {0: 'batch', 1: 'decoder_sequence'}),
																				    ]  )

													return common_inputs





						@property
						# Copied from transformers.models.bart.configuration_bart.BartOnnxConfig.outputs
						def 					snake_case__						(							self  )       ->					Mapping[str, Mapping[int, str]]:
													if self.task in ["default", "seq2seq-lm"]:
																				A__						  =				super().outputs
													else:
																				A__						  =				super(__UpperCAmelCase		,self  ).outputs
																				if self.use_past:
																											A__  ,	A__						  =				self.num_layers
																											for i in range(__UpperCAmelCase  ):
																																		A__						  =				{0: 'batch', 2: 'past_sequence + sequence'}
																																		A__						  =				{0: 'batch', 2: 'past_sequence + sequence'}
													return common_outputs





						def 					snake_case__						(							self		,__UpperCAmelCase		,__UpperCAmelCase = -1		,__UpperCAmelCase = -1		,__UpperCAmelCase = False		,__UpperCAmelCase = None		,)       ->					Mapping[str, Any]:
													A__						  =				self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
													    __UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase  )
													# Generate decoder inputs
													A__						  =				seq_length if not self.use_past else 1
													A__						  =				self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
													    __UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase  )
													A__						  =				{f'''decoder_{name}''': tensor for name, tensor in decoder_inputs.items()}
													A__						  =				dict(**__UpperCAmelCase		,**__UpperCAmelCase  )

													if self.use_past:
																				if not is_torch_available():
																											raise ValueError('Cannot generate dummy past_keys inputs without PyTorch installed.'  )
																				else:
																											import torch
																				A__  ,	A__						  =				common_inputs['input_ids'].shape
																				A__						  =				common_inputs['decoder_input_ids'].shape[1]
																				A__  ,	A__						  =				self.num_attention_heads
																				A__						  =				(
																				    batch,
																				    num_encoder_attention_heads,
																				    encoder_seq_length,
																				    self._config.hidden_size // num_encoder_attention_heads,
																				)
																				A__						  =				decoder_seq_length
																				A__						  =				(
																				    batch,
																				    num_decoder_attention_heads,
																				    decoder_past_length,
																				    self._config.hidden_size // num_decoder_attention_heads,
																				)
																				A__						  =				torch.cat(
																				    [common_inputs['decoder_attention_mask'], torch.ones(__UpperCAmelCase		,__UpperCAmelCase  )]		,dim=1  )
																				A__						  =				[]
																				A__  ,	A__						  =				self.num_layers

																				for _ in range(__UpperCAmelCase  ):
																											common_inputs["past_key_values"].append(
																											    (
																											        torch.zeros(__UpperCAmelCase  ),
																											        torch.zeros(__UpperCAmelCase  ),
																											        torch.zeros(__UpperCAmelCase  ),
																											        torch.zeros(__UpperCAmelCase  ),
																											    )  )
													return common_inputs





						def 					snake_case__						(							self		,__UpperCAmelCase		,__UpperCAmelCase = -1		,__UpperCAmelCase = -1		,__UpperCAmelCase = False		,__UpperCAmelCase = None		,)       ->					Mapping[str, Any]:
													A__						  =				self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
													    __UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase  )

													if self.use_past:
																				if not is_torch_available():
																											raise ValueError('Cannot generate dummy past_keys inputs without PyTorch installed.'  )
																				else:
																											import torch
																				A__  ,	A__						  =				common_inputs['input_ids'].shape
																				A__						  =				seqlen
																				A__  ,	A__						  =				self.num_layers
																				A__  ,	A__						  =				self.num_attention_heads
																				A__						  =				(
																				    batch,
																				    num_encoder_attention_heads,
																				    past_key_values_length,
																				    self._config.hidden_size // num_encoder_attention_heads,
																				)
																				A__						  =				common_inputs['attention_mask'].dtype
																				A__						  =				torch.cat(
																				    [common_inputs['attention_mask'], torch.ones(__UpperCAmelCase		,__UpperCAmelCase		,dtype=__UpperCAmelCase  )]		,dim=1  )
																				A__						  =				[
																				    (torch.zeros(__UpperCAmelCase  ), torch.zeros(__UpperCAmelCase  )) for _ in range(__UpperCAmelCase  )
																				]
													return common_inputs





						def 					snake_case__						(							self		,__UpperCAmelCase		,__UpperCAmelCase = -1		,__UpperCAmelCase = -1		,__UpperCAmelCase = False		,__UpperCAmelCase = None		,)       ->					Mapping[str, Any]:
													# Copied from OnnxConfig.generate_dummy_inputs
													# Did not use super(OnnxConfigWithPast, self).generate_dummy_inputs for code clarity.
													# If dynamic axis (-1) we forward with a fixed dimension of 2 samples to avoid optimizations made by ONNX
													A__						  =				compute_effective_axis_dimension(
													    __UpperCAmelCase		,fixed_dimension=OnnxConfig.default_fixed_batch		,num_token_to_add=0  )

													# If dynamic axis (-1) we forward with a fixed dimension of 8 tokens to avoid optimizations made by ONNX
													A__						  =				tokenizer.num_special_tokens_to_add(__UpperCAmelCase  )
													A__						  =				compute_effective_axis_dimension(
													    __UpperCAmelCase		,fixed_dimension=OnnxConfig.default_fixed_sequence		,num_token_to_add=__UpperCAmelCase  )

													# Generate dummy inputs according to compute batch and sequence
													A__						  =				[' '.join([tokenizer.unk_token]  ) * seq_length] * batch_size
													A__						  =				dict(tokenizer(__UpperCAmelCase		,return_tensors=__UpperCAmelCase  )  )
													return common_inputs





						def 					snake_case__						(							self		,__UpperCAmelCase		,__UpperCAmelCase = -1		,__UpperCAmelCase = -1		,__UpperCAmelCase = False		,__UpperCAmelCase = None		,)       ->					Mapping[str, Any]:
													if self.task in ["default", "seq2seq-lm"]:
																				A__						  =				self._generate_dummy_inputs_for_default_and_seqaseq_lm(
																				    __UpperCAmelCase		,batch_size=__UpperCAmelCase		,seq_length=__UpperCAmelCase		,is_pair=__UpperCAmelCase		,framework=__UpperCAmelCase  )

													elif self.task == "causal-lm":
																				A__						  =				self._generate_dummy_inputs_for_causal_lm(
																				    __UpperCAmelCase		,batch_size=__UpperCAmelCase		,seq_length=__UpperCAmelCase		,is_pair=__UpperCAmelCase		,framework=__UpperCAmelCase  )
													else:
																				A__						  =				self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
																				    __UpperCAmelCase		,batch_size=__UpperCAmelCase		,seq_length=__UpperCAmelCase		,is_pair=__UpperCAmelCase		,framework=__UpperCAmelCase  )

													return common_inputs





						def 					snake_case__						(							self		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase  )       ->					Tuple:
													if self.task in ["default", "seq2seq-lm"]:
																				A__						  =				super()._flatten_past_key_values_(__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase  )
													else:
																				A__						  =				super(__UpperCAmelCase		,self  )._flatten_past_key_values_(
																				    __UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase		,__UpperCAmelCase  )





						def 					snake_case__						(							self		,__UpperCAmelCase		,__UpperCAmelCase  )       ->					int:
													if direction not in ["inputs", "outputs"]:
																				raise ValueError(f'''direction must either be "inputs" or "outputs", but {direction} was given'''  )

													A__						  =				'past_key_values' if direction == 'inputs' else 'present'
													A__  ,	A__						  =				self.num_layers

													A__						  =				'past_encoder_sequence'
													A__						  =				'past_decoder_sequence' if direction == 'inputs' else 'past_decoder_sequence + sequence'

													for i in range(__UpperCAmelCase  ):
																				A__						  =				{0: 'batch', 2: decoder_sequence}
																				A__						  =				{0: 'batch', 2: decoder_sequence}
																				A__						  =				{0: 'batch', 2: encoder_sequence}
																				A__						  =				{0: 'batch', 2: encoder_sequence}





