
"""simple docstring"""


from math import factorial






def    _snake_case					(		snake_case__ :  int						,   snake_case__ :  int						,   snake_case__ :  float  ):
	if successes > trials:
		raise ValueError('successes must be lower or equal to trials'  )
	if trials < 0 or successes < 0:
		raise ValueError('the function is defined for non-negative integers'  )
	if not isinstance(snake_case__						,   snake_case__  ) or not isinstance(snake_case__						,   snake_case__  ):
		raise ValueError('the function is defined for non-negative integers'  )
	if not 0 < prob < 1:
		raise ValueError('prob has to be in range of 1 - 0'  )
	A     = (prob**successes) * ((1 - prob) ** (trials - successes))
	# Calculate the binomial coefficient: n! / k!(n-k)!
	A     = float(factorial(snake_case__  )  )
	coefficient /= factorial(snake_case__  ) * factorial(trials - successes  )
	return probability * coefficient


if __name__ == "__main__":
		from doctest import testmod

		testmod()
		print('''Probability of 2 successes out of 4 trails''')
		print('''with probability of 0.75 is:''', end=''' ''')
		print(binomial_distribution(2, 4, 0.75))
"""simple docstring"""




from __future__ import annotations

from statistics import mean







def 				_UpperCAmelCase		(							lowerCamelCase__      ,	lowerCamelCase__      ,	lowerCamelCase__  ):





		"""simple docstring"""




		lowerCAmelCase__   = [0] * no_of_processes
		lowerCAmelCase__   = [0] * no_of_processes

		# Initialize remaining_time to waiting_time.

		for i in range(lowerCamelCase__  ):
				lowerCAmelCase__   = burst_time[i]
		lowerCAmelCase__   = []

		lowerCAmelCase__   = 0
		lowerCAmelCase__   = 0

		# When processes are not completed,
		# A process whose arrival time has passed \
		# and has remaining execution time is put into the ready_process.
		# The shortest process in the ready_process, target_process is executed.

		while completed != no_of_processes:
				lowerCAmelCase__   = []
				lowerCAmelCase__   = -1

				for i in range(lowerCamelCase__  ):
						if (arrival_time[i] <= total_time) and (remaining_time[i] > 0):
								ready_process.append(lowerCamelCase__  )

				if len(lowerCamelCase__  ) > 0:
						lowerCAmelCase__   = ready_process[0]
						for i in ready_process:
								if remaining_time[i] < remaining_time[target_process]:
										lowerCAmelCase__   = i
						total_time += burst_time[target_process]
						completed += 1
						lowerCAmelCase__   = 0
						lowerCAmelCase__   = (
						    total_time - arrival_time[target_process] - burst_time[target_process]
						)
				else:
						total_time += 1

		return waiting_time







def 				_UpperCAmelCase		(							lowerCamelCase__      ,	lowerCamelCase__      ,	lowerCamelCase__  ):





		"""simple docstring"""




		lowerCAmelCase__   = [0] * no_of_processes
		for i in range(lowerCamelCase__  ):
				lowerCAmelCase__   = burst_time[i] + waiting_time[i]
		return turn_around_time


if __name__ == "__main__":
			print("[TEST CASE 01]")

			__lowerCAmelCase     :				str    				=    4
			__lowerCAmelCase     :				Dict    				=    [2, 5, 3, 7]
			__lowerCAmelCase     :				List[str]    				=    [0, 0, 0, 0]
			__lowerCAmelCase     :				Union[str, Any]    				=    calculate_waitingtime(arrival_time, burst_time, no_of_processes)
			__lowerCAmelCase     :				Union[str, Any]    				=    calculate_turnaroundtime(
			    burst_time, no_of_processes, waiting_time
			)

			# Printing the Result
			print("PID\tBurst Time\tArrival Time\tWaiting Time\tTurnaround Time")
			for i, process_id in enumerate(list(range(1, 5))):
						print(
						    F"{process_id}\t{burst_time[i]}\t\t\t{arrival_time[i]}\t\t\t\t"
						    F"{waiting_time[i]}\t\t\t\t{turn_around_time[i]}"
						)
			print(F"\nAverage waiting time = {mean(waiting_time):.5f}")
			print(F"Average turnaround time = {mean(turn_around_time):.5f}")




