-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathdemo_sequencer_output.py
executable file
·115 lines (98 loc) · 2.97 KB
/
demo_sequencer_output.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/python
import random
import colorsys
import bisect
import yaml
def random_cmd():
if random.random() > 0.7:
return "%%%i" % random.randint(5, 9)
else:
val = random.randint(-5, 5)
if val == 0: val = 1
if val > 0:
return "+" + str(val)
else:
return str(val)
def process_cmd(cmd, cash):
num = float(cmd[1:])
if cmd[0] == "+":
cash += num
elif cmd[0] == "-":
cash -= num
else:
cash *= 1.0 + num / 100.0
return cash
random.seed(1)
PCOUNT = 3
processes = ["SEQ"]
for i in range(PCOUNT):
processes.append("P%i" % (i + 1))
traffic = []
t = dict([(i, 0.0) for i in range(PCOUNT)])
seq_recv = []
for i in range(20):
st = random.random() * 6 + 1.0
tt = random.random() * 4.0 + 1.0
src = random.randint(0, PCOUNT - 1)
t[src] += st
tsrc = t[src]
data = random_cmd()
hue = random.random()
color = [("%02x" % int(band * 0xFF)) for band in colorsys.hls_to_rgb(hue, 0.4, 1.0)]
color = "#" + "".join(color)
seq_recv.append((tsrc + tt, data, color))
traffic.append({
"src": {
"p": "P%i" % (src + 1),
"ts": tsrc
},
"dst": {
"p": "SEQ",
"ts": tsrc + tt
},
"data": data,
"color": color
})
seq_recv.sort(lambda x,y: cmp(x[0], y[0]))
recvs = dict([(i, []) for i in range(PCOUNT)])
for seqnum, (ts, data, color) in enumerate(seq_recv):
for dst in range(PCOUNT):
tt = random.random() * 4.0 + 1.0
traffic.append({
"src": {
"p": "SEQ",
"ts": ts
},
"dst": {
"p": "P%i" % (dst + 1),
"ts": ts + tt
},
"data": "%s;%i" % (data, seqnum),
"color": color
})
recvs[dst].append((ts + tt, data, seqnum))
marks = []
cash = dict([(i, 100.0) for i in range(PCOUNT)])
last_seq = dict([(i, 0) for i in range(PCOUNT)])
for i, c in enumerate(cash.values()):
marks.append({"p": "P%i" % (i + 1), "ts": 0, "text":"[];%i" % int(c),
"color": "#000000"})
for proc in range(PCOUNT):
precv = recvs[proc]
precv.sort(lambda x,y: cmp(x[0], y[0]))
queue = [] # (seqnum, cmd)
for ts, cmd, seqnum in precv:
keys = [x[0] for x in queue]
idx = bisect.bisect_left(keys, seqnum)
queue.insert(idx, (seqnum, cmd))
txt = "[%s]" % "|".join([str(x[1]) for x in queue])
processed = False
while queue and (last_seq[proc] == queue[0][0]):
processed = True
cash[proc] = process_cmd(queue[0][1], cash[proc])
last_seq[proc] += 1
del queue[0]
txt += ";%i" % int(cash[proc])
marks.append({"p": "P%i" % (proc + 1), "ts": ts, "text":txt,
"color": "#000000" if processed else "#787878"})
print yaml.dump({"processes": processes, "traffic": traffic, "marks": marks})