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 <obj> with the following wm structure: | |
(<obj> ^id 5 ^volume 23.3 ^predicates <preds>) | |
(<preds> ^predicate red ^predicate cube ^predicate block) | |
Will return the following WMNode: | |
WMNode root_node | |
.id = sml Identifier for <obj> | |
.symbol = 'O32' | |
['id'] = 5 | |
['volume'] = 23.3 | |
['predicates'] = WMNode | |
.id = sml Identifier for <preds> | |
.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 | |