Vuo  2.0.0
VuoCompilerGraph.hh
Go to the documentation of this file.
1 
10 #pragma once
11 
12 class VuoCompiler;
13 class VuoCompilerCable;
14 class VuoCompilerChain;
17 class VuoCompilerIssues;
18 class VuoCompilerNode;
20 class VuoCompilerPort;
22 class VuoCable;
23 class VuoNode;
24 class VuoPort;
25 class VuoPublishedPort;
26 
27 #include "VuoPortClass.hh"
28 
38 {
39 public:
40  VuoCompilerGraph(VuoCompilerComposition *composition, VuoCompiler *compiler = nullptr, set<VuoCompilerCable *> potentialCables = set<VuoCompilerCable *>());
41  ~VuoCompilerGraph(void);
42  bool mayTransmit(VuoCompilerNode *fromNode, VuoCompilerNode *toNode, VuoCompilerTriggerPort *trigger);
44  vector<VuoCompilerTriggerPort *> getTriggerPorts(void);
46  set<VuoCompilerNode *> getNodes(void);
50  VuoPort * getInputPortOnPublishedInputNode(size_t publishedInputPortIndex);
51  VuoPort * getInputPortOnPublishedOutputNode(size_t publishedOutputPortIndex);
53  map<VuoCompilerTriggerPort *, vector<VuoCompilerChain *> > getChains(void);
54  vector<VuoCompilerNode *> getNodesImmediatelyDownstream(VuoCompilerTriggerPort *trigger);
55  vector<VuoCompilerNode *> getNodesImmediatelyDownstream(VuoCompilerNode *node, VuoCompilerTriggerPort *trigger);
56  vector<VuoCompilerNode *> getNodesDownstream(VuoCompilerTriggerPort *trigger);
57  vector<VuoCompilerNode *> getNodesDownstream(VuoCompilerNode *node, VuoCompilerTriggerPort *trigger);
58  vector<VuoCompilerNode *> getNodesDownstreamViaDataOnlyTransmission(VuoCompilerNode *node);
59  set<VuoCompilerCable *> getOutgoingCables(VuoCompilerPort *outputPort);
60  set<VuoCompilerNode *> getSourceNodesOfDataOnlyTransmission(void);
61  void getWorkerThreadsNeeded(VuoCompilerChain *chain, int &minThreadsNeeded, int &maxThreadsNeeded);
62  void getWorkerThreadsNeeded(VuoCompilerTriggerPort *trigger, int &minThreadsNeeded, int &maxThreadsNeeded);
64  VuoPortClass::EventBlocking getPublishedInputEventBlocking(size_t publishedInputPortIndex);
65  set<string> getPublishedOutputTriggers(void);
76  static long getHash(VuoCompilerComposition *composition);
77  static string getPublishedInputTriggerNodeIdentifier(void);
78  static string getManuallyFirableTriggerNodeIdentifier(void);
79 
80 private:
85  class Vertex
86  {
87  public:
88  VuoCompilerTriggerPort *fromTrigger;
89  VuoCompilerNode *fromNode;
90  VuoCompilerNode *toNode;
91  set<VuoCompilerCable *> cableBundle;
92  Vertex(VuoCompilerTriggerPort *fromTrigger, VuoCompilerNode *toNode);
93  Vertex(VuoCompilerNode *fromNode, VuoCompilerNode *toNode);
94  Vertex(void);
95  string toString(void) const;
96  };
97 
102  class Edge
103  {
104  public:
105  Vertex fromVertex;
106  Vertex toVertex;
107  Edge(const Vertex &fromVertex, const Vertex &toVertex);
108  Edge(void);
109  string toString(void) const;
110  };
111 
112  friend bool operator==(const Vertex &lhs, const Vertex &rhs);
113  friend bool operator!=(const Vertex &lhs, const Vertex &rhs);
114  friend bool operator<(const Vertex &lhs, const Vertex &rhs);
115  friend bool operator<(const Edge &lhs, const Edge &rhs);
116 
119  map<VuoCompilerTriggerPort *, vector<Vertex> > vertices;
120 
123  map<VuoCompilerTriggerPort *, set<Edge> > edges;
124 
126  map<VuoCompilerTriggerPort *, map<Vertex, set<Vertex> > > downstreamVertices;
127 
129  map<VuoCompilerTriggerPort *, set<Vertex> > repeatedVertices;
130 
132  vector<VuoCompilerTriggerPort *> triggers;
133 
135  map<VuoCompilerTriggerPort *, VuoCompilerNode *> nodeForTrigger;
136 
138  VuoCompilerTriggerPort *publishedInputTrigger;
139 
141  VuoCompilerTriggerPort *manuallyFirableTrigger;
142 
144  set<VuoCompilerNode *> nodes;
145 
147  VuoCompilerNode *publishedInputNode;
148 
150  VuoCompilerNode *publishedOutputNode;
151 
154  bool ownsPublishedNodeClasses;
155 
158  set<VuoCable *> publishedCables;
159 
161  map<VuoCompilerTriggerPort *, map<Vertex, size_t> > vertexDistanceFromTrigger;
162 
164  map<VuoCompilerTriggerPort *, map<Vertex, bool> > triggerMustTransmitToVertex;
165 
169  map<VuoCompilerNode *, vector<VuoCompilerNode *> > downstreamNodesViaDataOnlyTransmission;
170 
172  map<VuoCompilerTriggerPort *, vector<VuoCompilerChain *> > chains;
173 
175  map<VuoCompilerTriggerPort *, map<VuoCompilerNode *, map<VuoCompilerNode *, bool> > > vertexMayTransmit;
176 
178  map<VuoCompilerTriggerPort *, map<VuoCompilerNode *, size_t> > numVerticesWithToNode;
179 
181  map<VuoCompilerTriggerPort *, vector<VuoCompilerNode *> > downstreamNodesForTrigger;
182 
184  map<VuoCompilerTriggerPort *, map<VuoCompilerNode *, vector<VuoCompilerNode *> > > downstreamNodesForNode;
185 
187  map<Vertex, set<Vertex> > downstreamVerticesNonBlocking;
188 
190  map<Vertex, set<Vertex> > downstreamVerticesNonBlockingOrDoor;
191 
193  map<VuoCompilerTriggerPort *, set<string> > publishedOutputNames;
194 
195  void initializeInstance(VuoCompilerComposition *composition, set<VuoCompilerCable *> potentialCables, VuoCompilerNode *publishedInputNode, VuoCompilerNode *publishedOutputNode, VuoCompilerNode *publishedInputTriggerNode, bool ownsPublishedNodeClasses, VuoCompilerNode *manuallyFirableTriggerNode);
196  void makeTriggers(set<VuoNode *> nodes);
197  void makeVerticesAndEdges(const set<VuoCable *> &cables);
198  void makeDownstreamVerticesWithInclusionRule(VuoCompilerTriggerPort *trigger, std::function<bool(Edge)> includeEdge, map<Vertex, set<Vertex> > &_downstreamVertices, set<Vertex> &_repeatedVertices);
199  void makeDownstreamVertices(void);
200  void sortVertices(void);
201  void makeVertexDistances(void);
202  static bool compareTriggers(const pair<VuoCompilerTriggerPort *, size_t> &lhs, const pair<VuoCompilerTriggerPort *, size_t> &rhs);
203  void makeDownstreamNodesViaDataOnlyTransmission(set<VuoNode *> nodes, set<VuoCable *> cables);
204  static bool mustTransmit(const set<VuoCompilerCable *> &fromCables, const set<VuoCompilerCable *> &toCables);
205  static bool mayTransmit(const set<VuoCompilerCable *> &fromCables, const set<VuoCompilerCable *> &toCables);
206  bool mustTransmit(Vertex vertex, VuoCompilerTriggerPort *trigger);
207  bool mayTransmit(Vertex vertex, VuoCompilerTriggerPort *trigger);
208  bool mayTransmit(VuoCompilerNode *node, VuoCompilerTriggerPort *trigger);
209  bool mayTransmit(VuoCompilerNode *fromNode, VuoCompilerNode *toNode);
210  VuoPort * getOutputPortOnPublishedInputNode(size_t publishedInputPortIndex);
211  VuoPort * getGatherPortOnPublishedOutputNode(void);
212  size_t getNumVerticesWithFromNode(VuoCompilerNode *fromNode, VuoCompilerTriggerPort *trigger);
213  size_t getNumVerticesWithToNode(VuoCompilerNode *toNode, VuoCompilerTriggerPort *trigger);
214  bool areNodesPartiallyOverlappedByAnotherTrigger(const vector<VuoCompilerNode *> &nodes, VuoCompilerTriggerPort *trigger);
215 
216  friend class TestVuoCompilerBitcodeGenerator;
217 };