diff --git a/groupConnectivityNaive.py b/groupConnectivityNaive.py index e72f7c3387fb6fdf6ad95c31d46e4e33538844d7..92420e0d95ae0953567d57b3236f045ac4344142 100644 --- a/groupConnectivityNaive.py +++ b/groupConnectivityNaive.py @@ -30,14 +30,19 @@ def flowEnumerator(G, group): yield v for v in combine([group.zero()] * m, 0): - yield v + yield tuple(v) -def testGroupConnectivityNaive(G_, group, forb_spanning_tree = False, list_all = False): +def testGroupConnectivityNaive(G_, group, forb_spanning_tree = False, + list_all = False, counts = False): E = [ (u, v, i) for i, (u, v, _) in enumerate(G_.edges()) ] G = DiGraph([G_.vertices(), E], format='vertices_and_edges') m = G.num_edges() - info = { 'graph': G, 'edges': E } + C = {} + info = { 'graph': G, 'edges': E, 'counts': C } + + if counts: + list_all = True if forb_spanning_tree: T = G.min_spanning_tree() @@ -65,28 +70,34 @@ def testGroupConnectivityNaive(G_, group, forb_spanning_tree = False, list_all = info['compatible_flows'] = flows Elems = [ x for x in group ] - forb = [ group.zero() ] * m + forb_ = [ group.zero() ] * m def forb_iter(e): if e >= len(T): - yield True + yield tuple(forb_) return for v in Elems: - forb[T[e]] = v + forb_[T[e]] = v for r in forb_iter(e + 1): yield r - def find_flow(): - for f in flows: - if is_compatible(f, forb): - return True - return False + if not counts: + def find_flow(forb): + for f in flows: + if is_compatible(f, forb): + return True + return False + else: + def find_flow(forb): + c = len(filter(lambda f: is_compatible(f, forb), flows)) + C[forb] = c + return (c > 0) ret = [] - for _ in forb_iter(0): - if not find_flow(): + for forb in forb_iter(0): + if not find_flow(forb): if not list_all: return (False, info, [forb]) ret.append(list(forb))