Skip to content

Instantly share code, notes, and snippets.

@zemlanin
Created November 11, 2012 08:28
Show Gist options
  • Save zemlanin/4054163 to your computer and use it in GitHub Desktop.
Save zemlanin/4054163 to your computer and use it in GitHub Desktop.
Генерация дерева состояний
# -*- coding: utf-8 -*-
from collections import namedtuple
def f_t(k = None, mu = None):
if k:
return 'const('+str(k)+')'
elif mu:
return 'gauss('+str(mu)+')'
DEVICES = 'CPU, NBr1, SBr1, ISA1, COM, ISA2, USB, ATA, VGA, SBr2, RAM, GPU, NBr2'
Node = namedtuple('Node', DEVICES)
Node.__repr__ = lambda x: 'M<'+''.join(map(str, x))+'>'
Edge = namedtuple('Edge', 'source, dest, time_func')
class Tree():
def __init__(self, node):
self.nodes = []
self.edges = []
self.transitions = {
'CPU': [(0.99, 'CPU'), (0.01, 'NBr1')],
'NBr1': [(0.15, 'SBr1'), (0.65, 'RAM'), (0.20, 'GPU')],
'SBr1': [(0.05, 'ISA1'), (0.15, 'USB'), (0.40, 'ATA'), (0.40, 'VGA')],
'ISA1': [(1, 'COM')], 'COM': [(1, 'ISA2')], 'ISA2': [(1, 'SBr2')],
'USB': [(1, 'SBr2')], 'ATA': [(1, 'SBr2')], 'VGA': [(1, 'CPU')],
'SBr2': [(1, 'NBr2')], 'RAM': [(1, 'NBr2')], 'GPU': [(1, 'NBr2')],
'NBr2': [(1, 'CPU')]
}
self.functions = {
'CPU': f_t(k = 1), 'NBr': f_t(k = 5), 'SBr': f_t(k = 20),
'ISA': f_t(mu = 50), 'COM': f_t(mu = 1000), 'USB': f_t(mu = 100),
'ATA': f_t(mu = 80), 'VGA': f_t(mu = 70), 'RAM': f_t(mu = 15),
'GPU': f_t(mu = 50)
}
self.generate(node)
def generate(self, source):
if source in self.nodes:
return
else:
self.nodes.append(source)
for key in source._fields:
if getattr(source, key) > 0:
for trns in self.transitions[key]:
if trns[1] != key:
diff = {
trns[1]: getattr(source, trns[1])+1,
key: getattr(source, key)-1,
}
dest = Node(*source._replace(**diff))
else:
dest = source
if 1.0 == trns[0]:
# slice чтобы лишний раз не повторять одни и те же функции
time_func = str(self.functions[key[:3]])
else:
time_func = str(trns[0])+'*'+str(self.functions[key[:3]])
self.edges.append(Edge(dest, source, time_func))
self.generate(dest)
def __repr__(self):
for node in self.nodes:
print node
return str(len(self.nodes))
t = Tree(Node(3,0,0,0,0,0,0,0,0,0,0,0,0))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment