occam-directed-graphs 3.0.34 → 3.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/vertex.js ADDED
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+
3
+ import { vertexNamesFromVertices, orderVertices } from "./utilities/vertex";
4
+
5
+ export default class Vertex {
6
+ constructor(name, index, visited, immediatePredecessorVertices, immediateSuccessorVertices) {
7
+ this.name = name;
8
+ this.index = index;
9
+ this.visited = visited;
10
+ this.immediatePredecessorVertices = immediatePredecessorVertices;
11
+ this.immediateSuccessorVertices = immediateSuccessorVertices;
12
+ }
13
+
14
+ getName() {
15
+ return this.name;
16
+ }
17
+
18
+ getIndex() {
19
+ return this.index;
20
+ }
21
+
22
+ isVisited() {
23
+ return this.visited;
24
+ }
25
+
26
+ isStranded() {
27
+ const immediatePredecessorVerticesLength = this.immediatePredecessorVertices.length,
28
+ immediateSuccessorVerticesLength = this.immediateSuccessorVertices.length,
29
+ stranded = ((immediatePredecessorVerticesLength === 0) && (immediateSuccessorVerticesLength === 0));
30
+
31
+ return stranded;
32
+ }
33
+
34
+ getImmediatePredecessorVertexNames() {
35
+ const immediatePredecessorVertexNames = this.immediatePredecessorVertices.map((immediatePredecessorVertex) => {
36
+ const immediatePredecessorVertexName = immediatePredecessorVertex.getName();
37
+
38
+ return immediatePredecessorVertexName;
39
+ });
40
+
41
+ return immediatePredecessorVertexNames;
42
+ }
43
+
44
+ getImmediateSuccessorVertexNames() {
45
+ const immediateSuccessorVertexNames = this.immediateSuccessorVertices.map((immediateSuccessorVertex) => {
46
+ const immediateSuccessorVertexName = immediateSuccessorVertex.getName();
47
+
48
+ return immediateSuccessorVertexName;
49
+ });
50
+
51
+ return immediateSuccessorVertexNames;
52
+ }
53
+
54
+ getImmediatePredecessorVertices() {
55
+ return this.immediatePredecessorVertices;
56
+ }
57
+
58
+ getImmediateSuccessorVertices() {
59
+ return this.immediateSuccessorVertices;
60
+ }
61
+
62
+ getPredecessorVertexMap(predecessorVertexMap = {}) {
63
+ this.forEachImmediatePredecessorVertex((immediatePredecessorVertex) => {
64
+ const predecessorVertex = immediatePredecessorVertex, ///
65
+ predecessorVertexName = predecessorVertex.getName();
66
+
67
+ predecessorVertexMap[predecessorVertexName] = predecessorVertex;
68
+
69
+ predecessorVertex.getPredecessorVertexMap(predecessorVertexMap);
70
+ });
71
+
72
+ return predecessorVertexMap;
73
+ }
74
+
75
+ getSuccessorVertexMap(successorVertexMap = {}) {
76
+ this.forEachImmediateSuccessorVertex((immediateSuccessorVertex) => {
77
+ const successorVertex = immediateSuccessorVertex, ///
78
+ successorVertexName = successorVertex.getName();
79
+
80
+ successorVertexMap[successorVertexName] = successorVertex;
81
+
82
+ successorVertex.getSuccessorVertexMap(successorVertexMap);
83
+ });
84
+
85
+ return successorVertexMap;
86
+ }
87
+
88
+ getPredecessorVertexNames() {
89
+ const predecessorVertices = this.getPredecessorVertices(),
90
+ predecessorVertexNames = predecessorVertices.map((predecessorVertex) => {
91
+ const predecessorVertexName = predecessorVertex.getName();
92
+
93
+ return predecessorVertexName;
94
+ });
95
+
96
+ return predecessorVertexNames;
97
+ }
98
+
99
+ getSuccessorVertexNames() {
100
+ const successorVertices = this.getSuccessorVertices(),
101
+ successorVertexNames = successorVertices.map((successorVertex) => {
102
+ const successorVertexName = successorVertex.getName();
103
+
104
+ return successorVertexName;
105
+ });
106
+
107
+ return successorVertexNames;
108
+ }
109
+
110
+ getPredecessorVertices() {
111
+ const predecessorVertexMap = this.getPredecessorVertexMap(),
112
+ predecessorVertexNames = Object.keys(predecessorVertexMap),
113
+ predecessorVertices = predecessorVertexNames.map((predecessorVertexName) => {
114
+ const predecessorVertex = predecessorVertexMap[predecessorVertexName];
115
+
116
+ return predecessorVertex;
117
+ });
118
+
119
+ return predecessorVertices;
120
+ }
121
+
122
+ getSuccessorVertices() {
123
+ const successorVertexMap = this.getSuccessorVertexMap(),
124
+ successorVertexNames = Object.keys(successorVertexMap),
125
+ successorVertices = successorVertexNames.map((successorVertexName) => {
126
+ const successorVertex = successorVertexMap[successorVertexName];
127
+
128
+ return successorVertex;
129
+ });
130
+
131
+ return successorVertices;
132
+ }
133
+
134
+ getOrderedPredecessorVertexNames() {
135
+ const predecessorVertices = this.getPredecessorVertices();
136
+
137
+ orderVertices(predecessorVertices);
138
+
139
+ const orderedPredecessorVertices = predecessorVertices, ///
140
+ orderedPredecessorVertexNames = vertexNamesFromVertices(orderedPredecessorVertices);
141
+
142
+ return orderedPredecessorVertexNames;
143
+ }
144
+
145
+ retrieveForwardsAffectedVertices(sourceVertex) {
146
+ const forwardsAffectedVertices = this.forwardsDepthFirstSearch((visitedVertex) => {
147
+ const terminate = (visitedVertex === sourceVertex);
148
+
149
+ if (terminate) {
150
+ return true;
151
+ }
152
+ });
153
+
154
+ return forwardsAffectedVertices;
155
+ }
156
+
157
+ retrieveBackwardsAffectedVertices() {
158
+ const backwardsAffectedVertices = this.backwardsDepthFirstSearch((visitedVertex) => {
159
+ const terminate = false;
160
+
161
+ if (terminate) {
162
+ return true;
163
+ }
164
+ });
165
+
166
+ return backwardsAffectedVertices;
167
+ }
168
+
169
+ isVertexImmediatePredecessorVertex(vertex) {
170
+ const vertexImmediatePredecessorVertex = this.immediatePredecessorVertices.includes(vertex);
171
+
172
+ return vertexImmediatePredecessorVertex;
173
+ }
174
+
175
+ isVertexImmediateSuccessorVertex(vertex) {
176
+ const vertexImmediateSuccessorVertex = this.immediateSuccessorVertices.includes(vertex);
177
+
178
+ return vertexImmediateSuccessorVertex;
179
+ }
180
+
181
+ isEdgePresentBySourceVertex(sourceVertex) {
182
+ const sourceVertexImmediatePredecessorVertex = this.isVertexImmediatePredecessorVertex(sourceVertex),
183
+ edgePresent = sourceVertexImmediatePredecessorVertex; ///
184
+
185
+ return edgePresent;
186
+ }
187
+
188
+ isEdgePresentByTargetVertex(targetVertex) {
189
+ const targetVertexImmediateSuccessorVertex = this.isVertexImmediateSuccessorVertex(targetVertex),
190
+ edgePresent = targetVertexImmediateSuccessorVertex; ///
191
+
192
+ return edgePresent;
193
+ }
194
+
195
+ setName(name) {
196
+ this.name = name;
197
+ }
198
+
199
+ setIndex(index) {
200
+ this.index = index;
201
+ }
202
+
203
+ setVisited(visited) {
204
+ this.visited = visited;
205
+ }
206
+
207
+ decrementIndex() {
208
+ this.index--;
209
+ }
210
+
211
+ removeImmediatePredecessorVertex(immediatePredecessorVertex) {
212
+ const index = this.immediatePredecessorVertices.indexOf(immediatePredecessorVertex),
213
+ start = index, ///
214
+ deleteCount = 1;
215
+
216
+ this.immediatePredecessorVertices.splice(start, deleteCount);
217
+ }
218
+
219
+ removeImmediateSuccessorVertex(immediateSuccessorVertex) {
220
+ const index = this.immediateSuccessorVertices.indexOf(immediateSuccessorVertex),
221
+ start = index, ///
222
+ deleteCount = 1;
223
+
224
+ this.immediateSuccessorVertices.splice(start, deleteCount);
225
+ }
226
+
227
+ removeIncomingEdges() {
228
+ const immediateSuccessorVertex = this; ///
229
+
230
+ this.immediatePredecessorVertices.forEach((immediatePredecessorVertex) => immediatePredecessorVertex.removeImmediateSuccessorVertex(immediateSuccessorVertex));
231
+
232
+ this.immediatePredecessorVertices = [];
233
+ }
234
+
235
+ removeOutgoingEdges() {
236
+ const immediatePredecessorVertex = this; ///
237
+
238
+ this.immediateSuccessorVertices.forEach((immediateSuccessorVertex) => immediateSuccessorVertex.removeImmediateSuccessorVertex(immediatePredecessorVertex));
239
+
240
+ this.immediateSuccessorVertices = [];
241
+ }
242
+
243
+ addImmediatePredecessorVertex(immediatePredecessorVertex) {
244
+ this.immediatePredecessorVertices.push(immediatePredecessorVertex);
245
+ }
246
+
247
+ addImmediateSuccessorVertex(immediateSuccessorVertex) {
248
+ this.immediateSuccessorVertices.push(immediateSuccessorVertex);
249
+ }
250
+
251
+ forwardsDepthFirstSearch(callback) {
252
+ const visitedVertices = [];
253
+
254
+ this.retrieveForwardsVisitedVertices((visitedVertex) => {
255
+ const terminate = callback(visitedVertex); ///
256
+
257
+ visitedVertices.push(visitedVertex);
258
+
259
+ return terminate;
260
+ });
261
+
262
+ visitedVertices.forEach((visitedVertex) => visitedVertex.resetVisited());
263
+
264
+ return visitedVertices;
265
+ }
266
+
267
+ backwardsDepthFirstSearch(callback) {
268
+ const visitedVertices = [];
269
+
270
+ this.retrieveBackwardsVisitedVertices((visitedVertex) => {
271
+ const terminate = callback(visitedVertex); ///
272
+
273
+ visitedVertices.push(visitedVertex);
274
+
275
+ return terminate;
276
+ });
277
+
278
+ visitedVertices.forEach((visitedVertex) => visitedVertex.resetVisited());
279
+
280
+ return visitedVertices;
281
+ }
282
+
283
+ retrieveForwardsVisitedVertices(callback) {
284
+ let terminate = false;
285
+
286
+ if (this.visited === false) {
287
+ this.visited = true;
288
+
289
+ const visitedVertex = this; ///
290
+
291
+ terminate = callback(visitedVertex);
292
+
293
+ if (terminate !== true) {
294
+ visitedVertex.someImmediateSuccessorVertex((immediateSuccessorVertex) => {
295
+ terminate = immediateSuccessorVertex.retrieveForwardsVisitedVertices(callback);
296
+
297
+ if (terminate) {
298
+ return true;
299
+ }
300
+ });
301
+ }
302
+ }
303
+
304
+ return terminate;
305
+ }
306
+
307
+ retrieveBackwardsVisitedVertices(callback) {
308
+ let terminate = false;
309
+
310
+ if (this.visited === false) {
311
+ this.visited = true;
312
+
313
+ const visitedVertex = this; ///
314
+
315
+ terminate = callback(visitedVertex);
316
+
317
+ if (terminate !== true) {
318
+ visitedVertex.someImmediatePredecessorVertex((immediatePredecessorVertex) => {
319
+ terminate = immediatePredecessorVertex.retrieveBackwardsVisitedVertices(callback);
320
+
321
+ if (terminate) {
322
+ return true;
323
+ }
324
+ });
325
+ }
326
+ }
327
+
328
+ return terminate;
329
+ }
330
+
331
+ forEachImmediatePredecessorVertex(callback) {
332
+ this.immediatePredecessorVertices.forEach(callback);
333
+ }
334
+
335
+ forEachImmediateSuccessorVertex(callback) {
336
+ this.immediateSuccessorVertices.forEach(callback);
337
+ }
338
+
339
+ someImmediatePredecessorVertex(callback) {
340
+ this.immediatePredecessorVertices.some(callback);
341
+ }
342
+
343
+ someImmediateSuccessorVertex(callback) {
344
+ this.immediateSuccessorVertices.some(callback);
345
+ }
346
+
347
+ resetVisited() {
348
+ this.visited = false;
349
+ }
350
+
351
+ static fromNameAndIndex(name, index) {
352
+ const visited = false, ///
353
+ immediatePredecessorVertices = [],
354
+ immediateSuccessorVertices = [],
355
+ dependencyVertex = new Vertex(name, index, visited, immediatePredecessorVertices, immediateSuccessorVertices);
356
+
357
+ return dependencyVertex;
358
+ }
359
+ }