| @@ -1,46 +1,42 @@ | |||
| import os, sys | |||
| import time | |||
| import multiprocessing as mp | |||
| import numpy as np | |||
| import time | |||
| from matplotlib import pyplot as plt | |||
| 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") | |||