| Index: tools/telemetry/third_party/altgraph/altgraph/GraphUtil.py
|
| diff --git a/tools/telemetry/third_party/altgraph/altgraph/GraphUtil.py b/tools/telemetry/third_party/altgraph/altgraph/GraphUtil.py
|
| deleted file mode 100644
|
| index d3b6acd74d991d87ce4dea49bbc9d6d389239337..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/third_party/altgraph/altgraph/GraphUtil.py
|
| +++ /dev/null
|
| @@ -1,137 +0,0 @@
|
| -'''
|
| -altgraph.GraphUtil - Utility classes and functions
|
| -==================================================
|
| -'''
|
| -
|
| -import random
|
| -from collections import deque
|
| -from altgraph import Graph
|
| -from altgraph import GraphError
|
| -
|
| -def generate_random_graph(node_num, edge_num, self_loops=False, multi_edges=False):
|
| - '''
|
| - Generates and returns a :py:class:`~altgraph.Graph.Graph` instance with *node_num* nodes
|
| - randomly connected by *edge_num* edges.
|
| - '''
|
| - g = Graph.Graph()
|
| -
|
| - if not multi_edges:
|
| - if self_loops:
|
| - max_edges = node_num * node_num
|
| - else:
|
| - max_edges = node_num * (node_num-1)
|
| -
|
| - if edge_num > max_edges:
|
| - raise GraphError("inconsistent arguments to 'generate_random_graph'")
|
| -
|
| - nodes = range(node_num)
|
| -
|
| - for node in nodes:
|
| - g.add_node(node)
|
| -
|
| - while 1:
|
| - head = random.choice(nodes)
|
| - tail = random.choice(nodes)
|
| -
|
| - # loop defense
|
| - if head == tail and not self_loops:
|
| - continue
|
| -
|
| - # multiple edge defense
|
| - if g.edge_by_node(head,tail) is not None and not multi_edges:
|
| - continue
|
| -
|
| - # add the edge
|
| - g.add_edge(head, tail)
|
| - if g.number_of_edges() >= edge_num:
|
| - break
|
| -
|
| - return g
|
| -
|
| -def generate_scale_free_graph(steps, growth_num, self_loops=False, multi_edges=False):
|
| - '''
|
| - Generates and returns a :py:class:`~altgraph.Graph.Graph` instance that will have *steps* \* *growth_num* nodes
|
| - and a scale free (powerlaw) connectivity. Starting with a fully connected graph with *growth_num* nodes
|
| - at every step *growth_num* nodes are added to the graph and are connected to existing nodes with
|
| - a probability proportional to the degree of these existing nodes.
|
| - '''
|
| - # FIXME: The code doesn't seem to do what the documentation claims.
|
| - graph = Graph.Graph()
|
| -
|
| - # initialize the graph
|
| - store = []
|
| - for i in range(growth_num):
|
| - #store += [ i ] * (growth_num - 1)
|
| - for j in range(i + 1, growth_num):
|
| - store.append(i)
|
| - store.append(j)
|
| - graph.add_edge(i,j)
|
| -
|
| - # generate
|
| - for node in range(growth_num, steps * growth_num):
|
| - graph.add_node(node)
|
| - while ( graph.out_degree(node) < growth_num ):
|
| - nbr = random.choice(store)
|
| -
|
| - # loop defense
|
| - if node == nbr and not self_loops:
|
| - continue
|
| -
|
| - # multi edge defense
|
| - if graph.edge_by_node(node, nbr) and not multi_edges:
|
| - continue
|
| -
|
| - graph.add_edge(node, nbr)
|
| -
|
| -
|
| - for nbr in graph.out_nbrs(node):
|
| - store.append(node)
|
| - store.append(nbr)
|
| -
|
| - return graph
|
| -
|
| -def filter_stack(graph, head, filters):
|
| - """
|
| - Perform a walk in a depth-first order starting
|
| - at *head*.
|
| -
|
| - Returns (visited, removes, orphans).
|
| -
|
| - * visited: the set of visited nodes
|
| - * removes: the list of nodes where the node
|
| - data does not all *filters*
|
| - * orphans: tuples of (last_good, node),
|
| - where node is not in removes, is directly
|
| - reachable from a node in *removes* and
|
| - *last_good* is the closest upstream node that is not
|
| - in *removes*.
|
| - """
|
| -
|
| - visited, removes, orphans = set([head]), set(), set()
|
| - stack = deque([(head, head)])
|
| - get_data = graph.node_data
|
| - get_edges = graph.out_edges
|
| - get_tail = graph.tail
|
| -
|
| - while stack:
|
| - last_good, node = stack.pop()
|
| - data = get_data(node)
|
| - if data is not None:
|
| - for filtfunc in filters:
|
| - if not filtfunc(data):
|
| - removes.add(node)
|
| - break
|
| - else:
|
| - last_good = node
|
| - for edge in get_edges(node):
|
| - tail = get_tail(edge)
|
| - if last_good is not node:
|
| - orphans.add((last_good, tail))
|
| - if tail not in visited:
|
| - visited.add(tail)
|
| - stack.append((last_good, tail))
|
| -
|
| - orphans = [(last_good, tail) for (last_good, tail) in orphans if tail not in removes]
|
| - #orphans.sort()
|
| -
|
| - return visited, removes, orphans
|
|
|