Exemplo n.º 1
0
def nagamochi_capforest(g):
  unscanned_edges = set(multigraph_edges_as_triples(g))
  r = dict((node, 0) for node in g)
  q = {}

  graph_to_heap = {}
  unscanned_r_heap = Fibonacci_heap()
  for node in g:
    graph_to_heap[node] = unscanned_r_heap.enqueue(node, 0)

  while unscanned_r_heap:
    x_heap_node = unscanned_r_heap.dequeue_min()
    x = x_heap_node.get_value()
    for y, xy_dict in g[x].items():
      for i, edge_data in xy_dict.items():
        edge = (x, y, i)
        if not edge in unscanned_edges:
          continue
        unscanned_edges.remove(edge)
        unscanned_edges.remove((y, x, i))
        c = edge_data[EDGE_CAPACITY_ATTR]
      
        q[edge] = r[y] + c
        r[y] = r[y] + c
        y_heap_node = graph_to_heap[y]
        y_prio = y_heap_node.get_priority()
        unscanned_r_heap.decrease_key(y_heap_node, y_prio - c)
  return q
Exemplo n.º 2
0
def nagamochi_forest(g):
  unscanned_edges = set(multigraph_edges_as_triples(g))
  r = dict((node, 0) for node in g)

  graph_to_heap = {}
  unscanned_r_heap = Fibonacci_heap()
  for node in g:
    graph_to_heap[node] = unscanned_r_heap.enqueue(node, 0)

  partitions = {}

  while unscanned_r_heap:
    x_heap_node = unscanned_r_heap.dequeue_min()
    x = x_heap_node.get_value()
    graph_to_heap[x] = None
    for y, xy_es in g[x].items():
      for i, edge_dict in xy_es.items():
        edge = (x, y, i)
        if not edge in unscanned_edges:
          continue
        unscanned_edges.remove(edge)
        unscanned_edges.remove((y, x, i))

        k = r[y] + 1
        if not k in partitions:
          partitions[k] = set()
        partitions[k].add(edge)

        if r[x] is r[y]:
          r[x] += 1
        r[y] += 1
        y_heap_node = graph_to_heap[y]
        y_prio = y_heap_node.get_priority()
        unscanned_r_heap.decrease_key(y_heap_node, y_prio - 1)
  return partitions
Exemplo n.º 3
0
def prims_fh(graph, start):
    """ Prim's algorithm with fibonacci heap """

    pq = Fibonacci_heap()
    explored = {start}

    selected_edges = []
    incident_edges = [(weight, start, v) for (v, weight) in graph[start]]

    for edge in incident_edges:
        weight, start, v = edge
        pq.enqueue((start, v), weight)

    while pq.__nonzero__():
        selected_edge = pq.dequeue_min()
        value = selected_edge.get_value()
        selected_node = value[1]
        parent_node = value[0]
        selected_weight = selected_edge.m_priority

        if selected_node in explored:
            continue

        selected_edges.append((selected_weight, parent_node, selected_node))

        explored.add(selected_node)

        for edge in graph[selected_node]:
            v, weight = edge[0], edge[1]

            if v not in explored:
                pq.enqueue((selected_node, v), weight)

    return selected_edges
Exemplo n.º 4
0
    def createGraph(self):

        nodes = []
        g = Graph(nodes)
        f = open("GeneratedGraph.txt", "r")
        lines = f.readlines()
        linesSize = len(lines)
        f.close()
        numberOfNodes = int(lines[0])
        allNodeLinks = []

        for i in range(0, numberOfNodes):
            for j in range(1, numberOfNodes):
                nodeAndLinks = lines[j].split("->")
                links = nodeAndLinks[1].split(",")
                allNodeLinks.append(links)
            n = Node(i, i + 1, allNodeLinks[i])
            g.getNodes().append(n)

        actual = 1

        for j in range(numberOfNodes, linesSize):
            arcAndCost = lines[j].split("=")
            arcElements = arcAndCost[0].split(",")
            entry = (int(arcElements[0]), int(arcElements[1]))
            priority = int(arcAndCost[1])

            if actual == int(arcElements[0]):
                self.fibHeap.enqueue(entry, priority)
            else:
                actual = int(arcElements[0])
                self.fibHeaps.append(self.fibHeap)
                self.fibHeap = Fibonacci_heap()
                self.fibHeap.enqueue(entry, priority)
            if j == linesSize - 1:
                self.fibHeaps.append(self.fibHeap)

        for i in range(0, numberOfNodes):
            if i == 0:
                g.getNodes()[i].setWeight(0)
            else:
                g.getNodes()[i].setWeight(999999)

        return g
Exemplo n.º 5
0
def uprooting(G, X, ds, dsconf):
    C = dict()
    L = dict()
    I = dict()
    for x in G.nodes():
        MakeSet(C, x)
        L[x] = Fibonacci_heap()

    for u in G.edges():
        if (u in X.edges()):
            I[(min(u), max(u))]=0
        else:
            I[(min(u), max(u))]=-1

    for u in X.edges():
        xp=find(C,u[0])
        yp=find(C,u[1])
        if (xp!=yp):
            Link(C,xp,yp)

    for u in G.edges():
        if (u in X.edges()):
            continue
        cVal=ds.distance(u[0],u[1],dsconf)
        x=find(C,u[0])
        y=find(C,u[1])
        if (x!=y):
            L[x].enqueue((y,u),cVal)
            L[y].enqueue((x,u),cVal)

    merges=[]
    nCC=sum([1 for x in L if len(L[x])>0])
    for i in range(1,nCC):
        x=None
        xmin=np.inf
        for xx in L:
            if (len(L[xx])==0):
                continue
            cP=L[xx].min().get_priority()
            if (cP < xmin):
                x=xx
                xmin=cP
        xp=find(C,x)
        while len(L[xp])>0:
            (y,v)=L[xp].dequeue_min().get_value()
            yp=find(C,y)
            if (xp!=yp):
                break
        merges.append((min(v),max(v)))
        I[(min(v),max(v))]=i
        z=Link(C,xp,yp)
        L[z]=meld(C,L,xp,yp)
    return(I,merges)
Exemplo n.º 6
0
def nagamochi_forest(g):
    unscanned_edges = set(multigraph_edges_as_triples(g))
    r = dict((node, 0) for node in g)

    graph_to_heap = {}
    unscanned_r_heap = Fibonacci_heap()
    for node in g:
        graph_to_heap[node] = unscanned_r_heap.enqueue(node, 0)

    partitions = {}

    while unscanned_r_heap:
        x_heap_node = unscanned_r_heap.dequeue_min()
        x = x_heap_node.get_value()
        graph_to_heap[x] = None
        for y, xy_es in g[x].items():
            for i, edge_dict in xy_es.items():
                edge = (x, y, i)
                if not edge in unscanned_edges:
                    continue
                unscanned_edges.remove(edge)
                unscanned_edges.remove((y, x, i))

                k = r[y] + 1
                if not k in partitions:
                    partitions[k] = set()
                partitions[k].add(edge)

                if r[x] is r[y]:
                    r[x] += 1
                r[y] += 1
                y_heap_node = graph_to_heap[y]
                y_prio = y_heap_node.get_priority()
                unscanned_r_heap.decrease_key(y_heap_node, y_prio - 1)
    return partitions
Exemplo n.º 7
0
def nagamochi_capforest(g):
    unscanned_edges = set(multigraph_edges_as_triples(g))
    r = dict((node, 0) for node in g)
    q = {}

    graph_to_heap = {}
    unscanned_r_heap = Fibonacci_heap()
    for node in g:
        graph_to_heap[node] = unscanned_r_heap.enqueue(node, 0)

    while unscanned_r_heap:
        x_heap_node = unscanned_r_heap.dequeue_min()
        x = x_heap_node.get_value()
        for y, xy_dict in g[x].items():
            for i, edge_data in xy_dict.items():
                edge = (x, y, i)
                if not edge in unscanned_edges:
                    continue
                unscanned_edges.remove(edge)
                unscanned_edges.remove((y, x, i))
                c = edge_data[EDGE_CAPACITY_ATTR]

                q[edge] = r[y] + c
                r[y] = r[y] + c
                y_heap_node = graph_to_heap[y]
                y_prio = y_heap_node.get_priority()
                unscanned_r_heap.decrease_key(y_heap_node, y_prio - c)
    return q
Exemplo n.º 8
0
def dijkstra(source: OrientedWay) -> SingleSourceMap:
    """Dijkstra algorithm."""
    info: DefaultDict[OrientedWay, _NodeInfo]
    node: OrientedWay
    visited: Set[OrientedWay]

    queue = FibonacciHeap()
    visited = set()
    source_info = _NodeInfo(0.0)
    source_info.entry = queue.enqueue(source, 0)
    info = defaultdict(_NodeInfo, {source: source_info})

    while queue:
        node = queue.dequeue_min().get_value()
        node_info = info[node]
        visited.add(node)
        weight = node.weight
        for neighbor in node.way_connections:
            if neighbor in visited:
                continue
            neighbor_info = info[neighbor]
            new_dist = node_info.dist + weight
            if new_dist < neighbor_info.dist:
                if neighbor_info.dist == INF:
                    neighbor_info.entry = queue.enqueue(neighbor, new_dist)
                else:
                    queue.decrease_key_unchecked(neighbor_info.entry, new_dist)
                neighbor_info.dist = new_dist
                neighbor_info.prev = node
                neighbor_info.depth = node_info.depth + 1

    return {n: (i.prev, i.depth) for n, i in info.items()}
Exemplo n.º 9
0
        def buildMST(self, startx, starty):
            print 'building MST'
            mstT0 = time.time()
            heap = Fibonacci_heap()
            self.startpt = (startx, starty)
            heapTempGraph = {}
            for neighCoor, neighCost in self.pixelNodeList2D[
                    self.startpt].neighbors.iteritems():
                heapTempGraph[neighCoor] = heap.enqueue(value=neighCoor,
                                                        priority=neighCost)
                self.pixelNodeList2D[neighCoor].totalCost = neighCost
                self.pixelNodeList2D[neighCoor].prevNode = self.startpt

            while heap.m_size != 0:
                # print 'deq'
                # deqt0 = time.time()
                q = heap.dequeue_min()
                # mark q as EXPANDED (state = 0)
                self.pixelNodeList2D[q.m_elem].state = 0
                self.pixelNodeList2D[q.m_elem].totalCost = q.m_priority
                for rCoor, rCost in self.pixelNodeList2D[
                        q.m_elem].neighbors.iteritems():
                    rState = self.pixelNodeList2D[rCoor].state
                    if rState != 0:
                        if rState == -1:
                            self.pixelNodeList2D[rCoor].prevNode = q.m_elem
                            self.pixelNodeList2D[
                                rCoor].totalCost = self.pixelNodeList2D[
                                    q.m_elem].totalCost + rCost
                            heapTempGraph[rCoor] = heap.enqueue(
                                value=rCoor,
                                priority=self.pixelNodeList2D[rCoor].totalCost)
                            self.pixelNodeList2D[rCoor].state = 1
                        else:
                            if self.pixelNodeList2D[
                                    rCoor].totalCost > self.pixelNodeList2D[
                                        q.m_elem].totalCost + rCost:
                                self.pixelNodeList2D[rCoor].prevNode = q.m_elem
                                self.pixelNodeList2D[
                                    rCoor].totalCost = self.pixelNodeList2D[
                                        q.m_elem].totalCost + rCost
                                heap.decrease_key(
                                    heapTempGraph[rCoor],
                                    self.pixelNodeList2D[rCoor].totalCost)
                # deqTime = time.time() - deqt0
                # print deqTime
            self.pixelNodeList2D[self.startpt].prevNode = None
            mstTime = time.time() - mstT0
            print mstTime
            self.built_MST = True
Exemplo n.º 10
0
    def dijkstra_search(self, source_vertex: V,
                        target_vertex: V) -> Tuple[List[V], E]:
        self._assert_contains_vertices(source_vertex, target_vertex)

        # short-circuit for search for source
        if source_vertex == target_vertex:
            return [source_vertex], 0

        graph = self.graph
        parents = {}
        queue = Fibonacci_heap()

        # enqueue source vertex
        parents[source_vertex] = (source_vertex, 0,
                                  queue.enqueue(source_vertex, 0))

        # do search
        while len(queue) > 0:
            vertex = queue.dequeue_min().get_value()
            # check for target vertex
            if vertex == target_vertex:
                break

            for edge in graph.edges_from_vertex(vertex):
                adjacent_vertex = edge.get_target_vertex()
                priority = edge.get_weight() + parents[vertex][1]
                if adjacent_vertex not in parents:
                    # push new vertex
                    parents[adjacent_vertex] = (vertex, priority,
                                                queue.enqueue(
                                                    adjacent_vertex, priority))
                elif priority < parents[adjacent_vertex][1]:
                    # adjust priority of adjacent_vertex
                    entry = parents[adjacent_vertex][2]
                    queue.decrease_key(entry, priority)
                    parents[adjacent_vertex] = (vertex, priority, entry)

        if target_vertex not in parents:
            raise NoGraphPathException(
                "Source and target vertices are not linked in the graph")

        parent = parents[target_vertex][0]
        path = [target_vertex, parent]
        while parent != source_vertex:
            parent = parents[parent][0]
            path.append(parent)

        return reversed(path), parents[target_vertex][1]
Exemplo n.º 11
0
def meld(C, L, x, y):
    res=Fibonacci_heap()
    while (len(L[x])>0):
        el=L[x].dequeue_min()
        _,v=el.get_value()
        if (find(C,v[0])!=find(C,v[1])):
            res.enqueue(el.get_value(),el.get_priority())
    while (len(L[y])>0):
        el=L[y].dequeue_min()
        _,v=el.get_value()
        if (find(C,v[0])!=find(C,v[1])):
            res.enqueue(el.get_value(),el.get_priority())
    return(res)
Exemplo n.º 12
0
def observations_iterator(probs):
    # yield first obs with all outputs probs > 0.5
    max_obs = {name: (0,p) if p > 0.5 else (1,1-p) for name,p in probs.items()}
    sorted_outputs = sorted(max_obs.items(), key=lambda x: x[1][1])
    output_names, pack = zip(*sorted_outputs)
    max_obs_values, output_probs = zip(*pack)
    yield dict(zip(output_names, max_obs_values))

    size = len(output_names) - 1
    heap = Fibonacci_heap()
    values = list(max_obs_values)
    max_index = 0
    values[max_index] = 1 - values[max_index]
    prob = observation_prob(dict(zip(output_names, values)), probs)
    heap.enqueue((values, max_index, prob, None), -prob)
    while len(heap) > 0:
        values, max_index, prob, next_node = heap.dequeue_min().m_elem
        if next_node:
            heap.enqueue(next_node, -next_node[2])
        yield dict(zip(output_names, values))
        if max_index == size:
            continue

        # add left child - switch max index key i with i+1 : update values and probability
        # create right child for later - add i+1 key
        values_right_node = values[:]
        max_index_right_node = max_index + 1
        values_right_node[max_index_right_node] = 1 - values_right_node[max_index_right_node]
        prob_right_node = prob * ((1 / output_probs[max_index_right_node]) - 1)
        right_node = (values_right_node, max_index_right_node, prob_right_node, None)

        values_left_node = values_right_node[:]
        values_left_node[max_index] = 1 - values_left_node[max_index]
        prob_left_node = prob_right_node / ((1/output_probs[max_index]) - 1)

        heap.enqueue((values_left_node, max_index + 1, prob_left_node, right_node), -prob_left_node)
Exemplo n.º 13
0
def dijkstra(graph, start, end, flag="shortest"):
    """Calculate the shortest path between a start- and an end-vertex.

    `graph` needs to support at least neighbors(n) which returns a list of new
    nodes and weight(a,b) returning a float value. Smaller weights are
    preferred by the algorithm.
    """

    prev = {}
    costs = {}
    entry = {}

    remaining = set([end])

    weight_fn = COST_FN[flag]
    costs[start] = 0.0

    queue = Fibonacci_heap()
    entry[start] = queue.enqueue(start, 0.0)
    while queue:
        system = queue.dequeue_min().get_value()

        if system in remaining:
            remaining.remove(system)

        # Early exit as we found everything
        if not remaining:
            break

        for neighbor in graph.neighbors(system):
            if neighbor in prev:  # we have already seen this neighbor
                continue

            new_cost = costs[system] + weight_fn(graph, neighbor)
            if neighbor in costs and new_cost < costs[neighbor]:
                costs[neighbor] = new_cost
                prev[neighbor] = system
                queue.decrease_key(entry[neighbor], costs[neighbor])
            if neighbor not in costs:
                costs[neighbor] = new_cost
                prev[neighbor] = system
                entry[neighbor] = queue.enqueue(neighbor, costs[neighbor])

    return path(prev, start, end)
Exemplo n.º 14
0
def dijkstra(graph, start, ends):
    prev = {}
    costs = {}
    entry = {}

    remaining = set(ends)

    costs[start] = 0.0

    q = Fibonacci_heap()
    entry[start] = q.enqueue(start, 0.0)

    while q:
        u = q.dequeue_min().get_value()

        if u in remaining:
            remaining.remove(u)

        if not remaining:
            break

        for v in graph[u]:
            if v in prev:
                continue

            new_cost = costs[u] + 1

            if v in costs and new_cost < costs[v]:
                costs[v] = new_cost
                prev[v] = u
                q.decrease_key(entry[v], costs[v])

            if v not in costs:
                costs[v] = new_cost
                prev[v] = u
                entry[v] = q.enqueue(v, costs[v])

    result = []
    for end in ends:
        result.append(path(prev, start, end))

    return result
Exemplo n.º 15
0
    def dijkstra_search(self, source_vertex: V, target_vertex: V) -> Tuple[List[V], E]:
        self._assert_contains_vertices(source_vertex, target_vertex)

        # short-circuit for search for source
        if source_vertex == target_vertex:
            return [source_vertex], 0

        graph = self.graph
        parents = {}
        queue = Fibonacci_heap()

        # enqueue source vertex
        parents[source_vertex] = (source_vertex, 0, queue.enqueue(source_vertex, 0))

        # do search
        while len(queue) > 0:
            vertex = queue.dequeue_min().get_value()
            # check for target vertex
            if vertex == target_vertex:
                break

            for edge in graph.edges_from_vertex(vertex):
                adjacent_vertex = edge.get_target_vertex()
                priority = edge.get_weight() + parents[vertex][1]
                if adjacent_vertex not in parents:
                    # push new vertex
                    parents[adjacent_vertex] = (vertex, priority, queue.enqueue(adjacent_vertex, priority))
                elif priority < parents[adjacent_vertex][1]:
                    # adjust priority of adjacent_vertex
                    entry = parents[adjacent_vertex][2]
                    queue.decrease_key(entry, priority)
                    parents[adjacent_vertex] = (vertex, priority, entry)

        if target_vertex not in parents:
            raise NoGraphPathException("Source and target vertices are not linked in the graph")

        parent = parents[target_vertex][0]
        path = [target_vertex, parent]
        while parent != source_vertex:
            parent = parents[parent][0]
            path.append(parent)

        return reversed(path), parents[target_vertex][1]
Exemplo n.º 16
0
class MyFibonacciHeap(dict):
    # ------------------------------------------------------
    # have 3 container
    # itemlist: a list to store key
    # super   : a dict to store entry
    # heap    : a fibonacci heap to maintain the priority
    # ------------------------------------------------------

    def __init__(self, *args, **kw):
        self.itemlist = []
        self.heap = Fibonacci_heap()

        self.update(*args, **kw)

    # ------------------------------------------------------
    # __setitem__
    #   key: item name
    #   value: (int)priority
    #
    # ------------------------------------------------------
    def __setitem__(self, key, priority):

        if type(priority) is not int:
            raise TypeError, "priority type is " + str(type(priority))
        if key in self.itemlist:
            if self[key] < priority:
                raise ValueError, "priority cannot be increase."
            else:
                entry = super(MyFibonacciHeap, self).__getitem__(key)
                self.heap.decrease_key(entry, priority)
        else:
            self.itemlist.append(key)
            super(MyFibonacciHeap,
                  self).__setitem__(key, self.heap.enqueue(key, priority))

    # ------------------------------------------------------
    # __getitem__
    #   key: the value of the item or item name
    #
    #   return the priority of the entry of the key
    # ------------------------------------------------------
    def __getitem__(self, key):
        return super(MyFibonacciHeap, self).__getitem__(key).get_priority()

    def __delitem__(self, key):
        entry = super(MyFibonacciHeap, self).pop(key)
        self.heap.delete(entry)
        self.itemlist.remove(key)

    """
    def __iter__(self):
        '''
        if self.heap.__len__() is not 0:
            i = 1
            entry = self.heap.min()
            yield entry.get_value()
            while i < self.heap.__len__():
                entry = entry.m_next
                yield entry.get_value()
                i += 1
        '''
        while self.heap.__len__() is not 0:
            entry  = self.heap.dequeue_min()
            yield entry.get_value()
            self.itemlist.remove(entry.get_value())
            super(MyFibonacciHeap, self).pop(entry.get_value())
    """

    def __repr__(self):
        string = '{\n    '
        string += ', \n    '.join(
            [str(key) + ': ' + str(self[key]) for key in self])
        string += '\n}'
        return string

    def __len__(self):
        return super(MyFibonacciHeap, self).__len__()

    def keys(self):
        return self.itemlist

    def update(self, *args, **kw):
        if len(args) is not 0:
            if type(args[0]) is dict:  # dict in tuple
                for key in args[0]:
                    self.__setitem__(key, args[0][key])
            elif type(args[0]) is list:  # tuple in list in tuple
                for item in args[0]:
                    self.__setitem__(item[0], item[1])

        for key in kw:
            self.__setitem__(key, kw[key])

    def enqueue(self):
        self.__setitem__(value, priority)

    def dequeue(self, value, priority):
        entry = self.heap.dequeue_min()
        self.itemlist.remove(entry.get_value())
        super(MyFibonacciHeap, self).pop(entry.get_value())
        return entry
Exemplo n.º 17
0
def hierMWW(D, Gr, NbyInd, dsconf, maxClusters=20):

    IndByN = {NbyInd[i]: i for i in NbyInd}

    T = np.percentile(D, 25)

    G = Gr.copy()
    lName = 'data'
    for e in G.edges():
        i1 = IndByN[e[0]]
        i2 = IndByN[e[1]]
        cD = D[i1, i2]
        G[e[0]][e[1]][lName] = cD

    psi = watershed(G, lName)
    nClusters = len(set(psi.values()))
    lastNClusters = nClusters
    while (nClusters > maxClusters):

        clInds = dict()
        for L in set(psi.values()):
            clInds[L] = []
        for n in psi:
            clInds[psi[n]].append(IndByN[n])

        H = Fibonacci_heap()
        Lused = dict()
        for e in G.edges():
            l1 = min(psi[e[0]], psi[e[1]])
            l2 = max(psi[e[0]], psi[e[1]])
            if (l1 != l2):
                if (l1 not in Lused):
                    Lused[l1] = dict()
                if (l2 not in Lused[l1]):
                    Lused[l1][l2] = True
                    H.enqueue((l1, l2),
                              np.nanmedian((D[clInds[l1], :])[:, clInds[l2]]))

        used = []
        while len(H) > 0:
            el = H.dequeue_min()
            if (el.get_priority() > T):
                if (nClusters != lastNClusters):
                    lastNClusters = nClusters
                    print('skip', nClusters, el.get_priority())
                    break

            l1, l2 = el.get_value()
            if (l1 in used) or (l2 in used):
                continue

            used.extend([l1, l2])

            for n in psi:
                if (psi[n] == l2):
                    psi[n] = l1
            nClusters -= 1
            if (nClusters == maxClusters):
                break

    labels = list(sorted(set(psi.values())))
    print('now with ', len(labels))
    for n in psi:
        psi[n] = labels.index(psi[n])
    corr = []
    corr.append(list(range(len(labels))))
    nextlabel = len(labels)
    while (nClusters > 1):
        print('#clusters', nClusters)
        H = Fibonacci_heap()
        Lused = dict()

        clInds = dict()
        for L in corr[-1]:
            clInds[L] = []
        for n in psi:
            clInds[corr[-1][psi[n]]].append(IndByN[n])

        for e in G.edges():
            l1 = min(corr[-1][psi[e[0]]], corr[-1][psi[e[1]]])
            l2 = max(corr[-1][psi[e[0]]], corr[-1][psi[e[1]]])
            if (l1 != l2):
                if (l1 not in Lused):
                    Lused[l1] = dict()
                if (l2 not in Lused[l1]):
                    Lused[l1][l2] = True
                    H.enqueue((l1, l2),
                              np.nanmedian((D[clInds[l1], :])[:, clInds[l2]]))

        el = H.dequeue_min()
        l1, l2 = el.get_value()
        print(el.get_priority())

        tVec = corr[-1][:]
        for i in range(len(tVec)):
            if (tVec[i] == l1) or (tVec[i] == l2):
                tVec[i] = nextlabel
        corr.append(tVec)
        nextlabel += 1
        nClusters -= 1

    clusters = dict()
    for i in range(len(corr)):
        for n in psi:
            c = corr[i][psi[n]]
            if c not in clusters:
                clusters[c] = []
            clusters[c].append(n)
        for c in clusters:
            clusters[c] = list(set(clusters[c]))

    return (psi, corr, clusters)
Exemplo n.º 18
0
class MyFibonacciHeap(dict):
    # ------------------------------------------------------
    # have 3 container
    # itemlist: a list to store key
    # super   : a dict to store entry
    # heap    : a fibonacci heap to maintain the priority
    # ------------------------------------------------------


    def __init__(self, *args, **kw):
        self.itemlist = []
        self.heap = Fibonacci_heap()

        self.update(*args, **kw)

    # ------------------------------------------------------
    # __setitem__
    #   key: item name
    #   value: (int)priority
    # 
    # ------------------------------------------------------
    def __setitem__(self, key, priority):

        if type(priority) is not int:
            raise TypeError, "priority type is " + str(type(priority))
        if key in self.itemlist:
            if self[key] < priority:
                raise ValueError, "priority cannot be increase."
            else:
                entry = super(MyFibonacciHeap, self).__getitem__(key)
                self.heap.decrease_key(entry, priority)
        else:
            self.itemlist.append(key)
            super(MyFibonacciHeap, self).__setitem__(key, self.heap.enqueue(key, priority))

    # ------------------------------------------------------
    # __getitem__
    #   key: the value of the item or item name 
    #
    #   return the priority of the entry of the key
    # ------------------------------------------------------
    def __getitem__(self, key):
        return super(MyFibonacciHeap, self).__getitem__(key).get_priority()
        
    def __delitem__(self, key):
        entry = super(MyFibonacciHeap, self).pop(key)
        self.heap.delete(entry)
        self.itemlist.remove(key)


    """
    def __iter__(self):
        '''
        if self.heap.__len__() is not 0:
            i = 1
            entry = self.heap.min()
            yield entry.get_value()
            while i < self.heap.__len__():
                entry = entry.m_next
                yield entry.get_value()
                i += 1
        '''
        while self.heap.__len__() is not 0:
            entry  = self.heap.dequeue_min()
            yield entry.get_value()
            self.itemlist.remove(entry.get_value())
            super(MyFibonacciHeap, self).pop(entry.get_value())
    """


    def __repr__(self):
        string = '{\n    '
        string += ', \n    '.join([str(key) + ': ' + str(self[key]) for key in self])
        string += '\n}'
        return string

    def __len__(self):
        return super(MyFibonacciHeap, self).__len__()

    def keys(self):
        return self.itemlist

    def update(self, *args, **kw):
        if len(args) is not 0:
            if type(args[0]) is dict: # dict in tuple
                for key in args[0]:
                    self.__setitem__(key, args[0][key])
            elif type(args[0]) is list: # tuple in list in tuple
                for item in args[0]:
                    self.__setitem__(item[0], item[1])

        for key in kw:
            self.__setitem__(key, kw[key])

    def enqueue(self):
        self.__setitem__(value, priority)

    def dequeue(self, value, priority):
        entry = self.heap.dequeue_min()
        self.itemlist.remove(entry.get_value())
        super(MyFibonacciHeap, self).pop(entry.get_value())
        return entry
Exemplo n.º 19
0
    def __init__(self, *args, **kw):
        self.itemlist = []
        self.heap = Fibonacci_heap()

        self.update(*args, **kw)
Exemplo n.º 20
0
class FibonacciHeapDijkstra:
    def __init__(self):
        pass

    nodeLinkAndCost = []
    fibHeaps = []
    fibHeap = Fibonacci_heap()

    def createGraph(self):

        nodes = []
        g = Graph(nodes)
        f = open("GeneratedGraph.txt", "r")
        lines = f.readlines()
        linesSize = len(lines)
        f.close()
        numberOfNodes = int(lines[0])
        allNodeLinks = []

        for i in range(0, numberOfNodes):
            for j in range(1, numberOfNodes):
                nodeAndLinks = lines[j].split("->")
                links = nodeAndLinks[1].split(",")
                allNodeLinks.append(links)
            n = Node(i, i + 1, allNodeLinks[i])
            g.getNodes().append(n)

        actual = 1

        for j in range(numberOfNodes, linesSize):
            arcAndCost = lines[j].split("=")
            arcElements = arcAndCost[0].split(",")
            entry = (int(arcElements[0]), int(arcElements[1]))
            priority = int(arcAndCost[1])

            if actual == int(arcElements[0]):
                self.fibHeap.enqueue(entry, priority)
            else:
                actual = int(arcElements[0])
                self.fibHeaps.append(self.fibHeap)
                self.fibHeap = Fibonacci_heap()
                self.fibHeap.enqueue(entry, priority)
            if j == linesSize - 1:
                self.fibHeaps.append(self.fibHeap)

        for i in range(0, numberOfNodes):
            if i == 0:
                g.getNodes()[i].setWeight(0)
            else:
                g.getNodes()[i].setWeight(999999)

        return g

    def dijkstraWithFibonacciHeap(self):

        graph = self.createGraph()
        nodes = graph.getNodes()
        temporaryNodes = nodes
        selected = temporaryNodes[0].getNodeId()
        print("Init " + str(selected))
        sink = nodes[len(nodes) - 1].getNodeId()
        print("The sink is " + str(sink))
        predecessors = []
        trigger = selected
        next = 0

        start = time.clock()

        while trigger != sink:
            print("Node actually selected is: " + str(selected))
            trigger = selected

            if selected != sink:
                elementInExam = ((
                    self.fibHeaps[next]).dequeue_min()).get_value()[1]
                next = elementInExam - 1
                predecessors.append(selected)
                selected = elementInExam

        predecessors.append(sink)

        print("Dijkstra Algorithm performed in " + str((time.clock() - start)))

        return predecessors
Exemplo n.º 21
0
    def __init__(self, *args, **kw):
        self.itemlist = []
        self.heap = Fibonacci_heap()

        self.update(*args, **kw)