


'''simple docstring'''



from collections import UserDict
from typing import Union

import numpy as np
import requests

from ..utils import (
    add_end_docstrings,
    logging,
)
from .audio_classification import ffmpeg_read
from .base import PIPELINE_INIT_ARGS, Pipeline


__lowercase	:						int       =	logging.get_logger(__name__)





@add_end_docstrings(lowerCAmelCase_					)
class 							__UpperCamelCase				(		lowerCAmelCase_					):




	def __init__(   self						,				**__a							):

						'''simple docstring'''





						super().__init__(**__a							)

						if self.framework != "pt":
											raise ValueError(f"""The {self.__class__} is only available in PyTorch."""							)
						# No specific FOR_XXX available yet




	def __call__(   self						,				__a						,				**__a							):

						'''simple docstring'''





						return super().__call__(__a						,				**__a							)




	def       __UpperCAmelCase							(   self						,				**__a							):

						'''simple docstring'''





						__a			:       List[str]					    =  {}
						if "candidate_labels" in kwargs:
											__a			:       List[Any]					    =  kwargs['candidate_labels']
						if "hypothesis_template" in kwargs:
											__a			:       Optional[int]					    =  kwargs['hypothesis_template']

						return preprocess_params, {}, {}




	def       __UpperCAmelCase							(   self						,				__a						,				__a=None						,				__a="This is a sound of {}."							):

						'''simple docstring'''





						if isinstance(__a						,				__a							):
											if audio.startswith('http://'							) or audio.startswith('https://'							):
																# We need to actually check for a real protocol, otherwise it's impossible to use a local file
																# like http_huggingface_co.png
																__a			:       Union[str, Any]					    =  requests.get(__a							).content
											else:
																with open(__a						,				'rb'							) as f:
																					__a			:       Tuple					    =  f.read()

						if isinstance(__a						,				__a							):
											__a			:       Dict					    =  ffmpeg_read(__a						,				self.feature_extractor.sampling_rate							)

						if not isinstance(__a						,				np.ndarray							):
											raise ValueError('We expect a numpy ndarray as input'							)
						if len(audio.shape							) != 1:
											raise ValueError('We expect a single channel audio input for ZeroShotAudioClassificationPipeline'							)

						__a			:       Dict					    =  self.feature_extractor(
						    [audio]						,				sampling_rate=self.feature_extractor.sampling_rate						,				return_tensors='pt'							)
						__a			:       Tuple					    =  candidate_labels
						__a			:       int					    =  [hypothesis_template.format(__a							) for x in candidate_labels]
						__a			:       Tuple					    =  self.tokenizer(__a						,				return_tensors=self.framework						,				padding=__a							)
						__a			:       Union[str, Any]					    =  [text_inputs]
						return inputs




	def       __UpperCAmelCase							(   self						,				__a							):

						'''simple docstring'''





						__a			:       Union[str, Any]					    =  model_inputs.pop('candidate_labels'							)
						__a			:       List[str]					    =  model_inputs.pop('text_inputs'							)
						if isinstance(text_inputs[0]						,				__a							):
											__a			:       Dict					    =  text_inputs[0]
						else:
											# Batching case.
											__a			:       Tuple					    =  text_inputs[0][0]

						__a			:       Union[str, Any]					    =  self.model(**__a						,				**__a							)

						__a			:       Tuple					    =  {
						    'candidate_labels': candidate_labels,
						    'logits': outputs.logits_per_audio,
						}
						return model_outputs





	def       __UpperCAmelCase							(   self						,				__a							):

						'''simple docstring'''





						__a			:       Dict					    =  model_outputs.pop('candidate_labels'							)
						__a			:       Tuple					    =  model_outputs['logits'][0]

						if self.framework == "pt":
											__a			:       Optional[Any]					    =  logits.softmax(dim=0							)
											__a			:       List[Any]					    =  probs.tolist()
						else:
											raise ValueError('`tf` framework not supported.'							)

						__a			:       Union[str, Any]					    =  [
						    {'score': score, 'label': candidate_label}
						    for score, candidate_label in sorted(zip(__a						,				__a							)						,				key=lambda __a							: -x[0]							)
						]
						return result







import inspect
import unittest

from transformers import DecisionTransformerConfig, is_torch_available
from transformers.testing_utils import require_torch, slow, torch_device

from ...generation.test_utils import GenerationTesterMixin
from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
			import torch

			from transformers import DecisionTransformerModel
			from transformers.models.decision_transformer.modeling_decision_transformer import (
			    DECISION_TRANSFORMER_PRETRAINED_MODEL_ARCHIVE_LIST,
			)


class        _a							:

							def __init__(							self:	Tuple    ,						UpperCamelCase_:	int    ,						UpperCamelCase_:	Any=13    ,						UpperCamelCase_:	Optional[Any]=7    ,						UpperCamelCase_:	Optional[Any]=6    ,						UpperCamelCase_:	Any=17    ,						UpperCamelCase_:	str=23    ,						UpperCamelCase_:	List[Any]=11    ,						UpperCamelCase_:	Optional[int]=True    ,						)			->   List[Any]:





									"""simple docstring"""







									lowercase__            =      parent
									lowercase__            =      batch_size
									lowercase__            =      seq_length
									lowercase__            =      act_dim
									lowercase__            =      state_dim
									lowercase__            =      hidden_size
									lowercase__            =      max_length
									lowercase__            =      is_training

							def       lowerCamelCase_ (							self:	Optional[Any]							)			->   Tuple:





									"""simple docstring"""







									lowercase__            =      floats_tensor((self.batch_size, self.seq_length, self.state_dim)							)
									lowercase__            =      floats_tensor((self.batch_size, self.seq_length, self.act_dim)							)
									lowercase__            =      floats_tensor((self.batch_size, self.seq_length, 1)							)
									lowercase__            =      floats_tensor((self.batch_size, self.seq_length, 1)							)
									lowercase__            =      ids_tensor((self.batch_size, self.seq_length)    ,						vocab_size=1_000							)
									lowercase__            =      random_attention_mask((self.batch_size, self.seq_length)							)

									lowercase__            =      self.get_config()

									return (
									    config,
									    states,
									    actions,
									    rewards,
									    returns_to_go,
									    timesteps,
									    attention_mask,
									)

							def       lowerCamelCase_ (							self:	Dict							)			->   List[Any]:





									"""simple docstring"""







									return DecisionTransformerConfig(
									    batch_size=self.batch_size    ,						seq_length=self.seq_length    ,						act_dim=self.act_dim    ,						state_dim=self.state_dim    ,						hidden_size=self.hidden_size    ,						max_length=self.max_length    ,						)

							def       lowerCamelCase_ (							self:	List[str]    ,						UpperCamelCase_:	int    ,						UpperCamelCase_:	List[str]    ,						UpperCamelCase_:	Any    ,						UpperCamelCase_:	List[Any]    ,						UpperCamelCase_:	Any    ,						UpperCamelCase_:	List[Any]    ,						UpperCamelCase_:	int    ,						)			->   Dict:





									"""simple docstring"""







									lowercase__            =      DecisionTransformerModel(config=UpperCamelCase_							)
									model.to(UpperCamelCase_							)
									model.eval()
									lowercase__            =      model(UpperCamelCase_    ,						UpperCamelCase_    ,						UpperCamelCase_    ,						UpperCamelCase_    ,						UpperCamelCase_    ,						UpperCamelCase_							)

									self.parent.assertEqual(result.state_preds.shape    ,						states.shape							)
									self.parent.assertEqual(result.action_preds.shape    ,						actions.shape							)
									self.parent.assertEqual(result.return_preds.shape    ,						returns_to_go.shape							)
									self.parent.assertEqual(
									    result.last_hidden_state.shape    ,						(self.batch_size, self.seq_length * 3, self.hidden_size)							)  # seq length *3 as there are 3 modelities: states, returns and actions


							def       lowerCamelCase_ (							self:	List[Any]							)			->   str:





									"""simple docstring"""







									lowercase__            =      self.prepare_config_and_inputs()
									(
									    (
									    lowercase__
									)     ,		(
									    lowercase__
									)     ,		(
									    lowercase__
									)     ,		(
									    lowercase__
									)     ,		(
									    lowercase__
									)     ,		(
									    lowercase__
									)     ,		(
									    lowercase__
									)     ,		
									)            =      config_and_inputs
									lowercase__            =      {
									    '''states''': states,
									    '''actions''': actions,
									    '''rewards''': rewards,
									    '''returns_to_go''': returns_to_go,
									    '''timesteps''': timesteps,
									    '''attention_mask''': attention_mask,
									}
									return config, inputs_dict


@require_torch
class        _a							(			UpperCamelCase__     ,	UpperCamelCase__     ,	UpperCamelCase__     ,	unittest.TestCase			):
							_lowercase	:			str        = (DecisionTransformerModel,) if is_torch_available() else ()
							_lowercase	:			List[str]        = ()
							_lowercase	:			List[Any]        = {'''feature-extraction''': DecisionTransformerModel} if is_torch_available() else {}

							# Ignoring of a failing test from GenerationTesterMixin, as the model does not use inputs_ids
							_lowercase	:			Any        = False

							# Ignoring of a failing tests from ModelTesterMixin, as the model does not implement these features
							_lowercase	:			Tuple        = False
							_lowercase	:			str        = False
							_lowercase	:			Tuple        = False
							_lowercase	:			Optional[Any]        = False
							_lowercase	:			Tuple        = False
							_lowercase	:			Dict        = False
							_lowercase	:			Tuple        = False
							_lowercase	:			Optional[Any]        = False
							_lowercase	:			Optional[int]        = False

							def       lowerCamelCase_ (							self:	Union[str, Any]							)			->   Optional[Any]:





									"""simple docstring"""







									lowercase__            =      DecisionTransformerModelTester(self							)
									lowercase__            =      ConfigTester(self    ,						config_class=UpperCamelCase_    ,						hidden_size=37							)

							def       lowerCamelCase_ (							self:	Any							)			->   Optional[Any]:





									"""simple docstring"""







									self.config_tester.run_common_tests()

							def       lowerCamelCase_ (							self:	int							)			->   Optional[int]:





									"""simple docstring"""







									lowercase__            =      self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_model(*UpperCamelCase_							)

							@slow
							def       lowerCamelCase_ (							self:	Dict							)			->   Optional[Any]:





									"""simple docstring"""







									for model_name in DECISION_TRANSFORMER_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
											lowercase__            =      DecisionTransformerModel.from_pretrained(UpperCamelCase_							)
											self.assertIsNotNone(UpperCamelCase_							)


							def       lowerCamelCase_ (							self:	List[str]							)			->   Dict:





									"""simple docstring"""







									lowercase__     ,		lowercase__            =      self.model_tester.prepare_config_and_inputs_for_common()

									for model_class in self.all_model_classes:
											lowercase__            =      model_class(UpperCamelCase_							)
											lowercase__            =      inspect.signature(model.forward							)
											# signature.parameters is an OrderedDict => so arg_names order is deterministic
											lowercase__            =      [*signature.parameters.keys()]

											lowercase__            =      [
											    '''states''',
											    '''actions''',
											    '''rewards''',
											    '''returns_to_go''',
											    '''timesteps''',
											    '''attention_mask''',
											]

											self.assertListEqual(arg_names[: len(UpperCamelCase_							)]    ,						UpperCamelCase_							)


@require_torch
class        _a							(			unittest.TestCase			):

							@slow
							def       lowerCamelCase_ (							self:	Tuple							)			->   Any:





									"""simple docstring"""







									lowercase__            =      2  # number of steps of autoregressive prediction we will perform
									lowercase__            =      10  # defined by the RL environment, may be normalized
									lowercase__            =      DecisionTransformerModel.from_pretrained('''edbeeching/decision-transformer-gym-hopper-expert'''							)
									lowercase__            =      model.to(UpperCamelCase_							)
									lowercase__            =      model.config
									torch.manual_seed(0							)
									lowercase__            =      torch.randn(1    ,						1    ,						config.state_dim							).to(device=UpperCamelCase_    ,						dtype=torch.floataa							)  # env.reset()

									lowercase__            =      torch.tensor(
									    [[0.242793, -0.28693074, 0.8742613], [0.67815274, -0.08101085, -0.12952147]]    ,						device=UpperCamelCase_							)

									lowercase__            =      torch.tensor(UpperCamelCase_    ,						device=UpperCamelCase_    ,						dtype=torch.floataa							).reshape(1    ,						1    ,						1							)
									lowercase__            =      state
									lowercase__            =      torch.zeros(1    ,						0    ,						config.act_dim    ,						device=UpperCamelCase_    ,						dtype=torch.floataa							)
									lowercase__            =      torch.zeros(1    ,						0    ,						device=UpperCamelCase_    ,						dtype=torch.floataa							)
									lowercase__            =      torch.tensor(0    ,						device=UpperCamelCase_    ,						dtype=torch.long							).reshape(1    ,						1							)

									for step in range(UpperCamelCase_							):
											lowercase__            =      torch.cat([actions, torch.zeros(1    ,						1    ,						config.act_dim    ,						device=UpperCamelCase_							)]    ,						dim=1							)
											lowercase__            =      torch.cat([rewards, torch.zeros(1    ,						1    ,						device=UpperCamelCase_							)]    ,						dim=1							)

											lowercase__            =      torch.ones(1    ,						states.shape[1]							).to(dtype=torch.long    ,						device=states.device							)

											with torch.no_grad():
													lowercase__     ,		lowercase__     ,		lowercase__            =      model(
													    states=UpperCamelCase_    ,						actions=UpperCamelCase_    ,						rewards=UpperCamelCase_    ,						returns_to_go=UpperCamelCase_    ,						timesteps=UpperCamelCase_    ,						attention_mask=UpperCamelCase_    ,						return_dict=UpperCamelCase_    ,						)

											self.assertEqual(action_pred.shape    ,						actions.shape							)
											self.assertTrue(torch.allclose(action_pred[0, -1]    ,						expected_outputs[step]    ,						atol=1E-4							)							)
											lowercase__     ,		lowercase__     ,		lowercase__     ,		lowercase__            =      (  # env.step(action)
											    torch.randn(1    ,						1    ,						config.state_dim							).to(device=UpperCamelCase_    ,						dtype=torch.floataa							),
											    1.0,
											    False,
											    {},
											)

											lowercase__            =      action_pred[0, -1]
											lowercase__            =      torch.cat([states, state]    ,						dim=1							)
											lowercase__            =      returns_to_go[0, -1] - reward
											lowercase__            =      torch.cat([returns_to_go, pred_return.reshape(1    ,						1    ,						1							)]    ,						dim=1							)
											lowercase__            =      torch.cat(
											    [timesteps, torch.ones((1, 1)    ,						device=UpperCamelCase_    ,						dtype=torch.long							) * (step + 1)]    ,						dim=1							)


