Vuo 2.4.4
Loading...
Searching...
No Matches
VuoDirectedAcyclicGraph.hh
Go to the documentation of this file.
1
10#pragma once
11
12#include <mutex>
13
18{
19public:
23 class Vertex
24 {
25 public:
29 virtual string key(void) = 0;
30
31 virtual ~Vertex(void);
32 };
33
36 void addVertex(Vertex *vertex);
37 void removeVertex(Vertex *vertex);
38 Vertex * findVertex(const string &key);
39 void addEdge(Vertex *fromVertex, Vertex *toVertex);
40 void removeEdge(Vertex *fromVertex, Vertex *toVertex);
41 vector<Vertex *> getImmediatelyDownstreamVertices(Vertex *vertex);
42 vector<Vertex *> getDownstreamVertices(Vertex *vertex);
43 vector<Vertex *> getImmediatelyUpstreamVertices(Vertex *vertex);
44 vector<Vertex *> getUpstreamVertices(Vertex *vertex);
45 set<Vertex *> getCycleVertices(void);
47 string toString(bool showVertexAddresses=false);
48
49private:
50 vector<Vertex *> getDownstreamVerticesInternal(Vertex *vertex);
51 int getLongestDownstreamPathInternal(Vertex *vertex);
52 static vector<Vertex *> getReachableVertices(Vertex *vertex, const map< Vertex *, vector<Vertex *> > &edges, set<Vertex *> &cycleVertices);
53
54 map< Vertex *, vector<Vertex *> > edges;
55 map< Vertex *, vector<Vertex *> > downstreamVerticesCache;
56 map< Vertex *, vector<Vertex *> > upstreamVerticesCache;
57 bool cycleVerticesCacheReady;
58 set<Vertex *> cycleVerticesCache;
59 map< Vertex *, int > longestDownstreamPathsCache;
60 std::mutex graphMutex;
61
62 friend class VuoDirectedAcyclicNetwork;
63};
64
72{
73public:
74 vector<VuoDirectedAcyclicGraph::Vertex *> findVertex(const string &key);
76 vector<VuoDirectedAcyclicGraph::Vertex *> getImmediatelyDownstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
77 vector<VuoDirectedAcyclicGraph::Vertex *> getDownstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
78 vector<VuoDirectedAcyclicGraph::Vertex *> getImmediatelyUpstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
79 vector<VuoDirectedAcyclicGraph::Vertex *> getUpstreamVertices(VuoDirectedAcyclicGraph::Vertex *vertex);
80 string toString(bool showVertexAddresses=false);
81
82private:
83 vector<VuoDirectedAcyclicGraph::Vertex *> getUpstreamVerticesInternal(VuoDirectedAcyclicGraph::Vertex *vertex, bool isImmediate);
84 static vector<VuoDirectedAcyclicGraph::Vertex *> getReachableVertices(VuoDirectedAcyclicGraph::Vertex *vertex, const map< VuoDirectedAcyclicGraph *, vector<VuoDirectedAcyclicGraph *> > &edges, bool isDownstream, bool isImmediate);
85
86 map< VuoDirectedAcyclicGraph *, vector<VuoDirectedAcyclicGraph *> > edges;
87};