Skip to content
Snippets Groups Projects
Commit b2fd8ff3 authored by Radek Hušek's avatar Radek Hušek Committed by Radek Hušek
Browse files

Parallelize generateSubdivisions()

parent aa5ccf59
No related branches found
No related tags found
No related merge requests found
.*.swp
groupConnectivity.so
parmap.pyc
default: groupConnectivity.so clean_obj
groupConnectivity.so: groupConnectivity.pyx group-connectivity.h setup.py compileTimeOptions.h
groupConnectivity.so: groupConnectivity.pyx group-connectivity.h setup.py compileTimeOptions.h parmap.py
python setup.py build_ext
cp build/lib*/groupConnectivity.so .
......
......@@ -2,6 +2,7 @@ from libcpp.vector cimport vector
from libcpp cimport bool
from libcpp.utility cimport pair
from sage.graphs.graph import Graph
from parmap import parmap
cdef extern from "group-connectivity.h" namespace "Ring":
cdef cppclass Z4[T]:
......@@ -87,12 +88,21 @@ def subdivisionIterator(G, edges = None):
for L in subdivisionIterator(H, edges[1:]):
yield L
def generateSubdivisions(file, G, edges = None, function = lambda H: H.graph6_string()):
def generateSubdivisions(file, G, edges = None,
function = lambda H: H.graph6_string(),
parallel = 1):
f = open(file, 'w+')
f.write("# Subdivisions of edges '%s' of graph '%s' (%s)\n" %
(edges, G.graph6_string(), G))
for H in subdivisionIterator(G, edges):
f.write(function(H))
if parallel == 1:
iterator = map(function, subdivisionIterator(G, edges))
else:
iterator = parmap(function, subdivisionIterator(G, edges), parallel)
for line in iterator:
f.write(line)
f.write("\n")
f.close()
......
# modified version of code written by klaus se from
# http://stackoverflow.com/a/16071616
import multiprocessing
def fun(f, q_in, q_out):
while True:
i,x = q_in.get()
if i is None:
break
q_out.put((i, f(x)))
def parmap(f, X, nprocs = None):
if nprocs is None:
nprocs = multiprocessing.cpu_count()
q_in = multiprocessing.Queue(100)
q_out = multiprocessing.Queue()
proc = [multiprocessing.Process(target=fun,args=(f,q_in,q_out)) for _ in range(nprocs)]
for p in proc:
p.daemon = True
p.start()
sent = [q_in.put((i,x)) for i,x in enumerate(X)]
[q_in.put((None,None)) for _ in range(nprocs)]
ret = {}
for _ in range(len(sent)):
i, val = q_out.get()
ret[i] = val
[ p.join() for p in proc ]
return [ ret[i] for i in range(len(sent)) ]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment