private void updatePropagationDownWards(Collection<Link> linksToPropagateDown, Set<Link> linksAllLayersToUpdate, Set<Demand> demandsAllLayersToUpdate, Set<MulticastDemand> mDemandsAllLayersToUpdate) { if (netPlan.getNumberOfLayers() > 1) { final Pair<SortedSet<Demand>, SortedSet<Pair<MulticastDemand, Node>>> downInfo = getDownCoupling(linksToPropagateDown); if (downInfo.getFirst().isEmpty() && downInfo.getSecond().isEmpty()) return; final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(downInfo.getFirst(), null, downInfo.getSecond(), false); linksAllLayersToUpdate.addAll(ipg.getLinksInGraph()); demandsAllLayersToUpdate.addAll(ipg.getDemandsInGraph()); mDemandsAllLayersToUpdate.addAll(ipg.getMulticastDemandFlowsInGraph().stream().map(p -> p.getFirst()).collect(Collectors.toSet())); } }
private void addEdgeAddingNewVertexAndPropagatingIfNeeded (Pair<MulticastDemand,Node> m , IPGNode edgeInitialNode , boolean propagateUpwards) { IPGNode ipgNode = mDemandAndNode2VertexMap.get(m); final boolean newlyCreatedIPG = (ipgNode == null); if (newlyCreatedIPG) { ipgNode = new IPGNode (null , null, m); mDemandAndNode2VertexMap.put(m , ipgNode); this.interLayerPropagationGraph.addVertex(ipgNode); } try { this.interLayerPropagationGraph.addDagEdge(edgeInitialNode , ipgNode , new Object ()); } catch (CycleFoundException ex) { throw new RuntimeException(ex.getMessage()); } if (newlyCreatedIPG) if (propagateUpwards) addVertexAndEdgesToGraphFromInitialIPGUpwards(ipgNode); else addVertexAndEdgesToGraphFromInitialIPGDownwards(ipgNode); }
final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(downLayerInfo.getFirst(), null, downLayerInfo.getSecond(), false); DrawUtils.drawCollateralLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); final SortedSet<Pair<MulticastDemand, Node>> mDemands = new TreeSet<> (thisLayerTraversalInfo.getThird().keySet()); final SortedSet<Link> initialUpperLinks = DrawUtils.getUpCoupling(demandsPrimaryAndBackup, mDemands); final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(null, initialUpperLinks, null, true); DrawUtils.drawCollateralLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED);
if (!d.isCoupled()) return; final Link upGraphNodeLink = d.getCoupledLink(); addEdgeAddingNewVertexAndPropagatingIfNeeded(upGraphNodeLink, initialNode, this.upWardsTrueDownwardsFalse); final SortedSet<Pair<MulticastDemand,Node>> mDemandsAndNodesPuttingTraffic = new TreeSet<> (thisLayerLinksTraversingSameTrafficInfo.getThird().keySet()); for (Demand upGraphNodeDemand : demandsPuttingPrimaryOrBackupTraffic) addEdgeAddingNewVertexAndPropagatingIfNeeded(upGraphNodeDemand, initialNode, this.upWardsTrueDownwardsFalse); for (Pair<MulticastDemand,Node> upGraphNodeMulticastDemand : mDemandsAndNodesPuttingTraffic) addEdgeAddingNewVertexAndPropagatingIfNeeded(upGraphNodeMulticastDemand, initialNode, this.upWardsTrueDownwardsFalse); if (!mPair.getFirst().isCoupled()) return; final Link upGraphNodeLink = mPair.getFirst().getCoupledLinks().stream().filter (e->e.getDestinationNode() == mPair.getSecond()).findFirst().get(); addEdgeAddingNewVertexAndPropagatingIfNeeded(upGraphNodeLink, initialNode, this.upWardsTrueDownwardsFalse);
final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(couplingInfo.getFirst(), null, couplingInfo.getSecond(), false); final SortedSet<Link> lowerLayerLinks = ipg.getLinksInGraph(); DrawUtils.drawCollateralLinks(vs, lowerLayerLinks, VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_AFFECTEDFAILURES); DrawUtils.drawDownPropagationInterLayerLinks(vs, lowerLayerLinks, VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_AFFECTEDFAILURES); final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(null, coupledUpperLinks, null, true); DrawUtils.drawCollateralLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_AFFECTEDFAILURES); DrawUtils.drawDownPropagationInterLayerLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_AFFECTEDFAILURES);
private void addVertexAndEdgesToGraphFromInitialIPGDownwards (IPGNode initialNode) { if (initialNode.isLink()) { final Link e = initialNode.getLink(); if (!e.isCoupled()) return; final Demand downGraphNodeDemand = e.getCoupledDemand(); final MulticastDemand downGraphNodeMulticastDemand = e.getCoupledMulticastDemand(); if (downGraphNodeDemand != null) addEdgeAddingNewVertexAndPropagatingIfNeeded(downGraphNodeDemand, initialNode, this.upWardsTrueDownwardsFalse); else addEdgeAddingNewVertexAndPropagatingIfNeeded(Pair.of(downGraphNodeMulticastDemand , e.getDestinationNode()), initialNode, this.upWardsTrueDownwardsFalse); } else if (initialNode.isDemand()) { final Demand d = initialNode.getDemand(); Pair<SortedSet<Link>,SortedSet<Link>> thisLayerLinksTraversingSameTrafficInfo = d.getLinksNoDownPropagationPotentiallyCarryingTraffic(); for (Link downGraphNodeLink : Sets.union(thisLayerLinksTraversingSameTrafficInfo.getFirst(), thisLayerLinksTraversingSameTrafficInfo.getSecond())) addEdgeAddingNewVertexAndPropagatingIfNeeded(downGraphNodeLink, initialNode, this.upWardsTrueDownwardsFalse); } else if (initialNode.isMulticastFlow()) { final Pair<MulticastDemand,Node> mPair = initialNode.getMulticastDemandAndNode(); final SortedSet<Link> downGraphNodeLinks = mPair.getFirst().getLinksNoDownPropagationPotentiallyCarryingTraffic(mPair.getSecond()); for (Link e : downGraphNodeLinks) addEdgeAddingNewVertexAndPropagatingIfNeeded(e, initialNode, this.upWardsTrueDownwardsFalse); } else throw new RuntimeException("initialNode: " + initialNode); } private void addVertexAndEdgesToGraphFromInitialIPGUpwards (IPGNode initialNode) throws RuntimeException
private void updatePropagationUpWards(Collection<Demand> demandsToPropagateUp, Collection<MulticastDemand> mDemandsToPropagateUp, Set<Link> linksAllLayersToUpdate, Set<Demand> demandsAllLayersToUpdate, Set<MulticastDemand> mDemandsAllLayersToUpdate) { if (netPlan.getNumberOfLayers() > 1) { final Set<Pair<MulticastDemand, Node>> mDemandsAllEgressNodes = new HashSet<Pair<MulticastDemand, Node>>(); if (mDemandsToPropagateUp != null) for (MulticastDemand md : mDemandsToPropagateUp) for (Node n : md.getEgressNodes()) mDemandsAllEgressNodes.add(Pair.of(md, n)); final SortedSet<Link> initialUpperLinks = getUpCoupling(demandsToPropagateUp, mDemandsAllEgressNodes); if (initialUpperLinks.isEmpty()) return; final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(null, initialUpperLinks, null, true); linksAllLayersToUpdate.addAll(ipg.getLinksInGraph()); demandsAllLayersToUpdate.addAll(ipg.getDemandsInGraph()); mDemandsAllLayersToUpdate.addAll(ipg.getMulticastDemandFlowsInGraph().stream().map(p -> p.getFirst()).collect(Collectors.toSet())); } }
final Pair<SortedSet<Demand>, SortedSet<Pair<MulticastDemand, Node>>> downLayerInfoPrimary = DrawUtils.getDownCoupling(thisLayerPropagation.getFirst()); final Pair<SortedSet<Demand>, SortedSet<Pair<MulticastDemand, Node>>> downLayerInfoBackup = DrawUtils.getDownCoupling(thisLayerPropagation.getSecond()); final InterLayerPropagationGraph ipgPrimary = new InterLayerPropagationGraph(downLayerInfoPrimary.getFirst(), null, downLayerInfoPrimary.getSecond(), false); final InterLayerPropagationGraph ipgBackup = new InterLayerPropagationGraph(downLayerInfoBackup.getFirst(), null, downLayerInfoBackup.getSecond(), false); final SortedSet<Link> linksPrimary = ipgPrimary.getLinksInGraph(); final SortedSet<Link> linksBackup = ipgBackup.getLinksInGraph(); final SortedSet<Link> linksPrimaryAndBackup = new TreeSet<> (Sets.intersection(linksPrimary, linksBackup)); final SortedSet<Link> linksOnlyPrimary = new TreeSet<> (Sets.difference(linksPrimary, linksPrimaryAndBackup)); final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(null, new TreeSet<> (Arrays.asList(pickedDemand.getCoupledLink())), null, true); DrawUtils.drawCollateralLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED);
private void addEdgeAddingNewVertexAndPropagatingIfNeeded (Link e , IPGNode edgeInitialNode , boolean propagateUpwards) { IPGNode ipgNode = link2IGPVertexMap.get(e); final boolean newlyCreatedIPG = (ipgNode == null); if (newlyCreatedIPG) { ipgNode = new IPGNode (null , e , null); link2IGPVertexMap.put(e , ipgNode); this.interLayerPropagationGraph.addVertex(ipgNode); } try { this.interLayerPropagationGraph.addDagEdge(edgeInitialNode , ipgNode , new Object ()); } catch (CycleFoundException ex) { throw new RuntimeException(ex.getMessage()); } if (newlyCreatedIPG) if (propagateUpwards) addVertexAndEdgesToGraphFromInitialIPGUpwards(ipgNode); else addVertexAndEdgesToGraphFromInitialIPGDownwards(ipgNode); } private void addEdgeAddingNewVertexAndPropagatingIfNeeded (Demand d , IPGNode edgeInitialNode , boolean propagateUpwards)
final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(downInfo.getFirst(), null, downInfo.getSecond(), false); DrawUtils.drawCollateralLinks(vs, ipg.getLinksInGraph(), pickedRoute.isBackupRoute() ? VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_BACKUP : VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, ipg.getLinksInGraph(), pickedRoute.isBackupRoute() ? VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_BACKUP : VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(null, new TreeSet<> (Arrays.asList(pickedRoute.getDemand().getCoupledLink())), null, true); DrawUtils.drawCollateralLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED);
private void addEdgeAddingNewVertexAndPropagatingIfNeeded (Demand d , IPGNode edgeInitialNode , boolean propagateUpwards) { IPGNode ipgNode = demand2IGPVertexMap.get(d); final boolean newlyCreatedIPG = (ipgNode == null); if (newlyCreatedIPG) { ipgNode = new IPGNode (d , null, null); demand2IGPVertexMap.put(d , ipgNode); this.interLayerPropagationGraph.addVertex(ipgNode); } try { this.interLayerPropagationGraph.addDagEdge(edgeInitialNode , ipgNode , new Object ()); } catch (CycleFoundException ex) { throw new RuntimeException(ex.getMessage()); } if (newlyCreatedIPG) if (propagateUpwards) addVertexAndEdgesToGraphFromInitialIPGUpwards(ipgNode); else addVertexAndEdgesToGraphFromInitialIPGDownwards(ipgNode); } private void addEdgeAddingNewVertexAndPropagatingIfNeeded (Pair<MulticastDemand,Node> m , IPGNode edgeInitialNode , boolean propagateUpwards)
final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(downInfo.getFirst(), null, downInfo.getSecond(), false); DrawUtils.drawCollateralLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(null, upperCoupledLink, null, true); DrawUtils.drawCollateralLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED);
for (IPGNode initialNode : this.initialIPGVertices) if (upWardsTrueDownwardsFalse) addVertexAndEdgesToGraphFromInitialIPGUpwards (initialNode); else addVertexAndEdgesToGraphFromInitialIPGDownwards (initialNode);
final InterLayerPropagationGraph ipgCausedByLink = new InterLayerPropagationGraph(downLayerInfo.getFirst(), null, downLayerInfo.getSecond(), false); final SortedSet<Link> frPropagationLinks = ipgCausedByLink.getLinksInGraph(); DrawUtils.drawCollateralLinks(vs, frPropagationLinks, VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, frPropagationLinks, VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); final InterLayerPropagationGraph ipgCausedByDemand = new InterLayerPropagationGraph(null, new TreeSet<> (Arrays.asList(pickedDemand.getCoupledLink())), null, true); final SortedSet<Link> frPropagationLinks = ipgCausedByDemand.getLinksInGraph(); DrawUtils.drawCollateralLinks(vs, frPropagationLinks, VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, frPropagationLinks, VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED);
linksThisLayer = pickedDemand.getLinksNoDownPropagationPotentiallyCarryingTraffic(egressNode); final Pair<SortedSet<Demand>, SortedSet<Pair<MulticastDemand, Node>>> downLayerInfo = DrawUtils.getDownCoupling(linksThisLayer); final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(downLayerInfo.getFirst(), null, downLayerInfo.getSecond(), false); final SortedSet<Link> linksLowerLayers = ipg.getLinksInGraph(); DrawUtils.drawCollateralLinks(vs, linksLowerLayers, VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, linksLowerLayers, VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); final InterLayerPropagationGraph ipg = new InterLayerPropagationGraph(null, upCoupledLink, null, true); DrawUtils.drawCollateralLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED); DrawUtils.drawDownPropagationInterLayerLinks(vs, ipg.getLinksInGraph(), VisualizationConstants.DEFAULT_REGGUILINK_EDGECOLOR_PICKED);