diff --git a/DAS/__init__.py b/DAS/__init__.py index c7fc7c0..67af3ae 100644 --- a/DAS/__init__.py +++ b/DAS/__init__.py @@ -1,4 +1,3 @@ from DAS.simulator import * -from DAS.configuration import * from DAS.shape import * from DAS.visualizer import * diff --git a/DAS/configuration.py b/DAS/configuration.py deleted file mode 100644 index 2ff9d68..0000000 --- a/DAS/configuration.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/python3 - -import configparser, logging, sys - -class Configuration: - """This class stores all the configuration parameters for the given run.""" - - def __init__(self, fileName): - """It initializes the configuration based on the given configuration.""" - - config = configparser.RawConfigParser() - config.read(fileName) - - try: - self.nvStart = int(config.get("Simulation Space", "numberValidatorStart")) - self.nvStop = int(config.get("Simulation Space", "numberValidatorStop")) - self.nvStep = int(config.get("Simulation Space", "numberValidatorStep")) - - self.blockSizeStart = int(config.get("Simulation Space", "blockSizeStart")) - self.blockSizeStop = int(config.get("Simulation Space", "blockSizeStop")) - self.blockSizeStep = int(config.get("Simulation Space", "blockSizeStep")) - - self.netDegreeStart = int(config.get("Simulation Space", "netDegreeStart")) - self.netDegreeStop = int(config.get("Simulation Space", "netDegreeStop")) - self.netDegreeStep = int(config.get("Simulation Space", "netDegreeStep")) - - self.failureRateStart = int(config.get("Simulation Space", "failureRateStart")) - self.failureRateStop = int(config.get("Simulation Space", "failureRateStop")) - self.failureRateStep = int(config.get("Simulation Space", "failureRateStep")) - - self.chiStart = int(config.get("Simulation Space", "chiStart")) - self.chiStop = int(config.get("Simulation Space", "chiStop")) - self.chiStep = int(config.get("Simulation Space", "chiStep")) - except: - sys.exit("Configuration Error: It seems some of the [Simulation Space] parameters are missing. Cannot continue :( ") - - - - try: - self.numberRuns = int(config.get("Advanced", "numberRuns")) - self.deterministic = config.get("Advanced", "deterministic") - self.dumpXML = config.get("Advanced", "dumpXML") - self.logLevel = config.get("Advanced", "logLevel") - self.visualization = config.get("Advanced", "visualization") - except: - sys.exit("Configuration Error: It seems some of the [Advanced] parameters are missing. Cannot continue :( ") - self.test() - - def test(self): - - print("Testing configuration...") - if self.logLevel == "INFO": - self.logLevel = logging.INFO - elif self.logLevel == "DEBUG": - self.logLevel = logging.DEBUG - else: - self.logLevel = logging.INFO - - if self.nvStart >= self.nvStop: - sys.exit("Configuration Error: numberValidatorStart has to be smaller than numberValidatorStop") - - if self.failureRateStart >= self.failureRateStop: - sys.exit("Configuration Error: failureRateStart has to be smaller than failureRateStop") - - if self.blockSizeStart >= self.blockSizeStop: - sys.exit("Configuration Error: blockSizeStart has to be smaller than blockSizeStop") - - if self.netDegreeStart >= self.netDegreeStop: - sys.exit("Configuration Error: netDegreeStart has to be smaller than netDegreeStop") - - if self.chiStart >= self.chiStop: - sys.exit("Configuration Error: chiStart has to be smaller than chiStop") - - - if self.nvStart < self.blockSizeStop: - sys.exit("Configuration Error: numberValidatorStart hast to be larger than blockSizeStop.") - - if self.chiStart < 2: - sys.exit("Configuration Error: Chi has to be greater than 1.") - - if self.chiStop > self.blockSizeStart: - sys.exit("Configuration Error: Chi (%d) has to be smaller or equal to block the size (%d)" % (self.chiStop, self.blockSizeStart)) - - - diff --git a/config.ini b/config.ini deleted file mode 100644 index 12bd749..0000000 --- a/config.ini +++ /dev/null @@ -1,30 +0,0 @@ -[Simulation Space] - -numberValidatorStart = 256 -numberValidatorStop = 512 -numberValidatorStep = 128 - -failureRateStart = 10 -failureRateStop = 90 -failureRateStep = 40 - -blockSizeStart = 32 -blockSizeStop = 64 -blockSizeStep = 16 - -netDegreeStart = 6 -netDegreeStop = 8 -netDegreeStep = 2 - -chiStart = 4 -chiStop = 8 -chiStep = 2 - - -[Advanced] - -deterministic = 0 -numberRuns = 2 -dumpXML = 1 -visualization = 1 -logLevel = INFO diff --git a/config_example.py b/config_example.py new file mode 100644 index 0000000..0ac65ad --- /dev/null +++ b/config_example.py @@ -0,0 +1,53 @@ +"""Example configuration file + +This file illustrates how to define options and simulation parameter ranges. +It also defines the traversal order of the simulation space. As the file +extension suggests, configuration is pure python code, allowing complex +setups. Use at your own risk. + +To use this example, run + python3 study.py config_example + +Otherwise copy it and modify as needed. The default traversal order defined +in the nested loop of nextShape() is good for most cases, but customizable +if needed. +""" + +import logging +from DAS.shape import Shape + +dumpXML = 1 +visualization = 1 +logLevel = logging.INFO + +# Number of simulation runs with the same parameters for statistical relevance +runs = range(10) + +# Number of validators +numberValidators = range(256, 513, 128) + +# Percentage of block not released by producer +failureRates = range(10, 91, 40) + +# Block size in one dimension in segments. Block is blockSizes * blockSizes segments. +blockSizes = range(32,65,16) + +# Per-topic mesh neighborhood size +netDegrees = range(6, 9, 2) + +# number of rows and columns a validator is interested in +chis = range(4, 9, 2) + +deterministic = False + +def nextShape(): + for run in runs: + for fr in failureRates: + for chi in chis: + for blockSize in blockSizes: + for nv in numberValidators: + for netDegree in netDegrees: + # Network Degree has to be an even number + if netDegree % 2 == 0: + shape = Shape(blockSize, nv, fr, chi, netDegree, run) + yield shape diff --git a/study.py b/study.py index 028d327..52433c5 100644 --- a/study.py +++ b/study.py @@ -1,6 +1,7 @@ #! /bin/python3 import time, sys, random, copy +import importlib from DAS import * @@ -9,7 +10,16 @@ def study(): print("You need to pass a configuration file in parameter") exit(1) - config = Configuration(sys.argv[1]) + try: + config = importlib.import_module(sys.argv[1]) + except ModuleNotFoundError as e: + try: + config = importlib.import_module(str(sys.argv[1]).replace(".py", "")) + except ModuleNotFoundError as e: + print(e) + print("You need to pass a configuration file in parameter") + exit(1) + shape = Shape(0, 0, 0, 0, 0, 0) sim = Simulator(shape, config) sim.initLogger() @@ -22,26 +32,17 @@ def study(): sim.logger.info("Starting simulations:", extra=sim.format) start = time.time() - for run in range(config.numberRuns): - for nv in range(config.nvStart, config.nvStop+1, config.nvStep): - for blockSize in range(config.blockSizeStart, config.blockSizeStop+1, config.blockSizeStep): - for fr in range(config.failureRateStart, config.failureRateStop+1, config.failureRateStep): - for netDegree in range(config.netDegreeStart, config.netDegreeStop+1, config.netDegreeStep): - for chi in range(config.chiStart, config.chiStop+1, config.chiStep): + for shape in config.nextShape(): + if not config.deterministic: + random.seed(datetime.now()) - if not config.deterministic: - random.seed(datetime.now()) - - # Network Degree has to be an even number - if netDegree % 2 == 0: - shape = Shape(blockSize, nv, fr, chi, netDegree, run) - sim.resetShape(shape) - sim.initValidators() - sim.initNetwork() - result = sim.run() - sim.logger.info("Shape: %s ... Block Available: %d in %d steps" % (str(sim.shape.__dict__), result.blockAvailable, len(result.missingVector)), extra=sim.format) - results.append(copy.deepcopy(result)) - simCnt += 1 + sim.resetShape(shape) + sim.initValidators() + sim.initNetwork() + result = sim.run() + sim.logger.info("Shape: %s ... Block Available: %d in %d steps" % (str(sim.shape.__dict__), result.blockAvailable, len(result.missingVector)), extra=sim.format) + results.append(copy.deepcopy(result)) + simCnt += 1 end = time.time() sim.logger.info("A total of %d simulations ran in %d seconds" % (simCnt, end-start), extra=sim.format)