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)