
"""simple docstring"""


from __future__ import annotations

import math






def    _snake_case					(		snake_case__ :  Optional[int]						,   snake_case__ :  Any  ):
	if len(__lowerCAmelCase  ) != 2 or len(a[0]  ) != 2 or len(__lowerCAmelCase  ) != 2 or len(b[0]  ) != 2:
		raise Exception('Matrices are not 2x2'  )
	A     = [
	    [a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1]],
	    [a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]],
	]
	return new_matrix






def    _snake_case					(		snake_case__ :  Tuple						,   snake_case__ :  str  ):
	return [
	    [matrix_a[row][col] + matrix_b[row][col] for col in range(len(matrix_a[row]  )  )]
	    for row in range(len(__lowerCAmelCase  )  )
	]






def    _snake_case					(		snake_case__ :  List[Any]						,   snake_case__ :  Optional[Any]  ):
	return [
	    [matrix_a[row][col] - matrix_b[row][col] for col in range(len(matrix_a[row]  )  )]
	    for row in range(len(__lowerCAmelCase  )  )
	]






def    _snake_case					(		snake_case__ :  int  ):
	if len(__lowerCAmelCase  ) % 2 != 0 or len(a[0]  ) % 2 != 0:
		raise Exception('Odd matrices are not supported!'  )

	A     = len(__lowerCAmelCase  )
	A     = matrix_length // 2

	A     = [[a[i][j] for j in range(__lowerCAmelCase						,   __lowerCAmelCase  )] for i in range(__lowerCAmelCase  )]
	A     = [
	    [a[i][j] for j in range(__lowerCAmelCase						,   __lowerCAmelCase  )] for i in range(__lowerCAmelCase						,   __lowerCAmelCase  )
	]

	A     = [[a[i][j] for j in range(__lowerCAmelCase  )] for i in range(__lowerCAmelCase  )]
	A     = [[a[i][j] for j in range(__lowerCAmelCase  )] for i in range(__lowerCAmelCase						,   __lowerCAmelCase  )]

	return top_left, top_right, bot_left, bot_right






def    _snake_case					(		snake_case__ :  Union[str, Any]  ):
	return len(__lowerCAmelCase  ), len(matrix[0]  )






def    _snake_case					(		snake_case__ :  Dict  ):
	print('\n'.join(str(__lowerCAmelCase  ) for line in matrix  )  )






def    _snake_case					(		snake_case__ :  Dict						,   snake_case__ :  List[Any]  ):
	if matrix_dimensions(__lowerCAmelCase  ) == (2, 2):
		return default_matrix_multiplication(__lowerCAmelCase						,   __lowerCAmelCase  )

	A     = split_matrix(__lowerCAmelCase  )
	A     = split_matrix(__lowerCAmelCase  )

	A     = actual_strassen(__lowerCAmelCase						,   matrix_subtraction(__lowerCAmelCase						,   __lowerCAmelCase  )  )
	A     = actual_strassen(matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )						,   __lowerCAmelCase  )
	A     = actual_strassen(matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )						,   __lowerCAmelCase  )
	A     = actual_strassen(__lowerCAmelCase						,   matrix_subtraction(__lowerCAmelCase						,   __lowerCAmelCase  )  )
	A     = actual_strassen(matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )						,   matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )  )
	A     = actual_strassen(matrix_subtraction(__lowerCAmelCase						,   __lowerCAmelCase  )						,   matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )  )
	A     = actual_strassen(matrix_subtraction(__lowerCAmelCase						,   __lowerCAmelCase  )						,   matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )  )

	A     = matrix_addition(matrix_subtraction(matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )						,   __lowerCAmelCase  )						,   __lowerCAmelCase  )
	A     = matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )
	A     = matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )
	A     = matrix_subtraction(matrix_subtraction(matrix_addition(__lowerCAmelCase						,   __lowerCAmelCase  )						,   __lowerCAmelCase  )						,   __lowerCAmelCase  )

	# construct the new matrix from our 4 quadrants
	A     = []
	for i in range(len(__lowerCAmelCase  )  ):
		new_matrix.append(top_left[i] + top_right[i]  )
	for i in range(len(__lowerCAmelCase  )  ):
		new_matrix.append(bot_left[i] + bot_right[i]  )
	return new_matrix






def    _snake_case					(		snake_case__ :  Dict						,   snake_case__ :  Optional[int]  ):
	if matrix_dimensions(__lowerCAmelCase  )[1] != matrix_dimensions(__lowerCAmelCase  )[0]:
		A     = (
		    'Unable to multiply these matrices, please check the dimensions.\n'
		    F'Matrix A: {matrixa}\n'
		    F'Matrix B: {matrixa}'
		)
		raise Exception(__lowerCAmelCase  )
	A     = matrix_dimensions(__lowerCAmelCase  )
	A     = matrix_dimensions(__lowerCAmelCase  )

	if dimensiona[0] == dimensiona[1] and dimensiona[0] == dimensiona[1]:
		return [matrixa, matrixa]

	A     = max(*__lowerCAmelCase						,   *__lowerCAmelCase  )
	A     = int(math.pow(2						,   math.ceil(math.loga(__lowerCAmelCase  )  )  )  )
	A     = matrixa
	A     = matrixa

	# Adding zeros to the matrices so that the arrays dimensions are the same and also
	# power of 2
	for i in range(0						,   __lowerCAmelCase  ):
		if i < dimensiona[0]:
			for _ in range(dimensiona[1]						,   __lowerCAmelCase  ):
				new_matrixa[i].append(0  )
		else:
			new_matrixa.append([0] * maxim  )
		if i < dimensiona[0]:
			for _ in range(dimensiona[1]						,   __lowerCAmelCase  ):
				new_matrixa[i].append(0  )
		else:
			new_matrixa.append([0] * maxim  )

	A     = actual_strassen(__lowerCAmelCase						,   __lowerCAmelCase  )

	# Removing the additional zeros
	for i in range(0						,   __lowerCAmelCase  ):
		if i < dimensiona[0]:
			for _ in range(dimensiona[1]						,   __lowerCAmelCase  ):
				final_matrix[i].pop()
		else:
			final_matrix.pop()
	return final_matrix


if __name__ == "__main__":
		_lowercase				 =					[
		    [2, 3, 4, 5],
		    [6, 4, 3, 1],
		    [2, 3, 6, 7],
		    [3, 1, 2, 4],
		    [2, 3, 4, 5],
		    [6, 4, 3, 1],
		    [2, 3, 6, 7],
		    [3, 1, 2, 4],
		    [2, 3, 4, 5],
		    [6, 2, 3, 1],
		]
		_lowercase				 =					[[0, 2, 1, 1], [16, 2, 3, 3], [2, 2, 7, 7], [13, 11, 22, 4]]
		print(strassen(matrixa, matrixa))




from __future__ import annotations

import numpy as np

def        __a			(   __lowerCAmelCase   )     ->     Optional[Any]:
					return np.maximum(0      ,	__lowerCAmelCase   )


if __name__ == "__main__":
			print(np.array(relu([-1, 0, 5])))  # --> [0, 0, 5]