


'''simple docstring'''



import argparse
import datetime







def       _UpperCamelCase (						UpperCamelCase__   ):
   UpperCAmelCase__					:   int       				=       {
       """0""": """Sunday""",
       """1""": """Monday""",
       """2""": """Tuesday""",
       """3""": """Wednesday""",
       """4""": """Thursday""",
       """5""": """Friday""",
       """6""": """Saturday""",
   }

   UpperCAmelCase__					:   int       				=       {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 0}

   # Validate
   if not 0 < len(UpperCamelCase__   ) < 1_1:
      raise ValueError("""Must be 10 characters long"""   )

   # Get month
   UpperCAmelCase__					:   Optional[int]       				=       int(date_input[0] + date_input[1]   )
   # Validate
   if not 0 < m < 1_3:
      raise ValueError("""Month must be between 1 - 12"""   )

   UpperCAmelCase__					:   Dict       				=       date_input[2]
   # Validate
   if sep_a not in ["-", "/"]:
      raise ValueError("""Date separator must be '-' or '/'"""   )

   # Get day
   UpperCAmelCase__					:   Optional[int]       				=       int(date_input[3] + date_input[4]   )
   # Validate
   if not 0 < d < 3_2:
      raise ValueError("""Date must be between 1 - 31"""   )

   # Get second separator
   UpperCAmelCase__					:   Tuple       				=       date_input[5]
   # Validate
   if sep_a not in ["-", "/"]:
      raise ValueError("""Date separator must be '-' or '/'"""   )

   # Get year
   UpperCAmelCase__					:   List[Any]       				=       int(date_input[6] + date_input[7] + date_input[8] + date_input[9]   )
   # Arbitrary year range
   if not 4_5 < y < 8_5_0_0:
      raise ValueError(
          """Year out of range. There has to be some sort of limit...right?"""   )

   # Get datetime obj for validation
   UpperCAmelCase__					:   Dict       				=       datetime.date(int(UpperCamelCase__   )	, int(UpperCamelCase__   )	, int(UpperCamelCase__   )   )

   # Start math
   if m <= 2:
      UpperCAmelCase__					:   Optional[int]       				=       y - 1
      UpperCAmelCase__					:   List[Any]       				=       m + 1_2
   # maths var
   UpperCAmelCase__					:   str       				=       int(str(UpperCamelCase__   )[:2]   )
   UpperCAmelCase__					:   Tuple       				=       int(str(UpperCamelCase__   )[2:]   )
   UpperCAmelCase__					:   Dict       				=       int(2.6 * m - 5.39   )
   UpperCAmelCase__					:   str       				=       int(c / 4   )
   UpperCAmelCase__					:   Dict       				=       int(k / 4   )
   UpperCAmelCase__					:   str       				=       int(d + k   )
   UpperCAmelCase__					:   Union[str, Any]       				=       int(t + u + v + x   )
   UpperCAmelCase__					:   Tuple       				=       int(z - (2 * c)   )
   UpperCAmelCase__					:   List[Any]       				=       round(w % 7   )
   # End math

   # Validate math
   if f != convert_datetime_days[dt_ck.weekday()]:
      raise AssertionError("""The date was evaluated incorrectly. Contact developer."""   )

   # Response
   UpperCAmelCase__					:   Dict       				=       f'''Your date {date_input}, is a {days[str(UpperCamelCase__   )]}!'''
   return response


if __name__ == "__main__":
  import doctest

  doctest.testmod()
  __A		=argparse.ArgumentParser(
      description=(
          'Find out what day of the week nearly any date is or was. Enter '
          'date as a string in the mm-dd-yyyy or mm/dd/yyyy format'
      )
  )
  parser.add_argument(
      'date_input', type=str, help='Date as a string (mm-dd-yyyy or mm/dd/yyyy)'
  )
  __A		=parser.parse_args()
  zeller(args.date_input)



'''simple docstring'''



import numpy


class 						_snake_case   :




					def __init__( self							,							_lowerCamelCase							,							_lowerCamelCase):
								UpperCAmelCase__					:   Dict       				=       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__					:   Optional[Any]       				=       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__					:   Optional[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__					:   Any       				=       numpy.random.rand(3							,							1)

								# Real output values provided.
								UpperCAmelCase__					:   Tuple       				=       output_array

								# Predicted output values by the neural network.
								# Predicted_output array initially consists of zeroes.
								UpperCAmelCase__					:   Union[str, Any]       				=       numpy.zeros(output_array.shape)




					def 			snake_case__  ( self):
								UpperCAmelCase__					:   List[str]       				=       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__					:   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 			snake_case__  ( self):
								UpperCAmelCase__					:   Optional[int]       				=       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__					:   str       				=       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__					:   Any       				=       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 			snake_case__  ( self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase):
								for iteration in range(1							,							iterations + 1):
											UpperCAmelCase__					:   Optional[Any]       				=       self.feedforward()
											self.back_propagation()
											if give_loss:
														UpperCAmelCase__					:   str       				=       numpy.mean(numpy.square(output - self.feedforward()))
														print(f'''Iteration {iteration} Loss: {loss}''')




					def 			snake_case__  ( self							,							_lowerCamelCase):
								UpperCAmelCase__					:   List[Any]       				=       input_arr

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

								UpperCAmelCase__					:   List[Any]       				=       sigmoid(
								    numpy.dot(
								        self.layer_between_input_and_first_hidden_layer							,							self.first_hidden_layer_and_second_hidden_layer_weights							,							))

								UpperCAmelCase__					:   Optional[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       _UpperCamelCase (						UpperCamelCase__   ):
			return 1 / (1 + numpy.exp(-value   ))







def       _UpperCamelCase (						UpperCamelCase__   ):
			return (value) * (1 - (value))







def       _UpperCamelCase (						):
			UpperCAmelCase__					:   Union[str, Any]       				=       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__					:   str       				=       numpy.array(([0], [1], [1], [0], [1], [0], [0], [1])	, dtype=numpy.floataa   )

			# Calling neural network class.
			UpperCAmelCase__					:   List[Any]       				=       TwoHiddenLayerNeuralNetwork(
			    input_array=UpperCamelCase__	, output_array=UpperCamelCase__   )

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

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


if __name__ == "__main__":
		example()