Initial.
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/algorithm.py Sun Jun 13 00:18:09 2010 +0200
1.3 @@ -0,0 +1,39 @@
1.4 +def isDivergent(f):
1.5 + if f == float("inf") or f == float("-inf"):
1.6 + return True
1.7 + return False
1.8 +
1.9 +class Cell(object):
1.10 + def __init__(self, c, value, iterations):
1.11 + self.c = c
1.12 + self.value = value
1.13 + self.iterations = iterations
1.14 +
1.15 +class Mandelbrot(object):
1.16 + def __init__(self, range, resolution):
1.17 + self.range = range
1.18 + self.resolution = resolution
1.19 + def iterate(self, z, c):
1.20 + return z * z + c
1.21 + def test(self, c, max_iter):
1.22 + z = [0]
1.23 + for i in xrange(max_iter):
1.24 + z.append(self.iterate(z[-1], c))
1.25 + if isDivergent(z[-1].real) or isDivergent(z[-1].imag):
1.26 + break
1.27 + return z
1.28 +
1.29 + def resolve(self, max_iter):
1.30 + cells = {}
1.31 + x_diff = (self.range[1].real - self.range[0].real) / self.resolution[0]
1.32 + y_diff = (self.range[1].imag - self.range[0].imag) / self.resolution[1]
1.33 + c_diff = complex(x_diff, y_diff)
1.34 +
1.35 + for y in xrange(self.resolution[1]):
1.36 + for x in xrange(self.resolution[0]):
1.37 + c = self.range[0] + c_diff * complex(x, y)
1.38 + print c
1.39 + print self.test(c, max_iter)
1.40 +
1.41 +
1.42 +
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/com.py Sun Jun 13 00:18:09 2010 +0200
2.3 @@ -0,0 +1,72 @@
2.4 +import model
2.5 +import pickle
2.6 +
2.7 +commands = {}
2.8 +
2.9 +def help(socket, client):
2.10 + socket.sendto("\n".join([key + ": " + value[1]
2.11 + for key, value in commands.iteritems()]) + "\n", client)
2.12 +
2.13 +def createModel(socket, client, (name,)):
2.14 + model.createModel(name)
2.15 + socket.sendto("model %s created\n" % name, client)
2.16 +
2.17 +def deleteModel(socket, client, (name,)):
2.18 + if model.deleteModel(name):
2.19 + socket.sendto("model %s deleted\n" % name, client)
2.20 +
2.21 +def saveModel(socket, client, (name,)):
2.22 + model = lookupModel(socket, client, name)
2.23 + if model:
2.24 + pickle.dump(model, open(name, "w"))
2.25 + socket.sendto("model %s saved\n" % name, client)
2.26 +
2.27 +def loadModel(socket, client, (name,)):
2.28 + model.addModel(pickle.load(open(name, "r")))
2.29 + socket.sendto("model %s loaded\n" % name, client)
2.30 +
2.31 +
2.32 +def lookupModel(socket, client, name):
2.33 + if name not in model.models:
2.34 + socket.sendto("model %s not found\n" % name, client)
2.35 + return None
2.36 + else:
2.37 + return model.models[name]
2.38 +
2.39 +def addObserver(socket, client, (modelName, eventType)):
2.40 + model = lookupModel(socket, client, modelName)
2.41 + if model:
2.42 + model.register(socket, client, eventType)
2.43 + socket.sendto("observer for event type %s added: " % eventType
2.44 + + str(client) + "\n", client)
2.45 +
2.46 +def setResolution(socket, client, (modelName, x, y)):
2.47 + model = lookupModel(socket, client, modelName)
2.48 + if model:
2.49 + model.setResolution(int(x), int(y))
2.50 + socket.sendto("model %s resolution set to %s, %s\n" %
2.51 + (modelName, x, y), client)
2.52 +
2.53 +def setRange(socket, client, (modelName, begin, end)):
2.54 + model = lookupModel(socket, client, modelName)
2.55 + if model:
2.56 + model.setRange(complex(begin), complex(end))
2.57 + socket.sendto("model %s range set to %s, %s\n" %
2.58 + (modelName, begin, end), client)
2.59 +
2.60 +def update(socket, client, (modelName, iterations)):
2.61 + model = lookupModel(socket, client, modelName)
2.62 + if model:
2.63 + model.update(int(iterations))
2.64 + socket.sendto("model %s updated with max %s iterations\n"
2.65 + % (modelName, iterations), client)
2.66 +
2.67 +commands = {"help": (help, "help"),
2.68 + "create model": (createModel, "creates a new model"),
2.69 + "delete model": (deleteModel, "deletes a model"),
2.70 + "save model": (saveModel, "makes a persistent copy of the model"),
2.71 + "load model": (loadModel, "loads a persistent model"),
2.72 + "set resolution": (setResolution, "sets the model resolution"),
2.73 + "set range": (setRange, "sets the model range"),
2.74 + "update": (update, "updates the model data"),
2.75 + "add observer": (addObserver, "adds an observer to a model's events")}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/model.py Sun Jun 13 00:18:09 2010 +0200
3.3 @@ -0,0 +1,42 @@
3.4 +import algorithm
3.5 +
3.6 +models = {}
3.7 +
3.8 +def createModel(name):
3.9 + models[name] = Model(name)
3.10 +
3.11 +def addModel(model):
3.12 + models[model.name] = model
3.13 +
3.14 +def deleteModel(name):
3.15 + if name in models:
3.16 + del models[name]
3.17 + return True
3.18 + return False
3.19 +
3.20 +# event = (type,value)
3.21 +eventTypes = ("view", "model", "server")
3.22 +
3.23 +class Model(object):
3.24 + def __init__(self, name):
3.25 + self.name = name
3.26 + self.cells = {}
3.27 + self.observers = {}
3.28 + for t in eventTypes:
3.29 + self.observers[t] = []
3.30 + self.resolution = (0,0)
3.31 + self.range = (complex(0,0), complex(0,0))
3.32 + def dispatch(self, event):
3.33 + for o in self.observers:
3.34 + o[0].sendto("%s" % (event), o[1])
3.35 + def register(self, socket, observer, eventType):
3.36 + self.observers[eventType].append((socket, observer))
3.37 + def setResolution(self, x, y):
3.38 + self.resolution = (x,y)
3.39 + def setRange(self, begin, end):
3.40 + self.range = (begin, end)
3.41 + def update(self, max_iter):
3.42 + m = algorithm.Mandelbrot(self.range, self.resolution)
3.43 + self.cells = m.resolve(max_iter)
3.44 +
3.45 +
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/server.py Sun Jun 13 00:18:09 2010 +0200
4.3 @@ -0,0 +1,45 @@
4.4 +#!/usr/bin/python
4.5 +
4.6 +import com
4.7 +import optparse
4.8 +import SocketServer
4.9 +
4.10 +option_list = [
4.11 + optparse.make_option("-q", "--quiet", action="store_true", dest="quiet",
4.12 + help="quiet mode", default=False)]
4.13 +
4.14 +class Handler(SocketServer.BaseRequestHandler):
4.15 + """
4.16 + """
4.17 + def handle(self):
4.18 + data = self.request[0].strip()
4.19 + socket = self.request[1]
4.20 + print "%s wrote:" % self.client_address[0]
4.21 + print data
4.22 + for key, value in com.commands.iteritems():
4.23 + if key in data:
4.24 + args = data.partition(key)[2].split()
4.25 + if args:
4.26 + value[0](socket, self.client_address, args)
4.27 + else:
4.28 + value[0](socket, self.client_address)
4.29 +
4.30 +class Server(SocketServer.UDPServer):
4.31 + def __init__(self, host, port, handler, options):
4.32 + SocketServer.UDPServer.__init__(self, (host, port), handler)
4.33 + self.host = host
4.34 + self.port = port
4.35 + self.handler = handler
4.36 + self.options = options
4.37 + def run(self):
4.38 + self.serve_forever()
4.39 +
4.40 +if __name__ == "__main__":
4.41 + parser = optparse.OptionParser(usage="usage: %prog [options] port",
4.42 + option_list=option_list)
4.43 + options, args = parser.parse_args()
4.44 +
4.45 + if len(args) > 0:
4.46 + port = int(args[0])
4.47 + server = Server("localhost", port, Handler, options)
4.48 + server.run()