sawine@0: import model sawine@0: import pickle sawine@5: import hashlib sawine@5: from operator import attrgetter sawine@0: sawine@0: commands = {} sawine@0: sawine@2: def help(socket, client, worker): sawine@0: socket.sendto("\n".join([key + ": " + value[1] sawine@0: for key, value in commands.iteritems()]) + "\n", client) sawine@0: sawine@2: def createModel(socket, client, worker, (name,)): sawine@0: model.createModel(name) sawine@0: socket.sendto("model %s created\n" % name, client) sawine@0: sawine@2: def deleteModel(socket, client, worker, (name,)): sawine@0: if model.deleteModel(name): sawine@0: socket.sendto("model %s deleted\n" % name, client) sawine@0: sawine@2: def saveModel(socket, client, worker, (name,)): sawine@0: model = lookupModel(socket, client, name) sawine@0: if model: sawine@4: pickle.dump(model, open(name + ".model", "w")) sawine@0: socket.sendto("model %s saved\n" % name, client) sawine@0: sawine@2: def loadModel(socket, client, worker, (name,)): sawine@4: model.addModel(pickle.load(open(name + ".model", "r"))) sawine@2: socket.sendto("model %s loaded\n" % name, client) sawine@5: sawine@5: def getModel(name): sawine@5: if name in model.models: sawine@5: return model.models[name] sawine@5: sawine@0: def lookupModel(socket, client, name): sawine@0: if name not in model.models: sawine@0: socket.sendto("model %s not found\n" % name, client) sawine@0: return None sawine@0: else: sawine@0: return model.models[name] sawine@0: sawine@2: def addObserver(socket, client, worker, (modelName, eventType)): sawine@0: model = lookupModel(socket, client, modelName) sawine@0: if model: sawine@0: model.register(socket, client, eventType) sawine@0: socket.sendto("observer for event type %s added: " % eventType sawine@0: + str(client) + "\n", client) sawine@6: print "observer for event type %s added: " % eventType + str(client) + "\n" sawine@0: sawine@2: def setResolution(socket, client, worker, (modelName, x, y)): sawine@0: model = lookupModel(socket, client, modelName) sawine@0: if model: sawine@0: model.setResolution(int(x), int(y)) sawine@0: socket.sendto("model %s resolution set to %s, %s\n" % sawine@0: (modelName, x, y), client) sawine@0: sawine@2: def setRange(socket, client, worker, (modelName, begin, end)): sawine@0: model = lookupModel(socket, client, modelName) sawine@0: if model: sawine@0: model.setRange(complex(begin), complex(end)) sawine@0: socket.sendto("model %s range set to %s, %s\n" % sawine@0: (modelName, begin, end), client) sawine@0: sawine@2: def update(socket, client, worker, (modelName, iterations)): sawine@0: model = lookupModel(socket, client, modelName) sawine@0: if model: sawine@3: old_res = model.resolution sawine@3: begin_y = model.range[0].imag sawine@3: end_y = model.range[1].imag sawine@3: begin_x = model.range[0].real sawine@3: end_x = model.range[1].real sawine@3: step_x = (end_x - begin_x) / len(worker) sawine@3: model.resolution = (old_res[0] / len(worker), old_res[1]) sawine@3: sawine@3: for i, w in enumerate(worker): sawine@3: new_begin_x = begin_x + step_x * i sawine@3: new_end_x = begin_x + step_x * (i + 1) sawine@3: model.range = (complex(new_begin_x, begin_y), sawine@3: complex(new_end_x, end_y)) sawine@3: print model.range sawine@3: print model.resolution sawine@5: model.cells = {} sawine@2: dump = pickle.dumps(model) sawine@4: socket.sendto("%010i%s%010i" % (len(dump), dump, sawine@4: int(iterations)), w) sawine@0: socket.sendto("model %s updated with max %s iterations\n" sawine@0: % (modelName, iterations), client) sawine@3: model.range = (complex(begin_x, begin_y), complex(end_x, end_y)) sawine@3: model.resolution = old_res sawine@5: sawine@5: def view(socket, client, worker, (name,)): sawine@5: model = lookupModel(socket, client, name) sawine@5: if model: sawine@5: keys = model.cells.keys() sawine@5: keys.sort(key=attrgetter("real", "imag")) sawine@5: cells = {} sawine@5: for k in keys: sawine@5: cells[k] = model.cells[k] sawine@5: print "size: %i hash: %s" % (len(cells), sawine@5: hashlib.sha256(str(cells)).hexdigest()) sawine@6: sawine@6: def data(socket, client, worker, (modelName, cell_r, cell_i, value_r, value_i)): sawine@6: model = lookupModel(socket, client, modelName) sawine@6: cell = complex(float(cell_r), float(cell_i)) sawine@6: value = complex(float(value_r), float(value_i)) sawine@6: if model: sawine@6: print "received cell " + str(cell) + ": " + str(value) sawine@6: model.cells[complex(cell)] = complex(value) sawine@6: else: sawine@6: return (cell, value) sawine@5: sawine@0: commands = {"help": (help, "help"), sawine@0: "create model": (createModel, "creates a new model"), sawine@0: "delete model": (deleteModel, "deletes a model"), sawine@0: "save model": (saveModel, "makes a persistent copy of the model"), sawine@0: "load model": (loadModel, "loads a persistent model"), sawine@0: "set resolution": (setResolution, "sets the model resolution"), sawine@0: "set range": (setRange, "sets the model range"), sawine@0: "update": (update, "updates the model data"), sawine@5: "view": (view, "shows the model data"), sawine@6: "data": (data, "sends data packets"), sawine@3: "add observer": (addObserver, "adds an observer to a model's events"),}