






"""simple docstring"""


import numpy as np
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier


def        UpperCAmelCase      (					a__ ):





						'''simple docstring'''






						return (data["data"], data["target"])


def        UpperCAmelCase      (					a__     ,      a__ ):





						'''simple docstring'''






						lowerCAmelCase   :int						=			XGBClassifier()
						classifier.fit(a__     ,      a__ )
						return classifier


def        UpperCAmelCase      (					):





						'''simple docstring'''






						lowerCAmelCase   :str						=			load_iris()
						lowerCAmelCase	, lowerCAmelCase   :List[str]						=			data_handling(a__ )
						lowerCAmelCase	, lowerCAmelCase	, lowerCAmelCase	, lowerCAmelCase   :int						=			train_test_split(
						    a__     ,      a__     ,      test_size=0.25 )

						lowerCAmelCase   :Optional[Any]						=			iris['target_names']

						# Create an XGBoost Classifier from the training data
						lowerCAmelCase   :Dict						=			xgboost(a__     ,      a__ )

						# Display the confusion matrix of the classifier with both training and test sets
						ConfusionMatrixDisplay.from_estimator(
						    a__     ,      a__     ,      a__     ,      display_labels=a__     ,      cmap='Blues'     ,      normalize='true'     ,      )
						plt.title('Normalized Confusion Matrix - IRIS Dataset' )
						plt.show()


if __name__ == "__main__":
		import doctest

		doctest.testmod(verbose=True)
		main()







"""simple docstring"""


from __future__ import annotations

from collections import namedtuple
from dataclasses import dataclass




@dataclass
class 						__UpperCamelCase     :
					lowercase_    :				int
					lowercase_    :				TreeNode | None      =  None
					lowercase_    :				TreeNode | None      =  None


__SCREAMING_SNAKE_CASE   =   namedtuple('CoinsDistribResult', 'moves excess')


def        UpperCAmelCase      (					a__ ):





						'''simple docstring'''






						if root is None:
												return 0

						# Validation
						def count_nodes(a__ ) -> int:
												if node is None:
																		return 0

												return count_nodes(node.left ) + count_nodes(node.right ) + 1

						def count_coins(a__ ) -> int:
												if node is None:
																		return 0

												return count_coins(node.left ) + count_coins(node.right ) + node.data

						if count_nodes(a__ ) != count_coins(a__ ):
												raise ValueError('The nodes number should be same as the number of coins' )

						# Main calculation
						def get_distrib(a__ ) -> CoinsDistribResult:

												if node is None:
																		return CoinsDistribResult(0     ,      1 )

												lowerCAmelCase	, lowerCAmelCase   :Optional[int]						=			get_distrib(node.left )
												lowerCAmelCase	, lowerCAmelCase   :str						=			get_distrib(node.right )

												lowerCAmelCase   :str						=			1 - left_distrib_excess
												lowerCAmelCase   :Optional[Any]						=			1 - right_distrib_excess

												lowerCAmelCase   :Any						=			(
												    left_distrib_moves
												    + right_distrib_moves
												    + abs(a__ )
												    + abs(a__ )
												)
												lowerCAmelCase   :Tuple						=			node.data - coins_to_left - coins_to_right

												return CoinsDistribResult(a__     ,      a__ )

						return get_distrib(a__ )[0]


if __name__ == "__main__":
		import doctest

		doctest.testmod()