Skip to content

Instantly share code, notes, and snippets.

@tkf
Created September 3, 2009 16:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkf/180397 to your computer and use it in GitHub Desktop.
Save tkf/180397 to your computer and use it in GitHub Desktop.
class FinStMch:
gendct = {}
state = None
def scheduler(self, start):
self.state = start
while 1:
yield self.gendct[self.state].next()
def set_gen(self, **kwds):
self.gendct.update(**kwds)
def activate_gen(self, *args, **kwds):
for (k, v) in self.gendct.iteritems():
self.gendct[k] = v(*args, **kwds)
class ToyFSM(FinStMch):
def __init__(self):
self.set_gen(
ONES = self.get_ones,
TENS = self.get_tens,
TWENTIES = self.get_twenties,
OUT_OF_RANGE = self.exit,
)
def jump_to(self, val):
if 0 <= val < 10: return 'ONES'
elif 10 <= val < 20: return 'TENS'
elif 20 <= val < 30: return 'TWENTIES'
else: return 'OUT_OF_RANGE'
def get_ones(self, iter):
while 1:
while self.state=='ONES':
val = iter.next()
print ("@|%2.1f" % val).ljust(10),
self.state = self.jump_to(val)
print self.state
yield self.state
def get_tens(self, iter):
while 1:
while self.state=='TENS':
val = iter.next()
print ("#|%2.1f" % val).ljust(10),
self.state = self.jump_to(val)
print self.state
yield self.state
def get_twenties(self, iter):
while 1:
while self.state=='TWENTIES':
val = iter.next()
print ("*|%2.1f" % val).ljust(10),
self.state = self.jump_to(val)
print self.state
yield self.state
def exit(self, iter):
self.state = raw_input('\n[co-routine for jump?] ').upper()
print "...Jumping into middle of", self.state
yield self.state
print "Exiting from exit()..."
def math_gen(n): # Iterative function becomes a generator
from math import sin
while 1:
yield n
n = abs(sin(n))*31
if __name__ == '__main__':
import numpy
tfsm = ToyFSM()
stream = math_gen(1)
tfsm.activate_gen( stream )
start = tfsm.jump_to( stream.next() )
sa = numpy.array(
[s for s in tfsm.scheduler(start)] )
print
print sa
usage = """
In [114]: run fsm.py
@|26.1 TWENTIES
*|25.3 TWENTIES
*|4.2 ONES
@|26.4 TWENTIES
*|29.5 TWENTIES
*|28.8 TWENTIES
*|15.2 TENS
#|16.3 TENS
#|16.0 TENS
#|9.5 ONES
@|3.8 ONES
@|18.2 TENS
#|17.9 TENS
#|24.4 TWENTIES
*|19.6 TENS
#|21.4 TWENTIES
*|16.1 TENS
#|12.3 TENS
#|9.2 ONES
@|6.5 ONES
@|5.7 ONES
@|16.7 TENS
#|26.4 TWENTIES
*|30.0 TWENTIES
*|30.7 OUT_OF_RANGE
[co-routine for jump?] ONES
...Jumping into middle of ONES
@|19.9 TENS
#|26.4 TWENTIES
*|29.4 TWENTIES
*|27.5 TWENTIES
*|22.7 TWENTIES
*|19.9 TENS
#|26.2 TWENTIES
*|26.8 TWENTIES
*|30.9 OUT_OF_RANGE
Exiting from exit()...
['TWENTIES' 'ONES' 'TWENTIES' 'TENS' 'ONES' 'TENS' 'TWENTIES' 'TENS'
'TWENTIES' 'TENS' 'ONES' 'TENS' 'TWENTIES' 'OUT_OF_RANGE' 'ONES' 'TENS'
'TWENTIES' 'TENS' 'TWENTIES' 'OUT_OF_RANGE']
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment