vector_Ck.set(r.getIndex() , sumCa); out.append("<td>" + r.getIndex() + "</td>"); out.append("<td>" + r.getIngressNode().getName() + "</td>"); out.append("<td>" + r.getEgressNode().getName() + "</td>"); double sumC0a = 0; for (Link a : r.getSeqLinks()) sumC0a += vector_C0a.get(a.getIndex()); double worstUtilization = 0; for (Link a : r.getSeqLinks()) worstUtilization = Math.max(worstUtilization , a.getUtilization()); out.append("<td>" + df_6.format(vector_Ck.get(r.getIndex())) + "</td>"); out.append("<td>" + df_6.format(sumC0a) + "</td>"); out.append("<td>" + df_6.format(worstUtilization) + "</td>");
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)
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 void updateDemandRoutingFromWeightsKnown (Demand d) { final Node a_d = d.getIngressNode(); final double h_d = d.getOfferedTraffic(); final DoubleMatrix1D weightsKnown_e = this.routing_mostUpdatedLinkPriceKnownByNode_ne.viewRow(a_d.getIndex ()); DoubleMatrix1D a_k = DoubleFactory1D.dense.make (R); for (Route r : d.getRoutes()) { double val = 0; for (Link e : r.getSeqLinks()) val += weightsKnown_e.get(e.getIndex()) + 1; a_k.set(r.getIndex (), val); } DoubleMatrix1D x_r = GradientProjectionUtils.regularizedProjection_sumEquality (a_k , control_routeIndexes_d [d.getIndex ()] , null , h_d , this.gradient_regularizationEpsilon.getDouble()); for (Route r : d.getRoutes ()) r.setCarriedTraffic(x_r.get(r.getIndex ()) , x_r.get(r.getIndex ())); }
for (Link e : r.getSeqLinks()) T_r_prop [r.getIndex()] += T_e_prop [e.getIndex()]; T_r_tx [r.getIndex()] += T_e_tx [e.getIndex()]; T_r_buf [r.getIndex()] += T_e_buf [e.getIndex()]; T_r [r.getIndex()] += T_e [e.getIndex()]; T_d_prop [d.getIndex()] += weightFactor * T_r_prop [r.getIndex()]; T_d_tx [d.getIndex()] += weightFactor * T_r_tx [r.getIndex()]; T_d_buf [d.getIndex()] += weightFactor * T_r_buf [r.getIndex()]; T_d [d.getIndex()] += weightFactor * T_r [r.getIndex()]; for (Route r : netPlan.getRoutes()) avNetDelay_T += r.getCarriedTraffic() * T_r [r.getIndex()]; avNetDelay_T_prop += r.getCarriedTraffic() * T_r_prop [r.getIndex()]; for (Route r : netPlan.getRoutes()) final int rIndex = r.getIndex(); final Demand d = r.getDemand(); out.append(String.format("<tr><td>%d</td><td>%d</td><td>%d (%s)</td><td>%d (%s)</td><td>%s</td><td>%.3g</td><td>%.3g</td><td>%.3g</td><td>%.3g</td><td>%s</td></tr>", r.getIndex () , d.getIndex(), r.getIngressNode().getIndex() , r.getIngressNode().getName(), r.getEgressNode().getIndex() , r.getEgressNode().getName(), r.getSeqLinks(), T_r_prop[rIndex], T_r_tx[rIndex], T_r_buf[rIndex], T_r[rIndex], r.getAttributes()));
res.add(Triple.of("Route index/id" , "Route " + r.getIndex() + " (id " + r.getId() + ")" + (r.isBackupRoute()? " [backup]" : ""), "route" + r.getId()));
st.append("Elements associated to route " + e.getIndex() + " in layer " + getLayerName(e.getLayer())); } else if (initialElement instanceof SharedRiskGroup)
/** <p>Given a list of Network Element, it computes the node-network element incoming incidence matrix. This is a matrix with as many rows as nodes, and as many columns as network elements. Position (<i>n</i>, <i>e</i>) has a 1 if element <i>e</i> (<i>e = 0</i> refers to the first element n {@code elements}, <i>e = 1</i> refers to the second one, and so on) is terminated in node <i>n</i> (<i>n = 0</i> refers to the first node in {@code nodes}, <i>n = 1</i> refers to the second one, and so on), and 0 otherwise.</p> * * @param nodes List of nodes * @param elements List of Network Elements * @return Node-link incoming incidence matrix * @see com.net2plan.interfaces.networkDesign.NetworkLayer */ public static DoubleMatrix2D getIncomingIncidenceMatrix(List<Node> nodes, List<? extends NetworkElement> elements) { int N = nodes.size(); int E = elements.size(); DoubleMatrix2D A_ne = DoubleFactory2D.sparse.make(N, E); for (NetworkElement o : elements) if (o instanceof Link) { Link e = (Link) o; A_ne.set(e.getDestinationNode().getIndex(), e.getIndex(), 1); } else if (o instanceof Demand) { Demand e = (Demand) o; A_ne.set(e.getEgressNode().getIndex(), e.getIndex(), 1); } else if (o instanceof Route) { Route e = (Route) o; A_ne.set(e.getEgressNode().getIndex(), e.getIndex(), 1); } else throw new Net2PlanException("Error making the matrix"); return A_ne; }
/** <p>Given a list of Network elements, it computes the node-network element outgoing incidence matrix. This is a matrix with as many rows as nodes, and as many columns as elements. Position (<i>n</i>, <i>e</i>) has a 1 if element <i>e</i> (<i>e = 0</i> refers to the first element, <i>e = 1</i> refers to the second one, and so on) is initiated in node <i>n</i> (<i>n = 0</i> refers to the first node , <i>n = 1</i> refers to the second one, and so on), and 0 otherwise.</p> * * @param nodes List of nodes * @param elements List of elements * @return Node-link outgoing incidence matrix * @see com.net2plan.interfaces.networkDesign.NetworkElement */ public static DoubleMatrix2D getOutgoingIncidenceMatrix(List<Node> nodes, List<? extends NetworkElement> elements) { int N = nodes.size(); int E = elements.size(); DoubleMatrix2D A_ne = DoubleFactory2D.sparse.make(N, E); for (NetworkElement o : elements) if (o instanceof Link) { Link e = (Link) o; A_ne.set(e.getOriginNode().getIndex(), e.getIndex(), 1); } else if (o instanceof Demand) { Demand e = (Demand) o; A_ne.set(e.getIngressNode().getIndex(), e.getIndex(), 1); } else if (o instanceof Route) { Route e = (Route) o; A_ne.set(e.getIngressNode().getIndex(), e.getIndex(), 1); } else throw new Net2PlanException("Error making the matrix"); return A_ne; }
/** <p>Given a list of Network Elements, it computes the node-network element incidence matrix. This is a matrix with as many rows as nodes, and as many columns as elements. Position (<i>n</i>, <i>e</i>) has a 1 if element <i>e</i> (<i>e = 0</i> refers to the first element}, <i>e = 1</i> refers to the second one, and so on) is initiated in node <i>n</i> (<i>n = 0</i> refers to the first node , <i>n = 1</i> refers to the second one, and so on), -1 if it ends in node n, and 0 otherwise.</p> * @param nodes List of nodes * @param elements List of elements * @return Incidence matrix * @see com.net2plan.interfaces.networkDesign.NetworkLayer */ public static DoubleMatrix2D getIncidenceMatrix(List<Node> nodes, List<? extends NetworkElement> elements) { int N = nodes.size(); int E = elements.size(); DoubleMatrix2D A_ne = DoubleFactory2D.sparse.make(N, E); for (NetworkElement o : elements) if (o instanceof Link) { Link e = (Link) o; A_ne.set(e.getOriginNode().getIndex(), e.getIndex(), 1); A_ne.set(e.getDestinationNode().getIndex(), e.getIndex(), -1); } else if (o instanceof Demand) { Demand e = (Demand) o; A_ne.set(e.getIngressNode().getIndex(), e.getIndex(), 1); A_ne.set(e.getEgressNode().getIndex(), e.getIndex(), -1); } else if (o instanceof Route) { Route e = (Route) o; A_ne.set(e.getIngressNode().getIndex(), e.getIndex(), 1); A_ne.set(e.getEgressNode().getIndex(), e.getIndex(), -1); } else throw new Net2PlanException("Error making the matrix"); return A_ne; }
for (Route r : routes) control_routeIndexes_d [d.getIndex ()][counter_r ++] = r.getIndex (); r.setCarriedTraffic(h_d / routes.size() , h_d / routes.size()); control_previousXp.set(r.getIndex(), h_d / routes.size()); log.println("Initial route: " + r + " demand: " +d + ", h_d: " + h_d + ", h_r = " + r.getCarriedTraffic() + ", seqLinks: "+ r.getSeqLinks());
for (Link e : r.getSeqLinks()) accumPrices += infoIKnow_price_e.get(e.getIndex()); accumPrices += 2*gradient_maxGradientAbsoluteNoise.getDouble()*(this.rng.nextDouble()-0.5); new_x_p.set (r.getIndex () , old_xp - this.gradient_gammaStep.getDouble() * accumPrices + this.gradient_heavyBallBetaParameter.getDouble() * (r.getCarriedTraffic() - this.control_previousXp.get(r.getIndex ()) ));
double yThisLink = 0; for (Route r : e.getTraversingRoutes()) yThisLink += x_p.get(r.getIndex ()); if (yThisLink > e.getCapacity() + 1E-3) throw new RuntimeException ("Bad"); double trafDemand = 0; for (Route r : d.getRoutes()) trafDemand += x_p.get(r.getIndex ()); if (Math.abs(trafDemand - d.getOfferedTraffic()) > 1E-3) throw new RuntimeException ("Bad"); final double x_r = x_p.get(r.getIndex ()); objFunc += x_r * r.getNumberOfHops(); if (isRegularized) objFunc += this.gradient_regularizationEpsilon.getDouble() * Math.pow(x_r, 2);
double y_e = 0; for (Route r : e.getTraversingRoutes()) y_e += x_p.get (r.getIndex()); if (y_e > e.getCapacity() + 1E-3) throw new RuntimeException ("Bad"); double trafDemand = 0; for (Route r : d.getRoutes()) trafDemand += x_p.get(r.getIndex ()); if (Math.abs(trafDemand - d.getOfferedTraffic()) > 1E-3) throw new RuntimeException ("Bad");
int counter_r = 0; for (Route r : d.getRoutes ()) control_routeIndexes_d [d.getIndex ()][counter_r ++] = r.getIndex ();
final int opp_r = opposite_r.get(netPlan.getRoute(r)).getIndex (); final int [] oppRrest = IntUtils.find(rChange, opp_r, SearchType.ALL); if (oppRrest.length != 1) throw new RuntimeException ("Bad");
for (int rRest = 0 ; rRest < Rrest ; rRest ++) final int r = rChange [rRest]; final int opp_r = opposite_r.get(netPlan.getRoute (r)).getIndex (); final int [] oppRrest = IntUtils.find(rChange, opp_r, SearchType.ALL); if (oppRrest.length != 1) throw new RuntimeException ("Bad");
for (int rRest = 0 ; rRest < Rrest ; rRest ++) final int r = rChange [rRest]; final int opp_r = opposite_r.get(netPlan.getRoute (r)).getIndex (); final int [] oppRrest = IntUtils.find(rChange, opp_r, SearchType.ALL); if (oppRrest.length != 1) throw new RuntimeException ("Bad"); Abid_rRestrRest.set(rRest , oppRrest [0] , 1.0); Abid_rRestrRest.set(oppRrest [0], rRest , 1);
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);