(tensor: SymbolicTensor, finishedNodes: Node[], nodesInProgress: Node[],
layer?: Layer, nodeIndex?: number, tensorIndex?: number)
| 260 | */ |
| 261 | const buildMapOfGraph = |
| 262 | (tensor: SymbolicTensor, finishedNodes: Node[], nodesInProgress: Node[], |
| 263 | layer?: Layer, nodeIndex?: number, tensorIndex?: number) => { |
| 264 | if (layer == null || nodeIndex == null || tensorIndex == null) { |
| 265 | layer = tensor.sourceLayer; |
| 266 | nodeIndex = tensor.nodeIndex; |
| 267 | tensorIndex = tensor.tensorIndex; |
| 268 | } |
| 269 | const node = layer.inboundNodes[nodeIndex]; |
| 270 | |
| 271 | // Prevent cycles. |
| 272 | if (nodesInProgress.indexOf(node) !== -1) { |
| 273 | throw new RuntimeError( |
| 274 | `The tensor ${tensor.name} at layer "${layer.name}" ` + |
| 275 | 'is part of a cycle.'); |
| 276 | } |
| 277 | |
| 278 | // Don't repeat work for shared subgraphs |
| 279 | if (finishedNodes.indexOf(node) !== -1) { |
| 280 | return; |
| 281 | } |
| 282 | |
| 283 | // Update containerNodes. |
| 284 | this.containerNodes.add(Container.nodeKey(layer, nodeIndex)); |
| 285 | |
| 286 | // Store the traversal order for layer sorting. |
| 287 | if (!(layer.id in layerIndices)) { |
| 288 | layerIndices[layer.id] = Object.keys(layerIndices).length; |
| 289 | } |
| 290 | |
| 291 | if (nodesInProgress.indexOf(node) === -1) { |
| 292 | nodesInProgress.push(node); |
| 293 | } |
| 294 | |
| 295 | // Propagate to all previous tensors connected to this node. |
| 296 | const numInboundLayers = node.inboundLayers.length; |
| 297 | for (let i = 0; i < numInboundLayers; i++) { |
| 298 | const x = node.inputTensors[i]; |
| 299 | const layer = node.inboundLayers[i]; |
| 300 | const nodeIndex = node.nodeIndices[i]; |
| 301 | const tensorIndex = node.tensorIndices[i]; |
| 302 | buildMapOfGraph( |
| 303 | x, finishedNodes, nodesInProgress, layer, nodeIndex, |
| 304 | tensorIndex); |
| 305 | } |
| 306 | finishedNodes.push(node); |
| 307 | while (nodesInProgress.indexOf(node) >= 0) { |
| 308 | nodesInProgress.splice(nodesInProgress.indexOf(node), 1); |
| 309 | } |
| 310 | nodesInDecreasingDepth.push(node); |
| 311 | }; |
| 312 | |
| 313 | const finishedNodes: Node[] = []; |
| 314 | const nodesInProgress: Node[] = []; |
no test coverage detected
searching dependent graphs…