Exemplo n.º 1
0
def creaRandom():
    # CREAZIONE RANDOM DEL GRAFO

    g = Graph()

    for i in range(100):
        g.insert_vertex(i)

    nodi = g.vertices()

    for i in range(0, len(nodi)):
        while True:
            peso = randint(1, 1000000000)
            if g.peso_unico(peso):
                if i + 1 == len(nodi):
                    g.insert_edge(nodi[i], nodi[0], peso)
                    break
                else:
                    g.insert_edge(nodi[i], nodi[i + 1], peso)
                    break

    for node in nodi:
        i = 0
        while i < 3:
            peso = randint(1, 1000000000)
            # NUMERO MOLTO GRANDE PER AVERE QUASI LA CERTEZZA DI NON AVERE ARCHI CON LO STESSO PESO
            # LA FUNZIONE PER IL CONTROLLO è PRESENTE NELA CLASSE DEL GRAFO MA IMPIEGA MOLTO TEMPO
            nodo2 = randint(0, 9999)
            if nodo2 != node.element() and g.get_edge(
                    node, nodi[nodo2]) is None and g.peso_unico(peso):
                i = i + 1
                g.insert_edge(node, nodi[nodo2], peso)

    return g
Exemplo n.º 2
0
 def test_enum_hops(self):
     g = Graph(nodes=EnumNodes(['x', 'y', 'z']),
               edges=EnumEdges(Hops.from_dict(x={'y', 'z'})))
     self.assertTrue(g.has_node('y'))
     self.assertFalse(g.has_node('a'))
     self.assertCountEqual(g.predecessors_of('y'), ['x'])
     self.assertCountEqual(g.predecessors_of('x'), [])
Exemplo n.º 3
0
def grafi_connessi():
    g = Graph()
    g2=Graph()

    dict_edge={}



    n=100
    g_seq=Graph_seq(n)
    for i in range(n):
        v0=g.insert_vertex(i)
        g2.insert_vertex(i)
        v0.connessioni=Array("i",n,lock=False)
        v0.pesi_condivisi=Array("i",n,lock=False)

    nodi=g.vertices()
    for i in range(len(nodi)):
        print(i)
        j=i+1
        for x in range(j,len(nodi)):
            while True:
                peso = randint( 1, 100000000 )
                if g.peso_unico(peso):
                        e=g.insert_edge( nodi[i], nodi[x], peso )
                        g_seq.addEdge(i,x,peso)
                        dict_edge[e.element()]=e
                        nodi[i].pesi_condivisi[nodi[x].element()]=peso
                        nodi[x].pesi_condivisi[nodi[i].element()]=peso

                        nodi[i].connessioni[len(nodi[i].listaArchi)-1]=nodi[x].element()
                        nodi[x].connessioni[len(nodi[x].listaArchi)-1]=nodi[i].element()
                        break
    lista_pesi_condivisi=[]
    lista_connessioni_condivise=[]

    for node in nodi:
        if len(node.listaArchi)<n:
            node.connessioni[len(node.listaArchi)]=-1

        lista_pesi_condivisi.append(node.pesi_condivisi)
        lista_connessioni_condivise.append(node.connessioni)

    return g,g_seq,lista_pesi_condivisi,lista_connessioni_condivise,dict_edge
Exemplo n.º 4
0
 def test_graph_propagator_incoming(self):
     g = Graph(nodes=EnumNodes(['a', 'b', 'o']),
               edges=EnumEdges(Hops.from_pairs(('a', 'b'), ('b', 'o'))))
     p = GraphPropagatorIncoming(positive_feedback_rate=0.2,
                                 alpha=0.9,
                                 max_total=1.0,
                                 noise=0.0)
     in_d = dict(a=1.0, b=0.5, o=0.0)
     out_d = p.propagate(g, in_d)
     self.assertAlmostEqual(out_d['a'], 0.569072143062159)
     self.assertAlmostEqual(out_d['b'], 0.319848331226608)
     self.assertAlmostEqual(out_d['o'], 0.11107952571123292)
Exemplo n.º 5
0
    def test_augment(self):
        g1 = AlphabetGraph()
        g2 = Graph(nodes=EnumNodes(range(1, 4)),
                   edges=EnumEdges(
                       Hops.from_pairs((1, 'a'), (2, 'b'), (3, 'c'))))
        g = Graph.augment(g2, g1)

        self.assertTrue(g2.has_node(1))
        self.assertFalse(g2.has_node('a'))
        self.assertFalse(g2.find_hop(1, 'a'))
        self.assertCountEqual(g2.successors_of(2), [])
        self.assertCountEqual(g2.predecessors_of('c'), [])

        self.assertTrue(g.has_node(1))
        self.assertTrue(g.has_node('a'))
        self.assertTrue(g.find_hop(1, 'a'))
        self.assertCountEqual(g.successors_of(2), ['b'])
        self.assertCountEqual(g.predecessors_of('b'), [2, 'a'])
Exemplo n.º 6
0
    def test_doubled_graph(self):
        g0 = Graph(nodes=EnumNodes(['a', 'b', 'o']),
                   edges=EnumEdges(Hops.from_pairs(('a', 'b'), ('b', 'o'))))
        g = Graph.augment(PrefixedGraph(1, g0), PrefixedGraph(2, g0))

        self.assertTrue(g.has_node(PrefixedNode(1, 'a')))
        self.assertTrue(g.has_node(PrefixedNode(2, 'a')))
        self.assertFalse(g.has_node(PrefixedNode(3, 'a')))
        self.assertFalse(g.has_node('a'))
        self.assertEqual(
            g.find_hop(PrefixedNode(1, 'a'), PrefixedNode(1, 'b')),
            Hop(PrefixedNode(1, 'a'), PrefixedNode(1, 'b'), 1.0))
        self.assertEqual(
            g.find_hop(PrefixedNode(2, 'a'), PrefixedNode(2, 'b')),
            Hop(PrefixedNode(2, 'a'), PrefixedNode(2, 'b'), 1.0))
        self.assertEqual(
            g.find_hop(PrefixedNode(1, 'a'), PrefixedNode(2, 'b')), None)
        self.assertEqual(g.find_hop('a', 'b'), None)

        # .add_edges() from one PrefixedGraph to the other

        g2 = g.add_edges(
            EnumEdges(
                Hops.from_pairs((PrefixedNode(1, 'a'), PrefixedNode(2, 'a')))))
        self.assertEqual(
            g2.find_hop(PrefixedNode(1, 'a'), PrefixedNode(2, 'a')),
            Hop(PrefixedNode(1, 'a'), PrefixedNode(2, 'a'), 1.0))

        self.assertCountEqual(g2.query(OfClass(str)), [
            PrefixedNode(1, 'a'),
            PrefixedNode(1, 'b'),
            PrefixedNode(1, 'o'),
            PrefixedNode(2, 'a'),
            PrefixedNode(2, 'b'),
            PrefixedNode(2, 'o')
        ])
        self.assertCountEqual(
            g2.query(WithPrefix(2, OfClass(str))),
            [PrefixedNode(2, 'a'),
             PrefixedNode(2, 'b'),
             PrefixedNode(2, 'o')])
        self.assertCountEqual(g0.query(WithPrefix(2, OfClass(str))), [])
Exemplo n.º 7
0
def creaRandom():
    # CREAZIONE RANDOM DEL GRAFO

    g = Graph()
    g2=Graph()

    dict_edge={}



    n=100
    g_seq=Graph_seq(n)
    for i in range(n):
        v0=g.insert_vertex(i)
        g2.insert_vertex(i)
        v0.connessioni=Array("i",n,lock=False)
        v0.pesi_condivisi=Array("i",n,lock=False)
        #print(i)
        #v0.archi_condivisi=m.list([0 for x in range(n-1)])

    nodi=g.vertices()
    nodi2=g2.vertices()


    for i in range(0,len(nodi)):
        while True:
            peso = randint( 1, 100000000 )
            if g.peso_unico(peso):
                if i+1==len(nodi):
                    e=g.insert_edge( nodi[i], nodi[0], peso )
                    g_seq.addEdge(i,0,peso)
                    dict_edge[e.element()]=e
                    nodi[i].pesi_condivisi[nodi[0].element()]=peso
                    nodi[0].pesi_condivisi[nodi[i].element()]=peso

                    nodi[i].connessioni[len(nodi[i].listaArchi)-1]=nodi[0].element()
                    nodi[0].connessioni[len(nodi[0].listaArchi)-1]=nodi[i].element()


                    g2.insert_edge( nodi2[i], nodi2[0], peso )
                    break
                else:
                    e=g.insert_edge( nodi[i], nodi[i+1], peso )
                    dict_edge[e.element()]=e
                    g_seq.addEdge(i,i+1,peso)
                    nodi[i].pesi_condivisi[nodi[i+1].element()]=peso
                    nodi[i+1].pesi_condivisi[nodi[i].element()]=peso
                    nodi[i].connessioni[len(nodi[i].listaArchi)-1]=nodi[i+1].element()
                    nodi[i+1].connessioni[len(nodi[i+1].listaArchi)-1]=nodi[i].element()

                    g2.insert_edge( nodi2[i], nodi2[i+1], peso )
                    break


    lista_archi_condivisi=[]
    for node in nodi:
        i=0
        #print(node,flush=True)
        print("node",node,flush=True)
        while i<1:
            peso = randint( 1, 100000000 )
            # NUMERO MOLTO GRANDE PER AVERE QUASI LA CERTEZZA DI NON AVERE ARCHI CON LO STESSO PESO
            # LA FUNZIONE PER IL CONTROLLO è PRESENTE NELA CLASSE DEL GRAFO MA IMPIEGA MOLTO TEMPO
            nodo2 = randint(0, n-1)
            if nodo2 != node.element() and g.get_edge(node,nodi[nodo2]) is None and g.peso_unico(peso):

                e=g.insert_edge( node, nodi[nodo2], peso )
                g_seq.addEdge(node.element(),nodo2,peso)
                dict_edge[e.element()]=e
                g2.insert_edge( nodi2[node.element()], nodi2[nodo2], peso )

                node.pesi_condivisi[nodi[nodo2].element()]=peso
                nodi[nodo2].pesi_condivisi[node.element()]=peso
                node.connessioni[len(node.listaArchi)-1]=nodi[nodo2].element()
                nodi[nodo2].connessioni[len( nodi[nodo2].listaArchi)-1]=node.element()
                i=i+1

    lista_pesi_condivisi=[]
    lista_connessioni_condivise=[]

    for node in nodi:
        if len(node.listaArchi)<n:
            node.connessioni[len(node.listaArchi)]=-1

        lista_pesi_condivisi.append(node.pesi_condivisi)
        lista_connessioni_condivise.append(node.connessioni)





    return g,g_seq,lista_pesi_condivisi,lista_connessioni_condivise,dict_edge
Exemplo n.º 8
0
def Boruvka_parallel_array(g,lista_pesi_condivisi,lista_connessioni,dict_edge):
    grafoB = Graph()

    lista_nodi = g.vertices()

    for node in lista_nodi:
        grafoB.insert_vertex( node.element() )

    peso_albero=0
    parent = Array( "i", g.vertex_count(), lock=False )
    successor_next =Array( "i",g.vertex_count(), lock=False )


    result=Array("i",g.vertex_count(),lock=False)

    jobs_min=JoinableQueue()

    processes_minimo=minimo_paralelo(parent,successor_next,lista_pesi_condivisi,lista_connessioni,jobs_min,result)
    lista_nodi_boruvka=grafoB.vertices()






    t66=time()
    while len( lista_nodi ) > 1:
        lista_divisa_interi=dividi_gruppi(lista_nodi,8)
        t2=time()
        add_jobs(jobs_min,lista_divisa_interi,0)
        jobs_min.join()


        for node in lista_nodi:
            edge=dict_edge[result[node.element()]]

            n1,n2=edge.endpoints_posizione()
            e=grafoB.insert_edge(lista_nodi_boruvka[n1],lista_nodi_boruvka[n2]
                                 ,edge.element())
            if e is not None:
                peso_albero+=edge.element()


        for node in lista_nodi:
            i=node.element()
            parent_opposto = parent[parent[i]]
            if i == parent_opposto:
                if i < parent[i]:
                    parent[i] = i
                else:
                    parent[parent[i]] = parent[i]

        while True:
            bool = True

            add_jobs(jobs_min,lista_divisa_interi,1)
            jobs_min.join()

            for x, y in zip( parent, successor_next ):
                if x != y:

                    bool = False
                    break

            if bool:
                break

            add_jobs(jobs_min,lista_divisa_interi,2)
            jobs_min.join()



        for node in lista_nodi:
            node.root =parent[node.element()]
            node.setElement( node.root )



        dict_merge={}


        for node in lista_nodi:
            if node.root==node.posizione:
                dict_merge[node.root]=[]


        add_jobs(jobs_min,lista_divisa_interi,3)
        jobs_min.join()


        lista=[x for x in lista_nodi]
        lista_nodi=[]
        for node in lista:
            if node.posizione!=node.root:
                dict_merge[node.root].append(node.posizione)
            else:
                lista_nodi.append(node)



        if len(lista_nodi)<=1:
            break





        add_jobs(jobs_min,dict_merge,4)
        jobs_min.join()





    for pr in processes_minimo:
        pr.terminate()





    return (grafoB,peso_albero)
Exemplo n.º 9
0
def creaRandom():
    # CREAZIONE RANDOM DEL GRAFO

    g = Graph()
    g_sequenziale = Graph()
    g_parallel_array = Graph()
    g_parallel_queue = Graph()
    g_prim = Graph2()
    dict_edge = {}

    n = 10000
    for i in range(n):

        g_sequenziale.insert_vertex(i)
        v1 = g_parallel_queue.insert_vertex(i)
        v2 = g_parallel_array.insert_vertex(i)
        v1.connessioni = Array("i", n, lock=False)
        v1.pesi_condivisi = Array("i", n, lock=False)
        v2.connessioni = Array("i", n, lock=False)
        v2.pesi_condivisi = Array("i", n, lock=False)
        g_prim.insert_vertex(i)
        g.insert_vertex(i)

    nodi = g.vertices()
    nodi_sequenziale = g_sequenziale.vertices()
    nodi_array = g_parallel_array.vertices()
    nodi_queue = g_parallel_queue.vertices()
    nodi_prim = g_prim.vertices()

    for i in range(0, len(nodi)):
        while True:
            peso = randint(1, 100000000)
            if g.peso_unico(peso):
                if i + 1 == len(nodi):
                    e = g.insert_edge(nodi[i], nodi[0], peso)
                    dict_edge[e.element()] = e
                    g_prim.insert_edge(nodi_prim[i], nodi_prim[0], peso)
                    g_sequenziale.insert_edge(nodi_sequenziale[i],
                                              nodi_sequenziale[0], peso)

                    g_parallel_array.insert_edge(nodi_array[i], nodi_array[0],
                                                 peso)
                    g_parallel_queue.insert_edge(nodi_queue[i], nodi_queue[0],
                                                 peso)
                    nodi_queue[i].pesi_condivisi[
                        nodi_queue[0].element()] = peso
                    nodi_queue[0].pesi_condivisi[
                        nodi_queue[i].element()] = peso

                    nodi_queue[i].connessioni[len(nodi_queue[i].listaArchi) -
                                              1] = nodi_queue[0].element()
                    nodi_queue[0].connessioni[len(nodi_queue[0].listaArchi) -
                                              1] = nodi_queue[i].element()

                    nodi_array[i].pesi_condivisi[
                        nodi_array[0].element()] = peso
                    nodi_array[0].pesi_condivisi[
                        nodi_array[i].element()] = peso

                    nodi_array[i].connessioni[len(nodi_array[i].listaArchi) -
                                              1] = nodi_array[0].element()
                    nodi_array[0].connessioni[len(nodi_array[0].listaArchi) -
                                              1] = nodi_array[i].element()
                    break

                else:
                    e = g.insert_edge(nodi[i], nodi[i + 1], peso)
                    dict_edge[e.element()] = e
                    g_prim.insert_edge(nodi_prim[i], nodi_prim[i + 1], peso)
                    g_sequenziale.insert_edge(nodi_sequenziale[i],
                                              nodi_sequenziale[i + 1], peso)
                    g_parallel_array.insert_edge(nodi_array[i],
                                                 nodi_array[i + 1], peso)
                    g_parallel_queue.insert_edge(nodi_queue[i],
                                                 nodi_queue[i + 1], peso)

                    nodi_queue[i].pesi_condivisi[nodi_queue[
                        i + 1].element()] = peso
                    nodi_queue[i + 1].pesi_condivisi[
                        nodi_queue[i].element()] = peso
                    nodi_queue[i].connessioni[len(nodi_queue[i].listaArchi) -
                                              1] = nodi_queue[i + 1].element()
                    nodi_queue[i +
                               1].connessioni[len(nodi_queue[i + 1].listaArchi)
                                              - 1] = nodi_queue[i].element()

                    nodi_array[i].pesi_condivisi[nodi_array[
                        i + 1].element()] = peso
                    nodi_array[i + 1].pesi_condivisi[
                        nodi_array[i].element()] = peso
                    nodi_array[i].connessioni[len(nodi_array[i].listaArchi) -
                                              1] = nodi_array[i + 1].element()
                    nodi_array[i +
                               1].connessioni[len(nodi_array[i + 1].listaArchi)
                                              - 1] = nodi_array[i].element()
                    break

    for node in nodi:
        i = 0
        while i < 99:
            peso = randint(1, 100000000)
            # NUMERO MOLTO GRANDE PER AVERE QUASI LA CERTEZZA DI NON AVERE ARCHI CON LO STESSO PESO
            # LA FUNZIONE PER IL CONTROLLO è PRESENTE NELA CLASSE DEL GRAFO MA IMPIEGA MOLTO TEMPO
            nodo2 = randint(0, n - 1)
            if nodo2 != node.element() and g.get_edge(
                    node, nodi[nodo2]) is None and g.peso_unico(peso):

                e = g.insert_edge(node, nodi[nodo2], peso)
                dict_edge[e.element()] = e
                g_sequenziale.insert_edge(nodi_sequenziale[node.element()],
                                          nodi_sequenziale[nodo2], peso)
                g_parallel_array.insert_edge(nodi_array[node.element()],
                                             nodi_array[nodo2], peso)
                g_parallel_queue.insert_edge(nodi_queue[node.element()],
                                             nodi_queue[nodo2], peso)
                g_prim.insert_edge(nodi_prim[node.element()], nodi_prim[nodo2],
                                   peso)

                nodi_queue[node.element()].pesi_condivisi[
                    nodi_queue[nodo2].element()] = peso
                nodi_queue[nodo2].pesi_condivisi[nodi_queue[
                    node.element()].element()] = peso
                nodi_queue[node.element()].connessioni[
                    len(nodi_queue[node.element()].listaArchi) -
                    1] = nodi_queue[nodo2].element()
                nodi_queue[nodo2].connessioni[
                    len(nodi_queue[nodo2].listaArchi) -
                    1] = nodi_queue[node.element()].element()

                nodi_array[node.element()].pesi_condivisi[
                    nodi_array[nodo2].element()] = peso
                nodi_array[nodo2].pesi_condivisi[nodi_array[
                    node.element()].element()] = peso
                nodi_array[node.element()].connessioni[
                    len(nodi_array[node.element()].listaArchi) -
                    1] = nodi_array[nodo2].element()
                nodi_array[nodo2].connessioni[
                    len(nodi_array[nodo2].listaArchi) -
                    1] = nodi_array[node.element()].element()
                i = i + 1

    lista_pesi_condivisi_queue = []
    lista_connessioni_condivise_queue = []
    lista_connessioni_condivise_array = []
    lista_pesi_condivisi_array = []
    for node in nodi_array:
        if len(node.listaArchi) < n:
            node.connessioni[len(node.listaArchi)] = -1

        lista_pesi_condivisi_array.append(node.pesi_condivisi)
        lista_connessioni_condivise_array.append(node.connessioni)

    for node in nodi_queue:
        if len(node.listaArchi) < n:
            node.connessioni[len(node.listaArchi)] = -1

        lista_pesi_condivisi_queue.append(node.pesi_condivisi)
        lista_connessioni_condivise_queue.append(node.connessioni)

    return g,g_sequenziale,g_parallel_array,g_parallel_queue,\
           g_prim,lista_pesi_condivisi_array,\
           lista_connessioni_condivise_array,lista_pesi_condivisi_queue,lista_connessioni_condivise_queue,dict_edge
Exemplo n.º 10
0
    return costo_mst


if __name__ == "__main__":
    g,g_sequenziale,g_parallel_array,g_parallel_queue,g_prim\
        ,lista_pesi_condivisi_array,lista_connessioni_condivise_array,\
    lista_pesi_condivisi_queue,lista_connessioni_condivise_queue,edge_dict=creaRandom()
    print("NUMERO DI NODI: {}, NUMERO DI ARCHI: {}".format(
        g.vertex_count(), g.edges_count()),
          flush=True)

    lista_nodi_originale = g.vertices()

    parent = [0 for node in g.vertices()]
    successor_next = [0 for node in g.vertices()]
    mst = Graph()

    for node in g.vertices():
        mst.insert_vertex(node.element())

    costo_mst = 0

    lista_nodi_mst = mst.vertices()
    nodi_rimanenti = g.vertices()
    n_process = 8
    comm = MPI.COMM_SELF.Spawn(
        sys.executable,
        args=[os.path.dirname(sys.argv[0]) + "\child_processes.py"],
        maxprocs=n_process)

    tempo_parallelo = time()
Exemplo n.º 11
0
 def test_enum_graph(self):
     g = Graph(nodes=EnumNodes(['x', 'y', 'z']), edges=EnumEdges())
     self.assertTrue(g.has_node('y'))
     self.assertFalse(g.has_node('a'))
     self.assertCountEqual(g.predecessors_of('y'), [])
Exemplo n.º 12
0
def AlphabetGraph():
    '''A graph consisting of nodes for 'a'..'z', with an edge from each letter
    to its immediate successor. Illustrates how to make a virtual graph,
    where every node and edge as computed as it searched for, rather than
    each being represented explicitly by a separate object.'''
    return Graph(nodes=AlphabetNodes(), edges=AlphabetEdges())
Exemplo n.º 13
0
    def test_prefix(self):
        g0 = Graph(nodes=EnumNodes(['a', 'b', 'o']),
                   edges=EnumEdges(Hops.from_pairs(('a', 'b'), ('b', 'o'))))
        g = PrefixedGraph(2, g0)

        # methods that go to Nodes

        self.assertFalse(g.has_node('a'))
        self.assertTrue(g.has_node(PrefixedNode(2, 'a')))
        self.assertFalse(g.has_node(PrefixedNode(1, 'a')))

        self.assertCountEqual(
            g.query(OfClass(str)),
            [PrefixedNode(2, 'a'),
             PrefixedNode(2, 'b'),
             PrefixedNode(2, 'o')])

        # methods that go to Edges

        # .hops_from_node()
        self.assertCountEqual(g.hops_from_node('a'), [])
        self.assertCountEqual(g.hops_from_node(PrefixedNode(
            2, 'a')), [Hop(PrefixedNode(2, 'a'), PrefixedNode(2, 'b'), 1.0)])
        self.assertCountEqual(g.hops_from_node(PrefixedNode(1, 'a')), [])

        # .hops_to_node()
        self.assertCountEqual(g.hops_to_node('b'), [])
        self.assertCountEqual(g.hops_to_node(PrefixedNode(
            2, 'b')), [Hop(PrefixedNode(2, 'a'), PrefixedNode(2, 'b'), 1.0)])
        self.assertCountEqual(g.hops_to_node(PrefixedNode(1, 'b')), [])

        # .find_hop()
        self.assertIsNone(g.find_hop('a', 'b'))
        self.assertEqual(
            g.find_hop(PrefixedNode(2, 'a'), PrefixedNode(2, 'b')),
            Hop(PrefixedNode(2, 'a'), PrefixedNode(2, 'b'), 1.0))
        self.assertEqual(
            g.find_hop(PrefixedNode(1, 'a'), PrefixedNode(2, 'b')), None)
        self.assertEqual(
            g.find_hop(PrefixedNode(2, 'a'), PrefixedNode(1, 'b')), None)

        # .degree_out() and .degree_in()
        self.assertEqual(g.degree_out('a'), 0)
        self.assertEqual(g.degree_out(PrefixedNode(1, 'a')), 0)
        self.assertEqual(g.degree_out(PrefixedNode(2, 'a')), 1)
        self.assertEqual(g.degree_in('b'), 0)
        self.assertEqual(g.degree_in(PrefixedNode(1, 'b')), 0)
        self.assertEqual(g.degree_in(PrefixedNode(2, 'b')), 1)

        # .successors_of() and .predecessors_of()
        self.assertCountEqual(g.successors_of('a'), [])
        self.assertCountEqual(g.successors_of(PrefixedNode(1, 'a')), [])
        self.assertCountEqual(g.successors_of(PrefixedNode(2, 'a')),
                              [PrefixedNode(2, 'b')])
        self.assertCountEqual(g.predecessors_of(PrefixedNode(2, 'b')),
                              [PrefixedNode(2, 'a')])

        # .hop_weight()
        self.assertEqual(
            g.hop_weight(PrefixedNode(2, 'a'), PrefixedNode(2, 'b')), 1.0)
        self.assertEqual(
            g.hop_weight(PrefixedNode(1, 'a'), PrefixedNode(2, 'b')), 0.0)
        self.assertEqual(
            g.hop_weight(PrefixedNode(2, 'a'), PrefixedNode(1, 'b')), 0.0)

        # .add_edges()

        g2 = g.add_edges(
            EnumEdges(
                Hops.from_pairs((PrefixedNode(2, 'a'), PrefixedNode(2, 'o')))))
        self.assertEqual(
            g2.find_hop(PrefixedNode(2, 'a'), PrefixedNode(2, 'o')),
            Hop(PrefixedNode(2, 'a'), PrefixedNode(2, 'o'), 1.0))
        self.assertEqual(g2.find_hop('a', 'o'), None)
Exemplo n.º 14
0
def Boruvka_seq(g):
    lista_nodi = g.vertices()
    peso_albero = 0
    mst = Graph()
    for node in g.vertices():
        mst.insert_vertex(node.element())

    parent = [-1] * g.vertex_count()

    tempo_ricerca = 0
    tempo_pointer = 0
    tempo_merge = 0

    while len(lista_nodi) > 1:

        tempo_ricerca_parziale = time()
        for node in lista_nodi:
            minedge = None
            for edge in node.incident_edges():

                if minedge == None or minedge.element() > edge.element():
                    minedge = edge
                    n1, n2 = edge.endpoints()
                    if n1 == node.element():
                        parent[node.element()] = n2
                    else:
                        parent[node.element()] = n1

            if minedge is not None:
                n1, n2 = minedge.endpoints_posizione()
                e = mst.insert_edge(mst.vertices()[n1],
                                    mst.vertices()[n2], minedge.element())
                if e is not None:
                    peso_albero += minedge.element()
                    #print(e,flush=True)
        tempo_ricerca += (time() - tempo_ricerca_parziale)

        for node in lista_nodi:
            node_parent = parent[node.element()]
            parent_parent = parent[parent[node.element()]]

            if node.element() == parent_parent:

                if node.element() < node_parent:
                    parent[node.element()] = node.element()

                else:
                    parent[node_parent] = node_parent

        tempo_pointer_parziale = time()
        findRoot(parent)
        tempo_pointer += (time() - tempo_pointer_parziale)

        for nodo in lista_nodi:
            nodo.root = g.vertices()[parent[nodo.element()]]
            nodo.setElement(nodo.root.element())
            for edge in nodo.incident_edges():
                n1, n2 = edge.endpoints()
                edge.setElement(parent[n1], parent[n2])

        i = 0
        tempo_merge_parziale = time()
        while i < len(lista_nodi):
            node = lista_nodi[i]
            if node.root != node:
                merge(node, node.root)
                lista_nodi.pop(i)
            else:
                i = i + 1
        delete_multi_edges(lista_nodi)
        tempo_merge += (time() - tempo_merge_parziale)
    print(
        "TEMPO RICERCA ARCHI MINIMI :{}, TEMPO POINTER JUMPING:{}, TEMPO MERGE:{}"
        .format(tempo_ricerca, tempo_pointer, tempo_merge))

    return (mst, peso_albero)