pygraphviz: nicht reproduzierbarer Output von dot

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Humbalan
User
Beiträge: 59
Registriert: Mittwoch 2. September 2009, 15:11

Hallo,

ich hab ein kleines Py-Progamm, dass eine Json-Datei liest und mit dem Inhalt via pygraphviz und layout('dot') eine png-Datei erzeugt. Mein Problem: ich rufe dieses Programm mehrfach auf und erhalte nicht immer das gleiche Bild. Wenn ich zusätzlich zu dem png-Output über write() einen dot-Output erzeuge, dann kann ich beobachten, dass immer dann, wenn die png-Datei anders aussieht, die Reihenfolge von subgraphen in der dot-Datei anders ist.

Meine Frage: gibt es Erfahrungen darüber, ob und wann die Ergebnisse von pygraphviz laufzeitabhängig anders sind?

Danke schon Mal
Beste Grüße
Humbalan
BlackJack

@Humbalan: Die Daten kommen ja anscheinend aus einem Wörterbuch und das hat keine geordnete Reihenfolge der Schlüssel/Wert-Paare, das heisst die kann bei jedem Programmlauf anders sein.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Das gerenderte Ergebnis von dot kann übrigens auch differieren wenn die Eingabe exakt gleich ist.
Benutzeravatar
Humbalan
User
Beiträge: 59
Registriert: Mittwoch 2. September 2009, 15:11

Danke für Eure Antworten.
BlackJack hat geschrieben:Die Daten kommen ja anscheinend aus einem Wörterbuch und das hat keine geordnete Reihenfolge der Schlüssel/Wert-Paare, das heisst die kann bei jedem Programmlauf anders sein.
Das kann ich so nicht glauben. Ich beziehe mich auf https://docs.python.org/2/library/stdty ... dict.items, speziell auf den Satz
Keys and values are listed in an arbitrary order which is non-random, varies across Python implementations, and depends on the dictionary’s history of insertions and deletions.
Ich verstehe das so, dass bei einer festen Python-Version die Implementierung eines dict doch eine reproduzierbare Reihenfolge der Items erwartbar ist. Ich darf nur nicht erwarten, dass ich bei einem Update auf eine neue Pythonversion dasselbe Ergebniss bekomme. Das vorliegende Problem kann also m. E. damit nichts zu tun haben. Dennoch bin ich dankbar für den Hinweis, denn es kann ja später einmal ein Versionswechsel vorgenommen werden. Ich habe das Programm also entsprechend umgebaut, ich arbeite nun nicht mehr mit dicts sondern mit lists und namedtuples. Die Umwandlung des Json-Parser-Outputs in die entsprechenden Datentypen geschieht sortiert, so dass ich ganz sicher reproduzierbare Daten habe.
sparrow hat geschrieben:Das gerenderte Ergebnis von dot kann übrigens auch differieren wenn die Eingabe exakt gleich ist.

Das finde ich jetzt erschrecken. Für meinen Auftrag ist es wichtig, dass ich reproduzierbare Ergebnisse bekomme. Wenn diese Aussage so stimmt, kann ich graphviz knicken. Daher die Frage an Dich, sparrow: Woher hast Du diese Information? Ist das Deine Erfahrung? Kann ich das irgendwo nachlesen? Vielleicht kann ich ja mit den entsprechenden Informationen den Graphviz-Input so beeinflussen, dass das Ergebniss konstant ist.

Beste Grüße
Humbalan
BlackJack

@Humbalan: Die Reihenfolge hängt von den Hash-Werten der Schlüsselobjekte ab, und damit würde Deine Vermutung erfordern das der Hashwert eines gegebenen Wertes bei jedem Programmlauf gleich ist. Das ist definitiv nicht mehr so seit dem in CPython Zeichenketten einen Zufallswert in den Hash integrieren der bei jedem Programmstart ermittelt wird um gegen DOS-Attacken robuster zu sein die Hash-Kollisionen ausnutzen.

Bei `dot` selber weiss ich jetzt nicht 100% aber bei `neato`, `twopi`, und `fdp` werden zufällige Entscheidungen getroffen. Irgendwo gibt's dann immer eine Option um den Startwert des Zufallsgenerators auf einen festen Wert zu setzen.
Benutzeravatar
Humbalan
User
Beiträge: 59
Registriert: Mittwoch 2. September 2009, 15:11

@BlackJack: Danke für die Klärung wg. Hashes und dicts. Das macht die Sache jetzt für mich klar. Danke auch für den Hinweis wg. neato und dem Zufallsstartwert. Werde mal suchen, ob ich damit irgendwie fündig werde.

Wünsche einen guten Rutsch

Beste Grüße
Humbalan
Antworten