





"""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
a		:				Optional[int]  			=    '''.'''

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






def    _SCREAMING_SNAKE_CASE	(			_lowercase		:					Dict					, _lowercase		:					Tuple					, _lowercase		:					List[str]      )				->Union[str, Any]:






	'''simple docstring'''






	a   :	Dict			=       SavedModel()
	a   :	Dict			=       []

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

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

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

	a   :	Any			=       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
	a   :	Tuple			=       sorted(_lowercase      )
	a   :	str			=       []

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

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


if __name__ == "__main__":
	a		:				Any  			=    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)'''
	)
	a		:				Union[str, Any]  			=    parser.parse_args()

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









"""simple docstring"""




import unittest

from diffusers.pipelines.pipeline_utils import is_safetensors_compatible


class  __UpperCamelCase       (		unittest.TestCase		):






							def 					__a     (     self   )			->				Optional[Any]:
								a   :	Optional[int]			=       [
								    "safety_checker/pytorch_model.bin",
								    "safety_checker/model.safetensors",
								    "vae/diffusion_pytorch_model.bin",
								    "vae/diffusion_pytorch_model.safetensors",
								    "text_encoder/pytorch_model.bin",
								    "text_encoder/model.safetensors",
								    "unet/diffusion_pytorch_model.bin",
								    "unet/diffusion_pytorch_model.safetensors",
								]
								self.assertTrue(is_safetensors_compatible(lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				Optional[Any]:
								a   :	str			=       [
								    "unet/diffusion_pytorch_model.bin",
								    "unet/diffusion_pytorch_model.safetensors",
								]
								self.assertTrue(is_safetensors_compatible(lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				Dict:
								a   :	List[str]			=       [
								    "safety_checker/pytorch_model.bin",
								    "safety_checker/model.safetensors",
								    "vae/diffusion_pytorch_model.bin",
								    "vae/diffusion_pytorch_model.safetensors",
								    "text_encoder/pytorch_model.bin",
								    "text_encoder/model.safetensors",
								    "unet/diffusion_pytorch_model.bin",
								    # Removed: 'unet/diffusion_pytorch_model.safetensors',
								]
								self.assertFalse(is_safetensors_compatible(lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				List[Any]:
								a   :	Optional[Any]			=       [
								    "text_encoder/pytorch_model.bin",
								    "text_encoder/model.safetensors",
								]
								self.assertTrue(is_safetensors_compatible(lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				Tuple:
								a   :	Tuple			=       [
								    "safety_checker/pytorch_model.bin",
								    "safety_checker/model.safetensors",
								    "vae/diffusion_pytorch_model.bin",
								    "vae/diffusion_pytorch_model.safetensors",
								    "text_encoder/pytorch_model.bin",
								    # Removed: 'text_encoder/model.safetensors',
								    "unet/diffusion_pytorch_model.bin",
								    "unet/diffusion_pytorch_model.safetensors",
								]
								self.assertFalse(is_safetensors_compatible(lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				Dict:
								a   :	Dict			=       [
								    "safety_checker/pytorch_model.fp16.bin",
								    "safety_checker/model.fp16.safetensors",
								    "vae/diffusion_pytorch_model.fp16.bin",
								    "vae/diffusion_pytorch_model.fp16.safetensors",
								    "text_encoder/pytorch_model.fp16.bin",
								    "text_encoder/model.fp16.safetensors",
								    "unet/diffusion_pytorch_model.fp16.bin",
								    "unet/diffusion_pytorch_model.fp16.safetensors",
								]
								a   :	Dict			=       "fp16"
								self.assertTrue(is_safetensors_compatible(lowerCAmelCase__   ,      variant=lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				List[str]:
								a   :	List[Any]			=       [
								    "unet/diffusion_pytorch_model.fp16.bin",
								    "unet/diffusion_pytorch_model.fp16.safetensors",
								]
								a   :	Any			=       "fp16"
								self.assertTrue(is_safetensors_compatible(lowerCAmelCase__   ,      variant=lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				int:
								# pass variant but use the non-variant filenames
								a   :	int			=       [
								    "unet/diffusion_pytorch_model.bin",
								    "unet/diffusion_pytorch_model.safetensors",
								]
								a   :	Tuple			=       "fp16"
								self.assertTrue(is_safetensors_compatible(lowerCAmelCase__   ,      variant=lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				str:
								a   :	str			=       [
								    "safety_checker/pytorch_model.fp16.bin",
								    "safety_checker/model.fp16.safetensors",
								    "vae/diffusion_pytorch_model.fp16.bin",
								    "vae/diffusion_pytorch_model.fp16.safetensors",
								    "text_encoder/pytorch_model.fp16.bin",
								    "text_encoder/model.fp16.safetensors",
								    "unet/diffusion_pytorch_model.fp16.bin",
								    # Removed: 'unet/diffusion_pytorch_model.fp16.safetensors',
								]
								a   :	Any			=       "fp16"
								self.assertFalse(is_safetensors_compatible(lowerCAmelCase__   ,      variant=lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				str:
								a   :	Union[str, Any]			=       [
								    "text_encoder/pytorch_model.fp16.bin",
								    "text_encoder/model.fp16.safetensors",
								]
								a   :	str			=       "fp16"
								self.assertTrue(is_safetensors_compatible(lowerCAmelCase__   ,      variant=lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				List[str]:
								# pass variant but use the non-variant filenames
								a   :	Optional[int]			=       [
								    "text_encoder/pytorch_model.bin",
								    "text_encoder/model.safetensors",
								]
								a   :	str			=       "fp16"
								self.assertTrue(is_safetensors_compatible(lowerCAmelCase__   ,      variant=lowerCAmelCase__   )   )






							def 					__a     (     self   )			->				Optional[Any]:
								a   :	Any			=       [
								    "safety_checker/pytorch_model.fp16.bin",
								    "safety_checker/model.fp16.safetensors",
								    "vae/diffusion_pytorch_model.fp16.bin",
								    "vae/diffusion_pytorch_model.fp16.safetensors",
								    "text_encoder/pytorch_model.fp16.bin",
								    # 'text_encoder/model.fp16.safetensors',
								    "unet/diffusion_pytorch_model.fp16.bin",
								    "unet/diffusion_pytorch_model.fp16.safetensors",
								]
								a   :	Optional[int]			=       "fp16"
								self.assertFalse(is_safetensors_compatible(lowerCAmelCase__   ,      variant=lowerCAmelCase__   )   )


