Sim hash free #1

Merged
Berack96 merged 20 commits from sim-hash-free into main 2025-02-11 14:30:15 +01:00
3 changed files with 46 additions and 42 deletions
Showing only changes of commit 850cee295a - Show all commits

View File

@@ -5,8 +5,6 @@ import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.HashMap;
import net.berack.upo.valpre.sim.EndCriteria;
public class Main {
public static void main(String[] args) {
if (args.length == 0)
@@ -23,7 +21,7 @@ public class Main {
.setMaxRuns(param.getOrDefault("runs", Integer::parseInt, 100))
.setSeed(param.getOrDefault("seed", Long::parseLong, 2007539552L))
.setParallel(param.get("p") != null)
.setEndCriteria(EndCriteria.parse(param.get("end")))
.parseEndCriteria(param.get("end"))
.parseConfidenceIndices(param.get("i"))
.run();
}

View File

@@ -7,6 +7,9 @@ import com.esotericsoftware.kryo.KryoException;
import net.berack.upo.valpre.sim.ConfidenceIndices;
import net.berack.upo.valpre.sim.EndCriteria;
import net.berack.upo.valpre.sim.EndCriteria.MaxArrivals;
import net.berack.upo.valpre.sim.EndCriteria.MaxDepartures;
import net.berack.upo.valpre.sim.EndCriteria.MaxTime;
import net.berack.upo.valpre.sim.Net;
import net.berack.upo.valpre.sim.SimulationMultiple;
import net.berack.upo.valpre.sim.stats.CsvResult;
@@ -122,6 +125,48 @@ public class SimulationBuilder {
return this;
}
/**
* Set the end criteria for the simulation.
* Parses the given string to create an array of end criteria.
* The string passed must be in the following format:
* [criteria1];[criteria2];...;[criteriaN]
*
* and each criteria must be in the following format:
* ClassName:param1,param2,...,paramN
*
* If the string is empty or null, no criteria are set.
* If one of the criteria is not valid, an exception is thrown.
*
* @param criterias The string to parse.
* @return this builder
* @throws IllegalArgumentException If one of the criteria is not valid.
*/
public SimulationBuilder parseEndCriteria(String criterias) {
if (criterias == null || criterias.isEmpty()) {
this.endCriteria = new EndCriteria[0];
return this;
}
var criteria = criterias.split(";");
this.endCriteria = new EndCriteria[criteria.length];
for (int i = 0; i < criteria.length; i++) {
var current = criteria[i].substring(1, criteria[i].length() - 1); // Remove the brackets
var parts = current.split(":");
if (parts.length != 2)
throw new IllegalArgumentException("Invalid criteria: " + current);
var className = parts[0];
var params = parts[1].split(",");
this.endCriteria[i] = switch (className) {
case "MaxArrivals" -> new MaxArrivals(params[0], Integer.parseInt(params[1]));
case "MaxDepartures" -> new MaxDepartures(params[0], Integer.parseInt(params[1]));
case "MaxTime" -> new MaxTime(Double.parseDouble(params[0]));
default -> throw new IllegalArgumentException("Invalid criteria: " + current);
};
}
return this;
}
/**
* Add a confidence index for the given node and stat.
* The confidence index is used to determine when the simulation should stop.

View File

@@ -12,45 +12,6 @@ public interface EndCriteria {
*/
public boolean shouldEnd(Simulation run);
/**
* Parses the given string to create an array of end criteria.
* The string passed must be in the following format:
* [criteria1];[criteria2];...;[criteriaN]
*
* and each criteria must be in the following format:
* ClassName:param1,param2,...,paramN
*
* If the string is empty or null, an empty array is returned.
* If one of the criteria is not valid, an exception is thrown.
*
* @param criterias The string to parse.
* @return An array of end criteria.
* @throws IllegalArgumentException If one of the criteria is not valid.
*/
public static EndCriteria[] parse(String criterias) {
if (criterias == null || criterias.isEmpty())
return new EndCriteria[0];
var criteria = criterias.split(";");
var endCriteria = new EndCriteria[criteria.length];
for (int i = 0; i < criteria.length; i++) {
var current = criteria[i].substring(1, criteria[i].length() - 1); // Remove the brackets
var parts = current.split(":");
if (parts.length != 2)
throw new IllegalArgumentException("Invalid criteria: " + current);
var className = parts[0];
var params = parts[1].split(",");
endCriteria[i] = switch (className) {
case "MaxArrivals" -> new MaxArrivals(params[0], Integer.parseInt(params[1]));
case "MaxDepartures" -> new MaxDepartures(params[0], Integer.parseInt(params[1]));
case "MaxTime" -> new MaxTime(Double.parseDouble(params[0]));
default -> throw new IllegalArgumentException("Invalid criteria: " + current);
};
}
return endCriteria;
}
/**
* Ends the simulation when the given node has reached the specified number of
* arrivals.