Vuo  2.2.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);
54  map<VuoCompilerTriggerPort *, vector<VuoCompilerChain *> > getChains(void);
55  vector<VuoCompilerNode *> getNodesImmediatelyDownstream(VuoCompilerTriggerPort *trigger);
56  vector<VuoCompilerNode *> getNodesImmediatelyDownstream(VuoCompilerNode *node, VuoCompilerTriggerPort *trigger);
57  vector<VuoCompilerNode *> getNodesDownstream(VuoCompilerTriggerPort *trigger);
58  vector<VuoCompilerNode *> getNodesDownstream(VuoCompilerNode *node, VuoCompilerTriggerPort *trigger);
59  vector<VuoCompilerNode *> getNodesDownstreamViaDataOnlyTransmission(VuoCompilerNode *node);
60  set<VuoCompilerCable *> getOutgoingCables(VuoCompilerPort *outputPort);
61  set<VuoCompilerNode *> getSourceNodesOfDataOnlyTransmission(void);
62  void getWorkerThreadsNeeded(VuoCompilerChain *chain, int &minThreadsNeeded, int &maxThreadsNeeded);
63  void getWorkerThreadsNeeded(VuoCompilerTriggerPort *trigger, int &minThreadsNeeded, int &maxThreadsNeeded);
65  VuoPortClass::EventBlocking getPublishedInputEventBlocking(size_t publishedInputPortIndex);
66  set<string> getPublishedOutputTriggers(void);
77  static long getHash(VuoCompilerComposition *composition);
78  static string getPublishedInputTriggerNodeIdentifier(void);
79  static string getManuallyFirableTriggerNodeIdentifier(void);
80 
81 private:
86  class Vertex
87  {
88  public:
89  VuoCompilerTriggerPort *fromTrigger;
90  VuoCompilerNode *fromNode;
91  VuoCompilerNode *toNode;
92  set<VuoCompilerCable *> cableBundle;
93  Vertex(VuoCompilerTriggerPort *fromTrigger, VuoCompilerNode *toNode);
94  Vertex(VuoCompilerNode *fromNode, VuoCompilerNode *toNode);
95  Vertex(void);
96  string toString(void) const;
97  };
98 
103  class Edge
104  {
105  public:
106  Vertex fromVertex;
107  Vertex toVertex;
108  Edge(const Vertex &fromVertex, const Vertex &toVertex);
109  Edge(void);
110  string toString(void) const;
111  };
112 
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 Vertex &lhs, const Vertex &rhs);
116  friend bool operator<(const Edge &lhs, const Edge &rhs);
117 
120  map<VuoCompilerTriggerPort *, vector<Vertex> > vertices;
121 
124  map<VuoCompilerTriggerPort *, set<Edge> > edges;
125 
127  map<VuoCompilerTriggerPort *, map<Vertex, set<Vertex> > > downstreamVertices;
128 
130  map<VuoCompilerTriggerPort *, set<Vertex> > repeatedVertices;
131 
133  vector<VuoCompilerTriggerPort *> triggers;
134 
136  map<VuoCompilerTriggerPort *, VuoCompilerNode *> nodeForTrigger;
137 
139  VuoCompilerTriggerPort *publishedInputTrigger;
140 
142  VuoCompilerTriggerPort *manuallyFirableTrigger;
143 
145  set<VuoCompilerNode *> nodes;
146 
148  VuoCompilerNode *publishedInputNode;
149 
151  VuoCompilerNode *publishedOutputNode;
152 
155  bool ownsPublishedNodeClasses;
156 
159  set<VuoCable *> publishedCables;
160 
162  map<VuoCompilerTriggerPort *, map<Vertex, size_t> > vertexDistanceFromTrigger;
163 
165  map<VuoCompilerTriggerPort *, map<Vertex, bool> > triggerMustTransmitToVertex;
166 
170  map<VuoCompilerNode *, vector<VuoCompilerNode *> > downstreamNodesViaDataOnlyTransmission;
171 
173  map<VuoCompilerTriggerPort *, vector<VuoCompilerChain *> > chains;
174 
176  map<VuoCompilerTriggerPort *, map<VuoCompilerNode *, map<VuoCompilerNode *, bool> > > vertexMayTransmit;
177 
179  map<VuoCompilerTriggerPort *, map<VuoCompilerNode *, size_t> > numVerticesWithToNode;
180 
182  map<VuoCompilerTriggerPort *, vector<VuoCompilerNode *> > downstreamNodesForTrigger;
183 
185  map<VuoCompilerTriggerPort *, map<VuoCompilerNode *, vector<VuoCompilerNode *> > > downstreamNodesForNode;
186 
188  map<Vertex, set<Vertex> > downstreamVerticesNonBlocking;
189 
191  map<Vertex, set<Vertex> > downstreamVerticesNonBlockingOrDoor;
192 
194  map<VuoCompilerTriggerPort *, set<string> > publishedOutputNames;
195 
196  void initializeInstance(VuoCompilerComposition *composition, set<VuoCompilerCable *> potentialCables, VuoCompilerNode *publishedInputNode, VuoCompilerNode *publishedOutputNode, VuoCompilerNode *publishedInputTriggerNode, bool ownsPublishedNodeClasses, VuoCompilerNode *manuallyFirableTriggerNode);
197  void makeTriggers(set<VuoNode *> nodes);
198  void makeVerticesAndEdges(const set<VuoCable *> &cables);
199  void makeDownstreamVerticesWithInclusionRule(VuoCompilerTriggerPort *trigger, std::function<bool(Edge)> includeEdge, map<Vertex, set<Vertex> > &_downstreamVertices, set<Vertex> &_repeatedVertices);
200  void makeDownstreamVertices(void);
201  void sortVertices(void);
202  void makeVertexDistances(void);
203  static bool compareTriggers(const pair<VuoCompilerTriggerPort *, size_t> &lhs, const pair<VuoCompilerTriggerPort *, size_t> &rhs);
204  void makeDownstreamNodesViaDataOnlyTransmission(set<VuoNode *> nodes, set<VuoCable *> cables);
205  static bool mustTransmit(const set<VuoCompilerCable *> &fromCables, const set<VuoCompilerCable *> &toCables);
206  static bool mayTransmit(const set<VuoCompilerCable *> &fromCables, const set<VuoCompilerCable *> &toCables);
207  bool mustTransmit(Vertex vertex, VuoCompilerTriggerPort *trigger);
208  bool mayTransmit(Vertex vertex, VuoCompilerTriggerPort *trigger);
209  bool mayTransmit(VuoCompilerNode *node, VuoCompilerTriggerPort *trigger);
210  bool mayTransmit(VuoCompilerNode *fromNode, VuoCompilerNode *toNode);
211  VuoPort * getOutputPortOnPublishedInputNode(size_t publishedInputPortIndex);
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 };