- enhance Result and ResultSummary
- added new example
- added new launch configuration
- fixed RNG with seed 0 not correclty generating streams
This commit is contained in:
2025-02-05 09:40:38 +01:00
parent c7d9c05dc3
commit f591de5a06
8 changed files with 3079 additions and 26 deletions

7
.vscode/launch.json vendored
View File

@@ -18,6 +18,13 @@
"mainClass": "net.berack.upo.valpre.Main",
"args": "simulation -net example2.net -runs 1000 -p -seed 0"
},
{
"type": "java",
"name": "Run1k Complex EXP",
"request": "launch",
"mainClass": "net.berack.upo.valpre.Main",
"args": "simulation -net example3.net -runs 1000 -p -seed 0"
},
{
"type": "java",
"name": "Run10",

View File

@@ -22,14 +22,14 @@ Esistono vari tipi di argomenti per scegliere come fare la simulazione:
* `-csv <file>` per salvare i risultati delle run in un file csv
* `-p` per fare le simulazioni in parallelo (ovvero su più thread)
* `-end <criteria>` per scegliere quando la simulazione finisce nel caso non ci siano dei source limitati nella creazione di arrivi. La tipologia di fine simulazione la si può trovare dentro `EndCriteria` (ovvero MaxArrivals, MaxDepartures, MaxTime) e la formattazione da usare per passare il parametro è la seguente:\
`[Tipo1:param1,..,paramN];[..];[TipoN:param1,..,paramN]`
**\[Tipo1:param1,..,paramN\];\[..\];\[TipoN:param1,..,paramN\]**
* `java -jar upo-valpre.jar plot -csv <file>`\
Mostra (con un ambiente grafico) una finestra nella quale si può scegliere quale nodo vedere e ogni statistica associata ad esso. Di seguito un'immagine di esempio:
![1738603552417](image/README/1738603552417.png)
Esistono dei file prefatti per vedere eventuali simulazioni:
* `example1.net` e `example2.net` per `simulation -net`
* `example1.csv` e `example2.csv` per `plot -csv`
Esistono dei file prefatti per vedere eventuali simulazioni che, nel caso vengano passati come parametri, automaticamente vengono usati:
* `example1.net`, `example2.net` e `example3.net` per `simulation -net`
* `example1.csv`, `example2.csv` e `example3.csv` per `plot -csv`
### Classi Interne

View File

@@ -15,9 +15,9 @@ public class Main {
try {
var program = args[0];
var subArgs = Arrays.copyOfRange(args, 1, args.length);
var param = Main.getParameters(program, subArgs);
switch (program) {
case "simulation" -> {
var param = Main.getParameters(program, subArgs);
new SimulationBuilder(param.get("net"))
.setCsv(param.get("csv"))
.setRuns(param.getOrDefault("runs", Integer::parseInt, 100))
@@ -27,6 +27,7 @@ public class Main {
.run();
}
case "plot" -> {
var param = Main.getParameters(program, subArgs);
var csv = param.get("csv");
var plot = new Plot(csv);
plot.show();
@@ -72,8 +73,6 @@ public class Main {
};
descriptions.put("csv", csvDesc);
if (program.equals("net"))
return null;
return Parameters.getArgsOrHelper(args, "-", arguments, descriptions);
}

View File

@@ -110,7 +110,7 @@ public class Rng {
var streams = new Rng[total];
for (int i = 0; i < total; i++) {
streams[i] = new Rng(seed);
seed = (seed * mult) % MODULUS;
seed = (streams[i].seed * mult) % MODULUS;
}
return streams;
}

View File

@@ -29,4 +29,38 @@ public class Result {
this.timeElapsedMS = elapsed;
this.nodes = nodes;
}
@Override
public String toString() {
var size = (int) Math.ceil(Math.max(Math.log10(this.simulationTime), 1));
var iFormat = "%" + size + ".0f";
var fFormat = "%" + (size + 4) + ".3f";
var builder = new StringBuilder();
builder.append("===== Net Stats =====\n");
builder.append(String.format("Seed: \t%d\n", this.seed));
builder.append(String.format("Simulation: \t" + fFormat + "\n", this.simulationTime));
builder.append(String.format("Elapsed: \t" + fFormat + "ms\n", this.timeElapsedMS / 1e6));
// return builder.toString();
var table = new ConsoleTable("Node", "Departures", "Avg Queue", "Avg Wait", "Avg Response", "Throughput",
"Utilization %", "Unavailable %", "Last Event");
for (var entry : this.nodes.entrySet()) {
var stats = entry.getValue();
table.addRow(
entry.getKey(),
iFormat.formatted(stats.numDepartures),
fFormat.formatted(stats.avgQueueLength),
fFormat.formatted(stats.avgWaitTime),
fFormat.formatted(stats.avgResponse),
fFormat.formatted(stats.troughput),
fFormat.formatted(stats.utilization * 100),
fFormat.formatted(stats.unavailable * 100),
fFormat.formatted(stats.lastEventTime));
}
builder.append(table);
return builder.toString();
}
}

View File

@@ -42,24 +42,7 @@ public class ResultSummary {
this.seed = runs[0].seed;
this.simulationTime = avgTime / runs.length;
this.timeElapsedMS = avgElapsed / runs.length;
// Get the statistics of the nodes
var nodeStats = new HashMap<String, Statistics[]>();
for (var i = 0; i < runs.length; i++) {
for (var entry : runs[i].nodes.entrySet()) {
var node = entry.getKey();
var stats = nodeStats.computeIfAbsent(node, _ -> new Statistics[runs.length]);
stats[i] = entry.getValue();
}
}
// Get the summary of the statistics of the nodes
this.stats = new HashMap<>();
for (var entry : nodeStats.entrySet()) {
var node = entry.getKey();
var summary = StatisticsSummary.getSummary(entry.getValue());
this.stats.put(node, summary);
}
this.stats = ResultSummary.getSummary(runs);
}
/**
@@ -125,4 +108,33 @@ public class ResultSummary {
builder.append(table);
return builder.toString();
}
/**
* Get the summary of the statistics of the nodes.
* The first map is the node name, the second map is the statistic name.
*
* @param runs the runs to get the summary
* @return the summary of the statistics of the nodes
*/
public static Map<String, Map<String, StatisticsSummary>> getSummary(Result[] runs) {
// Get the statistics of the nodes
var nodeStats = new HashMap<String, Statistics[]>();
for (var i = 0; i < runs.length; i++) {
for (var entry : runs[i].nodes.entrySet()) {
var node = entry.getKey();
var stats = nodeStats.computeIfAbsent(node, _ -> new Statistics[runs.length]);
stats[i] = entry.getValue();
}
}
// Get the summary of the statistics of the nodes
var stats = new HashMap<String, Map<String, StatisticsSummary>>();
for (var entry : nodeStats.entrySet()) {
var node = entry.getKey();
var summary = StatisticsSummary.getSummary(entry.getValue());
stats.put(node, summary);
}
return stats;
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.