| 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 | |