Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Behavior:
- def observe(self, x):
- """
- Receive an observation from the previous behavior. Return
- a or raise x to next behavior.
- """
- raise NotImplementedError
- def perform(self, a):
- """
- Get back an action from the next behavior. Return a or
- raise x to next behavior.
- """
- raise NotImplementedError
- class Agent(Behavior):
- def __init__(self):
- self._behaviors = []
- def add(self, behavior):
- self._behaviors.add(behavior)
- def observe(self, x):
- return self._simulate(0, x, None)
- def perform(self, a):
- return self._simulate(len(self._behaviors) - 1, None, a)
- def _simulate(self, level, x, a):
- while True:
- if level < 0:
- return a
- if level >= len(self._behaviors):
- raise x
- level, x, a = self._step(level, x, a)
- def _step(self, level, x, a):
- assert (x is None) != (a is None)
- behavior = self._behaviors[level]
- try:
- if x is not None:
- a = behavior.observe(x)
- elif a is not None:
- a = behavior.perform(a)
- x = None
- level -= 1
- except Observation as x:
- a = None
- level += 1
- return level, x, a
Add Comment
Please, Sign In to add comment