package core; /** * Configuration record for simulation parameters using Java 21 records. * This immutable configuration object encapsulates all simulation settings. * *
Example usage:
*{@code
* var config = VSSimulationConfig.defaultConfig();
* var customConfig = new VSSimulationConfig(
* 5, // processes
* 100, // timestep
* 10000, // duration
* true, // logging enabled
* 0.1f // clock variance
* );
* }
*
* @param numProcesses number of processes in the simulation (1-6)
* @param timestepMs simulation timestep in milliseconds
* @param maxDurationMs maximum simulation duration in milliseconds
* @param loggingEnabled whether logging is enabled
* @param defaultClockVariance default clock variance for processes
*
* @author Paul C. Buetow
*/
public record VSSimulationConfig(
int numProcesses,
long timestepMs,
long maxDurationMs,
boolean loggingEnabled,
float defaultClockVariance
) {
/**
* Validates the configuration parameters.
* Called automatically by the record's canonical constructor.
*/
public VSSimulationConfig {
if (numProcesses < constants.VSConstants.MIN_PROCESSES ||
numProcesses > constants.VSConstants.MAX_PROCESSES) {
throw new IllegalArgumentException(
"Number of processes must be between %d and %d"
.formatted(constants.VSConstants.MIN_PROCESSES,
constants.VSConstants.MAX_PROCESSES)
);
}
if (timestepMs <= 0) {
throw new IllegalArgumentException("Timestep must be positive");
}
if (maxDurationMs <= 0) {
throw new IllegalArgumentException("Max duration must be positive");
}
if (defaultClockVariance < -1.0f || defaultClockVariance > 1.0f) {
throw new IllegalArgumentException("Clock variance must be between -1.0 and 1.0");
}
}
/**
* Creates a default configuration suitable for most simulations.
*
* @return default simulation configuration
*/
public static VSSimulationConfig defaultConfig() {
return new VSSimulationConfig(
constants.VSConstants.DEFAULT_PROCESSES,
100, // 100ms timestep
60000, // 60 second max duration
true, // logging enabled
0.0f // no clock variance
);
}
/**
* Creates a new configuration with a different number of processes.
*
* @param newNumProcesses the new number of processes
* @return new configuration with updated process count
*/
public VSSimulationConfig withProcesses(int newNumProcesses) {
return new VSSimulationConfig(
newNumProcesses,
timestepMs,
maxDurationMs,
loggingEnabled,
defaultClockVariance
);
}
/**
* Creates a new configuration with different timing parameters.
*
* @param newTimestep the new timestep in milliseconds
* @param newMaxDuration the new maximum duration in milliseconds
* @return new configuration with updated timing
*/
public VSSimulationConfig withTiming(long newTimestep, long newMaxDuration) {
return new VSSimulationConfig(
numProcesses,
newTimestep,
newMaxDuration,
loggingEnabled,
defaultClockVariance
);
}
}