cybertools.brain: work in progress
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1272 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									02911c189b
								
							
						
					
					
						commit
						9897a60a73
					
				
					 5 changed files with 40 additions and 54 deletions
				
			
		|  | @ -34,13 +34,21 @@ get triggered so that the receiver neurons' states are updated: | |||
|   >>> n02.getState() | ||||
|   <State 1.0> | ||||
| 
 | ||||
| To allow for concurrent (thread-safe) access to the brain all changes to | ||||
| the neurons' states is under the control of a transaction. If we end the | ||||
| current transaction all state changes will be forgotton: | ||||
| To allow for concurrent access to the brain by different clients | ||||
| simultaneously, the changes to the neurons' states may be under the control of | ||||
| a session: | ||||
| 
 | ||||
|   >>> from cybertools.brain.transaction import endTransaction | ||||
|   >>> endTransaction() | ||||
|   >>> n01.setState(State()) | ||||
|   >>> n02.setState(State()) | ||||
|   >>> from cybertools.brain.session import Session | ||||
|   >>> session = Session() | ||||
|   >>> n01.setState(State(1.0), session) | ||||
|   >>> n01.getState() | ||||
|   <State 0.0> | ||||
|   >>> n01.getState(session) | ||||
|   <State 1.0> | ||||
|   >>> n01.notify(session) | ||||
|   >>> n02.getState() | ||||
|   <State 0.0> | ||||
|   >>> n02.getState(session) | ||||
|   <State 1.0> | ||||
|  |  | |||
|  | @ -34,7 +34,7 @@ class ISynapsis(Interface): | |||
| 
 | ||||
|     transition = Attribute("A transition changes the sender neuron's state.") | ||||
| 
 | ||||
|     def trigger(transaction=None): | ||||
|     def trigger(session=None): | ||||
|         """ Recalculate the receiver neuron's state by executing the | ||||
|             synapse's transition using the state of the sender neuron. | ||||
|         """ | ||||
|  | @ -45,15 +45,15 @@ class INeuron(Interface): | |||
|     senders = Attribute("The sender synapses") | ||||
|     receivers = Attribute("The receiver synapses") | ||||
| 
 | ||||
|     def setState(state, transaction=None): | ||||
|     def setState(state, session=None): | ||||
|         """ Set the neuron's state. | ||||
|         """ | ||||
| 
 | ||||
|     def getState(transaction=None): | ||||
|     def getState(session=None): | ||||
|         """ Return the neuron's state. | ||||
|         """ | ||||
| 
 | ||||
|     def notify(transaction=None): | ||||
|     def notify(session=None): | ||||
|         """ Notifies the neuron that something has happened. This method | ||||
|             calls the trigger() method on all downstream (receiver) synapses. | ||||
|             In addition it may perform side effects like changing | ||||
|  | @ -70,12 +70,13 @@ class IState(Interface): | |||
| 
 | ||||
| class ITransition(Interface): | ||||
| 
 | ||||
|     def execute(transaction=None): | ||||
|     def execute(session=None): | ||||
|         """ Transform the receiver's state to a new state value and return it. | ||||
|         """ | ||||
| 
 | ||||
| 
 | ||||
| class ITransaction(Interface): | ||||
|     """ A transaction that keeps track of the neurons' states. | ||||
| class ISession(Interface): | ||||
|     """ A session keeps all actions for a certain sequence of user interactions | ||||
|         together by keeping track of the neurons' current and cumulated states. | ||||
|     """ | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,7 +25,6 @@ $Id$ | |||
| from zope.interface import implements | ||||
| from cybertools.brain.interfaces import INeuron, ISynapsis | ||||
| from cybertools.brain.state import State, Transition | ||||
| from cybertools.brain.transaction import getTransaction | ||||
| 
 | ||||
| 
 | ||||
| class Synapsis(object): | ||||
|  | @ -41,10 +40,10 @@ class Synapsis(object): | |||
|         receiver.senders.append(self) | ||||
|         self.transition = Transition(self) | ||||
| 
 | ||||
|     def trigger(self, transaction=None): | ||||
|     def trigger(self, session=None): | ||||
|         receiver = self.receiver | ||||
|         receiver.setState(self.transition.execute(transaction), transaction) | ||||
|         receiver.notify(transaction) | ||||
|         receiver.setState(self.transition.execute(session), session) | ||||
|         receiver.notify(session) | ||||
| 
 | ||||
| 
 | ||||
| class Neuron(object): | ||||
|  | @ -56,18 +55,18 @@ class Neuron(object): | |||
|         self.receivers = [] | ||||
|         self.state = State() | ||||
| 
 | ||||
|     def setState(self, state, transaction=None): | ||||
|         transaction = getTransaction(transaction) | ||||
|         transaction.setState(self, state) | ||||
|     def setState(self, state, session=None): | ||||
|         if session is None: | ||||
|             self.state = state | ||||
|         else: | ||||
|             session.setState(self, state) | ||||
| 
 | ||||
|     def getState(self, transaction=None): | ||||
|         if transaction is None: | ||||
|             transaction = getTransaction(create=False) | ||||
|             if transaction is None: | ||||
|     def getState(self, session=None): | ||||
|         if session is None: | ||||
|                 return self.state | ||||
|         return transaction.getState(self) | ||||
|         return session.getState(self) | ||||
| 
 | ||||
|     def notify(self, transaction=None): | ||||
|     def notify(self, session=None): | ||||
|         for r in self.receivers: | ||||
|             r.trigger(transaction) | ||||
|             r.trigger(session) | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,12 +23,12 @@ $Id$ | |||
| """ | ||||
| 
 | ||||
| from zope.interface import implements | ||||
| from cybertools.brain.interfaces import ITransaction | ||||
| from cybertools.brain.interfaces import ISession | ||||
| 
 | ||||
| 
 | ||||
| class Transaction(object): | ||||
| class Session(object): | ||||
| 
 | ||||
|     implements(ITransaction) | ||||
|     implements(ISession) | ||||
| 
 | ||||
|     def __init__(self): | ||||
|         self.states = {} | ||||
|  | @ -39,25 +39,3 @@ class Transaction(object): | |||
|     def getState(self, neuron): | ||||
|         return self.states.get(neuron, neuron.state) | ||||
| 
 | ||||
| 
 | ||||
| transactions = [] | ||||
| 
 | ||||
| def getTransaction(transaction=None, create=True): | ||||
|     if transaction is None: | ||||
|         if transactions: | ||||
|             transaction = transactions[0] | ||||
|         elif create: | ||||
|             transaction = Transaction() | ||||
|             transactions.append(transaction) | ||||
|         else: | ||||
|             return None | ||||
|     return transaction | ||||
| 
 | ||||
| def endTransaction(transaction=None): | ||||
|     if transaction is None: | ||||
|         if transactions: | ||||
|             del transactions[0] | ||||
|     else: | ||||
|         if transaction in transactions: | ||||
|             del transactions[transactions.index(transaction)] | ||||
| 
 | ||||
|  | @ -47,9 +47,9 @@ class Transition(object): | |||
|         self.synapsis = synapsis | ||||
|         self.factor = factor | ||||
| 
 | ||||
|     def execute(self, transaction=None): | ||||
|         oldState = self.synapsis.receiver.getState(transaction) | ||||
|         senderState = self.synapsis.sender.getState(transaction) | ||||
|     def execute(self, session=None): | ||||
|         oldState = self.synapsis.receiver.getState(session) | ||||
|         senderState = self.synapsis.sender.getState(session) | ||||
|         return State(oldState.value + senderState.value * self.factor) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm