def _dump_graph(self, graph: fbs.Graph): ''' Process one level of the Graph, descending into any subgraphs when they are found ''' self._dump_initializers(graph) self._dump_nodeargs(graph) print('Nodes:') for i in range(0, graph.NodesLength()): node = graph.Nodes(i) self._dump_node(node) # Read all the attributes for j in range(0, node.AttributesLength()): attr = node.Attributes(j) attr_type = attr.Type() if attr_type == fbs.AttributeType.AttributeType.GRAPH: print( f'## Subgraph for {node.OpType().decode()}.{attr.Name().decode()} ##' ) self._dump_graph(attr.G()) print( f'## End {node.OpType().decode()}.{attr.Name().decode()} Subgraph ##' ) elif attr_type == fbs.AttributeType.AttributeType.GRAPHS: # the ONNX spec doesn't currently define any operators that have multiple graphs in an attribute # so entering this 'elif' isn't currently possible print( f'## Subgraphs for {node.OpType().decode()}.{attr.Name().decode()} ##' ) for k in range(0, attr.GraphsLength()): print(f'## Subgraph {k} ##') self._dump_graph(attr.Graphs(k)) print(f'## End Subgraph {k} ##')
def _process_graph(self, graph: fbs.Graph, outer_scope_value_typeinfo: dict): ''' Process one level of the Graph, descending into any subgraphs when they are found :param outer_scope_value_typeinfo: Outer scope NodeArg dictionary from ancestor graphs ''' # Merge the TypeInfo for all values in this level of the graph with the outer scope value TypeInfo. value_name_to_typeinfo = OrtFormatModelProcessor._setup_type_info( graph, outer_scope_value_typeinfo) for i in range(0, graph.NodesLength()): node = graph.Nodes(i) optype = node.OpType().decode() domain = node.Domain().decode( ) or 'ai.onnx' # empty domain defaults to ai.onnx self._add_required_op(domain, node.SinceVersion(), optype) if self._op_type_processors: self._op_type_processors.process_node(node, value_name_to_typeinfo) # Read all the attributes for j in range(0, node.AttributesLength()): attr = node.Attributes(j) attr_type = attr.Type() if attr_type == fbs.AttributeType.AttributeType.GRAPH: self._process_graph(attr.G(), value_name_to_typeinfo) elif attr_type == fbs.AttributeType.AttributeType.GRAPHS: # the ONNX spec doesn't currently define any operators that have multiple graphs in an attribute # so entering this 'elif' isn't currently possible for k in range(0, attr.GraphsLength()): self._process_graph(attr.Graphs(k), value_name_to_typeinfo)