| @@ -1,46 +1,42 @@ | |||||
| import os, sys | import os, sys | ||||
| import time | |||||
| import multiprocessing as mp | |||||
| import numpy as np | import numpy as np | ||||
| import time | import time | ||||
| from matplotlib import pyplot as plt | from matplotlib import pyplot as plt | ||||
| from permanent import permanent | from permanent import permanent | ||||
| import itertools as it | |||||
| def permanent(a): | |||||
| """ Slow way to compute the permanent """ | |||||
| r = range(len(a)) | |||||
| return sum([np.prod(a[r, p]) for p in it.permutations(r)]) | |||||
| if __name__ == '__main__': | |||||
| maxtime=1 | |||||
| dimensions=range(1,11) | |||||
| for (function, label) in zip((permanent, perm_ryser), ("C", "Python")): | |||||
| counts=[] | |||||
| for dimension in dimensions: | |||||
| print dimension | |||||
| real=np.random.uniform(-1, 1, dimension*dimension).reshape((dimension, dimension)) | |||||
| imag=np.random.uniform(-1, 1, dimension*dimension).reshape((dimension, dimension)) | |||||
| submatrix=real+1j*imag | |||||
| t=time.clock() | |||||
| n=0 | |||||
| while time.clock()-t < maxtime: | |||||
| for i in range(5): | |||||
| function(submatrix) | |||||
| n+=5 | |||||
| counts.append(n) | |||||
| plt.plot(dimensions, counts, ".-", label=label) | |||||
| def perm_ryser(a): | |||||
| ''' the permanent calculated using the ryser formula. much faster than the naive approach ''' | |||||
| n,n2=a.shape | |||||
| z=np.arange(n) | |||||
| irange=xrange(2**n) | |||||
| get_index=lambda i: (i & (1 << z)) != 0 | |||||
| get_term=lambda index: ((-1)**np.sum(index))*np.prod(np.sum(a[index,:], 0)) | |||||
| indeces=map(get_index, irange) | |||||
| terms=map(get_term, indeces) | |||||
| return np.sum(terms)*((-1)**n) | |||||
| maxtime=1 | |||||
| dimensions=range(1,11) | |||||
| for (function, label) in zip((permanent, perm_ryser), ("C", "Python")): | |||||
| counts=[] | |||||
| for dimension in dimensions: | |||||
| print dimension | |||||
| real=np.random.uniform(-1, 1, dimension*dimension).reshape((dimension, dimension)) | |||||
| imag=np.random.uniform(-1, 1, dimension*dimension).reshape((dimension, dimension)) | |||||
| submatrix=real+1j*imag | |||||
| t=time.clock() | |||||
| n=0 | |||||
| while time.clock()-t < maxtime: | |||||
| for i in range(5): | |||||
| function(submatrix) | |||||
| n+=5 | |||||
| counts.append(n) | |||||
| plt.plot(dimensions, counts, '.-', label=label) | |||||
| plt.ylabel('Number of permanents per second') | |||||
| plt.xlabel('Dimension') | |||||
| plt.xlim(min(dimensions), max(dimensions)) | |||||
| plt.legend() | |||||
| plt.semilogy() | |||||
| plt.savefig('out.pdf') | |||||
| plt.ylabel("Number of permanents per second") | |||||
| plt.xlabel("Dimension") | |||||
| plt.xlim(min(dimensions), max(dimensions)) | |||||
| plt.legend() | |||||
| plt.semilogy() | |||||
| plt.savefig("out.pdf") | |||||