/** * <p>Returns the set of forwarding rules of links initiated in the node of the given layer, * which have a non-zero splitting factor. If no layer is provided, the default layer is assumed.</p> * @param optionalLayerParameter Network layer (optional) * @return The map associating the demand-link pair, with the associated splitting factor */ public SortedMap<Pair<Demand,Link>,Double> getForwardingRules (NetworkLayer ... optionalLayerParameter) { checkAttachedToNetPlanObject(); NetworkLayer layer = netPlan.checkInThisNetPlanOptionalLayerParameter(optionalLayerParameter); SortedMap<Pair<Demand,Link>,Double> res = new TreeMap<Pair<Demand,Link>,Double> (); for (Link e : getOutgoingLinks(layer)) for (Entry<Demand,Double> entry : e.cacheHbH_frs.entrySet()) res.put(Pair.of(entry.getKey(), e), entry.getValue()); return res; }
res.add(new AjtColumnInfo<Node>(this , Collection.class, null , "SRGs", "The SRGs that this node belongs to", null , d->d.getSRGs() , AGTYPE.NOAGGREGATION , null)); res.add(new AjtColumnInfo<Node>(this , Collection.class, null , "Resources", "The resources hosted in this node", null , d->d.getResources() , AGTYPE.SUMCOLLECTIONCOUNT , null)); res.add(new AjtColumnInfo<Node>(this , Collection.class, null , "Out links", "The outgoing links of the node", null , d->d.getOutgoingLinks(layer) , AGTYPE.SUMCOLLECTIONCOUNT , null)); res.add(new AjtColumnInfo<Node>(this , Collection.class, null , "In links", "The incoming links of the node", null , d->d.getIncomingLinks(layer) , AGTYPE.SUMCOLLECTIONCOUNT , null)); res.add(new AjtColumnInfo<Node>(this , Double.class, null , "Out capacity (" + layer.getLinkCapacityUnits() + ")", "The sum of the capacity of the outgoing links", null , d->d.getOutgoingLinksCapacity(layer) , AGTYPE.SUMDOUBLE , null));
/** Returns true has at least one link, or demand, or multicast demand at the given layer associated to it. * @param layer Network layer * @return see above */ public boolean isWorkingAtLayer(NetworkLayer layer) { if (!getOutgoingLinks(layer).isEmpty()) return true; if (!getIncomingLinks(layer).isEmpty()) return true; if (!getOutgoingDemands(layer).isEmpty()) return true; if (!getIncomingDemands(layer).isEmpty()) return true; if (!getOutgoingMulticastDemands(layer).isEmpty()) return true; if (!getIncomingMulticastDemands(layer).isEmpty()) return true; return false; }
/** * <p>Returns the set of forwarding rules of links initiated in the node and associated to the given demand (the links are then in the same layer * as the demand), that have a non-zero splitting factor</p> * @param demand The demand * @return The map associating the demand-link pair, with the associated splitting factor */ public SortedMap<Pair<Demand,Link>,Double> getForwardingRules (Demand demand) { NetworkLayer layer = demand.layer; layer.checkAttachedToNetPlanObject(netPlan); demand.checkRoutingType(RoutingType.HOP_BY_HOP_ROUTING); SortedMap<Pair<Demand,Link>,Double> res = new TreeMap<Pair<Demand,Link>,Double> (); for (Link e : getOutgoingLinks(layer)) { final Double splitFactor = demand.cacheHbH_frs.get(e); if (splitFactor != null) res.put (Pair.of(demand, e) , splitFactor); } return res; }
public boolean isVisibleInCanvas(GUINode gn) { final Node n = gn.getAssociatedNode(); if (nodesToHideInCanvasAsMandatedByUserInTable.contains(n)) return false; if (!showInCanvasNonConnectedNodes) { final NetworkLayer layer = gn.getLayer(); if (n.getOutgoingLinks(layer).isEmpty() && n.getIncomingLinks(layer).isEmpty() && n.getOutgoingDemands(layer).isEmpty() && n.getIncomingDemands(layer).isEmpty() && n.getOutgoingMulticastDemands(layer).isEmpty() && n.getIncomingMulticastDemands(layer).isEmpty()) return false; } return true; }
/** Returns the set of outgoing fibers of the node * @return see above */ public SortedSet<WFiber> getOutgoingFibers () { return n.getOutgoingLinks(getNet().getWdmLayer().getNe()).stream().map(ee->new WFiber(ee)).collect(Collectors.toCollection(TreeSet::new)); } /** Returns the set of incoming fibers to the node
public static boolean isGravityModelApplicableWithLinkMonitoringInfo (NetworkLayer layer , Date date) { final NetPlan np = layer.getNetPlan(); final List<Link> links = np.getLinks(layer); final List<Demand> demands = np.getDemands(layer); if (links.isEmpty()) return false; if (np.hasMulticastDemands(layer)) return false; final SortedSet<Node> demandEndNodes = demands.stream().map(d->d.getEndNodes()).flatMap(d->d.stream()).collect(Collectors.toCollection(TreeSet::new)); final SortedSet<Link> linksWeNeedToHaveFullInOutInfo = new TreeSet<> (); if (demands.stream().map(d->d.getIngressNode()).anyMatch(n->n.getOutgoingLinks(layer).isEmpty())) return false; if (demands.stream().map(d->d.getEgressNode()).anyMatch(n->n.getIncomingLinks(layer).isEmpty())) return false; demandEndNodes.forEach(n->linksWeNeedToHaveFullInOutInfo.addAll(n.getOutgoingLinks(layer))); demandEndNodes.forEach(n->linksWeNeedToHaveFullInOutInfo.addAll(n.getIncomingLinks(layer))); return linksWeNeedToHaveFullInOutInfo.stream().allMatch(ee->ee.getMonitoredOrForecastedCarriedTraffic().hasValue (date)); } public static SortedSet<Date> getDatesWhereGravityModelCanBeApplied (NetworkLayer layer)
/** Returns the set of outgoing IP links of the node * @return see above */ public SortedSet<WIpLink> getOutgoingIpLinks () { return n.getOutgoingLinks(getNet().getIpLayer().getNe()).stream().map(ee->new WIpLink(ee)).filter(e->!e.isVirtualLink()).collect(Collectors.toCollection(TreeSet::new)); } /** Returns the set of incoming IP links to the node
public static SortedSet<Date> getDatesWhereGravityModelCanBeApplied (NetworkLayer layer) { final NetPlan np = layer.getNetPlan(); final List<Link> links = np.getLinks(layer); final List<Demand> demands = np.getDemands(layer); if (links.isEmpty()) return new TreeSet<> (); if (np.hasMulticastDemands(layer)) return new TreeSet<> (); final SortedSet<Node> demandEndNodes = demands.stream().map(d->d.getEndNodes()).flatMap(d->d.stream()).collect(Collectors.toCollection(TreeSet::new)); final SortedSet<Link> linksWeNeedToHaveFullInOutInfo = new TreeSet<> (); if (demands.stream().map(d->d.getIngressNode()).anyMatch(n->n.getOutgoingLinks(layer).isEmpty())) return new TreeSet<> (); if (demands.stream().map(d->d.getEgressNode()).anyMatch(n->n.getIncomingLinks(layer).isEmpty())) return new TreeSet<> (); demandEndNodes.forEach(n->linksWeNeedToHaveFullInOutInfo.addAll(n.getOutgoingLinks(layer))); demandEndNodes.forEach(n->linksWeNeedToHaveFullInOutInfo.addAll(n.getIncomingLinks(layer))); final SortedSet<Date> datesWithEnoughInformationFromGM = new TreeSet<> (); for (Date dateFirstLink : linksWeNeedToHaveFullInOutInfo.first().getMonitoredOrForecastedCarriedTraffic().getDatesWithValue()) if (linksWeNeedToHaveFullInOutInfo.stream().allMatch(ee->ee.getMonitoredOrForecastedCarriedTraffic().hasValue (dateFirstLink))) datesWithEnoughInformationFromGM.add(dateFirstLink); return datesWithEnoughInformationFromGM; } public static SortedMap<Demand,Double> getGravityModelEstimationFromMonitorTraffic (NetworkLayer layer , Date date)
private void checkSolution (NetPlan netPlan) { for (Link e : netPlan.getLinks ()) { final double pThisLink = Double.parseDouble(e.getAttribute("p_e")); if (pThisLink < minLinkPersistenceProb.getDouble() - 1E-3) throw new RuntimeException ("Bad"); } for (Node n : netPlan.getNodes ()) { final double qThisNode = Double.parseDouble(n.getAttribute("q_n")); if (qThisNode < 0) throw new RuntimeException ("Bad"); if (qThisNode > maxNodePersistenceProb.getDouble() +1E-3) throw new RuntimeException ("Bad"); double peAccum = 0; for (Link e : n.getOutgoingLinks()) peAccum += Double.parseDouble(e.getAttribute("p_e")); if (Math.abs(peAccum - qThisNode) > 1E-3) throw new RuntimeException ("Bad"); } } }
private TBFToFromCarriedTraffic(Node node, NetworkLayer layer, boolean onlyThisLayer) { super(node.getNetPlan()); this.initialElement = node; this.onlyThisLayer = onlyThisLayer; this.initialFR = null; this.auxLayerInNodes = layer; final Set<Link> linksAllLayers = new HashSet<>(); final Set<Demand> demandsAllLayers = new HashSet<>(); final Set<MulticastDemand> mDemandsAllLayers = new HashSet<>(); demandsAllLayers.addAll(node.getIncomingDemands(layer)); demandsAllLayers.addAll(node.getOutgoingDemands(layer)); linksAllLayers.addAll(node.getIncomingLinks(layer)); linksAllLayers.addAll(node.getOutgoingLinks(layer)); mDemandsAllLayers.addAll(node.getIncomingMulticastDemands(layer)); mDemandsAllLayers.addAll(node.getOutgoingMulticastDemands(layer)); if (!onlyThisLayer) updatePropagationDownWards(linksAllLayers, linksAllLayers, demandsAllLayers, mDemandsAllLayers); if (!onlyThisLayer) updatePropagationUpWards(demandsAllLayers, mDemandsAllLayers, linksAllLayers, demandsAllLayers, mDemandsAllLayers); final Set<NetworkLayer> layersToKeepAllElements = onlyThisLayer ? Sets.difference(new HashSet<>(netPlan.getNetworkLayers()), Sets.newHashSet(layer)) : new HashSet<>(); updateAllButLinksDemandsMDemandsUsingExistingInfo(linksAllLayers, demandsAllLayers, mDemandsAllLayers, layersToKeepAllElements); }
private Pair<List<Node>, Set<Demand>> computeFilteringNodesAndDemands() { final NetPlan np = networkViewer.getDesign(); final List<Node> filteredNodes = new ArrayList<>(np.getNumberOfNodes()); final String filteringNodeTag = this.cmb_tagNodesSelector.getSelectedItem() == DEFAULT_TAG_FILTER ? null : (String) this.cmb_tagNodesSelector.getSelectedItem(); final String filteringDemandTag = this.cmb_tagDemandsSelector.getSelectedItem() == DEFAULT_TAG_FILTER ? null : (String) this.cmb_tagDemandsSelector.getSelectedItem(); for (Node n : np.getNodes()) { if (filteringNodeTag != null) if (!n.hasTag(filteringNodeTag)) continue; if (this.cb_filterLinklessNodes.isSelected()) if (n.getOutgoingLinks(layerThisTable).isEmpty() && n.getIncomingLinks(layerThisTable).isEmpty()) continue; filteredNodes.add(n); } Set<Demand> filteredDemands; if (filteringDemandTag == null) { filteredDemands = new HashSet<>(np.getDemands(layerThisTable)); } else { filteredDemands = new HashSet<>(); for (Demand d : np.getDemands(layerThisTable)) if (d.hasTag(filteringDemandTag)) filteredDemands.add(d); } return Pair.of(filteredNodes, filteredDemands); }
final String trafUnits = np.getDemandTrafficUnitsName(layer); final double inLinkOccup = npNode.getIncomingLinks(layer).stream().mapToDouble(e -> e.getOccupiedCapacity()).sum(); final double outLinkOccup = npNode.getOutgoingLinks(layer).stream().mapToDouble(e -> e.getOccupiedCapacity()).sum(); final double inLinkCapacity = npNode.getIncomingLinks(layer).stream().mapToDouble(e -> e.getCapacity()).sum(); final double outLinkCapacity = npNode.getOutgoingLinks(layer).stream().mapToDouble(e -> e.getCapacity()).sum(); final double inOfferedUnicast = npNode.getIncomingDemands(layer).stream().mapToDouble(e -> e.getOfferedTraffic()).sum(); final double outOfferedUnicast = npNode.getOutgoingDemands(layer).stream().mapToDouble(e -> e.getOfferedTraffic()).sum();
private List<Triple<String,String,String>> getNodeInfoTables (Node n , NetworkLayer layer) { final DecimalFormat df = new DecimalFormat("###.##"); final NetPlan np = n.getNetPlan(); final List<Triple<String,String,String>> res = new ArrayList <> (); final String trafUnits = np.getDemandTrafficUnitsName(layer); res.add(Triple.of("Node index/id" , "Node " + n.getIndex() + " (id " + n.getId() + ")", "node" + n.getId())); res.add(Triple.of("Name" , n.getName().equals("")? "No name" : n.getName(), "")); res.add(Triple.of("Site", (n.getSiteName() != null) ? n.getSiteName() : "undefined","")); res.add(Triple.of("Coordinates (x,y)" , "(" + n.getXYPositionMap().getX() + "," + n.getXYPositionMap().getY() + ")" , "")); res.add(Triple.of("Is up?", "" + n.isUp() , "")); res.add(Triple.of("# Resources" , n.getResources().isEmpty() ? "none" : ""+n.getResources().size() , "")); for (Resource r : n.getResources()) res.add(Triple.of("- " + getResourceName(r) , "" , "resource" + r.getId())); res.add(Triple.of("Information at layer" , getLayerName(layer) , "")); res.add(Triple.of("# output links", "" + n.getOutgoingLinks(layer).size() , "")); res.add(Triple.of("# input links" , "" + n.getIncomingLinks(layer).size() , "")); res.add(Triple.of("Output traffic" , "" + df.format(n.getOutgoingLinks(layer).stream().mapToDouble(e->e.getCarriedTraffic()).sum()) + " " + trafUnits , "")); res.add(Triple.of("Input traffic" , df.format(n.getIncomingLinks(layer).stream().mapToDouble(e->e.getCarriedTraffic()).sum()) + " " + trafUnits , "")); res.add(Triple.of("# SRGs" , n.getSRGs().isEmpty() ? "none" : ""+n.getSRGs().size() , "")); for (SharedRiskGroup srg : n.getSRGs()) res.add(Triple.of("- Sh. risk group index/id" , "" + srg.getIndex() + " (id " + srg.getId() + ")" , "srg" + srg.getId())); return res; } private List<Triple<String,String,String>> getResourceInfoTables (Resource r)
private void checkCapacitiesNetPlan () { double [] p_e = new double [E]; for (Link e : currentNetPlan.getLinks ()) { p_e [e.getIndex ()] = Double.parseDouble (e.getAttribute("p_e")); if ((p_e [e.getIndex ()] < control_minLinkPersistenceProb.getDouble() - 1E-3) ||(p_e [e.getIndex ()] > 1E-3 + control_maxNodePersistenceProb.getDouble())) throw new RuntimeException ("Bad"); } double [] q_n = new double [N]; for (Node n : currentNetPlan.getNodes ()) { for (Link e : n.getOutgoingLinks()) q_n [n.getIndex ()] += p_e [e.getIndex ()]; if (Math.abs (q_n [n.getIndex ()] - Double.parseDouble (n.getAttribute("q_n"))) > 1E-3) throw new RuntimeException ("Bad"); if (q_n [n.getIndex ()] > control_maxNodePersistenceProb.getDouble() + 1E-3) throw new RuntimeException ("Bad"); } for (Link e : currentNetPlan.getLinks ()) { final double u_e = e.getCapacity(); double supposedCapacity = control_linkNominalCapacities.get(e.getIndex ()) * control_p_e.get (e.getIndex ()); for (Node n : control_nodesInterfTo_e.get(e)) supposedCapacity *= 1 - q_n [n.getIndex ()]; if (Math.abs (u_e - supposedCapacity) > 1e-3) throw new RuntimeException ("Bad"); } }
@Override public void itemStateChanged(ItemEvent e) { linkSelector.removeAllItems(); Object selectedItem_Node = nodeSelector.getSelectedItem(); if(selectedItem_Node == null) return; final long nodeId = (long) ((StringLabeller) selectedItem_Node).getObject(); final Node node = netPlan.getNodeFromId(nodeId); for (Link link : node.getOutgoingLinks(layer)) { String originNodeLabel = "Node " + link.getOriginNode().getId(); if (!link.getOriginNode().getName().isEmpty()) originNodeLabel += " (" + link.getOriginNode().getName() + ")"; String destinationNodeLabel = "Node " + link.getDestinationNode().getId(); if (!link.getDestinationNode().getName().isEmpty()) destinationNodeLabel += " (" + link.getDestinationNode().getName() + ")"; String linkLabel = "e" + link.getId() + ": " + originNodeLabel + " -> " + destinationNodeLabel; linkSelector.addItem(StringLabeller.of(link.getId(), linkLabel)); } if(linkSelector.getItemCount() == 0) linkSelector.setSelectedIndex(-1); else linkSelector.setSelectedIndex(0); } };
private Quadruple<Double,Double,Double,Double> computeCost (NetPlan np) { double costLinks = 0; for (Link e : np.getLinks ()) costLinks += linkCost_e.get(e.getIndex ()) * e.getCapacity() / (tcfa_linkCapacity_numCirc.getInt () * tcfa_circuitCapacity_Gbps.getDouble ()); double costCircuits = 0; for (Route r : np.getRoutes ()) // sums both lps and 1+1 if there are any { final double lineRate = r.isBackupRoute()? r.getRoutesIAmBackup().iterator().next().getCarriedTrafficInNoFailureState() : r.getCarriedTrafficInNoFailureState(); costCircuits += tcfa_circuitCost.getDouble () * (lineRate / tcfa_circuitCapacity_Gbps.getDouble ()); } double costNodes = 0; for (Node n : np.getNodes()) { final int nodeDegree = (int) Math.max(n.getOutgoingLinks().size(), n.getIncomingLinks().size()); costNodes += (nodeDegree <= 2)? tcfa_costNodeDegree2.getDouble () : tcfa_costNodeDegreeHigherThan2.getDouble (); } final double totalCost = costLinks+ costCircuits + costNodes; System.out.println("Total cost: " + totalCost + ", links %: " + (costLinks/totalCost) + ", circ %: " + (costCircuits/totalCost) + ", nodes %: " + (costNodes/totalCost)); System.out.println("-- From np cost total :" + totalCost + ", links: " + costLinks + ", nodes: " + costNodes + ", circ: " + costCircuits); return Quadruple.of(totalCost,costLinks,costNodes,costCircuits); }
public static SortedMap<Demand,Double> getGravityModelEstimationFromCurrentCarriedTraffic (NetworkLayer layer) { final NetPlan np = layer.getNetPlan(); final int N = np.getNumberOfNodes(); final double [] ingressTrafficPerNode = new double [N]; final double [] egressTrafficPerNode = new double [N]; for (Node n : np.getNodes()) { ingressTrafficPerNode [n.getIndex()] = n.getIncomingLinks(layer).stream().mapToDouble(e->e.getCarriedTraffic()).sum(); egressTrafficPerNode [n.getIndex()] = n.getOutgoingLinks(layer).stream().mapToDouble(e->e.getCarriedTraffic()).sum(); } final DoubleMatrix2D tm = TrafficMatrixGenerationModels.gravityModel(ingressTrafficPerNode, egressTrafficPerNode); final SortedMap<Demand,Double> res = new TreeMap<> (); for (Node n1 : np.getNodes()) for (Node n2 : np.getNodes()) { if (n1 == n2) continue; final SortedSet<Demand> nodePairDemands = np.getNodePairDemands(n1, n2, false, layer); final double traf = tm.get(n1.getIndex(), n2.getIndex()); nodePairDemands.forEach(d->res.put(d, traf / nodePairDemands.size())); } return res; }
public static SortedMap<Demand,Double> getGravityModelEstimationFromMonitorTraffic (NetworkLayer layer , Date date) { if (!isGravityModelApplicableWithLinkMonitoringInfo(layer, date)) throw new Net2PlanException ("Gravity model not applicable"); final NetPlan np = layer.getNetPlan(); final List<Link> links = np.getLinks(layer); final List<Demand> demands = np.getDemands(layer); final int N = np.getNumberOfNodes(); final double [] ingressTrafficPerNode = new double [N]; final double [] egressTrafficPerNode = new double [N]; for (Node n : np.getNodes()) { ingressTrafficPerNode [n.getIndex()] = n.getIncomingLinks(layer).stream().mapToDouble(e->e.getMonitoredOrForecastedCarriedTraffic().getValueOrNull(date)).sum(); egressTrafficPerNode [n.getIndex()] = n.getOutgoingLinks(layer).stream().mapToDouble(e->e.getMonitoredOrForecastedCarriedTraffic().getValueOrNull(date)).sum(); } final DoubleMatrix2D tm = TrafficMatrixGenerationModels.gravityModel(ingressTrafficPerNode, egressTrafficPerNode); final SortedMap<Demand,Double> res = new TreeMap<> (); for (Node n1 : np.getNodes()) for (Node n2 : np.getNodes()) { if (n1 == n2) continue; final SortedSet<Demand> nodePairDemands = np.getNodePairDemands(n1, n2, false, layer); final double traf = tm.get(n1.getIndex(), n2.getIndex()); nodePairDemands.forEach(d->res.put(d, traf / nodePairDemands.size())); } return res; }
private void applyVisualizationPickNode(List<Node> pickedNodes , NetworkLayer layer) { if (layer == null) layer = callback.getDesign().getNetworkLayerDefault(); for (Node pickedNode : pickedNodes) { for (GUINode gn : vs.getCanvasVerticallyStackedGUINodes(pickedNode)) { if (!gn.getLayer().equals(layer)) continue; gn.setBorderPaint(VisualizationConstants.DEFAULT_GUINODE_COLOR_PICK); gn.setFillPaint(VisualizationConstants.DEFAULT_GUINODE_COLOR_PICK); } for (Link e : Sets.union(pickedNode.getOutgoingLinks(layer), pickedNode.getIncomingLinks(layer))) { final GUILink gl = vs.getCanvasAssociatedGUILink(e); gl.setShownSeparated(true); gl.setHasArrow(true); } } }