Soar / pysoarlib /util /update_wm_from_tree.py
bryan-stearns
Attempting to fix permissions issue
2b7acff
from pysoarlib import SoarWME
def update_wm_from_tree(root_id, root_name, input_dict, wme_table):
"""
Recursively update WMEs that have a sub-tree structure rooted at the given identifier.
We scan through the `input_dict`, which represents the input value getters (or further
sub-trees) of the sub-tree root, either adding terminal WMEs as usual or further recursing.
:param root_id: The sml identifier of the root of the sub-tree
:param root_name: The attribute which is the root of this sub-tree
:param input_dict: A dict mapping attributes to getter functions
:param wme_table: A table to lookup and store wme's and identifiers
:return: None
"""
assert isinstance(input_dict, dict), "Should only recurse on dicts!"
for attribute in input_dict.keys():
input_val = input_dict[attribute]
child_name = root_name + "." + attribute
if not callable(input_val):
if child_name not in wme_table:
wme_table[child_name] = root_id.CreateIdWME(attribute)
child_id = wme_table[child_name]
SoarUtils.update_wm_from_tree(child_id, child_name, input_val, wme_table)
continue
value = input_val()
if child_name not in wme_table:
wme_table[child_name] = SoarWME(att=attribute, val=value)
wme = wme_table[child_name]
wme.set_value(value)
wme.update_wm(root_id)