




from math import pi, sqrt, tan







def 			lowerCamelCase_		(       UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if side_length < 0:
								raise ValueError('surface_area_cube() only accepts non-negative values'      )
				return 6 * side_length**2







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if length < 0 or breadth < 0 or height < 0:
								raise ValueError('surface_area_cuboid() only accepts non-negative values'      )
				return 2 * ((length * breadth) + (breadth * height) + (length * height))







def 			lowerCamelCase_		(       UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if radius < 0:
								raise ValueError('surface_area_sphere() only accepts non-negative values'      )
				return 4 * pi * radius**2







def 			lowerCamelCase_		(       UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if radius < 0:
								raise ValueError('surface_area_hemisphere() only accepts non-negative values'      )
				return 3 * pi * radius**2







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if radius < 0 or height < 0:
								raise ValueError('surface_area_cone() only accepts non-negative values'      )
				return pi * radius * (radius + (height**2 + radius**2) ** 0.5)







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if radius_a < 0 or radius_a < 0 or height < 0:
								raise ValueError(
								    'surface_area_conical_frustum() only accepts non-negative values'      )
				__lowerCamelCase		       =    (height**2 + (radius_a - radius_a) ** 2) ** 0.5
				return pi * ((slant_height * (radius_a + radius_a)) + radius_a**2 + radius_a**2)







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if radius < 0 or height < 0:
								raise ValueError('surface_area_cylinder() only accepts non-negative values'      )
				return 2 * pi * radius * (height + radius)







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if torus_radius < 0 or tube_radius < 0:
								raise ValueError('surface_area_torus() only accepts non-negative values'      )
				if torus_radius < tube_radius:
								raise ValueError(
								    'surface_area_torus() does not support spindle or self intersecting tori'      )
				return 4 * pow(UpperCamelCase__ ,     2      ) * torus_radius * tube_radius







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if length < 0 or width < 0:
								raise ValueError('area_rectangle() only accepts non-negative values'      )
				return length * width







def 			lowerCamelCase_		(       UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if side_length < 0:
								raise ValueError('area_square() only accepts non-negative values'      )
				return side_length**2







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if base < 0 or height < 0:
								raise ValueError('area_triangle() only accepts non-negative values'      )
				return (base * height) / 2







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if sidea < 0 or sidea < 0 or sidea < 0:
								raise ValueError('area_triangle_three_sides() only accepts non-negative values'      )
				elif sidea + sidea < sidea or sidea + sidea < sidea or sidea + sidea < sidea:
								raise ValueError('Given three sides do not form a triangle'      )
				__lowerCamelCase		       =    (sidea + sidea + sidea) / 2
				__lowerCamelCase		       =    sqrt(
				    semi_perimeter
				    * (semi_perimeter - sidea)
				    * (semi_perimeter - sidea)
				    * (semi_perimeter - sidea)      )
				return area







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if base < 0 or height < 0:
								raise ValueError('area_parallelogram() only accepts non-negative values'      )
				return base * height







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if basea < 0 or basea < 0 or height < 0:
								raise ValueError('area_trapezium() only accepts non-negative values'      )
				return 1 / 2 * (basea + basea) * height







def 			lowerCamelCase_		(       UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if radius < 0:
								raise ValueError('area_circle() only accepts non-negative values'      )
				return pi * radius**2







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if radius_x < 0 or radius_y < 0:
								raise ValueError('area_ellipse() only accepts non-negative values'      )
				return pi * radius_x * radius_y







def 			lowerCamelCase_		(       UpperCamelCase__				:      float ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if diagonal_a < 0 or diagonal_a < 0:
								raise ValueError('area_rhombus() only accepts non-negative values'      )
				return 1 / 2 * diagonal_a * diagonal_a







def 			lowerCamelCase_		(       UpperCamelCase__				:      int ,     UpperCamelCase__				:      float      )     ->       float:





				"""simple docstring"""


				if not isinstance(UpperCamelCase__ ,     UpperCamelCase__      ) or sides < 3:
								raise ValueError(
								    'area_reg_polygon() only accepts integers greater than or \
equal to three as number of sides'      )
				elif length < 0:
								raise ValueError(
								    'area_reg_polygon() only accepts non-negative values as \
length of a side'      )
				return (sides * length**2) / (4 * tan(pi / sides      ))
				return (sides * length**2) / (4 * tan(pi / sides      ))


if __name__ == "__main__":
					import doctest

					doctest.testmod(verbose=True)  # verbose so we can see methods missing tests

					print("[DEMO] Areas of various geometric shapes: \n")
					print(f'''Rectangle: {area_rectangle(10, 20) = }''')
					print(f'''Square: {area_square(10) = }''')
					print(f'''Triangle: {area_triangle(10, 10) = }''')
					print(f'''Triangle: {area_triangle_three_sides(5, 12, 13) = }''')
					print(f'''Parallelogram: {area_parallelogram(10, 20) = }''')
					print(f'''Rhombus: {area_rhombus(10, 20) = }''')
					print(f'''Trapezium: {area_trapezium(10, 20, 30) = }''')
					print(f'''Circle: {area_circle(20) = }''')
					print(f'''Ellipse: {area_ellipse(10, 20) = }''')
					print("\nSurface Areas of various geometric shapes: \n")
					print(f'''Cube: {surface_area_cube(20) = }''')
					print(f'''Cuboid: {surface_area_cuboid(10, 20, 30) = }''')
					print(f'''Sphere: {surface_area_sphere(20) = }''')
					print(f'''Hemisphere: {surface_area_hemisphere(20) = }''')
					print(f'''Cone: {surface_area_cone(10, 20) = }''')
					print(f'''Conical Frustum: {surface_area_conical_frustum(10, 20, 30) = }''')
					print(f'''Cylinder: {surface_area_cylinder(10, 20) = }''')
					print(f'''Torus: {surface_area_torus(20, 10) = }''')
					print(f'''Equilateral Triangle: {area_reg_polygon(3, 10) = }''')
					print(f'''Square: {area_reg_polygon(4, 10) = }''')
					print(f'''Reqular Pentagon: {area_reg_polygon(5, 10) = }''')




"""simple docstring"""




import argparse
import json
import os

from tensorflow.core.protobuf.saved_model_pba import SavedModel


# All paths are set with the intent you should run this script from the root of the repo with the command
# python utils/check_copies.py
UpperCAmelCase__      :    List[str]    							= '.'

# Internal TensorFlow ops that can be safely ignored (mostly specific to a saved model)
UpperCAmelCase__      :    List[Any]    							= [
    'Assert',
    'AssignVariableOp',
    'EmptyTensorList',
    'MergeV2Checkpoints',
    'ReadVariableOp',
    'ResourceGather',
    'RestoreV2',
    'SaveV2',
    'ShardedFilename',
    'StatefulPartitionedCall',
    'StaticRegexFullMatch',
    'VarHandleOp',
]

def lowercase_  (   _snake_case   ,_snake_case   ,_snake_case						):
							SCREAMING_SNAKE_CASE__						:       List[str]           =   SavedModel()
							SCREAMING_SNAKE_CASE__						:       Dict           =   []

							with open(os.path.join(_snake_case   ,"""utils"""   ,"""tf_ops"""   ,"""onnx.json"""						)						) as f:
														SCREAMING_SNAKE_CASE__						:       Any           =   json.load(_snake_case						)["""opsets"""]

							for i in range(1   ,opset + 1						):
														onnx_ops.extend(onnx_opsets[str(_snake_case						)]						)

							with open(_snake_case   ,"""rb"""						) as f:
														saved_model.ParseFromString(f.read()						)

							SCREAMING_SNAKE_CASE__						:       List[str]           =   set()

							# Iterate over every metagraph in case there is more than one (a saved model can contain multiple graphs)
							for meta_graph in saved_model.meta_graphs:
														# Add operations in the graph definition
														model_op_names.update(node.op for node in meta_graph.graph_def.node						)

														# Go through the functions in the graph definition
														for func in meta_graph.graph_def.library.function:
																					# Add operations in each function
																					model_op_names.update(node.op for node in func.node_def						)

    # Convert to list, sorted if you want
							SCREAMING_SNAKE_CASE__						:       int           =   sorted(_snake_case						)
							SCREAMING_SNAKE_CASE__						:       Optional[Any]           =   []

							for op in model_op_names:
														if op not in onnx_ops and op not in INTERNAL_OPS:
																					incompatible_ops.append(_snake_case						)

							if strict and len(_snake_case						) > 0:
														raise Exception(f'''Found the following incompatible ops for the opset {opset}:\n''' + incompatible_ops						)
							elif len(_snake_case						) > 0:
														print(f'''Found the following incompatible ops for the opset {opset}:'''						)
														print(*_snake_case   ,sep="""\n"""						)
							else:
														print(f'''The saved model {saved_model_path} can properly be converted with ONNX.'''						)


if __name__ == "__main__":
					UpperCAmelCase__      :    Optional[int]    							= argparse.ArgumentParser()
					parser.add_argument('--saved_model_path', help='Path of the saved model to check (the .pb file).')
					parser.add_argument(
					    '--opset', default=1_2, type=int, help='The ONNX opset against which the model has to be tested.'
					)
					parser.add_argument(
					    '--framework', choices=['onnx'], default='onnx', help='Frameworks against which to test the saved model.'
					)
					parser.add_argument(
					    '--strict', action='store_true', help='Whether make the checking strict (raise errors) or not (raise warnings)'
					)
					UpperCAmelCase__      :    Dict    							= parser.parse_args()

					if args.framework == "onnx":
										onnx_compliancy(args.saved_model_path, args.strict, args.opset)




