Source code for psychsim.pwl.keys
# Special keys
CONSTANT = ''
VALUE = '__VALUE__'
WORLD = '__WORLD__'
ACTION = '__ACTION__'
REWARD = '__REWARD__'
MODEL = '__MODEL__'
TURN = '__TURN__'
[docs]def stateKey(name,feature,future=False):
"""
:param future: if C{True}, then this refers to the projected value of this feature (default is C{False})
:type future: bool
:returns: a key representation of a given entity's state feature
:rtype: str
"""
assert isinstance(future,bool),'Future flag is non-boolean: %s' % (future)
if future:
return stateKey(name,feature)+"'"
elif name is None:
return feature
else:
return '%s\'s %s' % (name,feature)
TERMINATED = stateKey(WORLD,'__END__')
[docs]def isStateKey(key):
"""
:returns: C{True} iff this key refers to a state feature
:rtype: bool
"""
return '\'s ' in key
[docs]def state2feature(key):
"""
:returns: the feature string from the given key
:rtype: str
"""
index = key.find("'")
if index < 0:
return key
else:
return key[index+3:]
[docs]def state2agent(key):
"""
:returns: the agent name from the given key
:rtype: str
"""
index = key.find("'")
if index < 0:
return None
else:
return key[:index]
[docs]def state2tuple(key):
"""
:returns: the separated agent name and feature from the given key
:rtype: (str,str)
"""
index = key.find("'")
if index < 0:
return None
else:
return key[:index],key[index+3:]
[docs]def makePresent(key):
"""
:returns: a reference to the given state features' current value
:rtype: str
"""
if isinstance(key,set):
return {makePresent(k) for k in key}
elif key[-1] == "'":
return key[:-1]
else:
return key
[docs]def makeFuture(key):
"""
:returns: a reference to the given state features' projected future value
:rtype: str
"""
if key[-1] == "'":
raise ValueError('%s is already a future key' % (key))
else:
return key+"'"
[docs]def isFuture(key):
return len(key) > 0 and key[-1] == "'"
[docs]def turnKey(name):
return stateKey(name,TURN)
[docs]def isTurnKey(key):
return key[-(len(TURN)+3):] == '\'s %s' % (TURN)
[docs]def turn2name(key):
return key[:-(len(TURN)+3)]
[docs]def actionFieldKey(feature):
return '__action__%s__' % (feature)
[docs]def actionKey(name,future=False):
return stateKey(name,ACTION,future)
[docs]def isActionKey(key):
return isStateKey(key) and state2feature(key) == ACTION
[docs]def modelKey(name,future=False):
return stateKey(name,MODEL,future)
[docs]def isModelKey(key):
return key[-(len(MODEL)+3):] == '\'s %s' % (MODEL)
[docs]def model2name(key):
return key[:-(len(MODEL)+3)]
[docs]def isSpecialKey(key):
"""
:return: True iff the given key is a state key and its feature is a reserved name (e.g., for a turn, model, reward, etc)
"""
return isStateKey(key) and state2feature(key)[:2] == '__'
[docs]def binaryKey(subj,obj,relation):
return '%s %s -- %s' % (subj,relation,obj)
[docs]def isBinaryKey(key):
return ' -- ' in key
[docs]def key2relation(key):
sides = key.split(' -- ')
first = sides[0].split()
return {'subject': ' '.join(first[:-1]),
'object': sides[1],
'relation': first[-1]}
[docs]def likesKey(subj,obj):
return binaryKey(subj,obj,'likes')
[docs]def isLikesKey(key):
return ' likes -- ' in key
[docs]def rewardKey(name,future=False):
return stateKey(name,REWARD,future)
[docs]def isRewardKey(key):
return isStateKey(key) and state2feature(key) == REWARD
[docs]def beliefKey(name,key):
return '%s(%s)' % (name,key)
[docs]def isBeliefKey(key):
return '(' in key
[docs]def belief2believer(key):
return key[:key.index('(')]
[docs]def belief2key(key):
return key[key.index('(')+1:-1]
[docs]def escapeKey(key):
"""
:returns: filename-ready version of the key
"""
if not isinstance(key,str):
key = str(key)
if isBeliefKey(key):
believer = belief2believer(key)
subkey = belief2key(key)
return 'Belief(%s)Of%s' % (escapeKey(subkey),believer)
future = isFuture(key)
if future:
key = makePresent(key)
if isStateKey(key):
agent = state2agent(key)
if agent == WORLD:
name = state2feature(key)
else:
name = '%sOf%s' % (state2feature(key),agent)
else:
name = key
return name.replace(' ','')