def resolve_functions(tf_graph): def toposort(data): while True: ordered = set(item for item, dep in data.items() if not dep) if not ordered: break yield ordered data = { item: (dep - ordered) for item, dep in data.items() if item not in ordered } _, _, _, _, _, functions = tflist_to_onnx(tf_graph, {}) data = {} for k, fdef in tf_graph._functions.items(): # pylint: disable=protected-access input_shapes = functions.get(k) fdef = fdef.definition if input_shapes and len(fdef.signature.input_arg) < len(input_shapes): input_shapes = input_shapes[:len(fdef.signature.input_arg)] try: func = function_def_to_graph(fdef, input_shapes=input_shapes) except: # pylint: disable=bare-except # if there is a missmatch between caller and function use the functions shape logger.warning("shape missmatch between caller and function: %s", k) func = function_def_to_graph(fdef) _FUNCTIONS[k] = func _, _, _, _, _, tfunctions = tflist_to_onnx(func, {}) functions.update(tfunctions) data[k] = set(tfunctions.keys()) result = [] for d in toposort(data): result.extend(list(d)) return [_FUNCTIONS[k] for k in result]
def resolve_functions(tf_graph): def toposort(data): while True: ordered = set(item for item, dep in data.items() if not dep) if not ordered: break yield ordered data = {item: (dep - ordered) for item, dep in data.items() if item not in ordered} _, _, _, _, _, functions = tflist_to_onnx(tf_graph, {}) data = {} for k, fdef in tf_graph._functions.items(): # pylint: disable=protected-access input_shapes = functions.get(k) fdef = fdef.definition if input_shapes and len(fdef.signature.input_arg) < len(input_shapes): input_shapes = input_shapes[:len(fdef.signature.input_arg)] func = function_def_to_graph.function_def_to_graph(fdef, input_shapes=input_shapes) _FUNCTIONS[k] = func _, _, _, _, _, tfunctions = tflist_to_onnx(func, {}) functions.update(tfunctions) data[k] = set(tfunctions.keys()) result = [] for d in toposort(data): result.extend(list(d)) return [_FUNCTIONS[k] for k in result]