.. _STRUCT: Overview ######## Currently, the following data structures are implemented: * :ref:`STRUCT/Path/Generic` * :ref:`STRUCT/Path/URL` +---------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+ | :ref:`STRUCT/Graph` | :ref:`STRUCT/Tree` | :ref:`STRUCT/Statemachine` | +=====================================================================================================================+====================================================================================================================+=====================================================================================================================+ | .. mermaid:: | .. mermaid:: | .. mermaid:: | | :caption: A directed graph with backward-edges denoted by dotted vertex relations. | :caption: Root of the current node are marked in blue. | :caption: A statemachine graph. | | | | | | %%{init: { "flowchart": { "nodeSpacing": 15, "rankSpacing": 30, "curve": "linear", "useMaxWidth": false } } }%% | %%{init: { "flowchart": { "nodeSpacing": 15, "rankSpacing": 30, "curve": "linear", "useMaxWidth": false } } }%% | %%{init: { "flowchart": { "nodeSpacing": 15, "rankSpacing": 30, "curve": "linear", "useMaxWidth": false } } }%% | | graph LR | graph TD | graph TD | | A(A); B(B); C(C); D(D); E(E); F(F) ; G(G); H(H); I(I) | R(Root) | A(Idle); B(Check); C(Prepare); D(Read); E(Finished); F(Write) ; G(Retry); H(WriteWait); I(ReadWait) | | | A(...) | | | A --> B --> E | BL(Node); B(GrandParent); BR(Node) | A:::mark1 --> B --> C --> F | | G --> F | CL(Uncle); C(Parent); CR(Aunt) | F --> H --> E:::cur | | A --> C --> G --> H --> D | DL(Sibling); D(Node); DR(Sibling) | B --> G --> B | | D -.-> A | ELN1(Niece); ELN2(Nephew) | G -.-> A --> C | | D & F -.-> B | EL(Child); E(Child); ER(Child); | D -.-> A | | I ---> E --> F --> D | ERN1(Niece);ERN2(Nephew) | C ---> D --> I --> E -.-> A | | | F1(GrandChild); F2(GrandChild) | | | classDef node fill:#eee,stroke:#777,font-size:smaller; | | classDef node fill:#eee,stroke:#777,font-size:smaller; | | classDef node fill:#eee,stroke:#777,font-size:smaller; | R:::mark1 --> A | classDef cur fill:#9e9,stroke:#6e6; | | classDef node fill:#eee,stroke:#777,font-size:smaller; | A --> BL & B & BR | classDef mark1 fill:#69f,stroke:#37f,color:#eee; | | | B --> CL & C & CR | | | | C --> DL & D & DR | | | | DL --> ELN1 & ELN2 | | | | D:::cur --> EL & E & ER | | | | DR --> ERN1 & ERN2 | | | | E --> F1 & F2 | | | | | | | | classDef node fill:#eee,stroke:#777,font-size:smaller; | | | | classDef cur fill:#9e9,stroke:#6e6; | | | | classDef mark1 fill:#69f,stroke:#37f,color:#eee; | | | | | | +---------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+ | .. code-block:: python | .. code-block:: python | .. code-block:: python | | | | | | from pyTooling.Graph import Graph | from pyTooling.Tree import Node | from pyTooling.StateMachine import FSM, State | | | | | | graph = Graph(name="Example Graph") | root = Node(id="Root") | | | | | | | # Create a standalone vertex A in the graph | dir1 = Node(id="Dir1", parent=root) | | | rootA = Vertex(value="A", graph=graph) | dir2 = Node(id="Dir2", parent=root) | | | | file0 = Node(id="File0", parent=root) | | | # Add 2 vertices B,C and add edges from A | dir3 = Node(id="Dir3", parent=root) | | | edgeAB = rootA.EdgeToNewVertex(vertexValue="B") | | | | edgeAC = rootA.EdgeToNewVertex(vertexValue="C") | file1 = Node(id="File1", parent=dir1) | | | | file2 = Node(id="File2", parent=dir1) | | | # Get vertices B,C | file3 = Node(id="File3", parent=dir1) | | | vertexB = edgeAB.Destination | | | | vertexC = edgeAC.Destination | file4 = Node(id="File4", parent=dir2) | | | | | | | # Add more standalone vertices D,E,F,G | file5 = Node(id="File5", parent=dir3) | | | vertexD = Vertex(value="D", graph=graph) | file6 = Node(id="File6", parent=dir3) | | | vertexE = Vertex(value="E", graph=graph) | | | | vertexF = Vertex(value="F", graph=graph) | | | | vertexG = Vertex(value="G", graph=graph) | | | | | | | | # Create edges between B-E,C-G,D-A,D-B | | | | vertexB.EdgeTo(vertexE) | | | | vertexC.EdgeTo(vertexG) | | | | vertexD.EdgeTo(rootA) | | | | vertexD.EdgeTo(vertexB) | | | | vertexE.EdgeTo(vertexF) | | | | vertexF.EdgeTo(vertexB) | | | | vertexG.EdgeTo(vertexF) | | | | | | | | # Create edge from | | | | vertexD.EdgeFrom(vertexF) | | | | | | | | # Add vertex I,H and add edge from new vertex to existing | | | | vertexE.EdgeFromNewVertex(vertexValue="I") | | | | vertexD.EdgeFromNewVertex(vertexValue="H") | | | | | | | | # Lookup vertices and link them | | | | vertexG.EdgeTo(graph.GetVertexByValue("H")) | | | | | | | +---------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+