WServiceChain(Route r) { super (r); this.r = r; assert r.getLayer().getIndex() == 1; }
/** Returns the set of routes in the given layer with the given tag. If no layer is provided, the defaulf layer is assumed. * @param tag the tag * @param optionalLayerParameter the layer (optional) * @return the set (or an empty set if there are no elements to return) */ public SortedSet<Route> getTaggedRoutes (String tag , NetworkLayer... optionalLayerParameter) { final NetworkLayer layer = checkInThisNetPlanOptionalLayerParameter(optionalLayerParameter); final SortedSet<NetworkElement> el = cache_taggedElements.get (tag); if (el == null) return new TreeSet<> (); return el.stream ().filter (e->e instanceof Route).map(e->(Route) e).filter(e->e.getLayer().equals(layer)).collect (Collectors.toCollection(TreeSet::new)); } /** Returns the set of SRGs with the given tag.
private TBFToFromCarriedTraffic(Route route, boolean onlyThisLayer) { super(route.getNetPlan()); this.initialElement = route; this.onlyThisLayer = onlyThisLayer; this.initialFR = null; this.auxLayerInNodes = null; final Set<Link> linksAllLayers = new HashSet<>(); final Set<Demand> demandsAllLayers = new HashSet<>(); final Set<MulticastDemand> mDemandsAllLayers = new HashSet<>(); demandsAllLayers.add(route.getDemand()); linksAllLayers.addAll(route.getSeqLinks()); 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(route.getLayer())) : new HashSet<>(); updateAllButLinksDemandsMDemandsUsingExistingInfo(linksAllLayers, demandsAllLayers, mDemandsAllLayers, layersToKeepAllElements); }
private TBFToFromCarriedTraffic(Resource resource, NetworkLayer layer, boolean onlyThisLayer) { super(resource.getNetPlan()); this.initialElement = resource; 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<>(); // if the resource is not used => does not appear anywhere for (Route r : resource.getTraversingRoutes()) { if (r.getLayer() != layer) continue; linksAllLayers.addAll(r.getSeqLinks()); demandsAllLayers.add(r.getDemand()); } 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); if (!this.vResources.get(layer).contains(resource)) this.vResources.get(layer).add(resource); // add the resource if not there }
@Override public List<AjtColumnInfo<Resource>> getNonBasicUserDefinedColumnsVisibleOrNot() { final NetworkLayer layer = this.getTableNetworkLayer(); final List<AjtColumnInfo<Resource>> res = new LinkedList<> (); res.add(new AjtColumnInfo<Resource>(this , String.class, null , "Name", "Resource name", (d,val)->d.setName((String) val), d->d.getName() , AGTYPE.NOAGGREGATION , null)); res.add(new AjtColumnInfo<Resource>(this , String.class, null , "Type", "Resource type", null , d->d.getType() , AGTYPE.NOAGGREGATION , null)); res.add(new AjtColumnInfo<Resource>(this , Boolean.class, null , "Up?", "If the resource is up or down (just the state of its hosting node)", null , d->d.iAttachedToANode()? d.getHostNode().get().isUp() : true , AGTYPE.COUNTTRUE , r->!r.iAttachedToANode()? null : r.getHostNode().get().isDown()? Color.RED : null)); res.add(new AjtColumnInfo<Resource>(this , Node.class, null , "Host node", "The node hosting this resource", null , d->d.getHostNode().isPresent() ? d.getHostNode().get() : "Unattached" , AGTYPE.NOAGGREGATION , null)); res.add(new AjtColumnInfo<Resource>(this , Double.class, null , "Capacity", "The current capacity of the resource", null , d->d.getCapacity() , AGTYPE.NOAGGREGATION , null)); res.add(new AjtColumnInfo<Resource>(this , Double.class, null , "Occupied capacity", "The current occupied capacity of the resource", null , d->d.getOccupiedCapacity() , AGTYPE.NOAGGREGATION , null)); res.add(new AjtColumnInfo<Resource>(this , Double.class, null , "Utilization", "The current utilization of the resource", null , d->d.getUtilization() , AGTYPE.NOAGGREGATION , d-> { final double u = d.getUtilization(); if (u == 1) return Color.YELLOW; return u > 1? Color.RED : null; } )); res.add(new AjtColumnInfo<Resource>(this , String.class, null , "Cap. Units", "The units in which the resource capacity is measured", (d,val)->d.setCapacityMeasurementUnits((String)val) , d->d.getCapacityMeasurementUnits() , AGTYPE.NOAGGREGATION , null)); res.add(new AjtColumnInfo<Resource>(this , String.class, null , "Base resources", "The base resources that this resource relies on, and the amount of capacity consumed in each base resource", null , d->d.getCapacityOccupiedInBaseResourcesMap().entrySet().stream().map(ee->"(" + ee.getKey().getType() + "," + ee.getValue()+")").collect(Collectors.joining(",")) , AGTYPE.NOAGGREGATION , null)); res.add(new AjtColumnInfo<Resource>(this , String.class, null , "Upper resources", "The upper resources that rely on me, and the amount of capacity each one is occupying in me", null , d->d.getCapacityOccupiedByUpperResourcesMap().entrySet().stream().map(ee->"(" + ee.getKey().getType() + "," + ee.getValue()+")").collect(Collectors.joining(",")) , AGTYPE.NOAGGREGATION , null)); res.add(new AjtColumnInfo<Resource>(this , Collection.class, null , "Trav. routes", "The routes in this layer that traverse this resource", null , d->d.getTraversingRoutes().stream().filter(r->r.getLayer().equals(layer)).collect(Collectors.toList()) , AGTYPE.SUMCOLLECTIONCOUNT , null)); res.add(new AjtColumnInfo<Resource>(this , Double.class, null , "Processing time (ms)", "The processing time associated to added as delay to all the traffic units traversing this resource", (d,val)->d.setProcessingTimeToTraversingTrafficInMs((Double) val) , d->d.getProcessingTimeToTraversingTrafficInMs() , AGTYPE.MAXDOUBLE , null)); return res; }
private List<Triple<String,String,String>> getRouteInfoTables (Route r) { final DecimalFormat df = new DecimalFormat("###.##"); final NetPlan np = r.getNetPlan(); final List<Triple<String,String,String>> res = new ArrayList <> (); res.add(Triple.of("Route index/id" , "Route " + r.getIndex() + " (id " + r.getId() + ")", "route" + r.getId())); res.add(Triple.of("Layer" , "" + getLayerName(r.getLayer()) , "layer" + r.getLayer().getId())); res.add(Triple.of("Route demand index/id" , "" + r.getDemand().getIndex() + " (id " + r.getDemand().getId() + ")" , "demand" + r.getDemand().getId())); res.add(Triple.of("Demand offered traffic" , "" + df.format(r.getDemand().getOfferedTraffic()) + " " + np.getDemandTrafficUnitsName(r.getLayer()) , "")); res.add(Triple.of("Demand carried traffic" , "" + df.format(r.getDemand().getCarriedTraffic()) + " " + np.getDemandTrafficUnitsName(r.getLayer()) , "")); res.add(Triple.of("Route carried traffic" , "" + df.format(r.getCarriedTraffic()) + " " + np.getDemandTrafficUnitsName(r.getLayer()), "")); res.add(Triple.of("Is up?" , "" + np.isUp(r.getPath()), "")); res.add(Triple.of("Worst link utilization" , "" + df.format(r.getSeqLinks().stream().mapToDouble(e->e.getUtilization()).max().orElse(0)), "")); if (r.isServiceChain()) res.add(Triple.of("Worst resource utilization" , "" + df.format(r.getSeqResourcesTraversed().stream().mapToDouble(e->e.getUtilization()).max().orElse(0)), "")); res.add(Triple.of("Is service chain?" , "" + r.getDemand().isServiceChainRequest(), "")); res.add(Triple.of("Route length (km)" , "" + df.format(r.getLengthInKm()) + " km", "")); res.add(Triple.of("Route length (ms)" , "" + df.format(r.getPropagationDelayInMiliseconds()) + " ms", "")); res.add(Triple.of("Is backup route?" , "" + r.isBackupRoute(), "")); for (Route pr : r.getRoutesIAmBackup()) res.add(Triple.of("-- Primary route" , "Route " + pr.getIndex() , "route" + pr.getId())); res.add(Triple.of("Has backup routes?" , "" + r.hasBackupRoutes(), "")); for (Route br : r.getBackupRoutes()) res.add(Triple.of("-- Backup route" , "Route " + br.getIndex() , "route" + br.getId())); return res; } private List<Triple<String,String,String>> getMulticastTreeInfoTables (MulticastTree t)
private List<Triple<String,String,String>> getResourceInfoTables (Resource r) { final DecimalFormat df = new DecimalFormat("###.##"); final NetPlan np = r.getNetPlan(); final List<Triple<String,String,String>> res = new ArrayList <> (); final String resCapUnits = r.getCapacityMeasurementUnits(); res.add(Triple.of("Resource index/id" , "Resource " + r.getIndex() + " (id " + r.getId() + ")", "resource" + r.getId())); res.add(Triple.of("Name" , r.getName().equals("")? "No name" : r.getName(), "")); res.add(Triple.of("Type" , r.getType() , "")); res.add(Triple.of("Host node" , r.iAttachedToANode()? getNodeName(r.getHostNode().get()) : "---" , "")); res.add(Triple.of("Capacity occupied / total" , df.format(r.getOccupiedCapacity()) + " / " + df.format(r.getCapacity()) + " " + resCapUnits , "")); res.add(Triple.of("Processing time" , df.format(r.getProcessingTimeToTraversingTrafficInMs()) + " ms", "")); res.add(Triple.of("Is up?", "" + (r.iAttachedToANode()? r.getHostNode().get().isUp() : true) , "")); res.add(Triple.of("# base resources", "" + r.getBaseResources().size() , "")); for (Resource br : r.getBaseResources()) res.add(Triple.of(getResourceName(br) + " (" + br.getType() + ")" , "Occup: " + df.format(r.getCapacityOccupiedInBaseResource(br)) + " " + br.getCapacityMeasurementUnits() , "resource" + br.getId())); res.add(Triple.of("# upper resources", "" + r.getUpperResources().size() , "")); for (Resource ur : r.getUpperResources()) res.add(Triple.of(getResourceName(ur) + " (" + ur.getType() + ")" , "Occup: " + df.format(r.getCapacityOccupiedByUpperResource(ur)) + " " + resCapUnits , "resource" + ur.getId())); res.add(Triple.of("# Traversing routes", "" + r.getTraversingRoutes().size() , "")); for (Route route : r.getTraversingRoutes()) res.add(Triple.of("- Route " + route.getIndex() + " (" + getLayerName(route.getLayer()) + ")", "Occup: " + df.format(r.getTraversingRouteOccupiedCapacity(route)) + " " + resCapUnits + r.getTraversingRoutes().size() , "route" + route.getId())); return res; } private List<Triple<String,String,String>> getSRGInfoTables (SharedRiskGroup srg)
/** Given a path-based routing, returns the amount of traffic for each demand d traversing each link e. The link * occupation information is not used, only the route carried traffic (recall that a route carried traffic is zero if * it traverses a failed link/node) * @param E Number of links * @param D Number of demands * @param routes List of routes * @return Demand-link routing in the form x_de (amount of traffic from demand d, transmitted through link e) */ public static DoubleMatrix2D convert_xp2xde(int D , int E , List<Route> routes) { DoubleMatrix2D x_de = DoubleFactory2D.sparse.make(D, E, 0); if (routes.isEmpty()) return x_de; final NetworkLayer layer = routes.iterator().next().getLayer(); if (E != layer.getNetPlan().getNumberOfLinks(layer)) throw new Net2PlanException ("Wrong format"); if (D != layer.getNetPlan().getNumberOfDemands(layer)) throw new Net2PlanException ("Wrong format"); for (Route route : routes) { final int d = route.getDemand().getIndex(); for (Link link : route.getSeqLinks()) { final int e = link.getIndex(); x_de.setQuick(d, e, x_de.getQuick(d, e) + route.getCarriedTraffic()); } } return x_de; }
final boolean isRouteLayerVisibleInTheCanvas = vs.isLayerVisibleInCanvas(pickedRoute.getLayer()); if (vs.isShowInCanvasThisLayerPropagation() && isRouteLayerVisibleInTheCanvas) final GUINode gnOrigin = vs.getCanvasAssociatedGUINode(pickedRoute.getIngressNode(), pickedRoute.getLayer()); final GUINode gnDestination = vs.getCanvasAssociatedGUINode(pickedRoute.getEgressNode(), pickedRoute.getLayer()); gnOrigin.setBorderPaint(VisualizationConstants.DEFAULT_GUINODE_COLOR_ORIGINFLOW); gnOrigin.setFillPaint(VisualizationConstants.DEFAULT_GUINODE_COLOR_ORIGINFLOW);
public NetworkLayer getOrEstimateLayer () { if (ne == null && fr == null) return null; if (isFr()) return fr.getFirst().getLayer(); switch (ne.getNeType()) { case DEMAND: return ((Demand) ne).getLayer(); case LAYER: return (NetworkLayer) ne; case LINK: return ((Link) ne).getLayer(); case MULTICAST_DEMAND: return ((MulticastDemand) ne).getLayer(); case MULTICAST_TREE: return ((MulticastTree) ne).getLayer(); case NETWORK: return ((NetPlan) ne).getNetworkLayerDefault(); case NODE: return ne.getNetPlan().getNetworkLayerDefault(); case RESOURCE: return ne.getNetPlan().getNetworkLayerDefault(); case ROUTE: return ((Route) ne).getLayer(); case SRG: return ne.getNetPlan().getNetworkLayerDefault(); default: throw new Net2PlanException (); } } }
final FigureLinkSequencePanel fig = new FigureLinkSequencePanel(callback , r.getPath() , r.getLayer() , r.getSeqOccupiedCapacitiesIfNotFailing(), r.getCarriedTraffic(), "Route " + r.getIndex() ); this.add(fig , BorderLayout.WEST); this.add(createPanelInfo(getRouteInfoTables(r), r) , BorderLayout.CENTER);