ereignisgraph
Ereignisgraph-Modul
Der Ereignisgraph ist die zentrale Datenstruktur zur Protokollierung von vergangenen Ereignissen sowie zur Prognose des Zeitpunkts von zukünftigen Ereignissen und damit der Verspätung von Zügen. Der Betriebsablauf wird hierzu in Zeitpunkte (Knoten) und Zeitabstände (Kanten) zerlegt, so dass sich die Prognose aus einer Traverse des Graphen ableiten lässt.
Dieses Design ermöglicht es, den Prognosealgorithmus einfach zu halten, wobei die Komplexität des Betriebsablaufs allein im Graph kodiert ist.
Der Ablauf ist wie folgt:
- Der Ereignisgraph wird mit Plandaten aus einem Zielgraph erstellt. Nur die Startpunkte von Zügen ohne Vorgänger haben absolute Zeitangaben. Der restliche Pfad des Zuges enthält die Zeitinformation als minimale und maximale Zeitdauer in den Verbindungskanten.
- Bei Ereignissen im laufenden Betrieb wird der Zeitpunkt in den entsprechenden Knoten protokolliert und die im Knoten erfasste Zeit festgelegt.
- Bei noch nicht eingefahrenen Zügen wird periodisch die erwartete Ankunftszeit im ersten Knoten aktualisiert.
- Der Fdl markiert Abhängigkeiten wie Anschlüsse, Kreuzungen, Überholungen etc. Diese werden als zusätzliche Kanten eingefügt.
- Zur Prognose wird der Graph ausgehend von den Startpunkten traversiert und die in den Kanten erfassten Zeiten entlang der Zugpfade aufgerechnet.
Classes:
-
EreignisEdgeBuilder–Abstrakter Ersteller von Ereignisblöcken basierend auf Kanten
-
EreignisGraph–Zeitliche Abfolge von Ereignissen
-
EreignisGraphNode–EreignisGraphNode
-
EreignisGraphUngerichtet–Ungerichtete Variante von EreignisGraph
-
EreignisLabelType–Identifikation des Ereignisses.
-
EreignisNodeBuilder–Abstrakter Ersteller von Ereignisblöcken
-
ErsatzEdgeBuilder–Builder für einen Ersatzvorgang (E-Flag).
-
FluegelungEdgeBuilder–Builder für einen Flügelungsvorgang (F-Flag).
-
KupplungEdgeBuilder–Builder für einen Kupplungsvorgang (K-Flag).
-
PlanfahrtEdgeBuilder–Builder für eine Planfahrt (normale Fahrt auf Strecke)
-
ZielEreignisEdgeBuilder–Zwischenklasse zur für Builder, die Zielgraph-Kanten übersetzen.
-
ZielEreignisNodeBuilder–Zielgraph-Node in Ereignisgraph-Node übersetzen.
EreignisEdgeBuilder
EreignisEdgeBuilder(graph: EreignisGraph)
Abstrakter Ersteller von Ereignisblöcken basierend auf Kanten
Ein EreignisEdgeBuilder erstellt auf Abruf Blöcke (oder Subgraphen) mit Knoten und Kanten in einem EreignisGraph. Die Struktur dieser Blöcke wird durch die abgeleitete Klasse definiert. Bevor die add_to_graph-Methode aufgerufen wird, kann der Builder Informationen zum Aufbau des Blocks erhalten. Erst mittels add_to_graph werden die Knoten und Kanten in den Graphen geschrieben.
Der EreignisEdgeBuilder wird eingesetzt, wo im ursprünglichen Graphen eine Kante übersetzt wird. Der EreignisNodeBuilder wird eingesetzt, wo im ursprünglichen Graphen ein Knoten übersetzt wird.
EreignisEdgeBuild können Zugriff auf bereits erstellte EreignisNodeBuilder haben und diese modifizieren.
Builder werden nur einmal ausgeführt und dürfen bei weiteren Aufrufen keine weiteren Elemente hinzufügen.
Methods:
-
add_to_graph–Knoten und Kanten zum Ereignisgraphen hinzufügen.
Source code in stskit/model/ereignisgraph.py
add_to_graph
abstractmethod
Knoten und Kanten zum Ereignisgraphen hinzufügen.
Die Methode fügt die vom Builder verantworteten Knoten und internen Kanten dem EreignisGraph hinzu. Die Methode darf nur beim ersten Aufruf eine Wirkung zeigen.
Source code in stskit/model/ereignisgraph.py
EreignisGraph
flowchart TD
stskit.model.ereignisgraph.EreignisGraph[EreignisGraph]
click stskit.model.ereignisgraph.EreignisGraph href "" "stskit.model.ereignisgraph.EreignisGraph"
Zeitliche Abfolge von Ereignissen
Der Ereignisgraph dient zur Protokollierung von vergangenen Ereignissen und zur Abschätzung des Zeitpunkts von zukünftigen Ereignissen. Der Graph ist darauf ausgelegt, dass die Prognose mittels eines einfachen Message-Passing-Algorithmus berechnet werden kann, der nicht von Knoten- und Kantentypen abhängt.
Der EreignisGraph ist ein gerichteter Graph, der die einzelnen Betriebsereignisse und ihre Abfolge kodiert. Die Knoten sind Ereignisse wie Ankunft, Abfahrt, usw. Die Kanten definieren die Abfolge von Ereignissen und den zeitlichen Abstand.
Konzeptuell wichtig ist, dass ein Ereignis keine Zeitdauer hat. Ein Aufenthalt muss daher mit zwei Knoten (Ankunft und Abfahrt) und einer Kante zwischen ihnen dargestellt werden.
Der EreignisGraph ist gerichtet.
Attributes:
-
zuege(set[int]) –Verzeichnis (Set) der ID-Nummern der Züge, die im Graph vorkommen. Der Pfad eines Zuges (geordnete Abfolge von Knoten mit derselben Zug-ID) wird vom Generator zugpfad angegeben.
-
zugpositionen(dict[int, EreignisLabelType]) –Letztes passiertes Ereignis der sichtbaren Züge. Wird von der Ereignisauswertung in sim_ereignis_uebernehmen verwaltet und gebraucht.
-
zugplangleise(dict[int, str]) –Letzte vom Sim gemeldeten Plangleise der sichtbaren Züge. Wird von der Ereignisauswertung in sim_ereignis_uebernehmen verwaltet und gebraucht.
-
zugplanereignisse(dict[int, EreignisLabelType]) –Nächste erwartete Ereignisse der sichtbaren Züge. Wird von der Ereignisauswertung in sim_ereignis_uebernehmen verwaltet und gebraucht.
Methods:
-
edge_info–Information zu Ereigniskante für Log
-
next_ereignis–Nächstes Ereignislabel eines Zuges
-
node_info–Information zu Ereignisknoten für Log
-
prev_ereignis–Vorheriges Ereignislabel eines Zuges
-
prognose–Zeitprognose durchführen
-
rueckpfad–Rückwärts laufender Generator für die Ereignisse eines Zuges
-
sim_ereignis_ersatz–Ersatz verarbeiten
-
sim_ereignis_fluegeln–Flügeln verarbeiten
-
sim_ereignis_kuppeln–Kuppeln verarbeiten
-
sim_ereignis_rothalt–Betriebshalt verarbeiten
-
sim_ereignis_uebernehmen–Daten von einem Sim-Ereignis übernehmen.
-
sim_ereignis_wurdegruen–Betriebshalt verarbeiten
-
verspaetungen_nach_zielgraph–Schreibt die berechneten Verspätungen in den Zielgraphen.
-
zielgraph_importieren–Zielgraph importieren
-
zug_ereignis_suchen–Ereignis mit gegebenen Attributen im Zugpfad suchen.
-
zugpfad–Generator für die fortlaufenden Ereignisse eines Zuges
Source code in stskit/model/ereignisgraph.py
edge_info
edge_info(u: EreignisLabelType, v: EreignisLabelType) -> str
Information zu Ereigniskante für Log
Source code in stskit/model/ereignisgraph.py
next_ereignis
next_ereignis(label: EreignisLabelType, typ: Optional[str] = None) -> Optional[EreignisLabelType]
Nächstes Ereignislabel eines Zuges
Diese Methode gibt das nächste Ereignis des Zuges bzw. (bei Ersatz oder Kupplung) des Folgezuges zurück. Wenn das typ-Argument gesetzt ist, wird das Ereignis nur zurückgegeben, wenn der Typ übereinstimmt.
Vorsicht: Diese Methode sucht nicht nach einem bestimmten Ereignis!
Parameters:
-
(labelEreignisLabelType) –Label des Ereignisnodes.
-
(typOptional[str], default:None) –Ereignistyp (EreignisGraphNode.typ).
Returns:
-
Optional[EreignisLabelType]–Label des gefundenen Ereignisses oder None.
Source code in stskit/model/ereignisgraph.py
node_info
node_info(node: EreignisLabelType) -> str
Information zu Ereignisknoten für Log
Source code in stskit/model/ereignisgraph.py
prev_ereignis
prev_ereignis(label: EreignisLabelType, typ: Optional[str] = None) -> Optional[EreignisLabelType]
Vorheriges Ereignislabel eines Zuges
Diese Methode gibt das vorherige Ereignis des Zuges bzw. (bei Ersatz oder Flügelung) des Vorgängerzuges zurück. Wenn das typ-Argument gesetzt ist, wird das Ereignis nur zurückgegeben, wenn der Typ übereinstimmt.
Vorsicht: Diese Methode sucht nicht nach einem bestimmten Ereignis!
Parameters:
-
(labelEreignisLabelType) –Label des Ereignisnodes.
-
(typOptional[str], default:None) –Ereignistyp (EreignisGraphNode.typ).
Returns:
-
Optional[EreignisLabelType]–Label des gefundenen Ereignisses oder None.
Source code in stskit/model/ereignisgraph.py
prognose
Zeitprognose durchführen
Für jeden nicht fixierten Knoten wird die erwartete Zeit berechnet. Die Zeit wird anhand der Fahrplanzeit und von aggregierten Minimal- und Maximalzeiten der einlaufenden Kanten bestimmt.
Wenn die Fahrplanzeit zwischen Minimal- und Maximalzeit liegt, wird sie unverändert übernommen. Ansonsten wird sie auf das Maximum reduziert, wenn sie grösser als das Maximum ist, und auf das Minimum erhöht, wenn sie kleiner als das Minimum ist. Die resultierende Zeit ist in jedem Fall grösser oder gleich der Minimalzeit.
Mit diesem Algorithmus können folgende Fälle abgebildet werden:
- Normaler Halt: dt_min ist die minimale Aufenthaltszeit für den Fahrgastwechsel oder andere Betriebsvorgänge. dt_max wird nicht definiert.
- Halt mit vorzeitiger Abfahrt: dt_min ist die minimale Aufenthaltszeit für den Fahrgastwechsel oder andere Betriebsvorgänge. dt_max wird deklariert, wenn der Zug vorzeitig abfahren soll.
- Durchfahrt: dt_min ist 0. dt_max wird nicht definiert.
- Abwarten eines anderen Ereignisses: dt_min definiert die zusätzliche Wartezeit zum vorausgehenden Ereignis. dt_max wird nicht definiert.
- Vorzeitige Abfahrt um einem anderen Zug auszuweichen: dt_max ist negativ und definiert wie viel früher der Zug abfahren soll. dt_min wird nicht definiert.
Source code in stskit/model/ereignisgraph.py
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 | |
rueckpfad
rueckpfad(zid: int, start: EreignisLabelType | None = None, stop: EreignisLabelType | None = None, ersatz: bool = False, fluegeln: bool = False, kuppeln: bool = False) -> Generator[EreignisLabelType, None, None]
Rückwärts laufender Generator für die Ereignisse eines Zuges
Beginnend mit dem Startknoten liefert der Generator die Ereignis-IDs eines Zuges entgegen der Reihenfolge ihres Auftretens.
Das Verhalten des Generators bei Ersatz/Flügeln/Kuppeln kann mit Flags angepasst werden.
Parameters:
-
(zidint) –Zug-ID
-
(startEreignisLabelType | None, default:None) –Knoten-ID des ersten Knotens. Falls None (default) der letzte Knoten des Zuges.
-
(stopEreignisLabelType | None, default:None) –Knoten-ID des ersten nicht mehr gelieferten Knotens. Falls None (default) werden die Knoten bis einschliesslich des letzten des Zuges geliefert.
-
(ersatzbool, default:False) –Wenn True, fährt der Generator bei Ersatz mit dem Stammzug fort. Ansonsten stoppt der Generator nach dem Abfahrtsknoten des Folgezuges.
-
(fluegelnbool, default:False) –Wenn True, fährt der Generator mit dem Stammzug fort. Ansonsten stoppt der Generator nach dem Abfahrtsknoten des Folgezuges.
-
(kuppelnbool, default:False) –Wenn False (default), läuft der Generator durchgehend über den Stammzug. Wenn True, läuft der Generator über den endenden Zug.
Returns: Generator von Knoten-IDs.
Source code in stskit/model/ereignisgraph.py
sim_ereignis_ersatz
sim_ereignis_ersatz(ereignis: Ereignis)
Ersatz verarbeiten
Das Ersatzereignis kommt aus dem Polling vom Pluginclient (stsplugin.PluginClient.request_zugliste), nicht vom Simulator! Es kann u.U. erst nach dem Abfahrtsereignis ankommen.
ereignis.zid bezeichnet den Stammzug. Unser E-Ereignisknoten gehört zum Stammzug, der Ab-Knoten zum Folgezug.
Source code in stskit/model/ereignisgraph.py
sim_ereignis_fluegeln
sim_ereignis_fluegeln(ereignis: Ereignis)
Flügeln verarbeiten
ereignis.zid bezeichnet den Stammzug. Unser F-Ereignisknoten gehört zum (durchgehenden) Stammzug.
Source code in stskit/model/ereignisgraph.py
sim_ereignis_kuppeln
sim_ereignis_kuppeln(ereignis: Ereignis)
Kuppeln verarbeiten
ereignis.zid bezeichnet den endenden Zug. Unser K-Ereignisknoten gehört zum durchgehenden Zug.
Source code in stskit/model/ereignisgraph.py
sim_ereignis_rothalt
sim_ereignis_rothalt(ereignis: Ereignis)
Betriebshalt verarbeiten
Es gibt zwei Arten von Betriebshalten:
- Der Betriebshalt erfolgt statt Durchfahrt. Das letzte Ereignis war eine Ankunft, die ausgehende Kante ist vom Typ "B", die Quelle der nächsten Abfahrt ist "fdl". In diesem Fall ist hier nichts zu tun, die Ankunft wurde bereits registriert, die Abfahrt wird in "wurdegruen" verarbeitet.
- Der Betriebshalt erfolgt zwischen an einem Gleis, das nicht im Fahrplan steht. Das letzte Ereignis war eine Abfahrt, die darauf folgenden zwei Ereignisse sind vom "fdl" und durch eine Kante vom Typ "B" verbunden. Wir wissen nicht, wo der Zug genau steht. Dieser Fall wird aktuell nicht ausgewertet.
Source code in stskit/model/ereignisgraph.py
sim_ereignis_uebernehmen
Daten von einem Sim-Ereignis übernehmen.
Aktualisiert die Verspätung und Status-Flags anhand eines Ereignisses im Simulator.
Aktualisiert werden die folgenden Attribute:
- zugpositionen
- zugplangleise
- zugplanereignisse
- t_mess der Ereignisknoten
Phantomzüge:
Nach gewissen Nummernwechseln (mit Richtungsänderung?) schickt der Sim weiterhin Ereignisse unter der Nummer des nun unsichtbaren Zuges. Das sichtbar-Attribut des Ereignisarguments ist dabei False. Ausser bei den Ereignisarten 'Ausfahrt', 'Ersatz' sollten solche Ereignisse nicht beachtet werden.
Parameters:
-
(ereignisEreignis) –Ereignis-objekt vom PluginClient
Source code in stskit/model/ereignisgraph.py
sim_ereignis_wurdegruen
sim_ereignis_wurdegruen(ereignis: Ereignis)
Betriebshalt verarbeiten
Es gibt zwei Arten von Betriebshalten:
- Der Betriebshalt erfolgt statt Durchfahrt. Das letzte Ereignis war eine Ankunft, die ausgehende Kante ist vom Typ "B", die Quelle der nächsten Abfahrt ist "fdl". In diesem Fall registrieren wir die Abfahrtszeit.
- Der Betriebshalt erfolgt zwischen an einem Gleis, das nicht im Fahrplan steht. Das letzte Ereignis war eine Abfahrt, die darauf folgenden zwei Ereignisse sind vom "fdl" und durch eine Kante vom Typ "B" verbunden. Wir wissen nicht, wo der Zug genau steht. Dieser Fall wird aktuell nicht ausgewertet.
Source code in stskit/model/ereignisgraph.py
verspaetungen_nach_zielgraph
Schreibt die berechneten Verspätungen in den Zielgraphen.
Die Verspätungen werden aus der Differenz zwischen den t_eff- und t_plan-Feldern der An- und Ab-Knoten berechnet.
Parameters:
-
(zgZielGraph) –Zielgraph
Source code in stskit/model/ereignisgraph.py
zielgraph_importieren
Zielgraph importieren
Der Ereignisgraph wird anhand eines vollständigen Zielgraphs aufgebaut oder aktualisiert.
Fahrplanhalte werden in Ankunfts- und Abfahrtsereignisse aufgelöst, Betriebsvorgänge werden in entsprechende graphische Muster übersetzt.
Die Methode arbeitet mit EreignisNodeBuilder- und EreignisEdgeBuilder-Objekten. In einem ersten Schritt werden alle Zielknoten in ZielEreignisNodeBuilder übersetzt. Im zweiten Schritt werden die Zielkanten in ZielEreignisEdgeBuilder übersetzt und ausgeführt. Bei der Ausführung der Builder werden die Zielelemente dem Ereignisgraphen hinzugefügt.
Die gestaffelte Übersetzung von Knoten und Kanten in Builders bietet die notwendige Flexibilität in den folgenden Situationen:
- Es gibt keine eindeutige Zuordnung von Zielknoten zu Ereignisknoten, jedoch im Verlauf dieser Methode eine Zuordnung von Zielknoten zu ZielEreignisNodeBuilder.
- Die Labels von Ereignisknoten können nicht aus Zielknoten abgeleitet werden. Es wird eine fortlaufende Nummer eingesetzt. Lediglich der erste Ereignisknoten eines Zuges wird mit der Nummer 0 markiert.
- Zielpunkte im Zielgraph ergeben je nach Typ eines oder zwei Ereignisse.
- Betriebsvorgänge sind im Zielgraph im Kantentyp dargestellt, im Ereignisgraph durch die Topologie.
- Beim Iterieren über Kanten kommen Knoten mehrmals vor. Knoten dürfen aber nur einmal in den Graphen eingesetzt werden, weil es keine eindeutige Zuordnung von Zielknoten zu Ereignisknoten gibt.
Parameters:
-
(zgZielGraph) –Zielgraph enthält die Ursprungsdaten
-
(cleanbool, default:False) –Ereignisgraph vollständig neu aufbauen (True) oder nur neue Züge hinzufügen (False, default). Bei True gehen Änderungen an den Attributen verloren, bei False werden sie beibehalten.
-
(quellestr, default:'sts') –Name der Datenquelle oder des Autors. Wird in die Ereignisnodes geschrieben.
Source code in stskit/model/ereignisgraph.py
513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 | |
zug_ereignis_suchen
zug_ereignis_suchen(zid: int | None = None, start: EreignisLabelType | None = None, **kwargs) -> EreignisLabelType
Ereignis mit gegebenen Attributen im Zugpfad suchen.
Suche im Zugpfad ab einem wählbaren Startpunkt nach einem Ereignis mit den gegebenen Attributen. Die Suche folgt der Richtung des Graphen, läuft über durch E/F/K-Ereignisse verbundene Folgezüge und endet am Knoten, der keine Nachfolger hat.
Parameters:
-
(zidint | None, default:None) –Gesuchte Zug-ID. Das gesuchte Ereignis muss diese Zug-ID haben. zid kann sich von start.zid unterscheiden, muss dann aber ein Folgezug von start.zid bezeichnen. Mindestens eines der Argumente zid und start muss angegeben werden.
-
(startEreignisLabelType | None, default:None) –Startnode. Die Suche startet an diesem Knoten (inklusiv). Wenn kein Start angegeben ist, beginnt die Suche am Zuganfang. Mindestens eines der Argumente zid und start muss angegeben werden.
-
–kwargsGesuchte Attributwerte. Die Keys müssen Attributnamen von EreignisGraphNode entsprechen. Bei float-Attributen gilt eine Toleranz von 0.0001.
Raises:
-
KeyError–Zug wird nicht gefunden.
-
ValueError–Attributwerte werden nicht gefunden.
Source code in stskit/model/ereignisgraph.py
zugpfad
zugpfad(zid: int, start: EreignisLabelType | None = None, stop: EreignisLabelType | None = None, ersatz: bool = False, kuppeln: bool = False, fluegeln: bool = False) -> Generator[EreignisLabelType, None, None]
Generator für die fortlaufenden Ereignisse eines Zuges
Beginnend mit dem Startknoten liefert der Generator die Ereignis-IDs eines Zuges in der Reihenfolge ihres Auftretens.
Das Verhalten des Generators bei Ersatz/Flügeln/Kuppeln kann mit Flags angepasst werden.
Parameters:
-
(zidint) –Zug-ID
-
(startEreignisLabelType | None, default:None) –Knoten-ID des ersten Knotens. Falls None (default) der erste Knoten des Zuges mit ID (zid, 0).
-
(stopEreignisLabelType | None, default:None) –Knoten-ID des ersten nicht mehr gelieferten Knotens. Falls None (default) werden die Knoten bis einschliesslich des letzten des Zuges geliefert.
-
(ersatzbool, default:False) –Wenn True, fährt der Generator bei Ersatz mit dem Folgezug fort. Ansonsten stoppt der Generator nach dem Ankunftsknoten des Stammzuges.
-
(kuppelnbool, default:False) –Wenn True, fährt der Generator beim Kuppeln mit dem Folgezug fort. Ansonsten stoppt der Generator nach dem Ankunftsknoten des endenden Zuges.
-
(fluegelnbool, default:False) –Wenn False (default), läuft der Generator durchgehend über den Stammzug. Wenn True, läuft der Generator über den geflügelten Zug.
Returns:
-
None–Generator von Knoten-IDs.
Source code in stskit/model/ereignisgraph.py
EreignisGraphNode
flowchart TD
stskit.model.ereignisgraph.EreignisGraphNode[EreignisGraphNode]
click stskit.model.ereignisgraph.EreignisGraphNode href "" "stskit.model.ereignisgraph.EreignisGraphNode"
EreignisGraphNode
Attributes:
-
node_id(EreignisLabelType) –Identifikation des Ereignisses.
-
t_eff(float) –Effektive Uhrzeit des Ereignisses.
t_eff
property
t_eff: float
Effektive Uhrzeit des Ereignisses.
Returns:
-
float–Das erste, gesetzte Attribut der Folge
t_mess,t_fdl,t_prog,t_plan.
Raises:
-
AttributeError–Keines der Attribute ist gesetzt.
EreignisGraphUngerichtet
flowchart TD
stskit.model.ereignisgraph.EreignisGraphUngerichtet[EreignisGraphUngerichtet]
click stskit.model.ereignisgraph.EreignisGraphUngerichtet href "" "stskit.model.ereignisgraph.EreignisGraphUngerichtet"
Ungerichtete Variante von EreignisGraph
Für gewisse Algorithmen kann es nötig sein, den Graphen vorübergehend in einen ungerichteten umzuwandeln. Diese Klasse sorgt dafür, dass die Knoten- und Kantendaten die richtige Klasse aufweisen.
EreignisLabelType
flowchart TD
stskit.model.ereignisgraph.EreignisLabelType[EreignisLabelType]
click stskit.model.ereignisgraph.EreignisLabelType href "" "stskit.model.ereignisgraph.EreignisLabelType"
Identifikation des Ereignisses.
EreignisNodeBuilder
EreignisNodeBuilder(graph: EreignisGraph)
Abstrakter Ersteller von Ereignisblöcken
Ein EreignisNodeBuilder erstellt auf Abruf Blöcke (oder Subgraphen) mit Knoten und Kanten in einem EreignisGraph. Die Struktur dieser Blöcke wird durch die abgeleitete Klasse definiert. Bevor die add_to_graph-Methode aufgerufen wird, kann der Builder Informationen zum Aufbau des Blocks erhalten. Erst mittels add_to_graph werden die Knoten und Kanten in den Graphen geschrieben.
Der EreignisNodeBuilder wird eingesetzt, wo im ursprünglichen Graphen ein Knoten übersetzt wird. Der EreignisEdgeBuilder wird eingesetzt, wo im ursprünglichen Graphen eine Kante übersetzt wird.
Builder werden nur einmal ausgeführt und dürfen bei weiteren Aufrufen keine weiteren Elemente hinzufügen.
Methods:
-
add_to_graph–Knoten und Kanten zum Ereignisgraphen hinzufügen.
-
first_label–Label des ersten erstellten Ereignisses.
-
last_label–Label des letzten erstellten Ereignisses.
Source code in stskit/model/ereignisgraph.py
add_to_graph
abstractmethod
Knoten und Kanten zum Ereignisgraphen hinzufügen.
Die Methode fügt die von dem Builder verantworteten Knoten und internen Kanten dem EreignisGraph hinzu. Die Methode darf nur beim ersten Aufruf eine Wirkung zeigen.
Source code in stskit/model/ereignisgraph.py
first_label
abstractmethod
first_label() -> EreignisLabelType
Label des ersten erstellten Ereignisses.
Das Ereignislabel wird von einlaufenden Kanten referenziert. Das Label ist erst nach Ausführen der add_to_graph-Methode gültig!
Source code in stskit/model/ereignisgraph.py
last_label
abstractmethod
last_label() -> EreignisLabelType
Label des letzten erstellten Ereignisses.
Das Ereignislabel wird von auslaufenden Kanten referenziert. Das Label ist erst nach Ausführen der add_to_graph-Methode gültig!
Source code in stskit/model/ereignisgraph.py
ErsatzEdgeBuilder
ErsatzEdgeBuilder(graph: EreignisGraph)
flowchart TD
stskit.model.ereignisgraph.ErsatzEdgeBuilder[ErsatzEdgeBuilder]
stskit.model.ereignisgraph.ZielEreignisEdgeBuilder[ZielEreignisEdgeBuilder]
stskit.model.ereignisgraph.EreignisEdgeBuilder[EreignisEdgeBuilder]
stskit.model.ereignisgraph.ZielEreignisEdgeBuilder --> stskit.model.ereignisgraph.ErsatzEdgeBuilder
stskit.model.ereignisgraph.EreignisEdgeBuilder --> stskit.model.ereignisgraph.ZielEreignisEdgeBuilder
click stskit.model.ereignisgraph.ErsatzEdgeBuilder href "" "stskit.model.ereignisgraph.ErsatzEdgeBuilder"
click stskit.model.ereignisgraph.ZielEreignisEdgeBuilder href "" "stskit.model.ereignisgraph.ZielEreignisEdgeBuilder"
click stskit.model.ereignisgraph.EreignisEdgeBuilder href "" "stskit.model.ereignisgraph.EreignisEdgeBuilder"
Builder für einen Ersatzvorgang (E-Flag).
Der Builder erstellt ein Ersatzereignis (Typ 'E') zwischen der Ankunft am ersten Ziel und der Abfahrt am zweiten Ziel.
Methods:
-
add_to_graph–Keine Wirkung
-
set_edge–Ersatzvorgang darstellen
Source code in stskit/model/ereignisgraph.py
add_to_graph
set_edge
set_edge(node1_builder: ZielEreignisNodeBuilder, node2_builder: ZielEreignisNodeBuilder)
Ersatzvorgang darstellen
Die Kante 1 -E-> 2 aus dem Zielgraph wird auf 3 Knoten und 2 Kanten abgebildet: An1 -E-> E -H-: Ab2
Dazu wird in node1_builder der Abfahrtsknoten entfernt und ein E-Hilfsknoten angefügt.
Der Zeitpunkt des Ersatzvorgangs entspricht der Abfahrtszeit von Zug 2.
Source code in stskit/model/ereignisgraph.py
FluegelungEdgeBuilder
FluegelungEdgeBuilder(graph: EreignisGraph)
flowchart TD
stskit.model.ereignisgraph.FluegelungEdgeBuilder[FluegelungEdgeBuilder]
stskit.model.ereignisgraph.ZielEreignisEdgeBuilder[ZielEreignisEdgeBuilder]
stskit.model.ereignisgraph.EreignisEdgeBuilder[EreignisEdgeBuilder]
stskit.model.ereignisgraph.ZielEreignisEdgeBuilder --> stskit.model.ereignisgraph.FluegelungEdgeBuilder
stskit.model.ereignisgraph.EreignisEdgeBuilder --> stskit.model.ereignisgraph.ZielEreignisEdgeBuilder
click stskit.model.ereignisgraph.FluegelungEdgeBuilder href "" "stskit.model.ereignisgraph.FluegelungEdgeBuilder"
click stskit.model.ereignisgraph.ZielEreignisEdgeBuilder href "" "stskit.model.ereignisgraph.ZielEreignisEdgeBuilder"
click stskit.model.ereignisgraph.EreignisEdgeBuilder href "" "stskit.model.ereignisgraph.EreignisEdgeBuilder"
Builder für einen Flügelungsvorgang (F-Flag).
Der Builder erstellt ein Flügelungsereignis (Typ 'F') zwischen der Ankunft des ersten Zuges und den Abfahrten der geflügelten Züge.
Methods:
-
add_to_graph–Keine Wirkung
-
set_edge–Flügelungsvorgang darstellen
Source code in stskit/model/ereignisgraph.py
add_to_graph
set_edge
set_edge(node1_builder: ZielEreignisNodeBuilder, node2_builder: ZielEreignisNodeBuilder)
Flügelungsvorgang darstellen
An1 -F-> F -H-> Ab1, F -H-> Ab2
Der Flügelungszeitpunkt entspricht der Ankunftszeit plus Minimalaufenthaltszeit.
Source code in stskit/model/ereignisgraph.py
KupplungEdgeBuilder
KupplungEdgeBuilder(graph: EreignisGraph)
flowchart TD
stskit.model.ereignisgraph.KupplungEdgeBuilder[KupplungEdgeBuilder]
stskit.model.ereignisgraph.ZielEreignisEdgeBuilder[ZielEreignisEdgeBuilder]
stskit.model.ereignisgraph.EreignisEdgeBuilder[EreignisEdgeBuilder]
stskit.model.ereignisgraph.ZielEreignisEdgeBuilder --> stskit.model.ereignisgraph.KupplungEdgeBuilder
stskit.model.ereignisgraph.EreignisEdgeBuilder --> stskit.model.ereignisgraph.ZielEreignisEdgeBuilder
click stskit.model.ereignisgraph.KupplungEdgeBuilder href "" "stskit.model.ereignisgraph.KupplungEdgeBuilder"
click stskit.model.ereignisgraph.ZielEreignisEdgeBuilder href "" "stskit.model.ereignisgraph.ZielEreignisEdgeBuilder"
click stskit.model.ereignisgraph.EreignisEdgeBuilder href "" "stskit.model.ereignisgraph.EreignisEdgeBuilder"
Builder für einen Kupplungsvorgang (K-Flag).
Der Builder erstellt ein Kupplungsereignis (Typ 'K') zwischen den Ankünften der zwei Züge (gegeben durch Anfangs- und Endpunkt der Kante im Zielgraph) und der Abfahrt des gekuppelten Zuges (gegeben durch den Endpunkt der Zielkante).
Methods:
-
add_to_graph–Keine Wirkung
-
set_edge–Kupplungsvorgang darstellen
Source code in stskit/model/ereignisgraph.py
add_to_graph
set_edge
set_edge(node1_builder: ZielEreignisNodeBuilder, node2_builder: ZielEreignisNodeBuilder)
Kupplungsvorgang darstellen
An1 -K-> K, An2 -H-> K -H-> Ab2
Der Kupplungszeitpunkt (Planzeit des K-Knotens) entspricht der letzten Ankunftszeit plus Minimalaufenthalt der einlaufenden Züge.
Der Kupplungsknoten hat die zid des durchgehenden Zugs (2).
Source code in stskit/model/ereignisgraph.py
PlanfahrtEdgeBuilder
PlanfahrtEdgeBuilder(graph: EreignisGraph)
flowchart TD
stskit.model.ereignisgraph.PlanfahrtEdgeBuilder[PlanfahrtEdgeBuilder]
stskit.model.ereignisgraph.ZielEreignisEdgeBuilder[ZielEreignisEdgeBuilder]
stskit.model.ereignisgraph.EreignisEdgeBuilder[EreignisEdgeBuilder]
stskit.model.ereignisgraph.ZielEreignisEdgeBuilder --> stskit.model.ereignisgraph.PlanfahrtEdgeBuilder
stskit.model.ereignisgraph.EreignisEdgeBuilder --> stskit.model.ereignisgraph.ZielEreignisEdgeBuilder
click stskit.model.ereignisgraph.PlanfahrtEdgeBuilder href "" "stskit.model.ereignisgraph.PlanfahrtEdgeBuilder"
click stskit.model.ereignisgraph.ZielEreignisEdgeBuilder href "" "stskit.model.ereignisgraph.ZielEreignisEdgeBuilder"
click stskit.model.ereignisgraph.EreignisEdgeBuilder href "" "stskit.model.ereignisgraph.EreignisEdgeBuilder"
Builder für eine Planfahrt (normale Fahrt auf Strecke)
Die Planfahrt erstellt eine Kante zwischen dem Abfahrtsereignis des ersten Ziels und dem Ankunftsereignis des zweiten Ziels.
Source code in stskit/model/ereignisgraph.py
ZielEreignisEdgeBuilder
ZielEreignisEdgeBuilder(graph: EreignisGraph)
flowchart TD
stskit.model.ereignisgraph.ZielEreignisEdgeBuilder[ZielEreignisEdgeBuilder]
stskit.model.ereignisgraph.EreignisEdgeBuilder[EreignisEdgeBuilder]
stskit.model.ereignisgraph.EreignisEdgeBuilder --> stskit.model.ereignisgraph.ZielEreignisEdgeBuilder
click stskit.model.ereignisgraph.ZielEreignisEdgeBuilder href "" "stskit.model.ereignisgraph.ZielEreignisEdgeBuilder"
click stskit.model.ereignisgraph.EreignisEdgeBuilder href "" "stskit.model.ereignisgraph.EreignisEdgeBuilder"
Zwischenklasse zur für Builder, die Zielgraph-Kanten übersetzen.
Diese Zwischenklasse speichert die zu einer Kante gehörenden EreignisNodeBuilder. Diese werden in allen abgeleiteten Klassen benötigt.
Methods:
-
add_to_graph–Knoten und Kanten zum Ereignisgraphen hinzufügen.
Source code in stskit/model/ereignisgraph.py
add_to_graph
abstractmethod
Knoten und Kanten zum Ereignisgraphen hinzufügen.
Die Methode fügt die vom Builder verantworteten Knoten und internen Kanten dem EreignisGraph hinzu. Die Methode darf nur beim ersten Aufruf eine Wirkung zeigen.
Source code in stskit/model/ereignisgraph.py
ZielEreignisNodeBuilder
ZielEreignisNodeBuilder(graph: EreignisGraph)
flowchart TD
stskit.model.ereignisgraph.ZielEreignisNodeBuilder[ZielEreignisNodeBuilder]
stskit.model.ereignisgraph.EreignisNodeBuilder[EreignisNodeBuilder]
stskit.model.ereignisgraph.EreignisNodeBuilder --> stskit.model.ereignisgraph.ZielEreignisNodeBuilder
click stskit.model.ereignisgraph.ZielEreignisNodeBuilder href "" "stskit.model.ereignisgraph.ZielEreignisNodeBuilder"
click stskit.model.ereignisgraph.EreignisNodeBuilder href "" "stskit.model.ereignisgraph.EreignisNodeBuilder"
Zielgraph-Node in Ereignisgraph-Node übersetzen.
Dieser Builder übersetzt einen ZielGraph-Knoten in den enstprechenden Block von Ereignisknoten und -kanten. Bei Ein- und Ausfahrten wird ein Knoten erstellt, bei Planhalten und Durchfahrten ein Ankunfts- und ein Abfahrtsknoten mit Verbindungskante.
Die Knoten- und Kantenattribute werden in der import_ziel-Methode entsprechend den Zielattributen gesetzt. Zu diesem Zeitpunkt werden auch die nodes- und edges-Listen mit einem einfachen Ankunft-Abfahrt-Muster initialisiert. Bei komplexen Betriebsvorgängen werden die nodes und edges von den EreignisEdgeBuildern verändert, bevor die Struktur mittels add_to_graph in den EreignisGraph geschrieben wird.
Attributes:
-
zid(Optional[int]) –Zug-ID (für Diagnostik).
-
fid(Optional[ZielLabelType]) –Label des ursprünglichen Eintrags im ZielGraph (für Diagnostik).
-
node_template(Optional[EreignisGraphNode]) –Speichert den ersten importierten Node, um Kopien herzustellen (new_node).
-
edge_template(Optional[EreignisGraphEdge]) –Speichert die importierte Kante, um Kopien herzustellen (new_edge).
-
nodes(List[EreignisGraphNode]) –Liste von Ereignisknoten in Bearbeitung.
-
edges(List[EreignisGraphEdge]) –Liste von Ereigniskanten in Bearbeitung.
-
kupplungen(List[EreignisGraphNode]) –Liste von Kupplungsereignissen. S. kuppeln-Methode.
Methods:
-
abfahrt_entfernen–Abfahrtsknoten entfernen
-
abfahrt_verbinden–Abfahrtsknoten mit Knoten von anderem Zug verbinden
-
add_to_graph–Knoten und Kanten einem Ereignisgraphen hinzufügen.
-
ankunft_entfernen–Ankunftsknoten entfernen
-
first_label–Label des ersten erstellten Ereignisses.
-
import_ziel–Daten von Zielnode übernehmen.
-
kuppeln–Kupplungsknoten einfügen
-
last_label–Label des letzten erstellten Ereignisses.
-
new_edge–Neue Kante zum gleichen Ziel erstellen
-
new_node–Neuen Knoten zum gleichen Ziel erstellen
-
vorgang_einfuegen–Hilfsknoten für Zugnummernänderung einfügen
Source code in stskit/model/ereignisgraph.py
abfahrt_entfernen
abfahrt_verbinden
abfahrt_verbinden(node: EreignisGraphNode, edge: EreignisGraphEdge)
Abfahrtsknoten mit Knoten von anderem Zug verbinden
Source code in stskit/model/ereignisgraph.py
add_to_graph
Knoten und Kanten einem Ereignisgraphen hinzufügen.
Die Methode hat nur beim ersten Aufruf eine Wirkung.
Wenn bereits Ereignisknoten gleichen Typs zum ursprünglichen Zielknoten existieren, werden diese beibehalten. Die nodes und edges-Listen werden ggf. mit den effektiven Daten aktualisiert.
Source code in stskit/model/ereignisgraph.py
ankunft_entfernen
first_label
first_label() -> EreignisLabelType
Label des ersten erstellten Ereignisses.
Dies ist das Label von n1d oder n2d. Das Label ist erst nach Ausführen der add_to_graph-Methode gültig!
Source code in stskit/model/ereignisgraph.py
import_ziel
import_ziel(ziel_graph: ZielGraph, ziel_node: ZielGraphNode)
Daten von Zielnode übernehmen.
Erstellt bei gewöhnlichen Fahrzielen einen Ankunfts- und einen Abfahrtsknoten. Bei Ein- oder Ausfahrten wird nur ein Abfahrts- resp. Ankunftsknoten erstellt.
Wenn der ziel_node der erste des Zuges ist, wird zuganfang auf True gesetzt.
Source code in stskit/model/ereignisgraph.py
1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 | |
kuppeln
kuppeln(node: EreignisGraphNode)
Kupplungsknoten einfügen
Ein Zug kann das Ziel mehrerer Kupplungsvorgänge sein. Die Kupplungsknoten werden gesammelt und erst in der add_to_graph-Methode aufgelöst.
Parameters:
-
(nodeEreignisGraphNode) –Kupplungsknoten (EreignisGraphNode mit Typ "K")
Source code in stskit/model/ereignisgraph.py
last_label
last_label() -> EreignisLabelType
Label des letzten erstellten Ereignisses.
Dies ist das Label von n2d oder n1d. Das Label ist erst nach Ausführen der add_to_graph-Methode gültig!
Source code in stskit/model/ereignisgraph.py
new_edge
Neue Kante zum gleichen Ziel erstellen
Mit Typ 'H' und dem Ziel entsprechenden Mindestaufenthalt. Mit den Keyword-Argumenten können einzelne Attribute mit neuen Werten belegt werden.
:param attrs: Attribute mit neuen Werten initialisieren.
Source code in stskit/model/ereignisgraph.py
new_node
new_node(**attrs) -> EreignisGraphNode
Neuen Knoten zum gleichen Ziel erstellen
Mit den Eigenschaften des direkt importierten Ankunfts- oder Abfahrtsknotens (vor der Bearbeitung). Mit den Keyword-Argumenten können einzelne Attribute mit neuen Werten belegt werden.
:param attrs: Attribute mit neuen Werten initialisieren.
Source code in stskit/model/ereignisgraph.py
vorgang_einfuegen
vorgang_einfuegen(node: EreignisGraphNode, edge: EreignisGraphEdge)
Hilfsknoten für Zugnummernänderung einfügen
Hilfsknoten sind Zwischenknoten vom Typ E, K oder F.
Der Knoten wird an Position 1 der nodes-Liste eingefügt, die Kante an Position 0. Aus der ursprünglichen Abfolge A -a-> B wird A -h-> H -a-> B.
Parameters:
-
(nodeEreignisGraphNode) –einzufügender Knoten
-
(edgeEreignisGraphEdge) –einzufügende Kanten zwischen Hilfs- und Abfahrtsknoten