| Index: tools/telemetry/third_party/altgraph/altgraph/GraphAlgo.py
|
| diff --git a/tools/telemetry/third_party/altgraph/altgraph/GraphAlgo.py b/tools/telemetry/third_party/altgraph/altgraph/GraphAlgo.py
|
| deleted file mode 100644
|
| index 9e6fff2b172f5c9d49606eaa7a6e88d2c3933ab2..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/third_party/altgraph/altgraph/GraphAlgo.py
|
| +++ /dev/null
|
| @@ -1,147 +0,0 @@
|
| -'''
|
| -altgraph.GraphAlgo - Graph algorithms
|
| -=====================================
|
| -'''
|
| -from altgraph import GraphError
|
| -
|
| -def dijkstra(graph, start, end=None):
|
| - """
|
| - Dijkstra's algorithm for shortest paths
|
| -
|
| - `David Eppstein, UC Irvine, 4 April 2002 <http://www.ics.uci.edu/~eppstein/161/python/>`_
|
| -
|
| - `Python Cookbook Recipe <http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/119466>`_
|
| -
|
| - Find shortest paths from the start node to all nodes nearer than or equal to the end node.
|
| -
|
| - Dijkstra's algorithm is only guaranteed to work correctly when all edge lengths are positive.
|
| - This code does not verify this property for all edges (only the edges examined until the end
|
| - vertex is reached), but will correctly compute shortest paths even for some graphs with negative
|
| - edges, and will raise an exception if it discovers that a negative edge has caused it to make a mistake.
|
| -
|
| - *Adapted to altgraph by Istvan Albert, Pennsylvania State University - June, 9 2004*
|
| -
|
| - """
|
| - D = {} # dictionary of final distances
|
| - P = {} # dictionary of predecessors
|
| - Q = _priorityDictionary() # estimated distances of non-final vertices
|
| - Q[start] = 0
|
| -
|
| - for v in Q:
|
| - D[v] = Q[v]
|
| - if v == end: break
|
| -
|
| - for w in graph.out_nbrs(v):
|
| - edge_id = graph.edge_by_node(v,w)
|
| - vwLength = D[v] + graph.edge_data(edge_id)
|
| - if w in D:
|
| - if vwLength < D[w]:
|
| - raise GraphError("Dijkstra: found better path to already-final vertex")
|
| - elif w not in Q or vwLength < Q[w]:
|
| - Q[w] = vwLength
|
| - P[w] = v
|
| -
|
| - return (D,P)
|
| -
|
| -def shortest_path(graph, start, end):
|
| - """
|
| - Find a single shortest path from the given start node to the given end node.
|
| - The input has the same conventions as dijkstra(). The output is a list of the nodes
|
| - in order along the shortest path.
|
| -
|
| - **Note that the distances must be stored in the edge data as numeric data**
|
| - """
|
| -
|
| - D,P = dijkstra(graph, start, end)
|
| - Path = []
|
| - while 1:
|
| - Path.append(end)
|
| - if end == start: break
|
| - end = P[end]
|
| - Path.reverse()
|
| - return Path
|
| -
|
| -#
|
| -# Utility classes and functions
|
| -#
|
| -class _priorityDictionary(dict):
|
| - '''
|
| - Priority dictionary using binary heaps (internal use only)
|
| -
|
| - David Eppstein, UC Irvine, 8 Mar 2002
|
| -
|
| - Implements a data structure that acts almost like a dictionary, with two modifications:
|
| - 1. D.smallest() returns the value x minimizing D[x]. For this to work correctly,
|
| - all values D[x] stored in the dictionary must be comparable.
|
| - 2. iterating "for x in D" finds and removes the items from D in sorted order.
|
| - Each item is not removed until the next item is requested, so D[x] will still
|
| - return a useful value until the next iteration of the for-loop.
|
| - Each operation takes logarithmic amortized time.
|
| - '''
|
| - def __init__(self):
|
| - '''
|
| - Initialize priorityDictionary by creating binary heap of pairs (value,key).
|
| - Note that changing or removing a dict entry will not remove the old pair from the heap
|
| - until it is found by smallest() or until the heap is rebuilt.
|
| - '''
|
| - self.__heap = []
|
| - dict.__init__(self)
|
| -
|
| - def smallest(self):
|
| - '''
|
| - Find smallest item after removing deleted items from front of heap.
|
| - '''
|
| - if len(self) == 0:
|
| - raise IndexError("smallest of empty priorityDictionary")
|
| - heap = self.__heap
|
| - while heap[0][1] not in self or self[heap[0][1]] != heap[0][0]:
|
| - lastItem = heap.pop()
|
| - insertionPoint = 0
|
| - while 1:
|
| - smallChild = 2*insertionPoint+1
|
| - if smallChild+1 < len(heap) and heap[smallChild] > heap[smallChild+1] :
|
| - smallChild += 1
|
| - if smallChild >= len(heap) or lastItem <= heap[smallChild]:
|
| - heap[insertionPoint] = lastItem
|
| - break
|
| - heap[insertionPoint] = heap[smallChild]
|
| - insertionPoint = smallChild
|
| - return heap[0][1]
|
| -
|
| - def __iter__(self):
|
| - '''
|
| - Create destructive sorted iterator of priorityDictionary.
|
| - '''
|
| - def iterfn():
|
| - while len(self) > 0:
|
| - x = self.smallest()
|
| - yield x
|
| - del self[x]
|
| - return iterfn()
|
| -
|
| - def __setitem__(self,key,val):
|
| - '''
|
| - Change value stored in dictionary and add corresponding pair to heap.
|
| - Rebuilds the heap if the number of deleted items gets large, to avoid memory leakage.
|
| - '''
|
| - dict.__setitem__(self,key,val)
|
| - heap = self.__heap
|
| - if len(heap) > 2 * len(self):
|
| - self.__heap = [(v,k) for k,v in self.iteritems()]
|
| - self.__heap.sort() # builtin sort probably faster than O(n)-time heapify
|
| - else:
|
| - newPair = (val,key)
|
| - insertionPoint = len(heap)
|
| - heap.append(None)
|
| - while insertionPoint > 0 and newPair < heap[(insertionPoint-1)//2]:
|
| - heap[insertionPoint] = heap[(insertionPoint-1)//2]
|
| - insertionPoint = (insertionPoint-1)//2
|
| - heap[insertionPoint] = newPair
|
| -
|
| - def setdefault(self,key,val):
|
| - '''
|
| - Reimplement setdefault to pass through our customized __setitem__.
|
| - '''
|
| - if key not in self:
|
| - self[key] = val
|
| - return self[key]
|
|
|