Initial.
authorEugen Sawin <sawine@me73.com>
Sun, 13 Jun 2010 00:18:09 +0200
changeset 0a99535269d60
child 1 0ebb73fd094a
Initial.
algorithm.py
com.py
model.py
server.py
     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()