Pete Shadbolt hace 9 años
padre
commit
a2cf767755
Se han modificado 1 ficheros con 36 adiciones y 40 borrados
  1. +36
    -40
      run-tests.py

+ 36
- 40
run-tests.py Ver fichero

@@ -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")

Cargando…
Cancelar
Guardar