From 2d5f43bbc9d7646778477dc0a0969cbc4494bc49 Mon Sep 17 00:00:00 2001 From: Berack96 Date: Mon, 3 Feb 2025 18:55:31 +0100 Subject: [PATCH] Readme - Refactor simulation handling and improve net iteration methods --- .vscode/launch.json | 7 --- README.md | 51 +++++++++++++++++- image/README/1738603552417.png | Bin 0 -> 81907 bytes src/main/java/net/berack/upo/valpre/Main.java | 2 +- src/main/java/net/berack/upo/valpre/Plot.java | 4 +- ...Simulation.java => SimulationBuilder.java} | 16 +++--- .../java/net/berack/upo/valpre/sim/Net.java | 19 +++---- .../net/berack/upo/valpre/sim/Simulation.java | 13 ++++- .../berack/upo/valpre/sim/TestSimulation.java | 2 +- 9 files changed, 80 insertions(+), 34 deletions(-) create mode 100644 image/README/1738603552417.png rename src/main/java/net/berack/upo/valpre/{Simulation.java => SimulationBuilder.java} (90%) diff --git a/.vscode/launch.json b/.vscode/launch.json index a7c7c9b..4736d88 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -25,13 +25,6 @@ "mainClass": "net.berack.upo.valpre.Main", "args": "simulation -net example1.net -runs 10" }, - { - "type": "java", - "name": "Run10", - "request": "launch", - "mainClass": "net.berack.upo.valpre.Main", - "args": "simulation -net example1.net -runs 10" - }, { "type": "java", "name": "Plot Simple", diff --git a/README.md b/README.md index 93b5a5c..e3b2096 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,49 @@ -# upo-valpre -valutazione delle prestazioni (principalemnte Reti di code e di Petri) +# Valutazione delle Prestazioni + +Il progetto riguarda un simulatore ad eventi discreti. +Il simulatore è iniziato con il lavoro trovato sul libro di testo [Discrete-Event System Simulation](https://www.pearson.com/en-us/subject-catalog/p/discrete-event-system-simulation/P200000003161/9780136062127) al Capitolo 4, per poi esser personalizzato e modificato radicalmente. + +Il risultato è la creazione in una libreria per la simulazione di eventi discreti nella quale si può scegliera la topologia e la quantità di nodi nella rete da simulare. + +Per fare ciò si può usare il JAR risultante che si trova nelle [Releases](https://github.com/Berack96/upo-valpre/releases). + +### Comandi Jar + +Il JAR viene invocato tramite il classico comando java: `java -jar upo-valpre.jar` al quale si aggiungono vari argomenti successivi in base a cosa si vuole fare: + +* `java -jar upo-valpre.jar net`\ +Usato per avviare una sessione interattiva per la creazione di una rete. Da usare se la rete è relativamente breve da descrivere, altrimenti è più comodo usare il codice della libreria per la generazione della rete.\ +Una volta scelta la rete è necessario salvarla in un file per la successiva simulazione e analisi. +* `java -jar upo-valpre.jar simulation -net [other]`\ +Usato per avviare una simulazione della rete. Nel caso la rete non abbia eventuali limiti nella generazione di arrivi, viene restituito un errore. +Esistono vari tipi di argomenti per scegliere come fare la simulazione: + * `-runs ` per fare la simulazione N volte + * `-seed ` per dare un seed iniziale scelto + * `-csv ` per salvare i risultati delle run in un file csv + * `-p` per fare le simulazioni in parallelo (ovvero su più thread) +* `java -jar upo-valpre.jar plot -csv `\ +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` + +### Classi Interne + +Esistono molteplici classi interne che vengono usate per supportare la simulazione e/o mostrare i risultati. In generale le classi dentro il percorso [net.berack.upo.valpre](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre) sono usate per l'utilizzo del jar e quindi non sono essenziali per la simulazione. +I percorsi che invece sono direttamente responsabili per la simulazione sono: +- [net.berack.upo.valpre.rand](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre/rand) All'interno del quale si possono trovare: + - **Rng** che viene usato per il calcolo di numeri pseudo-casuali tramite un seed iniziale e la generazione di molteplici stream di generazione di numeri casuali + - **Distribution** interfaccia usata per la generazione di un numero casuale di una distribuzione. In questo file esistono molteplici classi interne che implementano l'interfaccia; per esempio: Exponential, Normal, Uniform +- [net.berack.upo.valpre.sim](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre/sim) Package che contiene tutte le parti utili alla simulazione; per esempio la creazione della rete o la simulazione si più thread: + - **Net** che viene usato per rappresentare una rete da simulare. + - **ServerNode** che viene usato per rappresentare un singolo nodo della rete. + - **Event** che viene usato per rappresentare un evento della simulazione. + - **EndCriteria** interfaccia che viene implementata dalle classi interne usata per controllare se la simulazione debba finire. + - **Simulation** e **SimulationMultiple** che vengono usate per far partire la simulazione; la versione multiple serve ad organizzare molteplici simulazioni si più thread o su un singolo core. +- [net.berack.upo.valpre.sim.stats](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre/sim/stats) Package che contiene tutte le classi utili per la raccolta e l'analisi statistica dei vari valori generati dalla simulazione: + - **Result** un singolo risultato e la sua controparte **ResultSummary** che contiene molteplici risultati già analizzati. + - **Statistics** un singolo valore di indici statistici di un nodo e la sua controparte **StatisticsSummary** che contiene molteplici risultati già analizzati. + - **ConsoleTable** utile per mostrare i risultati in console sottoforma di tabella + - **CsvResult** utile per la lettura/scrittura di risultati in formato csv diff --git a/image/README/1738603552417.png b/image/README/1738603552417.png new file mode 100644 index 0000000000000000000000000000000000000000..80270dd3f0c2a78339a371c6f3b379833e496d9b GIT binary patch literal 81907 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 n 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 literal 0 HcmV?d00001 diff --git a/src/main/java/net/berack/upo/valpre/Main.java b/src/main/java/net/berack/upo/valpre/Main.java index eb8dc33..76e315a 100644 --- a/src/main/java/net/berack/upo/valpre/Main.java +++ b/src/main/java/net/berack/upo/valpre/Main.java @@ -18,7 +18,7 @@ public class Main { var param = Main.getParameters(program, subArgs); switch (program) { case "simulation" -> { - new Simulation(param.get("net")) + new SimulationBuilder(param.get("net")) .setCsv(param.get("csv")) .setRuns(param.getOrDefault("runs", Integer::parseInt, 100)) .setSeed(param.getOrDefault("seed", Long::parseLong, 2007539552L)) diff --git a/src/main/java/net/berack/upo/valpre/Plot.java b/src/main/java/net/berack/upo/valpre/Plot.java index 867e101..8180a02 100644 --- a/src/main/java/net/berack/upo/valpre/Plot.java +++ b/src/main/java/net/berack/upo/valpre/Plot.java @@ -142,7 +142,9 @@ public class Plot { var columnKey = String.format("%.3f", columnVal); dataset.addValue(frequency[i], "Frequency", columnKey); } - this.panelBarChart.getChart().getCategoryPlot().setDataset(dataset); + var chart = this.panelBarChart.getChart(); + chart.getCategoryPlot().setDataset(dataset); + chart.setTitle(stat + " distribution"); var model = this.statList.getModel(); for (int i = 0; i < model.getSize(); i++) { diff --git a/src/main/java/net/berack/upo/valpre/Simulation.java b/src/main/java/net/berack/upo/valpre/SimulationBuilder.java similarity index 90% rename from src/main/java/net/berack/upo/valpre/Simulation.java rename to src/main/java/net/berack/upo/valpre/SimulationBuilder.java index afe06c0..3d0fc6e 100644 --- a/src/main/java/net/berack/upo/valpre/Simulation.java +++ b/src/main/java/net/berack/upo/valpre/SimulationBuilder.java @@ -14,7 +14,7 @@ import net.berack.upo.valpre.sim.stats.CsvResult; * This class is responsible for running the simulation. It parses the arguments * and runs the simulation with the given parameters. */ -public class Simulation { +public class SimulationBuilder { private String csv; private int runs; private long seed; @@ -28,7 +28,7 @@ public class Simulation { * @param netFile the net file to load * @throws IOException if the file has a problem */ - public Simulation(String netFile) throws IOException { + public SimulationBuilder(String netFile) throws IOException { try { var file = Parameters.getFileOrExample(netFile); this.net = Net.load(file); @@ -46,7 +46,7 @@ public class Simulation { * @param net the net * @throws IllegalArgumentException if the net is null */ - public Simulation(Net net) { + public SimulationBuilder(Net net) { if (net == null) throw new IllegalArgumentException("Net needed!"); this.net = net; @@ -59,7 +59,7 @@ public class Simulation { * @throws IllegalArgumentException if the runs are less than 1 * @return this simulation */ - public Simulation setRuns(int runs) { + public SimulationBuilder setRuns(int runs) { if (runs <= 0) throw new IllegalArgumentException("Runs must be greater than 0!"); @@ -73,7 +73,7 @@ public class Simulation { * @param seed the seed * @return this simulation */ - public Simulation setSeed(long seed) { + public SimulationBuilder setSeed(long seed) { this.seed = seed; return this; } @@ -85,7 +85,7 @@ public class Simulation { * @param parallel if the simulation should run in parallel * @return this simulation */ - public Simulation setParallel(boolean parallel) { + public SimulationBuilder setParallel(boolean parallel) { this.parallel = parallel; return this; } @@ -96,7 +96,7 @@ public class Simulation { * @param csv the CSV file * @return this simulation */ - public Simulation setCsv(String csv) { + public SimulationBuilder setCsv(String csv) { this.csv = csv; return this; } @@ -110,7 +110,7 @@ public class Simulation { * @return this simulation * @throws IllegalArgumentException if the criteria are null */ - public Simulation setEndCriteria(EndCriteria... criterias) { + public SimulationBuilder setEndCriteria(EndCriteria... criterias) { if (criterias == null) throw new IllegalArgumentException("End criteria cannot be null!"); this.endCriteria = criterias; diff --git a/src/main/java/net/berack/upo/valpre/sim/Net.java b/src/main/java/net/berack/upo/valpre/sim/Net.java index 89ac3d8..95770ae 100644 --- a/src/main/java/net/berack/upo/valpre/sim/Net.java +++ b/src/main/java/net/berack/upo/valpre/sim/Net.java @@ -7,8 +7,8 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; -import java.util.function.Consumer; import org.objenesis.strategy.StdInstantiatorStrategy; @@ -25,7 +25,7 @@ import net.berack.upo.valpre.rand.Rng; * connections between nodes. In order to start a simulation, at least one node * must be a Source or must generate at least one event to be processed. */ -public final class Net { +public final class Net implements Iterable { private final List servers = new ArrayList<>(); private final HashMap indices = new HashMap<>(); private final List> connections = new ArrayList<>(); @@ -220,16 +220,6 @@ public final class Net { } } - /** - * Apply a consumer to all the nodes. The implementation uses a stream and for - * this reason you should consider to make thread safe the consumer. - * - * @param consumer a function that takes in input a ServerNode - */ - public void forEachNode(Consumer consumer) { - this.servers.stream().forEach(consumer); - } - /** * Save the current net to a file. * The resulting file is saved with Kryo. @@ -304,4 +294,9 @@ public final class Net { this.weight = weight; } } + + @Override + public Iterator iterator() { + return this.servers.iterator(); + } } diff --git a/src/main/java/net/berack/upo/valpre/sim/Simulation.java b/src/main/java/net/berack/upo/valpre/sim/Simulation.java index 4a32605..37549c9 100644 --- a/src/main/java/net/berack/upo/valpre/sim/Simulation.java +++ b/src/main/java/net/berack/upo/valpre/sim/Simulation.java @@ -40,8 +40,17 @@ public final class Simulation { this.rng = rng; this.time = 0.0d; + // check for ending criteria in simulation + boolean hasLimit = false; + for (var node : net) + if (node.spawnArrivals != Integer.MAX_VALUE) + hasLimit = true; + + if (!hasLimit && (criterias == null || criterias.length == 0)) + throw new IllegalArgumentException("At least one end criteria is needed!"); + // Initial arrivals (if spawned) - net.forEachNode(node -> { + net.forEach(node -> { this.states.put(node.name, new NodeState()); if (node.shouldSpawnArrival(0)) this.addArrival(node); @@ -152,7 +161,7 @@ public final class Simulation { * on the given node, and the delay is determined by the node's service * distribution. * - * @param node The node to create the event for. + * @param node The node to create the event for. * @param state The current state of the node */ public void addDepartureIfPossible(ServerNode node, NodeState state) { diff --git a/src/test/java/net/berack/upo/valpre/sim/TestSimulation.java b/src/test/java/net/berack/upo/valpre/sim/TestSimulation.java index 0b7007e..7d453dc 100644 --- a/src/test/java/net/berack/upo/valpre/sim/TestSimulation.java +++ b/src/test/java/net/berack/upo/valpre/sim/TestSimulation.java @@ -134,7 +134,7 @@ public class TestSimulation { var nodes = new HashSet(); nodes.add(node); nodes.add(node1); - net.forEachNode(n -> assertTrue(nodes.contains(n))); + net.forEach(n -> assertTrue(nodes.contains(n))); net.addConnection(0, 1, 1.0); var conn = net.getChildren(0);