- Refactor simulation handling and improve net iteration methods
This commit is contained in:
2025-02-03 18:55:31 +01:00
parent 2acb27a6b9
commit 2d5f43bbc9
9 changed files with 80 additions and 34 deletions

View File

@@ -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<ServerNode> {
private final List<ServerNode> servers = new ArrayList<>();
private final HashMap<ServerNode, Integer> indices = new HashMap<>();
private final List<List<Connection>> 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<ServerNode> 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<ServerNode> iterator() {
return this.servers.iterator();
}
}

View File

@@ -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) {