clean up state and transition stuff

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1259 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2006-07-09 14:30:56 +00:00
parent 4670c98d1c
commit c0880a046e
5 changed files with 43 additions and 51 deletions

View file

@ -18,12 +18,17 @@ when creating a synapsis:
[] []
>>> n01.receivers == [s0102] >>> n01.receivers == [s0102]
True True
>>> n01.state.level >>> n01.state.value
1.0 1.0
>>> n02.state.level >>> n02.state.value
1.0 1.0
When we trigger a neuron, all its receivers get triggered so that the
receivers' state is updated:
>>> n01.trigger() >>> n01.trigger()
>>> n02.state.level >>> n01.state.value
1.0
>>> n02.state.value
2.0 2.0

View file

@ -32,8 +32,7 @@ class ISynapsis(Interface):
sender = Attribute("The sender neuron for this synapsis") sender = Attribute("The sender neuron for this synapsis")
reciever = Attribute("The receiver neuron for this synapsis") reciever = Attribute("The receiver neuron for this synapsis")
transformation = Attribute("A transformation is used to transform " transition = Attribute("A transition changes the sender neuron's state.")
"the sender neuron's state.")
class INeuron(Interface): class INeuron(Interface):
@ -43,13 +42,10 @@ class INeuron(Interface):
senders = Attribute("The sender synapses") senders = Attribute("The sender synapses")
receivers = Attribute("The receiver synapses") receivers = Attribute("The receiver synapses")
stateMerger = Attribute("Merges a state with a list of other states "
"in order to create a new state.")
def trigger(): def trigger():
""" Notifies the neuron that something has happened. This method """ Notifies the neuron that something has happened. This method
should get the transformed states from all sender synapses executes all transitions from all sender synapses in order to
and merge them in order to calculate the neuron's new state; calculate the neuron's new state;
then it should call the trigger() method on all downstream then it should call the trigger() method on all downstream
(receiver)neurons. (receiver)neurons.
In addition it may perform side effects like changing In addition it may perform side effects like changing
@ -64,16 +60,9 @@ class IState(Interface):
""" """
class IStateTransformation(Interface): class ITransition(Interface):
def transform(state): def execute(state):
""" Transform state to a new state value and return it. """ Transform state to a new state value and return it.
""" """
class IStateMerger(Interface):
def merge(state, senderStates):
""" Transform state to a new value by taking into account a list
of sender neurons' states. This modifies state in-place.
"""

View file

@ -24,46 +24,47 @@ $Id: type.py 1129 2006-03-19 09:46:08Z helmutm $
from zope.interface import implements from zope.interface import implements
from cybertools.brain.interfaces import INeuron, ISynapsis from cybertools.brain.interfaces import INeuron, ISynapsis
from cybertools.brain.state import State, StateMerger, StateTransformation from cybertools.brain.state import State, Transition
class Synapsis(object): class Synapsis(object):
""" A synapsis connects two neurons. """ A synapsis connects two neurons.
""" """
implements(ISynapsis)
sender = None sender = None
reciever = None reciever = None
transformation = None transition = None
def __init__(self, sender, receiver): def __init__(self, sender, receiver):
self.sender = sender self.sender = sender
sender.receivers.append(self) sender.receivers.append(self)
self.receiver = receiver self.receiver = receiver
receiver.senders.append(self) receiver.senders.append(self)
self.transformation = StateTransformation(self) self.transition = Transition(self)
def transformSenderState(self):
return self.transformation.transform(self.sender.state)
class Neuron(object): class Neuron(object):
implements(INeuron)
state = None state = None
stateMerger = None
def __init__(self): def __init__(self):
self.senders = [] self.senders = []
self.receivers = [] self.receivers = []
self.state = State() self.state = State()
self.stateMerger = StateMerger(self)
self.active = False self.active = False
def trigger(self): def trigger(self):
if self.active: # avoid cycles if self.active: # avoid cycles
return return
self.active = True self.active = True
senderStates = [s.transformSenderState() for s in self.senders] state = self.state
self.stateMerger.merge(self.state, senderStates) for s in self.senders:
state = s.transition.execute(state)
self.state = state
for r in self.receivers: for r in self.receivers:
r.receiver.trigger() r.receiver.trigger()
self.active = False self.active = False

View file

@ -17,38 +17,34 @@
# #
""" """
Base classes for state and state manipulations. Base classes for state and state manipulations using a float-based state.
$Id$ $Id$
""" """
from zope.interface import implements from zope.interface import implements
from cybertools.brain.interfaces import IState, IStateMerger, IStateTransformation from cybertools.brain.interfaces import IState, ITransition
class State(object): class State(object):
""" The state of a neuron. """ The state of a neuron.
""" """
def __init__(self, level=1.0): implements(IState)
self.level = level
def __init__(self, value=1.0):
self.value = value
class StateTransformation(object): class Transition(object):
implements(ITransition)
def __init__(self, synapsis, factor=1.0): def __init__(self, synapsis, factor=1.0):
self.synapsis = synapsis self.synapsis = synapsis
self.factor = factor self.factor = factor
def transform(self, state): def execute(self, state):
return State(state.level * self.factor) return State(state.value + self.synapsis.sender.state.value * self.factor)
class StateMerger(object):
def __init__(self, neuron):
self.neuron = neuron
def merge(self, state, senderStates):
state.level += sum(st.level for st in senderStates)

View file

@ -1,28 +1,29 @@
# $Id$ # $Id$
import unittest import unittest, doctest
from zope.testing.doctestunit import DocFileSuite from zope.testing.doctestunit import DocFileSuite
from zope.interface.verify import verifyClass from zope.interface.verify import verifyClass
from zope.interface import implements
from cybertools.brain.interfaces import INeuron, ISynapsis from cybertools.brain.interfaces import INeuron, ISynapsis
from cybertools.brain.interfaces import IState, IStateTransformation, IStateMerger from cybertools.brain.interfaces import IState, ITransition
from cybertools.brain.neuron import Neuron, Synapsis from cybertools.brain.neuron import Neuron, Synapsis
from cybertools.brain.state import State, StateTransformation, StateMerger from cybertools.brain.state import State, Transition
class TestBrain(unittest.TestCase): class TestBrain(unittest.TestCase):
"Basic tests for the brain package." "Basic tests for the brain package."
def testInterfaces(self): def testInterfaces(self):
pass verifyClass(INeuron, Neuron)
def test_suite(): def test_suite():
flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
return unittest.TestSuite(( return unittest.TestSuite((
unittest.makeSuite(TestBrain), unittest.makeSuite(TestBrain),
DocFileSuite('README.txt'), DocFileSuite('README.txt',
)) optionflags=flags,),
))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main(defaultTest='test_suite') unittest.main(defaultTest='test_suite')