algorithm.py
author Eugen Sawin <sawine@me73.com>
Mon, 14 Jun 2010 14:32:12 +0200
changeset 3 234fa7eea0df
parent 1 0ebb73fd094a
child 4 4cee17e91d29
permissions -rw-r--r--
Fixed process forking. Weird results when using two workers.
sawine@1
     1
import time
sawine@1
     2
sawine@1
     3
def profile(func):
sawine@1
     4
	def wrapper(*arg):
sawine@1
     5
		t1 = time.clock()
sawine@1
     6
		res = func(*arg)
sawine@1
     7
		t2 = time.clock()
sawine@1
     8
		print "duration: %fs" % float(t2-t1)
sawine@1
     9
		return res
sawine@1
    10
	return wrapper
sawine@1
    11
sawine@1
    12
def isDivergent(c):
sawine@1
    13
	if c.real == float("inf") or c.real == float("-inf"):
sawine@0
    14
		return True
sawine@1
    15
	if c.imag == float("inf") or c.imag == float("-inf"):
sawine@1
    16
		return True
sawine@1
    17
	return False
sawine@1
    18
sawine@1
    19
def isPeriodic(z):
sawine@0
    20
	return False
sawine@0
    21
sawine@0
    22
class Cell(object):
sawine@0
    23
	def __init__(self, c, value, iterations):
sawine@0
    24
		self.c = c
sawine@0
    25
		self.value = value
sawine@0
    26
		self.iterations = iterations
sawine@0
    27
		
sawine@0
    28
class Mandelbrot(object):
sawine@0
    29
	def __init__(self, range, resolution):
sawine@0
    30
		self.range = range
sawine@0
    31
		self.resolution = resolution
sawine@0
    32
	def iterate(self, z, c):
sawine@0
    33
		return z * z + c
sawine@0
    34
	def test(self, c, max_iter):
sawine@0
    35
		z = [0]
sawine@0
    36
		for i in xrange(max_iter):
sawine@0
    37
			z.append(self.iterate(z[-1], c))
sawine@1
    38
			if isDivergent(z[-1]):
sawine@1
    39
				break
sawine@1
    40
			if isPeriodic(z[-10:-1]):
sawine@0
    41
				break
sawine@0
    42
		return z
sawine@1
    43
	@profile	
sawine@0
    44
	def resolve(self, max_iter):
sawine@0
    45
		cells = {}
sawine@0
    46
		x_diff = (self.range[1].real - self.range[0].real) / self.resolution[0]
sawine@0
    47
		y_diff = (self.range[1].imag - self.range[0].imag) / self.resolution[1]
sawine@0
    48
		c_diff = complex(x_diff, y_diff)
sawine@0
    49
		
sawine@0
    50
		for y in xrange(self.resolution[1]):
sawine@0
    51
			for x in xrange(self.resolution[0]):	
sawine@0
    52
				c = self.range[0] + c_diff * complex(x, y)
sawine@2
    53
				self.test(c, max_iter)
sawine@0
    54
	
sawine@0
    55