Soar / pysoarlib /SoarWME.py
bryan-stearns
Attempting to fix permissions issue
2b7acff
raw
history blame
2.7 kB
"""
This module defines a utility class called SoarWME
which wraps SML code for adding/removing Soar Working Memory Elements (WME)
"""
from .WMInterface import WMInterface
class SoarWME(WMInterface):
""" Wrapper for a single Soar Working Memory Element with a primitive value
It can wrap an int, float, or string type
An instance is not directly tied to an SML wme,
the user decides how and when soar's working memory is modified
So you can change the value anytime (asynchronously to soar)
And then modify working memory via add_to_wm, update_wm, and remove_from_wm
during an agent callback (like BEFORE_INPUT_PHASE)
"""
def __init__(self, att, val):
""" Initializes the wme, but does not add to working memory yet
:param att: The wme's attribute
:type att: str
:param val: The wme's value, any of the 3 main primitive types
:type val: int, float, or str
"""
WMInterface.__init__(self)
self.att = att
self.val = val
self.wme = None
self.changed = False
if type(val) == int:
self.create_wme = self._create_int_wme
elif type(val) == float:
self.create_wme = self._create_float_wme
else:
self.create_wme = self._create_string_wme
def get_attr(self):
""" Returns the wme's attribute """
return self.att
def get_value(self):
""" Returns the wme's value """
return self.val
def set_value(self, newval):
""" Set's the wme's value, but also need to call update_wm to change working memory """
if self.val != newval:
self.val = newval
self.changed = True
def __str__(self):
return str(self.val)
### Internal Methods
def _create_int_wme(self, id, att, val):
return id.CreateIntWME(att, val)
def _create_float_wme(self, id, att, val):
return id.CreateFloatWME(att, val)
def _create_string_wme(self, id, att, val):
return id.CreateStringWME(att, str(val))
def _add_to_wm_impl(self, parent_id):
""" Creates a wme in soar's working memory rooted at the given parent_id """
self.wme = self.create_wme(parent_id, self.att, self.val)
def _update_wm_impl(self):
""" If the value has changed, will update soar's working memory with the new value """
if self.changed:
self.wme.Update(self.val)
self.changed = False
def _remove_from_wm_impl(self):
""" Will remove the wme from soar's working memory """
self.wme.DestroyWME()
self.wme = None