sawine@0
|
1 |
import model
|
sawine@0
|
2 |
import pickle
|
sawine@5
|
3 |
import hashlib
|
sawine@5
|
4 |
from operator import attrgetter
|
sawine@0
|
5 |
|
sawine@0
|
6 |
commands = {}
|
sawine@0
|
7 |
|
sawine@2
|
8 |
def help(socket, client, worker):
|
sawine@0
|
9 |
socket.sendto("\n".join([key + ": " + value[1]
|
sawine@0
|
10 |
for key, value in commands.iteritems()]) + "\n", client)
|
sawine@0
|
11 |
|
sawine@2
|
12 |
def createModel(socket, client, worker, (name,)):
|
sawine@0
|
13 |
model.createModel(name)
|
sawine@0
|
14 |
socket.sendto("model %s created\n" % name, client)
|
sawine@0
|
15 |
|
sawine@2
|
16 |
def deleteModel(socket, client, worker, (name,)):
|
sawine@0
|
17 |
if model.deleteModel(name):
|
sawine@0
|
18 |
socket.sendto("model %s deleted\n" % name, client)
|
sawine@0
|
19 |
|
sawine@2
|
20 |
def saveModel(socket, client, worker, (name,)):
|
sawine@0
|
21 |
model = lookupModel(socket, client, name)
|
sawine@0
|
22 |
if model:
|
sawine@4
|
23 |
pickle.dump(model, open(name + ".model", "w"))
|
sawine@0
|
24 |
socket.sendto("model %s saved\n" % name, client)
|
sawine@0
|
25 |
|
sawine@2
|
26 |
def loadModel(socket, client, worker, (name,)):
|
sawine@4
|
27 |
model.addModel(pickle.load(open(name + ".model", "r")))
|
sawine@2
|
28 |
socket.sendto("model %s loaded\n" % name, client)
|
sawine@5
|
29 |
|
sawine@5
|
30 |
def getModel(name):
|
sawine@5
|
31 |
if name in model.models:
|
sawine@5
|
32 |
return model.models[name]
|
sawine@5
|
33 |
|
sawine@0
|
34 |
def lookupModel(socket, client, name):
|
sawine@0
|
35 |
if name not in model.models:
|
sawine@0
|
36 |
socket.sendto("model %s not found\n" % name, client)
|
sawine@0
|
37 |
return None
|
sawine@0
|
38 |
else:
|
sawine@0
|
39 |
return model.models[name]
|
sawine@0
|
40 |
|
sawine@2
|
41 |
def addObserver(socket, client, worker, (modelName, eventType)):
|
sawine@0
|
42 |
model = lookupModel(socket, client, modelName)
|
sawine@0
|
43 |
if model:
|
sawine@0
|
44 |
model.register(socket, client, eventType)
|
sawine@0
|
45 |
socket.sendto("observer for event type %s added: " % eventType
|
sawine@0
|
46 |
+ str(client) + "\n", client)
|
sawine@6
|
47 |
print "observer for event type %s added: " % eventType + str(client) + "\n"
|
sawine@0
|
48 |
|
sawine@2
|
49 |
def setResolution(socket, client, worker, (modelName, x, y)):
|
sawine@0
|
50 |
model = lookupModel(socket, client, modelName)
|
sawine@0
|
51 |
if model:
|
sawine@0
|
52 |
model.setResolution(int(x), int(y))
|
sawine@0
|
53 |
socket.sendto("model %s resolution set to %s, %s\n" %
|
sawine@0
|
54 |
(modelName, x, y), client)
|
sawine@0
|
55 |
|
sawine@2
|
56 |
def setRange(socket, client, worker, (modelName, begin, end)):
|
sawine@0
|
57 |
model = lookupModel(socket, client, modelName)
|
sawine@0
|
58 |
if model:
|
sawine@0
|
59 |
model.setRange(complex(begin), complex(end))
|
sawine@0
|
60 |
socket.sendto("model %s range set to %s, %s\n" %
|
sawine@0
|
61 |
(modelName, begin, end), client)
|
sawine@0
|
62 |
|
sawine@2
|
63 |
def update(socket, client, worker, (modelName, iterations)):
|
sawine@0
|
64 |
model = lookupModel(socket, client, modelName)
|
sawine@0
|
65 |
if model:
|
sawine@3
|
66 |
old_res = model.resolution
|
sawine@3
|
67 |
begin_y = model.range[0].imag
|
sawine@3
|
68 |
end_y = model.range[1].imag
|
sawine@3
|
69 |
begin_x = model.range[0].real
|
sawine@3
|
70 |
end_x = model.range[1].real
|
sawine@3
|
71 |
step_x = (end_x - begin_x) / len(worker)
|
sawine@3
|
72 |
model.resolution = (old_res[0] / len(worker), old_res[1])
|
sawine@3
|
73 |
|
sawine@3
|
74 |
for i, w in enumerate(worker):
|
sawine@3
|
75 |
new_begin_x = begin_x + step_x * i
|
sawine@3
|
76 |
new_end_x = begin_x + step_x * (i + 1)
|
sawine@3
|
77 |
model.range = (complex(new_begin_x, begin_y),
|
sawine@3
|
78 |
complex(new_end_x, end_y))
|
sawine@3
|
79 |
print model.range
|
sawine@3
|
80 |
print model.resolution
|
sawine@5
|
81 |
model.cells = {}
|
sawine@2
|
82 |
dump = pickle.dumps(model)
|
sawine@4
|
83 |
socket.sendto("%010i%s%010i" % (len(dump), dump,
|
sawine@4
|
84 |
int(iterations)), w)
|
sawine@0
|
85 |
socket.sendto("model %s updated with max %s iterations\n"
|
sawine@0
|
86 |
% (modelName, iterations), client)
|
sawine@3
|
87 |
model.range = (complex(begin_x, begin_y), complex(end_x, end_y))
|
sawine@3
|
88 |
model.resolution = old_res
|
sawine@5
|
89 |
|
sawine@5
|
90 |
def view(socket, client, worker, (name,)):
|
sawine@5
|
91 |
model = lookupModel(socket, client, name)
|
sawine@5
|
92 |
if model:
|
sawine@5
|
93 |
keys = model.cells.keys()
|
sawine@5
|
94 |
keys.sort(key=attrgetter("real", "imag"))
|
sawine@5
|
95 |
cells = {}
|
sawine@5
|
96 |
for k in keys:
|
sawine@5
|
97 |
cells[k] = model.cells[k]
|
sawine@5
|
98 |
print "size: %i hash: %s" % (len(cells),
|
sawine@5
|
99 |
hashlib.sha256(str(cells)).hexdigest())
|
sawine@6
|
100 |
|
sawine@6
|
101 |
def data(socket, client, worker, (modelName, cell_r, cell_i, value_r, value_i)):
|
sawine@6
|
102 |
model = lookupModel(socket, client, modelName)
|
sawine@6
|
103 |
cell = complex(float(cell_r), float(cell_i))
|
sawine@6
|
104 |
value = complex(float(value_r), float(value_i))
|
sawine@6
|
105 |
if model:
|
sawine@6
|
106 |
print "received cell " + str(cell) + ": " + str(value)
|
sawine@6
|
107 |
model.cells[complex(cell)] = complex(value)
|
sawine@6
|
108 |
else:
|
sawine@6
|
109 |
return (cell, value)
|
sawine@5
|
110 |
|
sawine@0
|
111 |
commands = {"help": (help, "help"),
|
sawine@0
|
112 |
"create model": (createModel, "creates a new model"),
|
sawine@0
|
113 |
"delete model": (deleteModel, "deletes a model"),
|
sawine@0
|
114 |
"save model": (saveModel, "makes a persistent copy of the model"),
|
sawine@0
|
115 |
"load model": (loadModel, "loads a persistent model"),
|
sawine@0
|
116 |
"set resolution": (setResolution, "sets the model resolution"),
|
sawine@0
|
117 |
"set range": (setRange, "sets the model range"),
|
sawine@0
|
118 |
"update": (update, "updates the model data"),
|
sawine@5
|
119 |
"view": (view, "shows the model data"),
|
sawine@6
|
120 |
"data": (data, "sends data packets"),
|
sawine@3
|
121 |
"add observer": (addObserver, "adds an observer to a model's events"),}
|