


import unittest

import numpy as np
import timeout_decorator  # noqa

from transformers import MBartConfig, is_flax_available
from transformers.testing_utils import require_flax, require_sentencepiece, require_tokenizers, slow
from transformers.utils import cached_property

from ...generation.test_flax_utils import FlaxGenerationTesterMixin
from ...test_modeling_flax_common import FlaxModelTesterMixin, ids_tensor


if is_flax_available():
	import os

	# The slow tests are often failing with OOM error on GPU
	# This makes JAX allocate exactly what is needed on demand, and deallocate memory that is no longer needed
	# but will be slower as stated here https://jax.readthedocs.io/en/latest/gpu_memory_allocation.html
	A_    :					List[Any]             ="""platform"""

	import jax
	import jax.numpy as jnp

	from transformers import AutoTokenizer
	from transformers.models.mbart.modeling_flax_mbart import (
	    FlaxMBartForConditionalGeneration,
	    FlaxMBartForQuestionAnswering,
	    FlaxMBartForSequenceClassification,
	    FlaxMBartModel,
	    shift_tokens_right,
	)




def   lowerCamelCase_       (					UpperCAmelCase__       ,    UpperCAmelCase__       ,    UpperCAmelCase__=None       ,    UpperCAmelCase__=None       ,    UpperCAmelCase__=None       ,    UpperCAmelCase__=None       ,    UpperCAmelCase__=None       ,    UpperCAmelCase__=None       ,    ):



						"""simple docstring"""




						if attention_mask is None:
												a_					=		np.where(input_ids != config.pad_token_id       ,    1       ,    0      )
						if decoder_attention_mask is None:
												a_					=		np.where(decoder_input_ids != config.pad_token_id       ,    1       ,    0      )
						if head_mask is None:
												a_					=		np.ones((config.encoder_layers, config.encoder_attention_heads)      )
						if decoder_head_mask is None:
												a_					=		np.ones((config.decoder_layers, config.decoder_attention_heads)      )
						if cross_attn_head_mask is None:
												a_					=		np.ones((config.decoder_layers, config.decoder_attention_heads)      )
						return {
						    "input_ids": input_ids,
						    "decoder_input_ids": decoder_input_ids,
						    "attention_mask": attention_mask,
						    "decoder_attention_mask": decoder_attention_mask,
						}





class        lowercase_				( unittest.TestCase):






							"""simple docstring"""







							def __init__(   self			,    _UpperCAmelCase			,    _UpperCAmelCase=13			,    _UpperCAmelCase=7			,    _UpperCAmelCase=True			,    _UpperCAmelCase=False			,    _UpperCAmelCase=99			,    _UpperCAmelCase=16			,    _UpperCAmelCase=2			,    _UpperCAmelCase=4			,    _UpperCAmelCase=4			,    _UpperCAmelCase="gelu"			,    _UpperCAmelCase=0.1			,    _UpperCAmelCase=0.1			,    _UpperCAmelCase=32			,    _UpperCAmelCase=2			,    _UpperCAmelCase=1			,    _UpperCAmelCase=0			,    _UpperCAmelCase=2			,    _UpperCAmelCase=0.0_2			,    ):







													"""simple docstring"""


													a_					=		parent
													a_					=		batch_size
													a_					=		seq_length
													a_					=		is_training
													a_					=		use_labels
													a_					=		vocab_size
													a_					=		hidden_size
													a_					=		num_hidden_layers
													a_					=		num_attention_heads
													a_					=		intermediate_size
													a_					=		hidden_act
													a_					=		hidden_dropout_prob
													a_					=		attention_probs_dropout_prob
													a_					=		max_position_embeddings
													a_					=		eos_token_id
													a_					=		pad_token_id
													a_					=		bos_token_id
													a_					=		decoder_start_token_id
													a_					=		initializer_range


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_					=		np.clip(ids_tensor([self.batch_size, self.seq_length - 1]			,    self.vocab_size		)			,    3			,    self.vocab_size		)
													a_					=		np.concatenate((input_ids, 2 * np.ones((self.batch_size, 1)			,    dtype=np.intaa		))			,    -1		)

													a_					=		shift_tokens_right(_UpperCAmelCase			,    1		)

													a_					=		MBartConfig(
													    vocab_size=self.vocab_size			,    d_model=self.hidden_size			,    encoder_layers=self.num_hidden_layers			,    decoder_layers=self.num_hidden_layers			,    encoder_attention_heads=self.num_attention_heads			,    decoder_attention_heads=self.num_attention_heads			,    encoder_ffn_dim=self.intermediate_size			,    decoder_ffn_dim=self.intermediate_size			,    dropout=self.hidden_dropout_prob			,    attention_dropout=self.attention_probs_dropout_prob			,    max_position_embeddings=self.max_position_embeddings			,    eos_token_id=self.eos_token_id			,    bos_token_id=self.bos_token_id			,    pad_token_id=self.pad_token_id			,    decoder_start_token_id=self.decoder_start_token_id			,    initializer_range=self.initializer_range			,    use_cache=_UpperCAmelCase			,    )
													a_					=		prepare_mbart_inputs_dict(_UpperCAmelCase			,    _UpperCAmelCase			,    _UpperCAmelCase		)
													return config, inputs_dict


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_			,   a_					=		self.prepare_config_and_inputs()
													return config, inputs_dict


							def 						lowercase__     (   self			,    _UpperCAmelCase			,    _UpperCAmelCase			,    _UpperCAmelCase		):







													"""simple docstring"""


													a_					=		20
													a_					=		model_class_name(_UpperCAmelCase		)

													a_					=		model.encode(inputs_dict["""input_ids"""]		)

													a_			,   a_					=		(
													    inputs_dict["""decoder_input_ids"""],
													    inputs_dict["""decoder_attention_mask"""],
													)

													a_					=		model.init_cache(decoder_input_ids.shape[0]			,    _UpperCAmelCase			,    _UpperCAmelCase		)
													a_					=		jnp.ones((decoder_input_ids.shape[0], max_decoder_length)			,    dtype="""i4"""		)

													a_					=		jnp.broadcast_to(
													    jnp.arange(decoder_input_ids.shape[-1] - 1		)[None, :]			,    (decoder_input_ids.shape[0], decoder_input_ids.shape[-1] - 1)			,    )
													a_					=		model.decode(
													    decoder_input_ids[:, :-1]			,    _UpperCAmelCase			,    decoder_attention_mask=_UpperCAmelCase			,    past_key_values=_UpperCAmelCase			,    decoder_position_ids=_UpperCAmelCase			,    )

													a_					=		jnp.array(decoder_input_ids.shape[0] * [[decoder_input_ids.shape[-1] - 1]]			,    dtype="""i4"""		)
													a_					=		model.decode(
													    decoder_input_ids[:, -1:]			,    _UpperCAmelCase			,    decoder_attention_mask=_UpperCAmelCase			,    past_key_values=outputs_cache.past_key_values			,    decoder_position_ids=_UpperCAmelCase			,    )

													a_					=		model.decode(_UpperCAmelCase			,    _UpperCAmelCase		)

													a_					=		np.max(np.abs((outputs_cache_next[0][:, -1, :5] - outputs[0][:, -1, :5])		)		)
													self.parent.assertTrue(diff < 1e-3			,    msg=f"Max diff is {diff}"		)






							def 						lowercase__     (   self			,    _UpperCAmelCase			,    _UpperCAmelCase			,    _UpperCAmelCase		):







													"""simple docstring"""


													a_					=		20
													a_					=		model_class_name(_UpperCAmelCase		)

													a_					=		model.encode(inputs_dict["""input_ids"""]		)

													a_			,   a_					=		(
													    inputs_dict["""decoder_input_ids"""],
													    inputs_dict["""decoder_attention_mask"""],
													)

													a_					=		jnp.concatenate(
													    [
													        decoder_attention_mask,
													        jnp.zeros((decoder_attention_mask.shape[0], max_decoder_length - decoder_attention_mask.shape[1])		),
													    ]			,    axis=-1			,    )

													a_					=		model.init_cache(decoder_input_ids.shape[0]			,    _UpperCAmelCase			,    _UpperCAmelCase		)
													a_					=		jnp.broadcast_to(
													    jnp.arange(decoder_input_ids.shape[-1] - 1		)[None, :]			,    (decoder_input_ids.shape[0], decoder_input_ids.shape[-1] - 1)			,    )

													a_					=		model.decode(
													    decoder_input_ids[:, :-1]			,    _UpperCAmelCase			,    decoder_attention_mask=_UpperCAmelCase			,    past_key_values=_UpperCAmelCase			,    decoder_position_ids=_UpperCAmelCase			,    )
													a_					=		jnp.array(decoder_input_ids.shape[0] * [[decoder_input_ids.shape[-1] - 1]]			,    dtype="""i4"""		)
													a_					=		model.decode(
													    decoder_input_ids[:, -1:]			,    _UpperCAmelCase			,    past_key_values=outputs_cache.past_key_values			,    decoder_attention_mask=_UpperCAmelCase			,    decoder_position_ids=_UpperCAmelCase			,    )

													a_					=		model.decode(_UpperCAmelCase			,    _UpperCAmelCase			,    decoder_attention_mask=_UpperCAmelCase		)

													a_					=		np.max(np.abs((outputs_cache_next[0][:, -1, :5] - outputs[0][:, -1, :5])		)		)
													self.parent.assertTrue(diff < 1e-3			,    msg=f"Max diff is {diff}"		)





@require_flax
class        lowercase_				( unittest.TestCase):






							"""simple docstring"""







							snake_case_        =		99


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_					=		np.array(
													    [
													        [71, 82, 18, 33, 46, 91, 2],
													        [68, 34, 26, 58, 30, 82, 2],
													        [5, 97, 17, 39, 94, 40, 2],
													        [76, 83, 94, 25, 70, 78, 2],
													        [87, 59, 41, 35, 48, 66, 2],
													        [55, 13, 16, 58, 5, 2, 1],  # note padding
													        [64, 27, 31, 51, 12, 75, 2],
													        [52, 64, 86, 17, 83, 39, 2],
													        [48, 61, 9, 24, 71, 82, 2],
													        [26, 1, 60, 48, 22, 13, 2],
													        [21, 5, 62, 28, 14, 76, 2],
													        [45, 98, 37, 86, 59, 48, 2],
													        [70, 70, 50, 9, 28, 0, 2],
													    ]			,    dtype=np.intaa			,    )

													a_					=		input_ids.shape[0]
													a_					=		MBartConfig(
													    vocab_size=self.vocab_size			,    d_model=24			,    encoder_layers=2			,    decoder_layers=2			,    encoder_attention_heads=2			,    decoder_attention_heads=2			,    encoder_ffn_dim=32			,    decoder_ffn_dim=32			,    max_position_embeddings=48			,    eos_token_id=2			,    pad_token_id=1			,    bos_token_id=0			,    )
													return config, input_ids, batch_size


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_			,   a_			,   a_					=		self._get_config_and_data()
													a_					=		FlaxMBartForSequenceClassification(_UpperCAmelCase		)
													a_					=		model(input_ids=_UpperCAmelCase			,    decoder_input_ids=_UpperCAmelCase		)
													a_					=		(batch_size, config.num_labels)
													self.assertEqual(outputs["""logits"""].shape			,    _UpperCAmelCase		)


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_			,   a_			,   a_					=		self._get_config_and_data()
													a_					=		FlaxMBartForQuestionAnswering(_UpperCAmelCase		)
													a_					=		model(input_ids=_UpperCAmelCase		)

													self.assertEqual(outputs["""start_logits"""].shape			,    input_ids.shape		)
													self.assertEqual(outputs["""end_logits"""].shape			,    input_ids.shape		)


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_			,   a_			,   a_					=		self._get_config_and_data()
													a_					=		FlaxMBartForConditionalGeneration(_UpperCAmelCase		)
													a_					=		lm_model(input_ids=_UpperCAmelCase		)
													a_					=		(batch_size, input_ids.shape[1], config.vocab_size)
													self.assertEqual(outputs["""logits"""].shape			,    _UpperCAmelCase		)


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_					=		MBartConfig(
													    vocab_size=self.vocab_size			,    d_model=14			,    encoder_layers=2			,    decoder_layers=2			,    encoder_attention_heads=2			,    decoder_attention_heads=2			,    encoder_ffn_dim=8			,    decoder_ffn_dim=8			,    max_position_embeddings=48			,    )
													a_					=		FlaxMBartForConditionalGeneration(_UpperCAmelCase		)
													a_					=		np.array([[71, 82, 18, 33, 46, 91, 2], [68, 34, 26, 58, 30, 2, 1]]			,    dtype=np.intaa		)
													a_					=		np.array([[82, 71, 82, 18, 2], [58, 68, 2, 1, 1]]			,    dtype=np.intaa		)
													a_					=		lm_model(input_ids=_UpperCAmelCase			,    decoder_input_ids=_UpperCAmelCase		)
													a_					=		(*summary.shape, config.vocab_size)
													self.assertEqual(outputs["""logits"""].shape			,    _UpperCAmelCase		)






							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_					=		np.array([[71, 82, 18, 33, 2, 1, 1], [68, 34, 26, 58, 30, 82, 2]]			,    dtype=np.intaa		)
													a_					=		shift_tokens_right(_UpperCAmelCase			,    1		)
													a_					=		np.equal(_UpperCAmelCase			,    1		).astype(np.floataa		).sum()
													a_					=		np.equal(_UpperCAmelCase			,    1		).astype(np.floataa		).sum()
													self.assertEqual(shifted.shape			,    input_ids.shape		)
													self.assertEqual(_UpperCAmelCase			,    n_pad_before - 1		)
													self.assertTrue(np.equal(shifted[:, 0]			,    2		).all()		)





@require_flax
class        lowercase_				( UpperCamelCase__			,unittest.TestCase			,UpperCamelCase__):






							"""simple docstring"""







							snake_case_        =		True
							snake_case_        =		(
							    (
							        FlaxMBartModel,
							        FlaxMBartForConditionalGeneration,
							        FlaxMBartForSequenceClassification,
							        FlaxMBartForQuestionAnswering,
							    )
							    if is_flax_available()
							    else ()
							)
							snake_case_        =		(FlaxMBartForConditionalGeneration,) if is_flax_available() else ()


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_					=		FlaxMBartModelTester(self		)


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_			,   a_					=		self.model_tester.prepare_config_and_inputs()
													for model_class in self.all_model_classes:
																			self.model_tester.check_use_cache_forward(_UpperCAmelCase			,    _UpperCAmelCase			,    _UpperCAmelCase		)


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_			,   a_					=		self.model_tester.prepare_config_and_inputs()
													for model_class in self.all_model_classes:
																			self.model_tester.check_use_cache_forward_with_attn_mask(_UpperCAmelCase			,    _UpperCAmelCase			,    _UpperCAmelCase		)


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_			,   a_					=		self.model_tester.prepare_config_and_inputs_for_common()

													for model_class in self.all_model_classes:
																			with self.subTest(model_class.__name__		):
																									a_					=		self._prepare_for_class(_UpperCAmelCase			,    _UpperCAmelCase		)
																									a_					=		model_class(_UpperCAmelCase		)

																									@jax.jit
																									def encode_jitted(_UpperCAmelCase			,    _UpperCAmelCase=None			,    **_UpperCAmelCase		):
																															return model.encode(input_ids=_UpperCAmelCase			,    attention_mask=_UpperCAmelCase		)

																									with self.subTest("""JIT Enabled"""		):
																															a_					=		encode_jitted(**_UpperCAmelCase		).to_tuple()

																									with self.subTest("""JIT Disabled"""		):
																															with jax.disable_jit():
																																					a_					=		encode_jitted(**_UpperCAmelCase		).to_tuple()

																									self.assertEqual(len(_UpperCAmelCase		)			,    len(_UpperCAmelCase		)		)
																									for jitted_output, output in zip(_UpperCAmelCase			,    _UpperCAmelCase		):
																															self.assertEqual(jitted_output.shape			,    output.shape		)


							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_			,   a_					=		self.model_tester.prepare_config_and_inputs_for_common()

													for model_class in self.all_model_classes:
																			with self.subTest(model_class.__name__		):
																									a_					=		model_class(_UpperCAmelCase		)
																									a_					=		model.encode(inputs_dict["""input_ids"""]			,    inputs_dict["""attention_mask"""]		)

																									a_					=		{
																									    """decoder_input_ids""": inputs_dict["""decoder_input_ids"""],
																									    """decoder_attention_mask""": inputs_dict["""decoder_attention_mask"""],
																									    """encoder_outputs""": encoder_outputs,
																									}

																									@jax.jit
																									def decode_jitted(_UpperCAmelCase			,    _UpperCAmelCase			,    _UpperCAmelCase		):
																															return model.decode(
																															    decoder_input_ids=_UpperCAmelCase			,    decoder_attention_mask=_UpperCAmelCase			,    encoder_outputs=_UpperCAmelCase			,    )

																									with self.subTest("""JIT Enabled"""		):
																															a_					=		decode_jitted(**_UpperCAmelCase		).to_tuple()

																									with self.subTest("""JIT Disabled"""		):
																															with jax.disable_jit():
																																					a_					=		decode_jitted(**_UpperCAmelCase		).to_tuple()

																									self.assertEqual(len(_UpperCAmelCase		)			,    len(_UpperCAmelCase		)		)
																									for jitted_output, output in zip(_UpperCAmelCase			,    _UpperCAmelCase		):
																															self.assertEqual(jitted_output.shape			,    output.shape		)






							@slow
							def 						lowercase__     (   self		):







													"""simple docstring"""


													for model_class_name in self.all_model_classes:
																			a_					=		model_class_name.from_pretrained("""facebook/mbart-large-cc25"""			,    from_pt=_UpperCAmelCase		)
																			# FlaxMBartForSequenceClassification expects eos token in input_ids
																			a_					=		np.ones((1, 1)		) * model.config.eos_token_id
																			a_					=		model(_UpperCAmelCase		)
																			self.assertIsNotNone(_UpperCAmelCase		)





@require_flax
@require_sentencepiece
@require_tokenizers
class        lowercase_				( unittest.TestCase):






							"""simple docstring"""







							snake_case_        =		[
							    ''' UN Chief Says There Is No Military Solution in Syria''',
							]
							snake_case_        =		[
							    '''Şeful ONU declară că nu există o soluţie militară în Siria''',
							]
							snake_case_        =		'''facebook/mbart-large-en-ro'''


							@cached_property
							def 						lowercase__     (   self		):







													"""simple docstring"""


													return AutoTokenizer.from_pretrained(self.model_name		)


							@cached_property
							def 						lowercase__     (   self		):







													"""simple docstring"""


													a_					=		FlaxMBartForConditionalGeneration.from_pretrained(self.model_name			,    from_pt=_UpperCAmelCase		)
													return model


							def 						lowercase__     (   self			,    **_UpperCAmelCase		):







													"""simple docstring"""


													a_					=		self.translate_src_text(**_UpperCAmelCase		)
													self.assertListEqual(self.expected_text			,    _UpperCAmelCase		)


							def 						lowercase__     (   self			,    **_UpperCAmelCase		):







													"""simple docstring"""


													a_					=		self.tokenizer(self.src_text			,    **_UpperCAmelCase			,    return_tensors="""np"""		)
													a_					=		self.model.generate(
													    model_inputs.input_ids			,    attention_mask=model_inputs.attention_mask			,    decoder_start_token_id=self.tokenizer.lang_code_to_id["""ro_RO"""]			,    early_stopping=_UpperCAmelCase			,    num_beams=2			,    ).sequences
													a_					=		self.tokenizer.batch_decode(_UpperCAmelCase			,    skip_special_tokens=_UpperCAmelCase		)
													return generated_words






							@slow
							def 						lowercase__     (   self		):







													"""simple docstring"""


													self._assert_generated_batch_equal_expected()



from collections.abc import Callable
from math import log
from os import name, system
from random import gauss, seed
from typing import TypeVar




def   lowerCamelCase_       (					UpperCAmelCase__       ,    UpperCAmelCase__       ,    UpperCAmelCase__      ):



						"""simple docstring"""




						seed(1      )
						return [gauss(UpperCAmelCase__       ,    UpperCAmelCase__      ) for _ in range(UpperCAmelCase__      )]




def   lowerCamelCase_       (					UpperCAmelCase__       ,    UpperCAmelCase__      ):



						"""simple docstring"""




						return [k for k in range(UpperCAmelCase__      ) for _ in range(instance_count[k]      )]




def   lowerCamelCase_       (					UpperCAmelCase__       ,    UpperCAmelCase__      ):



						"""simple docstring"""




						return sum(UpperCAmelCase__      ) / instance_count




def   lowerCamelCase_       (					UpperCAmelCase__       ,    UpperCAmelCase__      ):



						"""simple docstring"""




						return instance_count / total_count




def   lowerCamelCase_       (					UpperCAmelCase__       ,    UpperCAmelCase__       ,    UpperCAmelCase__      ):



						"""simple docstring"""




						a_					=		[]  # An empty list to store all squared differences
						# iterate over number of elements in items
						for i in range(len(UpperCAmelCase__      )      ):
												# for loop iterates over number of elements in inner layer of items
												for j in range(len(items[i]      )      ):
																		# appending squared differences to 'squared_diff' list
																		squared_diff.append((items[i][j] - means[i]) ** 2      )

    # one divided by (the number of all instances - number of classes) multiplied by
    # sum of all squared differences
						a_					=		len(UpperCAmelCase__      )  # Number of classes in dataset
						return 1 / (total_count - n_classes) * sum(UpperCAmelCase__      )




def   lowerCamelCase_       (					UpperCAmelCase__       ,    UpperCAmelCase__       ,    UpperCAmelCase__       ,    UpperCAmelCase__      ):



						"""simple docstring"""




						a_					=		[]
						# for loop iterates over number of elements in list
						for i in range(len(UpperCAmelCase__      )      ):
												# for loop iterates over number of inner items of each element
												for j in range(len(x_items[i]      )      ):
																		a_					=		[]  # to store all discriminant values of each item as a list
																		# for loop iterates over number of classes we have in our dataset
																		for k in range(len(UpperCAmelCase__      )      ):
																								# appending values of discriminants for each class to 'temp' list
																								temp.append(
																								    x_items[i][j] * (means[k] / variance)
																								    - (means[k] ** 2 / (2 * variance))
																								    + log(probabilities[k]      )      )
																		# appending discriminant values of each item to 'results' list
																		results.append(UpperCAmelCase__      )

						return [result.index(max(UpperCAmelCase__      )      ) for result in results]




def   lowerCamelCase_       (					UpperCAmelCase__       ,    UpperCAmelCase__      ):



						"""simple docstring"""




						a_					=		sum(1 for i, j in zip(UpperCAmelCase__       ,    UpperCAmelCase__      ) if i == j      )
						# percentage of accuracy equals to number of correct predictions divided by number
						# of all data and multiplied by 100
						return (correct / len(UpperCAmelCase__      )) * 100


A_    :					Dict             =TypeVar("""num""")




def   lowerCamelCase_       (					UpperCAmelCase__       ,    UpperCAmelCase__       ,    UpperCAmelCase__       ,    UpperCAmelCase__ = lambda UpperCAmelCase__      : True       ,    UpperCAmelCase__ = None       ,    ):



						"""simple docstring"""




						while True:
												try:
																		a_					=		input_type(input(UpperCAmelCase__      ).strip() or default      )
																		if condition(UpperCAmelCase__      ):
																								return user_input
																		else:
																								print(F"{user_input}: {err_msg}"      )
																								continue
												except ValueError:
																		print(
																		    F"{user_input}: Incorrect input type, expected {input_type.__name__!r}"      )




def   lowerCamelCase_       (					):



						"""simple docstring"""




						while True:
												print(""" Linear Discriminant Analysis """.center(50       ,    """*"""      )      )
												print("""*""" * 50       ,    """\n"""      )
												print("""First of all we should specify the number of classes that"""      )
												print("""we want to generate as training dataset"""      )
												# Trying to get number of classes
												a_					=		valid_input(
												    input_type=UpperCAmelCase__       ,    condition=lambda UpperCAmelCase__      : x > 0       ,    input_msg="""Enter the number of classes (Data Groupings): """       ,    err_msg="""Number of classes should be positive!"""       ,    )

												print("""-""" * 100      )

												# Trying to get the value of standard deviation
												a_					=		valid_input(
												    input_type=UpperCAmelCase__       ,    condition=lambda UpperCAmelCase__      : x >= 0       ,    input_msg=(
												        """Enter the value of standard deviation"""
												        """(Default value is 1.0 for all classes): """
												    )       ,    err_msg="""Standard deviation should not be negative!"""       ,    default="""1.0"""       ,    )

												print("""-""" * 100      )

												# Trying to get number of instances in classes and theirs means to generate
												# dataset
												a_					=		[]  # An empty list to store instance counts of classes in dataset
												for i in range(UpperCAmelCase__      ):
																		a_					=		valid_input(
																		    input_type=UpperCAmelCase__       ,    condition=lambda UpperCAmelCase__      : x > 0       ,    input_msg=(F"Enter The number of instances for class_{i+1}: ")       ,    err_msg="""Number of instances should be positive!"""       ,    )
																		counts.append(UpperCAmelCase__      )
												print("""-""" * 100      )

												# An empty list to store values of user-entered means of classes
												a_					=		[]
												for a in range(UpperCAmelCase__      ):
																		a_					=		valid_input(
																		    input_type=UpperCAmelCase__       ,    input_msg=(F"Enter the value of mean for class_{a+1}: ")       ,    err_msg="""This is an invalid value."""       ,    )
																		user_means.append(UpperCAmelCase__      )
												print("""-""" * 100      )

												print("""Standard deviation: """       ,    UpperCAmelCase__      )
												# print out the number of instances in classes in separated line
												for i, count in enumerate(UpperCAmelCase__       ,    1      ):
																		print(F"Number of instances in class_{i} is: {count}"      )
												print("""-""" * 100      )

												# print out mean values of classes separated line
												for i, user_mean in enumerate(UpperCAmelCase__       ,    1      ):
																		print(F"Mean of class_{i} is: {user_mean}"      )
												print("""-""" * 100      )

												# Generating training dataset drawn from gaussian distribution
												a_					=		[
												    gaussian_distribution(user_means[j]       ,    UpperCAmelCase__       ,    counts[j]      )
												    for j in range(UpperCAmelCase__      )
												]
												print("""Generated Normal Distribution: \n"""       ,    UpperCAmelCase__      )
												print("""-""" * 100      )

												# Generating Ys to detecting corresponding classes
												a_					=		y_generator(UpperCAmelCase__       ,    UpperCAmelCase__      )
												print("""Generated Corresponding Ys: \n"""       ,    UpperCAmelCase__      )
												print("""-""" * 100      )

												# Calculating the value of actual mean for each class
												a_					=		[calculate_mean(counts[k]       ,    x[k]      ) for k in range(UpperCAmelCase__      )]
												# for loop iterates over number of elements in 'actual_means' list and print
												# out them in separated line
												for i, actual_mean in enumerate(UpperCAmelCase__       ,    1      ):
																		print(F"Actual(Real) mean of class_{i} is: {actual_mean}"      )
												print("""-""" * 100      )

												# Calculating the value of probabilities for each class
												a_					=		[
												    calculate_probabilities(counts[i]       ,    sum(UpperCAmelCase__      )      ) for i in range(UpperCAmelCase__      )
												]

												# for loop iterates over number of elements in 'probabilities' list and print
												# out them in separated line
												for i, probability in enumerate(UpperCAmelCase__       ,    1      ):
																		print(F"Probability of class_{i} is: {probability}"      )
												print("""-""" * 100      )

												# Calculating the values of variance for each class
												a_					=		calculate_variance(UpperCAmelCase__       ,    UpperCAmelCase__       ,    sum(UpperCAmelCase__      )      )
												print("""Variance: """       ,    UpperCAmelCase__      )
												print("""-""" * 100      )

												# Predicting Y values
												# storing predicted Y values in 'pre_indexes' variable
												a_					=		predict_y_values(UpperCAmelCase__       ,    UpperCAmelCase__       ,    UpperCAmelCase__       ,    UpperCAmelCase__      )
												print("""-""" * 100      )

												# Calculating Accuracy of the model
												print(F"Accuracy: {accuracy(UpperCAmelCase__       ,    UpperCAmelCase__      )}"      )
												print("""-""" * 100      )
												print(""" DONE """.center(100       ,    """+"""      )      )

												if input("""Press any key to restart or 'q' for quit: """      ).strip().lower() == "q":
																		print("""\n""" + """GoodBye!""".center(100       ,    """-"""      ) + """\n"""      )
																		break
												system("""cls""" if name == """nt""" else """clear"""      )  # noqa: S605


if __name__ == "__main__":
	main()