igraph-help
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [igraph] union of graphs


From: venura.2.mendis
Subject: RE: [igraph] union of graphs
Date: Mon, 13 Oct 2008 17:13:22 +0100

Hi Marco,

If I understand you correctly you are trying to do something similar to what I 
was asking about earlier. There is an igraph.union() method but this doesn't 
let you take union based on node attributes.
The other guys on the list can probably tell you more efficient ways of doing 
this but thought it might be helpful if I sent you some of my code as I think 
ive just got it working!
I am taking the union of graphs based on the 'label' attribute on the nodes (I 
gues you could consider that my selection rule). i.e I consider a node equal if 
they have same label. Also I'm adding the 'weight' attributes of the edges. 
Hopefully you should be ok modifying this to use the selection rule you refer 
too. 

   @staticmethod
    def mergeGraphs(graph, graph1):
        nodeList1 = set(node['label'] for node in graph.vs)
        nodeList2 = set(node['label'] for node in graph1.vs)
        
        mergedNodeList = nodeList2.union(nodeList1)
        mergedEdgeDict=dict()
        
        for nodeLabel in mergedNodeList:
            if nodeLabel in graph.vs['label']:    
                edges = graph.adjacent(graph.vs['label'].index(nodeLabel))
                for edge in edges:                
                    if graph.es[edge].source> graph.es[edge].target:
                        edgeTuple = 
(graph.vs[graph.es[edge].target]['label'],graph.vs[graph.es[edge].source]['label'])
                    else:
                        edgeTuple 
=(graph.vs[graph.es[edge].source]['label'],graph.vs[graph.es[edge].target]['label'])
                    
                    if(edgeTuple not in mergedEdgeDict.keys()):
                        
mergedEdgeDict.setdefault(edgeTuple,graph.es[edge]['weight'])
                    else:
                        mergedEdgeDict[edgeTuple] = 
mergedEdgeDict[edgeTuple]+graph.es[edge]['weight']
                        
            if nodeLabel in graph1.vs['label']:    
                edges = graph1.adjacent(graph1.vs['label'].index(nodeLabel))
                for edge in edges:    
                    if graph1.es[edge].source> graph1.es[edge].target:
                        edgeTuple 
=(graph1.vs[graph1.es[edge].target]['label'],graph1.vs[graph1.es[edge].source]['label'])
                    else:
                        edgeTuple 
=(graph1.vs[graph1.es[edge].source]['label'],graph1.vs[graph1.es[edge].target]['label'])
                    
                    if(edgeTuple not in mergedEdgeDict.keys()):
                        
mergedEdgeDict.setdefault(edgeTuple,graph1.es[edge]['weight'])
                    else:
                        mergedEdgeDict[edgeTuple] = 
mergedEdgeDict[edgeTuple]+graph1.es[edge]['weight']
                 
     
        
        graph3 = igraph.Graph(len(mergedNodeList),directed=False)
        for ind, nodeLabel in enumerate(mergedNodeList):
            graph3.vs[ind]['label'] = str(nodeLabel)
            

        for indx, edge in enumerate(mergedEdgeDict):
            
graph3.add_edges((graph3.vs['label'].index(str(edge[0])),graph3.vs['label'].index(str(edge[1])))
 )
            graph3.es[indx]['weight'] = mergedEdgeDict[edge]/2
        
        return graph3

Hope this is useful.
Thanks,
Venura
 

-----Original Message-----
From: address@hidden [mailto:address@hidden On Behalf Of Marco
Sent: 13 October 2008 16:59
To: Help for igraph users
Subject: [igraph] union of graphs

Hi,

let's suppose i have n graphs, which are randomly generated, with
igraph.Graph.Erdos_Renyi.
Now, let's suppose i want to make an union of m of those graphs, with
some selection rule.
Basically i want to take a node in the graph 1 and connect it to a
node in the graph 2, then again for every couple of graphs in set of n
graphs.

Suggestions on how i can do it with igraph (i am using the python frontend)?

Thanks in advance for you help,

marco


--

è il gioco della vita,
la dobbiamo preparare
che non ci sfugga dalle dita
come la sabbia in riva al mare.

Lucio Dalla


_______________________________________________
igraph-help mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/igraph-help




reply via email to

[Prev in Thread] Current Thread [Next in Thread]