2016-05-05 7 views
2

Dies ist eine lächerlich grundlegende Frage über Graph-Tool, die trivial sein sollte, um herauszufinden, wie man mit der Dokumentation zu lösen, aber ich bin im Kreis drehen. Ich bezweifle nicht, dass die Dokumentation umfassend ist, aber es macht das sicherlich nicht einfach.Einen Untergraphen im Graph-Tool filtern

ZIEL: Gegeben ein Graph G, extrahieren Sie die Untergraphen auf der Grundlage einer Liste von Scheitelpunkten von G.

Ich weiß, ich sollte dies mit einem GraphView irgendwie tun. Ich verstehe das. Ich verstehe auch, dass ich dafür einen Vertex PropertyMap machen muss. Aber was genau sollte ich schaffen?

Die Dokumentation fehlt hier sehr. Zum Beispiel, die page on PropertyMaps sagt, dass jeder PropertyMap kann von einem bestimmten Typ sein, aber ich habe nicht herausgefunden, was das bedeutet. Was repräsentieren die Typen? Wann möchte ich einen Typ gegenüber einem anderen verwenden? Angesichts der Tatsache, wie wichtig PropertyMaps für die effiziente Nutzung von graph-tool sind, bin ich etwas verwirrt darüber, wie unklar die Dokumente sind.

Für dieses Problem bekomme ich das vage Gefühl, dass ich den booleschen Typ verwenden muss, weil ich vielleicht die Scheitelpunkte im Untergraphen auf "wahr" setzen möchte, während die Scheitelpunkte im Untergraphen nicht erwünscht sind zu "falsch". Aber heißt das, dass die PropertyMap I create muss die gleiche Länge wie die Anzahl der Knoten in meinem ursprünglichen Graphen G? Oder kann ich nur eine Liste von Knoten bereitstellen und irgendwie verstehen, dass nur diese auf True gesetzt sind?

Antwort

3

Sie haben Recht. Sie müssen GraphView verwenden. Im folgenden Beispiel wird ein Untergraph mit den Eckpunkten 0, 1, 3 sind aus einem vollständigen Graphen erstellt mit 5 Vertices

from graph_tool import GraphView, generation 

g = generation.complete_graph(5) 

# select some vertices 
vfilt = g.new_vertex_property('bool'); 
vfilt[0] = True 
vfilt[1] = True 
vfilt[3] = True 

sub = GraphView(g, vfilt) 

print [(g.vertex_index[e.source()], g.vertex_index[e.target()]) 
      for e in sub.edges()] 

Output

[(0, 1), (0, 3), (1, 3)]