from .WMNode import WMNode def extract_wm_graph(root_id, max_depth=-1): """ Given a soar identifier (root_id), crawls over the children and builds a graph rep for them This will handle cycles, where the same node will be used for each reference to an identifier :param root_id: The sml identifier of the root of the sub-graph :param max_depth: The maximum depth to extract (defaults to unlimited depth) :return a WMNode containing a recursive enumeration of all children reachable from the given root_id Example: Given an identifier with the following wm structure: ( ^id 5 ^volume 23.3 ^predicates ) ( ^predicate red ^predicate cube ^predicate block) Will return the following WMNode: WMNode root_node .id = sml Identifier for .symbol = 'O32' ['id'] = 5 ['volume'] = 23.3 ['predicates'] = WMNode .id = sml Identifier for .symbol = 'P53' ['predicate'] = [ 'red', 'cube', 'block' ] """ root_node = WMNode(root_id) node_map = dict() node_map[root_node.symbol] = root_node root_node._extract_children(max_depth, node_map) return root_node