From 1c4f0dca4cc9da6a21b6a4484dbaeb28fb086ac7 Mon Sep 17 00:00:00 2001 From: jdsteve2 Date: Mon, 18 May 2020 21:05:56 -0500 Subject: [PATCH] remove compute_sccs and corresponding test (moved to pytools) --- loopy/tools.py | 59 ----------------------------------------------- test/test_misc.py | 45 ------------------------------------ 2 files changed, 104 deletions(-) diff --git a/loopy/tools.py b/loopy/tools.py index f7e9997c1..a1cd5e108 100644 --- a/loopy/tools.py +++ b/loopy/tools.py @@ -355,65 +355,6 @@ def empty_aligned(shape, dtype, order='C', n=64): # }}} -# {{{ compute SCCs with Tarjan's algorithm - -def compute_sccs(graph): - to_search = set(graph.keys()) - visit_order = {} - scc_root = {} - sccs = [] - - while to_search: - top = next(iter(to_search)) - call_stack = [(top, iter(graph[top]), None)] - visit_stack = [] - visiting = set() - - scc = [] - - while call_stack: - top, children, last_popped_child = call_stack.pop() - - if top not in visiting: - # Unvisited: mark as visited, initialize SCC root. - count = len(visit_order) - visit_stack.append(top) - visit_order[top] = count - scc_root[top] = count - visiting.add(top) - to_search.discard(top) - - # Returned from a recursion, update SCC. - if last_popped_child is not None: - scc_root[top] = min( - scc_root[top], - scc_root[last_popped_child]) - - for child in children: - if child not in visit_order: - # Recurse. - call_stack.append((top, children, child)) - call_stack.append((child, iter(graph[child]), None)) - break - if child in visiting: - scc_root[top] = min( - scc_root[top], - visit_order[child]) - else: - if scc_root[top] == visit_order[top]: - scc = [] - while visit_stack[-1] != top: - scc.append(visit_stack.pop()) - scc.append(visit_stack.pop()) - for item in scc: - visiting.remove(item) - sccs.append(scc) - - return sccs - -# }}} - - # {{{ pickled container value class _PickledObject(object): diff --git a/test/test_misc.py b/test/test_misc.py index 258bbc35e..dc5045fe0 100644 --- a/test/test_misc.py +++ b/test/test_misc.py @@ -24,7 +24,6 @@ THE SOFTWARE. import six # noqa import pytest -from six.moves import range import sys @@ -35,50 +34,6 @@ logger = logging.getLogger(__name__) from loopy.version import LOOPY_USE_LANGUAGE_VERSION_2018_2 # noqa -def test_compute_sccs(): - from pytools.graph import compute_sccs - import random - - rng = random.Random(0) - - def generate_random_graph(nnodes): - graph = dict((i, set()) for i in range(nnodes)) - for i in range(nnodes): - for j in range(nnodes): - # Edge probability 2/n: Generates decently interesting inputs. - if rng.randint(0, nnodes - 1) <= 1: - graph[i].add(j) - return graph - - def verify_sccs(graph, sccs): - visited = set() - - def visit(node): - if node in visited: - return [] - else: - visited.add(node) - result = [] - for child in graph[node]: - result = result + visit(child) - return result + [node] - - for scc in sccs: - scc = set(scc) - assert not scc & visited - # Check that starting from each element of the SCC results - # in the same set of reachable nodes. - for scc_root in scc: - visited.difference_update(scc) - result = visit(scc_root) - assert set(result) == scc, (set(result), scc) - - for nnodes in range(10, 20): - for i in range(40): - graph = generate_random_graph(nnodes) - verify_sccs(graph, compute_sccs(graph)) - - def test_SetTrie(): from loopy.kernel.tools import SetTrie -- GitLab