"""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
__lowerCAmelCase    :							Optional[Any]													=						"."

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


def 							_UpperCAmelCase		(       lowerCamelCase__			,  lowerCamelCase__			,  lowerCamelCase__     ):





		"""simple docstring"""




		lowerCAmelCase__        =   SavedModel()
		lowerCAmelCase__        =   []

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

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

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

		lowerCAmelCase__        =   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
		lowerCAmelCase__        =   sorted(a__     )
		lowerCAmelCase__        =   []

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

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


if __name__ == "__main__":
			__lowerCAmelCase    :							str													=						argparse.ArgumentParser()
			parser.add_argument("--saved_model_path", help="Path of the saved model to check (the .pb file).")
			parser.add_argument(
			    "--opset", default=12, 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)"
			)
			__lowerCAmelCase    :							int													=						parser.parse_args()

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





"""simple docstring"""




def 							_UpperCAmelCase		(       lowerCamelCase__			,  lowerCamelCase__     ):





		"""simple docstring"""




		while b:
				lowerCAmelCase__   ,					lowerCAmelCase__        =   b, a % b
		return a







def 							_UpperCAmelCase		(       lowerCamelCase__			,  lowerCamelCase__     ):





		"""simple docstring"""




		return a if b == 0 else euclidean_gcd_recursive(lowerCamelCase__			,  a % b     )







def 							_UpperCAmelCase		(       ):





		"""simple docstring"""




		print(f"""euclidean_gcd(3, 5) = {euclidean_gcd(3			,  5     )}"""     )
		print(f"""euclidean_gcd(5, 3) = {euclidean_gcd(5			,  3     )}"""     )
		print(f"""euclidean_gcd(1, 3) = {euclidean_gcd(1			,  3     )}"""     )
		print(f"""euclidean_gcd(3, 6) = {euclidean_gcd(3			,  6     )}"""     )
		print(f"""euclidean_gcd(6, 3) = {euclidean_gcd(6			,  3     )}"""     )

		print(f"""euclidean_gcd_recursive(3, 5) = {euclidean_gcd_recursive(3			,  5     )}"""     )
		print(f"""euclidean_gcd_recursive(5, 3) = {euclidean_gcd_recursive(5			,  3     )}"""     )
		print(f"""euclidean_gcd_recursive(1, 3) = {euclidean_gcd_recursive(1			,  3     )}"""     )
		print(f"""euclidean_gcd_recursive(3, 6) = {euclidean_gcd_recursive(3			,  6     )}"""     )
		print(f"""euclidean_gcd_recursive(6, 3) = {euclidean_gcd_recursive(6			,  3     )}"""     )


if __name__ == "__main__":
			main()




