


'''simple docstring'''


import numpy






class 		lowerCAmelCase__	:




			def __init__(						self     :   str		,     lowerCamelCase__     :   numpy.ndarray		,     lowerCamelCase__     :   numpy.ndarray       )      ->None:



					'''simple docstring'''







					_UpperCAmelCase						:				List[Any]	    =					input_array

					# Random initial weights are assigned where first argument is the
					# number of nodes in previous layer and second argument is the
					# number of nodes in the next layer.

					# Random initial weights are assigned.
					# self.input_array.shape[1] is used to represent number of nodes in input layer.
					# First hidden layer consists of 4 nodes.
					_UpperCAmelCase						:				List[str]	    =					numpy.random.rand(
					    self.input_array.shape[1]		,     4       )

					# Random initial values for the first hidden layer.
					# First hidden layer has 4 nodes.
					# Second hidden layer has 3 nodes.
					_UpperCAmelCase						:				int	    =					numpy.random.rand(
					    4		,     3       )

					# Random initial values for the second hidden layer.
					# Second hidden layer has 3 nodes.
					# Output layer has 1 node.
					_UpperCAmelCase						:				str	    =					numpy.random.rand(3		,     1       )

					# Real output values provided.
					_UpperCAmelCase						:				List[str]	    =					output_array

					# Predicted output values by the neural network.
					# Predicted_output array initially consists of zeroes.
					_UpperCAmelCase						:				str	    =					numpy.zeros(output_array.shape       )




			def 							lowerCAmelCase__			(						self     :   List[str]       )      ->numpy.ndarray:



					'''simple docstring'''







					_UpperCAmelCase						:				Optional[int]	    =					sigmoid(
					    numpy.dot(self.input_array		,     self.input_layer_and_first_hidden_layer_weights       )       )

					# layer_between_first_hidden_layer_and_second_hidden_layer is the layer
					# connecting the first hidden set of nodes with the second hidden set of nodes.
					_UpperCAmelCase						:				Union[str, Any]	    =					sigmoid(
					    numpy.dot(
					        self.layer_between_input_and_first_hidden_layer		,     self.first_hidden_layer_and_second_hidden_layer_weights		,     )       )

					# layer_between_second_hidden_layer_and_output is the layer connecting
					# second hidden layer with the output node.
					_UpperCAmelCase						:				Tuple	    =					sigmoid(
					    numpy.dot(
					        self.layer_between_first_hidden_layer_and_second_hidden_layer		,     self.second_hidden_layer_and_output_layer_weights		,     )       )

					return self.layer_between_second_hidden_layer_and_output




			def 							lowerCAmelCase__			(						self     :   Union[str, Any]       )      ->None:



					'''simple docstring'''







					_UpperCAmelCase						:				Optional[Any]	    =					numpy.dot(
					    self.layer_between_first_hidden_layer_and_second_hidden_layer.T		,     2
					    * (self.output_array - self.predicted_output)
					    * sigmoid_derivative(self.predicted_output       )		,     )
					_UpperCAmelCase						:				Optional[Any]	    =					numpy.dot(
					    self.layer_between_input_and_first_hidden_layer.T		,     numpy.dot(
					        2
					        * (self.output_array - self.predicted_output)
					        * sigmoid_derivative(self.predicted_output       )		,     self.second_hidden_layer_and_output_layer_weights.T		,     )
					    * sigmoid_derivative(
					        self.layer_between_first_hidden_layer_and_second_hidden_layer       )		,     )
					_UpperCAmelCase						:				int	    =					numpy.dot(
					    self.input_array.T		,     numpy.dot(
					        numpy.dot(
					            2
					            * (self.output_array - self.predicted_output)
					            * sigmoid_derivative(self.predicted_output       )		,     self.second_hidden_layer_and_output_layer_weights.T		,     )
					        * sigmoid_derivative(
					            self.layer_between_first_hidden_layer_and_second_hidden_layer       )		,     self.first_hidden_layer_and_second_hidden_layer_weights.T		,     )
					    * sigmoid_derivative(self.layer_between_input_and_first_hidden_layer       )		,     )

					self.input_layer_and_first_hidden_layer_weights += (
					    updated_input_layer_and_first_hidden_layer_weights
					)
					self.first_hidden_layer_and_second_hidden_layer_weights += (
					    updated_first_hidden_layer_and_second_hidden_layer_weights
					)
					self.second_hidden_layer_and_output_layer_weights += (
					    updated_second_hidden_layer_and_output_layer_weights
					)




			def 							lowerCAmelCase__			(						self     :   Any		,     lowerCamelCase__     :   numpy.ndarray		,     lowerCamelCase__     :   int		,     lowerCamelCase__     :   bool       )      ->None:



					'''simple docstring'''







					for iteration in range(1		,     iterations + 1       ):
							_UpperCAmelCase						:				Any	    =					self.feedforward()
							self.back_propagation()
							if give_loss:
									_UpperCAmelCase						:				List[Any]	    =					numpy.mean(numpy.square(output - self.feedforward()       )       )
									print(F"""Iteration {iteration} Loss: {loss}"""       )






			def 							lowerCAmelCase__			(						self     :   Dict		,     lowerCamelCase__     :   numpy.ndarray       )      ->int:



					'''simple docstring'''







					_UpperCAmelCase						:				List[Any]	    =					input_arr

					_UpperCAmelCase						:				Tuple	    =					sigmoid(
					    numpy.dot(self.array		,     self.input_layer_and_first_hidden_layer_weights       )       )

					_UpperCAmelCase						:				Union[str, Any]	    =					sigmoid(
					    numpy.dot(
					        self.layer_between_input_and_first_hidden_layer		,     self.first_hidden_layer_and_second_hidden_layer_weights		,     )       )

					_UpperCAmelCase						:				Union[str, Any]	    =					sigmoid(
					    numpy.dot(
					        self.layer_between_first_hidden_layer_and_second_hidden_layer		,     self.second_hidden_layer_and_output_layer_weights		,     )       )

					return int(self.layer_between_second_hidden_layer_and_output > 0.6       )






def        __lowerCAmelCase       (__lowerCAmelCase      ):
		return 1 / (1 + numpy.exp(-value      ))






def        __lowerCAmelCase       (__lowerCAmelCase      ):
		return (value) * (1 - (value))






def        __lowerCAmelCase       ():
		_UpperCAmelCase						:				List[str]	    =					numpy.array(
		    (
		        [0, 0, 0],
		        [0, 0, 1],
		        [0, 1, 0],
		        [0, 1, 1],
		        [1, 0, 0],
		        [1, 0, 1],
		        [1, 1, 0],
		        [1, 1, 1],
		    )					,       dtype=numpy.floataa					,       )

		# True output values for the given input values.
		_UpperCAmelCase						:				Union[str, Any]	    =					numpy.array(([0], [1], [1], [0], [1], [0], [0], [1])					,       dtype=numpy.floataa      )

		# Calling neural network class.
		_UpperCAmelCase						:				Optional[int]	    =					TwoHiddenLayerNeuralNetwork(
		    input_array=__lowerCAmelCase					,       output_array=__lowerCAmelCase      )

		# Calling training function.
		# Set give_loss to True if you want to see loss in every iteration.
		neural_network.train(output=__lowerCAmelCase					,       iterations=10					,       give_loss=__lowerCAmelCase      )

		return neural_network.predict(numpy.array(([1, 1, 1])					,       dtype=numpy.floataa      )      )


if __name__ == "__main__":
						example()







'''simple docstring'''


from __future__ import annotations

lowerCamelCase__					=   'Muhammad Umer Farooq'
lowerCamelCase__					=   'MIT'
lowerCamelCase__					=   '1.0.0'
lowerCamelCase__					=   'Muhammad Umer Farooq'
lowerCamelCase__					=   'contact@muhammadumerfarooq.me'
lowerCamelCase__					=   'Alpha'

import re
from html.parser import HTMLParser
from urllib import parse

import requests






class 		lowerCAmelCase__	(	UpperCAmelCase__		):




			def __init__(						self     :   Any		,     lowerCamelCase__     :   str       )      ->None:



					'''simple docstring'''







					super().__init__()
					_UpperCAmelCase						:				list[str]	    =					[]
					_UpperCAmelCase						:				List[str]	    =					domain






			def 							lowerCAmelCase__			(						self     :   Optional[Any]		,     lowerCamelCase__     :   str		,     lowerCamelCase__     :   list[tuple[str, str | None]]       )      ->None:



					'''simple docstring'''







					if tag == "a":
							# Check the list of defined attributes.
							for name, value in attrs:
									# If href is defined, and not empty nor # print it.
									if name == "href" and value != "#" and value != "":
											# If not already in urls.
											if value not in self.urls:
													_UpperCAmelCase						:				Dict	    =					parse.urljoin(self.domain		,     lowerCamelCase__       )
													self.urls.append(lowerCamelCase__       )






def        __lowerCAmelCase       (__lowerCAmelCase      ):
		return ".".join(get_sub_domain_name(__lowerCAmelCase      ).split("."      )[-2:]      )






def        __lowerCAmelCase       (__lowerCAmelCase      ):
		return parse.urlparse(__lowerCAmelCase      ).netloc






def        __lowerCAmelCase       (__lowerCAmelCase = "https://github.com"      ):
		_UpperCAmelCase						:				List[str]	    =					get_domain_name(__lowerCAmelCase      )

		# Initialize the parser
		_UpperCAmelCase						:				int	    =					Parser(__lowerCAmelCase      )

		try:
				# Open URL
				_UpperCAmelCase						:				Any	    =					requests.get(__lowerCAmelCase      )

				# pass the raw HTML to the parser to get links
				parser.feed(r.text      )

				# Get links and loop through
				_UpperCAmelCase						:				Any	    =					set()
				for link in parser.urls:
						# open URL.
						# read = requests.get(link)
						try:
								_UpperCAmelCase						:				List[str]	    =					requests.get(__lowerCAmelCase      )
								# Get the valid email.
								_UpperCAmelCase						:				Optional[int]	    =					re.findall("[a-zA-Z0-9]+@" + domain					,       read.text      )
								# If not in list then append it.
								for email in emails:
										valid_emails.add(__lowerCAmelCase      )
						except ValueError:
								pass
		except ValueError:
				raise SystemExit(1      )

		# Finally return a sorted list of email addresses with no duplicates.
		return sorted(__lowerCAmelCase      )


if __name__ == "__main__":
						lowerCamelCase__					=   emails_from_url('https://github.com')
						print(F'''{len(emails)} emails found:''')
						print('\n'.join(sorted(emails)))



