



"""simple docstring"""


from collections import deque







class 				A_      :



						"""simple docstring"""






						def __init__( self			:Any       ,  lowercase_			:str       ,  lowercase_			:int       ,  lowercase_			:int )    ->      None:
												UpperCAmelCase					=			process_name  # process name
												UpperCAmelCase					=			arrival_time  # arrival time of the process
												# completion time of finished process or last interrupted time
												UpperCAmelCase					=			arrival_time
												UpperCAmelCase					=			burst_time  # remaining burst time
												UpperCAmelCase					=			0  # total time of the process wait in ready queue
												UpperCAmelCase					=			0  # time from arrival time to completion time







class 				A_      :



						"""simple docstring"""






						def __init__( self			:Any       ,  lowercase_			:int       ,  lowercase_			:list[int]       ,  lowercase_			:deque[Process]       ,  lowercase_			:int       ,  )    ->      None:
												# total number of mlfq's queues
												UpperCAmelCase					=			number_of_queues
												# time slice of queues that round robin algorithm applied
												UpperCAmelCase					=			time_slices
												# unfinished process is in this ready_queue
												UpperCAmelCase					=			queue
												# current time
												UpperCAmelCase					=			current_time
												# finished process is in this sequence queue
												UpperCAmelCase					=			deque()






						def      UpperCAmelCase__					( self			:Optional[int] )    ->      list[str]:
												UpperCAmelCase					=			[]
												for i in range(len(self.finish_queue ) ):
																		sequence.append(self.finish_queue[i].process_name )
												return sequence






						def      UpperCAmelCase__					( self			:List[str]       ,  lowercase_			:list[Process] )    ->      list[int]:
												UpperCAmelCase					=			[]
												for i in range(len(lowercase_ ) ):
																		waiting_times.append(queue[i].waiting_time )
												return waiting_times






						def      UpperCAmelCase__					( self			:List[str]       ,  lowercase_			:list[Process] )    ->      list[int]:
												UpperCAmelCase					=			[]
												for i in range(len(lowercase_ ) ):
																		turnaround_times.append(queue[i].turnaround_time )
												return turnaround_times






						def      UpperCAmelCase__					( self			:Dict       ,  lowercase_			:list[Process] )    ->      list[int]:
												UpperCAmelCase					=			[]
												for i in range(len(lowercase_ ) ):
																		completion_times.append(queue[i].stop_time )
												return completion_times






						def      UpperCAmelCase__					( self			:str       ,  lowercase_			:deque[Process] )    ->      list[int]:
												return [q.burst_time for q in queue]






						def      UpperCAmelCase__					( self			:int       ,  lowercase_			:Process )    ->      int:
												process.waiting_time += self.current_time - process.stop_time
												return process.waiting_time






						def      UpperCAmelCase__					( self			:Optional[int]       ,  lowercase_			:deque[Process] )    ->      deque[Process]:
												UpperCAmelCase					=			deque()  # sequence deque of finished process
												while len(lowercase_ ) != 0:
																		UpperCAmelCase					=			ready_queue.popleft()  # current process

																		# if process's arrival time is later than current time, update current time
																		if self.current_time < cp.arrival_time:
																								self.current_time += cp.arrival_time

																		# update waiting time of current process
																		self.update_waiting_time(lowercase_ )
																		# update current time
																		self.current_time += cp.burst_time
																		# finish the process and set the process's burst-time 0
																		UpperCAmelCase					=			0
																		# set the process's turnaround time because it is finished
																		UpperCAmelCase					=			self.current_time - cp.arrival_time
																		# set the completion time
																		UpperCAmelCase					=			self.current_time
																		# add the process to queue that has finished queue
																		finished.append(lowercase_ )

												self.finish_queue.extend(lowercase_ )  # add finished process to finish queue
												# FCFS will finish all remaining processes
												return finished






						def      UpperCAmelCase__					( self			:Tuple       ,  lowercase_			:deque[Process]       ,  lowercase_			:int )    ->      tuple[deque[Process], deque[Process]]:
												UpperCAmelCase					=			deque()  # sequence deque of terminated process
												# just for 1 cycle and unfinished processes will go back to queue
												for _ in range(len(lowercase_ ) ):
																		UpperCAmelCase					=			ready_queue.popleft()  # current process

																		# if process's arrival time is later than current time, update current time
																		if self.current_time < cp.arrival_time:
																								self.current_time += cp.arrival_time

																		# update waiting time of unfinished processes
																		self.update_waiting_time(lowercase_ )
																		# if the burst time of process is bigger than time-slice
																		if cp.burst_time > time_slice:
																								# use CPU for only time-slice
																								self.current_time += time_slice
																								# update remaining burst time
																								cp.burst_time -= time_slice
																								# update end point time
																								UpperCAmelCase					=			self.current_time
																								# locate the process behind the queue because it is not finished
																								ready_queue.append(lowercase_ )
																		else:
																								# use CPU for remaining burst time
																								self.current_time += cp.burst_time
																								# set burst time 0 because the process is finished
																								UpperCAmelCase					=			0
																								# set the finish time
																								UpperCAmelCase					=			self.current_time
																								# update the process' turnaround time because it is finished
																								UpperCAmelCase					=			self.current_time - cp.arrival_time
																								# add the process to queue that has finished queue
																								finished.append(lowercase_ )

												self.finish_queue.extend(lowercase_ )  # add finished process to finish queue
												# return finished processes queue and remaining processes queue
												return finished, ready_queue






						def      UpperCAmelCase__					( self			:Optional[Any] )    ->      deque[Process]:

												#  all queues except last one have round_robin algorithm
												for i in range(self.number_of_queues - 1 ):
																		UpperCAmelCase				,   UpperCAmelCase					=			self.round_robin(
																		    self.ready_queue       ,  self.time_slices[i] )
												#  the last queue has first_come_first_served algorithm
												self.first_come_first_served(self.ready_queue )

												return self.finish_queue


if __name__ == "__main__":
				import doctest

				snake_case_    					=	Process("""P1""", 0, 53)
				snake_case_    					=	Process("""P2""", 0, 17)
				snake_case_    					=	Process("""P3""", 0, 68)
				snake_case_    					=	Process("""P4""", 0, 24)
				snake_case_    					=	3
				snake_case_    					=	[17, 25]
				snake_case_    					=	deque([Pa, Pa, Pa, Pa])

				if len(time_slices) != number_of_queues - 1:
								raise SystemExit(0)

				doctest.testmod(extraglobs={"""queue""": deque([Pa, Pa, Pa, Pa])})

				snake_case_    					=	Process("""P1""", 0, 53)
				snake_case_    					=	Process("""P2""", 0, 17)
				snake_case_    					=	Process("""P3""", 0, 68)
				snake_case_    					=	Process("""P4""", 0, 24)
				snake_case_    					=	3
				snake_case_    					=	[17, 25]
				snake_case_    					=	deque([Pa, Pa, Pa, Pa])
				snake_case_    					=	MLFQ(number_of_queues, time_slices, queue, 0)
				snake_case_    					=	mlfq.multi_level_feedback_queue()

				# print total waiting times of processes(P1, P2, P3, P4)
				print(
				    f'''waiting time:\
        \t\t\t{MLFQ.calculate_waiting_time(mlfq, [Pa, Pa, Pa, Pa])}'''
				)
				# print completion times of processes(P1, P2, P3, P4)
				print(
				    f'''completion time:\
        \t\t{MLFQ.calculate_completion_time(mlfq, [Pa, Pa, Pa, Pa])}'''
				)
				# print total turnaround times of processes(P1, P2, P3, P4)
				print(
				    f'''turnaround time:\
        \t\t{MLFQ.calculate_turnaround_time(mlfq, [Pa, Pa, Pa, Pa])}'''
				)
				# print sequence of finished processes
				print(
				    f'''sequence of finished processes:\
        {mlfq.calculate_sequence_of_finish_queue()}'''
				)










"""simple docstring"""


import unittest

from transformers import DebertaVaConfig, is_torch_available
from transformers.testing_utils import require_sentencepiece, require_tokenizers, require_torch, slow, torch_device

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
				import torch

				from transformers import (
				    DebertaVaForMaskedLM,
				    DebertaVaForMultipleChoice,
				    DebertaVaForQuestionAnswering,
				    DebertaVaForSequenceClassification,
				    DebertaVaForTokenClassification,
				    DebertaVaModel,
				)
				from transformers.models.deberta_va.modeling_deberta_va import DEBERTA_V2_PRETRAINED_MODEL_ARCHIVE_LIST







class 				A_      (					SCREAMING_SNAKE_CASE_    ):



						"""simple docstring"""






						def __init__( self			:Any       ,  lowercase_			:Optional[Any]       ,  lowercase_			:int=13       ,  lowercase_			:Optional[Any]=7       ,  lowercase_			:List[str]=True       ,  lowercase_			:Dict=True       ,  lowercase_			:str=True       ,  lowercase_			:Optional[Any]=True       ,  lowercase_			:Dict=99       ,  lowercase_			:int=32       ,  lowercase_			:str=5       ,  lowercase_			:Dict=4       ,  lowercase_			:Tuple=37       ,  lowercase_			:Dict="gelu"       ,  lowercase_			:List[str]=0.1       ,  lowercase_			:int=0.1       ,  lowercase_			:Any=5_12       ,  lowercase_			:Optional[Any]=16       ,  lowercase_			:Optional[int]=2       ,  lowercase_			:Union[str, Any]=0.02       ,  lowercase_			:Dict=False       ,  lowercase_			:Tuple=True       ,  lowercase_			:Optional[Any]="None"       ,  lowercase_			:int=3       ,  lowercase_			:Tuple=4       ,  lowercase_			:Optional[int]=None       ,  )    ->      Tuple:
												UpperCAmelCase					=			parent
												UpperCAmelCase					=			batch_size
												UpperCAmelCase					=			seq_length
												UpperCAmelCase					=			is_training
												UpperCAmelCase					=			use_input_mask
												UpperCAmelCase					=			use_token_type_ids
												UpperCAmelCase					=			use_labels
												UpperCAmelCase					=			vocab_size
												UpperCAmelCase					=			hidden_size
												UpperCAmelCase					=			num_hidden_layers
												UpperCAmelCase					=			num_attention_heads
												UpperCAmelCase					=			intermediate_size
												UpperCAmelCase					=			hidden_act
												UpperCAmelCase					=			hidden_dropout_prob
												UpperCAmelCase					=			attention_probs_dropout_prob
												UpperCAmelCase					=			max_position_embeddings
												UpperCAmelCase					=			type_vocab_size
												UpperCAmelCase					=			type_sequence_label_size
												UpperCAmelCase					=			initializer_range
												UpperCAmelCase					=			num_labels
												UpperCAmelCase					=			num_choices
												UpperCAmelCase					=			relative_attention
												UpperCAmelCase					=			position_biased_input
												UpperCAmelCase					=			pos_att_type
												UpperCAmelCase					=			scope






						def      UpperCAmelCase__					( self			:Any )    ->      Tuple:
												UpperCAmelCase					=			ids_tensor([self.batch_size, self.seq_length]       ,  self.vocab_size )

												UpperCAmelCase					=			None
												if self.use_input_mask:
																		UpperCAmelCase					=			ids_tensor([self.batch_size, self.seq_length]       ,  vocab_size=2 )

												UpperCAmelCase					=			None
												if self.use_token_type_ids:
																		UpperCAmelCase					=			ids_tensor([self.batch_size, self.seq_length]       ,  self.type_vocab_size )

												UpperCAmelCase					=			None
												UpperCAmelCase					=			None
												UpperCAmelCase					=			None
												if self.use_labels:
																		UpperCAmelCase					=			ids_tensor([self.batch_size]       ,  self.type_sequence_label_size )
																		UpperCAmelCase					=			ids_tensor([self.batch_size, self.seq_length]       ,  self.num_labels )
																		UpperCAmelCase					=			ids_tensor([self.batch_size]       ,  self.num_choices )

												UpperCAmelCase					=			self.get_config()

												return config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels






						def      UpperCAmelCase__					( self			:Tuple )    ->      Tuple:
												return DebertaVaConfig(
												    vocab_size=self.vocab_size       ,  hidden_size=self.hidden_size       ,  num_hidden_layers=self.num_hidden_layers       ,  num_attention_heads=self.num_attention_heads       ,  intermediate_size=self.intermediate_size       ,  hidden_act=self.hidden_act       ,  hidden_dropout_prob=self.hidden_dropout_prob       ,  attention_probs_dropout_prob=self.attention_probs_dropout_prob       ,  max_position_embeddings=self.max_position_embeddings       ,  type_vocab_size=self.type_vocab_size       ,  initializer_range=self.initializer_range       ,  relative_attention=self.relative_attention       ,  position_biased_input=self.position_biased_input       ,  pos_att_type=self.pos_att_type       ,  )






						def      UpperCAmelCase__					( self			:Optional[int]       ,  lowercase_			:str )    ->      List[str]:
												self.parent.assertListEqual(list(result.loss.size() )       ,  [] )






						def      UpperCAmelCase__					( self			:Optional[int]       ,  lowercase_			:str       ,  lowercase_			:Tuple       ,  lowercase_			:str       ,  lowercase_			:int       ,  lowercase_			:Union[str, Any]       ,  lowercase_			:List[str]       ,  lowercase_			:Optional[int] )    ->      Optional[int]:
												UpperCAmelCase					=			DebertaVaModel(config=lowercase_ )
												model.to(lowercase_ )
												model.eval()
												UpperCAmelCase					=			model(lowercase_       ,  attention_mask=lowercase_       ,  token_type_ids=lowercase_ )[0]
												UpperCAmelCase					=			model(lowercase_       ,  token_type_ids=lowercase_ )[0]
												UpperCAmelCase					=			model(lowercase_ )[0]

												self.parent.assertListEqual(list(sequence_output.size() )       ,  [self.batch_size, self.seq_length, self.hidden_size] )






						def      UpperCAmelCase__					( self			:Optional[Any]       ,  lowercase_			:Dict       ,  lowercase_			:List[str]       ,  lowercase_			:Any       ,  lowercase_			:List[str]       ,  lowercase_			:Tuple       ,  lowercase_			:List[Any]       ,  lowercase_			:int )    ->      Any:
												UpperCAmelCase					=			DebertaVaForMaskedLM(config=lowercase_ )
												model.to(lowercase_ )
												model.eval()
												UpperCAmelCase					=			model(lowercase_       ,  attention_mask=lowercase_       ,  token_type_ids=lowercase_       ,  labels=lowercase_ )

												self.parent.assertEqual(result.logits.shape       ,  (self.batch_size, self.seq_length, self.vocab_size) )






						def      UpperCAmelCase__					( self			:Union[str, Any]       ,  lowercase_			:Any       ,  lowercase_			:List[Any]       ,  lowercase_			:Any       ,  lowercase_			:Dict       ,  lowercase_			:str       ,  lowercase_			:List[Any]       ,  lowercase_			:Dict )    ->      Union[str, Any]:
												UpperCAmelCase					=			self.num_labels
												UpperCAmelCase					=			DebertaVaForSequenceClassification(lowercase_ )
												model.to(lowercase_ )
												model.eval()
												UpperCAmelCase					=			model(lowercase_       ,  attention_mask=lowercase_       ,  token_type_ids=lowercase_       ,  labels=lowercase_ )
												self.parent.assertListEqual(list(result.logits.size() )       ,  [self.batch_size, self.num_labels] )
												self.check_loss_output(lowercase_ )






						def      UpperCAmelCase__					( self			:Any       ,  lowercase_			:Union[str, Any]       ,  lowercase_			:Dict       ,  lowercase_			:Union[str, Any]       ,  lowercase_			:Any       ,  lowercase_			:Optional[int]       ,  lowercase_			:Optional[Any]       ,  lowercase_			:Any )    ->      List[Any]:
												UpperCAmelCase					=			self.num_labels
												UpperCAmelCase					=			DebertaVaForTokenClassification(config=lowercase_ )
												model.to(lowercase_ )
												model.eval()
												UpperCAmelCase					=			model(lowercase_       ,  attention_mask=lowercase_       ,  token_type_ids=lowercase_       ,  labels=lowercase_ )
												self.parent.assertEqual(result.logits.shape       ,  (self.batch_size, self.seq_length, self.num_labels) )






						def      UpperCAmelCase__					( self			:Any       ,  lowercase_			:Any       ,  lowercase_			:List[Any]       ,  lowercase_			:Union[str, Any]       ,  lowercase_			:Union[str, Any]       ,  lowercase_			:Dict       ,  lowercase_			:List[Any]       ,  lowercase_			:Optional[int] )    ->      Dict:
												UpperCAmelCase					=			DebertaVaForQuestionAnswering(config=lowercase_ )
												model.to(lowercase_ )
												model.eval()
												UpperCAmelCase					=			model(
												    lowercase_       ,  attention_mask=lowercase_       ,  token_type_ids=lowercase_       ,  start_positions=lowercase_       ,  end_positions=lowercase_       ,  )
												self.parent.assertEqual(result.start_logits.shape       ,  (self.batch_size, self.seq_length) )
												self.parent.assertEqual(result.end_logits.shape       ,  (self.batch_size, self.seq_length) )






						def      UpperCAmelCase__					( self			:Optional[int]       ,  lowercase_			:str       ,  lowercase_			:List[Any]       ,  lowercase_			:Union[str, Any]       ,  lowercase_			:List[Any]       ,  lowercase_			:Union[str, Any]       ,  lowercase_			:Any       ,  lowercase_			:Any )    ->      List[Any]:
												UpperCAmelCase					=			DebertaVaForMultipleChoice(config=lowercase_ )
												model.to(lowercase_ )
												model.eval()
												UpperCAmelCase					=			input_ids.unsqueeze(1 ).expand(-1       ,  self.num_choices       ,  -1 ).contiguous()
												UpperCAmelCase					=			token_type_ids.unsqueeze(1 ).expand(-1       ,  self.num_choices       ,  -1 ).contiguous()
												UpperCAmelCase					=			input_mask.unsqueeze(1 ).expand(-1       ,  self.num_choices       ,  -1 ).contiguous()
												UpperCAmelCase					=			model(
												    lowercase_       ,  attention_mask=lowercase_       ,  token_type_ids=lowercase_       ,  labels=lowercase_       ,  )
												self.parent.assertEqual(result.logits.shape       ,  (self.batch_size, self.num_choices) )






						def      UpperCAmelCase__					( self			:Dict )    ->      int:
												UpperCAmelCase					=			self.prepare_config_and_inputs()
												(
												    (
												    UpperCAmelCase
												)				,   (
												    UpperCAmelCase
												)				,   (
												    UpperCAmelCase
												)				,   (
												    UpperCAmelCase
												)				,   (
												    UpperCAmelCase
												)				,   (
												    UpperCAmelCase
												)				,   (
												    UpperCAmelCase
												)				,   
												)					=			config_and_inputs
												UpperCAmelCase					=			{'input_ids': input_ids, 'token_type_ids': token_type_ids, 'attention_mask': input_mask}
												return config, inputs_dict







@require_torch
class 				A_      (					SCREAMING_SNAKE_CASE_     ,       SCREAMING_SNAKE_CASE_     ,       unittest.TestCase    ):



						"""simple docstring"""
						__UpperCamelCase		    =							(
						    (
						        DebertaVaModel,
						        DebertaVaForMaskedLM,
						        DebertaVaForSequenceClassification,
						        DebertaVaForTokenClassification,
						        DebertaVaForQuestionAnswering,
						        DebertaVaForMultipleChoice,
						    )
						    if is_torch_available()
						    else ()
						)
						__UpperCamelCase		    =							(
						    {
						        """feature-extraction""": DebertaVaModel,
						        """fill-mask""": DebertaVaForMaskedLM,
						        """question-answering""": DebertaVaForQuestionAnswering,
						        """text-classification""": DebertaVaForSequenceClassification,
						        """token-classification""": DebertaVaForTokenClassification,
						        """zero-shot""": DebertaVaForSequenceClassification,
						    }
						    if is_torch_available()
						    else {}
						)

						__UpperCamelCase		    =							True
						__UpperCamelCase		    =							False
						__UpperCamelCase		    =							False
						__UpperCamelCase		    =							False
						__UpperCamelCase		    =							False






						def      UpperCAmelCase__					( self			:Optional[Any] )    ->      Optional[int]:
												UpperCAmelCase					=			DebertaVaModelTester(self )
												UpperCAmelCase					=			ConfigTester(self       ,  config_class=lowercase_       ,  hidden_size=37 )






						def      UpperCAmelCase__					( self			:Optional[Any] )    ->      Optional[Any]:
												self.config_tester.run_common_tests()






						def      UpperCAmelCase__					( self			:Optional[Any] )    ->      Tuple:
												UpperCAmelCase					=			self.model_tester.prepare_config_and_inputs()
												self.model_tester.create_and_check_deberta_model(*lowercase_ )






						def      UpperCAmelCase__					( self			:Any )    ->      List[str]:
												UpperCAmelCase					=			self.model_tester.prepare_config_and_inputs()
												self.model_tester.create_and_check_deberta_for_sequence_classification(*lowercase_ )






						def      UpperCAmelCase__					( self			:Optional[Any] )    ->      List[Any]:
												UpperCAmelCase					=			self.model_tester.prepare_config_and_inputs()
												self.model_tester.create_and_check_deberta_for_masked_lm(*lowercase_ )






						def      UpperCAmelCase__					( self			:Optional[Any] )    ->      Optional[int]:
												UpperCAmelCase					=			self.model_tester.prepare_config_and_inputs()
												self.model_tester.create_and_check_deberta_for_question_answering(*lowercase_ )






						def      UpperCAmelCase__					( self			:Union[str, Any] )    ->      Tuple:
												UpperCAmelCase					=			self.model_tester.prepare_config_and_inputs()
												self.model_tester.create_and_check_deberta_for_token_classification(*lowercase_ )






						def      UpperCAmelCase__					( self			:Any )    ->      Union[str, Any]:
												UpperCAmelCase					=			self.model_tester.prepare_config_and_inputs()
												self.model_tester.create_and_check_deberta_for_multiple_choice(*lowercase_ )






						@slow
						def      UpperCAmelCase__					( self			:Any )    ->      Optional[int]:
												for model_name in DEBERTA_V2_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
																		UpperCAmelCase					=			DebertaVaModel.from_pretrained(lowercase_ )
																		self.assertIsNotNone(lowercase_ )







@require_torch
@require_sentencepiece
@require_tokenizers
class 				A_      (					unittest.TestCase    ):



						"""simple docstring"""






						@unittest.skip(reason='Model not available yet' )
						def      UpperCAmelCase__					( self			:str )    ->      Tuple:
												pass






						@slow
						def      UpperCAmelCase__					( self			:List[Any] )    ->      Any:
												UpperCAmelCase					=			DebertaVaModel.from_pretrained('microsoft/deberta-v2-xlarge' )

												UpperCAmelCase					=			torch.tensor([[0, 3_14_14, 2_32, 3_28, 7_40, 11_40, 1_26_95, 69, 4_60_78, 15_88, 2]] )
												UpperCAmelCase					=			torch.tensor([[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] )
												with torch.no_grad():
																		UpperCAmelCase					=			model(lowercase_       ,  attention_mask=lowercase_ )[0]
												# compare the actual values for a slice.
												UpperCAmelCase					=			torch.tensor(
												    [[[0.2356, 0.1948, 0.0369], [-0.1063, 0.3586, -0.5152], [-0.6399, -0.0259, -0.2525]]] )
												self.assertTrue(torch.allclose(output[:, 1:4, 1:4]       ,  lowercase_       ,  atol=1E-4 )       ,  f"""{output[:, 1:4, 1:4]}""" )





