From 66824aedc6dd1b8c4db3200db99303ae9930f45e Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 25 Jan 2023 21:51:59 +0100 Subject: [PATCH 001/162] Adding XML dump of results --- DAS/configuration.py | 1 + DAS/results.py | 43 ++++++++++++++++++++++++++++++++++++++----- DAS/shape.py | 8 +++++--- DAS/simulator.py | 16 +++++++--------- config.das | 1 + study.py | 29 +++++++++++++++++++---------- 6 files changed, 71 insertions(+), 27 deletions(-) diff --git a/DAS/configuration.py b/DAS/configuration.py index 91df16f..a2e614e 100644 --- a/DAS/configuration.py +++ b/DAS/configuration.py @@ -33,6 +33,7 @@ class Configuration: self.numberRuns = int(config.get("Advanced", "numberRuns")) self.deterministic = config.get("Advanced", "deterministic") + self.dumpXML = config.get("Advanced", "dumpXML") if self.nvStop < (self.blockSizeStart*4): print("ERROR: The number of validators cannot be lower than the block size * 4") diff --git a/DAS/results.py b/DAS/results.py index 8468b09..48b6cbc 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -1,17 +1,50 @@ #!/bin/python3 +import os +from xml.dom import minidom +from dicttoxml import dicttoxml class Result: - config = [] + shape = [] missingVector = [] blockAvailable = -1 + tta = -1 - def __init__(self, config): - self.config = config + def __init__(self, shape): + self.shape = shape self.blockAvailable = -1 + self.tta = -1 self.missingVector = [] - - def addMissing(self, missingVector): + def populate(self, shape, missingVector): + self.shape = shape self.missingVector = missingVector + missingSamples = missingVector[-1] + if missingSamples == 0: + self.blockAvailable = 1 + self.tta = len(missingVector) + else: + self.blockAvailable = 0 + self.tta = -1 + + def dump(self, execID): + if not os.path.exists("results"): + os.makedirs("results") + if not os.path.exists("results/"+execID): + os.makedirs("results/"+execID) + resd1 = self.shape.__dict__ + resd2 = self.__dict__.copy() + resd2.pop("shape") + resd1.update(resd2) + resXml = dicttoxml(resd1) + xmlstr = minidom.parseString(resXml) + xmlPretty = xmlstr.toprettyxml() + filePath = "results/"+execID+"/nbv-"+str(self.shape.numberValidators)+\ + "-bs-"+str(self.shape.blockSize)+\ + "-nd-"+str(self.shape.netDegree)+\ + "-fr-"+str(self.shape.failureRate)+\ + "-chi-"+str(self.shape.chi)+\ + "-r-"+str(self.shape.run)+".xml" + with open(filePath, "w") as f: + f.write(xmlPretty) diff --git a/DAS/shape.py b/DAS/shape.py index 2918422..243ae8e 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -1,16 +1,18 @@ #!/bin/python3 class Shape: + run = 0 numberValidators = 0 - failureRate = 0 blockSize = 0 + failureRate = 0 netDegree = 0 chi = 0 - def __init__(self, blockSize, numberValidators, failureRate, chi, netDegree): + def __init__(self, blockSize, numberValidators, failureRate, chi, netDegree, run): + self.run = run self.numberValidators = numberValidators - self.failureRate = failureRate self.blockSize = blockSize + self.failureRate = failureRate self.netDegree = netDegree self.chi = chi diff --git a/DAS/simulator.py b/DAS/simulator.py index 3701167..75a6692 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -87,6 +87,7 @@ class Simulator: def resetShape(self, shape): self.shape = shape + self.result = Result(self.shape) for val in self.validators: val.shape.failureRate = shape.failureRate val.shape.chi = shape.chi @@ -117,19 +118,16 @@ class Simulator: missingRate = missingSamples*100/expected self.logger.debug("step %d, missing %d of %d (%0.02f %%)" % (steps, missingSamples, expected, missingRate), extra=self.format) if missingSamples == oldMissingSamples: + #self.logger.info("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) + missingVector.append(missingSamples) break elif missingSamples == 0: + #self.logger.info("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) + missingVector.append(missingSamples) break else: steps += 1 - self.result.addMissing(missingVector) - if missingSamples == 0: - self.result.blockAvailable = 1 - self.logger.debug("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) - return self.result - else: - self.result.blockAvailable = 0 - self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) - return self.result + self.result.populate(self.shape, missingVector) + return self.result diff --git a/config.das b/config.das index f5d608e..052f754 100644 --- a/config.das +++ b/config.das @@ -25,3 +25,4 @@ chiStep = 2 deterministic = 0 numberRuns = 2 +dumpXML = 1 diff --git a/study.py b/study.py index d74cecc..e1ce157 100644 --- a/study.py +++ b/study.py @@ -1,6 +1,6 @@ #! /bin/python3 -import time, sys +import time, sys, random, copy from DAS import * @@ -10,36 +10,45 @@ def study(): exit(1) config = Configuration(sys.argv[1]) - sim = Simulator(config) + shape = Shape(0, 0, 0, 0, 0, 0) + sim = Simulator(shape) sim.initLogger() results = [] simCnt = 0 + now = datetime.now() + execID = now.strftime("%Y-%m-%d_%H-%M-%S_")+str(random.randint(100,999)) + sim.logger.info("Starting simulations:", extra=sim.format) start = time.time() for run in range(config.numberRuns): - for fr in range(config.failureRateStart, config.failureRateStop+1, config.failureRateStep): - for chi in range(config.chiStart, config.chiStop+1, config.chiStep): - for blockSize in range(config.blockSizeStart, config.blockSizeStop+1, config.blockSizeStep): - for nv in range(config.nvStart, config.nvStop+1, config.nvStep): - for netDegree in range(config.netDegreeStart, config.netDegreeStop, config.netDegreeStep): + 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, config.netDegreeStep): + for chi in range(config.chiStart, config.chiStop+1, config.chiStep): if not config.deterministic: random.seed(datetime.now()) - shape = Shape(blockSize, nv, fr, chi, netDegree) + shape = Shape(blockSize, nv, fr, chi, netDegree, run) sim.resetShape(shape) sim.initValidators() sim.initNetwork() result = sim.run() - sim.logger.info("Run %d, FR: %d %%, Chi: %d, BlockSize: %d, Nb.Val: %d, netDegree: %d ... Block Available: %d" % (run, fr, chi, blockSize, nv, netDegree, result.blockAvailable), extra=sim.format) - results.append(result) + sim.logger.info("Shape: %s ... Block Available: %d" % (str(sim.shape.__dict__), result.blockAvailable), 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) + if config.dumpXML: + for res in results: + res.dump(execID) + sim.logger.info("Results dumped into results/%s/" % (execID), extra=sim.format) + study() From bd17c419e3500bd4ec2e423124f4765a21141d2e Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Sun, 29 Jan 2023 14:37:20 +0100 Subject: [PATCH 002/162] Heatmaps and static page --- ...numberValidators=256_netDegree=6_chi=4.png | Bin 0 -> 22882 bytes ...numberValidators=256_netDegree=6_chi=6.png | Bin 0 -> 22750 bytes ...numberValidators=256_netDegree=6_chi=8.png | Bin 0 -> 22760 bytes ...numberValidators=384_netDegree=6_chi=4.png | Bin 0 -> 22913 bytes ...numberValidators=384_netDegree=6_chi=6.png | Bin 0 -> 23021 bytes ...numberValidators=384_netDegree=6_chi=8.png | Bin 0 -> 23028 bytes ...numberValidators=512_netDegree=6_chi=4.png | Bin 0 -> 22825 bytes ...numberValidators=512_netDegree=6_chi=6.png | Bin 0 -> 22929 bytes ...numberValidators=512_netDegree=6_chi=8.png | Bin 0 -> 22939 bytes ...numberValidators=256_netDegree=6_chi=4.png | Bin 0 -> 22547 bytes ...numberValidators=256_netDegree=6_chi=6.png | Bin 0 -> 22638 bytes ...numberValidators=256_netDegree=6_chi=8.png | Bin 0 -> 22417 bytes ...numberValidators=384_netDegree=6_chi=4.png | Bin 0 -> 22586 bytes ...numberValidators=384_netDegree=6_chi=6.png | Bin 0 -> 22686 bytes ...numberValidators=384_netDegree=6_chi=8.png | Bin 0 -> 22697 bytes ...numberValidators=512_netDegree=6_chi=4.png | Bin 0 -> 22664 bytes ...numberValidators=512_netDegree=6_chi=6.png | Bin 0 -> 22779 bytes ...numberValidators=512_netDegree=6_chi=8.png | Bin 0 -> 22741 bytes plots.py | 51 ++++++++++++++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml | 18 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml | 18 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml | 17 ++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml | 17 ++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml | 17 ++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml | 19 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml | 17 ++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml | 18 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml | 18 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml | 18 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml | 17 ++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml | 18 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml | 17 ++++++ .../nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml | 17 ++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml | 17 ++++++ .../nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 ++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml | 17 ++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml | 18 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 ++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 +++++++ .../nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 +++++++ 343 files changed, 5885 insertions(+) create mode 100644 heatmaps/run=0_numberValidators=256_netDegree=6_chi=4.png create mode 100644 heatmaps/run=0_numberValidators=256_netDegree=6_chi=6.png create mode 100644 heatmaps/run=0_numberValidators=256_netDegree=6_chi=8.png create mode 100644 heatmaps/run=0_numberValidators=384_netDegree=6_chi=4.png create mode 100644 heatmaps/run=0_numberValidators=384_netDegree=6_chi=6.png create mode 100644 heatmaps/run=0_numberValidators=384_netDegree=6_chi=8.png create mode 100644 heatmaps/run=0_numberValidators=512_netDegree=6_chi=4.png create mode 100644 heatmaps/run=0_numberValidators=512_netDegree=6_chi=6.png create mode 100644 heatmaps/run=0_numberValidators=512_netDegree=6_chi=8.png create mode 100644 heatmaps/run=1_numberValidators=256_netDegree=6_chi=4.png create mode 100644 heatmaps/run=1_numberValidators=256_netDegree=6_chi=6.png create mode 100644 heatmaps/run=1_numberValidators=256_netDegree=6_chi=8.png create mode 100644 heatmaps/run=1_numberValidators=384_netDegree=6_chi=4.png create mode 100644 heatmaps/run=1_numberValidators=384_netDegree=6_chi=6.png create mode 100644 heatmaps/run=1_numberValidators=384_netDegree=6_chi=8.png create mode 100644 heatmaps/run=1_numberValidators=512_netDegree=6_chi=4.png create mode 100644 heatmaps/run=1_numberValidators=512_netDegree=6_chi=6.png create mode 100644 heatmaps/run=1_numberValidators=512_netDegree=6_chi=8.png create mode 100644 plots.py create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml create mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml diff --git a/heatmaps/run=0_numberValidators=256_netDegree=6_chi=4.png b/heatmaps/run=0_numberValidators=256_netDegree=6_chi=4.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b80a668f80cc3449bd57b378978086726b4250 GIT binary patch literal 22882 zcmd_Sc{tWv`#$^;%9JrfhK!XYqDc}GLZ!%7BtuAwP$)7bWR@gpAX8CELQ$s7MH!0* znG#YNA|$-$qP@R+Kg0VT-}m_a_uI$w9DA4BeShw?)^%Oyb)M(7f_Cd}Tgb%EL{Zd2 zZ7p?uikjy`Q8eug^YJ(9>fe9FzcxB+>~r4ZaLD*FVE z9geM$StlbWEpph|+3|#;tgQWCFOYFKZX?@bF zw)z%>Q`f$>x_RvAnO-nhYh`95CK_~JU7CB6bAR1iH9zA$!P#`>uUdR>zhCeB(D&UX z{nJy4E_Z@W-xd65YT!Jow?A4xXlX)~&TBU>@7#^eS_j3lV%Nlv^}CpURq9dd@vwQ( zoF(MXuI3Ynf20GV(`ZG+@K4vld0Oh~>Q)w)DNYU!4kNy0KKP?LPXMC`{ut?R@qfXO zBlXgavgR}S&s)ALZmo+Xx4z&^y!Z5qXqPW7973C1n~cYb&(Q9cT%_RG?(?)$T&$Jb zd+!GOx5=X|RaII|sd}Y@TlyArsV2r$rSE^V+Ob_VH!p8XnnB{Oc;#HzuUFDa<+sz* z)2Eu`$-jN%VD?E)jbZ%f&qTNHpEN`79(4WEawc|-%@xH^Uf0et#!!I`tPABlLJe`!$L#-)Dk2!>F3YCo6-Ujrja+?weM^75O4Zxy?qz6b=y>A9)+Eia)$SvQ1vk0Yj6W^>=rz&JJMyhn z;M=!vj>nIyl?E)#JX|lf=bZI!m6=~zBa0{cGm1vMyaWp3BLk%*Hf<8PuIQqssX2do zdaS7Q^=lqx9%lka^^ll=`-9UEga}HXJXL zy|wxDj~jb4Ob@@lyZE4`Wk+YHFIn6T4jarr>?t4re_ZVwEd0E-hJ;?HP`u+tgSFU8?U#oTNDBh~ipv|D^$hzV0-#gmd z&F>%G5vR1c|8;ufsjv?o-*>J((!_A0=ViId%*3v+E_*w>!Pom8Hjj~qb10fxKaZ9+ z(|g8CK~a%k!gcE%!*t`I9z}-_N-T@z>Bx3r2Uoj(*_Tu?@?dKHp+kob_SPlzzR6m? z-u^A!$~!R`T@9~a8xHiCxBBt!QIqC1GM>;@JOs)yUU(yfQK}sro5QH+8QECnk#Z-I|c?KT>4)}^S?{l z7P0zJ4IhrAYMKH0f~Up@ErPmSzr7FIYv#%Q^5siM7Z(j2M5m4tfBpC#VeemOmTYz} ze)WnQ`R;J@J)t9r=p!r$*cLpsqRVGGVPWB4Kl?KRLqpYHTv>;Gp&T3>Liyz8jSaLl z|5S|mvGK9n_hmnSd}X$=u{q`LE{64Yb8}nzd3vOA7vE}g3W03y;J{{PW=0O)P*){? zZN~Vh=i{T<`*0?1?uea-ACUz+*7|rHza#2bmwQPqp%_s#`1Mg+;+C`X?>~A}dGEjz zit2C9*tUB&yUBqA2?kR2se0lCzdCH+J+u#^%hSECc)0Ec4OZ9S$aO5B)uBU|++N~* zxBr^>9vBjGHYrIQUp0Bi?OtH#KykoAfx&0X<8Qc+es*+pR7H3=j(&c{St-29m8JE` z$#Xg>zEM$Jiq5@0rRUhTPuje^7Bu$ZG#kav&Ms15vnxVqRT$pz^}PekCr_UA7=E^# ze;~m)y`sdQx&Fo$S_K7#;_7N<%ZktyLj`(wUXjz|;o;H#@uMG}v!k;-BvmhIzL>ap zN>^}Y))J*t>;r|9GD@2_>lL`W*m}Dao~8!hITUq-ZTR5xC7*i#!2>m2-EdRmcMXk=96~~2{OgVsfB3NE)t$YSbqQOyJLlYfbtFB0 zfoBAb$6z~+@~^?IHF2AtG+navv|tu73Pr}cfhW4W#zr?tCA2%|SgWFywY5dfWjSR0 z%PQW=KgR|ljyB)Zo?)t~uHK4dn)h;V9_s%tFDtL9(Y-hbiDh!>#yKT%n@^vQj;7zc zx0yFQFEy1RAtB*#>*ICGQzLu6ynDn(Qo)f|xBuvP?T^jz^Y`z_X*Mmz)(l~f55CWJ za&&dASRm|y0?jZo&?a0RBTK#jhoE4nj}H}gf>efM$BvPOlrbv|MR0W>oizv_r1m{= zU4`8YsH@vugM=EfWOK;_>*~5f&(qhGJ&n7zJ-UCNojgoi;b!tM3L7_WN!V>(bzT%- znpMUm*Ju7heyz%Zw>ivgOO#aA)#)hnfe!^JUHk!T!mK##Cb^C@EBD?j^JnIDL|zW_ z+kUk&LO5xAjEt79ZiOEsS9@32*_@-zot47g(oSFSSVO(_;-NyDc$O?#qTuyQfk)Of z^y&tOgIyJ2l#iTcMf;Dh?^>Rml*Q?}qi4o&=0m}0%bDpZzKzEvuB^8Y#_{Va82eC) za(dtV>AbKm?_WdP>{{;A;PnZ^$G9U1#Fr)x2uuksN$6EF^-7!9oG~% zilb_K@w4Znzy6SVbz;AUAG_A}?Tx2Yf;YR5FzBRkVujRFbfQkL&V?Gj*wExaQP-1!!ct#)=HvnQXsJK4E80c%UFkqFFi+p&Y?Q*C^N zX@R@w+O>;pYU4BxAC^3R;>7lX4|wkosXuO;SA;IsKWXV!bedPjMD>a5*WKyH>vqH| z3nA~d+_#`bk_r*_8mF21IZC^GsJ6DybMl6PREl@mG(ZM9e+aoSdS)Jj)KNv0{EWh% zQb;F$9O9Zc09VEV3GUm!TaSXi$34Sm*mH@_cRcLzsid-J&lq)eb@{C`GcyN&{HVAr zXE|8EO}Jq2`^pVlBu-#m=K1g`opKEF6jF3%$Nweulq? zL;Q$_Efl+)oE(4m+4&1OSy@?;#HI(GP0WO6OnU8IwuzlewDl7e?;XRVssLmQQCwZ>0e(z07iD6gnfhVrE7jNCX$s`~kP!A9s)^+IR zwG~t#wou!;JiZ(G;AsAs>~L#;LrTcurqsx)7cZipHyz0#PnNppR=9y-eeEuUzkgIz z6!0o1fEKUHufel?Dqi`N2ojjVr~WaeHHT{0sj{N!(G1SX;I_tLuO)tx6Ju(D%Lg3X z;`$ql!qga?eta>qu(x03I`CnY-*{VF#_6$dfAr=lv+bvz9sKpx!Mkxn(4lZ*8KOyI zvloCTjjH9%V+gb#-&!ZtdRBe=mi6e7Y-Yx|S?;crjD@K-@soEl3XKz&_GuJ+f4Qk) z=1E>&0t$Jq`>51>Rzb<==Jfr%$lEC|tx$ZkHCNWRWLgf570mzze^EuA%{)0^ntbb) zLXy!sR2|>8 zOINRkeEDLRZQD4%IBIcV`GAYtmzGRg;MQ^hhkVg!{D#FyZ~f)<_E#!0cbRQizI;K1 zu!<%SgQ#C|U*oNgo}OEy#`x6Bt1WyrCoZnobKkac*_ZcuTv+U==bKRe@zF;G`#*gO zxOPpDWL;!u*-^z0A3k(Xn{2RcNUrfjJPITxCbFYcVMA@dghWI%pHezpCz3z>eC2ri zSvK;Xws#M?x~`{gpl~(tl?)C#q7I2JTQ)x^D2RcPamC)dwfxE+xtcMfjcr4yW}P*$ zYjTfwGofIYa+cCQcJA{<+^7MJD;cKemS^Q|u)q`UPBZ9zn{%gPjHF-W@s=WQl>nB- zzGY?Vh>y)B9V%N zl$pci?e!olixe?(BBBmWVLyZ?CMNb}9;8218y5yxc(Fgf+-tmJ!CKn}^&{6k-e#?u zdaKN4J@Mn6L-pv@16hZ5hE;Mc+o8H|AKzn_{+l`X?p>xXl%IOY{6H*j%F^T-i}L3A zw}1yyjdMOTUw@>)C}|(M&*{-ljRlW4DJWd*b-itnrk~dJ)p_GBofI{MJj6uV^G25Msx5Mec3kf?KfDnby@j zO70_CpQq{Le#u>3ca#UGD&on>fg??|RaKIs`PO;p*N!ybJJ6Yvy8qF!AWH-psx%AW zR(e^#L0tcbTqjy(W#y#-3!3ii-Su`RyPtmNvw8`r(Y+112 z9MkeY%Jui`sn4?6m1-bm_cmKwyianwv-4Wyn@oo`0Q`ngvcimX`C=g(D48oQ2;j&8+= zN<|YXw$1linak;@Ht(6u;es1|zxUJ@IkpCy&(q>b%BIsv*nLrP$^E;T0@hPc-G2%q zXk<>7w154&u>Dy?Rzbn$Z}0Q=bYAY17Z#2`e*L>q_k{TV*W(X)J%yfs|9Nrmkm>+V zt4>B^qn+Ja@4_!%zgFA1ELJ+T`sU870q9f`?B6}y_vn}qvWy?nf>tGqpaMJA;OXgs zf^&FHNqIRvx;lhf^CTx*d2n!WUCzebhnpb^2-QL$1 zw8rM8`PjGCmb??oNx$RgN5>+hxX8?VDrZqYYUp#9g(pvradN51%geL#@C1yEIR8So z(LJrSNl~$+v~;WGuYFDjWMwlrYiaAID<|BtJp)48qP%}~2_Jr&ZJSo9yxBA}F*wSn zQ(ZURu(Yv}tIccDKCLpw#?HbhZfeKHu_t>y-Z!P~;o#>t{+t)mmC@T%Sy{ONP-J!0 z=>to+r*`7ZndVhck8^Xi;$uiRK|7zt=lb>QBWxX=>m>H*>z|L0H|r>(O#$u1la3ZM z#dVkRyCcJ5g)`HqS%j7IO)7b20{0miC7?8?d=TnFE=@JcI^@612Wwt*B>upC!UU?75}e(1p~9E^(XAb3___`!lwJd#iTgAon(#5cYqV~Zm zF)082J;NHySU0Z%OarnG$jHcOy09OOH)%D#zRfv(%t3W%(sT6lA7NwtKt|oVm!40y zuKZS*os;wGr?J7vcdkW?{BSBd(M$2K>V2HwoO9%r{Hc}ut1qpp9-Ukac;xcpR&ugA z0z2iNab3RK38XqYw1M^eLqUEdqLpDr2`k2XBnw~2vZ?I^791QMO|RRyQhq)=_2E?4 zLIOQOs;P(YtfG{(`AEt|UdmC+yckndq;fYs9XLr8t^Zyrv&YV9Pw(X&@7BRKoA58l zwRuJqed`Ew>9wE2TY7L43NrGFS0_-$zO;L_ICZh7po z()aAy?deh2L|iDreR@iG49~GE_(Z zj^pSLe6$E8-irFSVdeUb%9(9PXF(Xuj}l&OjcVY7q1)r}b%8Y(KZ3s}n# z2bu1pN5W+K0PC67uV3H&n7%6uaSvo|XZImLuS}uXW~Sayk9#p~F3>*bWHYJ+(#?`K zP*1U2O{9VuMU1ks=he)1FgMg1+A;;hL09o=?uDf(%v&5J2%(|kU#uQ-1tMKeFoRu&?hPZ3A4QQL?o#dT6)!19Hz=hYx~);A-fn2n#s#t49S4 zPAl`29y1$TCFzL}IVH`_ycq>Qu4L~@Gtk-ocG03mgh6V_vSGW2ZXls&J#c}?M0X4y zx)K0fe^icx*r=tKPBXBur~?eFcKK}Z{;>-)8b=_`t!b;)p=Y4tSUA}hF7(gISqJdx zhY(Ic!Xa2^5M)@QcGNQR31}yR@t@l18*70L2il*WT|gMC+j}#@1vVTrAL=YeW=(6F z_eZ^)$)1}#o<6jHS9fQxEb{z~vXa_zW>G-qMC3R0PWPSrAE6vzcZGUC6m0rA(kK3E z2(1=j3>L3BbOSK9_uV7emvNgzQ2HzgnmlUDBYRcC%8l$67C#Mj(rtaZ9Pltxxomh|L={%{}r7WS?6N!OP* zS)@owAtdj8{G?HMdiy2mEl8k*&kE&V#{|kx-PoA_!i5Wt-#_iVw)r%VYPpIEfx&?s z;)C8ZW8RX|(&~hLZZD>>d!Nfeny~|ksDEX5jk0vIRaN>yA4E+%tv^`CKu1sCfpsUi z`I4;J^n2|c-G4;N`RtnMda}F0sAA~U~$0H$c2rC`Iz!Bn@hN>*?iPJVqkZXLpi zMs>&4_334WCHx)^OLHb)(SL^`Qdle`C)6`T^Y zttuOq;1o@4DcX6oxG zJ=dB3=mRIP5)W3V0c9gn~Tc=Jbn#T-ee6k6?@!zCm^s&{lS9=t8E)3#wRCB>+3myo6Cc^mM2fC zF(8acpNowU2iYT)e@{4aqwR>}(r!U5WQwe|Bw zwj5u<8=i7=v%uOkY_<;4Qo$nyt=j*vcT|_#YM&jAgjm*|eft8z4ud^Ed=aR;6Sbsb zw7)s>%9Y!hgLlygLJW$$c+u*MV~})7^vb=2ctx&)t~Br2vuCr96Qvqh^(FW5W4s9; z`S{PT?kqqKCNz+ij*c2i8{UnHT6#=mpu2nN*Ofa>P2-&V*R(%-@l9Ci6vf8IR`7mF zu=G{-dFYG>hlV1Lnb|Pp<>gh?);3QlC0=}&_~zZa(hnaB%Q8`2EAZ*NA00b@UGckj0$@S(OJZVUgHYftz~ETN-MRa1)dJqDOiO*% zuV;PBc7gH0g@swCuP=JYeP^s~MN9>sZu^&Et2?QQGZnWDq}Fj34?lnTvV!PYfRIl* zx18T1M^04s>9J!BqGXFq&>;^Lj4eU;DCaTmh}^g1%34PJg52k(w6o9{&^(u*U-O*& zvCgGe{lOY+(a7gl%;5EM(R*}uc9Q)=DZQ$=R*H5ufEF)a92gYz^u^T;9pAo%gVUK+ zWO6(k6xSeSe*E~+9PnCe*RE|S?wKG9IoF&E`lz*#W}Q^w^LHVy3!t0LXIm1ARwzj) zT8ao1;Y&6LqbW8}m@h94D}vP}aA<*NXct_{GlOP4zLiV(uGL69SAYf65-5 z`WYNSv$U~Y@wahdF0Jg5pbK`+t&fp$d8V`)>mYVvv1J5}#P?Dea|DYRb19E1{uQgY z^+w<-pAkW94zgCjf#T$aPkiv7fzm8;#Cj}Hx}k+5%}-!W^kXdzw-i8V(gchmXnj%t6HwOl+4 zHCB4#oVIJY;-62pq9K!cU(92xC3CN0;ZkkDh@1(h+QMH z=05Y~>{-W##2StJYLTo-`N1Q6%mvpJ=AXxRsw%lpkAG_&@(Z`5=qst`OR$Mpgbu!c zd+$9GcXvxTU#2TLO;i2*ReD=#a#*i>99d0!aTCe|aETG$LzqTvGgsagva=K1Aylz_ zRrbv8J?G4o?D_ZJHMNj&Jb1^;as}=3Gw0XOEwJX8oX?kem;Ukl9M5W^v_-fFDqf|? z#4h-~)USt3i?7j3dw-d?Of1U)Ef+d<5-F$vq)pf+>`6D&)Us5R?oiF;GYI+;{6JJx z6og?gW70DD@J>0O$95799_NsNa5~x0)RvMC50aI|hkQ4p>p_!}7FvS{ls3+0AYvP; ze>+$esAwNQeY&#xxR_X@CGTpE*c9rl!pHbzyR)>%5a}qu5E`ybdG&=I`;VMopE}{m}QUs}^FIsG2 zVL|yo))im3jvHS=Unp9~A3eGFiWSc!1&Kcjwmix1(TTs zjWOP1m=Rk@QE6#u6ooV&=5A_g+E8fI-Q6uJE4$16T5PQCjozTZ9U(X&u_+4$*0)3B zDF-D!zln)IC5Kz;@1KJxB76Ri$81*9qI(7!@$ZaGkOj1ZMRf3zW_(1 zU?%hBz#9Dw(*mMc7uVLZ!6HN0>!FFBc+0Xt4vO+uJA+26qbov16E+8E)IK;dI>HT?qoL|R1w}VQl(Pmo&;?r|$!kU|2?INp?a;Oa z8X8*svy9@)<(1amXxw3%Gp&{ob5TvHz)qQiLtB2$8er_Y%`m$2hi02@*WKdb_6v<`tqvk>a#gHF8-FHrQl|f0J&eMZ0EhU>7;Iw-S}V!n)EWn zQ|-rrrR8%=H}Zz<0u`y%_d*>W0H>YAmSP)%mBa!h=D zg!lCKcs{vI`*e@yMN4L*zHX=BdTQqXFH?zBF>kiIc&$ zl)T;$jF5w<612I*`};b7`AZ|Nst_b(7IN>xi>F35Ha@u?no$eRh; zb?veDd|(9ezo$>1g3Y>hCQhi2b`CUFw5;+W{v&d-;mu?a9UN^oO9F%dJF%9KJsk>F zjITU31+}a$<&wZyZO+aZ81%=#_9?{a-EHAM} ztx~4FlWz5zHG7iY!|sG)neuw$$!~(FR*_e)GNb7Rr@I)vV+LtHuF$D|C8j{57Q zTzH7WC?A3DO$Ma;+20)p-+DVfnEMWw9q!ZkjT7l8QRh2s6zDD#VtqHGbZ^Ss#^xL} z3|b0&w<8LT$51&h=w^*_TG6w=k>?S~8+E1ERfA(((&{!g9r@VZ{l{-KudbdPg`*F* z%u_@s+DjsVu?i~qpbr1pR3P8U{g7@ayfQo#$SbS{Qr!F-j)meiNoXOs!_Tk~ECaNg z>OYT3T!yXyOUPsvvg2&lKajg7gOCkP|L(uCs9g7T)v7;x0diUpH?trXi){s>_Obt? z5AMt`EWsAxNc5i$^LoD8WNGvgi9%rsf8obEDRmR!HVEc#^2vdv& z9=c)rZ@@D4FZ#gX^TzMP!{=jTkw9XTmZzU$5?a4Ug;stoS&B=b)dC>WCm^B1db6P- zTquN*Ygs$YKl3R#bmviE^4ESwg3z9f;}#ZX10iW&SXda~$*Dd+asTkGcPs}{_{c-0 zy*ffD`V*gOwtyQT?qkC40&8asZnQjj@O)&Xs67ssd+254=%*yT=;NXFio86-9$-^N zH*Q=^5y_Pz_AP~Fv)ED^eqb=xVPRE*jGF=RXFmu84r`38*=xzksj)V=irCtp`LQGO zg7(vyT(f44)0Y-Gx&;da))|Uf0?pc%8WrP>39b*I5u?;()TuyfTP1 zKj#`)GR{XuovlyWhU6~<29_8&k-W`Is)9mQo4rha%(YhX`!kBB6=CTZl^2Jd zAf~N9XrL}jbKr^78+z%}ev*>Cf2%W*Svai`e$DSCCd*@Qt``|x=HzH zkaAu6F9juvT@bxTt7S}bNvLMJA=;Hx^$9{1eExjIm$cZkB-|B5o&~(P4VHlL;Cjl+ z%M-RmEV;=Xs&(j;todxyYqgd{liJp;jB{w?wTMq}5W_Y)sp;oCq@NZg9WD_+f=-x6hd5+-g7W#nZt;DlPN;WE0=w(Er|{m8BtN1;;2nt&`_gW3)BNp!Ltbj)8yji zwfW3WTpu_DRrp;$G%JrJ;eEF=W-4qWp|M=8ULVl2P_y4&v`b(+Ha= zKlB8G@JR5((Xr>;HVFYW9GF=iBgqIFq~Sf2pz;vj(w8q;(I%C`vPoQuX!9;BDv61O zkOvH1wsE78@waj`dCMA>%h2sKCg?Z`iq)lWbe%mt=U|qbM?ryOeX6`% zY-+_4+SF>z2LzIY-h`cns5O*1;5}(EVN4nNbk!jdcDiNZ;el1h9eGycY{C?hV0edy z($mue0bdNbQwMJwr2C4pdX8u3)PB<{8fEgOj^q=Bedzc-19UX-u$^+iu(Cxaw zkN((e9)d%nbaw762T&qKd(SyF31J+7+2=kB51}Yws_>bmpva(S`@-vt&)N-Y@tT5@ z+T#O)92|?65LnxOb60#gPMnCmJSWPSCa^GweR_xvzs9>F4maKmOWP`Offr2(581AE z;?;oSMO-|58;%Jcd3`qs>?F~0VK^n+}S5U(S*#Uh;tee5HbJ9DoBZmRhJWZ zs~}2eXE!}|!qVP;;kIqtxHQ!zP5>vbnmvV#qIGDRRxo<}8ka+6rH3RF)A z`pk*J_ATlf8Xdj$NyOL8#Kc6T4xqN)DPs){4a^+SQ+SHSj~v?OQ;;$Qr28(4gGGz1 zCw(y~+$bOLCW%Im^*6HteYkggf78+eV&%zf-hr(%jM#>7MkpV63Sh%xLze6=X;gQA z2s>$5C7i=#9Efy5&8DY!W;7pZxi3mMCJ?*X$6EP8$`e-#iDFRppGS?4&j#D4Tk&2c z2pyf8>2w?`B;(PNo+rqy#H`=m?t^+&R#{mJxOPkTy4sd4G(;e=q=f+qF`S&7EYDS( zpRWXrryYShYo@R)G3LxX#c-Nm1K#mdtQcy5Qeb*?3d#osAOGp{vy!FfguNtlr15A1 zvxU!d^bbsHn1f1iFN!lE-Dnc#1yWwtJ#qVfvnged>3>%l2xaE#>WW#P#?-FvZvUpH zCiy=#g=oov!jG$G+5F))@lE-TLML)2&Dsodj~$*#a1SkG2%k32bWc<*a#9*I{%JJ7 zqPcl*l7fs3D^z5UV}Ilrhk;K@fNvEvf@aTt zml{-c7=&5??D0Ag+)VVa4#Hi04!*AZx;$v^q$MWp0z8Hww-#Vd0lGy1Qzb7@0~W@1 zyS8@PU|!%yk)=yDx;6nzB<1KD7%X}jui|k3buKzHEv~BIyeCh(fF;oE`fa(lVjGFG z!^F)msO-T9l)vrRF&P*i#aw1EQ?={X3Aj)@qW79UMH|xb^=sI#Umoz79uEqJBQJ8Wg5e&Xclf0qeuy z$Vk(q3rJpo6Ahe3XcbPvPaAP zK2s?nk`S4ok?BIoU0PbID5K@HZqFg~i~6bdyu6+X!)#beGNus7H-YM0U{cLF zTS0?@gG=(=z7M|IYxcB4^HIF8J#CGUpdjhPi8=mOKYQ#_E@v76<8!PtSN{-(B^PDx z$d@AT8D$U_ZnEviNdu{Q0=*m1@j*;Nk^BdRbKQ@bezO^QJu7u9U7g7VR<5oOD{@uc zl}S&q7M7!iWEL@b5%EV9f9c0(Q8buK;{_yMzI?f@nVud8X7Y%pc12S0JK+gJmx+o# zZ4zZSqJ!$PHUPXa?Wu-Vk8kfchHYX3OiDm-aX-G5n=;2)$`(vbj?q$pBjK`z1n`Rm(t;+k6}EZrY-zpoD5%=mK_Y#eGx*5;33W@2*uIb!<-(<>0S z;%t4zE{GG=Woq_ot^paUUmYWD-#ai~*IR6`{cBH~SsuyG;Fb z!3oy*=`AL&L`19E51yEujQKgEZe_lsvv&?$A3$phrJ0Dqk^`+z9t9EdMtU|I{S6oJ zThfFyGk%0JwwZ`aCC{5^*dx2)G!a916OtF+Z(x3A1?OIN zo8^WBmm2IiC#=JzLR{bIrMnPz<=El-WL7pnTir^JhUuxZX|)TVY);+u)}2DWL)o?_neP61#X;#m!~9cyXJMhszy~49@pID(ppg16 zoT_43rFdha7|34%%Gh&G)oL-ppL6t)mBnub6MuY5+Paz#_|lkQA+2(n^o9+*b5Pvp zFN}8Ru}Dy8P<8S7S)_aSx`NZZm4Em@XOCB)Rkfcqj4ItJ#Su9NFCh6WC>C>VD_W(Nbha z@Z(1-upTjPrr=Bf#RS&6iY2vQSJj$(A_PqReT%JO@?>oF)G4iQ^ekma?U3?WQ}lyS zlf_{n`OUkl%W~suNNmR(u@4d*f#6^cpq0X!+0xIat?OuQ2=w zAmPyzv^=m5*%HUw$A-fyCf1-0+3w0(+Y;-T8irZ=_G3lWfnsQ@49v`p9llm}NKxq9 zHO;bofK%5!cPp}+Fo(L!5&52BvmJ%SgN~QHN?G|sZtYo?fLVpk;5KwCa7}%3`)5AR zsYma7ZCP&Ur!{F&+RBI^H2W-nes3|c>sG)$=+GLvNTvX-M5y=p_;^O~qz7bW#4ZSk z%hH|zuju@_N!wk?ZPfo zv=@{eGjU%s_fzq*sGTuCC64|JR}aPSH`Tw;2F>ih{M7&Fv;VP6{Ph7=mmrP@pzGS2 zW}ud4Kuk)TPJX-iqvz8nF$j)?esyx%a_W=@5y>7)#aCDijo zbVGy}#Rw}!fhedzeaHk^E{JJjG+LS%yxb|cj-$T%48EDwCH(R~nRY@HVYse>h~Y>m zlqv={v3-P^NJOE$$q-w0YL^45hE}R3n`u;S2aNmKwPN43tm-r)yh5jIQ+BPlTk3<2xCqdbI1I%Kibp|2&#lS z{_mJO%DP<|CyvNvDgTw~r+hGqS`6w2oda|^bYPN~WDXqZObrU%+I-B!6{IJrRNJwK zUf;a_mT>fOq(A)**g@0cKPB-0QJ#)9bD*=@u!5b~O@L%Rf_F*w0yh@b&Km^0z3|7Wvm0 zU5NDZXE1*NSi^TfP5gZ?i^PWV1I3T+xC!_NSxAdfRAP(^7go8~vt09M34l0Mwnax; zAMuWY7`KEPNQT@{=zN#$ydr{@5P(;#dutSIgmKoPSP%Qb&(Q1PD zlyw>hq9T*;a6sB##KG?XJJ=}7F2872TGLDWTMBLxjg0#(L5;Y`w$EkZwEXPXD%30* zOiw5Lk6zrROY7&Xrry4JLuLYravE!#u6gjF7!GgP@WsCJ zxpzKB=ffo3ov1fMzY}+C;5v$}09kdn|5zz)lFN>%Nj?lCvYt7gFq^o=t`|&vx|(}( zU}MGC|D}0#UlWvXWe$0oKSLlnxo%M%#?$9b+aSsZgtn zF&>7XSjuyIsn`Q`g1)7Nkn{k*6x>J1q$-U0^PkhB_CX0TccWS4 z7zg?^Sv#r@W67j-q0YmT3Q`hN*S3QFb5xFgZ4@8|*rh(FLx*lYJqVo~>hLTk$l?XM z1EXaL*67~^`AF{N#Qb%XEX!Ru5Ljn$Weu4NN4`HGHTLhRFs+AVus>6wyt7!TUO%Dt zNj}wPI0L(>1;~kU3}th$v){;6!Lfo{n;4d!{|#li>;9=s1!{#8ow`Q9@4 zy$t_do0mBKSf;zg+Wh0Jkst+UfQC|Z{gSE|cmBK&E*tvKq{6!6$?D6BN$!|UhlzsT zH$V^nW(3L@kS}7{exEWPAGLFaO6&Gh-Qjbmlk}u>5&K)9U-ejaBg=vq-kH2#V^ys4 z13z_-{QP{D``%I4jK+Gim4>?(^==67G22mTsPvF}PUsK>JISn1|CuNCn0uSTs*Q>t z%o&=F`OU$B-^YEn&G;u8fgXEdE_Hq+K1}*q6!#Zc)KsnHQ7zC=`>l=tg(r}`dFIgC z@gzgqItw|Qb-ccpHvKnLa~z3cw(J1+4eHLV7!+p?wS}Tm%8^@%G3TEagJXVm=>jpo ztsMj`3RP0_G#5AjOGYZ!KKpI?_?uz$j`Lw?2!6SnfMZl<}Y@?Re>iN^=N zc!TwGFA%4r4qQ58F;DVOk60?bAL}X~U&b3>&?){^2M+b&o{-*GcX+|sLb$w-ao@0i z^T#`OKj&_w+iqp2mOgn%g!l&EKC~zF4MJ}57sU~e*(`z^jc$ON!TmbgX_Noa1t0wW zy$R@ID-X3*&L3Eo!Uv5R&SC(Rg{}+dxKL?-+=d}7eYeR|je#UnTsR>Lew~&YhltaT z*oJ6o4)N022YWf;4VYd(sR@K|{axdzJ73 zn_pH{QPjsnyoQqDC2G~S_IG=a(p~Q8mtc}INN3;md9kIhMnY9%n!qE4*EKae!j8{1 zKmCgY3Is{h`{geU`*{II(mYdwA|hgpm&dKo`rg5$dHlZbXie=I!^cezuQfAL7(M{p zXE}Zhxe3;tuAU|##rSGuUkKj()*yB+V|?Rf&$34H=p$yBL%OWw_F!ZmhCX4GhAicy zmay8wY9=Z+mJ!N62yCW|Ss44I<%$6m8p_tz7SrRm4NwPX{p>~=+27J*TrMT* zr&-NAtp3xzVBxFbv9$n3m?z--rML@YB}{NX#h>1R5ri-!<$ort{z5$ouP1duf)NEz}aR;8^_Q*J}fx?MTEMUrr4DjELm&{iJiMa^< zJrN^;pviAhHz0=r<;&SS^7zdnK!W8_F&er$Gf$%um*P0A{!jjKnWU3peOEDj4KKO^ zSEJUrdw&}=IO49^9)Y>``4r)sD z_YamcK?B&Aq=eg{z)V-71#*ID^uEwj0Nm#Wy^Eg)(9Hk;F_9z&cM#*EY#P*aVz&Uz zT#k!)LWzh7k`06Ns^FjQA8S?2$BiPC52m&kf=5BW!ilkN%g(A7weS@?;qDwV4xaLj zSFIQlCmBZsZ9+o<0T53!*%Nr0Ed#bEuOW!7AQ|4kIt=*3aCi7(yrK&eylVX2|I-U) zmR|ISD0FO}m8qU246i;C`nNZ}tHzY>+# zncf~4Xe$4kp8+B|`s2~PHN5C-h}Z_-Go_Tb`OU=lo=n`w#v-u32AXjn@lfEGpmdeM zZB&nuXG|s)gP$P;RiZ|Sxuqp7DIp^5wKX zBaf9gHD1Zs7`u|>a@kniqeCt%LjZ(k=Nzt|hwR-j^KMod(Yt*DTqS-Bd`pX8MX?=a0E2Gm(;x*y}gIC?cedhjWat|3t5L)T`>DhN7)KhK(FC*`P{TcRh7ae z4a5}BfXD;gbi*k zSdji}wiWtc-98z~;*9GV5v@`uym99j@ktdN*d^SvXO0>&?G#Pqoel7jZ=mc+_x$@B zHngu8qa?%X4RR;Hy+`MInK4P?fk{3$6#TvepdOHfhlpVhq%e#}ThTgvYb%l!>iYWC zzJwu2T7aAqt3((^K(n8PsR{#w7zzw|@a;z|k{vGJA@Cdu6IgAGv0kZ=L%eUp1Ol#( z^MQdN2|fmEQ*vvJ@71dUXs;vV;=;*gQN)0Qvquyk7_`aVD44Ck^jWEuUg^ZA9g>TJ zIo}})DGG-e{XYbCAB?_%^zsE+(f7lb!)P@*YVzdSOL1r+*;V2OpEI>8GlH1@{UfLg zc6%ap<21KJv?4+^;p{QZzDMzs%FF~C(mGKs+mQ}{Zq;%1fKI_Tu;g;MPY5%+3owy= z2HY-OzyxDJ)rwyE1Fr2(cy$|o^xcXt!8K3_FN%U>47ITEDGo92*`p`d-eJtM1SN6h zpbiHIOfsQ~p>15PDZK7IO> zxQ$@NTpRwxxsMZ_YDa(n%IH_Pn+G%wCO|ol>L|R)u0{mqV|>JZ)qsZij{+XB6oeHxzytnVf23C^mrFr zdImE`G;u5h>cF1Z}0D>uhHz^Q0I!qX7OMU># zNemV?sLTsyb!_z1wFRa)9rxjNBn@Qd$rvkq zZ9|y4NyJEMLvjfGD9(Ki^kfp~#+I|Y;U0mI+75=JSz#}^@5Zu{m3T}M1IQ00D6eu* z;K_}R=mrDs+*zp`rxb((Lmas&70QS$a%l$c7uy2Ov*|PG(msC<#=#~xIU?8~O>Ber zi&a>e1-v+<`@V^2i3_tJUS7_*cQ={+B=#u`w2&(wphmi5*leg7Z8N?OJM literal 0 HcmV?d00001 diff --git a/heatmaps/run=0_numberValidators=256_netDegree=6_chi=6.png b/heatmaps/run=0_numberValidators=256_netDegree=6_chi=6.png new file mode 100644 index 0000000000000000000000000000000000000000..82ba2c021373e5b84c2d5dba93810cb27f27b987 GIT binary patch literal 22750 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 literal 0 HcmV?d00001 diff --git a/heatmaps/run=0_numberValidators=256_netDegree=6_chi=8.png b/heatmaps/run=0_numberValidators=256_netDegree=6_chi=8.png new file mode 100644 index 0000000000000000000000000000000000000000..bf38e2cbd8ff5472f79db74f8742b1ceabd43c6e GIT binary patch literal 22760 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 literal 0 HcmV?d00001 diff --git a/heatmaps/run=0_numberValidators=384_netDegree=6_chi=8.png b/heatmaps/run=0_numberValidators=384_netDegree=6_chi=8.png new file mode 100644 index 0000000000000000000000000000000000000000..52d8d0293700af0d1b249032e501c0dbca089033 GIT binary patch literal 23028 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 c2&T1ZIkkrh&#Cb&FH~55>TC(*OVf literal 0 HcmV?d00001 diff --git a/heatmaps/run=0_numberValidators=512_netDegree=6_chi=4.png b/heatmaps/run=0_numberValidators=512_netDegree=6_chi=4.png new file mode 100644 index 0000000000000000000000000000000000000000..95e593502699d431ac6046fc3321df5f5a0f0fd9 GIT binary patch literal 22825 zcmd_Sc|4Zw+68ZWKM&qP)UY_ zk|BzW-#XQ^pJ(rPzwh_^egA&__TFvXxBI@X^E%GsSjSrHI71C~Ze?cRXP{6h%zC<7 zMidIQKZQcoNl%A=S>M$D34d+!&^Gnh?R?PVgtePJWrwwg%MoXfBThELp7w6;PR_^H zNw1fdlN5IJ@NjWgl94(3uQy0LyE(|TS${9Zhb(c?HFKv>Sgpx_scxy?bfQp9*_ThvnXW!Jukzr~hT2FSZ^P)DPrnc2*S8fnps;reJlB?s(ydhjJCghf$mZ~^E zbBmX(oSe>%BYkbTD}M@YA8!*i)riu$((IWu!OA-3zR2RhRpsefi&l%G#%C(-!+FK+ zDn~gr>8V8VCy#%_XBPhu{Lv3vBFxUt9vy2R(Y_rS^A zPm=S?%ap)zrM9*nK^`=Ql4}C!pv;d35Z9riaG^%hq>=?l&#_ z;%i&7_eEd0a3ESwm=Z3i%>Df8##V`}{lyPkdfsI1?dePM(|L7cN7vV{`)u}qJUuOC za>q0vB!u2)iPN(`_Rfq{vG%v-EI&Qjwb=NU!Q*Pfa-SF1HU+W>DkUF!b9)jm zcXf3IeEMXUo}QkdtU#%_v}U*L$?tZ7t;+-jnU$55KYjkpUviA%FPx`|#rVvU67u%G z10$uoE!WoQZIa*Inj=S#YU}HV^Q~BSr@C5;N<%>Xbo;H=Ck+it%V&RHr3mAa!c-4d zhp<=H*6OsE`4+$a!CmXuQyU>)_u#~^C6&hDhvG-i`gF9lmu&H~&w6uc^wSfLz?NSn zm3<}0J}6zU>nQWx_o=sciAYd?OZL@~i3ypX1stn(hCF+wpPe^9H&I^s>ecQCPOo%^ z6PWEk6dhkVSMvUmvkbq2qd|H}a4E=C%iweWlnb zqQ}Kotx7vJF@$$)esg;d!iPdpJTWAobo>jggM-85^tA1dFK=pUf8q|p1vV`e5)v|y zh~-su5uTfy9u}=T`u-vFw|Du0_wTQ>*uTFid*4Qj0+*DwzLVeHtuOiY`KrtDKF57bYv|3A!RaB&)a%F2PkKfGbVmel#@GI*NS2i`VcXV{{BG!adypqR` zOAq;ad~J~$ANsKD#fulWj4~Kf)6&9bx6eKLczVmnGGD_|@8gP!iWQBGtW8Z#Uf(~3 zwv4Uy@lE=sDRt@k^$1q=8Mf1>Pm|TcLz6o(WI-?T;BJP&YFY1b$C=5VD94w{R00A5 z_k5>4DHXT?Hcn33y?ghrj@_nk=rz5S-)#PiK1=S)moKlzAJ_7n9Oq2)k~3${bar>A z?)i+U_Wbs)t5JPka_I~Ok0s8fKe*dJeCX=$4>|b!iZvcm^IYuOy{Xu|6o1_D zHuZJ;d(@8}J(_#qG4<;ltK}bk#+b49^MB4`qtG)joVj?B10T>-?l*6rJErtExtd=&q*tx>6mTkjfV8s9R_ z6(tEIa4{=)VavDokK{c14ZKdCeEj$^6*Ip=h5G!jMjo}sW+aVOFOt-w3JMhQ4PB!> zb><)U_r_kl80hrsMpx`!%Yd}B707;ULPC-FWUfsnt<#TR+ET{G#^jE*D~2!I$dZ5P zjl5}Tqb-lDSp*Vy>dxy*37gyxMq7nvl|1rtEyaQr;ZQs z>^*i&T7KQS?R%_x8)B&_{1J2{3eK_!ntw{*mNGxk_u_i}vu8nBS%)v%nqZ>R7M4{iRaI7wOnuFCD%-)f+>swYYH$(v92yfv>+bG*#1ge!z4n%2S|_5-wl31Tt1`IY z_*ZV^`Nb68O>SaC?S+B+i#@HebIto0MPA-_*oADzQ+1Yk%SG`W_iXD}e8!u$7WhtY z`276p&EqqPs;BOGelrgjQsqZnqTH<~MT?17mO?Ve;M@CD6u-G&t5}3oLR@=lsl29y zd?!b&GZV|VWk|%-GxN#QB1hlL&(}tc8;SCpp?Q8~{n`(V=G!teGn*Z5muws3D|hLl zCc7QCVe|dd6BkcUl98HL#nD-|TTxo*20$D^?}>obmqgh01??I1Clo zrox{pBqE|_xO_emRh5cTHrdTsU0a)KResuQes;oje$H3YqJRzHKxt=^8uP}D8z~jt zHDTnbKRDdVf;=$!HK+U~zRmcy@e(Y{TDQ_hwP~iGKYu1Dx{A8FyIVUuN2#9rDJ&_; zw0ZO9kg%}8hzRDT92`xVyI0NpeDCbol)8u_EG5O9ZJr-9S1>X@UX1{dJ<=v?XJ>a{ zW^%Oo_}uiz`M56*onO8%EMB~rQZe+Qn2N%}!s6I+hi_-1%92y3P9a_vhjB}tDK0*h z`Nb#BJX>dC=tK0SOF?t9)3)set_bkzyZeh>=4MW2r)Mb)pX*M)d2@xjx|M@uWMriF zT*75_KQ&}nXHeenLEjJFIQ%KfY;Z0im_TfKC?0R9x1|ihns?0Z>qwM) z48)-5c6X=eRkp5Ly;}Fn5Qk>SCilAg zqV_i}_RKbpyMA5j5Wv$X6osPE(NWD5gOIBmowwPqJWl1@USLRJ15zk7`L)lvbR{Q4 zFwn_uV>%7Mvk*oeX-7e2A8s$a@A&#wbp4Yj(G3dx5sn{< z@&WQ9jZG4zJ2jVWIKoD$Zng503S#RW_#)VM9kNg&l6XV^ywZdFtDGgd!afGVRENryeM?{T-#sm$t2> zR6Kd2r?hI-s>MiCj&E*rQ9AJ?n;VN19v=I^uzdOQk{>PmjLd4zbII9M(*xw|eQk5d zxeBnbYFA?N@vkjxnw{9Ww=7GGUL1albcB>_-V1OmLLdvEjx}nB(MbR|!}8O<*|s0r z+b`gku^uU?kTsTd@81`{9{#%5%6HF{-`AGxrlRAA2V5HyRYzO)Ij10_hJ=Pj7bX92 z9qv#iAP@Cu_4lc`*t?CBRp(f99U6t6CCJeLahPY%;@KlPRpIFvqRy9guRg*hac3TJ z6|9rC8O_fFHCCV{(p>x;`Vh8D?HBE;o!2T*^x2j#XH_nqpXOT5$7j}UcXM+fol_}m zBS87uy>|~ZTw0@jR>NbcoiEEI`;1On04kVF`OKNqvs0VtQ@HjzI<9WHV-~pk=FXHI zS2s`$zDzXUm->O_r1+zR^qgCMnnFR-nru^Z9yhbu$jIpOs#%iRZ&?(|*M{@$w);3H zHJkD4h0Ke1tJ7wK7vlO<)!z>EM5*hbR^*piMFcNFO!XBDKkfNtRU2%@)Oh-(ua8e> zPtWcf-i+lwVary;UA&lfT;FVyk`h7QS$B*wwq;DYNo>C^5z9bQ`u9b*jWW-dnp{^p z{y?a>prE3zZmYR`Pebflia#I-*Rn0v-6r)fUfgXPlIk3gDG%jX)%`MM3%0@f4aeF; z>Y|o!|4?4>%4+b{&0Tc>elB<%*<(q|&t*JC%Vdb!CYqxS%orwc_1d-Y%-uI_5MtVv zH=8Xcum-5nQt~Rv_p(OugL!X_FN@k_C(WJx#oX4`*0;>_C5k)-$Z|TZ3`8oSySjg0 zvFFk8FK-x;#@D_+v>yG;)BSrrJvS7c7>-1bF#{Z}UG%D9TdTv&mp55#n!+14aOdXc z*0hi?DdniBtiCzY=iS@Dg*@qVjDc%TZqMY{>C|D3 zz`)?L4YmJ@t&sjB3QX~xo?p8jw=;4 zHH&}~vC(2};y2iV1{;&spP?!NZEm6pyjMvab*ZLzcz%DaC*Ol&M8Ha`B` z$cW1f&?K7B#rzwNnBMhH%=oHmF}dzCKm;IQnCj18pR!Z{pL6!?wGP9_zds*gm{dLS zYeK8beFhy~0Ir(zRAg9K*lVT9q2l4V1WCl6>6G80Lx(cE4Kt06^n*X1vb3}`uOmEx z|B#lxRqyQ1QLv_L}{3j zCu5RnlwouAdy@0|HDRcMd|S>kt$C9hY=wfg0Y%C%H_R8=lym*z7RgrH3(XQUSwEZ7 zwwm`&m9P|96uK=ERQ9|iZRrN`av}`&o$qB^k{38km}2{t*nj;{G^R06bHTzTkt6Of=fkQ zzQY}*O2gr9vr|887FWc_>7+fzLnJ^7(VOZ!{j>M>%{zx$?kwqa3cGrD!v3Vg+1qap z-LWj?2RgrGB6(|17IzRE@@&Q0oD!q%!eI4b#MvR=G6n{Q5hPQmm3AxF%nYuHZQxPc zx@*_2f}$eLY?Jse>&)LJMuTp^P4iZ~ihI!eG@b;Qc^zu_*7GTMNC$$J3+4Nx<5$VE z=g!&A&&?`DEkhN3(4gt&CJ&;ifyXjriZBMa$z!HisofPkh zA*omy^9S{gtricD@SSDi6ZNH%K_jzh(IR?AMw*fF&>}2~KM+AV=~Hh_4+g(hRYQ zw{rFLq#IGtlezZI%qttorR%D5*=BGu#%j(TDj?Nw2`=03`g3PR}TlMvsZtO~mL_yxXwvbb^v#SalbwuO- z!RMqw!ZRX$meKZKQR;K1Ut02#lZ9X3-ouD+tU;5uTTD;JClV_NO11)t))nwlRO(*i z{NU4dboch=Sn_T>cI^@;cbQe$?9Y9aie=6vhPRcHxY*eP0JT0&A}^f}5A&IediY(U zk+*^@1L>KkCkEdJ0@T_7-qABLy;i>KAcuXq0Zq5hk2ibKz1DzXBqc`DERPmx`a(;k zMAr9kD%!-zD)Ta*O-0AQo<)U91@|}kB`c@1w>KEng~8W0aA*e*RlSxkKA%M8L$KGN z$4oI;ZIERmHS^VKUP7Mx#RX&w(m;}g882g1o2ni568-7;;9HK0S1spi!gzX0CpxwO znS)gD^YZpa^57$+R@03g%Y4S3Z_FsO?ApI#!_jxN>gwtxb5mcN)iR9MNI6|hN{S*q z9J=uW*B+h1#P=gzRilWK1Ayp?C%=mUgWfyzMgk0k;nxD>V6xPp&8mS|fVD@T%9L|X zho!mbHzA3#^Yb(8+qZ9g_#?{GxJF&1;3(iefyb3uIc4Y3e3IUQSN*h4W()f%;6~Cw zdwh9KI=Cv-2xxBi!4Lg#W4mZMMP1Nm!t>r#hhPW-Hf{AgG**bBGj_5 zxb}D`HRi$vev*A3RVHQ1jsh;aZ7^rlJsTI6GVFU}Iv$__zm1sAK>p zqX~O&?;_6Wp1Pr(SRwVb`^%T}%QhZ6fHs|1 z&W4t-a%dU#uWn$rtqtFNbLaJ!Iaca3KU%F!3*89UvFG-u+S*z=LfKYUR=!N$Ov8ju zd{3514K6$v949ENBX9E-QDl+jN&km_~;k4ghRX&kI}L9t{{qJ z?x~4mBwP1`RleNgV|lWc;)#wy*Q{$fE3RncWS*V{-C4UFm-Fa$C&E6=SFx&x0B14a zE}PQzIC4=~mc|FHIkv}3<}yPt@#IVB{vzpQ#^~qgM|j8q*RDLe z>4{;U6*}Q;`kS1-9Pr}C$-O{ zdu%mhgw6_XX^YjCCwsXTUheB#bwmGhYJT`7HcfCt1{5}s-mPYR*oHMXlTJ%eQ&XoW zeDwY*%a zZ&zZm!}cG1Vh(^plBbG_z|(k{jVBa!4BOtF9Bh+wKWD?c%tl~4$xXcK&`JgZK^X`B61H=CR#;x%kBu3n5bw>G$Kbt zNr@kS1)n>&7>!IYLOdDjR&)02kT#+nimh0G=(T@R(sHb>|2fv>l^;F`k}ZmEIAJEb zdUE>?4tBoH2M>zZMlEN>HgJj?K#9tj)uh))TcoC@1|mmOS68>N^~Z`lF??19TA1i7 zSI(D|sHESx(Va9ub5miujTdYPU9e_KKA-p7rSg)HDea;={N{ZJ-{mu+Ypg7E?|YfC zod@x)%UBDRXfa{(VpeW<8Sgg)5?`U9U|f_h#Li~|R?1~!Xus3+?8L|Cf=f#&b(E#i zHQ<4kKr6^~dL<5ie}@Ds1B0fiDX-e};JV4Fscs~TOWaL6ckMbCAJ1cQ*CG^2j`EZK4Sj!tGN;7KhvdW7tX}PJo_!YNgGnLC^V9RQCqS>!fOaxxY`kqO@!-hY zrC6yA#|yMfy3iq_d(%cE3er3jqLlkNEtv{EVJ$mXToAi}KsezFp?3u0t4~i2tRhJt zKr`-`()qmQJ5O zeG-f$P49Wsu#?ZBE0<@FG z!aowthl?yMEH1>xX6!L(mim!c+UEfUj7U#J!GS=-yWvPeNA86#U=z_WW2C#mkLAlD zL`$t8wcATC*`udI;2Pg%KKdN2!wEWGCj1=sGl`VW69DyhRx>2uQy&{@RyUHG# zZSi@J+Qvg4B<7x7cG_b1kh|2-ai!BK7B{(smzUdS8SbkFF1g^nD`MHI*%S{czqPhH zH|VG~Z;XzKp$5E&jrZJq6y$Bm_lC7#h7J|l3isF`!nvQneanY*GC4h5jw-?O48aBB z3q?T3$SCI0h`pU%XMa-~@A^Z=p~quimu7h6u4$Fot*pHD!{R4FYERDAlBN2>DAZnj0D#D)Bf+I!+D8s?*C$EJQYXL@E*5FD=<&=nT5k zqSQ1G91sSirViE&!0zc8YgFF~rh$!(&A+Y96cI{F=4Y1cx}GT9A!x2D0L)JewQsht z5I}D)cc6meeoklQ0dhNQR8D5 zv<3}E*fRm~m=(;l3ajTOob6R7P=R=54^SY8QP7<{IQpI&x&fp-hkvbDCdva+r&Z`Q z7sH~1&k_Ro)*Vccl}L>bq~muSS1FflxwB@T*Fc{2F3oTE!S776?vO}wOOKA#)V1w# z0mOh1{Vc(oN!U!tlZs=(oPgcM&i*8vj{49;N;4x`O{6G3PpXU35GskiLH>8v;(I|Y zzJI~c@Fe`R-&M7~izOt)@ZS8yiyGsb;w5RY>HqnO<|-e?Hzj?F`2D3WOu_?|(g%oR zVr><-2L8I-q(QZw)BF0a@3q(zA-V?@x(9AF{t|Qkk1x(o++XpJtH%}YMabeNaj`oY_qvEhK^xLY?b`R0FJ0lRl36{i5r>Qlep zde)Yr$MYZSV&0}9HJ(6Qd5Y?(5XWDa9U*kxhhLWFlJY;_Jn(W=p8DXRz;nUc?NSOp z$%R{FubV_XJz=?-#l`2Mwe1?JRRI^I|6J6(oc|zo+`s)k`;%v{^n`ndYv1%)K4O?K)+Y!DU*C`c% zlB_Z^GDq4A*Z~YT?iow{&=Z9pJ)TQIU|HvsOz(98A4uQgL9biUUjcJg$QDs^;p=%{IEtPdY%1W!b^ zTXb|Z#sBqdV~T%#e0&fuDH51r(Ak!g-o5{0 zxjK~YpoxxCM3xSTidsxrV9A=Bn;*Q`zJ2?}pQ!4Jf=bfw4hEc~i`2o}N?{fc9IL2ls|5y3y% zOK0_XM}x%LwTy@tQ}pE$dv4nWIcT4){*#5gJ?FXa(j-Jjr{p7e;=G;%>ynU%SLTNI zmGs36ZZ2aPGM0|u#tdvBMQXIp_}on4kWQY3D;@UNUPKDsC3_LWc1+JqQ1^f zgHLUjE^!h)9n5pL??Wm2-?wPEg(_btY!gpnma)X~4#vq(Pc9am7#0Eyn)2(*dP9hy zvR|Ks@s4R-ZxK;_+F-w%GDh#?hLOKjcQFVxb^ zFghq4X*0-rhJp(%O1oj87Yr3ix3B$?SjA5KPBgWbr2K2%K5|a7?7KMX%E$Z9g*IeF z26e1?^^dfqK@}lnO9>Y0i?Kg&e%C*9F(UM@GNH3Nnf+hsY!taTr~Z#V^WO6(EO`Q)RYI3~Y5wc;c!73^kWDEZlSh+dM@Uqb7JMr;f5%Cyvb zJ@MyIz-eohdjD|wRL}n4(3=JU5su4D!?c=3_Z9(7BF_mCTNaa`5;{$4C|p|b-e_uS zrrRPv5+Db3+ZG1o7JyM?ok5V+jf?=zqUA1y8zQML zsS?E11a34GO@0r$g7^k>pV1)PK?FMqUX6>Rb9NqH`t>}dC2%PZGSbs|*B%i~Tk5@& z!mdxTClAi-0eD%$`#_<&*Z@C{0h&aT9qqw?>417Y6BxMt&QrKuwq+O{ULhK@B9dU< zj3&nm2?-%k!ydmFnlF1{EWrgO^(=sG1-hth8A}QG;^HFfK)JYQ^F8Kja^3k@MwFnXu2m!E*tI zyzW~eA(p3q2hu`B|H)w!p2sZcbmrQg{4ZODi9@3~cz*@<5nQ5D{`gBC7^xWw8p&=1 z@%+hM{-?JWa+a4UJz4VaV2i2PUyocB`9<0b9!QP2au`ujZSesJlZBLzoS^?d5e^#z zy{h@>KekzuMoO#Z%LT~wAJ?QOoX+@r2j6gEN>jInJOJ|$;j54y7i-e{fK>pU!~;`D1S;(%Wfpm%h3ig_2f}t#or8pa40Kj*j!x z3v{k*=-F9J%P4S@1)ZQ2x#Q__ zdOqeqk6nW*m}-dDsNl}_!Y?l!FI>I4Z-}?PVBt|lTiV#zuyJ#r1prxrmJ%&VEesyS z$@5oJfv0sNagh%QW#Vc=FA}^hLlaw<^h+h9waa=V1O8eA#~^A34r$s_h_!B3Vb22Z z`~Q1J1c3SK`mdyE`$9S3f;~xDe*%K+8-nx^xb-$4%6yj%mrYBnsHk*)`V<83P*-&* zNAqbBS}=)3TZf5EL`;kp%$=NVwbqT4Umr{Tf4tT0zI5?KaD~e}4A(%p%5nFlv#tM*l}VUpse3@~v1UUskCnJat6OSpe+|w-Y$D5r}m* zHmSzkY;3}_R`dbTFKnS|ljxyz;%f+PKxhI&8>k!;Fjl`CtQ!plJPI|Xq@?7*3#82$U_CW8A&J;+?`CFZ!l%VT z!nMjj?JDQ1w&Pn^7YL)I%|H0!T4<}~DP~ZW6~MKyti`yslD-@4veR}wJ-GwbT3Rx! z3ttX?&w#iO^5B~i0hv$f{PvBRqPu1BSBHPF|IhH(lCMgWxCetveD zxO`z@Jo`smrcnOR_Lw;_r2g5$9Ukf^*|gzEn}0$AFEKZuNlAdUNp!`E{}(jL@$%8~ zc;AY=1!lwqykt}9sfnc%YdIOn$H2xUYi+D0L*-lSN+9^3BK@)Wq>G@&ubze7{I7Pd z>4dn91CS$$gLDXg_rPCE?l0oJeEBlP9~N-owQHX~i)MckV$fe6eJ2;iQ~xuFvHo}Y zYhx~6jJ|p`jL6OK#U!Yn+5ijLkD{=}?Ch~Z;kuU_Tt5h#vM0zEze$b zHB?tU82vBepVU_IvG>m9T>#?XZ(AjD4Abb2eJneA<5q}W$X7}X3u&b1O2AUV4kBS$<&D+`Ai%3heIG6pp@r!yz3||L!#;#C4hV$jfTk$rE1lg2)yk$)TA_gLDMBvEs+qR(5Xg zgF_=Bc3bFYH~xkR@}S@=p+en*Qq}hUy=`;49&s|&Mhb>uP2A6I)v{Z^@G#-@-2Swb zBuk`s3ZbG#Ei1InRtG2Rkru*E9u!>jb&cD5b0X1pQ7FgS3#cBetrD$TBY=XPmmR@`Bs2ZDhe61fGF^si$A)=MZ~c=0A=6K1k@@7 z45lxyGi`?qLOun899g(<4>$!k621~FYZaPCES^8)denDAnA+glwyggKB!xl&A)O=~dk0{bf^{plaEllMmg*u4xwwAdhqJ^7a}B$Lo*ptvC&dAS{(3s(ZDlmUI*r{L7wm!K>jlcrKV&(}`>*pLymCHL*W$kC)a4 z!S8?bqE=pBUW0KXY|P09s~{0@Zz=_n%3qk)~o%D+-9 zh$`&A3k}ob1A&nK;|tX=KY|*@vj&Y)9c-M$N<>s+3PJiPk6rcAD=fUO)K@%o{&@F? z7vbOGH-JSql;p7F)Ru> zJ9F>80!>&26qSYHtB-U>{A|O)|XB`&+ zhtw+xxS5D+-qPzf_BEPX0_Z>@+?$cRBn-`G$`1{$E2gK2<_y6#<{A}Rv`=_`EE2n+>V->vBWMI>^hmTL6i1+b?c=S3rj?NA1EnA1&1QjdHqC3 zbdevbUH0A&Fra$%#_o0b@nsLeKr%9{ptG6@e#&l>3k-%LnGD5XgJ_stvROr=pODA# z`AB%?=ciiB??Kmte)61t7ZdSyjewOA?cJ5A@)*r*`O0_i?tv23uf zLoZaLrKRo1h!AuT4SJ{+uv%l-Wc9b*S#R1f;C9~pz;sM%% z;FY=87h6^fciIWd7TKBr64055!0^9!!yJ5@jg2`?ax5d@2YvkJ%^v>4Sw@*mo*$i| z-#9&Q+-rFGz(9$^wjert!DA6ujDQhkOC6Pl+6JnxpRB6+$8 z`>8iPgw(Qqo|T2=Y*bWK%N!Cerih{@sHImfL=Gs}t#~A!L+zo!_K%@$AD)L-<Df+&zrqgQmv{r+2lEj zih2)xgQbHa3og%R_D8G5&E2~e>NRw2ORuaOs5Dn)`9=BGz0B^k)EU&1Wm>o>w4SZr z*Wls7$J@fNJlUTX^^AivTHpy37d~$CoG!zV%(X8OZWn|_f+D}@ub3WQ4S7jG%8+N$ z*qP-s-@^*4gfYrW0P6jH<)>A#&z=j?Mf)Ji7x0$&*t^3yPCKaCHHFu&=R#@dJNhn! zNv~1*fVls60^Rj*phGo}I(p;?i2wi)VOiOiDw{F>Dzb2$uCA`1Spw>n{`x?j*yw1( zFSdpE)aw+WJ`YFJoUSn4wB&^chL5v)m-Z+n^%m$JvqdLZ@qhNhQQ_RyL78e1-a8945H}n z+^J(}nP_qnDCRjQNS5P-Qx|u~;1d}MfqUc?Kci{EPGRsgeDrmIEelh^ck1A=A_^l2 z_Y`#N1sI|sP#cYfH74CYvqb4`V5p;fxgTBfyFEdZNUVXVmrTo+Edy*yhJXmIp$=fm zb!yzn{hY3r9oItZk!F(Bg-I0(F=)f1M$j|qSJx?so@A$M(`{LJ*DFjaUQ<0q zL?p+zc`E^|XuxDh?t91t4qM@bmsZ|m`vbZ>L~}Qs1v-BTN3Z{y-8XbO)QRW_J5w_B zY?6c^7ae#Z8ya$lf%HeWh+DtC^c2sY+s2Op%3LtDNYVHog@PlR%7t5YfY3wo5=blq zEW%_y_%*+2{f7_NpDd3~afML0@bYbptUhr5CBIlk2qRAKr^`f{Uw&sV8hZB~+4yJgtSDhiM^%SoCoKIVG2+^#7#P@Z&%wZX(YM zv@MxmMw!gW1K)(i^th^u1~8GNJah9azs`usuau_QvVc9qJh3dKC5>2ixbayy06jp+ zJxr$(m7ZwJUS0*4Q^iER3rQ~%7K<8+UQN=fOn}tc1_<-HHZ=^yZ`l7jlLMS60YHG) z1OOcjPpDU5DE=20Q*-|Oc})NZwxvr`_niLzN$*o%-{IKB|AH&`GONVoRSELGMymkH6v5hHiS zix({Tn);_ttH4eyh-ZP19-RpNQCnRtjJctA_>S-y{gCi2*8UNnB1m`Q3a3yw3cph< z8CDAj2$;n8cVP^i)FeoYcvcjDME?p9C*TWLwtVgEqyT}X)$X)gTEam;Kz6cZB<8+h z`@Xg3^WY#8kXNQp+db<9S!-&fKX@DE4nE_B1eXQ}-e>yDA^jPo1F&=IC^>mAH+M5y zOh7#XXV5QRR+bdK2+3iA8x~_ka(d-Gi1E;%AX+gov4mB^qV6`(tB3~$fBulXZq+6# z-c(4BgtjG022e1f=8sD9=`5(`#lIyoeQTb3pj*i>IDD1Y7yws>OjqPQU&BctMdb zM0%i1{`$2!!$@x*rlXva7V|M7=XcoTj@`6lAR!H|4=>Sm`|GAGzIa;`Mv5n{}1^?Yxuw}3|gXhnynhS0QI}&_< zKfvE#{rkSUBo8b!&i{Bd?d3l$5bX=4kLW$=gi}OO#=_!1^eim3Kuqbg|5aYn(YI6j zLoksNseK!a4yr{k6!32FvLp?l`+zT5nnEGXwf$4>JD4YhAF>W^Tg>zx`+O@j#B!l) z4kOBOcAb^a=pr)jiUuv&JpYhsuFWC>`#^G1QIPTsb1YRsztcjClHXddb)$+f7Nj23 z0DYR?KgbL>3$ak)3Sf(04q3EW4jYj4MJ&tJj@0Ug>IV`vk5mO4TmuXCA4cc`!onB{ zKZx|*1KR9dTbg-brGHNL}g3i`MX4Lq3$oFYs?XhQV3SPK>`${yTz(>}bb7 z<=K-5Z^%Min4>T-PAH>I6%nCYvSf+)`H+x$x8ECd86gk<@cn=5vk^LfLi%Y1v`idR z@;lWq|0#dOIzy#eN8y)T>TO2+ANafmA~<3rd97kwxNc}mE_}TIAzitV{rG3|8PZb) z3-wGch)e&zLv_Z=cO;GJwfs&>f9qFnRS=o}!%D;qt#hG#{*`O~lDAO6wZt|;Ih#7t z3;oR>>_r7m7a+E1@bpYG)%6B{lAdPTyorhW{LDIW{RDrsrPq{>GmywYLqevns?;|( z6PPI~+Wa0lG#IP{88Lurq!uS>b_M`{!82L7CC%o~l5(7&>g(<8LRSdCO>_fDHPqQN znC@FP^>zW{028+JI*RlYVan!r@6WkurhI-@2Au-Y4H{rGbU_!bN-bi$Ak?vQJw-c7 zGz64T*eLnv7jm#&t-%EK&Og#q*x^~41>z0FmXni{c`yD4t~u!w0(L3{yo<&xqlut` zv}L|eZ%Hyp4uTObT@s6RQs9Sn3P*gK*sjYBzePs36_iW1Yk0E9o;sqP;Z<;C108af zjON23i@Ca5aH8Y%LE#HJB>TWO986FP(opXB7h~`XsW1(;L9C7r75OcILrpr%Ph)C= z8eR(z(No|3@`4Nb+--%y(ECEYzKeHU{|!a8U+Os~qzx99u)}ze{1gV&M*OspBOxy1 zybA%a@r294BuoU#`C&m&?}0F6czJn|Suw<|Huvq7qIo(5u!(*HiZV1bRCN19PX_YQ z852q!?#E_1SajO*>={9GpTjNmz&1h8%DU0^wbl(oMMl%4Kd>VDzY$1+FtPlfNwQ7r z#$%Lk8aystZXEMKMHw0zq7Xmle@l>YyvWDgvzgg^qdI23n#i{e`>g zyicAKS-(EN%^PV5(!^TT7xneB=FhZrKyWq(5a=}uQvw+*C*#^V-iVpMV3!8_(#xjS z)PJ$alJD>|MsxgT8IfhQA;+e>!Dob%P`b#3SRMSIkKey9ZYzQ!c_A@T`Y1|%Ez|XS zF9p&xEF_nung>9X0vpkw=MDsmmOYCRYuMPSV`5^`^Zv$JH7x_cSwIK*KpO1C1*{De zS_uR|T)?3Iw)IRQzhS5&*(j6D+UqCCQem;kQ6u1*q3Ca-NwC}XF~g#ODSU>ol3@>^ z22(UJBlw_!gM)*Z_bC-6C&v!h+6JOQAWj7Z1x}Fi@~-Jx2Z65^Qcs?4Drb2zcwwA# z;tveQfvRk`>31%O&_S4)k18CYx}^L&JgcOUhX1LVdh}m$VT+WupD&tez4ucm5 zf;x_PBDA#JRw(>d9{$8Uc(eb&B<;j1N#H3#EQ|C>$NbOSOFMpqO2JfY{Ey4$zrdD_ z{LBPGa%i?-bWJG&f% zI_tgYSrDp&;p+J2iU6iz7SIn=lAqYuDr20YjNtBX>x zZ2^v%v7!U}Kj9hikMosl{(cfBvMSq$7!8I$UDc z_U+_Elx-?G1w+~K$Kz6sGVQ1xHP3pNM!fkxA&C(nF!}tmN{v%EhzH4}lSgPbRI69C zTYfipt6-P}GK5GIv$PDQ8$N|g>sUj>D_*_gNK8!p%o5n(zYrgH?nqjcdhhY}!IcvC zD3TaKz!=Dg!UYQ8RENz_c`)OOW4OXPN>5#taTF!4ZkniYNf6x(!kzih@M_-?#>+4Z3Fs3yp zKKiawJ&jX7C=`*P}PGMxB|NAgHnL@Ms2REk}kW)~M%y#Z% zL7~CmCDq@0lh5Xc3QT|z)eU|&8c1xIL1y21O;O|vZ&u z7i>|MHlSP=4j?OVwaxzC-|tA~*>HkF6+|PZC(+P-7Y2cwri6N38PGsxG zprID##?y&OArP#=fhRF56}`t-U%P&tG~wW0*6HjtR>MSENdHR0oM5`erYTjM%;S-1 zGzb&Rv17~jVk>$oh(A7)UFXQD zG8B*zg6LO>1cUQ9oEuz1$BFQr8gC5hoXmH^x19a`cip$jQo%u8Xawp2CU*$lkUa8# z8&lqRKi?z4W&ZHUlh$jJOMyjG<6i=fxqNxO20|Ur+xRP2$Xs1PVWCs(sReBCMvJ}S zDMV^w>L%_gWzWG1FmJLL1s;gx3eL$|utEDge_}Lh;sRUA<-gshd6WBE%@`td0txYm z^`sR;~^XlEI63| z80l|Xkv#_AGaM>M6O*N`VbJ7DYfjD{w3Vu8nP~jSi`3L#UCG&GMn*C4p@3gKP(3la zAN~NmBNJ=~>!GZ~3REiw#`+8&4bzZ+H8jjus8!+W)+lu ziiY{Q(f>XS!klMMmC7ag0xu+J;rZC7Jj}1dmuU!*jz|4{9j(?!^k%c zvX52w9J(L^;OUAJMZWA_&DmDqnzp%HBsFh=$)G!dqm{z>*E1k8&%s%abtJn7%FVVq zLf^vNc`!Vt-g_Zr>|6k_2`z`Lat^^LioRJ-PY-D`z$5(8qepxz#PW_2BpVY7*_xa- z1rIm`W}PEPB)1j4cR;?w?plPr0iP0?TqZ3`9oh1j^*smQB+-G@e5WpXeZ#CTH~2;* z-b(ZjBiMaJ-yvrvLL$a4X2gmnLuzZ@)aXgI3nR1)!Kw8RF~UlL`GBb2kV%MN4c!|T zq>|R*MJw`b&=iE&5xW*48;Rl$afcu0;&5T|`@Lu#dLnXO2RUB?>4%(sU{QWr5Lfch z;~5$?XTs#efFn-KiU`aH7;tR+O6K55jz9=EVICXFn=~Te#kFwxnKntt6BztjdlclP zHaxsdcg)sNG;n=o^K+*NfZ&m~Ag2zR5m zaK%U>Nv#TEtNi%U3L4rjdJ!_UADo??4e22+vecyuCp+Pm#Dmx%Oq*ipKhCSPatiVj z8Q89dSuX!)j#arOj>pnN$vcn6Ck)ms45yl9+fqW%Zg6H!BkkcdKEoMgNSx<{X%8)2 zaSbH!2a!15C;@_@f8^e?A?Ftcb}o~Hc3^TChsBZ??!N%@>=vaV6uTgpDS-jf^FZxD zfM)i?$zqgFY^?tF!ZF623HbkPetqwqgbkR?T4ehosE8AKgL6kXCX;PIlpwogzRuVe zgUU#b0VMJzj=rH#Fs)w$g$r&+XWi^Dkm{2-M1{e%Q zHrzzeZA>Ua@Q|t++DMc#8Vs~&e@7gPtX#PWy^+yd(08LqdBlN5d5J=X#=3OGTgv=F z1!|S7`)7Te8n@TM2dR0hr>AG`bPyXErcG&bBy;rHanHy)!M6P5$&*{;(9WMn){4Vr z79SvjZ^jCco`_6h0JajBkD-KM4feLaB1bHG zp<9ay4WL=v4Xj2^S0h7mPzEqWl3MQyXZqC*M=KNLY{@BpRgmc*Baw3sGHl7Y5U_xC z-EUN@LN5zNeiU!vIrV|)$RFqDHg@=o?I4H7A#*NhR?n}V!!b-EARmDv$>_e?uTK|k zzP6S7spE>taRGnH$-GIvKlxNtRoRy>k3v=;(Fs%`m8&M|Ef>tTQgW#_0YiD!a-=o; jzd_Oe=a(~~pnNlfDW<@0mNtx#)QzebY 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 literal 0 HcmV?d00001 diff --git a/heatmaps/run=0_numberValidators=512_netDegree=6_chi=8.png b/heatmaps/run=0_numberValidators=512_netDegree=6_chi=8.png new file mode 100644 index 0000000000000000000000000000000000000000..e45ac9ecd15a07fe45414d23db2bc47cf7155b9c GIT binary patch literal 22939 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%0A3eIN$RKIHlM+-X#m2Xm0;+wL z`y*U0Qh}W7=bbAww~rlfRHF+^sJ&YAw!lW1PUqI+lawHMBBWRkk^fq2N-ucr)zPn; zX!TSXy}zhv6u(sjjo4_V%wc3BQI<+-R*G#>Q+vsy=EX$yN66!k%>hVv_{Vc$J|$Hi zthmX7brcniZJN&McU6A6bp9uUK}9AF^65^je=HX)_;2Kk^y<8nh7mDGTs$u0f)!;4 zuR9GV)r9eYm@%G)GBBqnHx7D6ZJhtoRE~yVmDuy>RQ>qW; zY3QsKJ$hN~S!Y;g!#!)EKd;klI8EcqlRHh;Q!Da|47#UAe*kQJuce2ijOW`Pvlgu9^Tyy=zGuY zi{Y7>pKX(1xQU|l;>O0sXh~wmV>dbq5#`h7c?{`>iLUG9wDx{p-Yz~xj>s?6uW!cY zY`U!{Ocj6hQK6>CUg>S}ncn1gG}{+NwF=Qg{!Xdz_~5+|Dc$~UJ`+;9L`Zyk$+5%L z0ZCud$f_R6KyKIGxw8rkH(m^b$uO$M3b1b!r_s;5Zr;4P97sz^6Ko;qxJ@n}19wvn#8$_4F>5m#cz}Lsb|dQk1ADE#*>F6fI?Vc(_ri9zEFG@szkY z!H*w5YDc_!_3HU*FHzA~FtunLIrhHz0u`X$cU z+4-8B)rGSw#N|~A67u|7zS72Q!S;DxDzmHz-nyAHX@0 zr}hpOzJ6_V>|F?45|J@664AJVAKpteK54AT8j}%ooMyu3ctJhP%E~W)Lhb;38U=X= zSy{ur!;IIG8X7KDh*^1ERIMj)lY|2@q@tVH(ULZ6o?-L6uh{;o&}1;S)^1;OG|QFW!_WQH+ZJF)R4%g)&}UEM7@Jof(8WY zVn;_uAa7>uqs!y5An~BnuLbk2>@&@Wx>yO}^e|rXq%P=LB15B{L{5!Ua^o5ukp%M% ziGhJ)$k)&{`d{~Owzsc6CN}f2@2J&W&>L-C-8B!p>FI~we7a57)nzokA>nrHFTR$q zMnyF`x2pf79$yjL-5i%T|H%SFGiOf89{xqZ2;xs*Rnl1%E6S;r>_t|=djE_}#E$7C zC*mh6_S{Lz&(${T(LEkpw%h9@HJU}wZ*uNg5F=|Ijz;Z<5?AwC;s}d;Ve79xWM~Z0 z0Xe1u@YW#1FwMntpSAX%=uSO4;rLj|4>x2izH;U5b~{Z?%@hd2jLgjPt*^wkP_s&k z=[wKT&W;>7DR(|Xr51Y$Aoqj<9|aU_4>x-IC#gw~y63E#DQcWW^>%uS}Cqc2~U zgSG`(_r}DV4J-b9BOCo|FR9NaPFZ-$r)0ap)pnyZv2D$IGq)^fUoQYBA!;HoU#7FO z8caBmaVn%u1amxsl)TTLy%6pI5!Le+P^;AKlhww#G_M;olF|zf0C#G>P#)48nrz9 z`-Lc|mj?+7SX3PDkFJ_89133HG_U&($SSZgz%-f~JJD_N_VQ5r7L_fYpp_Z0l|6 zG&EDsst>9EKr|wtzkmO39MSh8_B>L0GDu-WO(hz*TqGyAFU|CnOP4PBdHo#d28MmBx=5dBwkopX#1@XQ25G~E0zt|rst72zc_n&d7bjtHTu2@U)D`(NGC3f zeaRA9WP;LqPF~)H;3v6Z{G;2hZEYg3>gE*9)r`ODX`cIFt27Y&!lClHGNZmPUxIL@ zNGAvEJ|H`yQRO*(7qZmNw6q=Kii$-gPb4Jwt2Zz$KgTp*kMm-1+t7}Z5PXKFF!x9r zrTbM?X=Hpy)N1SKs3SYx>qCk9J3Gn&i9G=S49CD)SVh{~r$4mC>ZCn^>>%gdqXAt* zJ;TTn=!=n+^&{)y`;7FaMZX30e$)_1-imhl(v>Uzh!*a*4-P-3g&Zv+CB>?!s0d!6 z2E5ZwcJas&=Ov6^o={(p4xUCNxa?R4bS{{)IAHzzm>w8t=KTlonEnedO}IOlFlf%U zKmA_`Y<`Eba;p6=xW$8C&1WoRoWEd$pO0=4S80jTQ>NNKe%5&?#rnu^2k(EyM|kXR zR3EI^x}E>M3#_at%!2^HvbT?FU8tB(?Q-rchvA`Ei_A=*wL0UOsc#SaU)^2|stZmv zfh&rOBvq;Fr7erH*6c-0TUKA1(>8gHt>UcsJC%KsUkfn+)-^3Kw6t_|&(8=^Q8B@{ z{cq?^E>UjXzHQg??#-LW_4Rk_tm+e0BPuG?tdAb8eEO6L8ovf;pXY*f(Xzl`&|3eQ zzT3SATeCx8`0N4j;oIV+z_3_|nEm+Wj3wFrAXUn8f1g@9H5V6ou&YMqCWFEhB6)!M zr1*irp5hSg- zDrs$xdLvp-$m)b^19&G0-)g`l5Z-(8TMsPol(l9keztz5>>n@6bNw3l$Dip zkG+xr5L>$C2(mCewq~8w3Fs7HqqUHK4ZtoF`@x$1cdtD7P;!cM_3G6q<52@flH5qO z0cgo!K}M#7d&rJk)O9S2TQ6Bl?&rFsKQ{w=SS}DV*}7;RtB`-?96C0UJxuWfokH=u zc=2MZvyhNb^8?=M>gufk1l6^*x6dRlFi>og{q@R`L5{l4)-lLRc)}N;V5S~>bqfrp z7zm`ZK-J_>FH6_z^ApU zWMpLE8^Jeh%`iHS3m0S6*Y3oYi9C4x-2-Vj=Ti1g5ZSJ*tc;Sdi*e+C!OA29D{=V^ z?lhNW2wXX`8YWGmt|MC$=8m}8z{ppC2Bkn3qUDs>Spl!9J{ZHvU%x~E8lj>0zk8T- z?EFemc{%K7>losD#d3)%DG97QTJI0w$s=Qey3BYi@jo`ebkNo%LgVTf$G+9t2wr+F^)CqYd(2$?L@pG8^vXXPJ@fBO7j z#ScQW$=`u0NNNwPpIVxl3=~p&L76BxTWiRRa{cCwT93$%Y=S9?h0y4RhQxl>2o0Lh zRj}mMJ$>3VC?lkyVdO%3vs8Zg!me+03@@LXU5cnM^e*?A$>*_`5S`)LN!xV$Qpr7( z*3i!|f>xqSvaqwu+-r^w2`yKxh5^S@_BI-^Wu$e{Ol`7F+Ly`F0^)utBuWW#1M&p0 zrk(=Pmh055{^cG7A~^Zr{v7#y!|}SzTG80yhje3(b)sf7?; zw?ow&d8MZstE4P?%3`BT=>mdCu7h3b#wAQ5sS=gI`p6N>$>DB%W#e@&bq$SAAt*5X zFVXQd!To|nzg$#QofxQV$*+>PE#%bH5)(FIyzWLag#2}AEWMEG0tQ|+Hxth+CxGsr zCzJr|FhbBNs57qO3OK|gq;iH)OG}IVaewd}w|DqTMFKKE$-wVfk$12hLhRZ2`1t%? z+52EJo+UESPHrKN$ZAreKJ893r15N}?f?2UYkhZRYby^NaW#P)EAW!YX(tg|DvXbQ z#R&^8s8{#8QdyAvE1v_upg3IJa*X zTc z7m(0^poNDVf~{=@l8-2yV1RZmBey~Q=F3;Eh)GZMpiPGyK&imQLhWf9PW~ml=OmVq zKy3p4(ea?oFe_CG7uv#1DLgeQv0y4Lko7hxtXNUoLSx9 z9)8fo=G!T_j3e?>m(*cA7noh))TL11k0<&mhAdJcZo}MrB`9@8)ZzfoePfCVAE_Tn zl&Gw%*_>VxWo1G1<`h39wj}J6Tg+kFW`*nuUn&SB%|LbwUACDAJ*3>pRT@7Y%gwK^ zqz7>gFf0-b1O}^o_ikwjkMuds)W`Y9Ug?8tMIBTxHWfr~qKeIGP;>(xQ+QQEp~M`9 zMidwv{Dkz8HZ}pMW+`CeZY_$`HUsuoLdr{VdFVamPH14$VzH(!AlM zt;P=^bhpD`exe^iv`H~5^`iJ;h@_&kQwS2t-JnzuDJBTk6ql9$eqk@?yx+r)RtayG zKPsf)A<7OyAQ^!Igrh3+$^sSd-&}wk=d!c2TYVsfZP@Oq@gsF;r`ft|^k=>_i$iD? z*|>3kW*L@JBDk)EdWF18muCJfgvKlp>>v2zJrZ7Hj=5@_s;>~_^Ww0Z>LXIe_GY%+ zVr{UezJ7wR4WD%DJ!nY+0daHb+BM>ICK-0Iuu2se@IZJhZYU||J>Icg!`cXb_V&D^ zi%Hu`Hco>?5P~*lKpEZTMfK!HNsJOSkAMAY|Ha)EBrp{4Z72v^6Iq(p=<+39QOCRs z5-|-ZZkS2v;ry$Hn9e$CV&?R*j)NH1@MFw(nb#m8tE#JstND}5E=6*Ynyx_Wu$eG= z{~p_lE(h*Y3gy~n4;g5sMgybkL6TsjUw#HKFLNRU4-&p?Vs#eWTI{*7we&{odZ@tU%ZH+bRQ;;NcuzVB81X4P+d^nh}Rp_4X={gqSlcL zrcgdJzLXfNY{wljoaBW4YM3|#js;4^1weeDP7Yq)i}*z^@Br*0+w}D><>!Ec!mvX) zff6?;pFe(F4$Z(TE+N5e;98&=Ju?W#Vc)s3Nq#6p=aKd5dyzXSl)HED+AL1t!zD%= z^FTfeLi3SAhBaJWE1|-%`D`hoJ`_}o;J9RusqqsTy0>o<%mOr!N(`DFLqfzt0sC_= zJWJX;cAU-5mNqdl$qyeH9#+%Q(Yg1Rj=yN_SFN+{^z3B=O4Iks(qDBcHZ};kxa8O88)-`WwY3?4 zPYgw%RamiU6Cd%;fC`6JQ7m7}3)(zCUm*jc@zq}@8ZMYr%K8}#_hsv;o!Eym_&kSf zXFS5o5|_B0PM)lWq`MaO7MG%1g4DVhtLm!);{zGmSOJk_sAM$!^$fC_NooB*l!x=+ z=HLh$A(km`!##UK1lJv?fXhuM%`lTaR-Eo7t_E)usHFYgc7+&-GJ!=8 z1fdY-SIB%8ESONbSt(ARo^g}>vUY7FyIw$l%aMcn`9VK;{IyC&4z$4)$tO*s2A#}}OqEr=nnc*p-HSor_< zZaBq-ou5Als{UbUF&OZOsd;yqiFei2+l@y@p{=gTH%->(QoL|Am|*=-g7LwL zY-s=G@ZZ!6Itq`}0SXLk{s93ZD_1T=Ha>9QI_U9Ty)nsk{hP^K>?LhR8{rE^0xa6&@R^5qSO)o`V8z&x%Zle2DREK zuBT6*CL?U{%I6H?k#f4xTz!agqcgXdmDL{>?ACEuZZUUsae`Jxgc|Z-Y}70*MTvn0 zeyYb!O$K&Ta6TMQsSB)&_0@0~v z&@k%nl?NFu#|1aLvqDLeGjRKSky^ji)z4*YTYjIhMu^Uq6=4no+M{34RE<5j?iUnP z!y{sL>vZrTNqoG9#@I77&%zWkjxsrrnNzs?b^;YCAZ?Y7?b}7BE-e)_FDXnj+B|SN7t!cqeLyj&7_+Y6&9AbjU4TIb3iRXouwoXmocLrXkGsvG3crkIb%_6+8CUgoSZ&b41!u(dQlbRB-8A z(TEcJDXi3t28F&v4`L0xtfo!H26r7gOPJuX`ZA|sG`opmo;3ON3`MGLj?+NVYKfNY zW3m?CVFn=tl!L?FecrH)@8SZnY(wCyrfY8v8<{V`pkA8*%Yoe8%R$ueGuGk`_uX3L z7bsPWD%aiDcM(CJigB<)&k@l@Ldt>gXj!3Sy|pMpdjoR~Wnj;|(xK^!y8ZS2BVN?) z3smTq)%dU44dy>IW1E=heMV}JVvyN_xMiRi-8JDyNv0pRcd5hscJd2EmN3$B{b_l~ zBB8bswUyM9Q=^|B17#Bf7VNsamI+1LJMr^12LRE}FDiWJlnPY5v>;*9k)gFFJ|g>f z57>bH6M6i;2)YJe*E%;begAKKfgFT zuOQzn1~Svo)Fjl&ztGv2b7JxmGIZMr#ud$T@2O%U-q^6Eb`38=|09kHN)Z$FDxkhP z8dVfMG_iLP28A?U1OT0ZJFmYvjRj?eaKixnz2GJ!La)_rVlMXkxtc1v*4c0WTe)by zqk3|H3nQNS12Z!-2Blsn1r=SY+AWsw3xhdaNJz1~eD`n0aVp-%#Se!^4Gj%3i^YNw zu52%~MUdpUP7|W!FDZ?UN0y^0)1T_gfYMJyjcJ5k?!%28%anS0dcaiO1Se{h>&nT` z{RetmyAy7j?0Z=0a_`+c8y3d4NN|%M#%dk|;DJR!k5-LbRS>SbYgfSS+eh#9g@uQc zAxtBD$MavY?9qz@XqcZaC8hT(Y((57%I++Mn+}fg5y*L!7%JtKG$J`2lR^~A{<|hy z(b@yLg>1>eJSm)h&(^z(rgp{8N4&K=bQ##ew`D7#V}%=M$4{(fE#{fK2L_no5QEKy zu$t&WH*Bxd(8%FJt`XB^;gRw~FybpNfhmUv23=v*YYPs3`k@8tWJ`)3Y%ljMZ?*cn zB6TXzaKtY8YpKzw{84;YJm_iCC2xQ#|G&lOjd2Uqsi6QtoBCYSoQJ!%5(_5y7Z`Wi z^N;N*QkIn$q}Gp{S22@N0(Yy4`_s@|!T@SJgm%yiE?II8ee4z)?HW?G@lmYnSvGCi zVw#yS@jPZRRg!-iwpNX%tGAa9bbd6H%wCnnk{d}*0aFSQ4D_x}#GBtMg%K2ifgfws ztSHesY5Qoke~@&DPxM^LK2KJ2d=X!_juX1nWg)`1K~@cbB_9CU;YnTkray15dtMQz zd};}J#uy>^mN+PctViEx9HEv@+AOjdFkA=TKkApZ!rwG~5nKh-?w3l1Qu%9sOHe5w z=kc2&j-G=}eV$S4sSEb^Ww0IvhcVJAmoIZ}aOemm!_}bXatjIqLPA1XXA$@) z%&W)GKxqN(7AbW5_U)_t`!zHqh(0WTh!}Rjn>v4OmkSlzA^_}B16%a7GiBJQ=|++n z@X7J5H5Og5gkhDK9ZB2vZ|13a%txxBAvW`!IeF%1%YGuR!>fd8wX6bPID+9d3fW=~ zD>|5)n^AFbCiM+|>1Pl)RITJbGy5rhtj=08K|pi~L@Mc$8`;Ue)RH!TJG+d$g8Z{NN_ zh>Dn;^jxtWE*2GR8H51a&^*OLB8!l|^BY!kMFL^x4))5g1^oO=<#DO}!}UN3GEi%f z^J56{H`_~g&%e^vQldWokzh?2F8mKaPKOiEJZMB_;8IshuHB?UReJx;a8&fiL?kdz z>5|wZvKn$05gWVyQY5HhSk(O|U&9$$x%uoRnZK@P{yuIcL4Po07#SIXiI#y(_+zvf z3`<9aUMTAy4Q-Xe@2kzf!GjVZ5C$$XGU^E<46*j3BrTm~iX!2K0^doz6vQ}A2CBib z-m`xr4{I_9F-`7TCcr&!Bk15OV%fBDBQK67Q3nrTbQGLcQqpo#RT~?^S^e_-<})SB zR_tcGy?=zM#_w}8L%#5B-{sTo9~pCqMo2`}%_flGC21SP>s zaG{tNUgvq~$q3RD0eFBy+PikO+|ipam9f1^KjxiWMRJXNa3*Bz4c4WcIB^0-U8-oh zJGE&!Mx3$lG*3MovQXN2iK)>oM>R|KhC|ZQ{N2vg1Zt zo3i*DZXjG&p8aPM-^Ks^vq3+SD)rqisWeHAqw^^?@?daC$TlEM404AO5f}!!LYGg$ zttwDGU??UGEe?BN=i%9Bn`|s9s!Qbi7tOHHkuDaA%@S-CTH{JG%!j&oEHOQO6+F}2 z&=70!Dl(i8$T)A3x<;P`;R)w_z%lusD5U>4J^l$o5!IUtYVYGL7X}KjEIkEoPUcgm zP7%dvd}Lxm3pQ_O!1>En+8Seb4ioKu3+6+aI3<$M)7!S^icprroC{CAle2Tv+qTL| zI_Oo~6X4Zeh}78JJ2p1v5)zwk0;$1``u0+sphBk9F)7h9s0_;zGKV3;Ku+IZLv!CH z(nYjVYsS)bM_36#U;)(ucGBxcL;q0Y=l-bir~awND{osVsVYF425NTlXXnF5kn9cO z_DMs7p55vHEXe=6U5NJK4klL@B6YJ0s|aG_`2!+gl&b@*A>4pBaZqc`P<>>x>>Q0aeH{$(3x3wd<rrpbR-%w1AB8Z(z(&GWN~nExWi zmsC$ADN`sM#1pxY7^VM_S;;>7le7t3{C7MN=9eH%&Bq3RJ^*Ew4rmyP&L6wyM@k5Ac^()?@7m2^-ePQ3aGEPy=2vjVm>^x< z0{!uS+8;Hqgh=>W^kZ+T8 zF9z{M1E2z5_?=_tAbln`m0!7xDN8}fo@Brf2OtA5MOYIgntDXTDg-0Mr4SX zGW_1-!(+rYWG{7`1|YXhJf#nuBOQg9#$Pd5c9V$x+VP*&>VHtoB+Y0yNFDMx;8XS~ zf5WY#S4y8Z!WA94|5oLXk*}MqcIMXcDtevl<*B-!kZ^Y|0Lwy{$V)9#sdlBP_`d|~ zeWg&b^RrhWe;5u{jh?wNv$sb3$kmZeqkF!r_YQv$*TzJ_tO4rMvriq!PQX!BL#yA7 zsayr1L&3@)fKn-ktz2HKqrg{_gK=q-i9^<)NJ7dqmC0aIi#&`DD zO7wa^!$Vk!3GQk5AIBv(W|a)R0qRhb48J;WKj~O{Cyxu=45!)(`PYM{X41Y5c@H06 zEG_jeGVeP@jtKzS_@mkTcx%?NxWnlh)I|r=_W0E+PGCL5Csz{^!ePa7{w#u-BM*;@ z81KobOfn>(=g8{++~b5Jl^+K1BM0q3>S5>Pq=QcihpV)?ZRO;^AzWl81hnr~2%iAJ z6hH74u%|rDe|(Ugnq|qU0Msd7mYVOFKjnjqw+0X&Q_KMvZ0Nx>l5N{vaww9;*j>48 z=oYrw+e;m_6ksxUti*N_z+l~>FV3jWG!!zG0&KFAEBccGW9M)Lk(pD5cQ5}tT&PqA zffukkQ{(K<*?2jHimsp4lJyT`n$OS_M-I)4iVUbigu`9GzQt|pvx@&akBE^w$wX!r z#31+M)AJ^HSh9cr=X$(KXLJIy5viz%>H5jE4;(*)lXJJo!9wKREpP0Niy#av-rTn# z^8uJvA_xw&3#aC8qYc2Kf&JWsG{K02#nUKp95cd0U<#(1MKRO>quqhLBWz?omr{XI zRRhxLD7q{losRRz&qrY^CezqHFnEYQWDz00*~O~U?3nDNrNE~~!WPd&lZ0)hc=J+X zg)%e1m=wqta%fxrfZn|OF5Ao3*Vib=Y#F9XCQ?XE%)t#6pp>{{=`fCmer)Q~g*sY}f$G<}r{{u5FVjT<#TE z3#2{JKKELk(WfFSDC}xHQvdup3r4fr?qHpSu;nRgUZ&=8$6mI@y&yvvxRO7n)wnIE z_em0;j)sQ+*c?XIfKCmRKL2g)OJZ8F(Hy&g2$=Z;I0|JBVj(Z3tFLb%d@$K<=-!A$ zx|ggNajE6-LG&btyJgllHId_53}^nc?XOEdI5=1x;j$Jt&x)A}On247>5>Z)k#eck zA`V*yOG*cowyLVC0vb1zp!Fw)HEam3sAHAJtTaewBE9b3y$F+5_pF~T*>ln6!T+rT z=6tWhQz_?Vgj|62>K~QtzlA1g(FlzAAE#PACFdi;^zCo?ur1wy4$xhp{U@ulN`U%V z`0V+`ghVBmk+N;=v{*>F0$Y{Pf0)xFsSafk8~##$17IC|ot95l1xfKb(&M2p@bd6n zfMJuEozf5HNkB5gWKJLy6rCw}7p|{W7kyqsy0h3i_(h=Bqdw>tx!7RMk_sPrONfgn zLo!3#a?UWL%8!Qb()H_i3K}39W2B7*6Pl^efcx8W%=`775n;D>0J0;AS;GY=e^L{7~jauMbQpTJoNmKP)(C%i*CTvHhEcf#2V8Gp_n(?EdH zP*7DT;ik()7iof%#b5~boOtiyjFU3tOAIv@Y}L>>l7l)!>cACMPp{b#z6#`4$v2S#0P#Etu7DWguilS4l1_YAwXBXYP`4Abu#VIQX z?8>_Nf4RU!-QbtTOMpGa!wXT2>UxrH6sK=**W--F1u!~ZHs+0wizB$H8{CnSIj^W>D2W4Z*lUtp6Cr_b%id>& z7jAcW`0$|?=FL%h&x6Rd!s#J6m`8g24D1K}?;mXh5lp70GE`8&EAkw^z*(a631W`m zLTw{WQlqSi2h=zM^Q6Hz%>Xmv#+hY!GTOU$Yr>spZ?9ejWavZZFY zn|rXXyhzxx6lWB)@tYHK7LFeIxItt=r}u;@B$P8aUCCHF7H_-=9vX>JABW0h|2VTo zf+JdxxR9cPaNOfgu%W4%VNY-b>pjmAOXBqk7-wN-R>v>VH=iYCOjT8wjBG#{S+%Pe zcSp_+Fv#2|4IAVN{EcYqwZgtxC-0IISnv}g6BA+Dp%eNccvF1mW{FcAQ~j(+n1qML zHr)nKWpF5*A76<1gzRr<*BLE(X@-w6>`o3gFf!soumP}KgjO%8k9Cn`z7bloANuzdARVD*^2u2)z!7zq zMH>)JG>~djknW6sGBGjn$y+n3OnqGkC2|E$Sb}ou7ZSn(|K+}~zXJO|ajA3VX+yFD rF}CC{8#PIg|0Tcve?K*NR+UyVReR@mF9#fyOxdx0x5i!d!{`1FCY?j{ literal 0 HcmV?d00001 diff --git a/heatmaps/run=1_numberValidators=256_netDegree=6_chi=4.png b/heatmaps/run=1_numberValidators=256_netDegree=6_chi=4.png new file mode 100644 index 0000000000000000000000000000000000000000..acd65be6eae02ccab56212fb57948d7843fca57c GIT binary patch literal 22547 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 E1H2TDl>h($ literal 0 HcmV?d00001 diff --git a/heatmaps/run=1_numberValidators=256_netDegree=6_chi=8.png b/heatmaps/run=1_numberValidators=256_netDegree=6_chi=8.png new file mode 100644 index 0000000000000000000000000000000000000000..eaab5cd7ff93bb5cd725be02cf4122b1a1c2884a GIT binary patch literal 22417 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

?l>fv?B(G(j+Qv9SO6zj8=M2$ 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 literal 0 HcmV?d00001 diff --git a/heatmaps/run=1_numberValidators=384_netDegree=6_chi=4.png b/heatmaps/run=1_numberValidators=384_netDegree=6_chi=4.png new file mode 100644 index 0000000000000000000000000000000000000000..164eaca9982e52a5374592fc3b290b77c2f55212 GIT binary patch literal 22586 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 Tl>fq&C{ib7P9z=Ix$=JjEkInt literal 0 HcmV?d00001 diff --git a/heatmaps/run=1_numberValidators=384_netDegree=6_chi=6.png b/heatmaps/run=1_numberValidators=384_netDegree=6_chi=6.png new file mode 100644 index 0000000000000000000000000000000000000000..559d709b2d98bcf7ae8b7c5420f16004add35829 GIT binary patch literal 22686 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 ClU9-d literal 0 HcmV?d00001 diff --git a/heatmaps/run=1_numberValidators=384_netDegree=6_chi=8.png b/heatmaps/run=1_numberValidators=384_netDegree=6_chi=8.png new file mode 100644 index 0000000000000000000000000000000000000000..b58912acc26e4cabab804104b9acd91822d8a6a8 GIT binary patch literal 22697 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 literal 0 HcmV?d00001 diff --git a/heatmaps/run=1_numberValidators=512_netDegree=6_chi=4.png b/heatmaps/run=1_numberValidators=512_netDegree=6_chi=4.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc3324a8d9ab6d2344cbac5f6609342f92dc0ff GIT binary patch literal 22664 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 literal 0 HcmV?d00001 diff --git a/plots.py b/plots.py new file mode 100644 index 0000000..e3e83cb --- /dev/null +++ b/plots.py @@ -0,0 +1,51 @@ +import os +import xml.etree.ElementTree as ET +import matplotlib.pyplot as plt +import numpy as np + +#Yet to update with the execID format +folder_path = 'results/2023-01-26_10-41-29_912' + +#Store data with a unique key for each (run, numberValidators, netDegree, chi) combination +data = {} + +for filename in os.listdir(folder_path): + #Loop over the xmls and store the data in variables + if filename.endswith('.xml'): + tree = ET.parse(os.path.join(folder_path, filename)) + root = tree.getroot() + run = int(root.find('run').text) + numberValidators = int(root.find('numberValidators').text) + netDegree = int(root.find('netDegree').text) + chi = int(root.find('chi').text) + blockSize = int(root.find('blockSize').text) + failureRate = int(root.find('failureRate').text) + tta = int(root.find('tta').text) + + #Create a key for this combination of run, numberValidators, netDegree, and chi if it does not exist yet + key = (run, numberValidators, netDegree, chi) + if key not in data: + data[key] = {'blockSizes': [], 'failureRates': [], 'ttas': []} + + #Append the data used for the plot + data[key]['blockSizes'].append(blockSize) + data[key]['failureRates'].append(failureRate) + data[key]['ttas'].append(tta) + +#Store the 2D heatmaps in a folder +heatmaps_folder = 'heatmaps' +if not os.path.exists(heatmaps_folder): + os.makedirs(heatmaps_folder) + +#Plot the heatmaps +for key, values in data.items(): + hist, xedges, yedges = np.histogram2d(values['blockSizes'], values['failureRates'], bins=(10, 10), weights=values['ttas']) + plt.imshow(hist, extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]]) + plt.xlabel('blockSize') + plt.ylabel('failureRate') + plt.colorbar().set_label('tta') + title = f"run={key[0]}, numberValidators={key[1]}, netDegree={key[2]}, chi={key[3]}" + plt.title(title) + filename = f"run={key[0]}_numberValidators={key[1]}_netDegree={key[2]}_chi={key[3]}.png" + plt.savefig(os.path.join(heatmaps_folder, filename)) + plt.clf() diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..09ad9e9 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 10 + 6 + 4 + 1 + 4 + + 65280 + 50722 + 10991 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..7fb4d62 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 32 + 10 + 6 + 4 + 1 + 4 + + 65280 + 50978 + 11332 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..6336fde --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 10 + 6 + 6 + 1 + 4 + + 97920 + 81905 + 25038 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..358dcd8 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 32 + 10 + 6 + 6 + 1 + 4 + + 97920 + 82123 + 25632 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..af9c6c1 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 10 + 6 + 8 + 1 + 4 + + 130560 + 113258 + 41557 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..f75ebff --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 32 + 10 + 6 + 8 + 1 + 4 + + 130560 + 113195 + 41311 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..76219e5 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 50 + 6 + 4 + 1 + 4 + + 65280 + 53807 + 14919 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..3b27873 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 32 + 50 + 6 + 4 + 1 + 5 + + 65280 + 53653 + 15446 + 17 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..90b2136 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 32 + 50 + 6 + 6 + 1 + 5 + + 97920 + 86655 + 38282 + 67 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..4fcb699 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 32 + 50 + 6 + 6 + 1 + 5 + + 97920 + 85939 + 33915 + 18 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..e0c86e1 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 50 + 6 + 8 + 1 + 4 + + 130560 + 117816 + 52702 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..c62e89a --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 32 + 50 + 6 + 8 + 1 + 4 + + 130560 + 117121 + 47458 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..abd44b6 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 32 + 90 + 6 + 4 + 0 + -1 + + 65280 + 63570 + 58835 + 57567 + 57563 + 57563 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..f551c88 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 32 + 90 + 6 + 4 + 0 + -1 + + 65280 + 63850 + 59848 + 58777 + 58777 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..696a380 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 32 + 90 + 6 + 6 + 0 + -1 + + 97920 + 96242 + 90303 + 87315 + 87303 + 87303 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..a311536 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 256 + 32 + 90 + 6 + 6 + 0 + -1 + + 97920 + 96380 + 90924 + 88649 + 88644 + 88644 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..3e330c8 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 32 + 90 + 6 + 8 + 0 + -1 + + 130560 + 128897 + 122020 + 118076 + 118060 + 118060 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..20cdbcc --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 256 + 32 + 90 + 6 + 8 + 0 + -1 + + 130560 + 128876 + 121863 + 117847 + 117812 + 117812 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..230a27a --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 10 + 6 + 4 + 1 + 4 + + 96384 + 66032 + 6147 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..e17dcd1 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 10 + 6 + 4 + 1 + 4 + + 96384 + 66039 + 5668 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..d01c8e2 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 10 + 6 + 6 + 1 + 4 + + 146880 + 113869 + 23215 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..512c3bf --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 10 + 6 + 6 + 1 + 4 + + 146880 + 114994 + 25313 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..4a1425a --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 10 + 6 + 8 + 1 + 4 + + 192768 + 157300 + 42616 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..91f37bc --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 10 + 6 + 8 + 1 + 4 + + 192768 + 157452 + 41618 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..23795b0 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 50 + 6 + 4 + 1 + 4 + + 96384 + 74591 + 16829 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..e947a82 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 48 + 50 + 6 + 4 + 1 + 5 + + 96384 + 72711 + 15420 + 580 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..0c5bd8c --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 50 + 6 + 6 + 1 + 4 + + 146880 + 121561 + 34006 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..59b5ded --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 50 + 6 + 6 + 1 + 4 + + 146880 + 121195 + 33926 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..03a9ed9 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 50 + 6 + 8 + 1 + 4 + + 192768 + 165822 + 52031 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..e2a76aa --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 50 + 6 + 8 + 1 + 4 + + 192768 + 168032 + 59986 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..80b6211 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 48 + 90 + 6 + 4 + 0 + -1 + + 96384 + 93226 + 86919 + 86348 + 86348 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..50f1509 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 48 + 90 + 6 + 4 + 0 + -1 + + 96384 + 93230 + 86991 + 86386 + 86386 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..7860a89 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 48 + 90 + 6 + 6 + 0 + -1 + + 146880 + 143978 + 135616 + 133493 + 133492 + 133492 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..881afff --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 48 + 90 + 6 + 6 + 0 + -1 + + 146880 + 143540 + 134238 + 131831 + 131831 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..554d350 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 48 + 90 + 6 + 8 + 0 + -1 + + 192768 + 189357 + 178258 + 174453 + 174448 + 174448 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..7403174 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 256 + 48 + 90 + 6 + 8 + 0 + -1 + + 192768 + 189219 + 177738 + 173359 + 173354 + 173354 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..7d98567 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 10 + 6 + 4 + 1 + 4 + + 130560 + 78166 + 1623 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..b55e0dc --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 10 + 6 + 4 + 1 + 4 + + 130560 + 78182 + 1664 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..ea0c291 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 10 + 6 + 6 + 1 + 4 + + 195840 + 140372 + 15175 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..2552822 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 10 + 6 + 6 + 1 + 4 + + 195840 + 140300 + 16773 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..726e7f2 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 10 + 6 + 8 + 1 + 4 + + 261120 + 202963 + 43043 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..3746f2c --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 10 + 6 + 8 + 1 + 4 + + 261120 + 203451 + 43924 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..00a13d3 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 64 + 50 + 6 + 4 + 1 + 5 + + 130560 + 92697 + 20405 + 832 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..5c95ff3 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 64 + 50 + 6 + 4 + 1 + 5 + + 130560 + 91401 + 19859 + 299 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..dab9edc --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 50 + 6 + 6 + 1 + 4 + + 195840 + 151549 + 31002 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..10b6d7b --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 50 + 6 + 6 + 1 + 4 + + 195840 + 152645 + 30487 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..b8102f0 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 50 + 6 + 8 + 1 + 4 + + 261120 + 217962 + 64481 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..9b5643f --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 50 + 6 + 8 + 1 + 4 + + 261120 + 215832 + 52918 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..b28dd42 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 64 + 90 + 6 + 4 + 0 + -1 + + 130560 + 125401 + 117963 + 117745 + 117745 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..771a09b --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 64 + 90 + 6 + 4 + 0 + -1 + + 130560 + 125048 + 116859 + 116657 + 116657 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..1ab8a1c --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 64 + 90 + 6 + 6 + 0 + -1 + + 195840 + 190061 + 177271 + 175566 + 175566 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..1746ca3 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 64 + 90 + 6 + 6 + 0 + -1 + + 195840 + 190193 + 177636 + 175941 + 175941 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..a7735d5 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 64 + 90 + 6 + 8 + 0 + -1 + + 261120 + 255573 + 240196 + 235880 + 235876 + 235876 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..d746269 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 64 + 90 + 6 + 8 + 0 + -1 + + 261120 + 255416 + 239912 + 235936 + 235936 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..fe47b32 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 10 + 6 + 4 + 1 + 5 + + 98048 + 83376 + 31140 + 53 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..871e83e --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 10 + 6 + 4 + 1 + 5 + + 98048 + 83468 + 32416 + 177 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..25dcf46 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 384 + 32 + 10 + 6 + 6 + 1 + 4 + + 147072 + 130943 + 59562 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..a1b1189 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 10 + 6 + 6 + 1 + 5 + + 147072 + 130291 + 57895 + 51 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..3b80d2a --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 10 + 6 + 8 + 1 + 5 + + 196096 + 178646 + 90715 + 17 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..aad4d47 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 384 + 32 + 10 + 6 + 8 + 1 + 4 + + 196096 + 177910 + 88434 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..9312447 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 50 + 6 + 4 + 1 + 5 + + 98048 + 88275 + 47587 + 2390 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..8ea4887 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 50 + 6 + 4 + 1 + 5 + + 98048 + 87796 + 42232 + 624 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..dad2be3 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 50 + 6 + 6 + 1 + 5 + + 147072 + 134867 + 75547 + 454 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..fb8e5a4 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 50 + 6 + 6 + 1 + 5 + + 147072 + 136972 + 87321 + 3906 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..bc80d4c --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 50 + 6 + 8 + 1 + 5 + + 196096 + 184058 + 108161 + 255 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..0147dc7 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 50 + 6 + 8 + 1 + 5 + + 196096 + 182637 + 103966 + 174 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..87f2420 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 32 + 90 + 6 + 4 + 0 + -1 + + 98048 + 96710 + 91946 + 88981 + 88952 + 88952 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..ff43a1c --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 32 + 90 + 6 + 4 + 0 + -1 + + 98048 + 96505 + 91089 + 88006 + 87990 + 87990 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..c14a77c --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 32 + 90 + 6 + 6 + 0 + -1 + + 147072 + 145442 + 138494 + 132562 + 132422 + 132422 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..49f66e4 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 32 + 90 + 6 + 6 + 0 + -1 + + 147072 + 145177 + 137014 + 129819 + 129694 + 129694 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..17be440 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 32 + 90 + 6 + 8 + 0 + -1 + + 196096 + 194208 + 184667 + 175478 + 175218 + 175218 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..1c504ba --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 32 + 90 + 6 + 8 + 0 + -1 + + 196096 + 194028 + 183667 + 174499 + 174264 + 174264 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..07cec18 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 384 + 48 + 10 + 6 + 4 + 1 + 4 + + 147072 + 116108 + 28381 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..38bbe9e --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 384 + 48 + 10 + 6 + 4 + 1 + 4 + + 147072 + 116462 + 26517 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..830fa10 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 48 + 10 + 6 + 6 + 1 + 5 + + 220608 + 187528 + 68422 + 128 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..33d9eef --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 10 + 6 + 6 + 1 + 5 + + 220608 + 187077 + 64499 + 27 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..c8ee0bd --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 384 + 48 + 10 + 6 + 8 + 1 + 4 + + 294144 + 258780 + 111702 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..e71e19a --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 10 + 6 + 8 + 1 + 5 + + 294144 + 258369 + 108509 + 25 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..a3793f1 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 48 + 50 + 6 + 4 + 1 + 5 + + 147072 + 122461 + 42113 + 75 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..07eb81c --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 50 + 6 + 4 + 1 + 5 + + 147072 + 123960 + 46580 + 352 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..c5edb76 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 48 + 50 + 6 + 6 + 1 + 5 + + 220608 + 194568 + 85447 + 161 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..ab90b2b --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 50 + 6 + 6 + 1 + 5 + + 220608 + 194986 + 84300 + 181 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..f34e4ce --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 48 + 50 + 6 + 8 + 1 + 5 + + 294144 + 267129 + 128744 + 154 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..1a80400 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 50 + 6 + 8 + 1 + 5 + + 294144 + 267423 + 139002 + 312 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..833f8b5 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 48 + 90 + 6 + 4 + 0 + -1 + + 147072 + 143692 + 134063 + 130731 + 130729 + 130729 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..24925bc --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 90 + 6 + 4 + 0 + -1 + + 147072 + 143708 + 134104 + 131299 + 131299 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..7b6d0dd --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 48 + 90 + 6 + 6 + 0 + -1 + + 220608 + 216821 + 203312 + 195460 + 195425 + 195425 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..6d800c7 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 48 + 90 + 6 + 6 + 0 + -1 + + 220608 + 217230 + 205234 + 198526 + 198494 + 198494 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..97fef72 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 48 + 90 + 6 + 8 + 0 + -1 + + 294144 + 290464 + 275176 + 263521 + 263378 + 263378 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..7648a29 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 48 + 90 + 6 + 8 + 0 + -1 + + 294144 + 290818 + 277005 + 266678 + 266564 + 266564 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..87eb411 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 384 + 64 + 10 + 6 + 4 + 1 + 4 + + 196096 + 142856 + 19187 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..c18d992 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 384 + 64 + 10 + 6 + 4 + 1 + 4 + + 196096 + 143075 + 19427 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..c10de48 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 384 + 64 + 10 + 6 + 6 + 1 + 4 + + 294144 + 238918 + 66228 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..33b5bc7 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 10 + 6 + 6 + 1 + 5 + + 294144 + 238912 + 66350 + 105 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..6180654 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 10 + 6 + 8 + 1 + 5 + + 392192 + 332725 + 117921 + 68 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..0905a9c --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 10 + 6 + 8 + 1 + 5 + + 392192 + 333316 + 122544 + 103 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..f969d33 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 50 + 6 + 4 + 1 + 5 + + 196096 + 151180 + 30372 + 33 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..e4d9c82 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 50 + 6 + 4 + 1 + 5 + + 196096 + 155955 + 45622 + 677 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..07cdeee --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 50 + 6 + 6 + 1 + 5 + + 294144 + 251507 + 91484 + 110 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..8b9207e --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 50 + 6 + 6 + 1 + 5 + + 294144 + 251901 + 102363 + 173 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..e61d531 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 50 + 6 + 8 + 1 + 5 + + 392192 + 349706 + 165744 + 620 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..5e46195 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 50 + 6 + 8 + 1 + 5 + + 392192 + 349178 + 156957 + 462 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..f201dca --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 90 + 6 + 4 + 0 + -1 + + 196096 + 190860 + 178364 + 176509 + 176509 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..3bb1f13 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 90 + 6 + 4 + 0 + -1 + + 196096 + 191038 + 179236 + 177280 + 177280 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..f674dd6 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 64 + 90 + 6 + 6 + 0 + -1 + + 294144 + 288628 + 271625 + 265139 + 265126 + 265126 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..5241f15 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 64 + 90 + 6 + 6 + 0 + -1 + + 294144 + 288384 + 270824 + 263856 + 263852 + 263852 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..239a3a4 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 64 + 90 + 6 + 8 + 0 + -1 + + 392192 + 386442 + 365702 + 353963 + 353892 + 353892 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..0a47452 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 64 + 90 + 6 + 8 + 0 + -1 + + 392192 + 386413 + 365609 + 354426 + 354370 + 354370 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..153fa53 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 10 + 6 + 4 + 1 + 5 + + 130816 + 116225 + 55984 + 739 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..9353be2 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 10 + 6 + 4 + 1 + 5 + + 130816 + 116174 + 56550 + 1045 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..757841e --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 10 + 6 + 6 + 1 + 5 + + 196224 + 180010 + 100891 + 720 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..8b440f7 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 10 + 6 + 6 + 1 + 5 + + 196224 + 179467 + 98233 + 653 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..ffacc3b --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 10 + 6 + 8 + 1 + 5 + + 261632 + 244197 + 147716 + 278 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..61b589e --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 10 + 6 + 8 + 1 + 5 + + 261632 + 243975 + 145555 + 241 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..761aa80 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 50 + 6 + 4 + 1 + 5 + + 130816 + 119683 + 67389 + 2454 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..e96b4fd --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 50 + 6 + 4 + 1 + 5 + + 130816 + 118934 + 65602 + 1737 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..0f71f22 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 50 + 6 + 6 + 1 + 5 + + 196224 + 185235 + 125274 + 6304 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..ab0686d --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 50 + 6 + 6 + 1 + 5 + + 196224 + 183126 + 108379 + 1777 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..1e76475 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 50 + 6 + 8 + 1 + 5 + + 261632 + 248296 + 162540 + 2250 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..990b646 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 50 + 6 + 8 + 1 + 5 + + 261632 + 249166 + 174034 + 5883 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..adffade --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 32 + 90 + 6 + 4 + 0 + -1 + + 130816 + 129365 + 123315 + 118148 + 118040 + 118040 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..77871ff --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 32 + 90 + 6 + 4 + 0 + -1 + + 130816 + 129620 + 124668 + 120190 + 120092 + 120092 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..02bf39f --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 32 + 90 + 6 + 6 + 0 + -1 + + 196224 + 194718 + 187462 + 179125 + 178790 + 178790 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..938eaef --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 32 + 90 + 6 + 6 + 0 + -1 + + 196224 + 194581 + 186457 + 177094 + 176679 + 176679 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..f947a43 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 32 + 90 + 6 + 8 + 0 + -1 + + 261632 + 259996 + 250991 + 237989 + 237104 + 237104 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..bc0dd10 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 32 + 90 + 6 + 8 + 0 + -1 + + 261632 + 259870 + 250187 + 237297 + 236592 + 236592 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..a5ba072 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 10 + 6 + 4 + 1 + 5 + + 193152 + 162220 + 57463 + 285 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..1eba6e3 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 10 + 6 + 4 + 1 + 5 + + 193152 + 161793 + 56627 + 206 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..952b400 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 10 + 6 + 6 + 1 + 5 + + 294336 + 261741 + 125929 + 1359 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..4040d24 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 10 + 6 + 6 + 1 + 5 + + 294336 + 261352 + 124740 + 1165 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..947d1fb --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 10 + 6 + 8 + 1 + 5 + + 390912 + 355055 + 187877 + 1062 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..bd7b2c3 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 10 + 6 + 8 + 1 + 5 + + 390912 + 355267 + 188039 + 697 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..88e4f93 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 50 + 6 + 4 + 1 + 5 + + 193152 + 168978 + 79662 + 718 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..3ecb7e7 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 50 + 6 + 4 + 1 + 5 + + 193152 + 168811 + 76651 + 1548 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..9d81b3a --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 50 + 6 + 6 + 1 + 5 + + 294336 + 268238 + 142125 + 2581 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..48f2d7e --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 50 + 6 + 6 + 1 + 5 + + 294336 + 271760 + 157700 + 3119 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..0b20072 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 50 + 6 + 8 + 1 + 5 + + 390912 + 363762 + 217175 + 4807 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..4cedd0a --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 50 + 6 + 8 + 1 + 5 + + 390912 + 362368 + 213673 + 3896 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..eb4fe32 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 48 + 90 + 6 + 4 + 0 + -1 + + 193152 + 189929 + 178919 + 173234 + 173198 + 173198 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..e556ec4 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 48 + 90 + 6 + 4 + 0 + -1 + + 193152 + 189903 + 178933 + 173129 + 173115 + 173115 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..f2ec436 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 48 + 90 + 6 + 6 + 0 + -1 + + 294336 + 291068 + 277755 + 265266 + 264954 + 264954 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..fd5e8ae --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 48 + 90 + 6 + 6 + 0 + -1 + + 294336 + 290375 + 274459 + 259969 + 259595 + 259595 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..d498c1b --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 48 + 90 + 6 + 8 + 0 + -1 + + 390912 + 387450 + 370948 + 352132 + 351389 + 351389 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..979dc75 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 48 + 90 + 6 + 8 + 0 + -1 + + 390912 + 387001 + 368619 + 349083 + 348163 + 348163 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..b9e1837 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 512 + 64 + 10 + 6 + 4 + 1 + 4 + + 261632 + 208426 + 56540 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..b0ba5c6 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 512 + 64 + 10 + 6 + 4 + 1 + 4 + + 261632 + 208607 + 54936 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..8764cbf --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 10 + 6 + 6 + 1 + 5 + + 392448 + 335687 + 129768 + 472 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..8874722 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 10 + 6 + 6 + 1 + 5 + + 392448 + 335653 + 130771 + 765 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..cf5fffe --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 10 + 6 + 8 + 1 + 5 + + 523264 + 464083 + 219165 + 1738 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..6a0eb62 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 10 + 6 + 8 + 1 + 5 + + 523264 + 463849 + 219852 + 2041 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..b0c8708 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 50 + 6 + 4 + 1 + 5 + + 261632 + 220646 + 87197 + 628 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..795f780 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 50 + 6 + 4 + 1 + 5 + + 261632 + 220784 + 80130 + 843 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..8dc301e --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 50 + 6 + 6 + 1 + 5 + + 392448 + 350684 + 170234 + 1823 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..f310e0d --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 50 + 6 + 6 + 1 + 5 + + 392448 + 351659 + 175183 + 2381 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..2dcf226 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 50 + 6 + 8 + 1 + 5 + + 523264 + 476987 + 253066 + 4294 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..1ca59d9 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 50 + 6 + 8 + 1 + 5 + + 523264 + 479525 + 269437 + 5352 + 0 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..0ed923b --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 90 + 6 + 4 + 0 + -1 + + 261632 + 256120 + 240573 + 234812 + 234812 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..8557b1f --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 64 + 90 + 6 + 4 + 0 + -1 + + 261632 + 256851 + 242785 + 237940 + 237933 + 237933 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..a996d20 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 64 + 90 + 6 + 6 + 0 + -1 + + 392448 + 386757 + 366137 + 353034 + 352880 + 352880 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..2cc2712 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 64 + 90 + 6 + 6 + 0 + -1 + + 392448 + 386688 + 366146 + 352743 + 352590 + 352590 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..922d3cc --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 64 + 90 + 6 + 8 + 0 + -1 + + 523264 + 516878 + 490489 + 467576 + 467166 + 467166 + + diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..3987442 --- /dev/null +++ b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 64 + 90 + 6 + 8 + 0 + -1 + + 523264 + 517326 + 493006 + 471877 + 471514 + 471514 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..b28cb0f --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 10 + 6 + 4 + 1 + 4 + + 65280 + 50845 + 10607 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..ed4c9d8 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 32 + 10 + 6 + 4 + 1 + 4 + + 65280 + 50975 + 10799 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..c07583e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 10 + 6 + 6 + 1 + 4 + + 97920 + 81654 + 24638 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..33291c4 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 32 + 10 + 6 + 6 + 1 + 4 + + 97920 + 82129 + 26170 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..2cbd908 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 10 + 6 + 8 + 1 + 4 + + 130560 + 112906 + 40533 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..59a3fc0 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 32 + 10 + 6 + 8 + 1 + 4 + + 130560 + 113193 + 41149 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..5497037 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 32 + 50 + 6 + 4 + 1 + 5 + + 65280 + 54917 + 20135 + 179 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..21271e4 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 32 + 50 + 6 + 4 + 1 + 5 + + 65280 + 54790 + 19241 + 52 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..16326c5 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 50 + 6 + 6 + 1 + 4 + + 97920 + 86442 + 36212 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..1e11ea0 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 32 + 50 + 6 + 6 + 1 + 5 + + 97920 + 85829 + 33402 + 17 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..53ffc60 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 32 + 50 + 6 + 8 + 1 + 4 + + 130560 + 118895 + 57483 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..8544f9e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 32 + 50 + 6 + 8 + 1 + 4 + + 130560 + 116579 + 46754 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..c5c5bbd --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 32 + 90 + 6 + 4 + 0 + -1 + + 65280 + 63789 + 59737 + 58647 + 58647 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..b58c4df --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 32 + 90 + 6 + 4 + 0 + -1 + + 65280 + 63671 + 59214 + 58087 + 58087 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..a0d69f2 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 32 + 90 + 6 + 6 + 0 + -1 + + 97920 + 96128 + 89780 + 86738 + 86725 + 86725 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..b9fdefe --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 256 + 32 + 90 + 6 + 6 + 0 + -1 + + 97920 + 96366 + 90884 + 88263 + 88254 + 88254 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..673b4a0 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 32 + 90 + 6 + 8 + 0 + -1 + + 130560 + 129046 + 122712 + 119229 + 119211 + 119211 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..50e1a87 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 256 + 32 + 90 + 6 + 8 + 0 + -1 + + 130560 + 128977 + 122510 + 118981 + 118960 + 118960 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..7217862 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 10 + 6 + 4 + 1 + 4 + + 96384 + 65869 + 5677 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..4ae1563 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 10 + 6 + 4 + 1 + 4 + + 96384 + 65812 + 5312 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..b7fa07d --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 10 + 6 + 6 + 1 + 4 + + 146880 + 114531 + 23340 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..bf711d1 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 10 + 6 + 6 + 1 + 4 + + 146880 + 114452 + 24782 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..1313e55 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 10 + 6 + 8 + 1 + 4 + + 192768 + 157852 + 43108 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..84dd1cb --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 10 + 6 + 8 + 1 + 4 + + 192768 + 157929 + 43868 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..bd35b2e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 48 + 50 + 6 + 4 + 1 + 5 + + 96384 + 73913 + 15976 + 26 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..1b6ca09 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 48 + 50 + 6 + 4 + 1 + 5 + + 96384 + 72710 + 14977 + 380 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..6970f2e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 50 + 6 + 6 + 1 + 4 + + 146880 + 120241 + 28432 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..4ddd72d --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 50 + 6 + 6 + 1 + 4 + + 146880 + 122554 + 37015 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..0732b5d --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 48 + 50 + 6 + 8 + 1 + 4 + + 192768 + 165328 + 52842 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..c66d2c8 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 48 + 50 + 6 + 8 + 1 + 4 + + 192768 + 166855 + 55597 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..a4bfb53 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 48 + 90 + 6 + 4 + 0 + -1 + + 96384 + 93336 + 87304 + 86680 + 86680 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..853d528 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 48 + 90 + 6 + 4 + 0 + -1 + + 96384 + 93182 + 86727 + 86130 + 86130 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..c6e141e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 48 + 90 + 6 + 6 + 0 + -1 + + 146880 + 143625 + 134314 + 132024 + 132024 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..6f7374d --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 256 + 48 + 90 + 6 + 6 + 0 + -1 + + 146880 + 143565 + 134449 + 132021 + 132018 + 132018 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..4b78c5e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 48 + 90 + 6 + 8 + 0 + -1 + + 192768 + 189560 + 179183 + 175299 + 175294 + 175294 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..d67e5b5 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 256 + 48 + 90 + 6 + 8 + 0 + -1 + + 192768 + 189401 + 178491 + 174286 + 174274 + 174274 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..df36871 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 10 + 6 + 4 + 1 + 4 + + 130560 + 77912 + 1884 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..86ac173 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 10 + 6 + 4 + 1 + 4 + + 130560 + 77597 + 1621 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..4e6181c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 10 + 6 + 6 + 1 + 4 + + 195840 + 140546 + 16869 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..ff48955 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 10 + 6 + 6 + 1 + 4 + + 195840 + 140288 + 17790 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..ffa0535 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 10 + 6 + 8 + 1 + 4 + + 261120 + 202665 + 40237 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..5541435 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 10 + 6 + 8 + 1 + 4 + + 261120 + 201979 + 39550 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..416fe92 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 50 + 6 + 4 + 1 + 4 + + 130560 + 88397 + 9581 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..bf8acbd --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 64 + 50 + 6 + 4 + 1 + 5 + + 130560 + 94870 + 28965 + 3403 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..e19540f --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 50 + 6 + 6 + 1 + 4 + + 195840 + 154685 + 34361 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..1053c27 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 50 + 6 + 6 + 1 + 4 + + 195840 + 152278 + 29683 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..5bd7c01 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 256 + 64 + 50 + 6 + 8 + 1 + 4 + + 261120 + 215719 + 54906 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..440fa87 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 256 + 64 + 50 + 6 + 8 + 1 + 4 + + 261120 + 217041 + 55570 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..db0954a --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 64 + 90 + 6 + 4 + 0 + -1 + + 130560 + 125772 + 118862 + 118604 + 118604 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..506cf9a --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 64 + 90 + 6 + 4 + 0 + -1 + + 130560 + 125443 + 117933 + 117793 + 117793 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..e7b993c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 256 + 64 + 90 + 6 + 6 + 0 + -1 + + 195840 + 190088 + 176880 + 175135 + 175135 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..08dbb2f --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 256 + 64 + 90 + 6 + 6 + 0 + -1 + + 195840 + 190311 + 177900 + 176149 + 176149 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..39a1d67 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 256 + 64 + 90 + 6 + 8 + 0 + -1 + + 261120 + 255233 + 238579 + 234157 + 234155 + 234155 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..48d1bba --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 256 + 64 + 90 + 6 + 8 + 0 + -1 + + 261120 + 255214 + 238845 + 234293 + 234290 + 234290 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..381867b --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 10 + 6 + 4 + 1 + 5 + + 98048 + 83686 + 31731 + 20 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..d1ab4ec --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 10 + 6 + 4 + 1 + 5 + + 98048 + 83381 + 30091 + 37 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..39a7609 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 10 + 6 + 6 + 1 + 5 + + 147072 + 130821 + 59778 + 35 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..e9d5e0b --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 10 + 6 + 6 + 1 + 5 + + 147072 + 131059 + 60443 + 17 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..a3f3200 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 384 + 32 + 10 + 6 + 8 + 1 + 4 + + 196096 + 178457 + 89078 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..fb2c01d --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 384 + 32 + 10 + 6 + 8 + 1 + 4 + + 196096 + 178191 + 89205 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..804d774 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 50 + 6 + 4 + 1 + 5 + + 98048 + 86763 + 40933 + 426 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..d70cd7d --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 50 + 6 + 4 + 1 + 5 + + 98048 + 86382 + 39024 + 265 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..22b1129 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 50 + 6 + 6 + 1 + 5 + + 147072 + 136556 + 81490 + 1761 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..35ccf1b --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 50 + 6 + 6 + 1 + 5 + + 147072 + 134949 + 73128 + 221 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..eac4ef3 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 32 + 50 + 6 + 8 + 1 + 5 + + 196096 + 182834 + 103770 + 86 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..6d89c7e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 32 + 50 + 6 + 8 + 1 + 5 + + 196096 + 182003 + 99448 + 35 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..d2a8697 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 32 + 90 + 6 + 4 + 0 + -1 + + 98048 + 96519 + 91224 + 88115 + 88090 + 88090 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..ac0c272 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 32 + 90 + 6 + 4 + 0 + -1 + + 98048 + 96621 + 91433 + 88575 + 88561 + 88561 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..a74e4d3 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 32 + 90 + 6 + 6 + 0 + -1 + + 147072 + 145272 + 137319 + 130549 + 130423 + 130423 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..cc06d10 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 32 + 90 + 6 + 6 + 0 + -1 + + 147072 + 145619 + 139381 + 133556 + 133420 + 133420 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..eb98398 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 32 + 90 + 6 + 8 + 0 + -1 + + 196096 + 194328 + 185408 + 176209 + 175979 + 175979 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..f851afd --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 32 + 90 + 6 + 8 + 0 + -1 + + 196096 + 194271 + 185192 + 175372 + 175028 + 175028 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..17f6b54 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 384 + 48 + 10 + 6 + 4 + 1 + 4 + + 147072 + 115805 + 27872 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..11c8be9 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 10 + 6 + 4 + 1 + 5 + + 147072 + 116365 + 29071 + 56 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..30b844c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 48 + 10 + 6 + 6 + 1 + 5 + + 220608 + 186970 + 67203 + 79 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..1c8913b --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 10 + 6 + 6 + 1 + 5 + + 220608 + 187292 + 68328 + 53 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..5baf85e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 384 + 48 + 10 + 6 + 8 + 1 + 4 + + 294144 + 257980 + 108832 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..9ebe88f --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 10 + 6 + 8 + 1 + 5 + + 294144 + 258674 + 112445 + 25 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..4734390 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 48 + 50 + 6 + 4 + 1 + 5 + + 147072 + 123349 + 46076 + 429 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..6125afd --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 50 + 6 + 4 + 1 + 5 + + 147072 + 123581 + 44592 + 123 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..8700886 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 48 + 50 + 6 + 6 + 1 + 5 + + 220608 + 195424 + 85760 + 184 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..05a3139 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 50 + 6 + 6 + 1 + 5 + + 220608 + 193743 + 80797 + 28 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..eda0efb --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 48 + 50 + 6 + 8 + 1 + 5 + + 294144 + 266545 + 128925 + 182 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..17db62c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 50 + 6 + 8 + 1 + 5 + + 294144 + 265791 + 127546 + 156 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..e7b4871 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 48 + 90 + 6 + 4 + 0 + -1 + + 147072 + 144187 + 135674 + 132964 + 132964 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..2d506ea --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 48 + 90 + 6 + 4 + 0 + -1 + + 147072 + 144001 + 135252 + 132462 + 132462 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..b097d6c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 48 + 90 + 6 + 6 + 0 + -1 + + 220608 + 217372 + 205766 + 199093 + 199059 + 199059 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..3674f77 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 48 + 90 + 6 + 6 + 0 + -1 + + 220608 + 217016 + 204235 + 197388 + 197326 + 197326 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..ad36142 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 48 + 90 + 6 + 8 + 0 + -1 + + 294144 + 290561 + 275748 + 264295 + 264134 + 264134 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..19a0e82 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 48 + 90 + 6 + 8 + 0 + -1 + + 294144 + 290427 + 275197 + 263654 + 263500 + 263500 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..d7a0bee --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 384 + 64 + 10 + 6 + 4 + 1 + 4 + + 196096 + 142968 + 20341 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..01574fa --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 384 + 64 + 10 + 6 + 4 + 1 + 4 + + 196096 + 143218 + 20908 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..aa34ccd --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 10 + 6 + 6 + 1 + 5 + + 294144 + 239265 + 66902 + 33 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..cde94c5 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,17 @@ + + + 1 + 384 + 64 + 10 + 6 + 6 + 1 + 4 + + 294144 + 237575 + 62635 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..10e917c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 10 + 6 + 8 + 1 + 5 + + 392192 + 332800 + 119240 + 67 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..24d41ee --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 10 + 6 + 8 + 1 + 5 + + 392192 + 333341 + 119837 + 66 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..c9a48f7 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 50 + 6 + 4 + 1 + 5 + + 196096 + 153754 + 37797 + 233 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..49b9822 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 50 + 6 + 4 + 1 + 5 + + 196096 + 158234 + 51274 + 1447 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..5aea244 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 50 + 6 + 6 + 1 + 5 + + 294144 + 252466 + 98066 + 343 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..2c30dff --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 50 + 6 + 6 + 1 + 5 + + 294144 + 252645 + 104335 + 169 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..1e5a094 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 50 + 6 + 8 + 1 + 5 + + 392192 + 345009 + 143695 + 482 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..f4e8bc7 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 50 + 6 + 8 + 1 + 5 + + 392192 + 344717 + 138232 + 237 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..05bdc82 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 90 + 6 + 4 + 0 + -1 + + 196096 + 190793 + 178511 + 176660 + 176660 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..e2b7971 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 384 + 64 + 90 + 6 + 4 + 0 + -1 + + 196096 + 190620 + 177827 + 175881 + 175881 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..6ffccf6 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 384 + 64 + 90 + 6 + 6 + 0 + -1 + + 294144 + 288988 + 273221 + 267010 + 267010 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..db2911e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 64 + 90 + 6 + 6 + 0 + -1 + + 294144 + 288360 + 270811 + 263935 + 263914 + 263914 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..a911535 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 384 + 64 + 90 + 6 + 8 + 0 + -1 + + 392192 + 387091 + 368864 + 358357 + 358293 + 358293 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..f53847d --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 384 + 64 + 90 + 6 + 8 + 0 + -1 + + 392192 + 386268 + 364938 + 352627 + 352552 + 352552 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..ef2c9e6 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 10 + 6 + 4 + 1 + 5 + + 130816 + 116273 + 55785 + 961 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..fde0876 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 10 + 6 + 4 + 1 + 5 + + 130816 + 116219 + 56241 + 879 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..4bc0f51 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 10 + 6 + 6 + 1 + 5 + + 196224 + 180242 + 101338 + 741 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..7139e7d --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 10 + 6 + 6 + 1 + 5 + + 196224 + 180134 + 101219 + 791 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..b14e27b --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 10 + 6 + 8 + 1 + 5 + + 261632 + 243877 + 144491 + 226 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..edf1dff --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 10 + 6 + 8 + 1 + 5 + + 261632 + 243957 + 145314 + 173 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..3b898bd --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 50 + 6 + 4 + 1 + 5 + + 130816 + 120949 + 75317 + 4649 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..4ef390c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 50 + 6 + 4 + 1 + 5 + + 130816 + 119569 + 69042 + 1867 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..8b33862 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 50 + 6 + 6 + 1 + 5 + + 196224 + 183108 + 111450 + 2000 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..d103a37 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 50 + 6 + 6 + 1 + 5 + + 196224 + 183908 + 115619 + 3007 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..cb36abe --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 32 + 50 + 6 + 8 + 1 + 5 + + 261632 + 250983 + 183831 + 10774 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..0d16aef --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 32 + 50 + 6 + 8 + 1 + 5 + + 261632 + 247680 + 159001 + 1362 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..2b3c5ab --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 32 + 90 + 6 + 4 + 0 + -1 + + 130816 + 129297 + 123110 + 117200 + 117013 + 117013 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..a109a2b --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 32 + 90 + 6 + 4 + 0 + -1 + + 130816 + 129136 + 122295 + 116156 + 116006 + 116006 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..70d30bd --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 32 + 90 + 6 + 6 + 0 + -1 + + 196224 + 194418 + 185607 + 175100 + 174568 + 174568 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..734531f --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 32 + 90 + 6 + 6 + 0 + -1 + + 196224 + 194601 + 186858 + 177448 + 176869 + 176869 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..fbc2bcb --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 32 + 90 + 6 + 8 + 0 + -1 + + 261632 + 259562 + 247947 + 233021 + 232255 + 232255 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..7d1d16c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 32 + 90 + 6 + 8 + 0 + -1 + + 261632 + 260164 + 252064 + 240847 + 240166 + 240166 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..e2237c7 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 10 + 6 + 4 + 1 + 5 + + 193152 + 162120 + 58849 + 374 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..c7837b3 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 10 + 6 + 4 + 1 + 5 + + 193152 + 161230 + 53731 + 168 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..9345b96 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 10 + 6 + 6 + 1 + 5 + + 294336 + 260744 + 121235 + 876 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..047e708 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 10 + 6 + 6 + 1 + 5 + + 294336 + 260631 + 121354 + 1355 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..f65e91c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 10 + 6 + 8 + 1 + 5 + + 390912 + 354577 + 184856 + 965 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..3cb9f66 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 10 + 6 + 8 + 1 + 5 + + 390912 + 354501 + 184190 + 562 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..8f02699 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 50 + 6 + 4 + 1 + 5 + + 193152 + 168914 + 76321 + 729 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..2d3150c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 50 + 6 + 4 + 1 + 5 + + 193152 + 168454 + 72673 + 435 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..29a76bd --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 50 + 6 + 6 + 1 + 5 + + 294336 + 269929 + 153693 + 2574 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..4714824 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 50 + 6 + 6 + 1 + 5 + + 294336 + 268328 + 143446 + 2563 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..5328c38 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 48 + 50 + 6 + 8 + 1 + 5 + + 390912 + 362508 + 211807 + 4156 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..3f20ec9 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 48 + 50 + 6 + 8 + 1 + 5 + + 390912 + 366687 + 233269 + 7436 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..845ef34 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 48 + 90 + 6 + 4 + 0 + -1 + + 193152 + 190455 + 181302 + 176391 + 176381 + 176381 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..90c77f6 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 48 + 90 + 6 + 4 + 0 + -1 + + 193152 + 189859 + 178726 + 172577 + 172534 + 172534 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..40d16c8 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 48 + 90 + 6 + 6 + 0 + -1 + + 294336 + 290931 + 276934 + 264509 + 264187 + 264187 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..2a310c8 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 48 + 90 + 6 + 6 + 0 + -1 + + 294336 + 290970 + 277109 + 264975 + 264706 + 264706 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..899a41c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 48 + 90 + 6 + 8 + 0 + -1 + + 390912 + 387433 + 371120 + 353614 + 352911 + 352911 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..c7b6c70 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 48 + 90 + 6 + 8 + 0 + -1 + + 390912 + 387739 + 372905 + 356735 + 356129 + 356129 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml new file mode 100644 index 0000000..2b30185 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml @@ -0,0 +1,17 @@ + + + 0 + 512 + 64 + 10 + 6 + 4 + 1 + 4 + + 261632 + 207399 + 51641 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml new file mode 100644 index 0000000..1977b5c --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 10 + 6 + 4 + 1 + 5 + + 261632 + 208431 + 52583 + 89 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml new file mode 100644 index 0000000..5f3c707 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 10 + 6 + 6 + 1 + 5 + + 392448 + 335237 + 126492 + 590 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml new file mode 100644 index 0000000..7dca2d5 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 10 + 6 + 6 + 1 + 5 + + 392448 + 336373 + 131586 + 684 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml new file mode 100644 index 0000000..1d65a20 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 10 + 6 + 8 + 1 + 5 + + 523264 + 464128 + 223233 + 2404 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml new file mode 100644 index 0000000..f7a81d9 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 10 + 6 + 8 + 1 + 5 + + 523264 + 463674 + 217480 + 1613 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml new file mode 100644 index 0000000..f1babd6 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 50 + 6 + 4 + 1 + 5 + + 261632 + 222593 + 90746 + 3833 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml new file mode 100644 index 0000000..3851483 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 50 + 6 + 4 + 1 + 5 + + 261632 + 220320 + 79148 + 609 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml new file mode 100644 index 0000000..03cdef2 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 50 + 6 + 6 + 1 + 5 + + 392448 + 353094 + 182395 + 4805 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml new file mode 100644 index 0000000..8c6bbcb --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 50 + 6 + 6 + 1 + 5 + + 392448 + 351143 + 181128 + 2739 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml new file mode 100644 index 0000000..653771a --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml @@ -0,0 +1,18 @@ + + + 0 + 512 + 64 + 50 + 6 + 8 + 1 + 5 + + 523264 + 476364 + 251483 + 3388 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml new file mode 100644 index 0000000..7910f7b --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 50 + 6 + 8 + 1 + 5 + + 523264 + 478438 + 259726 + 4189 + 0 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml new file mode 100644 index 0000000..3d21f9e --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 64 + 90 + 6 + 4 + 0 + -1 + + 261632 + 256103 + 240054 + 234538 + 234536 + 234536 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml new file mode 100644 index 0000000..5b143e7 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml @@ -0,0 +1,18 @@ + + + 1 + 512 + 64 + 90 + 6 + 4 + 0 + -1 + + 261632 + 256496 + 241666 + 236205 + 236205 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml new file mode 100644 index 0000000..d8a3ef4 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 64 + 90 + 6 + 6 + 0 + -1 + + 392448 + 387020 + 367393 + 354339 + 354240 + 354240 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml new file mode 100644 index 0000000..27999c7 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 64 + 90 + 6 + 6 + 0 + -1 + + 392448 + 386529 + 365359 + 351768 + 351634 + 351634 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml new file mode 100644 index 0000000..1604b61 --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml @@ -0,0 +1,19 @@ + + + 0 + 512 + 64 + 90 + 6 + 8 + 0 + -1 + + 523264 + 517643 + 494047 + 473685 + 473316 + 473316 + + diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml new file mode 100644 index 0000000..0b3769b --- /dev/null +++ b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml @@ -0,0 +1,19 @@ + + + 1 + 512 + 64 + 90 + 6 + 8 + 0 + -1 + + 523264 + 517141 + 492108 + 469814 + 469232 + 469232 + + From 6334d1c779db3138a20e8432b742b0d4b208e21b Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 8 Feb 2023 20:10:26 +0100 Subject: [PATCH 003/162] Removing static variables --- DAS/block.py | 2 -- DAS/configuration.py | 1 - DAS/observer.py | 14 ++++++-------- DAS/results.py | 4 ---- DAS/shape.py | 6 ------ DAS/simulator.py | 13 +++++-------- DAS/validator.py | 5 ----- config.das => config.ini | 0 8 files changed, 11 insertions(+), 34 deletions(-) rename config.das => config.ini (100%) diff --git a/DAS/block.py b/DAS/block.py index aa5fe01..1cea8c0 100644 --- a/DAS/block.py +++ b/DAS/block.py @@ -6,8 +6,6 @@ from bitarray.util import zeros class Block: - blockSize = 0 - data = bitarray() def __init__(self, blockSize): self.blockSize = blockSize diff --git a/DAS/configuration.py b/DAS/configuration.py index a2e614e..d3647a4 100644 --- a/DAS/configuration.py +++ b/DAS/configuration.py @@ -4,7 +4,6 @@ import configparser class Configuration: - deterministic = 0 def __init__(self, fileName): diff --git a/DAS/observer.py b/DAS/observer.py index ad9052b..515fe09 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -4,18 +4,16 @@ from DAS.block import * class Observer: - block = [] - rows = [] - columns = [] - goldenData = [] - broadcasted = [] - config = [] - logger = [] - def __init__(self, logger, config): self.config = config self.format = {"entity": "Observer"} self.logger = logger + self.block = [] + self.rows = [] + self.columns = [] + self.goldenData = [] + self.broadcasted = [] + def reset(self): self.block = [0] * self.config.blockSize * self.config.blockSize diff --git a/DAS/results.py b/DAS/results.py index 48b6cbc..174e5e9 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -6,10 +6,6 @@ from dicttoxml import dicttoxml class Result: - shape = [] - missingVector = [] - blockAvailable = -1 - tta = -1 def __init__(self, shape): self.shape = shape diff --git a/DAS/shape.py b/DAS/shape.py index 243ae8e..84efc1e 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -1,12 +1,6 @@ #!/bin/python3 class Shape: - run = 0 - numberValidators = 0 - blockSize = 0 - failureRate = 0 - netDegree = 0 - chi = 0 def __init__(self, blockSize, numberValidators, failureRate, chi, netDegree, run): self.run = run diff --git a/DAS/simulator.py b/DAS/simulator.py index cba63c8..cc02a6b 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -10,19 +10,16 @@ from DAS.validator import * class Simulator: - proposerID = 0 - logLevel = logging.INFO - validators = [] - glob = [] - result = [] - shape = [] - logger = [] - format = {} def __init__(self, shape): self.shape = shape self.format = {"entity": "Simulator"} self.result = Result(self.shape) + self.validators = [] + self.logger = [] + self.logLevel = logging.INFO + self.proposerID = 0 + self.glob = [] def initValidators(self): self.glob = Observer(self.logger, self.shape) diff --git a/DAS/validator.py b/DAS/validator.py index 950fdea..491f3da 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -20,11 +20,6 @@ class Neighbor: class Validator: - ID = 0 - amIproposer = 0 - shape = [] - format = {} - logger = [] def __repr__(self): return str(self.ID) diff --git a/config.das b/config.ini similarity index 100% rename from config.das rename to config.ini From 17b97c37c094fab542bb94c566ffac2e7b29dd82 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 8 Feb 2023 22:31:51 +0100 Subject: [PATCH 004/162] Update gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index b948985..13d2a0a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.swp *.pyc +results/* +myenv From 5c55fd7854a9462715cbd93534a92c5b1d7205b2 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 8 Feb 2023 22:33:16 +0100 Subject: [PATCH 005/162] Add documentation files --- doc/Makefile | 20 ++++++++++++++++ doc/conf.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ doc/index.rst | 42 +++++++++++++++++++++++++++++++++ doc/make.bat | 35 ++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 doc/Makefile create mode 100644 doc/conf.py create mode 100644 doc/index.rst create mode 100644 doc/make.bat diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..7524d9c --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,64 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../DAS')) + + +# -- Project information ----------------------------------------------------- + +project = 'DAS simulator' +copyright = '2023, Leonardo A. Bautista-Gomez, Csaba Kiraly' +author = 'Leonardo A. Bautista-Gomez, Csaba Kiraly' + +# The full version, including alpha/beta/rc tags +release = '1' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.autodoc' +] + + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', 'myenv'] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + + +# -- Options for autodoc ------------------------------------------------- + +autodoc_mock_imports = ["django", "dicttoxml", "bitarray", "DAS", "networkx"] + + + diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..f6b5fc9 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,42 @@ +.. DAS simulator documentation master file, created by + sphinx-quickstart on Wed Feb 8 20:56:44 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to DAS simulator's documentation! +========================================= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +.. automodule:: block + :members: + +.. automodule:: configuration + :members: + +.. automodule:: observer + :members: + +.. automodule:: results + :members: + +.. automodule:: shape + :members: + +.. automodule:: simulator + :members: + +.. automodule:: tools + :members: + +.. automodule:: validator + :members: + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..153be5e --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd From cf780b3ca3ca533c841d2f01ad39431cc6e0ba4b Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 8 Feb 2023 22:45:01 +0100 Subject: [PATCH 006/162] Starting code documentation --- DAS/block.py | 2 +- DAS/tools.py | 3 ++- doc/index.rst | 12 +++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/DAS/block.py b/DAS/block.py index 1cea8c0..a22b70c 100644 --- a/DAS/block.py +++ b/DAS/block.py @@ -5,7 +5,7 @@ from bitarray import bitarray from bitarray.util import zeros class Block: - + """This class represents a block in the Ethereum blockchain""" def __init__(self, blockSize): self.blockSize = blockSize diff --git a/DAS/tools.py b/DAS/tools.py index b9e4a8e..68469fe 100644 --- a/DAS/tools.py +++ b/DAS/tools.py @@ -2,7 +2,8 @@ import logging -class CustomFormatter(logging.Formatter): +class CustomFormatter(): + """This class defines the terminal output formatting.""" blue = "\x1b[34;20m" grey = "\x1b[38;20m" diff --git a/doc/index.rst b/doc/index.rst index f6b5fc9..e253201 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -6,6 +6,13 @@ Welcome to DAS simulator's documentation! ========================================= +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + .. toctree:: :maxdepth: 2 :caption: Contents: @@ -34,9 +41,4 @@ Welcome to DAS simulator's documentation! .. automodule:: validator :members: -Indices and tables -================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` From 9888d96e438f8785e96e8be6e489b93b5577f97b Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 8 Feb 2023 22:46:12 +0100 Subject: [PATCH 007/162] Update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 13d2a0a..1e5dc45 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.pyc results/* myenv +doc/_build From 09569422ab4fce1c57a1a972beac37ed68984b29 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 15 Feb 2023 15:06:42 +0100 Subject: [PATCH 008/162] Documenting the DAS package for automatic generation with sphinx. First version. --- DAS/block.py | 12 +++++++++++- DAS/configuration.py | 3 ++- DAS/observer.py | 7 +++++++ DAS/results.py | 5 ++++- DAS/shape.py | 2 ++ DAS/simulator.py | 10 ++++++++-- DAS/tools.py | 32 +++++++++++++++++--------------- DAS/validator.py | 41 +++++++++++++++++++++++++++++++++++------ 8 files changed, 86 insertions(+), 26 deletions(-) diff --git a/DAS/block.py b/DAS/block.py index a22b70c..693d7b6 100644 --- a/DAS/block.py +++ b/DAS/block.py @@ -5,41 +5,51 @@ from bitarray import bitarray from bitarray.util import zeros class Block: - """This class represents a block in the Ethereum blockchain""" + """This class represents a block in the Ethereum blockchain.""" def __init__(self, blockSize): + """Initialize the block with a data array of blocksize^2 zeros.""" self.blockSize = blockSize self.data = zeros(self.blockSize*self.blockSize) def fill(self): + """It fills the block data with ones.""" self.data.setall(1) def merge(self, merged): + """It merges (OR) the existing block with the received one.""" self.data |= merged.data def getColumn(self, columnID): + """It returns the block column corresponding to columnID.""" return self.data[columnID::self.blockSize] def mergeColumn(self, columnID, column): + """It merges (OR) the existing column with the received one.""" self.data[columnID::self.blockSize] |= column def repairColumn(self, id): + """It repairs the entire column if it has at least blockSize/2 ones.""" success = self.data[id::self.blockSize].count(1) if success >= self.blockSize/2: self.data[id::self.blockSize] = 1 def getRow(self, rowID): + """It returns the block row corresponding to rowID.""" return self.data[rowID*self.blockSize:(rowID+1)*self.blockSize] def mergeRow(self, rowID, row): + """It merges (OR) the existing row with the received one.""" self.data[rowID*self.blockSize:(rowID+1)*self.blockSize] |= row def repairRow(self, id): + """It repairs the entire row if it has at least blockSize/2 ones.""" success = self.data[id*self.blockSize:(id+1)*self.blockSize].count(1) if success >= self.blockSize/2: self.data[id*self.blockSize:(id+1)*self.blockSize] = 1 def print(self): + """It prints the block in the terminal (outside of the logger rules)).""" dash = "-" * (self.blockSize+2) print(dash) for i in range(self.blockSize): diff --git a/DAS/configuration.py b/DAS/configuration.py index d3647a4..c840366 100644 --- a/DAS/configuration.py +++ b/DAS/configuration.py @@ -3,9 +3,10 @@ import configparser 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) diff --git a/DAS/observer.py b/DAS/observer.py index 515fe09..af5866a 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -3,8 +3,10 @@ from DAS.block import * class Observer: + """This class gathers global data from the simulation, like an 'all-seen god'.""" def __init__(self, logger, config): + """It initializes the observer with a logger and given configuration.""" self.config = config self.format = {"entity": "Observer"} self.logger = logger @@ -16,6 +18,7 @@ class Observer: def reset(self): + """It resets all the gathered data to zeros.""" self.block = [0] * self.config.blockSize * self.config.blockSize self.goldenData = [0] * self.config.blockSize * self.config.blockSize self.rows = [0] * self.config.blockSize @@ -23,6 +26,7 @@ class Observer: self.broadcasted = Block(self.config.blockSize) def checkRowsColumns(self, validators): + """It checks how many validators have been assigned to each row and column.""" for val in validators: if val.amIproposer == 0: for r in val.rowIDs: @@ -36,10 +40,12 @@ class Observer: self.logger.warning("There is a row/column that has not been assigned", extra=self.format) def setGoldenData(self, block): + """Stores the original real data to compare it with future situations.""" for i in range(self.config.blockSize*self.config.blockSize): self.goldenData[i] = block.data[i] def checkBroadcasted(self): + """It checks how many broadcasted samples are still missing in the network.""" zeros = 0 for i in range(self.blockSize * self.blockSize): if self.broadcasted.data[i] == 0: @@ -49,6 +55,7 @@ class Observer: return zeros def checkStatus(self, validators): + """It checks the status of how many expected and arrived samples globally.""" arrived = 0 expected = 0 for val in validators: diff --git a/DAS/results.py b/DAS/results.py index 174e5e9..e20cdec 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -5,15 +5,17 @@ from xml.dom import minidom from dicttoxml import dicttoxml class Result: - + """This class stores and process/store the results of a simulation.""" def __init__(self, shape): + """It initializes the instance with a specific shape.""" self.shape = shape self.blockAvailable = -1 self.tta = -1 self.missingVector = [] def populate(self, shape, missingVector): + """It populates part of the result data inside a vector.""" self.shape = shape self.missingVector = missingVector missingSamples = missingVector[-1] @@ -25,6 +27,7 @@ class Result: self.tta = -1 def dump(self, execID): + """It dumps the results of the simulation in an XML file.""" if not os.path.exists("results"): os.makedirs("results") if not os.path.exists("results/"+execID): diff --git a/DAS/shape.py b/DAS/shape.py index 84efc1e..2f99ebf 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -1,8 +1,10 @@ #!/bin/python3 class Shape: + """This class represents a set of parameters for a specific simulation.""" def __init__(self, blockSize, numberValidators, failureRate, chi, netDegree, run): + """Initializes the shape with the parameters passed in argument.""" self.run = run self.numberValidators = numberValidators self.blockSize = blockSize diff --git a/DAS/simulator.py b/DAS/simulator.py index cc02a6b..3e6e496 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -9,9 +9,10 @@ from DAS.observer import * from DAS.validator import * class Simulator: - + """This class implements the main DAS simulator.""" def __init__(self, shape): + """It initializes the simulation with a set of parameters (shape).""" self.shape = shape self.format = {"entity": "Simulator"} self.result = Result(self.shape) @@ -22,6 +23,7 @@ class Simulator: self.glob = [] def initValidators(self): + """It initializes all the validators in the network.""" self.glob = Observer(self.logger, self.shape) self.glob.reset() self.validators = [] @@ -39,6 +41,7 @@ class Simulator: self.validators.append(val) def initNetwork(self): + """It initializes the simulated network.""" self.shape.netDegree = 6 rowChannels = [[] for i in range(self.shape.blockSize)] columnChannels = [[] for i in range(self.shape.blockSize)] @@ -73,6 +76,7 @@ class Simulator: val2.columnNeighbors[id].update({val1.ID : Neighbor(val1, self.shape.blockSize)}) def initLogger(self): + """It initializes the logger.""" logger = logging.getLogger("DAS") logger.setLevel(self.logLevel) ch = logging.StreamHandler() @@ -83,6 +87,7 @@ class Simulator: def resetShape(self, shape): + """It resets the parameters of the simulation.""" self.shape = shape self.result = Result(self.shape) for val in self.validators: @@ -91,6 +96,7 @@ class Simulator: def run(self): + """It runs the main simulation until the block is available or it gets stucked.""" self.glob.checkRowsColumns(self.validators) self.validators[self.proposerID].broadcastBlock() arrived, expected = self.glob.checkStatus(self.validators) @@ -118,7 +124,7 @@ class Simulator: missingRate = missingSamples*100/expected self.logger.debug("step %d, missing %d of %d (%0.02f %%)" % (steps, missingSamples, expected, missingRate), extra=self.format) if missingSamples == oldMissingSamples: - #self.logger.info("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) + self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) missingVector.append(missingSamples) break elif missingSamples == 0: diff --git a/DAS/tools.py b/DAS/tools.py index 68469fe..fb40c71 100644 --- a/DAS/tools.py +++ b/DAS/tools.py @@ -5,23 +5,25 @@ import logging class CustomFormatter(): """This class defines the terminal output formatting.""" - blue = "\x1b[34;20m" - grey = "\x1b[38;20m" - yellow = "\x1b[33;20m" - red = "\x1b[31;20m" - bold_red = "\x1b[31;1m" - reset = "\x1b[0m" - format = "%(levelname)s : %(entity)s : %(message)s" - - FORMATS = { - logging.DEBUG: grey + format + reset, - logging.INFO: blue + format + reset, - logging.WARNING: yellow + format + reset, - logging.ERROR: red + format + reset, - logging.CRITICAL: bold_red + format + reset - } + def __init__(self): + """Initializes 5 different formats for logging with different colors.""" + self.blue = "\x1b[34;20m" + self.grey = "\x1b[38;20m" + self.yellow = "\x1b[33;20m" + self.red = "\x1b[31;20m" + self.bold_red = "\x1b[31;1m" + self.reset = "\x1b[0m" + self.reformat = "%(levelname)s : %(entity)s : %(message)s" + self.FORMATS = { + logging.DEBUG: self.grey + self.reformat + self.reset, + logging.INFO: self.blue + self.reformat + self.reset, + logging.WARNING: self.yellow + self.reformat + self.reset, + logging.ERROR: self.red + self.reformat + self.reset, + logging.CRITICAL: self.bold_red + self.reformat + self.reset + } def format(self, record): + """Returns the formatter with the format corresponding to record.""" log_fmt = self.FORMATS.get(record.levelno) formatter = logging.Formatter(log_fmt) return formatter.format(record) diff --git a/DAS/validator.py b/DAS/validator.py index 491f3da..6344925 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -7,24 +7,31 @@ from DAS.block import * from bitarray import bitarray from bitarray.util import zeros + class Neighbor: + """This class implements a node neighbor to monitor sent and received data.""" def __repr__(self): + """It returns the amount of sent and received data.""" return "%d:%d/%d" % (self.node.ID, self.sent.count(1), self.received.count(1)) def __init__(self, v, blockSize): + """It initializes the neighbor with the node and sets counters to zero.""" self.node = v self.receiving = zeros(blockSize) self.received = zeros(blockSize) self.sent = zeros(blockSize) -class Validator: +class Validator: + """This class implements a validator/node in the network.""" def __repr__(self): + """It returns the validator ID.""" return str(self.ID) def __init__(self, ID, amIproposer, logger, shape, rows, columns): + """It initializes the validator with the logger, shape and assigned rows/columns.""" self.shape = shape FORMAT = "%(levelname)s : %(entity)s : %(message)s" self.ID = ID @@ -60,6 +67,7 @@ class Validator: self.statsRxPerSlot = [] def logIDs(self): + """It logs the assigned rows and columns.""" if self.amIproposer == 1: self.logger.warning("I am a block proposer."% self.ID) else: @@ -67,14 +75,19 @@ class Validator: self.logger.debug("Selected columns: "+str(self.columnIDs), extra=self.format) def initBlock(self): - self.logger.debug("I am a block proposer.", extra=self.format) - self.block = Block(self.shape.blockSize) - self.block.fill() - #self.block.print() + """It initializes the block for the proposer.""" + if self.amIproposer == 1: + self.logger.debug("I am a block proposer.", extra=self.format) + self.block = Block(self.shape.blockSize) + self.block.fill() + #self.block.print() + else: + self.logger.warning("I am not a block proposer."% self.ID) def broadcastBlock(self): + """The block proposer broadcasts the block to all validators.""" if self.amIproposer == 0: - self.logger.error("I am NOT a block proposer", extra=self.format) + self.logger.warning("I am not a block proposer", extra=self.format) else: self.logger.debug("Broadcasting my block...", extra=self.format) order = [i for i in range(self.shape.blockSize * self.shape.blockSize)] @@ -95,12 +108,15 @@ class Validator: #broadcasted.print() def getColumn(self, index): + """It returns a given column.""" return self.block.getColumn(index) def getRow(self, index): + """It returns a given row.""" return self.block.getRow(index) def receiveColumn(self, id, column, src): + """It receives the given column if it has been assigned to it.""" if id in self.columnIDs: # register receive so that we are not sending back self.columnNeighbors[id][src].receiving |= column @@ -110,6 +126,7 @@ class Validator: pass def receiveRow(self, id, row, src): + """It receives the given row if it has been assigned to it.""" if id in self.rowIDs: # register receive so that we are not sending back self.rowNeighbors[id][src].receiving |= row @@ -120,6 +137,7 @@ class Validator: def receiveRowsColumns(self): + """It receives rows and columns.""" if self.amIproposer == 1: self.logger.error("I am a block proposer", extra=self.format) else: @@ -147,7 +165,9 @@ class Validator: for neigh in neighs.values(): neigh.received |= neigh.receiving neigh.receiving.setall(0) + def updateStats(self): + """It updates the stats related to sent and received data.""" self.logger.debug("Stats: tx %d, rx %d", self.statsTxInSlot, self.statsRxInSlot, extra=self.format) self.statsRxPerSlot.append(self.statsRxInSlot) self.statsTxPerSlot.append(self.statsTxInSlot) @@ -156,6 +176,7 @@ class Validator: def sendColumn(self, columnID): + """It sends any new sample in the given column.""" line = self.getColumn(columnID) if line.any(): self.logger.debug("col %d -> %s", columnID, self.columnNeighbors[columnID] , extra=self.format) @@ -169,6 +190,7 @@ class Validator: self.statsTxInSlot += toSend.count(1) def sendRow(self, rowID): + """It sends any new sample in the given row.""" line = self.getRow(rowID) if line.any(): self.logger.debug("row %d -> %s", rowID, self.rowNeighbors[rowID], extra=self.format) @@ -182,36 +204,43 @@ class Validator: self.statsTxInSlot += toSend.count(1) def sendRows(self): + """It sends all restored rows.""" self.logger.debug("Sending restored rows...", extra=self.format) for r in self.rowIDs: if self.changedRow[r]: self.sendRow(r) def sendColumns(self): + """It sends all restored columns.""" self.logger.debug("Sending restored columns...", extra=self.format) for c in self.columnIDs: if self.changedColumn[c]: self.sendColumn(c) def logRows(self): + """It logs the rows assigned to the validator.""" if self.logger.isEnabledFor(logging.DEBUG): for id in self.rowIDs: self.logger.debug("Row %d: %s", id, self.getRow(id), extra=self.format) def logColumns(self): + """It logs the columns assigned to the validator.""" if self.logger.isEnabledFor(logging.DEBUG): for id in self.columnIDs: self.logger.debug("Column %d: %s", id, self.getColumn(id), extra=self.format) def restoreRows(self): + """It restores the rows assigned to the validator, that can be repaired.""" for id in self.rowIDs: self.block.repairRow(id) def restoreColumns(self): + """It restores the columns assigned to the validator, that can be repaired.""" for id in self.columnIDs: self.block.repairColumn(id) def checkStatus(self): + """It checks how many expected/arrived samples are for each assigned row/column.""" arrived = 0 expected = 0 for id in self.columnIDs: From c312d6447d126f7fffd776237ba795587b1009b9 Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Thu, 16 Feb 2023 23:38:47 +0100 Subject: [PATCH 009/162] Heatmaps generation --- .../nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 --- .../nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml | 18 --- .../nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml | 18 --- .../nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml | 17 --- .../nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml | 17 --- .../nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml | 17 --- .../nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml | 19 --- .../nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml | 17 --- .../nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml | 17 --- .../nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml | 18 --- .../nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml | 17 --- .../nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml | 18 --- .../nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml | 18 --- .../nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml | 17 --- .../nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml | 18 --- .../nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml | 17 --- .../nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml | 17 --- .../nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml | 17 --- .../nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml | 17 --- .../nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml | 17 --- .../nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml | 18 --- .../nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml | 17 --- .../nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml | 18 --- .../nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml | 19 --- .../nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml | 19 --- results/plots.py | 111 ++++++++++++++++++ 325 files changed, 111 insertions(+), 5834 deletions(-) delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml delete mode 100644 results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml create mode 100644 results/plots.py diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 09ad9e9..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 10 - 6 - 4 - 1 - 4 - - 65280 - 50722 - 10991 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 7fb4d62..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 32 - 10 - 6 - 4 - 1 - 4 - - 65280 - 50978 - 11332 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 6336fde..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 10 - 6 - 6 - 1 - 4 - - 97920 - 81905 - 25038 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 358dcd8..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 32 - 10 - 6 - 6 - 1 - 4 - - 97920 - 82123 - 25632 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index af9c6c1..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 10 - 6 - 8 - 1 - 4 - - 130560 - 113258 - 41557 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index f75ebff..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 32 - 10 - 6 - 8 - 1 - 4 - - 130560 - 113195 - 41311 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 76219e5..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 50 - 6 - 4 - 1 - 4 - - 65280 - 53807 - 14919 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 3b27873..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 32 - 50 - 6 - 4 - 1 - 5 - - 65280 - 53653 - 15446 - 17 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 90b2136..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 32 - 50 - 6 - 6 - 1 - 5 - - 97920 - 86655 - 38282 - 67 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 4fcb699..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 32 - 50 - 6 - 6 - 1 - 5 - - 97920 - 85939 - 33915 - 18 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index e0c86e1..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 50 - 6 - 8 - 1 - 4 - - 130560 - 117816 - 52702 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index c62e89a..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 32 - 50 - 6 - 8 - 1 - 4 - - 130560 - 117121 - 47458 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index abd44b6..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 32 - 90 - 6 - 4 - 0 - -1 - - 65280 - 63570 - 58835 - 57567 - 57563 - 57563 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index f551c88..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 32 - 90 - 6 - 4 - 0 - -1 - - 65280 - 63850 - 59848 - 58777 - 58777 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index 696a380..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 32 - 90 - 6 - 6 - 0 - -1 - - 97920 - 96242 - 90303 - 87315 - 87303 - 87303 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index a311536..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 256 - 32 - 90 - 6 - 6 - 0 - -1 - - 97920 - 96380 - 90924 - 88649 - 88644 - 88644 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 3e330c8..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 32 - 90 - 6 - 8 - 0 - -1 - - 130560 - 128897 - 122020 - 118076 - 118060 - 118060 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 20cdbcc..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 256 - 32 - 90 - 6 - 8 - 0 - -1 - - 130560 - 128876 - 121863 - 117847 - 117812 - 117812 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 230a27a..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 10 - 6 - 4 - 1 - 4 - - 96384 - 66032 - 6147 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index e17dcd1..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 10 - 6 - 4 - 1 - 4 - - 96384 - 66039 - 5668 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index d01c8e2..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 10 - 6 - 6 - 1 - 4 - - 146880 - 113869 - 23215 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 512c3bf..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 10 - 6 - 6 - 1 - 4 - - 146880 - 114994 - 25313 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 4a1425a..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 10 - 6 - 8 - 1 - 4 - - 192768 - 157300 - 42616 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 91f37bc..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 10 - 6 - 8 - 1 - 4 - - 192768 - 157452 - 41618 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 23795b0..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 50 - 6 - 4 - 1 - 4 - - 96384 - 74591 - 16829 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index e947a82..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 48 - 50 - 6 - 4 - 1 - 5 - - 96384 - 72711 - 15420 - 580 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 0c5bd8c..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 50 - 6 - 6 - 1 - 4 - - 146880 - 121561 - 34006 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 59b5ded..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 50 - 6 - 6 - 1 - 4 - - 146880 - 121195 - 33926 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 03a9ed9..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 50 - 6 - 8 - 1 - 4 - - 192768 - 165822 - 52031 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index e2a76aa..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 50 - 6 - 8 - 1 - 4 - - 192768 - 168032 - 59986 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index 80b6211..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 48 - 90 - 6 - 4 - 0 - -1 - - 96384 - 93226 - 86919 - 86348 - 86348 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 50f1509..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 48 - 90 - 6 - 4 - 0 - -1 - - 96384 - 93230 - 86991 - 86386 - 86386 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index 7860a89..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 48 - 90 - 6 - 6 - 0 - -1 - - 146880 - 143978 - 135616 - 133493 - 133492 - 133492 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 881afff..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 48 - 90 - 6 - 6 - 0 - -1 - - 146880 - 143540 - 134238 - 131831 - 131831 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 554d350..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 48 - 90 - 6 - 8 - 0 - -1 - - 192768 - 189357 - 178258 - 174453 - 174448 - 174448 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 7403174..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 256 - 48 - 90 - 6 - 8 - 0 - -1 - - 192768 - 189219 - 177738 - 173359 - 173354 - 173354 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 7d98567..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 10 - 6 - 4 - 1 - 4 - - 130560 - 78166 - 1623 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index b55e0dc..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 10 - 6 - 4 - 1 - 4 - - 130560 - 78182 - 1664 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index ea0c291..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 10 - 6 - 6 - 1 - 4 - - 195840 - 140372 - 15175 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 2552822..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 10 - 6 - 6 - 1 - 4 - - 195840 - 140300 - 16773 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 726e7f2..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 10 - 6 - 8 - 1 - 4 - - 261120 - 202963 - 43043 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 3746f2c..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 10 - 6 - 8 - 1 - 4 - - 261120 - 203451 - 43924 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 00a13d3..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 64 - 50 - 6 - 4 - 1 - 5 - - 130560 - 92697 - 20405 - 832 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 5c95ff3..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 64 - 50 - 6 - 4 - 1 - 5 - - 130560 - 91401 - 19859 - 299 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index dab9edc..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 50 - 6 - 6 - 1 - 4 - - 195840 - 151549 - 31002 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 10b6d7b..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 50 - 6 - 6 - 1 - 4 - - 195840 - 152645 - 30487 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index b8102f0..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 50 - 6 - 8 - 1 - 4 - - 261120 - 217962 - 64481 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 9b5643f..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 50 - 6 - 8 - 1 - 4 - - 261120 - 215832 - 52918 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index b28dd42..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 64 - 90 - 6 - 4 - 0 - -1 - - 130560 - 125401 - 117963 - 117745 - 117745 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 771a09b..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 64 - 90 - 6 - 4 - 0 - -1 - - 130560 - 125048 - 116859 - 116657 - 116657 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index 1ab8a1c..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 64 - 90 - 6 - 6 - 0 - -1 - - 195840 - 190061 - 177271 - 175566 - 175566 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 1746ca3..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 64 - 90 - 6 - 6 - 0 - -1 - - 195840 - 190193 - 177636 - 175941 - 175941 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index a7735d5..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 64 - 90 - 6 - 8 - 0 - -1 - - 261120 - 255573 - 240196 - 235880 - 235876 - 235876 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index d746269..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 64 - 90 - 6 - 8 - 0 - -1 - - 261120 - 255416 - 239912 - 235936 - 235936 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index fe47b32..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 10 - 6 - 4 - 1 - 5 - - 98048 - 83376 - 31140 - 53 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 871e83e..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 10 - 6 - 4 - 1 - 5 - - 98048 - 83468 - 32416 - 177 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 25dcf46..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 384 - 32 - 10 - 6 - 6 - 1 - 4 - - 147072 - 130943 - 59562 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index a1b1189..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 10 - 6 - 6 - 1 - 5 - - 147072 - 130291 - 57895 - 51 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 3b80d2a..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 10 - 6 - 8 - 1 - 5 - - 196096 - 178646 - 90715 - 17 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index aad4d47..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 384 - 32 - 10 - 6 - 8 - 1 - 4 - - 196096 - 177910 - 88434 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 9312447..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 50 - 6 - 4 - 1 - 5 - - 98048 - 88275 - 47587 - 2390 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 8ea4887..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 50 - 6 - 4 - 1 - 5 - - 98048 - 87796 - 42232 - 624 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index dad2be3..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 50 - 6 - 6 - 1 - 5 - - 147072 - 134867 - 75547 - 454 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index fb8e5a4..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 50 - 6 - 6 - 1 - 5 - - 147072 - 136972 - 87321 - 3906 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index bc80d4c..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 50 - 6 - 8 - 1 - 5 - - 196096 - 184058 - 108161 - 255 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 0147dc7..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 50 - 6 - 8 - 1 - 5 - - 196096 - 182637 - 103966 - 174 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index 87f2420..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 32 - 90 - 6 - 4 - 0 - -1 - - 98048 - 96710 - 91946 - 88981 - 88952 - 88952 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index ff43a1c..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 32 - 90 - 6 - 4 - 0 - -1 - - 98048 - 96505 - 91089 - 88006 - 87990 - 87990 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index c14a77c..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 32 - 90 - 6 - 6 - 0 - -1 - - 147072 - 145442 - 138494 - 132562 - 132422 - 132422 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 49f66e4..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 32 - 90 - 6 - 6 - 0 - -1 - - 147072 - 145177 - 137014 - 129819 - 129694 - 129694 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 17be440..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 32 - 90 - 6 - 8 - 0 - -1 - - 196096 - 194208 - 184667 - 175478 - 175218 - 175218 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 1c504ba..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 32 - 90 - 6 - 8 - 0 - -1 - - 196096 - 194028 - 183667 - 174499 - 174264 - 174264 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 07cec18..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 384 - 48 - 10 - 6 - 4 - 1 - 4 - - 147072 - 116108 - 28381 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 38bbe9e..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 384 - 48 - 10 - 6 - 4 - 1 - 4 - - 147072 - 116462 - 26517 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 830fa10..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 48 - 10 - 6 - 6 - 1 - 5 - - 220608 - 187528 - 68422 - 128 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 33d9eef..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 10 - 6 - 6 - 1 - 5 - - 220608 - 187077 - 64499 - 27 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index c8ee0bd..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 384 - 48 - 10 - 6 - 8 - 1 - 4 - - 294144 - 258780 - 111702 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index e71e19a..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 10 - 6 - 8 - 1 - 5 - - 294144 - 258369 - 108509 - 25 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index a3793f1..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 48 - 50 - 6 - 4 - 1 - 5 - - 147072 - 122461 - 42113 - 75 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 07eb81c..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 50 - 6 - 4 - 1 - 5 - - 147072 - 123960 - 46580 - 352 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index c5edb76..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 48 - 50 - 6 - 6 - 1 - 5 - - 220608 - 194568 - 85447 - 161 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index ab90b2b..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 50 - 6 - 6 - 1 - 5 - - 220608 - 194986 - 84300 - 181 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index f34e4ce..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 48 - 50 - 6 - 8 - 1 - 5 - - 294144 - 267129 - 128744 - 154 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 1a80400..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 50 - 6 - 8 - 1 - 5 - - 294144 - 267423 - 139002 - 312 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index 833f8b5..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 48 - 90 - 6 - 4 - 0 - -1 - - 147072 - 143692 - 134063 - 130731 - 130729 - 130729 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 24925bc..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 90 - 6 - 4 - 0 - -1 - - 147072 - 143708 - 134104 - 131299 - 131299 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index 7b6d0dd..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 48 - 90 - 6 - 6 - 0 - -1 - - 220608 - 216821 - 203312 - 195460 - 195425 - 195425 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 6d800c7..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 48 - 90 - 6 - 6 - 0 - -1 - - 220608 - 217230 - 205234 - 198526 - 198494 - 198494 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 97fef72..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 48 - 90 - 6 - 8 - 0 - -1 - - 294144 - 290464 - 275176 - 263521 - 263378 - 263378 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 7648a29..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 48 - 90 - 6 - 8 - 0 - -1 - - 294144 - 290818 - 277005 - 266678 - 266564 - 266564 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 87eb411..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 384 - 64 - 10 - 6 - 4 - 1 - 4 - - 196096 - 142856 - 19187 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index c18d992..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 384 - 64 - 10 - 6 - 4 - 1 - 4 - - 196096 - 143075 - 19427 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index c10de48..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 384 - 64 - 10 - 6 - 6 - 1 - 4 - - 294144 - 238918 - 66228 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 33b5bc7..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 10 - 6 - 6 - 1 - 5 - - 294144 - 238912 - 66350 - 105 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 6180654..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 10 - 6 - 8 - 1 - 5 - - 392192 - 332725 - 117921 - 68 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 0905a9c..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 10 - 6 - 8 - 1 - 5 - - 392192 - 333316 - 122544 - 103 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index f969d33..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 50 - 6 - 4 - 1 - 5 - - 196096 - 151180 - 30372 - 33 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index e4d9c82..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 50 - 6 - 4 - 1 - 5 - - 196096 - 155955 - 45622 - 677 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 07cdeee..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 50 - 6 - 6 - 1 - 5 - - 294144 - 251507 - 91484 - 110 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 8b9207e..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 50 - 6 - 6 - 1 - 5 - - 294144 - 251901 - 102363 - 173 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index e61d531..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 50 - 6 - 8 - 1 - 5 - - 392192 - 349706 - 165744 - 620 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 5e46195..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 50 - 6 - 8 - 1 - 5 - - 392192 - 349178 - 156957 - 462 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index f201dca..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 90 - 6 - 4 - 0 - -1 - - 196096 - 190860 - 178364 - 176509 - 176509 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 3bb1f13..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 90 - 6 - 4 - 0 - -1 - - 196096 - 191038 - 179236 - 177280 - 177280 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index f674dd6..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 64 - 90 - 6 - 6 - 0 - -1 - - 294144 - 288628 - 271625 - 265139 - 265126 - 265126 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 5241f15..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 64 - 90 - 6 - 6 - 0 - -1 - - 294144 - 288384 - 270824 - 263856 - 263852 - 263852 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 239a3a4..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 64 - 90 - 6 - 8 - 0 - -1 - - 392192 - 386442 - 365702 - 353963 - 353892 - 353892 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 0a47452..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 64 - 90 - 6 - 8 - 0 - -1 - - 392192 - 386413 - 365609 - 354426 - 354370 - 354370 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 153fa53..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 10 - 6 - 4 - 1 - 5 - - 130816 - 116225 - 55984 - 739 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 9353be2..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 10 - 6 - 4 - 1 - 5 - - 130816 - 116174 - 56550 - 1045 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 757841e..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 10 - 6 - 6 - 1 - 5 - - 196224 - 180010 - 100891 - 720 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 8b440f7..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 10 - 6 - 6 - 1 - 5 - - 196224 - 179467 - 98233 - 653 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index ffacc3b..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 10 - 6 - 8 - 1 - 5 - - 261632 - 244197 - 147716 - 278 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 61b589e..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 10 - 6 - 8 - 1 - 5 - - 261632 - 243975 - 145555 - 241 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 761aa80..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 50 - 6 - 4 - 1 - 5 - - 130816 - 119683 - 67389 - 2454 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index e96b4fd..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 50 - 6 - 4 - 1 - 5 - - 130816 - 118934 - 65602 - 1737 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 0f71f22..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 50 - 6 - 6 - 1 - 5 - - 196224 - 185235 - 125274 - 6304 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index ab0686d..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 50 - 6 - 6 - 1 - 5 - - 196224 - 183126 - 108379 - 1777 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 1e76475..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 50 - 6 - 8 - 1 - 5 - - 261632 - 248296 - 162540 - 2250 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 990b646..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 50 - 6 - 8 - 1 - 5 - - 261632 - 249166 - 174034 - 5883 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index adffade..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 32 - 90 - 6 - 4 - 0 - -1 - - 130816 - 129365 - 123315 - 118148 - 118040 - 118040 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 77871ff..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 32 - 90 - 6 - 4 - 0 - -1 - - 130816 - 129620 - 124668 - 120190 - 120092 - 120092 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index 02bf39f..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 32 - 90 - 6 - 6 - 0 - -1 - - 196224 - 194718 - 187462 - 179125 - 178790 - 178790 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 938eaef..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 32 - 90 - 6 - 6 - 0 - -1 - - 196224 - 194581 - 186457 - 177094 - 176679 - 176679 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index f947a43..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 32 - 90 - 6 - 8 - 0 - -1 - - 261632 - 259996 - 250991 - 237989 - 237104 - 237104 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index bc0dd10..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 32 - 90 - 6 - 8 - 0 - -1 - - 261632 - 259870 - 250187 - 237297 - 236592 - 236592 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index a5ba072..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 10 - 6 - 4 - 1 - 5 - - 193152 - 162220 - 57463 - 285 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 1eba6e3..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 10 - 6 - 4 - 1 - 5 - - 193152 - 161793 - 56627 - 206 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 952b400..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 10 - 6 - 6 - 1 - 5 - - 294336 - 261741 - 125929 - 1359 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 4040d24..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 10 - 6 - 6 - 1 - 5 - - 294336 - 261352 - 124740 - 1165 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 947d1fb..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 10 - 6 - 8 - 1 - 5 - - 390912 - 355055 - 187877 - 1062 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index bd7b2c3..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 10 - 6 - 8 - 1 - 5 - - 390912 - 355267 - 188039 - 697 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 88e4f93..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 50 - 6 - 4 - 1 - 5 - - 193152 - 168978 - 79662 - 718 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 3ecb7e7..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 50 - 6 - 4 - 1 - 5 - - 193152 - 168811 - 76651 - 1548 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 9d81b3a..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 50 - 6 - 6 - 1 - 5 - - 294336 - 268238 - 142125 - 2581 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 48f2d7e..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 50 - 6 - 6 - 1 - 5 - - 294336 - 271760 - 157700 - 3119 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 0b20072..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 50 - 6 - 8 - 1 - 5 - - 390912 - 363762 - 217175 - 4807 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 4cedd0a..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 50 - 6 - 8 - 1 - 5 - - 390912 - 362368 - 213673 - 3896 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index eb4fe32..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 48 - 90 - 6 - 4 - 0 - -1 - - 193152 - 189929 - 178919 - 173234 - 173198 - 173198 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index e556ec4..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 48 - 90 - 6 - 4 - 0 - -1 - - 193152 - 189903 - 178933 - 173129 - 173115 - 173115 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index f2ec436..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 48 - 90 - 6 - 6 - 0 - -1 - - 294336 - 291068 - 277755 - 265266 - 264954 - 264954 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index fd5e8ae..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 48 - 90 - 6 - 6 - 0 - -1 - - 294336 - 290375 - 274459 - 259969 - 259595 - 259595 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index d498c1b..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 48 - 90 - 6 - 8 - 0 - -1 - - 390912 - 387450 - 370948 - 352132 - 351389 - 351389 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 979dc75..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 48 - 90 - 6 - 8 - 0 - -1 - - 390912 - 387001 - 368619 - 349083 - 348163 - 348163 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index b9e1837..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 512 - 64 - 10 - 6 - 4 - 1 - 4 - - 261632 - 208426 - 56540 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index b0ba5c6..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 512 - 64 - 10 - 6 - 4 - 1 - 4 - - 261632 - 208607 - 54936 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 8764cbf..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 10 - 6 - 6 - 1 - 5 - - 392448 - 335687 - 129768 - 472 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 8874722..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 10 - 6 - 6 - 1 - 5 - - 392448 - 335653 - 130771 - 765 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index cf5fffe..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 10 - 6 - 8 - 1 - 5 - - 523264 - 464083 - 219165 - 1738 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 6a0eb62..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 10 - 6 - 8 - 1 - 5 - - 523264 - 463849 - 219852 - 2041 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index b0c8708..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 50 - 6 - 4 - 1 - 5 - - 261632 - 220646 - 87197 - 628 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 795f780..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 50 - 6 - 4 - 1 - 5 - - 261632 - 220784 - 80130 - 843 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 8dc301e..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 50 - 6 - 6 - 1 - 5 - - 392448 - 350684 - 170234 - 1823 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index f310e0d..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 50 - 6 - 6 - 1 - 5 - - 392448 - 351659 - 175183 - 2381 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 2dcf226..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 50 - 6 - 8 - 1 - 5 - - 523264 - 476987 - 253066 - 4294 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 1ca59d9..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 50 - 6 - 8 - 1 - 5 - - 523264 - 479525 - 269437 - 5352 - 0 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index 0ed923b..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 90 - 6 - 4 - 0 - -1 - - 261632 - 256120 - 240573 - 234812 - 234812 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 8557b1f..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 64 - 90 - 6 - 4 - 0 - -1 - - 261632 - 256851 - 242785 - 237940 - 237933 - 237933 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index a996d20..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 64 - 90 - 6 - 6 - 0 - -1 - - 392448 - 386757 - 366137 - 353034 - 352880 - 352880 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 2cc2712..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 64 - 90 - 6 - 6 - 0 - -1 - - 392448 - 386688 - 366146 - 352743 - 352590 - 352590 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 922d3cc..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 64 - 90 - 6 - 8 - 0 - -1 - - 523264 - 516878 - 490489 - 467576 - 467166 - 467166 - - diff --git a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 3987442..0000000 --- a/results/2023-01-25_22-06-15_211/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 64 - 90 - 6 - 8 - 0 - -1 - - 523264 - 517326 - 493006 - 471877 - 471514 - 471514 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index b28cb0f..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 10 - 6 - 4 - 1 - 4 - - 65280 - 50845 - 10607 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index ed4c9d8..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 32 - 10 - 6 - 4 - 1 - 4 - - 65280 - 50975 - 10799 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index c07583e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 10 - 6 - 6 - 1 - 4 - - 97920 - 81654 - 24638 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 33291c4..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 32 - 10 - 6 - 6 - 1 - 4 - - 97920 - 82129 - 26170 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 2cbd908..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 10 - 6 - 8 - 1 - 4 - - 130560 - 112906 - 40533 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 59a3fc0..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 32 - 10 - 6 - 8 - 1 - 4 - - 130560 - 113193 - 41149 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 5497037..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 32 - 50 - 6 - 4 - 1 - 5 - - 65280 - 54917 - 20135 - 179 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 21271e4..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 32 - 50 - 6 - 4 - 1 - 5 - - 65280 - 54790 - 19241 - 52 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 16326c5..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 50 - 6 - 6 - 1 - 4 - - 97920 - 86442 - 36212 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 1e11ea0..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 32 - 50 - 6 - 6 - 1 - 5 - - 97920 - 85829 - 33402 - 17 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 53ffc60..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 32 - 50 - 6 - 8 - 1 - 4 - - 130560 - 118895 - 57483 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 8544f9e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 32 - 50 - 6 - 8 - 1 - 4 - - 130560 - 116579 - 46754 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index c5c5bbd..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 32 - 90 - 6 - 4 - 0 - -1 - - 65280 - 63789 - 59737 - 58647 - 58647 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index b58c4df..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 32 - 90 - 6 - 4 - 0 - -1 - - 65280 - 63671 - 59214 - 58087 - 58087 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index a0d69f2..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 32 - 90 - 6 - 6 - 0 - -1 - - 97920 - 96128 - 89780 - 86738 - 86725 - 86725 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index b9fdefe..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 256 - 32 - 90 - 6 - 6 - 0 - -1 - - 97920 - 96366 - 90884 - 88263 - 88254 - 88254 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 673b4a0..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 32 - 90 - 6 - 8 - 0 - -1 - - 130560 - 129046 - 122712 - 119229 - 119211 - 119211 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 50e1a87..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-32-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 256 - 32 - 90 - 6 - 8 - 0 - -1 - - 130560 - 128977 - 122510 - 118981 - 118960 - 118960 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 7217862..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 10 - 6 - 4 - 1 - 4 - - 96384 - 65869 - 5677 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 4ae1563..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 10 - 6 - 4 - 1 - 4 - - 96384 - 65812 - 5312 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index b7fa07d..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 10 - 6 - 6 - 1 - 4 - - 146880 - 114531 - 23340 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index bf711d1..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 10 - 6 - 6 - 1 - 4 - - 146880 - 114452 - 24782 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 1313e55..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 10 - 6 - 8 - 1 - 4 - - 192768 - 157852 - 43108 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 84dd1cb..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 10 - 6 - 8 - 1 - 4 - - 192768 - 157929 - 43868 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index bd35b2e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 48 - 50 - 6 - 4 - 1 - 5 - - 96384 - 73913 - 15976 - 26 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 1b6ca09..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 48 - 50 - 6 - 4 - 1 - 5 - - 96384 - 72710 - 14977 - 380 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 6970f2e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 50 - 6 - 6 - 1 - 4 - - 146880 - 120241 - 28432 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 4ddd72d..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 50 - 6 - 6 - 1 - 4 - - 146880 - 122554 - 37015 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 0732b5d..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 48 - 50 - 6 - 8 - 1 - 4 - - 192768 - 165328 - 52842 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index c66d2c8..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 48 - 50 - 6 - 8 - 1 - 4 - - 192768 - 166855 - 55597 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index a4bfb53..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 48 - 90 - 6 - 4 - 0 - -1 - - 96384 - 93336 - 87304 - 86680 - 86680 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 853d528..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 48 - 90 - 6 - 4 - 0 - -1 - - 96384 - 93182 - 86727 - 86130 - 86130 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index c6e141e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 48 - 90 - 6 - 6 - 0 - -1 - - 146880 - 143625 - 134314 - 132024 - 132024 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 6f7374d..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 256 - 48 - 90 - 6 - 6 - 0 - -1 - - 146880 - 143565 - 134449 - 132021 - 132018 - 132018 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 4b78c5e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 48 - 90 - 6 - 8 - 0 - -1 - - 192768 - 189560 - 179183 - 175299 - 175294 - 175294 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index d67e5b5..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-48-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 256 - 48 - 90 - 6 - 8 - 0 - -1 - - 192768 - 189401 - 178491 - 174286 - 174274 - 174274 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index df36871..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 10 - 6 - 4 - 1 - 4 - - 130560 - 77912 - 1884 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 86ac173..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 10 - 6 - 4 - 1 - 4 - - 130560 - 77597 - 1621 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 4e6181c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 10 - 6 - 6 - 1 - 4 - - 195840 - 140546 - 16869 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index ff48955..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 10 - 6 - 6 - 1 - 4 - - 195840 - 140288 - 17790 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index ffa0535..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 10 - 6 - 8 - 1 - 4 - - 261120 - 202665 - 40237 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 5541435..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 10 - 6 - 8 - 1 - 4 - - 261120 - 201979 - 39550 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 416fe92..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 50 - 6 - 4 - 1 - 4 - - 130560 - 88397 - 9581 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index bf8acbd..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 64 - 50 - 6 - 4 - 1 - 5 - - 130560 - 94870 - 28965 - 3403 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index e19540f..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 50 - 6 - 6 - 1 - 4 - - 195840 - 154685 - 34361 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 1053c27..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 50 - 6 - 6 - 1 - 4 - - 195840 - 152278 - 29683 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 5bd7c01..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 256 - 64 - 50 - 6 - 8 - 1 - 4 - - 261120 - 215719 - 54906 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 440fa87..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 256 - 64 - 50 - 6 - 8 - 1 - 4 - - 261120 - 217041 - 55570 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index db0954a..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 64 - 90 - 6 - 4 - 0 - -1 - - 130560 - 125772 - 118862 - 118604 - 118604 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 506cf9a..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 64 - 90 - 6 - 4 - 0 - -1 - - 130560 - 125443 - 117933 - 117793 - 117793 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index e7b993c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 256 - 64 - 90 - 6 - 6 - 0 - -1 - - 195840 - 190088 - 176880 - 175135 - 175135 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 08dbb2f..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 256 - 64 - 90 - 6 - 6 - 0 - -1 - - 195840 - 190311 - 177900 - 176149 - 176149 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 39a1d67..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 256 - 64 - 90 - 6 - 8 - 0 - -1 - - 261120 - 255233 - 238579 - 234157 - 234155 - 234155 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 48d1bba..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-256-bs-64-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 256 - 64 - 90 - 6 - 8 - 0 - -1 - - 261120 - 255214 - 238845 - 234293 - 234290 - 234290 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 381867b..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 10 - 6 - 4 - 1 - 5 - - 98048 - 83686 - 31731 - 20 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index d1ab4ec..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 10 - 6 - 4 - 1 - 5 - - 98048 - 83381 - 30091 - 37 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 39a7609..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 10 - 6 - 6 - 1 - 5 - - 147072 - 130821 - 59778 - 35 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index e9d5e0b..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 10 - 6 - 6 - 1 - 5 - - 147072 - 131059 - 60443 - 17 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index a3f3200..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 384 - 32 - 10 - 6 - 8 - 1 - 4 - - 196096 - 178457 - 89078 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index fb2c01d..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 384 - 32 - 10 - 6 - 8 - 1 - 4 - - 196096 - 178191 - 89205 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 804d774..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 50 - 6 - 4 - 1 - 5 - - 98048 - 86763 - 40933 - 426 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index d70cd7d..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 50 - 6 - 4 - 1 - 5 - - 98048 - 86382 - 39024 - 265 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 22b1129..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 50 - 6 - 6 - 1 - 5 - - 147072 - 136556 - 81490 - 1761 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 35ccf1b..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 50 - 6 - 6 - 1 - 5 - - 147072 - 134949 - 73128 - 221 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index eac4ef3..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 32 - 50 - 6 - 8 - 1 - 5 - - 196096 - 182834 - 103770 - 86 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 6d89c7e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 32 - 50 - 6 - 8 - 1 - 5 - - 196096 - 182003 - 99448 - 35 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index d2a8697..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 32 - 90 - 6 - 4 - 0 - -1 - - 98048 - 96519 - 91224 - 88115 - 88090 - 88090 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index ac0c272..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 32 - 90 - 6 - 4 - 0 - -1 - - 98048 - 96621 - 91433 - 88575 - 88561 - 88561 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index a74e4d3..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 32 - 90 - 6 - 6 - 0 - -1 - - 147072 - 145272 - 137319 - 130549 - 130423 - 130423 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index cc06d10..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 32 - 90 - 6 - 6 - 0 - -1 - - 147072 - 145619 - 139381 - 133556 - 133420 - 133420 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index eb98398..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 32 - 90 - 6 - 8 - 0 - -1 - - 196096 - 194328 - 185408 - 176209 - 175979 - 175979 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index f851afd..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-32-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 32 - 90 - 6 - 8 - 0 - -1 - - 196096 - 194271 - 185192 - 175372 - 175028 - 175028 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 17f6b54..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 384 - 48 - 10 - 6 - 4 - 1 - 4 - - 147072 - 115805 - 27872 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 11c8be9..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 10 - 6 - 4 - 1 - 5 - - 147072 - 116365 - 29071 - 56 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 30b844c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 48 - 10 - 6 - 6 - 1 - 5 - - 220608 - 186970 - 67203 - 79 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 1c8913b..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 10 - 6 - 6 - 1 - 5 - - 220608 - 187292 - 68328 - 53 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 5baf85e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 384 - 48 - 10 - 6 - 8 - 1 - 4 - - 294144 - 257980 - 108832 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 9ebe88f..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 10 - 6 - 8 - 1 - 5 - - 294144 - 258674 - 112445 - 25 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 4734390..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 48 - 50 - 6 - 4 - 1 - 5 - - 147072 - 123349 - 46076 - 429 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 6125afd..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 50 - 6 - 4 - 1 - 5 - - 147072 - 123581 - 44592 - 123 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 8700886..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 48 - 50 - 6 - 6 - 1 - 5 - - 220608 - 195424 - 85760 - 184 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 05a3139..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 50 - 6 - 6 - 1 - 5 - - 220608 - 193743 - 80797 - 28 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index eda0efb..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 48 - 50 - 6 - 8 - 1 - 5 - - 294144 - 266545 - 128925 - 182 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 17db62c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 50 - 6 - 8 - 1 - 5 - - 294144 - 265791 - 127546 - 156 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index e7b4871..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 48 - 90 - 6 - 4 - 0 - -1 - - 147072 - 144187 - 135674 - 132964 - 132964 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 2d506ea..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 48 - 90 - 6 - 4 - 0 - -1 - - 147072 - 144001 - 135252 - 132462 - 132462 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index b097d6c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 48 - 90 - 6 - 6 - 0 - -1 - - 220608 - 217372 - 205766 - 199093 - 199059 - 199059 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 3674f77..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 48 - 90 - 6 - 6 - 0 - -1 - - 220608 - 217016 - 204235 - 197388 - 197326 - 197326 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index ad36142..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 48 - 90 - 6 - 8 - 0 - -1 - - 294144 - 290561 - 275748 - 264295 - 264134 - 264134 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 19a0e82..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-48-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 48 - 90 - 6 - 8 - 0 - -1 - - 294144 - 290427 - 275197 - 263654 - 263500 - 263500 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index d7a0bee..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 384 - 64 - 10 - 6 - 4 - 1 - 4 - - 196096 - 142968 - 20341 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 01574fa..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 384 - 64 - 10 - 6 - 4 - 1 - 4 - - 196096 - 143218 - 20908 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index aa34ccd..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 10 - 6 - 6 - 1 - 5 - - 294144 - 239265 - 66902 - 33 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index cde94c5..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 1 - 384 - 64 - 10 - 6 - 6 - 1 - 4 - - 294144 - 237575 - 62635 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 10e917c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 10 - 6 - 8 - 1 - 5 - - 392192 - 332800 - 119240 - 67 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 24d41ee..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 10 - 6 - 8 - 1 - 5 - - 392192 - 333341 - 119837 - 66 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index c9a48f7..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 50 - 6 - 4 - 1 - 5 - - 196096 - 153754 - 37797 - 233 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 49b9822..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 50 - 6 - 4 - 1 - 5 - - 196096 - 158234 - 51274 - 1447 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 5aea244..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 50 - 6 - 6 - 1 - 5 - - 294144 - 252466 - 98066 - 343 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 2c30dff..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 50 - 6 - 6 - 1 - 5 - - 294144 - 252645 - 104335 - 169 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 1e5a094..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 50 - 6 - 8 - 1 - 5 - - 392192 - 345009 - 143695 - 482 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index f4e8bc7..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 50 - 6 - 8 - 1 - 5 - - 392192 - 344717 - 138232 - 237 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index 05bdc82..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 90 - 6 - 4 - 0 - -1 - - 196096 - 190793 - 178511 - 176660 - 176660 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index e2b7971..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 384 - 64 - 90 - 6 - 4 - 0 - -1 - - 196096 - 190620 - 177827 - 175881 - 175881 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index 6ffccf6..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 384 - 64 - 90 - 6 - 6 - 0 - -1 - - 294144 - 288988 - 273221 - 267010 - 267010 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index db2911e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 64 - 90 - 6 - 6 - 0 - -1 - - 294144 - 288360 - 270811 - 263935 - 263914 - 263914 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index a911535..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 384 - 64 - 90 - 6 - 8 - 0 - -1 - - 392192 - 387091 - 368864 - 358357 - 358293 - 358293 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index f53847d..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-384-bs-64-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 384 - 64 - 90 - 6 - 8 - 0 - -1 - - 392192 - 386268 - 364938 - 352627 - 352552 - 352552 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index ef2c9e6..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 10 - 6 - 4 - 1 - 5 - - 130816 - 116273 - 55785 - 961 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index fde0876..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 10 - 6 - 4 - 1 - 5 - - 130816 - 116219 - 56241 - 879 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 4bc0f51..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 10 - 6 - 6 - 1 - 5 - - 196224 - 180242 - 101338 - 741 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 7139e7d..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 10 - 6 - 6 - 1 - 5 - - 196224 - 180134 - 101219 - 791 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index b14e27b..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 10 - 6 - 8 - 1 - 5 - - 261632 - 243877 - 144491 - 226 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index edf1dff..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 10 - 6 - 8 - 1 - 5 - - 261632 - 243957 - 145314 - 173 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 3b898bd..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 50 - 6 - 4 - 1 - 5 - - 130816 - 120949 - 75317 - 4649 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 4ef390c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 50 - 6 - 4 - 1 - 5 - - 130816 - 119569 - 69042 - 1867 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 8b33862..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 50 - 6 - 6 - 1 - 5 - - 196224 - 183108 - 111450 - 2000 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index d103a37..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 50 - 6 - 6 - 1 - 5 - - 196224 - 183908 - 115619 - 3007 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index cb36abe..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 32 - 50 - 6 - 8 - 1 - 5 - - 261632 - 250983 - 183831 - 10774 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 0d16aef..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 32 - 50 - 6 - 8 - 1 - 5 - - 261632 - 247680 - 159001 - 1362 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index 2b3c5ab..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 32 - 90 - 6 - 4 - 0 - -1 - - 130816 - 129297 - 123110 - 117200 - 117013 - 117013 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index a109a2b..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 32 - 90 - 6 - 4 - 0 - -1 - - 130816 - 129136 - 122295 - 116156 - 116006 - 116006 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index 70d30bd..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 32 - 90 - 6 - 6 - 0 - -1 - - 196224 - 194418 - 185607 - 175100 - 174568 - 174568 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 734531f..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 32 - 90 - 6 - 6 - 0 - -1 - - 196224 - 194601 - 186858 - 177448 - 176869 - 176869 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index fbc2bcb..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 32 - 90 - 6 - 8 - 0 - -1 - - 261632 - 259562 - 247947 - 233021 - 232255 - 232255 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 7d1d16c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-32-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 32 - 90 - 6 - 8 - 0 - -1 - - 261632 - 260164 - 252064 - 240847 - 240166 - 240166 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index e2237c7..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 10 - 6 - 4 - 1 - 5 - - 193152 - 162120 - 58849 - 374 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index c7837b3..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 10 - 6 - 4 - 1 - 5 - - 193152 - 161230 - 53731 - 168 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 9345b96..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 10 - 6 - 6 - 1 - 5 - - 294336 - 260744 - 121235 - 876 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 047e708..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 10 - 6 - 6 - 1 - 5 - - 294336 - 260631 - 121354 - 1355 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index f65e91c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 10 - 6 - 8 - 1 - 5 - - 390912 - 354577 - 184856 - 965 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index 3cb9f66..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 10 - 6 - 8 - 1 - 5 - - 390912 - 354501 - 184190 - 562 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index 8f02699..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 50 - 6 - 4 - 1 - 5 - - 193152 - 168914 - 76321 - 729 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 2d3150c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 50 - 6 - 4 - 1 - 5 - - 193152 - 168454 - 72673 - 435 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 29a76bd..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 50 - 6 - 6 - 1 - 5 - - 294336 - 269929 - 153693 - 2574 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 4714824..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 50 - 6 - 6 - 1 - 5 - - 294336 - 268328 - 143446 - 2563 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 5328c38..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 48 - 50 - 6 - 8 - 1 - 5 - - 390912 - 362508 - 211807 - 4156 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 3f20ec9..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 48 - 50 - 6 - 8 - 1 - 5 - - 390912 - 366687 - 233269 - 7436 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index 845ef34..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 48 - 90 - 6 - 4 - 0 - -1 - - 193152 - 190455 - 181302 - 176391 - 176381 - 176381 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 90c77f6..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 48 - 90 - 6 - 4 - 0 - -1 - - 193152 - 189859 - 178726 - 172577 - 172534 - 172534 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index 40d16c8..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 48 - 90 - 6 - 6 - 0 - -1 - - 294336 - 290931 - 276934 - 264509 - 264187 - 264187 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 2a310c8..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 48 - 90 - 6 - 6 - 0 - -1 - - 294336 - 290970 - 277109 - 264975 - 264706 - 264706 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 899a41c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 48 - 90 - 6 - 8 - 0 - -1 - - 390912 - 387433 - 371120 - 353614 - 352911 - 352911 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index c7b6c70..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-48-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 48 - 90 - 6 - 8 - 0 - -1 - - 390912 - 387739 - 372905 - 356735 - 356129 - 356129 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml deleted file mode 100644 index 2b30185..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-0.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 0 - 512 - 64 - 10 - 6 - 4 - 1 - 4 - - 261632 - 207399 - 51641 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml deleted file mode 100644 index 1977b5c..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 10 - 6 - 4 - 1 - 5 - - 261632 - 208431 - 52583 - 89 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml deleted file mode 100644 index 5f3c707..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 10 - 6 - 6 - 1 - 5 - - 392448 - 335237 - 126492 - 590 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml deleted file mode 100644 index 7dca2d5..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 10 - 6 - 6 - 1 - 5 - - 392448 - 336373 - 131586 - 684 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml deleted file mode 100644 index 1d65a20..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 10 - 6 - 8 - 1 - 5 - - 523264 - 464128 - 223233 - 2404 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml deleted file mode 100644 index f7a81d9..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-10-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 10 - 6 - 8 - 1 - 5 - - 523264 - 463674 - 217480 - 1613 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml deleted file mode 100644 index f1babd6..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 50 - 6 - 4 - 1 - 5 - - 261632 - 222593 - 90746 - 3833 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml deleted file mode 100644 index 3851483..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 50 - 6 - 4 - 1 - 5 - - 261632 - 220320 - 79148 - 609 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml deleted file mode 100644 index 03cdef2..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 50 - 6 - 6 - 1 - 5 - - 392448 - 353094 - 182395 - 4805 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml deleted file mode 100644 index 8c6bbcb..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-6-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 50 - 6 - 6 - 1 - 5 - - 392448 - 351143 - 181128 - 2739 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml deleted file mode 100644 index 653771a..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-0.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 0 - 512 - 64 - 50 - 6 - 8 - 1 - 5 - - 523264 - 476364 - 251483 - 3388 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml deleted file mode 100644 index 7910f7b..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-50-chi-8-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 50 - 6 - 8 - 1 - 5 - - 523264 - 478438 - 259726 - 4189 - 0 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml deleted file mode 100644 index 3d21f9e..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 64 - 90 - 6 - 4 - 0 - -1 - - 261632 - 256103 - 240054 - 234538 - 234536 - 234536 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml deleted file mode 100644 index 5b143e7..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-4-r-1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - 512 - 64 - 90 - 6 - 4 - 0 - -1 - - 261632 - 256496 - 241666 - 236205 - 236205 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml deleted file mode 100644 index d8a3ef4..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 64 - 90 - 6 - 6 - 0 - -1 - - 392448 - 387020 - 367393 - 354339 - 354240 - 354240 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml deleted file mode 100644 index 27999c7..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-6-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 64 - 90 - 6 - 6 - 0 - -1 - - 392448 - 386529 - 365359 - 351768 - 351634 - 351634 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml deleted file mode 100644 index 1604b61..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-0.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 0 - 512 - 64 - 90 - 6 - 8 - 0 - -1 - - 523264 - 517643 - 494047 - 473685 - 473316 - 473316 - - diff --git a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml b/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml deleted file mode 100644 index 0b3769b..0000000 --- a/results/2023-01-26_10-41-29_912/nbv-512-bs-64-nd-6-fr-90-chi-8-r-1.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 1 - 512 - 64 - 90 - 6 - 8 - 0 - -1 - - 523264 - 517141 - 492108 - 469814 - 469232 - 469232 - - diff --git a/results/plots.py b/results/plots.py new file mode 100644 index 0000000..721a491 --- /dev/null +++ b/results/plots.py @@ -0,0 +1,111 @@ +import os +import time +import xml.etree.ElementTree as ET +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns +from itertools import combinations + +results_folder = os.getcwd() + +#Get all folders and store their time info and sort +directories = [d for d in os.listdir(results_folder) if os.path.isdir(os.path.join(results_folder, d))] +directories_ctime = [(d, os.path.getctime(os.path.join(results_folder, d))) for d in directories] +directories_ctime.sort(key=lambda x: x[1], reverse=True) + +#Get the path of the latest created folder +latest_directory = directories_ctime[0][0] +folder_path = os.path.join(results_folder, latest_directory) + +#Store data with a unique key for each params combination +data = {} +plotInfo = {} + +parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', 'chi'] + +#Loop over the xml files in the folder +for filename in os.listdir(folder_path): + #Loop over the xmls and store the data in variables + if filename.endswith('.xml'): + tree = ET.parse(os.path.join(folder_path, filename)) + root = tree.getroot() + run = int(root.find('run').text) + blockSize = int(root.find('blockSize').text) + failureRate = int(root.find('failureRate').text) + numberValidators = int(root.find('numberValidators').text) + netDegree = int(root.find('netDegree').text) + chi = int(root.find('chi').text) + tta = int(root.find('tta').text) + + # Loop over all possible combinations of length 4 of the parameters + for combination in combinations(parameters, 4): + # Get the indices and values of the parameters in the combination + indices = [parameters.index(element) for element in combination] + selected_values = [run, blockSize, failureRate, numberValidators, netDegree, chi] + values = [selected_values[index] for index in indices] + names = [parameters[i] for i in indices] + keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] + key = tuple(keyComponents[:4]) + #Get the names of the other 2 parameters that are not included in the key + other_params = [parameters[i] for i in range(6) if i not in indices] + #Append the values of the other 2 parameters and the ttas to the lists for the key + other_indices = [i for i in range(len(parameters)) if i not in indices] + + #Initialize the dictionary for the key if it doesn't exist yet + if key not in data: + data[key] = {} + #Initialize lists for the other 2 parameters and the ttas with the key + data[key][other_params[0]] = [] + data[key][other_params[1]] = [] + data[key]['ttas'] = [] + + if other_params[0] in data[key]: + data[key][other_params[0]].append(selected_values[other_indices[0]]) + else: + data[key][other_params[0]] = [selected_values[other_indices[0]]] + if other_params[1] in data[key]: + data[key][other_params[1]].append(selected_values[other_indices[1]]) + else: + data[key][other_params[1]] = [selected_values[other_indices[1]]] + data[key]['ttas'].append(tta) + + +#Get the keys for all data with the same x and y labels +filtered_keys = {} +for key1, value1 in data.items(): + sub_keys1 = list(value1.keys()) + filtered_keys[(sub_keys1[0], sub_keys1[1])] = [key1] + for key2, value2 in data.items(): + sub_keys2 = list(value2.keys()) + if key1 != key2 and sub_keys1[0] == sub_keys2[0] and sub_keys1[1] == sub_keys2[1]: + try: + filtered_keys[(sub_keys1[0], sub_keys1[1])].append(key2) + except KeyError: + filtered_keys[(sub_keys1[0], sub_keys1[1])] = [key2] + +#Store the 2D heatmaps in a folder +heatmaps_folder = 'heatmaps' +if not os.path.exists(heatmaps_folder): + os.makedirs(heatmaps_folder) + +#Plot the heatmaps and store them in subfolders +for labels, keys in filtered_keys.items(): + for key in keys: + hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(3, 3), weights=data[key]['ttas']) + hist = hist.T + sns.heatmap(hist, xticklabels=False, yticklabels=False, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f") + plt.xlabel(labels[0]) + plt.ylabel(labels[1]) + title = "" + paramValueCnt = 0 + for param in parameters: + if param != labels[0] and param != labels[1]: + title += f"{key[paramValueCnt]}" + paramValueCnt += 1 + plt.title(title) + filename = title + ".png" + target_folder = os.path.join(heatmaps_folder, f"{labels[0]}Vs{labels[1]}") + if not os.path.exists(target_folder): + os.makedirs(target_folder) + plt.savefig(os.path.join(target_folder, filename)) + plt.clf() From 54b0284abbc11bcb17682e85217ee53b5560bb45 Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Sun, 19 Feb 2023 22:17:50 +0100 Subject: [PATCH 010/162] Minor display improvements --- results/plots.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/results/plots.py b/results/plots.py index 721a491..7955ef5 100644 --- a/results/plots.py +++ b/results/plots.py @@ -6,6 +6,12 @@ import numpy as np import seaborn as sns from itertools import combinations +#Title formatting for the figures +def formatTitle(key): + name = ''.join([f" {char}" if char.isupper() else char for char in key.split('_')[0]]) + number = key.split('_')[1] + return f"{name.title()}: {number} " + results_folder = os.getcwd() #Get all folders and store their time info and sort @@ -88,24 +94,27 @@ heatmaps_folder = 'heatmaps' if not os.path.exists(heatmaps_folder): os.makedirs(heatmaps_folder) -#Plot the heatmaps and store them in subfolders for labels, keys in filtered_keys.items(): for key in keys: hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(3, 3), weights=data[key]['ttas']) hist = hist.T - sns.heatmap(hist, xticklabels=False, yticklabels=False, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f") + xlabels = [f'{val:.2f}' for val in xedges[::2]] + [f'{xedges[-1]:.2f}'] + ylabels = [f'{val:.2f}' for val in yedges[::2]] + [f'{yedges[-1]:.2f}'] + sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f") plt.xlabel(labels[0]) plt.ylabel(labels[1]) + filename = "" title = "" paramValueCnt = 0 for param in parameters: if param != labels[0] and param != labels[1]: - title += f"{key[paramValueCnt]}" + filename += f"{key[paramValueCnt]}" + title += formatTitle(key[paramValueCnt]) paramValueCnt += 1 plt.title(title) - filename = title + ".png" + filename = filename + ".png" target_folder = os.path.join(heatmaps_folder, f"{labels[0]}Vs{labels[1]}") if not os.path.exists(target_folder): os.makedirs(target_folder) plt.savefig(os.path.join(target_folder, filename)) - plt.clf() + plt.clf() \ No newline at end of file From 2b7302de64a6664d8037ddcbe65bf148110d16ce Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Sun, 19 Feb 2023 22:27:13 +0100 Subject: [PATCH 011/162] Delete folder --- .gitignore | 2 + Frontend/Imgs/logo.png | Bin 0 -> 15639 bytes Frontend/Plots/plot1.png | Bin 0 -> 15025 bytes Frontend/Plots/plot2_10_8192.png | Bin 0 -> 14795 bytes Frontend/Plots/plot3_70_8192.png | Bin 0 -> 16900 bytes Frontend/Plots/plot4_80_8192.png | Bin 0 -> 16917 bytes Frontend/Plots/plot5_90_8192.png | Bin 0 -> 16917 bytes Frontend/Plots/plot6_100_8192.png | Bin 0 -> 16662 bytes Frontend/Plots/plot7_110_8192.png | Bin 0 -> 16917 bytes Frontend/Plots/plot8_120_8192.png | Bin 0 -> 16662 bytes Frontend/Plots/plot9_130_8192.png | Bin 0 -> 15025 bytes Frontend/Plots/plt1.png | Bin 0 -> 16907 bytes Frontend/css/style.css | 85 ++++++++++++++++++ Frontend/index.html | 32 +++++++ Frontend/script.js | 33 +++++++ ...numberValidators=256_netDegree=6_chi=4.png | Bin 22882 -> 0 bytes ...numberValidators=256_netDegree=6_chi=6.png | Bin 22750 -> 0 bytes ...numberValidators=256_netDegree=6_chi=8.png | Bin 22760 -> 0 bytes ...numberValidators=384_netDegree=6_chi=4.png | Bin 22913 -> 0 bytes ...numberValidators=384_netDegree=6_chi=6.png | Bin 23021 -> 0 bytes ...numberValidators=384_netDegree=6_chi=8.png | Bin 23028 -> 0 bytes ...numberValidators=512_netDegree=6_chi=4.png | Bin 22825 -> 0 bytes ...numberValidators=512_netDegree=6_chi=6.png | Bin 22929 -> 0 bytes ...numberValidators=512_netDegree=6_chi=8.png | Bin 22939 -> 0 bytes ...numberValidators=256_netDegree=6_chi=4.png | Bin 22547 -> 0 bytes ...numberValidators=256_netDegree=6_chi=6.png | Bin 22638 -> 0 bytes ...numberValidators=256_netDegree=6_chi=8.png | Bin 22417 -> 0 bytes ...numberValidators=384_netDegree=6_chi=4.png | Bin 22586 -> 0 bytes ...numberValidators=384_netDegree=6_chi=6.png | Bin 22686 -> 0 bytes ...numberValidators=384_netDegree=6_chi=8.png | Bin 22697 -> 0 bytes ...numberValidators=512_netDegree=6_chi=4.png | Bin 22664 -> 0 bytes ...numberValidators=512_netDegree=6_chi=6.png | Bin 22779 -> 0 bytes ...numberValidators=512_netDegree=6_chi=8.png | Bin 22741 -> 0 bytes plots.py | 51 ----------- 34 files changed, 152 insertions(+), 51 deletions(-) create mode 100644 Frontend/Imgs/logo.png create mode 100644 Frontend/Plots/plot1.png create mode 100644 Frontend/Plots/plot2_10_8192.png create mode 100644 Frontend/Plots/plot3_70_8192.png create mode 100644 Frontend/Plots/plot4_80_8192.png create mode 100644 Frontend/Plots/plot5_90_8192.png create mode 100644 Frontend/Plots/plot6_100_8192.png create mode 100644 Frontend/Plots/plot7_110_8192.png create mode 100644 Frontend/Plots/plot8_120_8192.png create mode 100644 Frontend/Plots/plot9_130_8192.png create mode 100644 Frontend/Plots/plt1.png create mode 100644 Frontend/css/style.css create mode 100644 Frontend/index.html create mode 100644 Frontend/script.js delete mode 100644 heatmaps/run=0_numberValidators=256_netDegree=6_chi=4.png delete mode 100644 heatmaps/run=0_numberValidators=256_netDegree=6_chi=6.png delete mode 100644 heatmaps/run=0_numberValidators=256_netDegree=6_chi=8.png delete mode 100644 heatmaps/run=0_numberValidators=384_netDegree=6_chi=4.png delete mode 100644 heatmaps/run=0_numberValidators=384_netDegree=6_chi=6.png delete mode 100644 heatmaps/run=0_numberValidators=384_netDegree=6_chi=8.png delete mode 100644 heatmaps/run=0_numberValidators=512_netDegree=6_chi=4.png delete mode 100644 heatmaps/run=0_numberValidators=512_netDegree=6_chi=6.png delete mode 100644 heatmaps/run=0_numberValidators=512_netDegree=6_chi=8.png delete mode 100644 heatmaps/run=1_numberValidators=256_netDegree=6_chi=4.png delete mode 100644 heatmaps/run=1_numberValidators=256_netDegree=6_chi=6.png delete mode 100644 heatmaps/run=1_numberValidators=256_netDegree=6_chi=8.png delete mode 100644 heatmaps/run=1_numberValidators=384_netDegree=6_chi=4.png delete mode 100644 heatmaps/run=1_numberValidators=384_netDegree=6_chi=6.png delete mode 100644 heatmaps/run=1_numberValidators=384_netDegree=6_chi=8.png delete mode 100644 heatmaps/run=1_numberValidators=512_netDegree=6_chi=4.png delete mode 100644 heatmaps/run=1_numberValidators=512_netDegree=6_chi=6.png delete mode 100644 heatmaps/run=1_numberValidators=512_netDegree=6_chi=8.png delete mode 100644 plots.py diff --git a/.gitignore b/.gitignore index b948985..026d904 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.swp *.pyc +results/* +!results/plots.py \ No newline at end of file diff --git a/Frontend/Imgs/logo.png b/Frontend/Imgs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6e90de275073e5421e92487cadb02bd1f1e9f8a4 GIT binary patch literal 15639 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 literal 0 HcmV?d00001 diff --git a/Frontend/Plots/plot1.png b/Frontend/Plots/plot1.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ac52946ff514b52ba34409194ba9e5b92d3551 GIT binary patch literal 15025 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 S3_c%45G_ub=N+Z~`ab~hk@r9V literal 0 HcmV?d00001 diff --git a/Frontend/Plots/plot2_10_8192.png b/Frontend/Plots/plot2_10_8192.png new file mode 100644 index 0000000000000000000000000000000000000000..fedae4386bc48752b1a48921b1994ae19607cfe1 GIT binary patch literal 14795 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 I>?dFPAF7^W{Qv*} literal 0 HcmV?d00001 diff --git a/Frontend/Plots/plot3_70_8192.png b/Frontend/Plots/plot3_70_8192.png new file mode 100644 index 0000000000000000000000000000000000000000..b0f328ee74840135c644623ed7dc82397beba373 GIT binary patch literal 16900 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 O5QJmaM@vkJSN6elo5hx5J9D=L=Zth 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 O5QJmaM@vkJSN-sk=E{X>oC?7jBdYwy)QYn^*% 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 S3_c%45G_ub=N+Z~`ab~hk@r9V literal 0 HcmV?d00001 diff --git a/Frontend/Plots/plt1.png b/Frontend/Plots/plt1.png new file mode 100644 index 0000000000000000000000000000000000000000..85ca6e96e155807b9f2485b92160acfd7a833316 GIT binary patch literal 16907 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 + + + + + + + DAS Dashboard + + +

+
+
+ +
+
Text2
+
Text3
+
Text4
+
+ + + \ No newline at end of file diff --git a/Frontend/script.js b/Frontend/script.js new file mode 100644 index 0000000..123cf36 --- /dev/null +++ b/Frontend/script.js @@ -0,0 +1,33 @@ +let section1 = document.querySelector('.sec1'); +let section2 = document.querySelector('.sec2'); +let section3 = document.querySelector('.sec3'); +let section4 = document.querySelector('.sec4'); +let sections = [section1, section2, section3, section4]; + +let icon1 = document.querySelector(".sec1 i"); +let icon2 = document.querySelector(".sec2 i"); +let icon3 = document.querySelector(".sec3 i"); +let icon4 = document.querySelector(".sec4 i"); +let icons = [icon1, icon2, icon3, icon4]; + +let par1 = document.querySelector(".p1"); +let par2 = document.querySelector(".p2"); +let par3 = document.querySelector(".p3"); +let par4 = document.querySelector(".p4"); +let paragraphs = [par1, par2, par3, par4]; + +section1.style.cssText = "background: #eee5fdea; border-top-left-radius: 50%; border-bottom-left-radius: 50%; cursor: pointer; transition: all 0.5s ease-in-out;" +icon1.style.cssText = "opacity: 1; color: #160f25;" + +sections.forEach(section =>{ + section.addEventListener("click", function(){ + sections.forEach(s =>{ + s.style.cssText = "background: none; border-top-left-radius: 0%; border-bottom-left-radius: 0%;" + icons[sections.indexOf(s)].style.cssText = "color: #b9aecf; opacity: 0.7;" + paragraphs[sections.indexOf(s)].style.display = "none"; + }); + section.style.cssText = "background: #eee5fdea; border-top-left-radius: 50%; border-bottom-left-radius: 50%; cursor: pointer; transition: all 0.5s ease-in-out;" + icons[sections.indexOf(section)].style.cssText = "opacity: 1; color: #160f25;" + paragraphs[sections.indexOf(section)].style.display = "block"; + }); +}); \ No newline at end of file diff --git a/heatmaps/run=0_numberValidators=256_netDegree=6_chi=4.png b/heatmaps/run=0_numberValidators=256_netDegree=6_chi=4.png deleted file mode 100644 index b3b80a668f80cc3449bd57b378978086726b4250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22882 zcmd_Sc{tWv`#$^;%9JrfhK!XYqDc}GLZ!%7BtuAwP$)7bWR@gpAX8CELQ$s7MH!0* znG#YNA|$-$qP@R+Kg0VT-}m_a_uI$w9DA4BeShw?)^%Oyb)M(7f_Cd}Tgb%EL{Zd2 zZ7p?uikjy`Q8eug^YJ(9>fe9FzcxB+>~r4ZaLD*FVE z9geM$StlbWEpph|+3|#;tgQWCFOYFKZX?@bF zw)z%>Q`f$>x_RvAnO-nhYh`95CK_~JU7CB6bAR1iH9zA$!P#`>uUdR>zhCeB(D&UX z{nJy4E_Z@W-xd65YT!Jow?A4xXlX)~&TBU>@7#^eS_j3lV%Nlv^}CpURq9dd@vwQ( zoF(MXuI3Ynf20GV(`ZG+@K4vld0Oh~>Q)w)DNYU!4kNy0KKP?LPXMC`{ut?R@qfXO zBlXgavgR}S&s)ALZmo+Xx4z&^y!Z5qXqPW7973C1n~cYb&(Q9cT%_RG?(?)$T&$Jb zd+!GOx5=X|RaII|sd}Y@TlyArsV2r$rSE^V+Ob_VH!p8XnnB{Oc;#HzuUFDa<+sz* z)2Eu`$-jN%VD?E)jbZ%f&qTNHpEN`79(4WEawc|-%@xH^Uf0et#!!I`tPABlLJe`!$L#-)Dk2!>F3YCo6-Ujrja+?weM^75O4Zxy?qz6b=y>A9)+Eia)$SvQ1vk0Yj6W^>=rz&JJMyhn z;M=!vj>nIyl?E)#JX|lf=bZI!m6=~zBa0{cGm1vMyaWp3BLk%*Hf<8PuIQqssX2do zdaS7Q^=lqx9%lka^^ll=`-9UEga}HXJXL zy|wxDj~jb4Ob@@lyZE4`Wk+YHFIn6T4jarr>?t4re_ZVwEd0E-hJ;?HP`u+tgSFU8?U#oTNDBh~ipv|D^$hzV0-#gmd z&F>%G5vR1c|8;ufsjv?o-*>J((!_A0=ViId%*3v+E_*w>!Pom8Hjj~qb10fxKaZ9+ z(|g8CK~a%k!gcE%!*t`I9z}-_N-T@z>Bx3r2Uoj(*_Tu?@?dKHp+kob_SPlzzR6m? z-u^A!$~!R`T@9~a8xHiCxBBt!QIqC1GM>;@JOs)yUU(yfQK}sro5QH+8QECnk#Z-I|c?KT>4)}^S?{l z7P0zJ4IhrAYMKH0f~Up@ErPmSzr7FIYv#%Q^5siM7Z(j2M5m4tfBpC#VeemOmTYz} ze)WnQ`R;J@J)t9r=p!r$*cLpsqRVGGVPWB4Kl?KRLqpYHTv>;Gp&T3>Liyz8jSaLl z|5S|mvGK9n_hmnSd}X$=u{q`LE{64Yb8}nzd3vOA7vE}g3W03y;J{{PW=0O)P*){? zZN~Vh=i{T<`*0?1?uea-ACUz+*7|rHza#2bmwQPqp%_s#`1Mg+;+C`X?>~A}dGEjz zit2C9*tUB&yUBqA2?kR2se0lCzdCH+J+u#^%hSECc)0Ec4OZ9S$aO5B)uBU|++N~* zxBr^>9vBjGHYrIQUp0Bi?OtH#KykoAfx&0X<8Qc+es*+pR7H3=j(&c{St-29m8JE` z$#Xg>zEM$Jiq5@0rRUhTPuje^7Bu$ZG#kav&Ms15vnxVqRT$pz^}PekCr_UA7=E^# ze;~m)y`sdQx&Fo$S_K7#;_7N<%ZktyLj`(wUXjz|;o;H#@uMG}v!k;-BvmhIzL>ap zN>^}Y))J*t>;r|9GD@2_>lL`W*m}Dao~8!hITUq-ZTR5xC7*i#!2>m2-EdRmcMXk=96~~2{OgVsfB3NE)t$YSbqQOyJLlYfbtFB0 zfoBAb$6z~+@~^?IHF2AtG+navv|tu73Pr}cfhW4W#zr?tCA2%|SgWFywY5dfWjSR0 z%PQW=KgR|ljyB)Zo?)t~uHK4dn)h;V9_s%tFDtL9(Y-hbiDh!>#yKT%n@^vQj;7zc zx0yFQFEy1RAtB*#>*ICGQzLu6ynDn(Qo)f|xBuvP?T^jz^Y`z_X*Mmz)(l~f55CWJ za&&dASRm|y0?jZo&?a0RBTK#jhoE4nj}H}gf>efM$BvPOlrbv|MR0W>oizv_r1m{= zU4`8YsH@vugM=EfWOK;_>*~5f&(qhGJ&n7zJ-UCNojgoi;b!tM3L7_WN!V>(bzT%- znpMUm*Ju7heyz%Zw>ivgOO#aA)#)hnfe!^JUHk!T!mK##Cb^C@EBD?j^JnIDL|zW_ z+kUk&LO5xAjEt79ZiOEsS9@32*_@-zot47g(oSFSSVO(_;-NyDc$O?#qTuyQfk)Of z^y&tOgIyJ2l#iTcMf;Dh?^>Rml*Q?}qi4o&=0m}0%bDpZzKzEvuB^8Y#_{Va82eC) za(dtV>AbKm?_WdP>{{;A;PnZ^$G9U1#Fr)x2uuksN$6EF^-7!9oG~% zilb_K@w4Znzy6SVbz;AUAG_A}?Tx2Yf;YR5FzBRkVujRFbfQkL&V?Gj*wExaQP-1!!ct#)=HvnQXsJK4E80c%UFkqFFi+p&Y?Q*C^N zX@R@w+O>;pYU4BxAC^3R;>7lX4|wkosXuO;SA;IsKWXV!bedPjMD>a5*WKyH>vqH| z3nA~d+_#`bk_r*_8mF21IZC^GsJ6DybMl6PREl@mG(ZM9e+aoSdS)Jj)KNv0{EWh% zQb;F$9O9Zc09VEV3GUm!TaSXi$34Sm*mH@_cRcLzsid-J&lq)eb@{C`GcyN&{HVAr zXE|8EO}Jq2`^pVlBu-#m=K1g`opKEF6jF3%$Nweulq? zL;Q$_Efl+)oE(4m+4&1OSy@?;#HI(GP0WO6OnU8IwuzlewDl7e?;XRVssLmQQCwZ>0e(z07iD6gnfhVrE7jNCX$s`~kP!A9s)^+IR zwG~t#wou!;JiZ(G;AsAs>~L#;LrTcurqsx)7cZipHyz0#PnNppR=9y-eeEuUzkgIz z6!0o1fEKUHufel?Dqi`N2ojjVr~WaeHHT{0sj{N!(G1SX;I_tLuO)tx6Ju(D%Lg3X z;`$ql!qga?eta>qu(x03I`CnY-*{VF#_6$dfAr=lv+bvz9sKpx!Mkxn(4lZ*8KOyI zvloCTjjH9%V+gb#-&!ZtdRBe=mi6e7Y-Yx|S?;crjD@K-@soEl3XKz&_GuJ+f4Qk) z=1E>&0t$Jq`>51>Rzb<==Jfr%$lEC|tx$ZkHCNWRWLgf570mzze^EuA%{)0^ntbb) zLXy!sR2|>8 zOINRkeEDLRZQD4%IBIcV`GAYtmzGRg;MQ^hhkVg!{D#FyZ~f)<_E#!0cbRQizI;K1 zu!<%SgQ#C|U*oNgo}OEy#`x6Bt1WyrCoZnobKkac*_ZcuTv+U==bKRe@zF;G`#*gO zxOPpDWL;!u*-^z0A3k(Xn{2RcNUrfjJPITxCbFYcVMA@dghWI%pHezpCz3z>eC2ri zSvK;Xws#M?x~`{gpl~(tl?)C#q7I2JTQ)x^D2RcPamC)dwfxE+xtcMfjcr4yW}P*$ zYjTfwGofIYa+cCQcJA{<+^7MJD;cKemS^Q|u)q`UPBZ9zn{%gPjHF-W@s=WQl>nB- zzGY?Vh>y)B9V%N zl$pci?e!olixe?(BBBmWVLyZ?CMNb}9;8218y5yxc(Fgf+-tmJ!CKn}^&{6k-e#?u zdaKN4J@Mn6L-pv@16hZ5hE;Mc+o8H|AKzn_{+l`X?p>xXl%IOY{6H*j%F^T-i}L3A zw}1yyjdMOTUw@>)C}|(M&*{-ljRlW4DJWd*b-itnrk~dJ)p_GBofI{MJj6uV^G25Msx5Mec3kf?KfDnby@j zO70_CpQq{Le#u>3ca#UGD&on>fg??|RaKIs`PO;p*N!ybJJ6Yvy8qF!AWH-psx%AW zR(e^#L0tcbTqjy(W#y#-3!3ii-Su`RyPtmNvw8`r(Y+112 z9MkeY%Jui`sn4?6m1-bm_cmKwyianwv-4Wyn@oo`0Q`ngvcimX`C=g(D48oQ2;j&8+= zN<|YXw$1linak;@Ht(6u;es1|zxUJ@IkpCy&(q>b%BIsv*nLrP$^E;T0@hPc-G2%q zXk<>7w154&u>Dy?Rzbn$Z}0Q=bYAY17Z#2`e*L>q_k{TV*W(X)J%yfs|9Nrmkm>+V zt4>B^qn+Ja@4_!%zgFA1ELJ+T`sU870q9f`?B6}y_vn}qvWy?nf>tGqpaMJA;OXgs zf^&FHNqIRvx;lhf^CTx*d2n!WUCzebhnpb^2-QL$1 zw8rM8`PjGCmb??oNx$RgN5>+hxX8?VDrZqYYUp#9g(pvradN51%geL#@C1yEIR8So z(LJrSNl~$+v~;WGuYFDjWMwlrYiaAID<|BtJp)48qP%}~2_Jr&ZJSo9yxBA}F*wSn zQ(ZURu(Yv}tIccDKCLpw#?HbhZfeKHu_t>y-Z!P~;o#>t{+t)mmC@T%Sy{ONP-J!0 z=>to+r*`7ZndVhck8^Xi;$uiRK|7zt=lb>QBWxX=>m>H*>z|L0H|r>(O#$u1la3ZM z#dVkRyCcJ5g)`HqS%j7IO)7b20{0miC7?8?d=TnFE=@JcI^@612Wwt*B>upC!UU?75}e(1p~9E^(XAb3___`!lwJd#iTgAon(#5cYqV~Zm zF)082J;NHySU0Z%OarnG$jHcOy09OOH)%D#zRfv(%t3W%(sT6lA7NwtKt|oVm!40y zuKZS*os;wGr?J7vcdkW?{BSBd(M$2K>V2HwoO9%r{Hc}ut1qpp9-Ukac;xcpR&ugA z0z2iNab3RK38XqYw1M^eLqUEdqLpDr2`k2XBnw~2vZ?I^791QMO|RRyQhq)=_2E?4 zLIOQOs;P(YtfG{(`AEt|UdmC+yckndq;fYs9XLr8t^Zyrv&YV9Pw(X&@7BRKoA58l zwRuJqed`Ew>9wE2TY7L43NrGFS0_-$zO;L_ICZh7po z()aAy?deh2L|iDreR@iG49~GE_(Z zj^pSLe6$E8-irFSVdeUb%9(9PXF(Xuj}l&OjcVY7q1)r}b%8Y(KZ3s}n# z2bu1pN5W+K0PC67uV3H&n7%6uaSvo|XZImLuS}uXW~Sayk9#p~F3>*bWHYJ+(#?`K zP*1U2O{9VuMU1ks=he)1FgMg1+A;;hL09o=?uDf(%v&5J2%(|kU#uQ-1tMKeFoRu&?hPZ3A4QQL?o#dT6)!19Hz=hYx~);A-fn2n#s#t49S4 zPAl`29y1$TCFzL}IVH`_ycq>Qu4L~@Gtk-ocG03mgh6V_vSGW2ZXls&J#c}?M0X4y zx)K0fe^icx*r=tKPBXBur~?eFcKK}Z{;>-)8b=_`t!b;)p=Y4tSUA}hF7(gISqJdx zhY(Ic!Xa2^5M)@QcGNQR31}yR@t@l18*70L2il*WT|gMC+j}#@1vVTrAL=YeW=(6F z_eZ^)$)1}#o<6jHS9fQxEb{z~vXa_zW>G-qMC3R0PWPSrAE6vzcZGUC6m0rA(kK3E z2(1=j3>L3BbOSK9_uV7emvNgzQ2HzgnmlUDBYRcC%8l$67C#Mj(rtaZ9Pltxxomh|L={%{}r7WS?6N!OP* zS)@owAtdj8{G?HMdiy2mEl8k*&kE&V#{|kx-PoA_!i5Wt-#_iVw)r%VYPpIEfx&?s z;)C8ZW8RX|(&~hLZZD>>d!Nfeny~|ksDEX5jk0vIRaN>yA4E+%tv^`CKu1sCfpsUi z`I4;J^n2|c-G4;N`RtnMda}F0sAA~U~$0H$c2rC`Iz!Bn@hN>*?iPJVqkZXLpi zMs>&4_334WCHx)^OLHb)(SL^`Qdle`C)6`T^Y zttuOq;1o@4DcX6oxG zJ=dB3=mRIP5)W3V0c9gn~Tc=Jbn#T-ee6k6?@!zCm^s&{lS9=t8E)3#wRCB>+3myo6Cc^mM2fC zF(8acpNowU2iYT)e@{4aqwR>}(r!U5WQwe|Bw zwj5u<8=i7=v%uOkY_<;4Qo$nyt=j*vcT|_#YM&jAgjm*|eft8z4ud^Ed=aR;6Sbsb zw7)s>%9Y!hgLlygLJW$$c+u*MV~})7^vb=2ctx&)t~Br2vuCr96Qvqh^(FW5W4s9; z`S{PT?kqqKCNz+ij*c2i8{UnHT6#=mpu2nN*Ofa>P2-&V*R(%-@l9Ci6vf8IR`7mF zu=G{-dFYG>hlV1Lnb|Pp<>gh?);3QlC0=}&_~zZa(hnaB%Q8`2EAZ*NA00b@UGckj0$@S(OJZVUgHYftz~ETN-MRa1)dJqDOiO*% zuV;PBc7gH0g@swCuP=JYeP^s~MN9>sZu^&Et2?QQGZnWDq}Fj34?lnTvV!PYfRIl* zx18T1M^04s>9J!BqGXFq&>;^Lj4eU;DCaTmh}^g1%34PJg52k(w6o9{&^(u*U-O*& zvCgGe{lOY+(a7gl%;5EM(R*}uc9Q)=DZQ$=R*H5ufEF)a92gYz^u^T;9pAo%gVUK+ zWO6(k6xSeSe*E~+9PnCe*RE|S?wKG9IoF&E`lz*#W}Q^w^LHVy3!t0LXIm1ARwzj) zT8ao1;Y&6LqbW8}m@h94D}vP}aA<*NXct_{GlOP4zLiV(uGL69SAYf65-5 z`WYNSv$U~Y@wahdF0Jg5pbK`+t&fp$d8V`)>mYVvv1J5}#P?Dea|DYRb19E1{uQgY z^+w<-pAkW94zgCjf#T$aPkiv7fzm8;#Cj}Hx}k+5%}-!W^kXdzw-i8V(gchmXnj%t6HwOl+4 zHCB4#oVIJY;-62pq9K!cU(92xC3CN0;ZkkDh@1(h+QMH z=05Y~>{-W##2StJYLTo-`N1Q6%mvpJ=AXxRsw%lpkAG_&@(Z`5=qst`OR$Mpgbu!c zd+$9GcXvxTU#2TLO;i2*ReD=#a#*i>99d0!aTCe|aETG$LzqTvGgsagva=K1Aylz_ zRrbv8J?G4o?D_ZJHMNj&Jb1^;as}=3Gw0XOEwJX8oX?kem;Ukl9M5W^v_-fFDqf|? z#4h-~)USt3i?7j3dw-d?Of1U)Ef+d<5-F$vq)pf+>`6D&)Us5R?oiF;GYI+;{6JJx z6og?gW70DD@J>0O$95799_NsNa5~x0)RvMC50aI|hkQ4p>p_!}7FvS{ls3+0AYvP; ze>+$esAwNQeY&#xxR_X@CGTpE*c9rl!pHbzyR)>%5a}qu5E`ybdG&=I`;VMopE}{m}QUs}^FIsG2 zVL|yo))im3jvHS=Unp9~A3eGFiWSc!1&Kcjwmix1(TTs zjWOP1m=Rk@QE6#u6ooV&=5A_g+E8fI-Q6uJE4$16T5PQCjozTZ9U(X&u_+4$*0)3B zDF-D!zln)IC5Kz;@1KJxB76Ri$81*9qI(7!@$ZaGkOj1ZMRf3zW_(1 zU?%hBz#9Dw(*mMc7uVLZ!6HN0>!FFBc+0Xt4vO+uJA+26qbov16E+8E)IK;dI>HT?qoL|R1w}VQl(Pmo&;?r|$!kU|2?INp?a;Oa z8X8*svy9@)<(1amXxw3%Gp&{ob5TvHz)qQiLtB2$8er_Y%`m$2hi02@*WKdb_6v<`tqvk>a#gHF8-FHrQl|f0J&eMZ0EhU>7;Iw-S}V!n)EWn zQ|-rrrR8%=H}Zz<0u`y%_d*>W0H>YAmSP)%mBa!h=D zg!lCKcs{vI`*e@yMN4L*zHX=BdTQqXFH?zBF>kiIc&$ zl)T;$jF5w<612I*`};b7`AZ|Nst_b(7IN>xi>F35Ha@u?no$eRh; zb?veDd|(9ezo$>1g3Y>hCQhi2b`CUFw5;+W{v&d-;mu?a9UN^oO9F%dJF%9KJsk>F zjITU31+}a$<&wZyZO+aZ81%=#_9?{a-EHAM} ztx~4FlWz5zHG7iY!|sG)neuw$$!~(FR*_e)GNb7Rr@I)vV+LtHuF$D|C8j{57Q zTzH7WC?A3DO$Ma;+20)p-+DVfnEMWw9q!ZkjT7l8QRh2s6zDD#VtqHGbZ^Ss#^xL} z3|b0&w<8LT$51&h=w^*_TG6w=k>?S~8+E1ERfA(((&{!g9r@VZ{l{-KudbdPg`*F* z%u_@s+DjsVu?i~qpbr1pR3P8U{g7@ayfQo#$SbS{Qr!F-j)meiNoXOs!_Tk~ECaNg z>OYT3T!yXyOUPsvvg2&lKajg7gOCkP|L(uCs9g7T)v7;x0diUpH?trXi){s>_Obt? z5AMt`EWsAxNc5i$^LoD8WNGvgi9%rsf8obEDRmR!HVEc#^2vdv& z9=c)rZ@@D4FZ#gX^TzMP!{=jTkw9XTmZzU$5?a4Ug;stoS&B=b)dC>WCm^B1db6P- zTquN*Ygs$YKl3R#bmviE^4ESwg3z9f;}#ZX10iW&SXda~$*Dd+asTkGcPs}{_{c-0 zy*ffD`V*gOwtyQT?qkC40&8asZnQjj@O)&Xs67ssd+254=%*yT=;NXFio86-9$-^N zH*Q=^5y_Pz_AP~Fv)ED^eqb=xVPRE*jGF=RXFmu84r`38*=xzksj)V=irCtp`LQGO zg7(vyT(f44)0Y-Gx&;da))|Uf0?pc%8WrP>39b*I5u?;()TuyfTP1 zKj#`)GR{XuovlyWhU6~<29_8&k-W`Is)9mQo4rha%(YhX`!kBB6=CTZl^2Jd zAf~N9XrL}jbKr^78+z%}ev*>Cf2%W*Svai`e$DSCCd*@Qt``|x=HzH zkaAu6F9juvT@bxTt7S}bNvLMJA=;Hx^$9{1eExjIm$cZkB-|B5o&~(P4VHlL;Cjl+ z%M-RmEV;=Xs&(j;todxyYqgd{liJp;jB{w?wTMq}5W_Y)sp;oCq@NZg9WD_+f=-x6hd5+-g7W#nZt;DlPN;WE0=w(Er|{m8BtN1;;2nt&`_gW3)BNp!Ltbj)8yji zwfW3WTpu_DRrp;$G%JrJ;eEF=W-4qWp|M=8ULVl2P_y4&v`b(+Ha= zKlB8G@JR5((Xr>;HVFYW9GF=iBgqIFq~Sf2pz;vj(w8q;(I%C`vPoQuX!9;BDv61O zkOvH1wsE78@waj`dCMA>%h2sKCg?Z`iq)lWbe%mt=U|qbM?ryOeX6`% zY-+_4+SF>z2LzIY-h`cns5O*1;5}(EVN4nNbk!jdcDiNZ;el1h9eGycY{C?hV0edy z($mue0bdNbQwMJwr2C4pdX8u3)PB<{8fEgOj^q=Bedzc-19UX-u$^+iu(Cxaw zkN((e9)d%nbaw762T&qKd(SyF31J+7+2=kB51}Yws_>bmpva(S`@-vt&)N-Y@tT5@ z+T#O)92|?65LnxOb60#gPMnCmJSWPSCa^GweR_xvzs9>F4maKmOWP`Offr2(581AE z;?;oSMO-|58;%Jcd3`qs>?F~0VK^n+}S5U(S*#Uh;tee5HbJ9DoBZmRhJWZ zs~}2eXE!}|!qVP;;kIqtxHQ!zP5>vbnmvV#qIGDRRxo<}8ka+6rH3RF)A z`pk*J_ATlf8Xdj$NyOL8#Kc6T4xqN)DPs){4a^+SQ+SHSj~v?OQ;;$Qr28(4gGGz1 zCw(y~+$bOLCW%Im^*6HteYkggf78+eV&%zf-hr(%jM#>7MkpV63Sh%xLze6=X;gQA z2s>$5C7i=#9Efy5&8DY!W;7pZxi3mMCJ?*X$6EP8$`e-#iDFRppGS?4&j#D4Tk&2c z2pyf8>2w?`B;(PNo+rqy#H`=m?t^+&R#{mJxOPkTy4sd4G(;e=q=f+qF`S&7EYDS( zpRWXrryYShYo@R)G3LxX#c-Nm1K#mdtQcy5Qeb*?3d#osAOGp{vy!FfguNtlr15A1 zvxU!d^bbsHn1f1iFN!lE-Dnc#1yWwtJ#qVfvnged>3>%l2xaE#>WW#P#?-FvZvUpH zCiy=#g=oov!jG$G+5F))@lE-TLML)2&Dsodj~$*#a1SkG2%k32bWc<*a#9*I{%JJ7 zqPcl*l7fs3D^z5UV}Ilrhk;K@fNvEvf@aTt zml{-c7=&5??D0Ag+)VVa4#Hi04!*AZx;$v^q$MWp0z8Hww-#Vd0lGy1Qzb7@0~W@1 zyS8@PU|!%yk)=yDx;6nzB<1KD7%X}jui|k3buKzHEv~BIyeCh(fF;oE`fa(lVjGFG z!^F)msO-T9l)vrRF&P*i#aw1EQ?={X3Aj)@qW79UMH|xb^=sI#Umoz79uEqJBQJ8Wg5e&Xclf0qeuy z$Vk(q3rJpo6Ahe3XcbPvPaAP zK2s?nk`S4ok?BIoU0PbID5K@HZqFg~i~6bdyu6+X!)#beGNus7H-YM0U{cLF zTS0?@gG=(=z7M|IYxcB4^HIF8J#CGUpdjhPi8=mOKYQ#_E@v76<8!PtSN{-(B^PDx z$d@AT8D$U_ZnEviNdu{Q0=*m1@j*;Nk^BdRbKQ@bezO^QJu7u9U7g7VR<5oOD{@uc zl}S&q7M7!iWEL@b5%EV9f9c0(Q8buK;{_yMzI?f@nVud8X7Y%pc12S0JK+gJmx+o# zZ4zZSqJ!$PHUPXa?Wu-Vk8kfchHYX3OiDm-aX-G5n=;2)$`(vbj?q$pBjK`z1n`Rm(t;+k6}EZrY-zpoD5%=mK_Y#eGx*5;33W@2*uIb!<-(<>0S z;%t4zE{GG=Woq_ot^paUUmYWD-#ai~*IR6`{cBH~SsuyG;Fb z!3oy*=`AL&L`19E51yEujQKgEZe_lsvv&?$A3$phrJ0Dqk^`+z9t9EdMtU|I{S6oJ zThfFyGk%0JwwZ`aCC{5^*dx2)G!a916OtF+Z(x3A1?OIN zo8^WBmm2IiC#=JzLR{bIrMnPz<=El-WL7pnTir^JhUuxZX|)TVY);+u)}2DWL)o?_neP61#X;#m!~9cyXJMhszy~49@pID(ppg16 zoT_43rFdha7|34%%Gh&G)oL-ppL6t)mBnub6MuY5+Paz#_|lkQA+2(n^o9+*b5Pvp zFN}8Ru}Dy8P<8S7S)_aSx`NZZm4Em@XOCB)Rkfcqj4ItJ#Su9NFCh6WC>C>VD_W(Nbha z@Z(1-upTjPrr=Bf#RS&6iY2vQSJj$(A_PqReT%JO@?>oF)G4iQ^ekma?U3?WQ}lyS zlf_{n`OUkl%W~suNNmR(u@4d*f#6^cpq0X!+0xIat?OuQ2=w zAmPyzv^=m5*%HUw$A-fyCf1-0+3w0(+Y;-T8irZ=_G3lWfnsQ@49v`p9llm}NKxq9 zHO;bofK%5!cPp}+Fo(L!5&52BvmJ%SgN~QHN?G|sZtYo?fLVpk;5KwCa7}%3`)5AR zsYma7ZCP&Ur!{F&+RBI^H2W-nes3|c>sG)$=+GLvNTvX-M5y=p_;^O~qz7bW#4ZSk z%hH|zuju@_N!wk?ZPfo zv=@{eGjU%s_fzq*sGTuCC64|JR}aPSH`Tw;2F>ih{M7&Fv;VP6{Ph7=mmrP@pzGS2 zW}ud4Kuk)TPJX-iqvz8nF$j)?esyx%a_W=@5y>7)#aCDijo zbVGy}#Rw}!fhedzeaHk^E{JJjG+LS%yxb|cj-$T%48EDwCH(R~nRY@HVYse>h~Y>m zlqv={v3-P^NJOE$$q-w0YL^45hE}R3n`u;S2aNmKwPN43tm-r)yh5jIQ+BPlTk3<2xCqdbI1I%Kibp|2&#lS z{_mJO%DP<|CyvNvDgTw~r+hGqS`6w2oda|^bYPN~WDXqZObrU%+I-B!6{IJrRNJwK zUf;a_mT>fOq(A)**g@0cKPB-0QJ#)9bD*=@u!5b~O@L%Rf_F*w0yh@b&Km^0z3|7Wvm0 zU5NDZXE1*NSi^TfP5gZ?i^PWV1I3T+xC!_NSxAdfRAP(^7go8~vt09M34l0Mwnax; zAMuWY7`KEPNQT@{=zN#$ydr{@5P(;#dutSIgmKoPSP%Qb&(Q1PD zlyw>hq9T*;a6sB##KG?XJJ=}7F2872TGLDWTMBLxjg0#(L5;Y`w$EkZwEXPXD%30* zOiw5Lk6zrROY7&Xrry4JLuLYravE!#u6gjF7!GgP@WsCJ zxpzKB=ffo3ov1fMzY}+C;5v$}09kdn|5zz)lFN>%Nj?lCvYt7gFq^o=t`|&vx|(}( zU}MGC|D}0#UlWvXWe$0oKSLlnxo%M%#?$9b+aSsZgtn zF&>7XSjuyIsn`Q`g1)7Nkn{k*6x>J1q$-U0^PkhB_CX0TccWS4 z7zg?^Sv#r@W67j-q0YmT3Q`hN*S3QFb5xFgZ4@8|*rh(FLx*lYJqVo~>hLTk$l?XM z1EXaL*67~^`AF{N#Qb%XEX!Ru5Ljn$Weu4NN4`HGHTLhRFs+AVus>6wyt7!TUO%Dt zNj}wPI0L(>1;~kU3}th$v){;6!Lfo{n;4d!{|#li>;9=s1!{#8ow`Q9@4 zy$t_do0mBKSf;zg+Wh0Jkst+UfQC|Z{gSE|cmBK&E*tvKq{6!6$?D6BN$!|UhlzsT zH$V^nW(3L@kS}7{exEWPAGLFaO6&Gh-Qjbmlk}u>5&K)9U-ejaBg=vq-kH2#V^ys4 z13z_-{QP{D``%I4jK+Gim4>?(^==67G22mTsPvF}PUsK>JISn1|CuNCn0uSTs*Q>t z%o&=F`OU$B-^YEn&G;u8fgXEdE_Hq+K1}*q6!#Zc)KsnHQ7zC=`>l=tg(r}`dFIgC z@gzgqItw|Qb-ccpHvKnLa~z3cw(J1+4eHLV7!+p?wS}Tm%8^@%G3TEagJXVm=>jpo ztsMj`3RP0_G#5AjOGYZ!KKpI?_?uz$j`Lw?2!6SnfMZl<}Y@?Re>iN^=N zc!TwGFA%4r4qQ58F;DVOk60?bAL}X~U&b3>&?){^2M+b&o{-*GcX+|sLb$w-ao@0i z^T#`OKj&_w+iqp2mOgn%g!l&EKC~zF4MJ}57sU~e*(`z^jc$ON!TmbgX_Noa1t0wW zy$R@ID-X3*&L3Eo!Uv5R&SC(Rg{}+dxKL?-+=d}7eYeR|je#UnTsR>Lew~&YhltaT z*oJ6o4)N022YWf;4VYd(sR@K|{axdzJ73 zn_pH{QPjsnyoQqDC2G~S_IG=a(p~Q8mtc}INN3;md9kIhMnY9%n!qE4*EKae!j8{1 zKmCgY3Is{h`{geU`*{II(mYdwA|hgpm&dKo`rg5$dHlZbXie=I!^cezuQfAL7(M{p zXE}Zhxe3;tuAU|##rSGuUkKj()*yB+V|?Rf&$34H=p$yBL%OWw_F!ZmhCX4GhAicy zmay8wY9=Z+mJ!N62yCW|Ss44I<%$6m8p_tz7SrRm4NwPX{p>~=+27J*TrMT* zr&-NAtp3xzVBxFbv9$n3m?z--rML@YB}{NX#h>1R5ri-!<$ort{z5$ouP1duf)NEz}aR;8^_Q*J}fx?MTEMUrr4DjELm&{iJiMa^< zJrN^;pviAhHz0=r<;&SS^7zdnK!W8_F&er$Gf$%um*P0A{!jjKnWU3peOEDj4KKO^ zSEJUrdw&}=IO49^9)Y>``4r)sD z_YamcK?B&Aq=eg{z)V-71#*ID^uEwj0Nm#Wy^Eg)(9Hk;F_9z&cM#*EY#P*aVz&Uz zT#k!)LWzh7k`06Ns^FjQA8S?2$BiPC52m&kf=5BW!ilkN%g(A7weS@?;qDwV4xaLj zSFIQlCmBZsZ9+o<0T53!*%Nr0Ed#bEuOW!7AQ|4kIt=*3aCi7(yrK&eylVX2|I-U) zmR|ISD0FO}m8qU246i;C`nNZ}tHzY>+# zncf~4Xe$4kp8+B|`s2~PHN5C-h}Z_-Go_Tb`OU=lo=n`w#v-u32AXjn@lfEGpmdeM zZB&nuXG|s)gP$P;RiZ|Sxuqp7DIp^5wKX zBaf9gHD1Zs7`u|>a@kniqeCt%LjZ(k=Nzt|hwR-j^KMod(Yt*DTqS-Bd`pX8MX?=a0E2Gm(;x*y}gIC?cedhjWat|3t5L)T`>DhN7)KhK(FC*`P{TcRh7ae z4a5}BfXD;gbi*k zSdji}wiWtc-98z~;*9GV5v@`uym99j@ktdN*d^SvXO0>&?G#Pqoel7jZ=mc+_x$@B zHngu8qa?%X4RR;Hy+`MInK4P?fk{3$6#TvepdOHfhlpVhq%e#}ThTgvYb%l!>iYWC zzJwu2T7aAqt3((^K(n8PsR{#w7zzw|@a;z|k{vGJA@Cdu6IgAGv0kZ=L%eUp1Ol#( z^MQdN2|fmEQ*vvJ@71dUXs;vV;=;*gQN)0Qvquyk7_`aVD44Ck^jWEuUg^ZA9g>TJ zIo}})DGG-e{XYbCAB?_%^zsE+(f7lb!)P@*YVzdSOL1r+*;V2OpEI>8GlH1@{UfLg zc6%ap<21KJv?4+^;p{QZzDMzs%FF~C(mGKs+mQ}{Zq;%1fKI_Tu;g;MPY5%+3owy= z2HY-OzyxDJ)rwyE1Fr2(cy$|o^xcXt!8K3_FN%U>47ITEDGo92*`p`d-eJtM1SN6h zpbiHIOfsQ~p>15PDZK7IO> zxQ$@NTpRwxxsMZ_YDa(n%IH_Pn+G%wCO|ol>L|R)u0{mqV|>JZ)qsZij{+XB6oeHxzytnVf23C^mrFr zdImE`G;u5h>cF1Z}0D>uhHz^Q0I!qX7OMU># zNemV?sLTsyb!_z1wFRa)9rxjNBn@Qd$rvkq zZ9|y4NyJEMLvjfGD9(Ki^kfp~#+I|Y;U0mI+75=JSz#}^@5Zu{m3T}M1IQ00D6eu* z;K_}R=mrDs+*zp`rxb((Lmas&70QS$a%l$c7uy2Ov*|PG(msC<#=#~xIU?8~O>Ber zi&a>e1-v+<`@V^2i3_tJUS7_*cQ={+B=#u`w2&(wphmi5*leg7Z8N?OJM diff --git a/heatmaps/run=0_numberValidators=256_netDegree=6_chi=6.png b/heatmaps/run=0_numberValidators=256_netDegree=6_chi=6.png deleted file mode 100644 index 82ba2c021373e5b84c2d5dba93810cb27f27b987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22750 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 diff --git a/heatmaps/run=0_numberValidators=256_netDegree=6_chi=8.png b/heatmaps/run=0_numberValidators=256_netDegree=6_chi=8.png deleted file mode 100644 index bf38e2cbd8ff5472f79db74f8742b1ceabd43c6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22760 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 diff --git a/heatmaps/run=0_numberValidators=384_netDegree=6_chi=8.png b/heatmaps/run=0_numberValidators=384_netDegree=6_chi=8.png deleted file mode 100644 index 52d8d0293700af0d1b249032e501c0dbca089033..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23028 zcmd_Sc|4YD`#pT4WJ+W%k|BwV4MHLzQ<7AYGB$|}A@fiOkq}ZzM3H2OsECZEL6K-O zMF=4hncj8Y+IzR3@ALir-uLf!fA;g)Pq|(9b)DC79>+S?TE`h`Xs~r5(-I~Mg|bjb zTf>M#q4lRwXxbR)@i*&Uf9%A66kRk;Ty{Dfaye<~e2}uu(#6rv!Nu;V)pECk&L@sK z9A6{7PFimD@*^%Tjwh64WbFU`fV6}2VVP#j??$dXJfuH>U>0qiNx57d(H9ZZxr0TaHHUWnbl2+!WH7`cjAnW z^=aKVey!JAQ1fvoT0s z*{NgRp%<5e-n@AuJb7zZCOv+Hf0>z?aZf3mPt)@%I*Tq|yqHDMPVwZokBX!H?>LSh zKkn%0s5brUN3Kh+k@cCh6Gx98y|~_fiEZPp`CeXL;}a8><3sJ*`ucAs3J?#m90>^t zJ#R8N&Mi|3^PBoCcu~b`{mUfPNLB%*w%6CUR!ba4iPkme z+FvFryU$MlEO_vCW_mK$Z`L>KW%AQ+pB~D2joFnP*dmBeMudm6uq@liYwkTf|IqV` zG?boqcUQi>z4!X=lkf5ly8rxia!0O}=4z81%9=yZ)l5y7JUBUcZg#3$wd$(snl&5^ zH@2O=e*Jn&(z8A#vJ!Py_uJ7jP$HHpR0l6yn&Ug|sj+qI^_@2jnhTEcm=@RuJ&jqp zbbYh4-R#UX0~1sE=>>~qt*cqQhpTvcT1u3^eY|ho|B6B}_xZtfXaB<+KRk>jxE{C- zgyGd(+n%(^NILslw5Ts zCVw=U2c@N@g@lK%wX%7@wREW@C8Xiz_P!rVSj~=`Nxq9I8ZIs_xvpC0_*bo7y}A;y zr03I8KJM`8!H@TH0-L-|C~RjI3HlCLiwFw`-to(0W@4(md$`WU^JV>$x;mbSCF>R! z9BbMwnY}AB?nq1VeZvf6qrIl4mmHm)7pr)UtsXNI^cjsx-~aF)!=gnz=gyt;jF@zt z9!Z*AJ$$#LyL)Ae@8p1R7aohN#Oo(Fr4moc!j|^n``CwzadBcBRa7*SHu-35-W>4w z&c5;epB}hoKEC5IHSR>C<~`9BZ`(EdtEqGzWjJYeYU|A=Yv$!oTM*aR48O= z+a$ePu%9KJUshIXxD2)k7#J9&o86a>lQCzd6uI;+Ryz5OW$V_hB&-oHRn=poy*tB~ ztYiB2?VF)QEbrPQY*#mW7^SvcRq=XtXTS0WC8hFr@Aw=_r`O*xyKmG#GW9u9b?EIr zhsXHa_V)H84L25Ir|q_5!6t9MXTMa*_3J!ALBXl-&t!PzZ5VFt$!1knR(ALBux!q; zOtbZo`gX#l`=!9>w@*v)5{8C`%2IV=&d0>;>}*c*{l$oVxTW#dF3V%bn9a@2^)Ibu zth=hR)5|v~+rhFhSv~pu*x`c*Eo(2V8v5}gC@V|Kw&_lU=2`B|49RX%LFxgy)-_h2 zt0U6)WG}O`x6eH}cz{y&<;7)oUS5X7hYyR#>aIQVih}JGRNZ}mJ1#B`SCOihkGp!6 zbHA{CE7bX=XrTe3U}Z4omS$OIS^i_I?KO%_iocF<8guJyo1cR+!={ox5{3= zWZnP3s`%7ST{z?&+I1S87Ep+12TF-6%u$*xS|P zhKWk9<&Bwpc4V2ZW8st6xV2}))gL{tuk)@s#IkYYM#D5+uA_cOA9+!RJ~))N zC!TBxxO{nOe}Dh0+k4maf4n~uTX#2qz5V;Z3l}(_UshPe&CUI!w)T{6TK%u$jEszn zYmY7_*>c~$ea0C^^H0++EI0R?PTRdb&FJXV#vWT13r|laN?Ak0&a96gJ}jk#O|u@^ z^3Z`Lim|sTTM&6NXkw(BXW~pQ^*fNmNIWqG(aOom^?WFlIo?vtcsupz2S&KAu35X5bKpbaR(*XIRDck?_43!R*#-Tk(7%CPr*kA52V4FfcN1M#;-P@>&?LS1sAFt>kA*1%B+*Rm=4zbIBDjg4r20oblSA!i1Upb#Op4ueO{Z~P%V%*?yvlB?C3fEq!TV}2 z3!vlO;JEyOOYf;5W*%CK@AQv7{HnhE9Af&Ep{X^$#)m%}srVt9dnXOWB_)~h6)ALsP7e(^7C3pFVHHq6azvb#j*gv+Yd#8fWp#DRiSC!sYfOlzJL&E_!=s|Jlqv*}6#|c3ju8L{cVe zUL7eIxv%he`!ku+N(818l63F7$nbCtM2qKWPr&)}Y-Yvo>_S39PhP&19`m%W4&R)n z8!LO_i@wdlgEZpPCkJa|B}rnF*mEZw3AqBXweOzY=E0Vd;pv~P*HI)WwKEfn2+Rw* zX`@^F2TNyJkyE{g9xuR>%VFc`y1wK&c<4~d{)cYksC{yF&9ZCl-*fs+|KK5usC@F9 z_8^zxgSstF$hIkCTitZ{`T5)0+9;GGZ*TMQ3kb-e5EtFQpX@g9zR2k_{f%vxgAr09 z8#as=B=t%5=Bq@d^M{3nEv8iBU7qdldzE~;=T-8SsPB(YFJM+xRqY){S)NB}|MpFK znX2#V*jc0@T7MM&c;ns8nkJXBUR9h~G@l}O_~jMh+|}lf%qVQ7(_x7{X@dSqHCGV zlkh81moH1k)>Kw9P&&>C`m(7rL`6jjneE?S6~Zp^#!A<~fLmHx+O{i5Zd=l(k|)Q= z_Mo|@t?l=1OMMa|t9&>LYN{C*(G^0=; z07%O2EK^}oQH`w3UkIb})>d+3s>CB#{%rM=sg78>k`h8gM}J}bS4r*jgf)8oMpE9} z^(H;oQhG{x)HnM1>5Z6~PuX*JOmx5h@L^w;fwp!Cz?^u)2_LR|l<0TkldZFNekiv1 z{M>JxZn)X=BVYl=@N&jdptRu3%wxH061JY>&v>i5)^qd-VDxMm64vXxhqv=@aHOCp zAwOL+EeuafTVZ<7E)>Daqj=a!>JosaW{lXj9FLJh&y!RI%SPU&Cn}#z@%l;73+2tj zJy@5hgoIG6JdOJ%y4;}>=?H+O3e>H^;*oR4U)tLIqeQk^z0W^t>uO$n+){Ec;F3^a z88XF=0^3~?O?mnGmB@dMwKw$>PGQ+Ck^GQ5ZyUFu?Rb;5Z%@`8v>|zUd5&#mG{qBN zE>|6>dG;*xO;R5UH`l7m8=Qn&Jh}xwK0LXIB#q6RX`D}-X#7fW0XB2GQ5q9L?WmH- zXS_a>V^!N#rvopoJ4Q>v=j4voi%v}s`pJAZ%U|cxW7yo>tQ~1Sb*?GfT#!fFtn5c$ z)9}-kNt}GkUZv^r*frd%12RA(KU2UwykHd8-WnphuSOL z2TOjk@$j6Pn(_|kTcb7L4Ui=1#65vMX>s)EDi!I0lY_&bYc{y_uzh)+a2j`4a5WN% zQbSX-9q$DQ(m6p@6FShhuyB{L0Eo3*;`NNdG&s zG@^Hhoq25b7EeVwS;~)h@bWu2I2?Vhb(BktrYeG6vj5(yzVSuM$`6G<8E{D$i@Oyk zuJ3kna@rg#u`6uK|3Og^r&m_IUw-11D{TV(P+ewG{I$TDH+pd6Se>R`W<)=h(o9bnM8e zrWCwH&97o&VpdqF=KCiOM>S=vZ7T7ZT<`7e9mcXKedo<{`Lmi;K8vcu`A$piySE%z zC025eR^jnauh1PA*t~lA(jZeh-QS-wZ{9o#g?{0Zz~i4DByWvermd}g{=iM&>0gg) zYjy2IF9H)LBap|(KSvIu=F(6I9xa{ur6+SYWt~qAvuZqAHtAu0bgZ_1;&GaX4vA5; z2m25tQE_qfixx#%_3`)~Vs0HQx4D1*^5uP@awSs<;&|0a3T)~YxWW4VZyg=C=H6~l zsTa1hv7{ejCCBrJZDmbOsT=KhjiBH1)vIqCyXuWxHopQCS-e}nY$P=geWXdLZwaS) z_JNYr+{<2L{hN;*={c5ED5_6+YR4I`wu&>%s)jCZt=s3S(rEM14n?LK#n|BZcpm?5 z)tC3~-77*590ho@Y15`OrS50CVH27wA{@LvH6^dj-hPyeb+jeN^7N=uNl(}2S$urO zy$3A(8`#jaRG=EZdfX7O76L0R{!f#BiWpZSfx2 zmdK(cV}NZ)TGyIL!OzztH>s&qsdKi6jv8Unde{`hfnrG^g2wxss*pPgtK zS1wUFZf3WC|Lv{r6WM_?w^{qn^!MAL7u=s^ zfLumH!6F={)lQWp8|a=_UaIS7-OmpPA5{Q9=4?Gv zG5-s@+szAP>T2J7aedVZo(2?1%;*NN4nGH5JiCf<6m390R4uXJzLTL?yelLRsrv`^18Z3@iOMYZ0b_?eLb>rP&nIBvuYGty-$O! z(dnvkjg7sKIyo`X-uC#krWhj-ibMTOeNJxfW zOU!XA60Uj1?*|W9{!A++l>BTnSb7jN9%0goL_9`bF`({ zBg0qqdP+*_oe4B$3_@Yv3%-B6NjGO_ETw)UsvhW zp6TcndbQu*5J+zc!ieg3zjMawq28>X(4mXTT1*OYyx zq@-kRa5l)ioSdApldV20U*s*gDsywBVY{l1o`Q$Fy9LUR=AHZC?2xBEqwVz>5aP`i zk(Fg5OP8W~cBsW`kn8Ax*YJsn4zJy&i2RBLg5LfJe(Ra3iTXa0jBlId(t>r!SQ}Sh zh`^9vv!?y)*D$nZWwo_T*j5@qF=G$?$3GScXHTBZ*4(SA zIz9Qb=G1)V9Jc|}0_ooD(wQY74ALIV|NN}Hyj=G1OMbi7Mls%JnR+|W-**3RDJeONGRkPrYdS)MpdN**&Q5WF@hb{YIN*n=G1_LUj=^aHOew! zG7249tMd*%dsXCQoiYCwVhm3oG&<^%@6fu8lw@aTc|sqw`c5uP@)=9GptkFlF(b&C ziY9Zv2t>g(ht@|x!es#eL;dg8th(>&=x8`8lJ*K)%Mtf1JjoQlEi@ux*W}iM+h8q+ z(CUex+~ZY|WV++N^TCfLUOeC}gN-sSRLgQdI!rhUdKO*^2oXHc7F`xJm1q5CCtE33 z3xDk|@#MmiY2v={9#5gC)oB`dl}tx&yQk-fS&<_Rdfd|m1?%pZm!3m|*KttB?m!Bg;gj`fEkfpYN39H<1*V3=!FWwb&ed*su;N8XB{;LqYUSX73vBd;qN z85yw&3Pz$GZ9|G7P3_V8R7Nl&!G6+b!0FUw?P^@G-l9 z8MKsXsxQf>k?RQif$LO)ND51=9DPtLPwxn_l2DxF_D8zwuA`7_IQfnL(af)7AWgEH zbtFw+PZV3FINxyOyNE^NemL7YJ5z`odw>kjjw;TLO)lxgchPTVBuVq!R=J%M&m>l@ z(jnCs5(5)x|JNm6C!IhV3jaXJ1jWb4SC7QzuhnWl_B{nx49m%pB@K~;ar$!H#R_RO zy8ZI9Rf%^&ilpFvG;7Tdd`ofc4F%s4hQ1(-iA#b3mt|kJOnRA$r*Y>v%KllT$@Y#8 zVf6JHh`P%2LR%^!maMHF%>!0LlZIwObL`Xo6I(}n8@7UGVghsWI@?^;2`_hXe6B~M zysSEd)8v>v>2Ij_v-`HVnEu7(QtyU4KIyxf zltk^{KsSn_i+w*Ck5(F;xhSA!APP-7xbE?8)!B@D`k`!fs+rKPG_OtqeP{q|2A(-{ zhAbn1(X(J?2#_~}^`ph|2P4fF;< zXhjKgjt#dMAyDt07`=%OOb-Wzz#MZAZ=I9A;>TBs3I%TPn<)m%myMLp1C)l6zI}AC z)x5H*Dx-07v|+nuS8Xg>>Y(@CU#bqO<0+6`$jVzG1cil!k}Ef$Fo}?thm;Tgj~mE? zfIN<$-#*2B?dF z{)z4m-1~aB4W3{-nL*6=df(@~Z^a`U6{_gg&r3)sb`dRJWzH1mZ43b-ThD2Ky8WdC zdr(s>jPu-Ksb?1zcb>m`_1sw=8Qr^Yb=KS?nd4_y0lj(<`r{_%DnQ4Bz1hl9oE zMgpk-MHnuyESAHLMpRfhItn|u9Q6)#t@ifq@nXTx6P25qlXobld@8XG2?-Y!5upS1 z5tx)D*gr7v8o>L?CLh!HGJ$1a6WRv`7D6SPw_riM$9`4eo%Im*_&2(<5vB|MY}ADd zfnc|LYy!SUKfkn&88nT(Wbp`d>~?)h=o8UtlCT5l7UWn~(3?GQVZ_aCadedZ)>6Vu z2?-5-T%V?wYuhLxDk@qA4i1c6eb$cMv`xJDCaCJma`NQK#E;9uo?m981vQQ*2nY(Ad2db# zj?0%be|Tuf6>8osD1ZuLAN2r@W+mRZ;X^n3kEMQsSPHF&ZUc_!CQ4druGF4`u$_LHuwBDz!>2euxjk;#&9t;+5Ly>q(--z% zIWXJp>`>X)y6BCueQVME=QU%D3b}F#H?uGF=6H9uAMSs9?5xT0TBoNaISs){E* zYpK0>HTjfZn?3q~%^AkJT~!4$Ts4i2Tn@#<^Z;!;zVK?7LdT8LIpN|Gc>THv2-s7g zVT8oQ=%LaKegCd*W_IPmP}lT}6|hm)BsXBbKkTUjLh` zkxBeO(QK0Q(UA6e=M3r!^CZS+O=5M^OleI_(KnEc1V&i!f(k>uBm{DsXpjgCgys>+ z3XMY>fQttD&|p>p?23R;j+ItWT#?ebp;!?57t+r)bPv_6iP~;A3=+dokIK+6Aunz* zHs&O#$gxe$`i#~J3%C`;R!K=MMA9ib(arkt<3~22GmnukkKh0D=zE@jwBdYgY!J$u z@Va$eptPz;tNNT@ELwzXp0W6(ghRGhKUg$bTyLZ2CH=Y6R! z^bHU*a(ijzG{hZHK98>`o?zkS+A(qM6qAHhq@TcLg?JwpalQpjB(Dg|ubIm)3A93n z*Qz2OU&>*=NL(7v zbLLb3Y6J7dwNz(@=$c!zt@(;qJ0pl+BkDQl5k*Fg%hpfVIDZEmPN zleVxwx1!Wt4aKCJA!TCq0!v#*Y=i8dx`~3ZGK!a+}`nbi8iy4lV&#iF2 zAl(ybi~H6*vU8r7xi#CEG|y=4xY-|1Yi!!WeDSV-SLFUO#4vPbViFjioUCYRSw?y- zsP|06<;^RE<{f%@g%Nxm`k4_sD(@d^qIoCoC@-1)qB@7`&JUkQ0KPTrhYZ)GS)Ph%zz)Ovf0 zT7hlj5a3M5n~a@+&ofdewn^UK8PUwor+}MMfoe~vJr-WsvLm@1y_cD|%@{5npyu~z z@a7RkMH{AOCI>10D4iYPWwangQQAP5Xd4)40Tj7}qj@6q^Z2;?^-6sk@%ie>KeWDA zbE^r<>%hLS6}l)bEiD+-&{L;qiLy%7|2jKuDE>EZ-hA(L_3G97NAX>qoy%9Q-0FGd z>eV|pdqP9P&r-87Qnm%4R&)MQ4pPtv_k=!%R4Q-`=<|X2pI=qkR};0E??6D@U4Q20 z`K!H1*u{)O-?REP+RH0zL4g+Fzi87q1*EvTi_2O{*|TTNl=IQiDQ;%Ex?%Z)2ayz@ zsl?n%O%q)_}pg+Q_dQ@nBjm1?WH zI_;@br@~ZjLTQK8^6;IqSJ`7L|k-Gdz zlt|R2OJM-DRzTB`$k$kPYW%uMn}6wPX8nF~V}n(dXP&WsNGaRen+#6` z=F-#aG2chUJULUp^9C2E;pWS7{>2<2ALXi6{+Y7KgLt2zrU*v?HT!#cra2Y?`K&8r z&GC51Vk-@jHbsEEB-%8wb** zk8mX*j~+QXIYr&;>FKfRvj=6}{W4L~ zNi|mW3dwT#9!r{7?lm6Fk=t~2jUIAcp&|tx9i5A^mb6fi%O>qEv;CE!<}>A+Jik9= zl4g`Ke4q@NpbFgbE0m5|0dqrtVqk)vs$pQjio)}ZpSgDdb*UuoqD^iCOtU?Rj!F~d zY}2nE5i!3m&fhD!i^uUOAkcL*O11}K_&}Q=V`R`Z_uC1pDESDd`_^;I5^P7a`X#DV zzS7mv$Y*72NJ|NPb7)pSAV)2LJInn&zut|2xunk^ey!e$<=U$b6ZwVu!+)mh;QeK( zjC0?=gK@rbO8=)K>hG=E^k<^uETf%onm>Hx#Oeh4xkaduwx|#M_lMFgu!8m*|M*%? z2CP(1b>kQEwbbemY)#SOxHmj!B%Hh5a5iqkqfQEo9xDetSvGektNdx_zry`;*F+z+ z2;2UzB9#0|gEjV*rL6Hk0borjAmy^v5}5{m82IzV^E5RyC=|dyJOvHFA*3Cl)vH-n zty-mZ?ovp)Hx&l-q6G!9{wQAn+#}@`notTc*yJ2*k|sSo`kN~Fn_j^pVI8b*BP$`E z-=f_@O|2O)64^%btTrKx46(2vYgD{1IF@^~LCodbM?MPM(xqqN?rH0M8gr!aR;--5 zm^^O_W8hj#Y@vi=^jA|53abI-iR)>se{W}3m(Yd{Cbu|1@_-c(-n6MDBx*5x>>>gS zV!%|M;R>V8LZ22D=`XFJ)RL8#KT1d-XxhU> zh?E!syaQY`+PSmw>y6Y@B+Jao6Pj9D!mus8kB*KWbcPE<@xSX?~4^2EFM@4-jhve(dXCgt5G5A?m2wKZuS zP4-R?c0aGGnhzqO220oenL#;mW_s%;~ zctLOYS!T?Y|G-)pLPz z%r@{eBEuf427m zizrCocuXS?oh(0!g|+o*s&)(l#p&1RQR3Y+De-iDM<-PB8!AhPUwid9QH?3ybyb6+ zu>>ONf+Bsr3^nDY#y)wX9T*&(ftJwdXOFxtd~z){Z-cd%l(-*XTxLpyh-?T+iDBcO5rsXfJ?yq?CQ_i zM&}KBIm$A9X7)hYdpl7FDz1P@WuE=}`~WbeM8^Z!*m1XR(-zd(|0BxOo@H7YaO7@O zu@m|TDpoCTYU0Vw%{59WEiE0LRc9c4&i@86+vGUdV|l2_E&oKf!P;YQSwKvlK67Tl zrL{*-Wk33*``!=lUv%Y4pkot>6Mu6E=KYE%oSi}8+_}e|kkXyy&Lp+oT9vL|0q@8r z8uqzR65xQv&4mtvT9L~lpwxec-H?WYYtd1FavRT$jE-IyD_O0iv;-Ka{!3q9X6wq$ zsVm>F@O%Gaxfr!^(T~t!0o_i+fshe9 z4Rk#;GD0`xtsVm5x1*yYbsFg$I=7mk;rY$hE9BP_2u0wE7?@|BBcC3u`%;$_310s* zK)uP`Lkr>9qoaVJy9i&!mzRlWv4J1Awh96@`olNp`SY9o$2LIfa4MvRMamkKG5%PI z-n4CSFcRd`@{JqKZmqF@zZUK;%g!fJ+S|5i5;q?#d(AMh$~ghT&}NQTmJmcB03~&O6Pnu9htRK5wY! zwFnx>B|^f&_l>4zZ@d^5J&eqtJ@{*EfVpkrcB{~qU|6nqzu#kM=nrjbKE#yuyWLS1 z&mfR`6VdnicT4%deEHIrW0Reo-K$%>B*Dv9D-ENp%+V5qkUSx zem$91Acjz+1raH!7g&DwgoR}L%7Tfkca}k_L~^H4h(ECyw6e4lR@0wcC>&(D%gXaW zXB~hh6n}_Mn{(75r&PZN`=?9YUQC0#6~ zZO&zsm#Z!k%_BW;+Y-Y4gi9zY@}WiE0&h{c029K11rdxwJ^Bq^0^(pr$T7fguzLRk zP8gxq9Db<*?Tr+|UNPf=HK_H<}2tZFv6ln3A z^%2>ssbTYo>}$`Jf&Q_Lv%bgCFhRR;s05L8PRc)(1`ANHEHsZ8`BnrFXD$2#sN>gn z4}QFVqM9L6+c!V)=`q^7{y-*SaPfD3`Eo1vXaBnfZT19iyw=o{J9g}_jr98Q^#l&MYskUss&0Jf;jUESTE!9f5>tdp0Qr)*3TjZR3IFzrrQcZ{3pP~2>6 z%LnRSzKlDr(B0V?2z;8Fn%XmZpDlKu`hpL~Le8Dj0)lGq?`MIlo;dv>qc^-b;i2R0 zy^+|<5Wc!6d2B!2lS%>W>^tRNVz%=fHCe#JxfBAB8Xg_(UjQULS_-$cSqOI6qp^uU zdH>Y|m+>BfnSzK83NJjdMPqko-tAV`m_0GtvjYf=^eP)1+bB@BUS;i5Kmq8TG6jZ% z&O}dv*2a!kNJk-(i&XCg5#ZIR$3#X2GhYF}0#TV_fA%&k5YY;E9~c3T{TTg%wg;Th z#CW{z^7>>L%P9V^387dmSh@XbXL*B$(mfQGf*K?Vwl1k~7?HTsaO^1`*%%ke3Yc$19V(g$q`{M5TjXwiT)Y*}a%W>6`L&uEJ(x(MmJoQr0G zThN3#&Cd9MqFRdoTha9_o~RipIuJl_34Dge0;svTjt{pBt%_%r--!vQX2p`3x~|9y z<>E298@8=}Z{sJLK~uW$hSFS_O0%m8-T0|`xb|4@AwFJAe-w12r;9^1>We*d%UDAH z$_92|y3N2;&z5arR99C|oz32RR}6DI3PgN{o9X-^+L%N9bf~Efc-z2g8lJZe#ZhuY zaUmjvWxL*iAT-+7vK1gg1YR0*`X3;#1}4-rk(kx6H5W`xO*sy>sK8D7xW0ZdT!w)t zu)&K2&moOhym+xtH*GOV^O)8+OyTI=tf4WFOsfzf4;8rHWFPeO#7{pzfFCd&8HrG6 z5zjMEHsn+ejt?VkE=&3Q_e;PND=D}BuPO#3CC7c(3I=d^8CigYk<@@tj zCu#S>@ItwUbZ^@QypPEx?RRt@kFoSZfofpYa_v8?FGx!T5@_r0CNA1UvuFIIQ9X^G zr3}L1FsvUHwYm?J1h>&WAL#GT@t$xdw))IIwggcT7n;6(XIN)1?-JzXoQGOaFpZpl z3bvWS`DVIQ#6XBb(9vWL2Kmn)YTWx7GTEmU79OInw}Gm5TK3PD+}di z3pD$U{@tHmV64pO;q~(o5eq^27~k*;yG(Q{4GrUO7`Wr5$O4X#hSKcjPCe>H5DexX znKv#gI4qG}BFxwDI;*W#WK6V&o|?L#VBJ!A`RrK*x@rQhy~o?nR5ONYpR<8H>q0nh zzUP6A9AQ%CFrvJ?qG;WAB&1XC9N4o$cNqYP2SlsIgk&}A>5wOOq{9zC4xEljsWooA z8s8uPuFrh>pt|3P1uzJmzj7rU72^APdyNOF2YF;U)F!B_(}2mif*Kf<(v33~E4lTD zz-s$>9_n&1wZ)FTka7SK+n8{yw(zDS682|jyf!>Kg2GS z4EnIJkSA0nsYIgKhl8Du6)G3uMxqY5_Pl!BEX2nCT95k2X=oei=B1m6Aqbplao%x= zqzgH@*rPni?Rho=OrUYAfSHUKRn?RI*)%8Pu}0cw2*pKcJWoOtKzq~qC|3njkDN-YD^x!JOU(zGDOI24E9{(HZg*#3{~Cm;U0n-f1`#)pXsBzKFbuskyrgs&18_Xkl=xn@-rM#{2(cgz-m#zW6v zg>-86ScvS!d?Y)cJ~Fw}aEB(Or0Z~}K?VvyB$9bZ)cK|4``hGYQyC$_X=nRRbny^@ zqKp))ZBrN59A<@QItb<85@`skQHERvzFv}ieTgkROy62dfjt(5FH>1^b9)j!<<0HA z92js}ieZ>=ujhjMQ$zE1CQ8E)x@A z-yRBfE(W1VV~^3ns<$N=Zw>&oUHSJ5B92F5>BoDO1*{=Xo=c2&5@TBV0kN@(xfS9~ z>c3d!-57!!ZdtxN_pFZIVD{PvlaSgFD()l`gp>`KRfRRk!kKY-)Kl`ds6buc&hB>Z zmgVw`z^l<2(4wvRTVCbEAGZ;}DdzC_)cmOM`e*W9LedoyG zjMxS9=3PUB3NwU)%SEu7WJ40ugy?TABj%gbRLURR@W+M*j;Bwb!Yr_I!~GvM=&QKr)-&M>s%QsT;Un+!i3hKprDC&<#A@j8UzcR#bCK~im9?lbuO`H21 zzhcT*^FQ=(1P5D`97N-_ZK7zu|K{futt6L~&?1q8sv}_+h!zL`{HBSWE5JC@{8qzr zm`yGZxbiEzv8Z^C5*CJ&X}(*3b8>vQ=7ZlfYBc-?Fx)x4Tfu?83fH_Z=g8v-c~yPO zmV%d5N67 z#GE{IUv5Yq_S`F*!6T&BzuGUOUL(3~q0$lWAT z@mXH>&$Y2`leUm2WfmP?@Lm7^B)%8I2talm#QuNC_KyhIwQb1A|Ga?&P~yL}`Qum% zY6tv}`yseFLN9wxxj!B_*Gez>w@ZQg)zt5CuGm|aO7riZY9)KlSsSP;f1i983Lw-a zVsl1;N;a0jzw8JxOn7Qf5?1Jc$V}lEpE&+zNC`6#V+>eIP9q>{A!ylGu-%S+ZDfYO zoQ6V1x6wqQk8{5yb%WmVsdmLFYJk=^|+?hWqyM|3z@( zr&0rCuOGlf2L=$sF$g$s{`~eox}lYScSFVOA}i!s2*XHaWnFvgSKzZk%F0V&wIa5D zLSR96FRQMmzjNn~?GF_d6*Mts9TO0qFq1B#Vz7OC)1Dp;4J~92s57uhS0j+lpFi)9 zzL{v&MHrMxsN)e3SO|=IbmYg6M$3E+dQq30Ir1dt;2c3O3}5=|*RPMfNoRjF-ocD< zcp(J^9*nu!{@7_`1X6WZ#{_Kh(5l7k5#^q~^cuei;3103(_rwnXzD=mTiV+blz6li zH$wc_*REY#99dXU5E~b}>SIVqX9zg-C!(Z}feV>*gj!nk1WBWy6XpYAF>#d3d3?9Q zY$@DPRv(L;pqF&8SjaB|2}^}OF{1zkWb6fo(KCSQOV-e# zw*80dwD2%Z4B_OkHMNB1ahisIZXn7n;f4Mwp-UTQ9p3YA&#OkE`t(z*EXBmSF8GI-yV`Yjc)il`gin7TVRWG`ub*-fT~Fx)ggmJ2n_H5xyDv zX+}cQ(yW+`r1z*D^_;u10<9WfobwLlnRVOH&%k`31*)6OfD_FH+zSv`I(NYNN7Oto zoK-UU?V(mp<~ z)>~Pj*FAdOzj4%M`HwHIKS2mmqoq@8zFKk@{zSFAaDv2uwon1NVA--|@UbY615tLb zL?*#f!P9UC=14TuVXKYxG;F9;mX4C=s5oNG5gHlZT+)_DEcw7JiG*Q&a+yX=zlZS3nWLG0>=qLbPJ8l{Xko-xQOs!^( z;Ky?Q)LO004ZuR7;Dj5BKk$w)Mr&X*H%df1WSnKnh4|14jS5LGCJ;DbBQybYa4BH5 zNb^Ej4(b&Im7}ZcuFSqUGRLY8uJF@WuJHFdd3ru*u@bA7#C$M4HMjDBt;0^Y2JdH@ zxbhDf>N-Ox%WYYjH-~`w2}rfa3n3FIl{KBcIc^uH6T zXkb}$u63@@q#Nl*;MlaCr29KDX7ref<-QwJmG5-~&Locw^+5`OW8Fdotq?u?v!^?OI+kJOSN z9K94pl>R@GCXLiSiYqr`?9RC-A+DQ$V~$R(G}>!bRxc%_=SiLXUq1vN!tZ+UXDSy7 zWKzH2BYb9kP4v-!!=(G{>JN{bouj!hC&W1u1Lc!>hGYMB2`ET#U3+CEykO;D2AsbU z4;KG#Nm_y{kb8fb*#g6v--|$?+P`fJ5xNwndlaLmb03IcqvY?U4`#gf@wZhgc`=)5 zK81<6MgH=2Vs#Tz!6cE1UP9aAXf4bOy%}Q`B1cTPdwCJ#BsL->vj=`!>YD zt(%OlAKBd>&1lP=E!m_R=^O3d%?)xU5Cw(jp(;pY^cqzFv49{H965ngOO`7ue<*`T z@TwtWmV(dI7cVqReW!_opk)8)wV#17<#m#ili`<P#SsdG@I8eI3>wPYZ1Y91 z`C&)WVaQ9?CS7Cn6p9EP1)%NlN44kth~DT#h(bb01|)TmVX`?t0_Vh_gWW|O;-gEhcI$a2ye|i{;}Mop`oF%)_#tL z-eqUJiDdJ4ItB*x6bN6pV!b>)btl6(1O%iC42qv*_a+?-xAEnRT%*F(^6JZx5syU5 za!ezjEO{yxf-FF1Hgw|q@vJ&nEawr%IB$+I*6TYFGfdvlFF)8HFK+b68-=m09o#I* z)#}NzRyMOSIP?d^Zp87APOxB8JX^|>?nkL_ zOL2~aH9V`?8(T5v7lurl^;!56DZ_c6e=Fkwg@uL2SEHj(f$EKSH*@;5ugf(q#VEsu z_K4a8&ypXF-+u}N8bNyQomP^$1nni5h3|W<5^RDB`m*4;(X_dNmuc_n3PQ15)vh;Z z#5}xgaW6Ti#1Iqo)@L?n6Kyde6*I-aa9cdRK^T$wFyyav(*g-GgDWAB8Hs6N=;zNG zjK;QMJ^{Axr7}l^)vc_A2@g_Pslmy~NyZ*1{-Av@fAqBIaRNIMh)p#3xzjj&MkkWF z=G(%#o~Yu#`p6fyth;dxcmgMYbm;5TwfALtL58cu1e%D-aS$<-HXzQP=G^O1De|gJ zkC)D%V6rE0p-rQLs<~<|zlNF~=FA_|4T{)Lzp^jKf(E@M9!5O&;NinK`HL3ERAHJ$ z9fS;K*TQ*HS;&AL&R^MtmKiErB!=7CAllda{#Q40rN%)*7^m|q`}|r9}ET(`^&Y#SM|BjaR^pxyrGdf9JO&p`6Mga7tOI1 z;4ObQOI^4J_@vhx27Y&jN`2ex{$lvC%Q0I-l25px>VXH=n(cjGdwVn7_{~qq?<(fv z$K_%$5yZ$L)`nwi#Qge{b|xETkW;GW4)gdBv;UDdAJ(88@?!+QK-9Nf^m^%66hVqD z+vx5Oe-fEg!gMXhTgBs~_cKXKN+NMUSEn{pHEC1;@odB9%Nsz}QBUi*jg&Q*A>PUS1)va;<`J+~QtxjvO>cc0RsP#S>r3 z;Fdww-weaW|6;12X;YJ+iI7vRI%eWT!Pwxn z)Q3J|Vq)YdN+gX_Mj0AdW?Ud;_hATMI3-XKBb^wK)r4vGX5}%=tTh4eYMPnx!yr10 zQFBYAdUDny^efVdKnhF&*HJGg<3>|Qon}jUat}@cia$DZnC}r2BnP3DvxIQ*zQjV~ z5b-5N>3fg7Pyn%54jFr>ipRVS!`d|%DcqlW6~73rduV*vn$WHbSozEF_J+Sb9MpB4 zft@x5XHB{HWfeNYV2_c?WE^!@bwB|y0MiFGa7n$!DKPK>KL*FE?AA{`Va+NDNdn6# zV-GnJhH*Nic6th!&}zuYWSS1Aeat5v2<&x{AU)&SV}*qo@X9>|lw8=zQAQH6II*$k zdZY%-4S{Ux2=`F*{mepv&82>&Ir;gVNPR}1z#HL+CkWr_3_`%l8t(4yp-qw-TTvwf zQ38v+C-UCUVAv>>jMSpwk-F`H!CYE zh6gxoe?T6T#_^Kr?Xf~B9faQ17DH6c$GKA~tgv`OPRD%SwcUeQ#~>(a1e7c3w)Ofs^7lOWC~B}HOLjrhdtQ_li*k&^_- zG!TyQB0qzbfE=`9q`U`gYOdGM<8U#N)D2fqC4!C^(;=O+K!y*5Qbf?k#f!Wk4>Oya z4`Un??Y|ZF>XYZsFPKiFJtK3S*gRJ72;y9=BXEwOwRObFZaBUIl&wikwrCW!MT-u_ zJ+=eH5(5>Pk+UqH7tXJkr>%k+J0d6(of+CT@l}&4d9X7vUtRi}*@1GaFv%1)pP5?? zCwGDIsya}J@EsrYn>`B)95YA`a(pa-zt{~>xo6a%cq8oOtSTAE0aoH;{6PHV5FX4H zW$j)DyF466ZAc@UfNjLK0pXN{Ct7T&VQ-C5TP7i06VWi>pb(qTKisc>0igd&zWx93 c2&T1ZIkkrh&#Cb&FH~55>TC(*OVf diff --git a/heatmaps/run=0_numberValidators=512_netDegree=6_chi=4.png b/heatmaps/run=0_numberValidators=512_netDegree=6_chi=4.png deleted file mode 100644 index 95e593502699d431ac6046fc3321df5f5a0f0fd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22825 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 jzd_Oe=a(~~pnNlfDW<@0mNtx#)QzebY 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 diff --git a/heatmaps/run=0_numberValidators=512_netDegree=6_chi=8.png b/heatmaps/run=0_numberValidators=512_netDegree=6_chi=8.png deleted file mode 100644 index e45ac9ecd15a07fe45414d23db2bc47cf7155b9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22939 zcmd_Sc{rBs+CF?EG8UO7B2+R&8c0Y&RE9Lkkf{`zL&{K5W>J(fOA(?_$W+EAQyD7B zP!Sa(lwVYyzU}w@`?amLJsa-fy3Xr7j$=ReeLv11{oPt@%mU053WaTl zwuT{vLhDDN&~z~};5X}=IzHk*if-Evxb1N~;^txDVnf+w;pSxT=w^S+a=E*Wi|a8* zhjlXRW#pum+q$_qxhl!Zp7{F(GL9}sW!o)&l;T5}oU{+RQYecp$p2~5Rc{}oP!2Ng z(Aa9^8TakI$AQazv#P@$6n+f6R!SzTpgB0bAVug< zHqX&5?KatOi|d_xkH3EuKH$99$xkR-%0_%*Xz}8PHb%bXB6512IfKQrFK4p!)R(Aq z3>q+sEC|HEI?DsGN)%E2lb4b3)4)HT3rx#7I5;8$ENHdyqqW5~$`bs1knjHwf97u) zXvs|0U*+`UD7?J9tD<$rzPwtv(V=7Q$pc4L z%gQc}UbA2Gk^8sc_gaiJ!otD|cC9Z0BcoqFIPq?+_iwj77Y&Zn?{GBu)Zdh9JoWu; z0ZZk@#afjY*ep(*2oqR;oaOv& z_1b=0C9C1OZ?-*t_KaC4ZOO^O*6Pzkr5E2n@>r_czQ5z=VB1Lj=Ak5=Xh|n0C$)H` zlfz$bCtg>QI{&=BUem-xaG)(GBA9zk%JG&v{U6FzWz0%!hwa|*O^0e2NyNs+_IDJm zYi@2He!4O-Nj-r1K<;50CHJp^c}E+bynOlcwaE2oW^TzO-?`ZXWoHx}-WSuGn}1NB z5>)nNf9Uu@)5z$GS=-wJyQ^lkSF3Q>?83s1F*}x1LYHn_ByF7Ecqh~J(Sz3B^>(dY zeTlxBc}HG$efwtmwW#dZ=cQT31Z~6a7aR`^38AA{+t_sDD<|n-zd~zf zK=Jgrl+wuo|2um#d+=xf8#k6lMMYhTi?bhSq)_(U-d%lV^&VE2yMcj>_HXXfuh0xt z!(};5d^fGCtzEHpEqh->qU?{;SuYku(m#9gLg6H1z>E0J`zh?T5yDpoW~WE>@bsip zQd4*F#af7qi7`@os)9H_dBwkYv2)~|V>uH=R7U1*owsJV;OeZbtg86U9y(__&rLdZ zmK+?oHvaA1N=l&j)Ohso_PRQ4i~bz@0%Pd}74PGXu4U<6iaF-xW_@KI-#a*pii*@3 zMZCuPMb3D8hja{me0o`Q#foj2-^=G_a-2Locu%~0(6af+wu9w9-uG08!k29hW?&QG zy3^3mz$<)a_$+0)gkFNZ|Ehv5-oK5~TaKriKiqV@z*xb)T|fVLi;nWCA62$(rKd)3 zQI^k+MELT3yN(CSL#evC<8uDM#P|1WD1ox&)6Ge3R=jJUnmwKj)x9dy9q-Y(HBBe_ zro-c&8V5Fhd5uBY@xI#gSqJXX794Lm7azaOIN$ax=gQrDV)blGHzaKj;W5q@o1LBQ ze_ODoHT%&1Tds@v_R>)BY_zV*n0EE|Gn$*5XC2JDRo9-NeCnJ*s^;UDFWC?u z=NZ_ZeDIw!wJrbl?qMnx+R4q$KQC_`7SbSn^UdYA2HSFaUvB(BeusS7_~68$*XahS zb$ma5{K&PaWN`c5!Qa{0IoTVby4Jdm{dLws&hhc_;jytQ{B?M^ds}>ttHDs}yN8ac zjvvbK;TqABd)c|U1LET1)N5zQ-#L;fyR$!M(dNyYCnqPDOG+~9C91S|`OxPKjhd#@ z-@ku<7~AzpZS6vLclY!|4`q;c7K`||79a!Fgz}#k_MPTn6HxHOV!D5Ar=c8p1_QTF|nVD<8e*4x`a>^AufBV}qub;=qhCT>W8jD{Y zb`9lU#~>pkb4|rt>8?r9IV8XyL`}1-IAwBnYDms=`0#>-3$4C)6nXym$P^=E8tne< zZTE}Vb;diqe0)^Soj>1n*L3rXL{(w#HT(S4lPfk4m7IT*ceJ;sI>fdy>1_TS9>#Eg z(+Ye&h2lQc8Mbtz!(m(^+27S6y!R}tnN3POIkX~#q+58WQGc2W?DmU^i(6oAhR4Ti zCO-H^l%Ag8dFwIr`zN^u%?Kg3jT<)#s`?0q@XFR8=I;5-cu^`4QY58*?JQl2Xe@0V zQD+?c{(kAy__xa8?#iZ{J2<~~6mbfBk8$8;&eOB-*nTVb7&6N`^l%YYY3rwF(Fkca z@^-p~i!`tw622_U2*S?16k+4wYXYIbUb)Urf2_YhLsAtpK@_ojX~5=4L#``kUw|!w9ey5)uq_ z46GGXL*)?*7YiL8>8U19ygp8m4uFAD(VV6$cjN_MzT*cW0|SFe1XbfhM{}b)Mob8i zHEyL1DpRZv9z3|FaBPW-i_2jISL|kB4SU_|%_mU+`8q;)nr;%E0-`p3c zEMLE#JNwYXnAt*9fm#$4xigbah%~Dw{!Gm$XQw{Q#q=K~*#c2TsYuvz8c*8Y-L|tt zad*5D{h>pL#s=FK>&8f(&CIk5s{f^2U>t@QiOR`wba!|2sro3(%gg7Uo^UWJbfQ60 zj~bVLI+eWY*s)`E&!4~I4=F7z9jo1mU9O*Py#CBcH7`kF*EgI9e&jJ^2`Do>I=T%p zn2|WB%b&j`vY(r4=~C2^vvdo2-nQPe(rUVARjdB<{KCbp13r@di=13tIU|I&L=9|o z?3AJe;>L7N(wq8=ucjAL_FPU0j9qt>Csn5Cr&DC#iMRO~jEszz zgm~N59~>^>T(X2Y-gW%z8^ib5ZqkT+?0$B;w!6^-vgT#@-1hbZ8F#yWGT|-7Q~vCh zoh7Ge{n|@T<*};=hK90s_wQ)vaB$e%IF9#q66oCX9C*!vY^a{vr2SJbL74;Bo^t4+gW-FGd%)GJS0{&j=Q6qX zV-?Br_DO%4>iacxqqFq1uIg1lv3n@J9Gsjh?CtF}ZfrP_-?JvecXl+f+C76OE=OVL z;<*oU4THdjK?#FhkIxr`Z+8EBEq!lhOsfh4r3W9A=95sIOMgkKW^T%NPH)JyWM=$b zx=}{dSRpU~C29Shjhi+VzRsIuE}mkZ9q>-THf~k18R>CF757e#x!LSBH#3no_o%Qi z2`Cp&L;#?Fc}rXNAzmcp?e*3|iY_->%^Op-B5GD9o;e5fmFzLp*J}^4yEqR+}Dl}Pj=;LNg>!w;lx`mY{crXZ}MoA2j$=2w_))b|H_nR$fWk@wD{)D zO98@d-xsf^bm1vBHx!E@KQYM4%9i|WJ!EKF9n3A~@=<$dg7QJT4}Cc|qN4+D>m{b_ zy0L*>y$gvy-K?~@-tOR`Lsm#y#y?T3MK;*C`ymfoy|^Z4=v^DW%m5dW?QLpeatUun z+mL#C;`?^9+E=ggs)h#J%zaIN`(ni#Z|z$8#d)Z+bfoo=W3qE^O<;I5Vj6E!DX9;pFo0~mtt01t7i+TFTb6LK%hbjK-#?JI8h2P#5Z1VoC@bjgt;W(jU84SbnbLLf0!<3`R2_VLE-Q=c{- zYZen!Im3sX_xRSX8^a%;a%N2NdX9&911=JDh;}yT}gKlP7dc)&|!e{)@dWoRyVE0xpbu2kc zo|^c1^YSs;Y|XR5%*!!FURfm#|PR+XtKO>#Ls7czo1x zxa)Cs&Hl#fUy~zNq@P%`FKd-cd7rAT&8a!AGec~GoAfhhN&n&Irm#p@#bjXAtlVcA zF1tnNQpg_i5Em?1a79w0>y6!80Dv=NOguNuvbPgzSN7GhvT zo2I`iSa9)yj^({QJ_cKS!x2?6n=F8X7ElU{i=WijFCslqzTVdN&ts}RW22^Bq#e#2 zI%a+`szgORt;v?6ymaA#VWllY)v}H#vh%Mv0; zjdkAUJIkK+JPBYi?vu22eupKDlpDA_SvHxl$}@a!vQ`yWeOWZZ*~KNwc;N@{iT9S5 zt82oR>dxuy*szhoa=zf#knIv1L}?P84WhjX$VYu2n$ zIQ}}lF2Ftlt;BUy&SSLNJGiI!PGPHLdwH8JG`(w98jL&BjaavC9g^6V)vMR=1)8Sm zaF-rRC@C#%LW7fKUM?gjCr1+Y1y+7h@zuU_GaHw1a>{{W*m+~at~E9HhkyR84q)M3 z?%$|$H^-zXrQpM_(Y}$yx#@);e5Rza)?zKZEqnKwM13C|3<2Kfx-RDS>xa#;(>vPV zzD+^O>Tk*9RS;lPne3vIGA|Rv*QJ|2+7Na5vTjFknd1kQcn{4Y=iUpgl*#61TLnG^ zTXtLkL7;BPMmzgfXXEB*JzINj4SFAJjZH>_Vb_|q6*VA@n+1@SUSz@a^z`ssyBzM* z_KzE;z=9Yj=1fnYnFbeP%yiJ1S>?1&+K;q`ruXlc)z{afqZa=i8k2uiOhklc+XYsd z;VkhJfY#`}!&_BQy`n8w0mvQiMqvfGTl4TF&$eyboVzM$;-}bzln)r&h~QbNb*q*H zu;a626C4xGgU*Ddw| zqOPt^Q9ivaT1Ol`TNs`#@9z|!*`xaii^;dao)3L+KuL*m_V*9x%72(oXZmzM39vbJ z+;jBh#(Q>cGWPAcTaB5)nXC*bei~eSmp!HK(|*8x8fD#PmLsQmOzg0#lfMUZIF>Dw zZjn8ZO94dl+G75>yYiwjOW2`<2X_RiKhE{PA5J4R&<9dLk&s2`=c*sP9guhbdSH5b zw1H4!>f5$GcMHFtZkWbQSSPSp)XEZdy)SWSR5dTkFtdekqk|yfjj$x!k1u0mW801t zcI3siv#8cv*A#K7cQvJI0m^Mdzta8r^97KKmS`djb$=mX5A?L&_w%E?#*&ZrHPoV^ z+p}titY4z>$>;i$vJ^bmaIY@$S zcFK&y_V0_(G+jBRc!M{?NRpIL;M)u8$)rgh&heeeY&@`O+q0K1x043%a0SH#TLqoT zRzT;Q-xq`JAPsQoMCUdzbnHSxi#$9$(2P=V0~J362&1^FZB3ya!Nc9Xz2^auwclOQ zNz1>v%gjvZ&c5tm(?{;z_@j-N1Bku~pq;R-=NYAyf(c|CxhK3>#2NqzV z2rqR-N8IPvr>mmA&Rn6Z1@QFHSQE;2c-U!dpoIlEr{;E|PcZ5s3obzkJ$S&&8yiXg zWvpw=)rWdm3yegXHlxgaY*_y%=)XzNdrZpWU@fH#(3EhsKwbJsQH1G5u~Q>Z?`XYX zw)fm*@8V<9rKqJM($Z|Wb=qO6jIT&7en*3TMTzTzEeOPA>s+Q|Mk}YMQ#L;IAp#My zV#9{k!yX1f;AXIZjp+s}Liyxq!M$o6KQ0+AsCW)Vqqn2TmEs3@Q-K&nUBNSmndW#k@G9ZB-!tQHjyA8iYq=9}Fz<+nl9I7;YxSEq{Akvyko>98 z^tu8Q>0m)w)Pye!kufc%GO~j?<+RdQW`28)^>ge_R0%_}wUu6G6f+TV`}Ru0pCDti0n2LP z?am0!ER&)o*lDkgH=aaug3nLi$6{$fs^d`E)FSYaRU^H%gcksLY|)Ugg^ZfI2eSEbH-JaKXhCMA}IlaYJt_*qD>7@(3p!?%TF~I%RC{V_>hj}5Cqh~qCl?oz4SNup0pTAWIwmqMTEv4o-2U!e2-Yx2WZQ+n%PaK;LceUE znVOItU&KNfUJy5&=xEdtU5MupU|OC>p)a4uoaImt1ZE6EFBO8_6%33Vf<+5iw%MJ_ znCByi4AE7qv;kX!$Y1b$0m17t&`sKrk?)U&NQ&TI+K0A46!ml^YD7S4 zYU=RB1TQYO2lr|`1tmip4}lptuL&febAO`<2Rr-nVvix2Z>fVa(nss#IFgf-A(-rH zfAfY3%rr@6k=L%J7nmPEeg^~tmx_u?3bNyqSFiTCeS5nX05_$*&p<#ROjF9N77h#Vyu(r0YXldaFPoZIL zeKVs{#4BxAf-=AA%or!SoP8hVbz{)KR{%WVZVnW=q-9jD=B3Y$hw`!U*3fUvIssJ;0EMBoi2 zF)yZY8Zptl(XlUkHf`Q)g~ARA@S>40JGC-z%t{47 zz};ew*N!1HH(LB|a0a&)1?Z4Pv3CD4I-0yM)56g)XYUYLaqwKrkcKrtShYUMlZ<9Y zO??u%LMwEcOyu@Lub+|#K(grx)4Y21)7K(Rx=u?NIbxR`J$iHj14B<&Y;Z~WQo>gxO+ zKJJKFjUXA#WXNi_P3?k9 zfiId#>9wf5kPK9t```f)2G=@usl_Rsyz`(CdrN)F zc54^qv`(2o5~_Rg;`N<1-($QQKDZWxt{^l#gfarAD?dC5WjzP|J2nkzu)E?cUEQ;1 z>Rw(-B_$=pU{O<#yu40r^lsj|b^QHRMPS@r*A-Te$2B!IUEAcGGPVh2wMpYz)lj?@;|sI-1HyUoe_-0gtMkKxS^qU}NsI5@}{e$R9sy&`+1-p0{p zXG3F!Y!?qeKPbGk-%&E@-+Fq^5zzu5XN@bXQ5mH8$b+tsrJx1O&Q3WJCLBBDd}5+7 zXcDB2RpMv9eEG7;{VN~nb*QDmgPn#-2cy4S%?JxC{T^?vo@ib9)okVVfcwiP%2!{l z;oIHSKbCbR`nT^rr2p&%xi{s}2F?6FSu)Xi+Gg>&XWZzo>>N&y%x1alV{6m<6C!;R4A>;@Wxtd9a0k=6$5>r8agni_)O zQEwGa+8VLKQD7Yd37LJ_vM?ZwN@N%!>jEDeBtOY(jRl@qv1Sd+3a#*}-r5KvP@vgK zZG2%Ns@SZicK&|Ok9}{gz`})rLnE~etTw?fP7v%0A3eIN$RKIHlM+-X#m2Xm0;+wL z`y*U0Qh}W7=bbAww~rlfRHF+^sJ&YAw!lW1PUqI+lawHMBBWRkk^fq2N-ucr)zPn; zX!TSXy}zhv6u(sjjo4_V%wc3BQI<+-R*G#>Q+vsy=EX$yN66!k%>hVv_{Vc$J|$Hi zthmX7brcniZJN&McU6A6bp9uUK}9AF^65^je=HX)_;2Kk^y<8nh7mDGTs$u0f)!;4 zuR9GV)r9eYm@%G)GBBqnHx7D6ZJhtoRE~yVmDuy>RQ>qW; zY3QsKJ$hN~S!Y;g!#!)EKd;klI8EcqlRHh;Q!Da|47#UAe*kQJuce2ijOW`Pvlgu9^Tyy=zGuY zi{Y7>pKX(1xQU|l;>O0sXh~wmV>dbq5#`h7c?{`>iLUG9wDx{p-Yz~xj>s?6uW!cY zY`U!{Ocj6hQK6>CUg>S}ncn1gG}{+NwF=Qg{!Xdz_~5+|Dc$~UJ`+;9L`Zyk$+5%L z0ZCud$f_R6KyKIGxw8rkH(m^b$uO$M3b1b!r_s;5Zr;4P97sz^6Ko;qxJ@n}19wvn#8$_4F>5m#cz}Lsb|dQk1ADE#*>F6fI?Vc(_ri9zEFG@szkY z!H*w5YDc_!_3HU*FHzA~FtunLIrhHz0u`X$cU z+4-8B)rGSw#N|~A67u|7zS72Q!S;DxDzmHz-nyAHX@0 zr}hpOzJ6_V>|F?45|J@664AJVAKpteK54AT8j}%ooMyu3ctJhP%E~W)Lhb;38U=X= zSy{ur!;IIG8X7KDh*^1ERIMj)lY|2@q@tVH(ULZ6o?-L6uh{;o&}1;S)^1;OG|QFW!_WQH+ZJF)R4%g)&}UEM7@Jof(8WY zVn;_uAa7>uqs!y5An~BnuLbk2>@&@Wx>yO}^e|rXq%P=LB15B{L{5!Ua^o5ukp%M% ziGhJ)$k)&{`d{~Owzsc6CN}f2@2J&W&>L-C-8B!p>FI~we7a57)nzokA>nrHFTR$q zMnyF`x2pf79$yjL-5i%T|H%SFGiOf89{xqZ2;xs*Rnl1%E6S;r>_t|=djE_}#E$7C zC*mh6_S{Lz&(${T(LEkpw%h9@HJU}wZ*uNg5F=|Ijz;Z<5?AwC;s}d;Ve79xWM~Z0 z0Xe1u@YW#1FwMntpSAX%=uSO4;rLj|4>x2izH;U5b~{Z?%@hd2jLgjPt*^wkP_s&k z=[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 diff --git a/heatmaps/run=1_numberValidators=256_netDegree=6_chi=4.png b/heatmaps/run=1_numberValidators=256_netDegree=6_chi=4.png deleted file mode 100644 index acd65be6eae02ccab56212fb57948d7843fca57c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22547 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 E1H2TDl>h($ diff --git a/heatmaps/run=1_numberValidators=256_netDegree=6_chi=8.png b/heatmaps/run=1_numberValidators=256_netDegree=6_chi=8.png deleted file mode 100644 index eaab5cd7ff93bb5cd725be02cf4122b1a1c2884a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22417 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

?l>fv?B(G(j+Qv9SO6zj8=M2$ zD*JU(k?}!%1`@50W-Cq|PcC7#c^-uZ*`OiSNA8-x^q@gzaJ8Car{nn@S$DPs8#0lw zn`4w6ly!28= zhEUi+`>w~0YY0z*5?P<1zEd3SAn6PyQoQCANX0Ll*Z!22kDUcPem&o0n%;vftF5LM z_}P8zc&1G&mVTSw58coMwujN8WCnLWOP-w_tEMXpm-NyvoSS^$VW(&t55O9uz++t{ z5$qGjeE;_CXdIkGbfA+PXh4_n6!SBzUvJFu>}Evs)XcY)G~D(hH%i ziileykxn)+*4EZ?cFq-l;->{LWSBOZ;Pf800Ni`Og2O!$xu#+MQb*CnB|q@!8`#

-
-
- -
-
Text2
-
Text3
-
Text4
-
- - - \ No newline at end of file diff --git a/Frontend/script.js b/Frontend/script.js deleted file mode 100644 index 123cf36..0000000 --- a/Frontend/script.js +++ /dev/null @@ -1,33 +0,0 @@ -let section1 = document.querySelector('.sec1'); -let section2 = document.querySelector('.sec2'); -let section3 = document.querySelector('.sec3'); -let section4 = document.querySelector('.sec4'); -let sections = [section1, section2, section3, section4]; - -let icon1 = document.querySelector(".sec1 i"); -let icon2 = document.querySelector(".sec2 i"); -let icon3 = document.querySelector(".sec3 i"); -let icon4 = document.querySelector(".sec4 i"); -let icons = [icon1, icon2, icon3, icon4]; - -let par1 = document.querySelector(".p1"); -let par2 = document.querySelector(".p2"); -let par3 = document.querySelector(".p3"); -let par4 = document.querySelector(".p4"); -let paragraphs = [par1, par2, par3, par4]; - -section1.style.cssText = "background: #eee5fdea; border-top-left-radius: 50%; border-bottom-left-radius: 50%; cursor: pointer; transition: all 0.5s ease-in-out;" -icon1.style.cssText = "opacity: 1; color: #160f25;" - -sections.forEach(section =>{ - section.addEventListener("click", function(){ - sections.forEach(s =>{ - s.style.cssText = "background: none; border-top-left-radius: 0%; border-bottom-left-radius: 0%;" - icons[sections.indexOf(s)].style.cssText = "color: #b9aecf; opacity: 0.7;" - paragraphs[sections.indexOf(s)].style.display = "none"; - }); - section.style.cssText = "background: #eee5fdea; border-top-left-radius: 50%; border-bottom-left-radius: 50%; cursor: pointer; transition: all 0.5s ease-in-out;" - icons[sections.indexOf(section)].style.cssText = "opacity: 1; color: #160f25;" - paragraphs[sections.indexOf(section)].style.display = "block"; - }); -}); \ No newline at end of file From 82ee2b5189876ceaf619aead2c551740ea696d1f Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 28 Feb 2023 09:35:18 +0100 Subject: [PATCH 066/162] simplify dumbRandomScheduler code Signed-off-by: Csaba Kiraly --- DAS/validator.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 6410422..89930f6 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -61,13 +61,6 @@ def sampleLine(line, limit): limit -= 1 return r -class NextToSend: - def __init__(self, neigh, toSend, id, dim): - self.neigh = neigh - self.toSend = toSend - self.id = id - self.dim = dim - class SegmentToSend: def __init__(self, dim, id, i): self.dim = dim @@ -387,10 +380,7 @@ class Validator: cID = random.randrange(0, self.shape.blockSize) if self.block.getSegment(rID, cID) : neigh = random.choice(list(self.rowNeighbors[rID].values())) - if not neigh.sent[cID] and not neigh.received[cID] : - neigh.sent[cID] = 1 - neigh.node.receiveSegment(rID, cID, self.ID) - self.statsTxInSlot += 1 + if self.sendSegmentToNeigh(rID, cID, neigh): t = tries if self.statsTxInSlot >= self.bwUplink: return @@ -399,10 +389,7 @@ class Validator: rID = random.randrange(0, self.shape.blockSize) if self.block.getSegment(rID, cID) : neigh = random.choice(list(self.columnNeighbors[cID].values())) - if not neigh.sent[rID] and not neigh.received[rID] : - neigh.sent[rID] = 1 - neigh.node.receiveSegment(rID, cID, self.ID) - self.statsTxInSlot += 1 + if self.sendSegmentToNeigh(rID, cID, neigh): t = tries t -= 1 if self.statsTxInSlot >= self.bwUplink: From b5368b4e43a737fbdebb7002dc7fd4291888c312 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 28 Feb 2023 12:24:37 +0100 Subject: [PATCH 067/162] factorize restore Signed-off-by: Csaba Kiraly --- DAS/validator.py | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 89930f6..2e1b737 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -437,29 +437,35 @@ class Validator: """It restores the rows assigned to the validator, that can be repaired.""" if self.repairOnTheFly: for id in self.rowIDs: - rep = self.block.repairRow(id) - if (rep.any()): - # If operation is based on send queues, segments should - # be queued after successful repair. - for i in range(len(rep)): - if rep[i]: - self.logger.debug("Rep: %d,%d", id, i, extra=self.format) - self.addToSendQueue(id, i) - # self.statsRepairInSlot += rep.count(1) + self.restoreRow(id) + + def restoreRow(self, id): + rep = self.block.repairRow(id) + if (rep.any()): + # If operation is based on send queues, segments should + # be queued after successful repair. + for i in range(len(rep)): + if rep[i]: + self.logger.debug("Rep: %d,%d", id, i, extra=self.format) + self.addToSendQueue(id, i) + # self.statsRepairInSlot += rep.count(1) def restoreColumns(self): """It restores the columns assigned to the validator, that can be repaired.""" if self.repairOnTheFly: for id in self.columnIDs: - rep = self.block.repairColumn(id) - if (rep.any()): - # If operation is based on send queues, segments should - # be queued after successful repair. - for i in range(len(rep)): - if rep[i]: - self.logger.debug("Rep: %d,%d", i, id, extra=self.format) - self.addToSendQueue(i, id) - # self.statsRepairInSlot += rep.count(1) + self.restoreColumn(id) + + def restoreColumn(self, id): + rep = self.block.repairColumn(id) + if (rep.any()): + # If operation is based on send queues, segments should + # be queued after successful repair. + for i in range(len(rep)): + if rep[i]: + self.logger.debug("Rep: %d,%d", i, id, extra=self.format) + self.addToSendQueue(i, id) + # self.statsRepairInSlot += rep.count(1) def checkStatus(self): """It checks how many expected/arrived samples are for each assigned row/column.""" From 2bf85c41a24eb58c8e1403023f72cdf4b9a77e65 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 1 Mar 2023 09:53:13 +0100 Subject: [PATCH 068/162] factorize send code Signed-off-by: Csaba Kiraly --- DAS/validator.py | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 2e1b737..560d0d1 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -249,35 +249,43 @@ class Validator: self.statsRxInSlot = 0 self.statsTxInSlot = 0 - def sendSegmentToNeigh(self, rID, cID, neigh): + def checkSegmentToNeigh(self, rID, cID, neigh): if (neigh.sent | neigh.received).count(1) >= self.sendLineUntil: return False # sent enough, other side can restore - if neigh.dim == 0: #row - i = cID - else: - i = rID + i = rID if neigh.dim else cID if not neigh.sent[i] and not neigh.received[i] : - neigh.sent[i] = 1 - neigh.node.receiveSegment(rID, cID, self.ID) - self.statsTxInSlot += 1 return True else: return False # received or already sent + def sendSegmentToNeigh(self, rID, cID, neigh): + self.logger.debug("sending %d/%d to %d", rID, cID, neigh.node.ID, extra=self.format) + i = rID if neigh.dim else cID + neigh.sent[i] = 1 + neigh.node.receiveSegment(rID, cID, self.ID) + self.statsTxInSlot += 1 + + def checkSendSegmentToNeigh(self, rID, cID, neigh): + if self.checkSegmentToNeigh(rID, cID, neigh): + self.sendSegmentToNeigh(rID, cID, neigh) + return True + else: + return False + def processSendQueue(self): while self.sendQueue: (rID, cID) = self.sendQueue[0] if rID in self.rowIDs: for _, neigh in shuffledDict(self.rowNeighbors[rID], self.shuffleNeighbors): - self.sendSegmentToNeigh(rID, cID, neigh) + self.checkSendSegmentToNeigh(rID, cID, neigh) if self.statsTxInSlot >= self.bwUplink: return if cID in self.columnIDs: for _, neigh in shuffledDict(self.columnNeighbors[cID], self.shuffleNeighbors): - self.sendSegmentToNeigh(rID, cID, neigh) + self.checkSendSegmentToNeigh(rID, cID, neigh) if self.statsTxInSlot >= self.bwUplink: return @@ -303,9 +311,9 @@ class Validator: for dim, lineID, neigh in shuffled(queues, self.shuffleQueues): if dim == 0: - self.sendSegmentToNeigh(lineID, neigh.sendQueue.popleft(), neigh) + self.checkSendSegmentToNeigh(lineID, neigh.sendQueue.popleft(), neigh) else: - self.sendSegmentToNeigh(neigh.sendQueue.popleft(), lineID, neigh) + self.checkSendSegmentToNeigh(neigh.sendQueue.popleft(), lineID, neigh) progress = True if self.statsTxInSlot >= self.bwUplink: return @@ -322,13 +330,13 @@ class Validator: if s.dim == 0: for _, neigh in shuffledDict(self.rowNeighbors[s.id], self.shuffleNeighbors): self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) - if self.sendSegmentToNeigh(s.id, s.i, neigh): + if self.checkSendSegmentToNeigh(s.id, s.i, neigh): self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) break else: for _, neigh in shuffledDict(self.columnNeighbors[s.id], self.shuffleNeighbors): self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) - if self.sendSegmentToNeigh(s.i, s.id, neigh): + if self.checkSendSegmentToNeigh(s.i, s.id, neigh): self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) break @@ -380,7 +388,7 @@ class Validator: cID = random.randrange(0, self.shape.blockSize) if self.block.getSegment(rID, cID) : neigh = random.choice(list(self.rowNeighbors[rID].values())) - if self.sendSegmentToNeigh(rID, cID, neigh): + if self.checkSendSegmentToNeigh(rID, cID, neigh): t = tries if self.statsTxInSlot >= self.bwUplink: return @@ -389,7 +397,7 @@ class Validator: rID = random.randrange(0, self.shape.blockSize) if self.block.getSegment(rID, cID) : neigh = random.choice(list(self.columnNeighbors[cID].values())) - if self.sendSegmentToNeigh(rID, cID, neigh): + if self.checkSendSegmentToNeigh(rID, cID, neigh): t = tries t -= 1 if self.statsTxInSlot >= self.bwUplink: From 3095e440c678ff7226fec3380649437a491c048a Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 1 Mar 2023 10:41:47 +0100 Subject: [PATCH 069/162] factorize segmentShuffleScheduler code Signed-off-by: Csaba Kiraly --- DAS/validator.py | 80 +++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 560d0d1..33b9cf9 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -61,12 +61,6 @@ def sampleLine(line, limit): limit -= 1 return r -class SegmentToSend: - def __init__(self, dim, id, i): - self.dim = dim - self.id = id - self.i = i - class Neighbor: """This class implements a node neighbor to monitor sent and received data.""" @@ -319,35 +313,13 @@ class Validator: return def runSegmentShuffleScheduler(self): - # This scheduler check which owned segments needs sending (at least - # one neighbor needing it). Then it sends each segment that's worth sending - # once, in shuffled order. This is repeated until bw limit. - while True: - if hasattr(self, 'segmentShuffleGen') and self.segmentShuffleGen is not None: - #self.logger.debug("TX:%d queue:%d", self.statsTxInSlot, len(self.segmentsToSend), extra=self.format) - for s in self.segmentShuffleGen: - self.logger.debug("%d:%d/%d", s.dim, s.id, s.i, extra=self.format) - if s.dim == 0: - for _, neigh in shuffledDict(self.rowNeighbors[s.id], self.shuffleNeighbors): - self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) - if self.checkSendSegmentToNeigh(s.id, s.i, neigh): - self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) - break - else: - for _, neigh in shuffledDict(self.columnNeighbors[s.id], self.shuffleNeighbors): - self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) - if self.checkSendSegmentToNeigh(s.i, s.id, neigh): - self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) - break + # This scheduler check which owned segments needs sending (at least + # one neighbor needing it). Then it sends each segment that's worth sending + # once, in shuffled order. This is repeated until bw limit. - if self.statsTxInSlot >= self.bwUplink: - if not self.segmentShuffleSchedulerPersist: - # remove scheduler state before leaving - self.segmentsToSend = [] - self.segmentShuffleGen = None - return - - self.segmentsToSend = [] + def collectSegmentsToSend(): + # yields list of segments to send as (dim, lineID, id) + segmentsToSend = [] for rID, neighs in self.rowNeighbors.items(): line = self.getRow(rID) needed = zeros(self.shape.blockSize) @@ -359,7 +331,7 @@ class Validator: if (needed).any(): for i in range(len(needed)): if needed[i]: - self.segmentsToSend.append(SegmentToSend(0, rID, i)) + segmentsToSend.append((0, rID, i)) for cID, neighs in self.columnNeighbors.items(): line = self.getColumn(cID) @@ -372,12 +344,44 @@ class Validator: if (needed).any(): for i in range(len(needed)): if needed[i]: - self.segmentsToSend.append(SegmentToSend(1, cID, i)) + segmentsToSend.append((1, cID, i)) - if not self.segmentsToSend: + return segmentsToSend + + def nextSegment(): + while True: + # send each collected segment once + if hasattr(self, 'segmentShuffleGen') and self.segmentShuffleGen is not None: + for dim, lineID, id in self.segmentShuffleGen: + if dim == 0: + for _, neigh in shuffledDict(self.rowNeighbors[lineID], self.shuffleNeighbors): + if self.checkSegmentToNeigh(lineID, id, neigh): + yield((lineID, id, neigh)) + break + else: + for _, neigh in shuffledDict(self.columnNeighbors[lineID], self.shuffleNeighbors): + if self.checkSegmentToNeigh(id, lineID, neigh): + yield((id, lineID, neigh)) + break + + # collect segments for next round + segmentsToSend = collectSegmentsToSend() + + # finish if empty or set up shuffled generator based on collected segments + if not segmentsToSend: break else: - self.segmentShuffleGen = shuffled(self.segmentsToSend, self.shuffleLines) + self.segmentShuffleGen = shuffled(segmentsToSend, self.shuffleLines) + + for rid, cid, neigh in nextSegment(): + # segments are checked just before yield, so we can send directly + self.sendSegmentToNeigh(rid, cid, neigh) + + if self.statsTxInSlot >= self.bwUplink: + if not self.segmentShuffleSchedulerPersist: + # remove scheduler state before leaving + self.segmentShuffleGen = None + return def runDumbRandomScheduler(self, tries = 100): # dumb random scheduler picking segments at random and trying to send it From e611b5143c231d6a3d24686caede0fa043ddd76a Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 1 Mar 2023 10:55:04 +0100 Subject: [PATCH 070/162] refactor dumbRandomScheduler Signed-off-by: Csaba Kiraly --- DAS/validator.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 33b9cf9..02bf738 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -384,7 +384,9 @@ class Validator: return def runDumbRandomScheduler(self, tries = 100): - # dumb random scheduler picking segments at random and trying to send it + # dumb random scheduler picking segments at random and trying to send it + + def nextSegment(): t = tries while t: if self.rowIDs: @@ -392,21 +394,25 @@ class Validator: cID = random.randrange(0, self.shape.blockSize) if self.block.getSegment(rID, cID) : neigh = random.choice(list(self.rowNeighbors[rID].values())) - if self.checkSendSegmentToNeigh(rID, cID, neigh): + if self.checkSegmentToNeigh(rID, cID, neigh): + yield(rID, cID, neigh) t = tries - if self.statsTxInSlot >= self.bwUplink: - return if self.columnIDs: cID = random.choice(self.columnIDs) rID = random.randrange(0, self.shape.blockSize) if self.block.getSegment(rID, cID) : neigh = random.choice(list(self.columnNeighbors[cID].values())) - if self.checkSendSegmentToNeigh(rID, cID, neigh): + if self.checkSegmentToNeigh(rID, cID, neigh): + yield(rID, cID, neigh) t = tries t -= 1 - if self.statsTxInSlot >= self.bwUplink: - return - return + + for rid, cid, neigh in nextSegment(): + # segments are checked just before yield, so we can send directly + self.sendSegmentToNeigh(rid, cid, neigh) + + if self.statsTxInSlot >= self.bwUplink: + return def send(self): """ Send as much as we can in the timeslot, limited by bwUplink From 68fdaf3572729b41b5d548a1cf9e72d3a4f400e2 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 1 Mar 2023 22:21:31 +0100 Subject: [PATCH 071/162] add method descriptions Signed-off-by: Csaba Kiraly --- DAS/block.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DAS/block.py b/DAS/block.py index 228e743..10ff30d 100644 --- a/DAS/block.py +++ b/DAS/block.py @@ -21,10 +21,12 @@ class Block: self.data |= merged.data def getSegment(self, rowID, columnID): + """Check whether a segment is included""" return self.data[rowID*self.blockSize + columnID] - def setSegment(self, rowID, columnID, v = 1): - self.data[rowID*self.blockSize + columnID] = v + def setSegment(self, rowID, columnID, value = 1): + """Set value for a segment (default 1)""" + self.data[rowID*self.blockSize + columnID] = value def getColumn(self, columnID): """It returns the block column corresponding to columnID.""" From 66a9d66dc6ee6c63973814fa84437b2ffe140a49 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 1 Mar 2023 22:34:16 +0100 Subject: [PATCH 072/162] moving helper functions to tools.py Signed-off-by: Csaba Kiraly --- DAS/tools.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++- DAS/validator.py | 54 +----------------------------------------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/DAS/tools.py b/DAS/tools.py index fb40c71..6852a9d 100644 --- a/DAS/tools.py +++ b/DAS/tools.py @@ -1,7 +1,9 @@ #!/bin/python3 import logging - +import sys +import random +from bitarray.util import zeros class CustomFormatter(): """This class defines the terminal output formatting.""" @@ -28,3 +30,53 @@ class CustomFormatter(): formatter = logging.Formatter(log_fmt) return formatter.format(record) +def shuffled(lis, shuffle=True): + ''' Generator yielding list in shuffled order + ''' + # based on https://stackoverflow.com/a/60342323 + if shuffle: + for index in random.sample(range(len(lis)), len(lis)): + yield lis[index] + else: + for v in lis: + yield v +def shuffledDict(d, shuffle=True): + ''' Generator yielding dictionary in shuffled order + + Shuffle, except if not (optional parameter useful for experiment setup) + ''' + if shuffle: + lis = list(d.items()) + for index in random.sample(range(len(d)), len(d)): + yield lis[index] + else: + for kv in d.items(): + yield kv + +def sampleLine(line, limit): + """ sample up to 'limit' bits from a bitarray + + Since this is quite expensive, we use a number of heuristics to get it fast. + """ + if limit == sys.maxsize : + return line + else: + w = line.count(1) + if limit >= w : + return line + else: + l = len(line) + r = zeros(l) + if w < l/10 or limit > l/2 : + indices = [ i for i in range(l) if line[i] ] + sample = random.sample(indices, limit) + for i in sample: + r[i] = 1 + return r + else: + while limit: + i = random.randrange(0, l) + if line[i] and not r[i]: + r[i] = 1 + limit -= 1 + return r diff --git a/DAS/validator.py b/DAS/validator.py index 02bf738..5fa6aee 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -3,64 +3,12 @@ import random import collections import logging -import sys from DAS.block import * -from bitarray import bitarray +from DAS.tools import shuffled, shuffledDict from bitarray.util import zeros from collections import deque from itertools import chain -def shuffled(lis, shuffle=True): - ''' Generator yielding list in shuffled order - ''' - # based on https://stackoverflow.com/a/60342323 - if shuffle: - for index in random.sample(range(len(lis)), len(lis)): - yield lis[index] - else: - for v in lis: - yield v -def shuffledDict(d, shuffle=True): - ''' Generator yielding dictionary in shuffled order - - Shuffle, except if not (optional parameter useful for experiment setup) - ''' - if shuffle: - lis = list(d.items()) - for index in random.sample(range(len(d)), len(d)): - yield lis[index] - else: - for kv in d.items(): - yield kv - -def sampleLine(line, limit): - """ sample up to 'limit' bits from a bitarray - - Since this is quite expensive, we use a number of heuristics to get it fast. - """ - if limit == sys.maxsize : - return line - else: - w = line.count(1) - if limit >= w : - return line - else: - l = len(line) - r = zeros(l) - if w < l/10 or limit > l/2 : - indices = [ i for i in range(l) if line[i] ] - sample = random.sample(indices, limit) - for i in sample: - r[i] = 1 - return r - else: - while limit: - i = random.randrange(0, l) - if line[i] and not r[i]: - r[i] = 1 - limit -= 1 - return r - class Neighbor: """This class implements a node neighbor to monitor sent and received data.""" From daee84b9ea00c41d5c9e33097afd50b850028f3b Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 1 Mar 2023 23:59:35 +0100 Subject: [PATCH 073/162] add more function docustrings Signed-off-by: Csaba Kiraly --- DAS/validator.py | 49 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 5fa6aee..72f2610 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -10,7 +10,12 @@ from collections import deque from itertools import chain class Neighbor: - """This class implements a node neighbor to monitor sent and received data.""" + """This class implements a node neighbor to monitor sent and received data. + + It represents one side of a P2P link in the overlay. Sent and received + segments are monitored to avoid sending twice or sending back what was + received from a link. + """ def __repr__(self): """It returns the amount of sent and received data.""" @@ -132,6 +137,7 @@ class Validator: return self.block.getRow(index) def receiveSegment(self, rID, cID, src): + """Receive a segment, register it, and queue for forwarding as needed""" # register receive so that we are not sending back if rID in self.rowIDs: if src in self.rowNeighbors[rID]: @@ -150,6 +156,7 @@ class Validator: self.statsRxInSlot += 1 def addToSendQueue(self, rID, cID): + """Queue a segment for forwarding""" if self.perNodeQueue: self.sendQueue.append((rID, cID)) @@ -163,7 +170,7 @@ class Validator: neigh.sendQueue.append(rID) def receiveRowsColumns(self): - """It receives rows and columns.""" + """Finalize time step by merging newly received segments in state""" if self.amIproposer == 1: self.logger.error("I am a block proposer", extra=self.format) else: @@ -192,6 +199,7 @@ class Validator: self.statsTxInSlot = 0 def checkSegmentToNeigh(self, rID, cID, neigh): + """Check if a segment should be sent to a neighbor""" if (neigh.sent | neigh.received).count(1) >= self.sendLineUntil: return False # sent enough, other side can restore i = rID if neigh.dim else cID @@ -201,6 +209,7 @@ class Validator: return False # received or already sent def sendSegmentToNeigh(self, rID, cID, neigh): + """Send segment to a neighbor (without checks)""" self.logger.debug("sending %d/%d to %d", rID, cID, neigh.node.ID, extra=self.format) i = rID if neigh.dim else cID neigh.sent[i] = 1 @@ -208,6 +217,7 @@ class Validator: self.statsTxInSlot += 1 def checkSendSegmentToNeigh(self, rID, cID, neigh): + """Check and send a segment to a neighbor if needed""" if self.checkSegmentToNeigh(rID, cID, neigh): self.sendSegmentToNeigh(rID, cID, neigh) return True @@ -215,6 +225,11 @@ class Validator: return False def processSendQueue(self): + """Send out segments from queue until bandwidth limit reached + + SendQueue is a centralized queue from which segments are sent out + in FIFO order to all interested neighbors. + """ while self.sendQueue: (rID, cID) = self.sendQueue[0] @@ -235,6 +250,15 @@ class Validator: self.sendQueue.popleft() def processPerNeighborSendQueue(self): + """Send out segments from per-neighbor queues until bandwidth limit reached + + Segments are dispatched from per-neighbor transmission queues in a shuffled + round-robin order, emulating a type of fair queuing. Since neighborhood is + handled at the topic (column or row) level, fair queuing is also at the level + of flows per topic and per peer. A per-peer model might be closer to the + reality of libp2p implementations where topics between two nodes are + multiplexed over the same transport. + """ progress = True while (progress): progress = False @@ -261,9 +285,12 @@ class Validator: return def runSegmentShuffleScheduler(self): - # This scheduler check which owned segments needs sending (at least - # one neighbor needing it). Then it sends each segment that's worth sending - # once, in shuffled order. This is repeated until bw limit. + """ Schedule chunks for sending + + This scheduler check which owned segments needs sending (at least + one neighbor needing it). Then it sends each segment that's worth sending + once, in shuffled order. This is repeated until bw limit. + """ def collectSegmentsToSend(): # yields list of segments to send as (dim, lineID, id) @@ -332,7 +359,13 @@ class Validator: return def runDumbRandomScheduler(self, tries = 100): - # dumb random scheduler picking segments at random and trying to send it + """Random scheduler picking segments at random + + This scheduler implements a simple random scheduling order picking + segments at random and peers potentially interested in that segment + also at random. + It server more as a performance baseline than as a realistic model. + """ def nextSegment(): t = tries @@ -363,7 +396,7 @@ class Validator: return def send(self): - """ Send as much as we can in the timeslot, limited by bwUplink + """ Send as much as we can in the timestep, limited by bwUplink """ # process node level send queue @@ -406,6 +439,7 @@ class Validator: self.restoreRow(id) def restoreRow(self, id): + """Restore a given row if repairable.""" rep = self.block.repairRow(id) if (rep.any()): # If operation is based on send queues, segments should @@ -423,6 +457,7 @@ class Validator: self.restoreColumn(id) def restoreColumn(self, id): + """Restore a given column if repairable.""" rep = self.block.repairColumn(id) if (rep.any()): # If operation is based on send queues, segments should From b4348b0005488c4dd04223b3f2b463086cc7ff67 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Fri, 3 Mar 2023 11:47:27 +0100 Subject: [PATCH 074/162] Cosmetic changes for documentation --- DAS/block.py | 2 +- DAS/tools.py | 13 ++++++------- DAS/validator.py | 41 ++++++++++++++++++++--------------------- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/DAS/block.py b/DAS/block.py index 10ff30d..f76a944 100644 --- a/DAS/block.py +++ b/DAS/block.py @@ -59,7 +59,7 @@ class Block: def repairRow(self, id): """It repairs the entire row if it has at least blockSize/2 ones. - Returns: list of repaired segments + Returns: list of repaired segments. """ line = self.data[id*self.blockSize:(id+1)*self.blockSize] success = line.count(1) diff --git a/DAS/tools.py b/DAS/tools.py index 6852a9d..cd26850 100644 --- a/DAS/tools.py +++ b/DAS/tools.py @@ -31,8 +31,7 @@ class CustomFormatter(): return formatter.format(record) def shuffled(lis, shuffle=True): - ''' Generator yielding list in shuffled order - ''' + """Generator yielding list in shuffled order.""" # based on https://stackoverflow.com/a/60342323 if shuffle: for index in random.sample(range(len(lis)), len(lis)): @@ -41,10 +40,10 @@ def shuffled(lis, shuffle=True): for v in lis: yield v def shuffledDict(d, shuffle=True): - ''' Generator yielding dictionary in shuffled order + """Generator yielding dictionary in shuffled order. - Shuffle, except if not (optional parameter useful for experiment setup) - ''' + Shuffle, except if not (optional parameter useful for experiment setup). + """ if shuffle: lis = list(d.items()) for index in random.sample(range(len(d)), len(d)): @@ -54,9 +53,9 @@ def shuffledDict(d, shuffle=True): yield kv def sampleLine(line, limit): - """ sample up to 'limit' bits from a bitarray + """Sample up to 'limit' bits from a bitarray. - Since this is quite expensive, we use a number of heuristics to get it fast. + Since this is quite expensive, we use a number of heuristics to get it fast. """ if limit == sys.maxsize : return line diff --git a/DAS/validator.py b/DAS/validator.py index 72f2610..7b52e58 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -14,7 +14,7 @@ class Neighbor: It represents one side of a P2P link in the overlay. Sent and received segments are monitored to avoid sending twice or sending back what was - received from a link. + received from a link. """ def __repr__(self): @@ -137,7 +137,7 @@ class Validator: return self.block.getRow(index) def receiveSegment(self, rID, cID, src): - """Receive a segment, register it, and queue for forwarding as needed""" + """Receive a segment, register it, and queue for forwarding as needed.""" # register receive so that we are not sending back if rID in self.rowIDs: if src in self.rowNeighbors[rID]: @@ -156,7 +156,7 @@ class Validator: self.statsRxInSlot += 1 def addToSendQueue(self, rID, cID): - """Queue a segment for forwarding""" + """Queue a segment for forwarding.""" if self.perNodeQueue: self.sendQueue.append((rID, cID)) @@ -170,7 +170,7 @@ class Validator: neigh.sendQueue.append(rID) def receiveRowsColumns(self): - """Finalize time step by merging newly received segments in state""" + """Finalize time step by merging newly received segments in state.""" if self.amIproposer == 1: self.logger.error("I am a block proposer", extra=self.format) else: @@ -199,7 +199,7 @@ class Validator: self.statsTxInSlot = 0 def checkSegmentToNeigh(self, rID, cID, neigh): - """Check if a segment should be sent to a neighbor""" + """Check if a segment should be sent to a neighbor.""" if (neigh.sent | neigh.received).count(1) >= self.sendLineUntil: return False # sent enough, other side can restore i = rID if neigh.dim else cID @@ -209,7 +209,7 @@ class Validator: return False # received or already sent def sendSegmentToNeigh(self, rID, cID, neigh): - """Send segment to a neighbor (without checks)""" + """Send segment to a neighbor (without checks).""" self.logger.debug("sending %d/%d to %d", rID, cID, neigh.node.ID, extra=self.format) i = rID if neigh.dim else cID neigh.sent[i] = 1 @@ -217,7 +217,7 @@ class Validator: self.statsTxInSlot += 1 def checkSendSegmentToNeigh(self, rID, cID, neigh): - """Check and send a segment to a neighbor if needed""" + """Check and send a segment to a neighbor if needed.""" if self.checkSegmentToNeigh(rID, cID, neigh): self.sendSegmentToNeigh(rID, cID, neigh) return True @@ -225,10 +225,10 @@ class Validator: return False def processSendQueue(self): - """Send out segments from queue until bandwidth limit reached - + """Send out segments from queue until bandwidth limit reached. + SendQueue is a centralized queue from which segments are sent out - in FIFO order to all interested neighbors. + in FIFO order to all interested neighbors. """ while self.sendQueue: (rID, cID) = self.sendQueue[0] @@ -250,13 +250,13 @@ class Validator: self.sendQueue.popleft() def processPerNeighborSendQueue(self): - """Send out segments from per-neighbor queues until bandwidth limit reached - + """Send out segments from per-neighbor queues until bandwidth limit reached. + Segments are dispatched from per-neighbor transmission queues in a shuffled round-robin order, emulating a type of fair queuing. Since neighborhood is handled at the topic (column or row) level, fair queuing is also at the level of flows per topic and per peer. A per-peer model might be closer to the - reality of libp2p implementations where topics between two nodes are + reality of libp2p implementations where topics between two nodes are multiplexed over the same transport. """ progress = True @@ -285,8 +285,8 @@ class Validator: return def runSegmentShuffleScheduler(self): - """ Schedule chunks for sending - + """ Schedule chunks for sending. + This scheduler check which owned segments needs sending (at least one neighbor needing it). Then it sends each segment that's worth sending once, in shuffled order. This is repeated until bw limit. @@ -359,12 +359,12 @@ class Validator: return def runDumbRandomScheduler(self, tries = 100): - """Random scheduler picking segments at random - - This scheduler implements a simple random scheduling order picking + """Random scheduler picking segments at random. + + This scheduler implements a simple random scheduling order picking segments at random and peers potentially interested in that segment also at random. - It server more as a performance baseline than as a realistic model. + It serves more as a performance baseline than as a realistic model. """ def nextSegment(): @@ -396,8 +396,7 @@ class Validator: return def send(self): - """ Send as much as we can in the timestep, limited by bwUplink - """ + """ Send as much as we can in the timestep, limited by bwUplink.""" # process node level send queue self.processSendQueue() From 4a4f02427c640dcdcaea046736d0161280ecb7d3 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 24 Feb 2023 19:08:41 +0100 Subject: [PATCH 075/162] change config language to simple (or complex) code Signed-off-by: Csaba Kiraly --- config_example.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++ study.py | 32 +++++++++++----------------- 2 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 config_example.py 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..20c1475 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,7 @@ def study(): print("You need to pass a configuration file in parameter") exit(1) - config = Configuration(sys.argv[1]) + config = importlib.import_module(sys.argv[1]) shape = Shape(0, 0, 0, 0, 0, 0) sim = Simulator(shape, config) sim.initLogger() @@ -22,26 +23,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) From 84e5482a6d99fe133ab3b663b74fcc7826ea2321 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 2 Mar 2023 01:01:52 +0100 Subject: [PATCH 076/162] improve config filename error handling Signed-off-by: Csaba Kiraly --- study.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/study.py b/study.py index 20c1475..52433c5 100644 --- a/study.py +++ b/study.py @@ -10,7 +10,16 @@ def study(): print("You need to pass a configuration file in parameter") exit(1) - config = importlib.import_module(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() From 0a5afd97de348c4e069f112da717c1feb8a6cd02 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 7 Mar 2023 12:10:36 +0100 Subject: [PATCH 077/162] remove old config files Signed-off-by: Csaba Kiraly --- DAS/__init__.py | 1 - DAS/configuration.py | 85 -------------------------------------------- config.ini | 30 ---------------- 3 files changed, 116 deletions(-) delete mode 100644 DAS/configuration.py delete mode 100644 config.ini 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 From 0b6cfad9675d3e2b12d1b379f750610ab6a61d74 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 3 Mar 2023 11:02:07 +0100 Subject: [PATCH 078/162] factorize study code Signed-off-by: Csaba Kiraly --- study.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/study.py b/study.py index 52433c5..2823fa1 100644 --- a/study.py +++ b/study.py @@ -4,6 +4,16 @@ import time, sys, random, copy import importlib from DAS import * +def runOnce(sim, config, shape): + if not config.deterministic: + random.seed(datetime.now()) + + 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) + return result def study(): if len(sys.argv) < 2: @@ -24,7 +34,6 @@ def study(): sim = Simulator(shape, config) sim.initLogger() results = [] - simCnt = 0 now = datetime.now() execID = now.strftime("%Y-%m-%d_%H-%M-%S_")+str(random.randint(100,999)) @@ -33,19 +42,11 @@ def study(): start = time.time() for shape in config.nextShape(): - if not config.deterministic: - random.seed(datetime.now()) - - 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) + result = runOnce(sim, config, shape) 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) + sim.logger.info("A total of %d simulations ran in %d seconds" % (len(results), end-start), extra=sim.format) if config.dumpXML: for res in results: From f5ffb0a07b0ac0bece35e0b701ae7a5f9e851a68 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 3 Mar 2023 11:15:55 +0100 Subject: [PATCH 079/162] use joblib to run in parallel Signed-off-by: Csaba Kiraly --- study.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/study.py b/study.py index 2823fa1..4cd4b53 100644 --- a/study.py +++ b/study.py @@ -2,8 +2,13 @@ import time, sys, random, copy import importlib +from joblib import Parallel, delayed from DAS import * +# Parallel execution: +# The code currently uses 'joblib' to execute on multiple cores. For other options such as 'ray', see +# https://stackoverflow.com/questions/9786102/how-do-i-parallelize-a-simple-python-loop + def runOnce(sim, config, shape): if not config.deterministic: random.seed(datetime.now()) @@ -41,9 +46,7 @@ def study(): sim.logger.info("Starting simulations:", extra=sim.format) start = time.time() - for shape in config.nextShape(): - result = runOnce(sim, config, shape) - results.append(copy.deepcopy(result)) + results = Parallel(-1)(delayed(runOnce)(sim, config, shape) for shape in config.nextShape()) end = time.time() sim.logger.info("A total of %d simulations ran in %d seconds" % (len(results), end-start), extra=sim.format) From 16b670e9165d824dd0c3ac970585957d6a53bfff Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 3 Mar 2023 11:26:00 +0100 Subject: [PATCH 080/162] fix issues with logging in parallel execution For fixing logging issues see https://stackoverflow.com/questions/58026381/logging-nested-functions-using-joblib-parallel-and-delayed-calls and https://github.com/joblib/joblib/issues/1017 Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 11 ++++++----- study.py | 4 ++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index dbd1b37..8b79e2c 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -104,11 +104,12 @@ class Simulator: def initLogger(self): """It initializes the logger.""" logger = logging.getLogger("DAS") - logger.setLevel(self.logLevel) - ch = logging.StreamHandler() - ch.setLevel(self.logLevel) - ch.setFormatter(CustomFormatter()) - logger.addHandler(ch) + if len(logger.handlers) == 0: + logger.setLevel(self.logLevel) + ch = logging.StreamHandler() + ch.setLevel(self.logLevel) + ch.setFormatter(CustomFormatter()) + logger.addHandler(ch) self.logger = logger diff --git a/study.py b/study.py index 4cd4b53..914acfe 100644 --- a/study.py +++ b/study.py @@ -8,11 +8,15 @@ from DAS import * # Parallel execution: # The code currently uses 'joblib' to execute on multiple cores. For other options such as 'ray', see # https://stackoverflow.com/questions/9786102/how-do-i-parallelize-a-simple-python-loop +# For fixing logging issues in parallel execution, see +# https://stackoverflow.com/questions/58026381/logging-nested-functions-using-joblib-parallel-and-delayed-calls +# and https://github.com/joblib/joblib/issues/1017 def runOnce(sim, config, shape): if not config.deterministic: random.seed(datetime.now()) + sim.initLogger() sim.resetShape(shape) sim.initValidators() sim.initNetwork() From 567d13e37083ba7bc7f8ebf4c64ffb2cbff1d1cb Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 13 Mar 2023 14:22:14 +0100 Subject: [PATCH 081/162] add numJobs parameter to config Signed-off-by: Csaba Kiraly --- config_example.py | 4 ++++ study.py | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/config_example.py b/config_example.py index 0ac65ad..c2f7fcf 100644 --- a/config_example.py +++ b/config_example.py @@ -20,6 +20,10 @@ dumpXML = 1 visualization = 1 logLevel = logging.INFO +# number of parallel workers. -1: all cores; 1: sequential +# for more details, see joblib.Parallel +numJobs = 3 + # Number of simulation runs with the same parameters for statistical relevance runs = range(10) diff --git a/study.py b/study.py index 914acfe..f557fc2 100644 --- a/study.py +++ b/study.py @@ -50,7 +50,8 @@ def study(): sim.logger.info("Starting simulations:", extra=sim.format) start = time.time() - results = Parallel(-1)(delayed(runOnce)(sim, config, shape) for shape in config.nextShape()) + results = Parallel(config.numJobs)(delayed(runOnce)(sim, config, shape) for shape in config.nextShape()) + end = time.time() sim.logger.info("A total of %d simulations ran in %d seconds" % (len(results), end-start), extra=sim.format) From ba94cc8da116c327a7b28049f86bd04fd15c75ed Mon Sep 17 00:00:00 2001 From: leobago Date: Tue, 14 Mar 2023 08:26:37 +0100 Subject: [PATCH 082/162] Update requirements --- DAS/requirements.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/DAS/requirements.txt b/DAS/requirements.txt index d0bb457..da7dcc7 100644 --- a/DAS/requirements.txt +++ b/DAS/requirements.txt @@ -1,3 +1,7 @@ bitarray==2.6.0 -DAS==0.28.7 +DAS==0.29.0 +dicttoxml==1.7.16 +matplotlib==3.6.2 networkx==3.0 +numpy==1.23.5 +seaborn==0.12.2 From 377072ef7951c1d0a064869a247871a767af1801 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Tue, 14 Mar 2023 11:07:59 +0100 Subject: [PATCH 083/162] Fix deterministic feature --- study.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/study.py b/study.py index 52433c5..67dac5f 100644 --- a/study.py +++ b/study.py @@ -33,8 +33,11 @@ def study(): start = time.time() for shape in config.nextShape(): - if not config.deterministic: - random.seed(datetime.now()) + if config.deterministic: + random.seed("DASsimulator") + else: + random.seed(random.randint(0, 100)) + sim.resetShape(shape) sim.initValidators() From 45bdcc3308dc41bf1b944788f4d8821a4e63929d Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Tue, 14 Mar 2023 11:25:17 +0100 Subject: [PATCH 084/162] Seed by microseconds. Determinisme checked. --- study.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/study.py b/study.py index 67dac5f..e87b12f 100644 --- a/study.py +++ b/study.py @@ -27,17 +27,16 @@ def study(): simCnt = 0 now = datetime.now() + if config.deterministic: + random.seed("DASsimulator") + else: + random.seed(str(now).split(".")[1]) execID = now.strftime("%Y-%m-%d_%H-%M-%S_")+str(random.randint(100,999)) sim.logger.info("Starting simulations:", extra=sim.format) start = time.time() for shape in config.nextShape(): - if config.deterministic: - random.seed("DASsimulator") - else: - random.seed(random.randint(0, 100)) - sim.resetShape(shape) sim.initValidators() From 833ae76097f8bd2655124d28baab51bb14df86f7 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 15 Mar 2023 12:37:23 +0100 Subject: [PATCH 085/162] add shape repr --- DAS/shape.py | 11 ++++++++++- study.py | 35 +++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/DAS/shape.py b/DAS/shape.py index 2f99ebf..a27b6ca 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -12,6 +12,15 @@ class Shape: self.netDegree = netDegree self.chi = chi - + def __repr__(self): + """Returns a printable representation of the shape""" + shastr = "" + shastr += "bs-"+str(self.blockSize) + shastr += "-nbv-"+str(self.numberValidators) + shastr += "-fr-"+str(self.failureRate) + shastr += "-chi-"+str(self.chi) + shastr += "-nd-"+str(self.netDegree) + shastr += "-r-"+str(self.run) + return repr(shastr) diff --git a/study.py b/study.py index e87b12f..6d223b8 100644 --- a/study.py +++ b/study.py @@ -2,8 +2,27 @@ import time, sys, random, copy import importlib +from joblib import Parallel, delayed from DAS import * +# Parallel execution: +# The code currently uses 'joblib' to execute on multiple cores. For other options such as 'ray', see +# https://stackoverflow.com/questions/9786102/how-do-i-parallelize-a-simple-python-loop +# For fixing logging issues in parallel execution, see +# https://stackoverflow.com/questions/58026381/logging-nested-functions-using-joblib-parallel-and-delayed-calls +# and https://github.com/joblib/joblib/issues/1017 + +def runOnce(sim, config, shape): + if config.deterministic: + random.seed(repr(shape)) + + sim.initLogger() + 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) + return result def study(): if len(sys.argv) < 2: @@ -24,30 +43,18 @@ def study(): sim = Simulator(shape, config) sim.initLogger() results = [] - simCnt = 0 now = datetime.now() - if config.deterministic: - random.seed("DASsimulator") - else: - random.seed(str(now).split(".")[1]) execID = now.strftime("%Y-%m-%d_%H-%M-%S_")+str(random.randint(100,999)) sim.logger.info("Starting simulations:", extra=sim.format) start = time.time() - for shape in config.nextShape(): + results = Parallel(config.numJobs)(delayed(runOnce)(sim, config, shape) for shape in config.nextShape()) - 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) + sim.logger.info("A total of %d simulations ran in %d seconds" % (len(results), end-start), extra=sim.format) if config.dumpXML: for res in results: From 0a92ef70713f6c7b7b97c3c1244308a2e7b76b09 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 15 Mar 2023 13:18:02 +0100 Subject: [PATCH 086/162] Adding and logging random seed in the shape for each simulation --- DAS/results.py | 7 +------ DAS/shape.py | 6 +++++- config_example.py | 6 +++++- study.py | 9 +++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/DAS/results.py b/DAS/results.py index e20cdec..0efe26d 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -39,11 +39,6 @@ class Result: resXml = dicttoxml(resd1) xmlstr = minidom.parseString(resXml) xmlPretty = xmlstr.toprettyxml() - filePath = "results/"+execID+"/nbv-"+str(self.shape.numberValidators)+\ - "-bs-"+str(self.shape.blockSize)+\ - "-nd-"+str(self.shape.netDegree)+\ - "-fr-"+str(self.shape.failureRate)+\ - "-chi-"+str(self.shape.chi)+\ - "-r-"+str(self.shape.run)+".xml" + filePath = "results/"+execID+"/"+str(self.shape)+".xml" with open(filePath, "w") as f: f.write(xmlPretty) diff --git a/DAS/shape.py b/DAS/shape.py index a27b6ca..1dd19b2 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -11,6 +11,7 @@ class Shape: self.failureRate = failureRate self.netDegree = netDegree self.chi = chi + self.randomSeed = "" def __repr__(self): """Returns a printable representation of the shape""" @@ -21,6 +22,9 @@ class Shape: shastr += "-chi-"+str(self.chi) shastr += "-nd-"+str(self.netDegree) shastr += "-r-"+str(self.run) - return repr(shastr) + return shastr + def setSeed(self, seed): + """Adds the random seed to the shape""" + self.randomSeed = seed diff --git a/config_example.py b/config_example.py index 0ac65ad..1a4db01 100644 --- a/config_example.py +++ b/config_example.py @@ -35,11 +35,15 @@ 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 +# Number of rows and columns a validator is interested in chis = range(4, 9, 2) +# Set to True if you want your run to be deterministic, False if not deterministic = False +# If your run is deterministic you can decide the random seed. This is ignore otherwise. +randomSeed = "DAS" + def nextShape(): for run in runs: for fr in failureRates: diff --git a/study.py b/study.py index 6d223b8..e24fb46 100644 --- a/study.py +++ b/study.py @@ -14,7 +14,8 @@ from DAS import * def runOnce(sim, config, shape): if config.deterministic: - random.seed(repr(shape)) + shape.setSeed(config.randomSeed+"-"+str(shape)) + random.seed(shape.randomSeed) sim.initLogger() sim.resetShape(shape) @@ -49,10 +50,7 @@ def study(): sim.logger.info("Starting simulations:", extra=sim.format) start = time.time() - results = Parallel(config.numJobs)(delayed(runOnce)(sim, config, shape) for shape in config.nextShape()) - - end = time.time() sim.logger.info("A total of %d simulations ran in %d seconds" % (len(results), end-start), extra=sim.format) @@ -61,8 +59,7 @@ def study(): res.dump(execID) sim.logger.info("Results dumped into results/%s/" % (execID), extra=sim.format) - visualization = 1 - if visualization: + if config.visualization: vis = Visualizer(execID) vis.plotHeatmaps() From 99e051e6fc669b27e791a99b8971f4eaca7063cb Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 3 Mar 2023 18:41:12 +0100 Subject: [PATCH 087/162] adding uplinkBw configuration Signed-off-by: Csaba Kiraly --- DAS/shape.py | 3 ++- DAS/validator.py | 2 +- config_example.py | 13 +++++++++---- study.py | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/DAS/shape.py b/DAS/shape.py index 1dd19b2..de22c90 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -3,7 +3,7 @@ class Shape: """This class represents a set of parameters for a specific simulation.""" - def __init__(self, blockSize, numberValidators, failureRate, chi, netDegree, run): + def __init__(self, blockSize, numberValidators, failureRate, chi, netDegree, bwUplink, run): """Initializes the shape with the parameters passed in argument.""" self.run = run self.numberValidators = numberValidators @@ -12,6 +12,7 @@ class Shape: self.netDegree = netDegree self.chi = chi self.randomSeed = "" + self.bwUplink = bwUplink def __repr__(self): """Returns a printable representation of the shape""" diff --git a/DAS/validator.py b/DAS/validator.py index 7b52e58..4647df5 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -77,7 +77,7 @@ class Validator: # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 # TODO: this should be a parameter - self.bwUplink = 110 if not self.amIproposer else 2200 # approx. 10Mbps and 200Mbps + self.bwUplink = shape.bwUplink if not self.amIproposer else 2200 # approx. 10Mbps and 200Mbps self.repairOnTheFly = True self.sendLineUntil = (self.shape.blockSize + 1) // 2 # stop sending on a p2p link if at least this amount of samples passed diff --git a/config_example.py b/config_example.py index 248a8e9..0967a4f 100644 --- a/config_example.py +++ b/config_example.py @@ -42,6 +42,10 @@ netDegrees = range(6, 9, 2) # Number of rows and columns a validator is interested in chis = range(4, 9, 2) +# Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) +# 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 +bwUplinks = [11, 110] + # Set to True if you want your run to be deterministic, False if not deterministic = False @@ -55,7 +59,8 @@ def nextShape(): 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 + for bwUplink in bwUplinks: + # Network Degree has to be an even number + if netDegree % 2 == 0: + shape = Shape(blockSize, nv, fr, chi, netDegree, bwUplink, run) + yield shape diff --git a/study.py b/study.py index e24fb46..2503895 100644 --- a/study.py +++ b/study.py @@ -40,7 +40,7 @@ def study(): print("You need to pass a configuration file in parameter") exit(1) - shape = Shape(0, 0, 0, 0, 0, 0) + shape = Shape(0, 0, 0, 0, 0, 0, 0) sim = Simulator(shape, config) sim.initLogger() results = [] From 4a5d410f6a86b48bf3688773f379ab1ff64ce66e Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 6 Mar 2023 11:42:45 +0100 Subject: [PATCH 088/162] fixup: add bwUplink to save file name Signed-off-by: Csaba Kiraly --- DAS/shape.py | 1 + 1 file changed, 1 insertion(+) diff --git a/DAS/shape.py b/DAS/shape.py index de22c90..7b24f6e 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -21,6 +21,7 @@ class Shape: shastr += "-nbv-"+str(self.numberValidators) shastr += "-fr-"+str(self.failureRate) shastr += "-chi-"+str(self.chi) + shastr += "-bwu-"+str(self.bwUplink) shastr += "-nd-"+str(self.netDegree) shastr += "-r-"+str(self.run) return shastr From dc7a4d3c032160762fe5191025bf8e3c7e087beb Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 6 Mar 2023 15:15:57 +0100 Subject: [PATCH 089/162] generate row/column interest locally in validator Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 17 ++++++++++++----- DAS/validator.py | 21 +++++++++++++++------ config_example.py | 4 ++++ 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 8b79e2c..f0195cd 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -15,6 +15,7 @@ class Simulator: def __init__(self, shape, config): """It initializes the simulation with a set of parameters (shape).""" self.shape = shape + self.config = config self.format = {"entity": "Simulator"} self.result = Result(self.shape) self.validators = [] @@ -28,12 +29,18 @@ class Simulator: self.glob = Observer(self.logger, self.shape) self.glob.reset() self.validators = [] - rows = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberValidators/self.shape.blockSize) - columns = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberValidators/self.shape.blockSize) - random.shuffle(rows) - random.shuffle(columns) + if self.config.evenLineDistribution: + rows = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberValidators/self.shape.blockSize) + columns = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberValidators/self.shape.blockSize) + random.shuffle(rows) + random.shuffle(columns) for i in range(self.shape.numberValidators): - val = Validator(i, int(not i!=0), self.logger, self.shape, rows, columns) + if self.config.evenLineDistribution: + val = Validator(i, int(not i!=0), self.logger, self.shape, + rows[(i*self.shape.chi):((i+1)*self.shape.chi)], + columns[(i*self.shape.chi):((i+1)*self.shape.chi)]) + else: + val = Validator(i, int(not i!=0), self.logger, self.shape) if i == self.proposerID: val.initBlock() self.glob.setGoldenData(val.block) diff --git a/DAS/validator.py b/DAS/validator.py index 4647df5..6a1b80a 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -38,8 +38,13 @@ class Validator: """It returns the validator ID.""" return str(self.ID) - def __init__(self, ID, amIproposer, logger, shape, rows, columns): - """It initializes the validator with the logger, shape and assigned rows/columns.""" + def __init__(self, ID, amIproposer, logger, shape, rows = None, columns = None): + """It initializes the validator with the logger shape and rows/columns. + + If rows/columns are specified these are observed, otherwise (default) + chi rows and columns are selected randomly. + """ + self.shape = shape FORMAT = "%(levelname)s : %(entity)s : %(message)s" self.ID = ID @@ -59,12 +64,16 @@ class Validator: self.rowIDs = range(shape.blockSize) self.columnIDs = range(shape.blockSize) else: - self.rowIDs = rows[(self.ID*self.shape.chi):(self.ID*self.shape.chi + self.shape.chi)] - self.columnIDs = columns[(self.ID*self.shape.chi):(self.ID*self.shape.chi + self.shape.chi)] #if shape.deterministic: # random.seed(self.ID) - #self.rowIDs = random.sample(range(self.shape.blockSize), self.shape.chi) - #self.columnIDs = random.sample(range(self.shape.blockSize), self.shape.chi) + if rows: + self.rowIDs = rows + else: + self.rowIDs = random.sample(range(self.shape.blockSize), self.shape.chi) + if columns: + self.columnIDs = columns + else: + self.columnIDs = random.sample(range(self.shape.blockSize), self.shape.chi) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) diff --git a/config_example.py b/config_example.py index 0967a4f..9235f10 100644 --- a/config_example.py +++ b/config_example.py @@ -24,6 +24,10 @@ logLevel = logging.INFO # for more details, see joblib.Parallel numJobs = 3 +# distribute rows/columns evenly between validators (True) +# or generate it using local randomness (False) +evenLineDistribution = False + # Number of simulation runs with the same parameters for statistical relevance runs = range(10) From 49b1c239d79c1eae2f332cbc6388c1c22091303a Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 6 Mar 2023 22:46:17 +0100 Subject: [PATCH 090/162] use itertools Signed-off-by: Csaba Kiraly --- config_example.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/config_example.py b/config_example.py index 9235f10..59d8fef 100644 --- a/config_example.py +++ b/config_example.py @@ -14,6 +14,7 @@ if needed. """ import logging +import itertools from DAS.shape import Shape dumpXML = 1 @@ -57,14 +58,9 @@ deterministic = False randomSeed = "DAS" 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: - for bwUplink in bwUplinks: - # Network Degree has to be an even number - if netDegree % 2 == 0: - shape = Shape(blockSize, nv, fr, chi, netDegree, bwUplink, run) - yield shape + for run, fr, chi, blockSize, nv, netDegree, bwUplink in itertools.product( + runs, failureRates, chis, blockSizes, numberValidators, netDegrees, bwUplinks): + # Network Degree has to be an even number + if netDegree % 2 == 0: + shape = Shape(blockSize, nv, fr, chi, netDegree, bwUplink, run) + yield shape From ef4e32ed53a3a0793f42a0451448b62429e879bc Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 7 Mar 2023 13:24:11 +0100 Subject: [PATCH 091/162] introduce node classes Signed-off-by: Csaba Kiraly --- DAS/shape.py | 18 +++++++++++++----- DAS/simulator.py | 3 ++- DAS/validator.py | 21 ++++++++++++++++----- config_example.py | 16 +++++++++++----- study.py | 2 +- 5 files changed, 43 insertions(+), 17 deletions(-) diff --git a/DAS/shape.py b/DAS/shape.py index 7b24f6e..b707e51 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -3,16 +3,20 @@ class Shape: """This class represents a set of parameters for a specific simulation.""" - def __init__(self, blockSize, numberValidators, failureRate, chi, netDegree, bwUplink, run): + def __init__(self, blockSize, numberValidators, failureRate, class1ratio, chi1, chi2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run): """Initializes the shape with the parameters passed in argument.""" self.run = run self.numberValidators = numberValidators self.blockSize = blockSize self.failureRate = failureRate self.netDegree = netDegree - self.chi = chi + self.class1ratio = class1ratio + self.chi1 = chi1 + self.chi2 = chi2 + self.bwUplinkProd = bwUplinkProd + self.bwUplink1 = bwUplink1 + self.bwUplink2 = bwUplink2 self.randomSeed = "" - self.bwUplink = bwUplink def __repr__(self): """Returns a printable representation of the shape""" @@ -20,8 +24,12 @@ class Shape: shastr += "bs-"+str(self.blockSize) shastr += "-nbv-"+str(self.numberValidators) shastr += "-fr-"+str(self.failureRate) - shastr += "-chi-"+str(self.chi) - shastr += "-bwu-"+str(self.bwUplink) + shastr += "-c1r-"+str(self.class1ratio) + shastr += "-chi1-"+str(self.chi1) + shastr += "-chi2-"+str(self.chi2) + shastr += "-bwupprod-"+str(self.bwUplinkProd) + shastr += "-bwup1-"+str(self.bwUplink1) + shastr += "-bwup2-"+str(self.bwUplink2) shastr += "-nd-"+str(self.netDegree) shastr += "-r-"+str(self.run) return shastr diff --git a/DAS/simulator.py b/DAS/simulator.py index f0195cd..2d6e635 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -126,7 +126,8 @@ class Simulator: self.result = Result(self.shape) for val in self.validators: val.shape.failureRate = shape.failureRate - val.shape.chi = shape.chi + val.shape.chi1 = shape.chi1 + val.shape.chi2 = shape.chi2 # In GossipSub the initiator might push messages without participating in the mesh. # proposerPublishOnly regulates this behavior. If set to true, the proposer is not diff --git a/DAS/validator.py b/DAS/validator.py index 6a1b80a..71e5791 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -55,11 +55,17 @@ class Validator: self.sendQueue = deque() self.amIproposer = amIproposer self.logger = logger - if self.shape.chi < 1: + if self.shape.chi1 < 1 or self.shape.chi2 < 1: self.logger.error("Chi has to be greater than 0", extra=self.format) - elif self.shape.chi > self.shape.blockSize: + elif self.shape.chi1 > self.shape.blockSize or self.shape.chi2 > self.shape.blockSize: self.logger.error("Chi has to be smaller than %d" % blockSize, extra=self.format) else: + if self.amIproposer: + self.chi = 1 # not used + elif self.ID <= shape.numberValidators * shape.class1ratio: + self.chi = shape.chi1 + else: + self.chi = shape.chi2 if amIproposer: self.rowIDs = range(shape.blockSize) self.columnIDs = range(shape.blockSize) @@ -69,11 +75,11 @@ class Validator: if rows: self.rowIDs = rows else: - self.rowIDs = random.sample(range(self.shape.blockSize), self.shape.chi) + self.rowIDs = random.sample(range(self.shape.blockSize), self.chi) if columns: self.columnIDs = columns else: - self.columnIDs = random.sample(range(self.shape.blockSize), self.shape.chi) + self.columnIDs = random.sample(range(self.shape.blockSize), self.chi) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) @@ -86,7 +92,12 @@ class Validator: # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 # TODO: this should be a parameter - self.bwUplink = shape.bwUplink if not self.amIproposer else 2200 # approx. 10Mbps and 200Mbps + if self.amIproposer: + self.bwUplink = shape.bwUplinkProd + elif self.ID <= shape.numberValidators * shape.class1ratio: + self.bwUplink = shape.bwUplink1 + else: + self.bwUplink = shape.bwUplink2 self.repairOnTheFly = True self.sendLineUntil = (self.shape.blockSize + 1) // 2 # stop sending on a p2p link if at least this amount of samples passed diff --git a/config_example.py b/config_example.py index 59d8fef..b718528 100644 --- a/config_example.py +++ b/config_example.py @@ -15,6 +15,7 @@ if needed. import logging import itertools +import numpy as np from DAS.shape import Shape dumpXML = 1 @@ -44,12 +45,17 @@ blockSizes = range(32,65,16) # Per-topic mesh neighborhood size netDegrees = range(6, 9, 2) +class1ratios = np.arange(0, 1, .2) + # Number of rows and columns a validator is interested in -chis = range(4, 9, 2) +chis1 = range(1, 5, 2) +chis2 = range(10, 30, 20) # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 -bwUplinks = [11, 110] +bwUplinksProd = [2200] +bwUplinks1 = [2200] +bwUplinks2 = [110] # Set to True if you want your run to be deterministic, False if not deterministic = False @@ -58,9 +64,9 @@ deterministic = False randomSeed = "DAS" def nextShape(): - for run, fr, chi, blockSize, nv, netDegree, bwUplink in itertools.product( - runs, failureRates, chis, blockSizes, numberValidators, netDegrees, bwUplinks): + for run, fr, class1ratio, chi1, chi2, blockSize, nv, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( + runs, failureRates, class1ratios, chis1, chis2, blockSizes, numberValidators, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): # Network Degree has to be an even number if netDegree % 2 == 0: - shape = Shape(blockSize, nv, fr, chi, netDegree, bwUplink, run) + shape = Shape(blockSize, nv, fr, class1ratio, chi1, chi2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run) yield shape diff --git a/study.py b/study.py index 2503895..3efd83e 100644 --- a/study.py +++ b/study.py @@ -40,7 +40,7 @@ def study(): print("You need to pass a configuration file in parameter") exit(1) - shape = Shape(0, 0, 0, 0, 0, 0, 0) + shape = Shape(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) sim = Simulator(shape, config) sim.initLogger() results = [] From 45fe4542045a082b369a5012a1d6aa9e75b103ac Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 7 Mar 2023 14:36:13 +0100 Subject: [PATCH 092/162] WIP: extend Vis with new parameters Current code assumes 6 parameters in some places. Still needs some work Signed-off-by: Csaba Kiraly --- DAS/visualizer.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 047e513..e0579e2 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -12,7 +12,8 @@ class Visualizer: def __init__(self, execID): self.execID = execID self.folderPath = "results/"+self.execID - self.parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', 'chi'] + self.parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', + 'chi1', 'chi2', 'bwUplinkProd', 'bwUplink1', 'bwUplink2'] self.minimumDataPoints = 2 def plottingData(self): @@ -29,20 +30,24 @@ class Visualizer: failureRate = int(root.find('failureRate').text) numberValidators = int(root.find('numberValidators').text) netDegree = int(root.find('netDegree').text) - chi = int(root.find('chi').text) + chi1 = int(root.find('chi1').text) + chi2 = int(root.find('chi2').text) + bwUplinkProd = int(root.find('bwUplinkProd').text) + bwUplink1 = int(root.find('bwUplink1').text) + bwUplink2 = int(root.find('bwUplink2').text) tta = int(root.find('tta').text) # Loop over all possible combinations of length 4 of the parameters for combination in combinations(self.parameters, 4): # Get the indices and values of the parameters in the combination indices = [self.parameters.index(element) for element in combination] - selectedValues = [run, blockSize, failureRate, numberValidators, netDegree, chi] + selectedValues = [run, blockSize, failureRate, numberValidators, netDegree, chi1, chi2, bwUplinkProd, bwUplink1, bwUplink2] values = [selectedValues[index] for index in indices] names = [self.parameters[i] for i in indices] keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] key = tuple(keyComponents[:4]) #Get the names of the other 2 parameters that are not included in the key - otherParams = [self.parameters[i] for i in range(6) if i not in indices] + otherParams = [self.parameters[i] for i in range(len(self.parameters)) if i not in indices] #Append the values of the other 2 parameters and the ttas to the lists for the key otherIndices = [i for i in range(len(self.parameters)) if i not in indices] From 065086f88caadca7fde37d9d0c1c3976361e08cc Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 13 Mar 2023 15:00:43 +0100 Subject: [PATCH 093/162] configure using validatorsPerNode1/2 instead of chi1/2 Signed-off-by: Csaba Kiraly --- DAS/shape.py | 12 +++++++----- DAS/simulator.py | 5 +++-- DAS/validator.py | 10 +++++----- DAS/visualizer.py | 9 +++++---- config_example.py | 16 ++++++++++------ study.py | 2 +- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/DAS/shape.py b/DAS/shape.py index b707e51..484b3eb 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -3,7 +3,7 @@ class Shape: """This class represents a set of parameters for a specific simulation.""" - def __init__(self, blockSize, numberValidators, failureRate, class1ratio, chi1, chi2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run): + def __init__(self, blockSize, numberValidators, failureRate, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run): """Initializes the shape with the parameters passed in argument.""" self.run = run self.numberValidators = numberValidators @@ -11,8 +11,9 @@ class Shape: self.failureRate = failureRate self.netDegree = netDegree self.class1ratio = class1ratio - self.chi1 = chi1 - self.chi2 = chi2 + self.chi = chi + self.vpn1 = vpn1 + self.vpn2 = vpn2 self.bwUplinkProd = bwUplinkProd self.bwUplink1 = bwUplink1 self.bwUplink2 = bwUplink2 @@ -25,8 +26,9 @@ class Shape: shastr += "-nbv-"+str(self.numberValidators) shastr += "-fr-"+str(self.failureRate) shastr += "-c1r-"+str(self.class1ratio) - shastr += "-chi1-"+str(self.chi1) - shastr += "-chi2-"+str(self.chi2) + shastr += "-chi-"+str(self.chi) + shastr += "-vpn1-"+str(self.vpn1) + shastr += "-vpn2-"+str(self.vpn2) shastr += "-bwupprod-"+str(self.bwUplinkProd) shastr += "-bwup1-"+str(self.bwUplink1) shastr += "-bwup2-"+str(self.bwUplink2) diff --git a/DAS/simulator.py b/DAS/simulator.py index 2d6e635..65f8ef2 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -126,8 +126,9 @@ class Simulator: self.result = Result(self.shape) for val in self.validators: val.shape.failureRate = shape.failureRate - val.shape.chi1 = shape.chi1 - val.shape.chi2 = shape.chi2 + val.shape.chi = shape.chi + val.shape.vpn1 = shape.vpn1 + val.shape.vpn2 = shape.vpn2 # In GossipSub the initiator might push messages without participating in the mesh. # proposerPublishOnly regulates this behavior. If set to true, the proposer is not diff --git a/DAS/validator.py b/DAS/validator.py index 71e5791..ae7be43 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -55,17 +55,17 @@ class Validator: self.sendQueue = deque() self.amIproposer = amIproposer self.logger = logger - if self.shape.chi1 < 1 or self.shape.chi2 < 1: + if self.shape.chi < 1: self.logger.error("Chi has to be greater than 0", extra=self.format) - elif self.shape.chi1 > self.shape.blockSize or self.shape.chi2 > self.shape.blockSize: - self.logger.error("Chi has to be smaller than %d" % blockSize, extra=self.format) + elif self.shape.chi > self.shape.blockSize: + self.logger.error("Chi has to be smaller than %d" % self.shape.blockSize, extra=self.format) else: if self.amIproposer: self.chi = 1 # not used elif self.ID <= shape.numberValidators * shape.class1ratio: - self.chi = shape.chi1 + self.chi = shape.chi * shape.vpn1 else: - self.chi = shape.chi2 + self.chi = shape.chi * shape.vpn2 # TODO: union of random subsets vpn2 times if amIproposer: self.rowIDs = range(shape.blockSize) self.columnIDs = range(shape.blockSize) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index e0579e2..7004c87 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -13,7 +13,7 @@ class Visualizer: self.execID = execID self.folderPath = "results/"+self.execID self.parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', - 'chi1', 'chi2', 'bwUplinkProd', 'bwUplink1', 'bwUplink2'] + 'chi', 'vpn1', 'vpn2', 'bwUplinkProd', 'bwUplink1', 'bwUplink2'] self.minimumDataPoints = 2 def plottingData(self): @@ -30,8 +30,9 @@ class Visualizer: failureRate = int(root.find('failureRate').text) numberValidators = int(root.find('numberValidators').text) netDegree = int(root.find('netDegree').text) - chi1 = int(root.find('chi1').text) - chi2 = int(root.find('chi2').text) + chi = int(root.find('chi').text) + vpn1 = int(root.find('vpn1').text) + vpn2 = int(root.find('vpn2').text) bwUplinkProd = int(root.find('bwUplinkProd').text) bwUplink1 = int(root.find('bwUplink1').text) bwUplink2 = int(root.find('bwUplink2').text) @@ -41,7 +42,7 @@ class Visualizer: for combination in combinations(self.parameters, 4): # Get the indices and values of the parameters in the combination indices = [self.parameters.index(element) for element in combination] - selectedValues = [run, blockSize, failureRate, numberValidators, netDegree, chi1, chi2, bwUplinkProd, bwUplink1, bwUplink2] + selectedValues = [run, blockSize, failureRate, numberValidators, netDegree, chi, vpn1, vpn2, bwUplinkProd, bwUplink1, bwUplink2] values = [selectedValues[index] for index in indices] names = [self.parameters[i] for i in indices] keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] diff --git a/config_example.py b/config_example.py index b718528..0bd509c 100644 --- a/config_example.py +++ b/config_example.py @@ -45,11 +45,15 @@ 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(1, 5, 2) + +# ratio of class1 nodes (see below for parameters per class) class1ratios = np.arange(0, 1, .2) -# Number of rows and columns a validator is interested in -chis1 = range(1, 5, 2) -chis2 = range(10, 30, 20) +# Number of validators per beacon node +validatorsPerNode1 = [1] +validatorsPerNode2 = [2, 4, 8, 16, 32] # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 @@ -64,9 +68,9 @@ deterministic = False randomSeed = "DAS" def nextShape(): - for run, fr, class1ratio, chi1, chi2, blockSize, nv, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( - runs, failureRates, class1ratios, chis1, chis2, blockSizes, numberValidators, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): + for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nv, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( + runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberValidators, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): # Network Degree has to be an even number if netDegree % 2 == 0: - shape = Shape(blockSize, nv, fr, class1ratio, chi1, chi2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run) + shape = Shape(blockSize, nv, fr, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run) yield shape diff --git a/study.py b/study.py index 3efd83e..2b2aab6 100644 --- a/study.py +++ b/study.py @@ -40,7 +40,7 @@ def study(): print("You need to pass a configuration file in parameter") exit(1) - shape = Shape(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + shape = Shape(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) sim = Simulator(shape, config) sim.initLogger() results = [] From 9d9612fd34dbdee32f398f5c8be03e48b8708248 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 13 Mar 2023 15:03:55 +0100 Subject: [PATCH 094/162] rename numberValidators to numberNodes Signed-off-by: Csaba Kiraly --- DAS/shape.py | 6 +++--- DAS/simulator.py | 18 +++++++++--------- DAS/validator.py | 4 ++-- DAS/visualizer.py | 6 +++--- config_example.py | 8 ++++---- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/DAS/shape.py b/DAS/shape.py index 484b3eb..d83351d 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -3,10 +3,10 @@ class Shape: """This class represents a set of parameters for a specific simulation.""" - def __init__(self, blockSize, numberValidators, failureRate, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run): + def __init__(self, blockSize, numberNodes, failureRate, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run): """Initializes the shape with the parameters passed in argument.""" self.run = run - self.numberValidators = numberValidators + self.numberNodes = numberNodes self.blockSize = blockSize self.failureRate = failureRate self.netDegree = netDegree @@ -23,7 +23,7 @@ class Shape: """Returns a printable representation of the shape""" shastr = "" shastr += "bs-"+str(self.blockSize) - shastr += "-nbv-"+str(self.numberValidators) + shastr += "-nn-"+str(self.numberNodes) shastr += "-fr-"+str(self.failureRate) shastr += "-c1r-"+str(self.class1ratio) shastr += "-chi-"+str(self.chi) diff --git a/DAS/simulator.py b/DAS/simulator.py index 65f8ef2..4cadf9f 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -30,11 +30,11 @@ class Simulator: self.glob.reset() self.validators = [] if self.config.evenLineDistribution: - rows = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberValidators/self.shape.blockSize) - columns = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberValidators/self.shape.blockSize) + rows = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberNodes/self.shape.blockSize) + columns = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberNodes/self.shape.blockSize) random.shuffle(rows) random.shuffle(columns) - for i in range(self.shape.numberValidators): + for i in range(self.shape.numberNodes): if self.config.evenLineDistribution: val = Validator(i, int(not i!=0), self.logger, self.shape, rows[(i*self.shape.chi):((i+1)*self.shape.chi)], @@ -104,7 +104,7 @@ class Simulator: v.columnNeighbors[id].update({vi.ID : Neighbor(vi, 1, self.shape.blockSize)}) if self.logger.isEnabledFor(logging.DEBUG): - for i in range(0, self.shape.numberValidators): + for i in range(0, self.shape.numberNodes): self.logger.debug("Val %d : rowN %s", i, self.validators[i].rowNeighbors, extra=self.format) self.logger.debug("Val %d : colN %s", i, self.validators[i].columnNeighbors, extra=self.format) @@ -155,17 +155,17 @@ class Simulator: missingVector.append(missingSamples) oldMissingSamples = missingSamples self.logger.debug("PHASE SEND %d" % steps, extra=self.format) - for i in range(0,self.shape.numberValidators): + for i in range(0,self.shape.numberNodes): self.validators[i].send() self.logger.debug("PHASE RECEIVE %d" % steps, extra=self.format) - for i in range(1,self.shape.numberValidators): + for i in range(1,self.shape.numberNodes): self.validators[i].receiveRowsColumns() self.logger.debug("PHASE RESTORE %d" % steps, extra=self.format) - for i in range(1,self.shape.numberValidators): + for i in range(1,self.shape.numberNodes): self.validators[i].restoreRows() self.validators[i].restoreColumns() self.logger.debug("PHASE LOG %d" % steps, extra=self.format) - for i in range(0,self.shape.numberValidators): + for i in range(0,self.shape.numberNodes): self.validators[i].logRows() self.validators[i].logColumns() @@ -176,7 +176,7 @@ class Simulator: (steps, statsTxInSlot[0], statsRxInSlot[0], mean(statsTxInSlot[1:]), max(statsTxInSlot[1:]), mean(statsRxInSlot[1:]), max(statsRxInSlot[1:])), extra=self.format) - for i in range(0,self.shape.numberValidators): + for i in range(0,self.shape.numberNodes): self.validators[i].updateStats() arrived, expected = self.glob.checkStatus(self.validators) diff --git a/DAS/validator.py b/DAS/validator.py index ae7be43..b0fbede 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -62,7 +62,7 @@ class Validator: else: if self.amIproposer: self.chi = 1 # not used - elif self.ID <= shape.numberValidators * shape.class1ratio: + elif self.ID <= shape.numberNodes * shape.class1ratio: self.chi = shape.chi * shape.vpn1 else: self.chi = shape.chi * shape.vpn2 # TODO: union of random subsets vpn2 times @@ -94,7 +94,7 @@ class Validator: # TODO: this should be a parameter if self.amIproposer: self.bwUplink = shape.bwUplinkProd - elif self.ID <= shape.numberValidators * shape.class1ratio: + elif self.ID <= shape.numberNodes * shape.class1ratio: self.bwUplink = shape.bwUplink1 else: self.bwUplink = shape.bwUplink2 diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 7004c87..d165f0d 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -12,7 +12,7 @@ class Visualizer: def __init__(self, execID): self.execID = execID self.folderPath = "results/"+self.execID - self.parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', + self.parameters = ['run', 'blockSize', 'failureRate', 'numberNodes', 'netDegree', 'chi', 'vpn1', 'vpn2', 'bwUplinkProd', 'bwUplink1', 'bwUplink2'] self.minimumDataPoints = 2 @@ -28,7 +28,7 @@ class Visualizer: run = int(root.find('run').text) blockSize = int(root.find('blockSize').text) failureRate = int(root.find('failureRate').text) - numberValidators = int(root.find('numberValidators').text) + numberNodes = int(root.find('numberNodes').text) netDegree = int(root.find('netDegree').text) chi = int(root.find('chi').text) vpn1 = int(root.find('vpn1').text) @@ -42,7 +42,7 @@ class Visualizer: for combination in combinations(self.parameters, 4): # Get the indices and values of the parameters in the combination indices = [self.parameters.index(element) for element in combination] - selectedValues = [run, blockSize, failureRate, numberValidators, netDegree, chi, vpn1, vpn2, bwUplinkProd, bwUplink1, bwUplink2] + selectedValues = [run, blockSize, failureRate, numberNodes, netDegree, chi, vpn1, vpn2, bwUplinkProd, bwUplink1, bwUplink2] values = [selectedValues[index] for index in indices] names = [self.parameters[i] for i in indices] keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] diff --git a/config_example.py b/config_example.py index 0bd509c..5272555 100644 --- a/config_example.py +++ b/config_example.py @@ -34,7 +34,7 @@ evenLineDistribution = False runs = range(10) # Number of validators -numberValidators = range(256, 513, 128) +numberNodes = range(256, 513, 128) # Percentage of block not released by producer failureRates = range(10, 91, 40) @@ -68,9 +68,9 @@ deterministic = False randomSeed = "DAS" def nextShape(): - for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nv, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( - runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberValidators, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): + for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nn, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( + runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberNodes, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): # Network Degree has to be an even number if netDegree % 2 == 0: - shape = Shape(blockSize, nv, fr, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run) + shape = Shape(blockSize, nn, fr, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run) yield shape From 56139965477e9281b5bb75f4c218e98fce3313d8 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 13 Mar 2023 15:27:23 +0100 Subject: [PATCH 095/162] fixup: make validatorsPerNode and bandwidth consistent Signed-off-by: Csaba Kiraly --- config_example.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config_example.py b/config_example.py index 5272555..b54dff1 100644 --- a/config_example.py +++ b/config_example.py @@ -58,8 +58,8 @@ validatorsPerNode2 = [2, 4, 8, 16, 32] # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 bwUplinksProd = [2200] -bwUplinks1 = [2200] -bwUplinks2 = [110] +bwUplinks1 = [110] +bwUplinks2 = [2200] # Set to True if you want your run to be deterministic, False if not deterministic = False From c366c05616fa67b2634fd4f894a7b8039870132c Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Mar 2023 15:26:48 +0100 Subject: [PATCH 096/162] handle overlap for multiple validators per node correctly Signed-off-by: Csaba Kiraly --- DAS/tools.py | 6 ++++++ DAS/validator.py | 13 ++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/DAS/tools.py b/DAS/tools.py index cd26850..2b47b11 100644 --- a/DAS/tools.py +++ b/DAS/tools.py @@ -79,3 +79,9 @@ def sampleLine(line, limit): r[i] = 1 limit -= 1 return r + +def unionOfSamples(population, sampleSize, times): + selected = set() + for t in range(times): + selected |= set(random.sample(population, sampleSize)) + return selected diff --git a/DAS/validator.py b/DAS/validator.py index b0fbede..9abb125 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -4,7 +4,7 @@ import random import collections import logging from DAS.block import * -from DAS.tools import shuffled, shuffledDict +from DAS.tools import shuffled, shuffledDict, unionOfSamples from bitarray.util import zeros from collections import deque from itertools import chain @@ -60,12 +60,7 @@ class Validator: elif self.shape.chi > self.shape.blockSize: self.logger.error("Chi has to be smaller than %d" % self.shape.blockSize, extra=self.format) else: - if self.amIproposer: - self.chi = 1 # not used - elif self.ID <= shape.numberNodes * shape.class1ratio: - self.chi = shape.chi * shape.vpn1 - else: - self.chi = shape.chi * shape.vpn2 # TODO: union of random subsets vpn2 times + self.chi = shape.chi if amIproposer: self.rowIDs = range(shape.blockSize) self.columnIDs = range(shape.blockSize) @@ -75,11 +70,11 @@ class Validator: if rows: self.rowIDs = rows else: - self.rowIDs = random.sample(range(self.shape.blockSize), self.chi) + self.rowIDs = unionOfSamples(range(self.shape.blockSize), self.chi, self.shape.vpn1) if columns: self.columnIDs = columns else: - self.columnIDs = random.sample(range(self.shape.blockSize), self.chi) + self.columnIDs = unionOfSamples(range(self.shape.blockSize), self.chi, self.shape.vpn1) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) From 353efec1412cf9350c81b011a242df806b90a2a7 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Mar 2023 12:53:43 +0100 Subject: [PATCH 097/162] fixup: use vpn1 and vpn2 correctly Signed-off-by: Csaba Kiraly --- DAS/validator.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 9abb125..f869171 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -60,21 +60,15 @@ class Validator: elif self.shape.chi > self.shape.blockSize: self.logger.error("Chi has to be smaller than %d" % self.shape.blockSize, extra=self.format) else: - self.chi = shape.chi if amIproposer: self.rowIDs = range(shape.blockSize) self.columnIDs = range(shape.blockSize) else: #if shape.deterministic: # random.seed(self.ID) - if rows: - self.rowIDs = rows - else: - self.rowIDs = unionOfSamples(range(self.shape.blockSize), self.chi, self.shape.vpn1) - if columns: - self.columnIDs = columns - else: - self.columnIDs = unionOfSamples(range(self.shape.blockSize), self.chi, self.shape.vpn1) + vpn = self.shape.vpn1 if (self.ID <= shape.numberNodes * shape.class1ratio) else self.shape.vpn2 + self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) + self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) From 64fcbff0ef1bd46e5721f527ebff8efed01b1707 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 20 Mar 2023 17:09:17 +0100 Subject: [PATCH 098/162] warn if no nodes for a row/column Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 4cadf9f..06ebd8e 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -64,7 +64,10 @@ class Simulator: # If the number of nodes in a channel is smaller or equal to the # requested degree, a fully connected graph is used. For n>d, a random # d-regular graph is set up. (For n=d+1, the two are the same.) - if (len(rowChannels[id]) <= self.shape.netDegree): + if not rowChannels[id]: + self.logger.error("No nodes for row %d !" % id, extra=self.format) + continue + elif (len(rowChannels[id]) <= self.shape.netDegree): self.logger.debug("Graph fully connected with degree %d !" % (len(rowChannels[id]) - 1), extra=self.format) G = nx.complete_graph(len(rowChannels[id])) else: @@ -77,7 +80,10 @@ class Simulator: val1.rowNeighbors[id].update({val2.ID : Neighbor(val2, 0, self.shape.blockSize)}) val2.rowNeighbors[id].update({val1.ID : Neighbor(val1, 0, self.shape.blockSize)}) - if (len(columnChannels[id]) <= self.shape.netDegree): + if not columnChannels[id]: + self.logger.error("No nodes for column %d !" % id, extra=self.format) + continue + elif (len(columnChannels[id]) <= self.shape.netDegree): self.logger.debug("Graph fully connected with degree %d !" % (len(columnChannels[id]) - 1), extra=self.format) G = nx.complete_graph(len(columnChannels[id])) else: From 125ba2ad4a64303b4d42e684cfdbfa4046046b1d Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Tue, 21 Mar 2023 10:41:52 +0100 Subject: [PATCH 099/162] Fix visualizer to loop over all parameters --- DAS/visualizer.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index d165f0d..8afd006 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -38,15 +38,15 @@ class Visualizer: bwUplink2 = int(root.find('bwUplink2').text) tta = int(root.find('tta').text) - # Loop over all possible combinations of length 4 of the parameters - for combination in combinations(self.parameters, 4): + # Loop over all possible combinations of of the parameters minus two + for combination in combinations(self.parameters, len(self.parameters)-2): # Get the indices and values of the parameters in the combination indices = [self.parameters.index(element) for element in combination] selectedValues = [run, blockSize, failureRate, numberNodes, netDegree, chi, vpn1, vpn2, bwUplinkProd, bwUplink1, bwUplink2] values = [selectedValues[index] for index in indices] names = [self.parameters[i] for i in indices] keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] - key = tuple(keyComponents[:4]) + key = tuple(keyComponents[:len(self.parameters)-2]) #Get the names of the other 2 parameters that are not included in the key otherParams = [self.parameters[i] for i in range(len(self.parameters)) if i not in indices] #Append the values of the other 2 parameters and the ttas to the lists for the key @@ -92,7 +92,7 @@ class Visualizer: #Label formatting for the figures result = ''.join([f" {char}" if char.isupper() else char for char in label]) return result.title() - + def formatTitle(self, key): #Title formatting for the figures name = ''.join([f" {char}" if char.isupper() else char for char in key.split('_')[0]]) @@ -104,7 +104,7 @@ class Visualizer: data = self.plottingData() filteredKeys = self.similarKeys(data) print("Plotting heatmaps...") - + #Create the directory if it doesn't exist already heatmapsFolder = self.folderPath + '/heatmaps' if not os.path.exists(heatmapsFolder): From 3642083f2235d1355b5f777324f0b6a19a097bf9 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Tue, 21 Mar 2023 15:16:19 +0100 Subject: [PATCH 100/162] Fixing the global random uniform distribution of topics across validators --- DAS/simulator.py | 33 +++++++++++++++++++++++++++------ DAS/validator.py | 12 ++++++++---- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 06ebd8e..de3adff 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -30,15 +30,27 @@ class Simulator: self.glob.reset() self.validators = [] if self.config.evenLineDistribution: - rows = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberNodes/self.shape.blockSize) - columns = list(range(self.shape.blockSize)) * int(self.shape.chi*self.shape.numberNodes/self.shape.blockSize) + + lightVal = int(self.shape.numberNodes * self.shape.class1ratio * self.shape.vpn1) + heavyVal = int(self.shape.numberNodes * (1-self.shape.class1ratio) * self.shape.vpn2) + totalValidators = lightVal + heavyVal + rows = list(range(self.shape.blockSize)) * (int(totalValidators/self.shape.blockSize)+1) + columns = list(range(self.shape.blockSize)) * (int(totalValidators/self.shape.blockSize)+1) + offset = heavyVal*self.shape.chi random.shuffle(rows) random.shuffle(columns) for i in range(self.shape.numberNodes): if self.config.evenLineDistribution: - val = Validator(i, int(not i!=0), self.logger, self.shape, - rows[(i*self.shape.chi):((i+1)*self.shape.chi)], - columns[(i*self.shape.chi):((i+1)*self.shape.chi)]) + if i < int(heavyVal/self.shape.vpn2): # First start with the heavy nodes + start = i *self.shape.chi*self.shape.vpn2 + end = (i+1)*self.shape.chi*self.shape.vpn2 + else: # Then the solo stakers + j = i - int(heavyVal/self.shape.vpn2) + start = offset+( j *self.shape.chi) + end = offset+((j+1)*self.shape.chi) + r = rows[start:end] + c = columns[start:end] + val = Validator(i, int(not i!=0), self.logger, self.shape, r, c, self.config.evenLineDistribution) else: val = Validator(i, int(not i!=0), self.logger, self.shape) if i == self.proposerID: @@ -47,6 +59,7 @@ class Simulator: else: val.logIDs() self.validators.append(val) + self.logger.debug("Validators initialized.", extra=self.format) def initNetwork(self): """It initializes the simulated network.""" @@ -59,6 +72,14 @@ class Simulator: for id in v.columnIDs: columnChannels[id].append(v) + # Check rows/columns distribution + #totalR = 0 + #totalC = 0 + #for r in rowChannels: + # totalR += len(r) + #for c in columnChannels: + # totalC += len(c) + for id in range(self.shape.blockSize): # If the number of nodes in a channel is smaller or equal to the @@ -178,7 +199,7 @@ class Simulator: # log TX and RX statistics statsTxInSlot = [v.statsTxInSlot for v in self.validators] statsRxInSlot = [v.statsRxInSlot for v in self.validators] - self.logger.debug("step %d: TX_prod=%.1f, RX_prod=%.1f, TX_avg=%.1f, TX_max=%.1f, Rx_avg=%.1f, Rx_max=%.1f" % + self.logger.debug("step %d: TX_prod=%.1f, RX_prod=%.1f, TX_avg=%.1f, TX_max=%.1f, Rx_avg=%.1f, Rx_max=%.1f" % (steps, statsTxInSlot[0], statsRxInSlot[0], mean(statsTxInSlot[1:]), max(statsTxInSlot[1:]), mean(statsRxInSlot[1:]), max(statsRxInSlot[1:])), extra=self.format) diff --git a/DAS/validator.py b/DAS/validator.py index f869171..6b3904e 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -38,7 +38,7 @@ class Validator: """It returns the validator ID.""" return str(self.ID) - def __init__(self, ID, amIproposer, logger, shape, rows = None, columns = None): + def __init__(self, ID, amIproposer, logger, shape, rows = None, columns = None, globalRandomness = True): """It initializes the validator with the logger shape and rows/columns. If rows/columns are specified these are observed, otherwise (default) @@ -66,9 +66,13 @@ class Validator: else: #if shape.deterministic: # random.seed(self.ID) - vpn = self.shape.vpn1 if (self.ID <= shape.numberNodes * shape.class1ratio) else self.shape.vpn2 - self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) - self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) + if globalRandomness: + self.rowIDs = rows + self.columnIDs = columns + else: + vpn = self.shape.vpn1 if (self.ID <= shape.numberNodes * shape.class1ratio) else self.shape.vpn2 + self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) + self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) From 57af48bf0e943871716d43e8b20e9239591d23e8 Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Wed, 22 Mar 2023 23:17:19 +0000 Subject: [PATCH 101/162] Average runs --- DAS/visualizer.py | 66 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 047e513..bb8c527 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -16,11 +16,11 @@ class Visualizer: self.minimumDataPoints = 2 def plottingData(self): - #Store data with a unique key for each params combination + """Store data with a unique key for each params combination""" data = {} - #Loop over the xml files in the folder + """Loop over the xml files in the folder""" for filename in os.listdir(self.folderPath): - #Loop over the xmls and store the data in variables + """Loop over the xmls and store the data in variables""" if filename.endswith('.xml'): tree = ET.parse(os.path.join(self.folderPath, filename)) root = tree.getroot() @@ -32,24 +32,24 @@ class Visualizer: chi = int(root.find('chi').text) tta = int(root.find('tta').text) - # Loop over all possible combinations of length 4 of the parameters + """Loop over all possible combinations of length 4 of the parameters""" for combination in combinations(self.parameters, 4): - # Get the indices and values of the parameters in the combination + """Get the indices and values of the parameters in the combination""" indices = [self.parameters.index(element) for element in combination] selectedValues = [run, blockSize, failureRate, numberValidators, netDegree, chi] values = [selectedValues[index] for index in indices] names = [self.parameters[i] for i in indices] keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] key = tuple(keyComponents[:4]) - #Get the names of the other 2 parameters that are not included in the key + """Get the names of the other 2 parameters that are not included in the key""" otherParams = [self.parameters[i] for i in range(6) if i not in indices] - #Append the values of the other 2 parameters and the ttas to the lists for the key + """Append the values of the other 2 parameters and the ttas to the lists for the key""" otherIndices = [i for i in range(len(self.parameters)) if i not in indices] - #Initialize the dictionary for the key if it doesn't exist yet + """Initialize the dictionary for the key if it doesn't exist yet""" if key not in data: data[key] = {} - #Initialize lists for the other 2 parameters and the ttas with the key + """Initialize lists for the other 2 parameters and the ttas with the key""" data[key][otherParams[0]] = [] data[key][otherParams[1]] = [] data[key]['ttas'] = [] @@ -65,9 +65,42 @@ class Visualizer: data[key]['ttas'].append(tta) print("Getting data from the folder...") return data + + def averageRuns(self, data): + """Get the average of run 0 and run 1 for each key""" + newData = {} + for key, value in data.items(): + runExists = False + """Check if the key contains 'run_' with a numerical value""" + for item in key: + if item.startswith('run_0'): + runExists = True + break + if runExists: + for item in key: + """Create a new key with the other items in the tuple""" + if item.startswith('run_'): + newKey = tuple([x for x in key if x != item]) + key0 = ('run_0',) + newKey + data0 = data[key0] + key1 = ('run_1',) + newKey + data1 = data[key1] + averages = {} + for key in data0.keys(): + if key in data1: + values = [] + for i in range(len(data0[key])): + value = (data0[key][i] + data1[key][i]) / 2.0 + if isinstance(data0[key][i], int) and isinstance(data1[key][i], int) and key != 'ttas': + value = int(value) + values.append(value) + averages[key] = values + newData[newKey] = averages + print("Getting the average of the runs...") + return newData def similarKeys(self, data): - #Get the keys for all data with the same x and y labels + """Get the keys for all data with the same x and y labels""" filteredKeys = {} for key1, value1 in data.items(): subKeys1 = list(value1.keys()) @@ -83,28 +116,29 @@ class Visualizer: return filteredKeys def formatLabel(self, label): - #Label formatting for the figures + """Label formatting for the figures""" result = ''.join([f" {char}" if char.isupper() else char for char in label]) return result.title() def formatTitle(self, key): - #Title formatting for the figures + """Title formatting for the figures""" name = ''.join([f" {char}" if char.isupper() else char for char in key.split('_')[0]]) number = key.split('_')[1] return f"{name.title()}: {number} " def plotHeatmaps(self): - #Plot and store the 2D heatmaps in subfolders + """Plot and store the 2D heatmaps in subfolders""" data = self.plottingData() + data = self.averageRuns(data) filteredKeys = self.similarKeys(data) print("Plotting heatmaps...") - #Create the directory if it doesn't exist already + """Create the directory if it doesn't exist already""" heatmapsFolder = self.folderPath + '/heatmaps' if not os.path.exists(heatmapsFolder): os.makedirs(heatmapsFolder) - #Plot + """Plot""" for labels, keys in filteredKeys.items(): for key in keys: xlabels = np.sort(np.unique(data[key][labels[0]])) @@ -121,7 +155,7 @@ class Visualizer: title = "" paramValueCnt = 0 for param in self.parameters: - if param != labels[0] and param != labels[1]: + if param != labels[0] and param != labels[1] and param != 'run': filename += f"{key[paramValueCnt]}" formattedTitle = self.formatTitle(key[paramValueCnt]) title += formattedTitle From 680817b97be0a5b161dfa8475f8743f5edd6333c Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 23 Mar 2023 20:10:27 +0100 Subject: [PATCH 102/162] Remove global randomness parameter for validator --- DAS/simulator.py | 2 +- DAS/validator.py | 12 ++++-------- config_example.py | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index de3adff..30c0d86 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -50,7 +50,7 @@ class Simulator: end = offset+((j+1)*self.shape.chi) r = rows[start:end] c = columns[start:end] - val = Validator(i, int(not i!=0), self.logger, self.shape, r, c, self.config.evenLineDistribution) + val = Validator(i, int(not i!=0), self.logger, self.shape, r, c) else: val = Validator(i, int(not i!=0), self.logger, self.shape) if i == self.proposerID: diff --git a/DAS/validator.py b/DAS/validator.py index 6b3904e..f869171 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -38,7 +38,7 @@ class Validator: """It returns the validator ID.""" return str(self.ID) - def __init__(self, ID, amIproposer, logger, shape, rows = None, columns = None, globalRandomness = True): + def __init__(self, ID, amIproposer, logger, shape, rows = None, columns = None): """It initializes the validator with the logger shape and rows/columns. If rows/columns are specified these are observed, otherwise (default) @@ -66,13 +66,9 @@ class Validator: else: #if shape.deterministic: # random.seed(self.ID) - if globalRandomness: - self.rowIDs = rows - self.columnIDs = columns - else: - vpn = self.shape.vpn1 if (self.ID <= shape.numberNodes * shape.class1ratio) else self.shape.vpn2 - self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) - self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) + vpn = self.shape.vpn1 if (self.ID <= shape.numberNodes * shape.class1ratio) else self.shape.vpn2 + self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) + self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) diff --git a/config_example.py b/config_example.py index b54dff1..af55fc2 100644 --- a/config_example.py +++ b/config_example.py @@ -28,7 +28,7 @@ numJobs = 3 # distribute rows/columns evenly between validators (True) # or generate it using local randomness (False) -evenLineDistribution = False +evenLineDistribution = True # Number of simulation runs with the same parameters for statistical relevance runs = range(10) From d38b8074f49087130b62dc4107c4e3bf11512fb8 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Mar 2023 10:09:04 +0100 Subject: [PATCH 103/162] use main Signed-off-by: Csaba Kiraly --- study.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/study.py b/study.py index 2b2aab6..2532d13 100644 --- a/study.py +++ b/study.py @@ -63,6 +63,5 @@ def study(): vis = Visualizer(execID) vis.plotHeatmaps() - -study() - +if __name__ == "__main__": + study() From 954d40e75876c0d822b2909c4efbdf5e07ccd276 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Mar 2023 10:10:13 +0100 Subject: [PATCH 104/162] use new simulator object instead of reset Signed-off-by: Csaba Kiraly # Conflicts: # study.py --- study.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/study.py b/study.py index 2532d13..3b956e8 100644 --- a/study.py +++ b/study.py @@ -12,7 +12,20 @@ from DAS import * # https://stackoverflow.com/questions/58026381/logging-nested-functions-using-joblib-parallel-and-delayed-calls # and https://github.com/joblib/joblib/issues/1017 -def runOnce(sim, config, shape): +def initLogger(config): + """It initializes the logger.""" + logger = logging.getLogger("Study") + logger.setLevel(config.logLevel) + ch = logging.StreamHandler() + ch.setLevel(config.logLevel) + ch.setFormatter(CustomFormatter()) + logger.addHandler(ch) + return logger + +def runOnce(config, shape): + + sim = Simulator(shape, config) + if config.deterministic: shape.setSeed(config.randomSeed+"-"+str(shape)) random.seed(shape.randomSeed) @@ -40,24 +53,24 @@ def study(): print("You need to pass a configuration file in parameter") exit(1) - shape = Shape(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - sim = Simulator(shape, config) - sim.initLogger() + logger = initLogger(config) + format = {"entity": "Study"} + results = [] now = datetime.now() execID = now.strftime("%Y-%m-%d_%H-%M-%S_")+str(random.randint(100,999)) - sim.logger.info("Starting simulations:", extra=sim.format) + logger.info("Starting simulations:", extra=format) start = time.time() - results = Parallel(config.numJobs)(delayed(runOnce)(sim, config, shape) for shape in config.nextShape()) + results = Parallel(config.numJobs)(delayed(runOnce)(config, shape) for shape in config.nextShape()) end = time.time() - sim.logger.info("A total of %d simulations ran in %d seconds" % (len(results), end-start), extra=sim.format) + logger.info("A total of %d simulations ran in %d seconds" % (len(results), end-start), extra=format) if config.dumpXML: for res in results: res.dump(execID) - sim.logger.info("Results dumped into results/%s/" % (execID), extra=sim.format) + logger.info("Results dumped into results/%s/" % (execID), extra=format) if config.visualization: vis = Visualizer(execID) From 952d191ccd018276ddc09b04c380306d45addee5 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Mar 2023 10:12:08 +0100 Subject: [PATCH 105/162] remove unused golden data Signed-off-by: Csaba Kiraly --- DAS/observer.py | 8 +------- DAS/simulator.py | 1 - 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index af5866a..ee0604b 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -13,18 +13,17 @@ class Observer: self.block = [] self.rows = [] self.columns = [] - self.goldenData = [] self.broadcasted = [] def reset(self): """It resets all the gathered data to zeros.""" self.block = [0] * self.config.blockSize * self.config.blockSize - self.goldenData = [0] * self.config.blockSize * self.config.blockSize self.rows = [0] * self.config.blockSize self.columns = [0] * self.config.blockSize self.broadcasted = Block(self.config.blockSize) + def checkRowsColumns(self, validators): """It checks how many validators have been assigned to each row and column.""" for val in validators: @@ -39,11 +38,6 @@ class Observer: if self.rows[i] == 0 or self.columns[i] == 0: self.logger.warning("There is a row/column that has not been assigned", extra=self.format) - def setGoldenData(self, block): - """Stores the original real data to compare it with future situations.""" - for i in range(self.config.blockSize*self.config.blockSize): - self.goldenData[i] = block.data[i] - def checkBroadcasted(self): """It checks how many broadcasted samples are still missing in the network.""" zeros = 0 diff --git a/DAS/simulator.py b/DAS/simulator.py index 30c0d86..900609c 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -55,7 +55,6 @@ class Simulator: val = Validator(i, int(not i!=0), self.logger, self.shape) if i == self.proposerID: val.initBlock() - self.glob.setGoldenData(val.block) else: val.logIDs() self.validators.append(val) From af124c07558ecb53beef94e2707d2e7cb6792c00 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Mar 2023 10:12:54 +0100 Subject: [PATCH 106/162] simplify code Signed-off-by: Csaba Kiraly --- DAS/observer.py | 8 -------- DAS/simulator.py | 1 - 2 files changed, 9 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index ee0604b..88fc8c4 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -10,14 +10,6 @@ class Observer: self.config = config self.format = {"entity": "Observer"} self.logger = logger - self.block = [] - self.rows = [] - self.columns = [] - self.broadcasted = [] - - - def reset(self): - """It resets all the gathered data to zeros.""" self.block = [0] * self.config.blockSize * self.config.blockSize self.rows = [0] * self.config.blockSize self.columns = [0] * self.config.blockSize diff --git a/DAS/simulator.py b/DAS/simulator.py index 900609c..bb27a8a 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -27,7 +27,6 @@ class Simulator: def initValidators(self): """It initializes all the validators in the network.""" self.glob = Observer(self.logger, self.shape) - self.glob.reset() self.validators = [] if self.config.evenLineDistribution: From 6e4b37a3d2e41c0da1e827071a1b6e40dbc9bfb4 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Mar 2023 11:16:43 +0100 Subject: [PATCH 107/162] adding log level TRACE Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 7 ++++++- DAS/validator.py | 12 ++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index bb27a8a..0bdbfd6 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -2,6 +2,7 @@ import networkx as nx import logging, random +from functools import partial, partialmethod from datetime import datetime from statistics import mean from DAS.tools import * @@ -135,6 +136,11 @@ class Simulator: def initLogger(self): """It initializes the logger.""" + logging.TRACE = 5 + logging.addLevelName(logging.TRACE, 'TRACE') + logging.Logger.trace = partialmethod(logging.Logger.log, logging.TRACE) + logging.trace = partial(logging.log, logging.TRACE) + logger = logging.getLogger("DAS") if len(logger.handlers) == 0: logger.setLevel(self.logLevel) @@ -144,7 +150,6 @@ class Simulator: logger.addHandler(ch) self.logger = logger - def resetShape(self, shape): """It resets the parameters of the simulation.""" self.shape = shape diff --git a/DAS/validator.py b/DAS/validator.py index f869171..9a83d42 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -155,12 +155,12 @@ class Validator: if src in self.columnNeighbors[cID]: self.columnNeighbors[cID][src].receiving[rID] = 1 if not self.receivedBlock.getSegment(rID, cID): - self.logger.debug("Recv new: %d->%d: %d,%d", src, self.ID, rID, cID, extra=self.format) + self.logger.trace("Recv new: %d->%d: %d,%d", src, self.ID, rID, cID, extra=self.format) self.receivedBlock.setSegment(rID, cID) if self.perNodeQueue or self.perNeighborQueue: self.receivedQueue.append((rID, cID)) else: - self.logger.debug("Recv DUP: %d->%d: %d,%d", src, self.ID, rID, cID, extra=self.format) + self.logger.trace("Recv DUP: %d->%d: %d,%d", src, self.ID, rID, cID, extra=self.format) # self.statsRxDuplicateInSlot += 1 self.statsRxInSlot += 1 @@ -183,7 +183,7 @@ class Validator: if self.amIproposer == 1: self.logger.error("I am a block proposer", extra=self.format) else: - self.logger.debug("Receiving the data...", extra=self.format) + self.logger.trace("Receiving the data...", extra=self.format) #self.logger.debug("%s -> %s", self.block.data, self.receivedBlock.data, extra=self.format) self.block.merge(self.receivedBlock) @@ -219,7 +219,7 @@ class Validator: def sendSegmentToNeigh(self, rID, cID, neigh): """Send segment to a neighbor (without checks).""" - self.logger.debug("sending %d/%d to %d", rID, cID, neigh.node.ID, extra=self.format) + self.logger.trace("sending %d/%d to %d", rID, cID, neigh.node.ID, extra=self.format) i = rID if neigh.dim else cID neigh.sent[i] = 1 neigh.node.receiveSegment(rID, cID, self.ID) @@ -454,7 +454,7 @@ class Validator: # be queued after successful repair. for i in range(len(rep)): if rep[i]: - self.logger.debug("Rep: %d,%d", id, i, extra=self.format) + self.logger.trace("Rep: %d,%d", id, i, extra=self.format) self.addToSendQueue(id, i) # self.statsRepairInSlot += rep.count(1) @@ -472,7 +472,7 @@ class Validator: # be queued after successful repair. for i in range(len(rep)): if rep[i]: - self.logger.debug("Rep: %d,%d", i, id, extra=self.format) + self.logger.trace("Rep: %d,%d", i, id, extra=self.format) self.addToSendQueue(i, id) # self.statsRepairInSlot += rep.count(1) From 122f6a8348c5cb80559ab6c62a8441e15dc3a9af Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 20 Mar 2023 11:29:06 +0100 Subject: [PATCH 108/162] remove resetShape Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 35 ++++++++++++----------------------- study.py | 4 +--- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 0bdbfd6..a6788b8 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -25,6 +25,18 @@ class Simulator: self.proposerID = 0 self.glob = [] + # In GossipSub the initiator might push messages without participating in the mesh. + # proposerPublishOnly regulates this behavior. If set to true, the proposer is not + # part of the p2p distribution graph, only pushes segments to it. If false, the proposer + # might get back segments from other peers since links are symmetric. + self.proposerPublishOnly = True + + # If proposerPublishOnly == True, this regulates how many copies of each segment are + # pushed out by the proposer. + # 1: the data is sent out exactly once on rows and once on columns (2 copies in total) + # self.shape.netDegree: default behavior similar (but not same) to previous code + self.proposerPublishTo = self.shape.netDegree + def initValidators(self): """It initializes all the validators in the network.""" self.glob = Observer(self.logger, self.shape) @@ -150,29 +162,6 @@ class Simulator: logger.addHandler(ch) self.logger = logger - def resetShape(self, shape): - """It resets the parameters of the simulation.""" - self.shape = shape - self.result = Result(self.shape) - for val in self.validators: - val.shape.failureRate = shape.failureRate - val.shape.chi = shape.chi - val.shape.vpn1 = shape.vpn1 - val.shape.vpn2 = shape.vpn2 - - # In GossipSub the initiator might push messages without participating in the mesh. - # proposerPublishOnly regulates this behavior. If set to true, the proposer is not - # part of the p2p distribution graph, only pushes segments to it. If false, the proposer - # might get back segments from other peers since links are symmetric. - self.proposerPublishOnly = True - - # If proposerPublishOnly == True, this regulates how many copies of each segment are - # pushed out by the proposer. - # 1: the data is sent out exactly once on rows and once on columns (2 copies in total) - # self.shape.netDegree: default behavior similar (but not same) to previous code - self.proposerPublishTo = self.shape.netDegree - - def run(self): """It runs the main simulation until the block is available or it gets stucked.""" self.glob.checkRowsColumns(self.validators) diff --git a/study.py b/study.py index 3b956e8..e7e6ce6 100644 --- a/study.py +++ b/study.py @@ -24,14 +24,12 @@ def initLogger(config): def runOnce(config, shape): - sim = Simulator(shape, config) - if config.deterministic: shape.setSeed(config.randomSeed+"-"+str(shape)) random.seed(shape.randomSeed) + sim = Simulator(shape, config) sim.initLogger() - sim.resetShape(shape) sim.initValidators() sim.initNetwork() result = sim.run() From ff93161b8df53336e9852904805a68c8f2bd6ada Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 20 Mar 2023 12:04:00 +0100 Subject: [PATCH 109/162] set vpn in validator Signed-off-by: Csaba Kiraly --- DAS/validator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 9a83d42..5ae1cd5 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -66,9 +66,9 @@ class Validator: else: #if shape.deterministic: # random.seed(self.ID) - vpn = self.shape.vpn1 if (self.ID <= shape.numberNodes * shape.class1ratio) else self.shape.vpn2 - self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) - self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, vpn) + self.vpn = self.shape.vpn1 if (self.ID <= shape.numberNodes * shape.class1ratio) else self.shape.vpn2 + self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) + self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) From 894009b4145aa8ec0aee23402acc0937e398ac4d Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 21 Mar 2023 08:34:02 +0100 Subject: [PATCH 110/162] Validator node: add nodeClass property Signed-off-by: Csaba Kiraly --- DAS/validator.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 5ae1cd5..49165a0 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -61,12 +61,14 @@ class Validator: self.logger.error("Chi has to be smaller than %d" % self.shape.blockSize, extra=self.format) else: if amIproposer: + self.nodeClass = 0 self.rowIDs = range(shape.blockSize) self.columnIDs = range(shape.blockSize) else: #if shape.deterministic: # random.seed(self.ID) - self.vpn = self.shape.vpn1 if (self.ID <= shape.numberNodes * shape.class1ratio) else self.shape.vpn2 + self.nodeClass = 1 if (self.ID <= shape.numberNodes * shape.class1ratio) else 2 + self.vpn = self.shape.vpn1 if (self.nodeClass == 1) else self.shape.vpn2 self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) self.rowNeighbors = collections.defaultdict(dict) @@ -83,7 +85,7 @@ class Validator: # TODO: this should be a parameter if self.amIproposer: self.bwUplink = shape.bwUplinkProd - elif self.ID <= shape.numberNodes * shape.class1ratio: + elif self.nodeClass == 1: self.bwUplink = shape.bwUplink1 else: self.bwUplink = shape.bwUplink2 From ec6ed7c1e8eda838f73072cc9f98d337f31c16e4 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 21 Mar 2023 14:53:48 +0100 Subject: [PATCH 111/162] dump results to XML after each run Signed-off-by: Csaba Kiraly --- study.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/study.py b/study.py index e7e6ce6..fde8099 100644 --- a/study.py +++ b/study.py @@ -22,7 +22,7 @@ def initLogger(config): logger.addHandler(ch) return logger -def runOnce(config, shape): +def runOnce(config, shape, execID): if config.deterministic: shape.setSeed(config.randomSeed+"-"+str(shape)) @@ -34,6 +34,10 @@ def runOnce(config, shape): 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) + + if config.dumpXML: + result.dump(execID) + return result def study(): @@ -61,15 +65,10 @@ def study(): logger.info("Starting simulations:", extra=format) start = time.time() - results = Parallel(config.numJobs)(delayed(runOnce)(config, shape) for shape in config.nextShape()) + results = Parallel(config.numJobs)(delayed(runOnce)(config, shape ,execID) for shape in config.nextShape()) end = time.time() logger.info("A total of %d simulations ran in %d seconds" % (len(results), end-start), extra=format) - if config.dumpXML: - for res in results: - res.dump(execID) - logger.info("Results dumped into results/%s/" % (execID), extra=format) - if config.visualization: vis = Visualizer(execID) vis.plotHeatmaps() From 3795948564e96c78fe95499528239e5f22e01aaf Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Sat, 25 Mar 2023 10:27:23 +0100 Subject: [PATCH 112/162] fix requirements.txt --- DAS/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DAS/requirements.txt b/DAS/requirements.txt index da7dcc7..f8c9fe4 100644 --- a/DAS/requirements.txt +++ b/DAS/requirements.txt @@ -1,7 +1,7 @@ bitarray==2.6.0 -DAS==0.29.0 dicttoxml==1.7.16 matplotlib==3.6.2 networkx==3.0 numpy==1.23.5 seaborn==0.12.2 +joblib==1.2.0 From 037c4cd67a516646e7636d961d179d978eec8385 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Mar 2023 12:32:39 +0100 Subject: [PATCH 113/162] count number of validators having all rows/columns Signed-off-by: Csaba Kiraly --- DAS/observer.py | 5 ++++- DAS/simulator.py | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index 88fc8c4..ce435dd 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -44,9 +44,12 @@ class Observer: """It checks the status of how many expected and arrived samples globally.""" arrived = 0 expected = 0 + validated = 0 for val in validators: if val.amIproposer == 0: (a, e) = val.checkStatus() arrived += a expected += e - return (arrived, expected) + if a == e: + validated += 1 + return (arrived, expected, validated) diff --git a/DAS/simulator.py b/DAS/simulator.py index a6788b8..9582492 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -166,7 +166,7 @@ class Simulator: """It runs the main simulation until the block is available or it gets stucked.""" self.glob.checkRowsColumns(self.validators) self.validators[self.proposerID].broadcastBlock() - arrived, expected = self.glob.checkStatus(self.validators) + arrived, expected, validated = self.glob.checkStatus(self.validators) missingSamples = expected - arrived missingVector = [] steps = 0 @@ -198,10 +198,12 @@ class Simulator: for i in range(0,self.shape.numberNodes): self.validators[i].updateStats() - arrived, expected = self.glob.checkStatus(self.validators) + arrived, expected, validated = self.glob.checkStatus(self.validators) missingSamples = expected - arrived missingRate = missingSamples*100/expected - self.logger.debug("step %d, missing %d of %d (%0.02f %%)" % (steps, missingSamples, expected, missingRate), extra=self.format) + self.logger.debug("step %d, missing %d of %d (%0.02f %%), validated (%0.02f %%)" + % (steps, missingSamples, expected, missingRate, + validated/(len(self.validators)-1)*100), extra=self.format) if missingSamples == oldMissingSamples: self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) missingVector.append(missingSamples) From 119777787eb6c3c381ef69c6ef0f8a2d41ebd5d8 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 20 Mar 2023 12:04:11 +0100 Subject: [PATCH 114/162] add progress meters to observer Signed-off-by: Csaba Kiraly --- DAS/observer.py | 16 ++++++++++++++-- DAS/simulator.py | 11 ++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index ce435dd..0b80638 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -44,6 +44,7 @@ class Observer: """It checks the status of how many expected and arrived samples globally.""" arrived = 0 expected = 0 + ready = 0 validated = 0 for val in validators: if val.amIproposer == 0: @@ -51,5 +52,16 @@ class Observer: arrived += a expected += e if a == e: - validated += 1 - return (arrived, expected, validated) + ready += 1 + validated += val.vpn + return (arrived, expected, ready, validated) + + def getProgress(self, validators): + arrived, expected, ready, validated = self.checkStatus(validators) + missingSamples = expected - arrived + sampleProgress = arrived / expected + nodeProgress = ready / (len(validators)-1) + validatorCnt = sum([v.vpn for v in validators[1:]]) + validatorProgress = validated / validatorCnt + + return missingSamples, sampleProgress, nodeProgress, validatorProgress diff --git a/DAS/simulator.py b/DAS/simulator.py index 9582492..1744bf8 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -166,7 +166,7 @@ class Simulator: """It runs the main simulation until the block is available or it gets stucked.""" self.glob.checkRowsColumns(self.validators) self.validators[self.proposerID].broadcastBlock() - arrived, expected, validated = self.glob.checkStatus(self.validators) + arrived, expected, ready, validated = self.glob.checkStatus(self.validators) missingSamples = expected - arrived missingVector = [] steps = 0 @@ -198,12 +198,9 @@ class Simulator: for i in range(0,self.shape.numberNodes): self.validators[i].updateStats() - arrived, expected, validated = self.glob.checkStatus(self.validators) - missingSamples = expected - arrived - missingRate = missingSamples*100/expected - self.logger.debug("step %d, missing %d of %d (%0.02f %%), validated (%0.02f %%)" - % (steps, missingSamples, expected, missingRate, - validated/(len(self.validators)-1)*100), extra=self.format) + missingSamples, sampleProgress, nodeProgress, validatorProgress = self.glob.getProgress(self.validators) + self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" + % (steps, sampleProgress*100, nodeProgress*100, validatorProgress*100), extra=self.format) if missingSamples == oldMissingSamples: self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) missingVector.append(missingSamples) From 6616cc799f016a0ead7d1a3b703a414d45938193 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 20 Mar 2023 14:26:42 +0100 Subject: [PATCH 115/162] move traffic stats calculation to observer Signed-off-by: Csaba Kiraly --- DAS/observer.py | 13 +++++++++++++ DAS/simulator.py | 10 +++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index 0b80638..26b0632 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -1,5 +1,6 @@ #!/bin/python3 +from statistics import mean from DAS.block import * class Observer: @@ -65,3 +66,15 @@ class Observer: validatorProgress = validated / validatorCnt return missingSamples, sampleProgress, nodeProgress, validatorProgress + + def getTrafficStats(self, validators): + statsTxInSlot = [v.statsTxInSlot for v in validators] + statsRxInSlot = [v.statsRxInSlot for v in validators] + TX_prod = statsTxInSlot[0] + RX_prod = statsRxInSlot[0] + TX_avg = mean(statsTxInSlot[1:]) + TX_max = max(statsTxInSlot[1:]) + Rx_avg = mean(statsRxInSlot[1:]) + Rx_max = max(statsRxInSlot[1:]) + + return (TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max) diff --git a/DAS/simulator.py b/DAS/simulator.py index 1744bf8..82d9594 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -4,7 +4,6 @@ import networkx as nx import logging, random from functools import partial, partialmethod from datetime import datetime -from statistics import mean from DAS.tools import * from DAS.results import * from DAS.observer import * @@ -189,12 +188,9 @@ class Simulator: self.validators[i].logColumns() # log TX and RX statistics - statsTxInSlot = [v.statsTxInSlot for v in self.validators] - statsRxInSlot = [v.statsRxInSlot for v in self.validators] - self.logger.debug("step %d: TX_prod=%.1f, RX_prod=%.1f, TX_avg=%.1f, TX_max=%.1f, Rx_avg=%.1f, Rx_max=%.1f" % - (steps, statsTxInSlot[0], statsRxInSlot[0], - mean(statsTxInSlot[1:]), max(statsTxInSlot[1:]), - mean(statsRxInSlot[1:]), max(statsRxInSlot[1:])), extra=self.format) + TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max = self.glob.getTrafficStats(self.validators) + self.logger.debug("step %d: TX_prod=%.1f, RX_prod=%.1f, TX_avg=%.1f, TX_max=%.1f, Rx_avg=%.1f, Rx_max=%.1f" % + (steps, TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max), extra=self.format) for i in range(0,self.shape.numberNodes): self.validators[i].updateStats() From 7e4074938a48e5181efcabf27e5f5a6704521e90 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 20 Mar 2023 14:33:35 +0100 Subject: [PATCH 116/162] add duplicate statistics Signed-off-by: Csaba Kiraly --- DAS/observer.py | 5 ++++- DAS/simulator.py | 6 +++--- DAS/validator.py | 6 +++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index 26b0632..6af4507 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -70,11 +70,14 @@ class Observer: def getTrafficStats(self, validators): statsTxInSlot = [v.statsTxInSlot for v in validators] statsRxInSlot = [v.statsRxInSlot for v in validators] + statsRxDupInSlot = [v.statsRxDupInSlot for v in validators] TX_prod = statsTxInSlot[0] RX_prod = statsRxInSlot[0] TX_avg = mean(statsTxInSlot[1:]) TX_max = max(statsTxInSlot[1:]) Rx_avg = mean(statsRxInSlot[1:]) Rx_max = max(statsRxInSlot[1:]) + RxDup_avg = mean(statsRxDupInSlot[1:]) + RxDup_max = max(statsRxDupInSlot[1:]) - return (TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max) + return (TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max, RxDup_avg, RxDup_max) diff --git a/DAS/simulator.py b/DAS/simulator.py index 82d9594..e860d17 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -188,9 +188,9 @@ class Simulator: self.validators[i].logColumns() # log TX and RX statistics - TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max = self.glob.getTrafficStats(self.validators) - self.logger.debug("step %d: TX_prod=%.1f, RX_prod=%.1f, TX_avg=%.1f, TX_max=%.1f, Rx_avg=%.1f, Rx_max=%.1f" % - (steps, TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max), extra=self.format) + TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max, RxDup_avg, RxDup_max = self.glob.getTrafficStats(self.validators) + self.logger.info("step %d: TX_prod=%.1f, RX_prod=%.1f, TX_avg=%.1f, TX_max=%.1f, Rx_avg=%.1f, Rx_max=%.1f, RxDup_avg=%.1f, RxDup_max=%.1f" % + (steps, TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max ,RxDup_avg, RxDup_max), extra=self.format) for i in range(0,self.shape.numberNodes): self.validators[i].updateStats() diff --git a/DAS/validator.py b/DAS/validator.py index 49165a0..cfa7fac 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -79,6 +79,8 @@ class Validator: self.statsTxPerSlot = [] self.statsRxInSlot = 0 self.statsRxPerSlot = [] + self.statsRxDupInSlot = 0 + self.statsRxDupPerSlot = [] # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 @@ -163,7 +165,7 @@ class Validator: self.receivedQueue.append((rID, cID)) else: self.logger.trace("Recv DUP: %d->%d: %d,%d", src, self.ID, rID, cID, extra=self.format) - # self.statsRxDuplicateInSlot += 1 + self.statsRxDupInSlot += 1 self.statsRxInSlot += 1 def addToSendQueue(self, rID, cID): @@ -205,8 +207,10 @@ class Validator: """It updates the stats related to sent and received data.""" self.logger.debug("Stats: tx %d, rx %d", self.statsTxInSlot, self.statsRxInSlot, extra=self.format) self.statsRxPerSlot.append(self.statsRxInSlot) + self.statsRxDupPerSlot.append(self.statsRxDupInSlot) self.statsTxPerSlot.append(self.statsTxInSlot) self.statsRxInSlot = 0 + self.statsRxDupInSlot = 0 self.statsTxInSlot = 0 def checkSegmentToNeigh(self, rID, cID, neigh): From 23af30e381b7be97e7d44cf75cc2cc53849313a6 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 21 Mar 2023 08:34:28 +0100 Subject: [PATCH 117/162] add generalized metrics collection Signed-off-by: Csaba Kiraly --- DAS/observer.py | 28 +++++++++++++++------------- DAS/results.py | 4 ++++ DAS/simulator.py | 9 ++++++--- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index 6af4507..1bdf4d0 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -1,6 +1,6 @@ #!/bin/python3 -from statistics import mean +import numpy as np from DAS.block import * class Observer: @@ -68,16 +68,18 @@ class Observer: return missingSamples, sampleProgress, nodeProgress, validatorProgress def getTrafficStats(self, validators): - statsTxInSlot = [v.statsTxInSlot for v in validators] - statsRxInSlot = [v.statsRxInSlot for v in validators] - statsRxDupInSlot = [v.statsRxDupInSlot for v in validators] - TX_prod = statsTxInSlot[0] - RX_prod = statsRxInSlot[0] - TX_avg = mean(statsTxInSlot[1:]) - TX_max = max(statsTxInSlot[1:]) - Rx_avg = mean(statsRxInSlot[1:]) - Rx_max = max(statsRxInSlot[1:]) - RxDup_avg = mean(statsRxDupInSlot[1:]) - RxDup_max = max(statsRxDupInSlot[1:]) + def maxOrNan(l): + return np.max(l) if l else np.NaN - return (TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max, RxDup_avg, RxDup_max) + trafficStats = {} + for cl in range(0,3): + Tx = [v.statsTxInSlot for v in validators if v.nodeClass == cl] + Rx = [v.statsRxInSlot for v in validators if v.nodeClass == cl] + RxDup = [v.statsRxDupInSlot for v in validators if v.nodeClass == cl] + trafficStats[cl] = { + "Tx": {"mean": np.mean(Tx), "max": maxOrNan(Tx)}, + "Rx": {"mean": np.mean(Rx), "max": maxOrNan(Rx)}, + "RxDup": {"mean": np.mean(RxDup), "max": maxOrNan(RxDup)}, + } + + return trafficStats diff --git a/DAS/results.py b/DAS/results.py index 0efe26d..61f4f04 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -13,6 +13,7 @@ class Result: self.blockAvailable = -1 self.tta = -1 self.missingVector = [] + self.metrics = {} def populate(self, shape, missingVector): """It populates part of the result data inside a vector.""" @@ -26,6 +27,9 @@ class Result: self.blockAvailable = 0 self.tta = -1 + def addMetric(self, name, metric): + self.metrics[name] = metric + def dump(self, execID): """It dumps the results of the simulation in an XML file.""" if not os.path.exists("results"): diff --git a/DAS/simulator.py b/DAS/simulator.py index e860d17..4bd0242 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -168,6 +168,7 @@ class Simulator: arrived, expected, ready, validated = self.glob.checkStatus(self.validators) missingSamples = expected - arrived missingVector = [] + trafficStatsVector = [] steps = 0 while(True): missingVector.append(missingSamples) @@ -188,11 +189,12 @@ class Simulator: self.validators[i].logColumns() # log TX and RX statistics - TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max, RxDup_avg, RxDup_max = self.glob.getTrafficStats(self.validators) - self.logger.info("step %d: TX_prod=%.1f, RX_prod=%.1f, TX_avg=%.1f, TX_max=%.1f, Rx_avg=%.1f, Rx_max=%.1f, RxDup_avg=%.1f, RxDup_max=%.1f" % - (steps, TX_prod, RX_prod, TX_avg, TX_max, Rx_avg, Rx_max ,RxDup_avg, RxDup_max), extra=self.format) + trafficStats = self.glob.getTrafficStats(self.validators) + self.logger.debug("step %d: %s" % + (steps, trafficStats), extra=self.format) for i in range(0,self.shape.numberNodes): self.validators[i].updateStats() + trafficStatsVector.append(trafficStats) missingSamples, sampleProgress, nodeProgress, validatorProgress = self.glob.getProgress(self.validators) self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" @@ -209,5 +211,6 @@ class Simulator: steps += 1 self.result.populate(self.shape, missingVector) + self.result.addMetric("trafficStats", trafficStatsVector) return self.result From eb4f451303e3fc14bbf6aa3f0c6de4ea5039d63f Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 27 Mar 2023 23:11:40 +0200 Subject: [PATCH 118/162] save progress and traffic statistics to XML Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 31 ++++++++++++++++++++++++++++++- config_example.py | 3 +++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 4bd0242..677a260 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -2,6 +2,7 @@ import networkx as nx import logging, random +import pandas as pd from functools import partial, partialmethod from datetime import datetime from DAS.tools import * @@ -168,6 +169,7 @@ class Simulator: arrived, expected, ready, validated = self.glob.checkStatus(self.validators) missingSamples = expected - arrived missingVector = [] + progressVector = [] trafficStatsVector = [] steps = 0 while(True): @@ -199,6 +201,31 @@ class Simulator: missingSamples, sampleProgress, nodeProgress, validatorProgress = self.glob.getProgress(self.validators) self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" % (steps, sampleProgress*100, nodeProgress*100, validatorProgress*100), extra=self.format) + + cnS = "samples received" + cnN = "nodes ready" + cnV = "validators ready" + cnT0 = "TX builder mean" + cnT1 = "TX class1 mean" + cnT2 = "TX class2 mean" + cnR1 = "RX class1 mean" + cnR2 = "RX class2 mean" + cnD1 = "Dup class1 mean" + cnD2 = "Dup class2 mean" + + progressVector.append({ + cnS:sampleProgress, + cnN:nodeProgress, + cnV:validatorProgress, + cnT0: trafficStats[0]["Tx"]["mean"], + cnT1: trafficStats[1]["Tx"]["mean"], + cnT2: trafficStats[2]["Tx"]["mean"], + cnR1: trafficStats[1]["Rx"]["mean"], + cnR2: trafficStats[2]["Rx"]["mean"], + cnD1: trafficStats[1]["RxDup"]["mean"], + cnD2: trafficStats[2]["RxDup"]["mean"], + }) + if missingSamples == oldMissingSamples: self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) missingVector.append(missingSamples) @@ -210,7 +237,9 @@ class Simulator: else: steps += 1 + progress = pd.DataFrame(progressVector) + if self.config.saveProgress: + self.result.addMetric("progress", progress.to_dict(orient='list')) self.result.populate(self.shape, missingVector) - self.result.addMetric("trafficStats", trafficStatsVector) return self.result diff --git a/config_example.py b/config_example.py index af55fc2..5b1a396 100644 --- a/config_example.py +++ b/config_example.py @@ -19,6 +19,9 @@ import numpy as np from DAS.shape import Shape dumpXML = 1 + +# save progress vectors to XML +saveProgress = 1 visualization = 1 logLevel = logging.INFO From dc51727b329ede185e7008e6d5a0f88b4e611025 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 27 Mar 2023 23:16:05 +0200 Subject: [PATCH 119/162] plot progress per run Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 14 +++++++++++++- config_example.py | 4 ++++ study.py | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 677a260..c2f4654 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -3,6 +3,7 @@ import networkx as nx import logging, random import pandas as pd +import matplotlib from functools import partial, partialmethod from datetime import datetime from DAS.tools import * @@ -13,7 +14,7 @@ from DAS.validator import * class Simulator: """This class implements the main DAS simulator.""" - def __init__(self, shape, config): + def __init__(self, shape, config, execID): """It initializes the simulation with a set of parameters (shape).""" self.shape = shape self.config = config @@ -24,6 +25,7 @@ class Simulator: self.logLevel = config.logLevel self.proposerID = 0 self.glob = [] + self.execID = execID # In GossipSub the initiator might push messages without participating in the mesh. # proposerPublishOnly regulates this behavior. If set to true, the proposer is not @@ -240,6 +242,16 @@ class Simulator: progress = pd.DataFrame(progressVector) if self.config.saveProgress: self.result.addMetric("progress", progress.to_dict(orient='list')) + if self.config.plotProgress: + progress.plot.line(subplots = [[cnS, cnN, cnV], [cnT0], [cnT1, cnR1, cnD1], [cnT2, cnR2, cnD2]], + title = str(self.shape)) + if not os.path.exists("results"): + os.makedirs("results") + if not os.path.exists("results/"+self.execID): + os.makedirs("results/"+self.execID) + filePath = "results/"+self.execID+"/"+str(self.shape)+".png" + matplotlib.pyplot.savefig(filePath) + self.result.populate(self.shape, missingVector) return self.result diff --git a/config_example.py b/config_example.py index 5b1a396..461ee36 100644 --- a/config_example.py +++ b/config_example.py @@ -22,6 +22,10 @@ dumpXML = 1 # save progress vectors to XML saveProgress = 1 + +# plot progress for each run to PNG +plotProgress = 1 + visualization = 1 logLevel = logging.INFO diff --git a/study.py b/study.py index fde8099..aa27a5f 100644 --- a/study.py +++ b/study.py @@ -28,7 +28,7 @@ def runOnce(config, shape, execID): shape.setSeed(config.randomSeed+"-"+str(shape)) random.seed(shape.randomSeed) - sim = Simulator(shape, config) + sim = Simulator(shape, config, execID) sim.initLogger() sim.initValidators() sim.initNetwork() From 04ad03f1751168368d17eaadd6da70e04d24d2dd Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 27 Mar 2023 23:27:49 +0200 Subject: [PATCH 120/162] fixup: avoid warning on mean if empty Signed-off-by: Csaba Kiraly --- DAS/observer.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index 1bdf4d0..18c0461 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -70,6 +70,8 @@ class Observer: def getTrafficStats(self, validators): def maxOrNan(l): return np.max(l) if l else np.NaN + def meanOrNan(l): + return np.mean(l) if l else np.NaN trafficStats = {} for cl in range(0,3): @@ -77,9 +79,9 @@ class Observer: Rx = [v.statsRxInSlot for v in validators if v.nodeClass == cl] RxDup = [v.statsRxDupInSlot for v in validators if v.nodeClass == cl] trafficStats[cl] = { - "Tx": {"mean": np.mean(Tx), "max": maxOrNan(Tx)}, - "Rx": {"mean": np.mean(Rx), "max": maxOrNan(Rx)}, - "RxDup": {"mean": np.mean(RxDup), "max": maxOrNan(RxDup)}, + "Tx": {"mean": meanOrNan(Tx), "max": maxOrNan(Tx)}, + "Rx": {"mean": meanOrNan(Rx), "max": maxOrNan(Rx)}, + "RxDup": {"mean": meanOrNan(RxDup), "max": maxOrNan(RxDup)}, } return trafficStats From 75a9b484e915f5a804486936a50d25acc1c54793 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 27 Mar 2023 23:28:12 +0200 Subject: [PATCH 121/162] fixup: close plot to release memory Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 1 + 1 file changed, 1 insertion(+) diff --git a/DAS/simulator.py b/DAS/simulator.py index c2f4654..04d1eca 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -251,6 +251,7 @@ class Simulator: os.makedirs("results/"+self.execID) filePath = "results/"+self.execID+"/"+str(self.shape)+".png" matplotlib.pyplot.savefig(filePath) + matplotlib.pyplot.close() self.result.populate(self.shape, missingVector) return self.result From f85cdb401bf3682c916812d79c35f10bb6738406 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 29 Mar 2023 15:49:52 +0200 Subject: [PATCH 122/162] fix line allocation when evenLineDistribution=True vector should have chi elements for each validator Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index a6788b8..c58b20f 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -46,8 +46,9 @@ class Simulator: lightVal = int(self.shape.numberNodes * self.shape.class1ratio * self.shape.vpn1) heavyVal = int(self.shape.numberNodes * (1-self.shape.class1ratio) * self.shape.vpn2) totalValidators = lightVal + heavyVal - rows = list(range(self.shape.blockSize)) * (int(totalValidators/self.shape.blockSize)+1) - columns = list(range(self.shape.blockSize)) * (int(totalValidators/self.shape.blockSize)+1) + totalRows = totalValidators * self.shape.chi + rows = list(range(self.shape.blockSize)) * (int(totalRows/self.shape.blockSize)+1) + columns = list(range(self.shape.blockSize)) * (int(totalRows/self.shape.blockSize)+1) offset = heavyVal*self.shape.chi random.shuffle(rows) random.shuffle(columns) From 9f3089c232d941b897a8393a5671c0bb557ff5b1 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 29 Mar 2023 15:54:44 +0200 Subject: [PATCH 123/162] rowIDs and columnIDs are sets Fixes issue 29, where multiple instances of an ID in rowIDs created a topology with nodes with a huge degree. This huge degree then created lots of duplicates, eating up available bandwidth. Signed-off-by: Csaba Kiraly --- DAS/validator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 49165a0..32ef149 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -69,8 +69,8 @@ class Validator: # random.seed(self.ID) self.nodeClass = 1 if (self.ID <= shape.numberNodes * shape.class1ratio) else 2 self.vpn = self.shape.vpn1 if (self.nodeClass == 1) else self.shape.vpn2 - self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) - self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) + self.rowIDs = set(rows) if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) + self.columnIDs = set(columns) if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) From cb0a3ea1bac38810d065a6d5e6346ffa6ca71671 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 27 Mar 2023 23:27:49 +0200 Subject: [PATCH 124/162] fixup: avoid warning on mean if empty Signed-off-by: Csaba Kiraly --- DAS/observer.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index 1bdf4d0..18c0461 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -70,6 +70,8 @@ class Observer: def getTrafficStats(self, validators): def maxOrNan(l): return np.max(l) if l else np.NaN + def meanOrNan(l): + return np.mean(l) if l else np.NaN trafficStats = {} for cl in range(0,3): @@ -77,9 +79,9 @@ class Observer: Rx = [v.statsRxInSlot for v in validators if v.nodeClass == cl] RxDup = [v.statsRxDupInSlot for v in validators if v.nodeClass == cl] trafficStats[cl] = { - "Tx": {"mean": np.mean(Tx), "max": maxOrNan(Tx)}, - "Rx": {"mean": np.mean(Rx), "max": maxOrNan(Rx)}, - "RxDup": {"mean": np.mean(RxDup), "max": maxOrNan(RxDup)}, + "Tx": {"mean": meanOrNan(Tx), "max": maxOrNan(Tx)}, + "Rx": {"mean": meanOrNan(Rx), "max": maxOrNan(Rx)}, + "RxDup": {"mean": meanOrNan(RxDup), "max": maxOrNan(RxDup)}, } return trafficStats From e285890fa734fcc2f9db7e06a4155a88de34071a Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 29 Mar 2023 16:42:09 +0200 Subject: [PATCH 125/162] Fixes allocation bug, remove duplicates in rowIDs and columnIDs, add diagnostics when the block is not available. Add number of steps without progress to stop condition. --- DAS/simulator.py | 78 ++++++++++++++++++++++++++++++++++++++--------- config_example.py | 6 ++++ 2 files changed, 70 insertions(+), 14 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 04d1eca..6ec3bfa 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -48,11 +48,19 @@ class Simulator: lightVal = int(self.shape.numberNodes * self.shape.class1ratio * self.shape.vpn1) heavyVal = int(self.shape.numberNodes * (1-self.shape.class1ratio) * self.shape.vpn2) totalValidators = lightVal + heavyVal - rows = list(range(self.shape.blockSize)) * (int(totalValidators/self.shape.blockSize)+1) - columns = list(range(self.shape.blockSize)) * (int(totalValidators/self.shape.blockSize)+1) + totalRows = totalValidators * self.shape.chi + rows = list(range(self.shape.blockSize)) * (int(totalRows/self.shape.blockSize)+1) + columns = list(range(self.shape.blockSize)) * (int(totalRows/self.shape.blockSize)+1) offset = heavyVal*self.shape.chi random.shuffle(rows) random.shuffle(columns) + self.logger.debug("There is a total of %d validators" % totalValidators, extra=self.format) + self.logger.debug("Shuffling a total of %d rows/columns" % len(rows), extra=self.format) + self.logger.debug("Shuffled rows: %s" % str(rows), extra=self.format) + self.logger.debug("Shuffled columns: %s" % str(columns), extra=self.format) + + assignatedRows = [] + assignatedCols = [] for i in range(self.shape.numberNodes): if self.config.evenLineDistribution: if i < int(heavyVal/self.shape.vpn2): # First start with the heavy nodes @@ -62,9 +70,17 @@ class Simulator: j = i - int(heavyVal/self.shape.vpn2) start = offset+( j *self.shape.chi) end = offset+((j+1)*self.shape.chi) - r = rows[start:end] - c = columns[start:end] + # Remove duplicates + r = list(dict.fromkeys(rows[start:end])) + c = list(dict.fromkeys(columns[start:end])) + r.sort() + c.sort() val = Validator(i, int(not i!=0), self.logger, self.shape, r, c) + self.logger.debug("Validators %d row IDs: %s" % (val.ID, val.rowIDs), extra=self.format) + self.logger.debug("Validators %d column IDs: %s" % (val.ID, val.columnIDs), extra=self.format) + assignatedRows = assignatedRows + r + assignatedCols = assignatedCols + c + else: val = Validator(i, int(not i!=0), self.logger, self.shape) if i == self.proposerID: @@ -72,6 +88,11 @@ class Simulator: else: val.logIDs() self.validators.append(val) + + assignatedRows.sort() + assignatedCols.sort() + self.logger.debug("Rows assignated: %s" % str(assignatedRows), extra=self.format) + self.logger.debug("Columns assignated: %s" % str(assignatedCols), extra=self.format) self.logger.debug("Validators initialized.", extra=self.format) def initNetwork(self): @@ -86,12 +107,14 @@ class Simulator: columnChannels[id].append(v) # Check rows/columns distribution - #totalR = 0 - #totalC = 0 - #for r in rowChannels: - # totalR += len(r) - #for c in columnChannels: - # totalC += len(c) + distR = [] + distC = [] + for r in rowChannels: + distR.append(len(r)) + for c in columnChannels: + distC.append(len(c)) + self.logger.debug("Number of validators per row; Min: %d, Max: %d" % (min(distR), max(distR)), extra=self.format) + self.logger.debug("Number of validators per column; Min: %d, Max: %d" % (min(distC), max(distC)), extra=self.format) for id in range(self.shape.blockSize): @@ -164,6 +187,29 @@ class Simulator: logger.addHandler(ch) self.logger = logger + def printDiagnostics(self): + """Print all required diagnostics to check when a block does not become available""" + for val in self.validators: + (a, e) = val.checkStatus() + if e-a > 0 and val.ID != 0: + self.logger.warning("Node %d is missing %d samples" % (val.ID, e-a), extra=self.format) + for r in val.rowIDs: + row = val.getRow(r) + if row.count() < len(row): + self.logger.debug("Row %d: %s" % (r, str(row)), extra=self.format) + neiR = val.rowNeighbors[r] + for nr in neiR: + self.logger.debug("Row %d, Neighbor %d sent: %s" % (r, val.rowNeighbors[r][nr].node.ID, val.rowNeighbors[r][nr].received), extra=self.format) + self.logger.debug("Row %d, Neighbor %d has: %s" % (r, val.rowNeighbors[r][nr].node.ID, self.validators[val.rowNeighbors[r][nr].node.ID].getRow(r)), extra=self.format) + for c in val.columnIDs: + col = val.getColumn(c) + if col.count() < len(col): + self.logger.debug("Column %d: %s" % (c, str(col)), extra=self.format) + neiC = val.columnNeighbors[c] + for nc in neiC: + self.logger.debug("Column %d, Neighbor %d sent: %s" % (c, val.columnNeighbors[c][nc].node.ID, val.columnNeighbors[c][nc].received), extra=self.format) + self.logger.debug("Column %d, Neighbor %d has: %s" % (c, val.columnNeighbors[c][nc].node.ID, self.validators[val.columnNeighbors[c][nc].node.ID].getColumn(c)), extra=self.format) + def run(self): """It runs the main simulation until the block is available or it gets stucked.""" self.glob.checkRowsColumns(self.validators) @@ -194,14 +240,14 @@ class Simulator: # log TX and RX statistics trafficStats = self.glob.getTrafficStats(self.validators) - self.logger.debug("step %d: %s" % + self.logger.debug("step %d: %s" % (steps, trafficStats), extra=self.format) for i in range(0,self.shape.numberNodes): self.validators[i].updateStats() trafficStatsVector.append(trafficStats) missingSamples, sampleProgress, nodeProgress, validatorProgress = self.glob.getProgress(self.validators) - self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" + self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" % (steps, sampleProgress*100, nodeProgress*100, validatorProgress*100), extra=self.format) cnS = "samples received" @@ -229,9 +275,13 @@ class Simulator: }) if missingSamples == oldMissingSamples: - self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) + if len(missingVector) > self.config.steps4StopCondition: + if missingSamples == missingVector[len(missingVector)-1-self.config.steps4StopCondition]: + self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) + if self.config.diagnostics: + self.printDiagnostics() + break missingVector.append(missingSamples) - break elif missingSamples == 0: #self.logger.info("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) missingVector.append(missingSamples) diff --git a/config_example.py b/config_example.py index 461ee36..d07a899 100644 --- a/config_example.py +++ b/config_example.py @@ -74,6 +74,12 @@ deterministic = False # If your run is deterministic you can decide the random seed. This is ignore otherwise. randomSeed = "DAS" +# If True, print diagnostics when the block is not available +diagnostics = False + +# Number of steps without progress to stop simulation +steps4StopCondition = 7 + def nextShape(): for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nn, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberNodes, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): From 98db10f7a6a095036416df4f991bbdd816127e17 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 30 Mar 2023 00:01:06 +0200 Subject: [PATCH 126/162] Add more documentation Signed-off-by: Csaba Kiraly --- DAS/observer.py | 12 ++++++++++++ DAS/results.py | 1 + 2 files changed, 13 insertions(+) diff --git a/DAS/observer.py b/DAS/observer.py index 18c0461..235ed60 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -58,6 +58,17 @@ class Observer: return (arrived, expected, ready, validated) def getProgress(self, validators): + """Calculate current simulation progress with different metrics. + + Returns: + - missingSamples: overall number of sample instances missing in nodes. + Sample are counted on both rows and columns, so intersections of interest are counted twice. + - sampleProgress: previous expressed as progress ratio + - nodeProgress: ratio of nodes having all segments interested in + - validatorProgress: same as above, but vpn weighted average. I.e. it counts per validator, + but counts a validator only if its support node's all validators see all interesting segments + TODO: add real per validator progress counter + """ arrived, expected, ready, validated = self.checkStatus(validators) missingSamples = expected - arrived sampleProgress = arrived / expected @@ -68,6 +79,7 @@ class Observer: return missingSamples, sampleProgress, nodeProgress, validatorProgress def getTrafficStats(self, validators): + """Summary statistics of traffic measurements in a timestep.""" def maxOrNan(l): return np.max(l) if l else np.NaN def meanOrNan(l): diff --git a/DAS/results.py b/DAS/results.py index 61f4f04..c5687a5 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -28,6 +28,7 @@ class Result: self.tta = -1 def addMetric(self, name, metric): + """Generic function to add a metric to the results.""" self.metrics[name] = metric def dump(self, execID): From 9800161ac91576a63ce99121c454c2361400d9ed Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Mon, 27 Mar 2023 15:29:39 +0200 Subject: [PATCH 127/162] Switch from time steps to miliseconds. Rebase to traffic progress. --- DAS/results.py | 15 ++++++++------- DAS/simulator.py | 13 +++++++------ DAS/visualizer.py | 6 ++++-- config_example.py | 15 +++++++++------ study.py | 4 ++-- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/DAS/results.py b/DAS/results.py index c5687a5..48512cd 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -7,22 +7,23 @@ from dicttoxml import dicttoxml class Result: """This class stores and process/store the results of a simulation.""" - def __init__(self, shape): + def __init__(self, shape, execID): """It initializes the instance with a specific shape.""" self.shape = shape + self.execID = execID self.blockAvailable = -1 self.tta = -1 self.missingVector = [] self.metrics = {} - def populate(self, shape, missingVector): + def populate(self, shape, config, missingVector): """It populates part of the result data inside a vector.""" self.shape = shape self.missingVector = missingVector missingSamples = missingVector[-1] if missingSamples == 0: self.blockAvailable = 1 - self.tta = len(missingVector) + self.tta = len(missingVector) * (1000/config.stepDuration) else: self.blockAvailable = 0 self.tta = -1 @@ -31,12 +32,12 @@ class Result: """Generic function to add a metric to the results.""" self.metrics[name] = metric - def dump(self, execID): + def dump(self): """It dumps the results of the simulation in an XML file.""" if not os.path.exists("results"): os.makedirs("results") - if not os.path.exists("results/"+execID): - os.makedirs("results/"+execID) + if not os.path.exists("results/"+self.execID): + os.makedirs("results/"+self.execID) resd1 = self.shape.__dict__ resd2 = self.__dict__.copy() resd2.pop("shape") @@ -44,6 +45,6 @@ class Result: resXml = dicttoxml(resd1) xmlstr = minidom.parseString(resXml) xmlPretty = xmlstr.toprettyxml() - filePath = "results/"+execID+"/"+str(self.shape)+".xml" + filePath = "results/"+self.execID+"/"+str(self.shape)+".xml" with open(filePath, "w") as f: f.write(xmlPretty) diff --git a/DAS/simulator.py b/DAS/simulator.py index 677a260..4acf3f5 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -13,12 +13,13 @@ from DAS.validator import * class Simulator: """This class implements the main DAS simulator.""" - def __init__(self, shape, config): + def __init__(self, shape, config, execID): """It initializes the simulation with a set of parameters (shape).""" self.shape = shape self.config = config self.format = {"entity": "Simulator"} - self.result = Result(self.shape) + self.execID = execID + self.result = Result(self.shape, self.execID) self.validators = [] self.logger = [] self.logLevel = config.logLevel @@ -192,14 +193,14 @@ class Simulator: # log TX and RX statistics trafficStats = self.glob.getTrafficStats(self.validators) - self.logger.debug("step %d: %s" % + self.logger.debug("step %d: %s" % (steps, trafficStats), extra=self.format) for i in range(0,self.shape.numberNodes): self.validators[i].updateStats() trafficStatsVector.append(trafficStats) missingSamples, sampleProgress, nodeProgress, validatorProgress = self.glob.getProgress(self.validators) - self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" + self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" % (steps, sampleProgress*100, nodeProgress*100, validatorProgress*100), extra=self.format) cnS = "samples received" @@ -231,7 +232,7 @@ class Simulator: missingVector.append(missingSamples) break elif missingSamples == 0: - #self.logger.info("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) + self.logger.debug("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) missingVector.append(missingSamples) break else: @@ -240,6 +241,6 @@ class Simulator: progress = pd.DataFrame(progressVector) if self.config.saveProgress: self.result.addMetric("progress", progress.to_dict(orient='list')) - self.result.populate(self.shape, missingVector) + self.result.populate(self.shape, self.config, missingVector) return self.result diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 8afd006..db4b2d5 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -36,7 +36,7 @@ class Visualizer: bwUplinkProd = int(root.find('bwUplinkProd').text) bwUplink1 = int(root.find('bwUplink1').text) bwUplink2 = int(root.find('bwUplink2').text) - tta = int(root.find('tta').text) + tta = float(root.find('tta').text) # Loop over all possible combinations of of the parameters minus two for combination in combinations(self.parameters, len(self.parameters)-2): @@ -120,7 +120,7 @@ class Visualizer: hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas']) hist = hist.T fig, ax = plt.subplots(figsize=(10, 6)) - sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax) + sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability (ms)'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax) plt.xlabel(self.formatLabel(labels[0])) plt.ylabel(self.formatLabel(labels[1])) filename = "" @@ -131,6 +131,8 @@ class Visualizer: filename += f"{key[paramValueCnt]}" formattedTitle = self.formatTitle(key[paramValueCnt]) title += formattedTitle + if (paramValueCnt+1) % 5 == 0: + title += "\n" paramValueCnt += 1 title_obj = plt.title(title) font_size = 16 * fig.get_size_inches()[0] / 10 diff --git a/config_example.py b/config_example.py index 5b1a396..3ff5ae8 100644 --- a/config_example.py +++ b/config_example.py @@ -27,14 +27,14 @@ logLevel = logging.INFO # number of parallel workers. -1: all cores; 1: sequential # for more details, see joblib.Parallel -numJobs = 3 +numJobs = -1 # distribute rows/columns evenly between validators (True) # or generate it using local randomness (False) evenLineDistribution = True # Number of simulation runs with the same parameters for statistical relevance -runs = range(10) +runs = range(2) # Number of validators numberNodes = range(256, 513, 128) @@ -49,14 +49,14 @@ blockSizes = range(32,65,16) netDegrees = range(6, 9, 2) # number of rows and columns a validator is interested in -chis = range(1, 5, 2) +chis = range(2, 5, 2) # ratio of class1 nodes (see below for parameters per class) -class1ratios = np.arange(0, 1, .2) +class1ratios = [0.8, 0.9] # Number of validators per beacon node validatorsPerNode1 = [1] -validatorsPerNode2 = [2, 4, 8, 16, 32] +validatorsPerNode2 = [500] # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 @@ -64,8 +64,11 @@ bwUplinksProd = [2200] bwUplinks1 = [110] bwUplinks2 = [2200] +# Step duration in miliseconds (Classic RTT is about 100ms) +stepDuration = 50 + # Set to True if you want your run to be deterministic, False if not -deterministic = False +deterministic = True # If your run is deterministic you can decide the random seed. This is ignore otherwise. randomSeed = "DAS" diff --git a/study.py b/study.py index fde8099..74dba63 100644 --- a/study.py +++ b/study.py @@ -28,7 +28,7 @@ def runOnce(config, shape, execID): shape.setSeed(config.randomSeed+"-"+str(shape)) random.seed(shape.randomSeed) - sim = Simulator(shape, config) + sim = Simulator(shape, config, execID) sim.initLogger() sim.initValidators() sim.initNetwork() @@ -36,7 +36,7 @@ def runOnce(config, shape, execID): sim.logger.info("Shape: %s ... Block Available: %d in %d steps" % (str(sim.shape.__dict__), result.blockAvailable, len(result.missingVector)), extra=sim.format) if config.dumpXML: - result.dump(execID) + result.dump() return result From 41e83991591eab9d9d8ea2e787c0064628c10cd0 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Mon, 27 Mar 2023 21:24:25 +0200 Subject: [PATCH 128/162] Add Tx and Rx stats to resultsi. Rebase to traffic progress. --- DAS/results.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/DAS/results.py b/DAS/results.py index 48512cd..469810c 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -16,10 +16,16 @@ class Result: self.missingVector = [] self.metrics = {} - def populate(self, shape, config, missingVector): + def populate(self, shape, config, missingVector, bandwidthVector): """It populates part of the result data inside a vector.""" self.shape = shape self.missingVector = missingVector + self.proTx = bandwidthVector[0] + self.proRx = bandwidthVector[1] + self.aveTx = bandwidthVector[2] + self.maxTx = bandwidthVector[3] + self.aveRx = bandwidthVector[4] + self.maxRx = bandwidthVector[5] missingSamples = missingVector[-1] if missingSamples == 0: self.blockAvailable = 1 From b5390b9f1b8d777f8df75a1174fe757e759255a8 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 29 Mar 2023 17:01:28 +0200 Subject: [PATCH 129/162] Remove traffic statsi. Rebase to traffic progress. --- DAS/results.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/DAS/results.py b/DAS/results.py index 469810c..48512cd 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -16,16 +16,10 @@ class Result: self.missingVector = [] self.metrics = {} - def populate(self, shape, config, missingVector, bandwidthVector): + def populate(self, shape, config, missingVector): """It populates part of the result data inside a vector.""" self.shape = shape self.missingVector = missingVector - self.proTx = bandwidthVector[0] - self.proRx = bandwidthVector[1] - self.aveTx = bandwidthVector[2] - self.maxTx = bandwidthVector[3] - self.aveRx = bandwidthVector[4] - self.maxRx = bandwidthVector[5] missingSamples = missingVector[-1] if missingSamples == 0: self.blockAvailable = 1 From 795bb1d10d189315c310014ba857f959df8d2c8b Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 30 Mar 2023 13:15:42 +0200 Subject: [PATCH 130/162] Move set to simulator for future diagnostic purposes --- DAS/simulator.py | 6 ++++-- DAS/validator.py | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index c58b20f..5aac495 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -61,8 +61,10 @@ class Simulator: j = i - int(heavyVal/self.shape.vpn2) start = offset+( j *self.shape.chi) end = offset+((j+1)*self.shape.chi) - r = rows[start:end] - c = columns[start:end] + r = list(set(rows[start:end])) + c = list(set(columns[start:end])) + r.sort() + c.sort() val = Validator(i, int(not i!=0), self.logger, self.shape, r, c) else: val = Validator(i, int(not i!=0), self.logger, self.shape) diff --git a/DAS/validator.py b/DAS/validator.py index 32ef149..49165a0 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -69,8 +69,8 @@ class Validator: # random.seed(self.ID) self.nodeClass = 1 if (self.ID <= shape.numberNodes * shape.class1ratio) else 2 self.vpn = self.shape.vpn1 if (self.nodeClass == 1) else self.shape.vpn2 - self.rowIDs = set(rows) if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) - self.columnIDs = set(columns) if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) + self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) + self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) From 89368d5fbe441b74950e0d9a2987f726a5a0a54b Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Thu, 30 Mar 2023 11:24:30 +0000 Subject: [PATCH 131/162] fixed bug and generalized averaging --- DAS/visualizer.py | 79 +++++++++++++++++++++++++++++++---------------- config_example.py | 18 +++++------ 2 files changed, 62 insertions(+), 35 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index c44d32a..be05ed0 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -6,19 +6,21 @@ import matplotlib.pyplot as plt import numpy as np import seaborn as sns from itertools import combinations +from config_example import runs class Visualizer: def __init__(self, execID): self.execID = execID self.folderPath = "results/"+self.execID - self.parameters = ['run', 'blockSize', 'failureRate', 'numberNodes', 'netDegree', - 'chi', 'vpn1', 'vpn2', 'bwUplinkProd', 'bwUplink1', 'bwUplink2'] + self.parameters = ['run', 'blockSize', 'failureRate', 'numberNodes', 'netDegree', 'chi', 'vpn1', 'vpn2', 'class1ratio', 'bwUplinkProd', 'bwUplink1', 'bwUplink2'] self.minimumDataPoints = 2 + self.maxTTA = 999 def plottingData(self): """Store data with a unique key for each params combination""" data = {} + bw = [] """Loop over the xml files in the folder""" for filename in os.listdir(self.folderPath): """Loop over the xmls and store the data in variables""" @@ -29,6 +31,7 @@ class Visualizer: blockSize = int(root.find('blockSize').text) failureRate = int(root.find('failureRate').text) numberNodes = int(root.find('numberNodes').text) + class1ratio = float(root.find('class1ratio').text) netDegree = int(root.find('netDegree').text) chi = int(root.find('chi').text) vpn1 = int(root.find('vpn1').text) @@ -38,25 +41,31 @@ class Visualizer: bwUplink2 = int(root.find('bwUplink2').text) tta = int(root.find('tta').text) - """Loop over all possible combinations of length 4 of the parameters""" + # if tta == -1: + # tta = self.maxTTA + + """Store BW""" + bw.append(bwUplinkProd) + + """Loop over all possible combinations of length of the parameters minus x, y params""" for combination in combinations(self.parameters, len(self.parameters)-2): # Get the indices and values of the parameters in the combination indices = [self.parameters.index(element) for element in combination] - selectedValues = [run, blockSize, failureRate, numberNodes, netDegree, chi, vpn1, vpn2, bwUplinkProd, bwUplink1, bwUplink2] + selectedValues = [run, blockSize, failureRate, numberNodes, netDegree, chi, vpn1, vpn2, class1ratio, bwUplinkProd, bwUplink1, bwUplink2] values = [selectedValues[index] for index in indices] names = [self.parameters[i] for i in indices] keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] key = tuple(keyComponents[:len(self.parameters)-2]) - """Get the names of the other 2 parameters that are not included in the key""" + """Get the names of the other parameters that are not included in the key""" otherParams = [self.parameters[i] for i in range(len(self.parameters)) if i not in indices] - """Append the values of the other 2 parameters and the ttas to the lists for the key""" + """Append the values of the other parameters and the ttas to the lists for the key""" otherIndices = [i for i in range(len(self.parameters)) if i not in indices] """Initialize the dictionary for the key if it doesn't exist yet""" if key not in data: data[key] = {} - """Initialize lists for the other 2 parameters and the ttas with the key""" + """Initialize lists for the other parameters and the ttas with the key""" data[key][otherParams[0]] = [] data[key][otherParams[1]] = [] data[key]['ttas'] = [] @@ -73,14 +82,14 @@ class Visualizer: print("Getting data from the folder...") return data - def averageRuns(self, data): + def averageRuns(self, data, runs): """Get the average of run 0 and run 1 for each key""" newData = {} for key, value in data.items(): runExists = False """Check if the key contains 'run_' with a numerical value""" for item in key: - if item.startswith('run_0'): + if item.startswith('run_'): runExists = True break if runExists: @@ -88,20 +97,20 @@ class Visualizer: """Create a new key with the other items in the tuple""" if item.startswith('run_'): newKey = tuple([x for x in key if x != item]) - key0 = ('run_0',) + newKey - data0 = data[key0] - key1 = ('run_1',) + newKey - data1 = data[key1] + """Average the similar key values""" + total = [0] * len(data[key]['ttas']) + for i in range(runs): + key0 = (f'run_{i}',) + newKey + for cnt, tta in enumerate(data[key0]['ttas']): + total[cnt] += tta + for i in range(len(total)): + total[i] = total[i]/runs averages = {} - for key in data0.keys(): - if key in data1: - values = [] - for i in range(len(data0[key])): - value = (data0[key][i] + data1[key][i]) / 2.0 - if isinstance(data0[key][i], int) and isinstance(data1[key][i], int) and key != 'ttas': - value = int(value) - values.append(value) - averages[key] = values + for subkey in data[key].keys(): + if subkey == 'ttas': + averages[subkey] = total + else: + averages[subkey] = data[key][subkey] newData[newKey] = averages print("Getting the average of the runs...") return newData @@ -135,9 +144,12 @@ class Visualizer: def plotHeatmaps(self): """Plot and store the 2D heatmaps in subfolders""" - data = self.plottingData() - data = self.averageRuns(data) + data= self.plottingData() + """Average the runs if needed""" + if(len(runs) > 1): + data = self.averageRuns(data, len(runs)) filteredKeys = self.similarKeys(data) + vmin, vmax = 0, self.maxTTA print("Plotting heatmaps...") """Create the directory if it doesn't exist already""" @@ -152,10 +164,10 @@ class Visualizer: ylabels = np.sort(np.unique(data[key][labels[1]])) if len(xlabels) < self.minimumDataPoints or len(ylabels) < self.minimumDataPoints: continue - hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas']) + hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas'], normed=False) hist = hist.T fig, ax = plt.subplots(figsize=(10, 6)) - sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax) + sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax, vmin=vmin, vmax=vmax) plt.xlabel(self.formatLabel(labels[0])) plt.ylabel(self.formatLabel(labels[1])) filename = "" @@ -177,3 +189,18 @@ class Visualizer: plt.savefig(os.path.join(targetFolder, filename)) plt.close() plt.clf() + + def plotHist(self, bandwidth): + """Plot Bandwidth Frequency Histogram""" + plt.hist(bandwidth, bins=5) + plt.xlabel('Bandwidth') + plt.ylabel('Frequency') + plt.title('Bandwidth Histogram') + + """Create the directory if it doesn't exist already""" + histogramFolder = self.folderPath + '/histogram' + if not os.path.exists(histogramFolder): + os.makedirs(histogramFolder) + filename = os.path.join(histogramFolder, 'histogram.png') + plt.savefig(filename) + plt.clf() \ No newline at end of file diff --git a/config_example.py b/config_example.py index af55fc2..9e99c18 100644 --- a/config_example.py +++ b/config_example.py @@ -24,36 +24,36 @@ logLevel = logging.INFO # number of parallel workers. -1: all cores; 1: sequential # for more details, see joblib.Parallel -numJobs = 3 +numJobs = -1 # distribute rows/columns evenly between validators (True) # or generate it using local randomness (False) evenLineDistribution = True # Number of simulation runs with the same parameters for statistical relevance -runs = range(10) +runs = range(3) # Number of validators -numberNodes = range(256, 513, 128) +numberNodes = range(256, 313, 128) # Percentage of block not released by producer -failureRates = range(10, 91, 40) +failureRates = range(10, 31, 40) # Block size in one dimension in segments. Block is blockSizes * blockSizes segments. -blockSizes = range(32,65,16) +blockSizes = range(32,35,16) # Per-topic mesh neighborhood size netDegrees = range(6, 9, 2) # number of rows and columns a validator is interested in -chis = range(1, 5, 2) +chis = range(2, 5, 2) # ratio of class1 nodes (see below for parameters per class) -class1ratios = np.arange(0, 1, .2) +class1ratios = [0.8, 0.9] # Number of validators per beacon node validatorsPerNode1 = [1] -validatorsPerNode2 = [2, 4, 8, 16, 32] +validatorsPerNode2 = [50] # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 @@ -62,7 +62,7 @@ bwUplinks1 = [110] bwUplinks2 = [2200] # Set to True if you want your run to be deterministic, False if not -deterministic = False +deterministic = True # If your run is deterministic you can decide the random seed. This is ignore otherwise. randomSeed = "DAS" From 296c4fb762be2b8409c3521ae561533454ab1a97 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 30 Mar 2023 13:36:48 +0200 Subject: [PATCH 132/162] Rows and columns to sets --- DAS/simulator.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 5aac495..99cb5a5 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -61,10 +61,8 @@ class Simulator: j = i - int(heavyVal/self.shape.vpn2) start = offset+( j *self.shape.chi) end = offset+((j+1)*self.shape.chi) - r = list(set(rows[start:end])) - c = list(set(columns[start:end])) - r.sort() - c.sort() + r = set(rows[start:end]) + c = set(columns[start:end]) val = Validator(i, int(not i!=0), self.logger, self.shape, r, c) else: val = Validator(i, int(not i!=0), self.logger, self.shape) From 7719f84a10a7f5d867aa608876cb29c03fa6b535 Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 30 Mar 2023 13:41:50 +0200 Subject: [PATCH 133/162] Switch from time steps to miliseconds (#30) Switch from time steps to miliseconds --- DAS/results.py | 13 +++++++------ DAS/simulator.py | 13 +++++++------ DAS/visualizer.py | 6 ++++-- config_example.py | 15 +++++++++------ study.py | 2 +- 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/DAS/results.py b/DAS/results.py index c5687a5..a11da24 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -7,22 +7,23 @@ from dicttoxml import dicttoxml class Result: """This class stores and process/store the results of a simulation.""" - def __init__(self, shape): + def __init__(self, shape, execID): """It initializes the instance with a specific shape.""" self.shape = shape + self.execID = execID self.blockAvailable = -1 self.tta = -1 self.missingVector = [] self.metrics = {} - def populate(self, shape, missingVector): + def populate(self, shape, config, missingVector): """It populates part of the result data inside a vector.""" self.shape = shape self.missingVector = missingVector missingSamples = missingVector[-1] if missingSamples == 0: self.blockAvailable = 1 - self.tta = len(missingVector) + self.tta = len(missingVector) * (config.stepDuration) else: self.blockAvailable = 0 self.tta = -1 @@ -35,8 +36,8 @@ class Result: """It dumps the results of the simulation in an XML file.""" if not os.path.exists("results"): os.makedirs("results") - if not os.path.exists("results/"+execID): - os.makedirs("results/"+execID) + if not os.path.exists("results/"+self.execID): + os.makedirs("results/"+self.execID) resd1 = self.shape.__dict__ resd2 = self.__dict__.copy() resd2.pop("shape") @@ -44,6 +45,6 @@ class Result: resXml = dicttoxml(resd1) xmlstr = minidom.parseString(resXml) xmlPretty = xmlstr.toprettyxml() - filePath = "results/"+execID+"/"+str(self.shape)+".xml" + filePath = "results/"+self.execID+"/"+str(self.shape)+".xml" with open(filePath, "w") as f: f.write(xmlPretty) diff --git a/DAS/simulator.py b/DAS/simulator.py index 677a260..4acf3f5 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -13,12 +13,13 @@ from DAS.validator import * class Simulator: """This class implements the main DAS simulator.""" - def __init__(self, shape, config): + def __init__(self, shape, config, execID): """It initializes the simulation with a set of parameters (shape).""" self.shape = shape self.config = config self.format = {"entity": "Simulator"} - self.result = Result(self.shape) + self.execID = execID + self.result = Result(self.shape, self.execID) self.validators = [] self.logger = [] self.logLevel = config.logLevel @@ -192,14 +193,14 @@ class Simulator: # log TX and RX statistics trafficStats = self.glob.getTrafficStats(self.validators) - self.logger.debug("step %d: %s" % + self.logger.debug("step %d: %s" % (steps, trafficStats), extra=self.format) for i in range(0,self.shape.numberNodes): self.validators[i].updateStats() trafficStatsVector.append(trafficStats) missingSamples, sampleProgress, nodeProgress, validatorProgress = self.glob.getProgress(self.validators) - self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" + self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" % (steps, sampleProgress*100, nodeProgress*100, validatorProgress*100), extra=self.format) cnS = "samples received" @@ -231,7 +232,7 @@ class Simulator: missingVector.append(missingSamples) break elif missingSamples == 0: - #self.logger.info("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) + self.logger.debug("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) missingVector.append(missingSamples) break else: @@ -240,6 +241,6 @@ class Simulator: progress = pd.DataFrame(progressVector) if self.config.saveProgress: self.result.addMetric("progress", progress.to_dict(orient='list')) - self.result.populate(self.shape, missingVector) + self.result.populate(self.shape, self.config, missingVector) return self.result diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 8afd006..db4b2d5 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -36,7 +36,7 @@ class Visualizer: bwUplinkProd = int(root.find('bwUplinkProd').text) bwUplink1 = int(root.find('bwUplink1').text) bwUplink2 = int(root.find('bwUplink2').text) - tta = int(root.find('tta').text) + tta = float(root.find('tta').text) # Loop over all possible combinations of of the parameters minus two for combination in combinations(self.parameters, len(self.parameters)-2): @@ -120,7 +120,7 @@ class Visualizer: hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas']) hist = hist.T fig, ax = plt.subplots(figsize=(10, 6)) - sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax) + sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability (ms)'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax) plt.xlabel(self.formatLabel(labels[0])) plt.ylabel(self.formatLabel(labels[1])) filename = "" @@ -131,6 +131,8 @@ class Visualizer: filename += f"{key[paramValueCnt]}" formattedTitle = self.formatTitle(key[paramValueCnt]) title += formattedTitle + if (paramValueCnt+1) % 5 == 0: + title += "\n" paramValueCnt += 1 title_obj = plt.title(title) font_size = 16 * fig.get_size_inches()[0] / 10 diff --git a/config_example.py b/config_example.py index 5b1a396..3ff5ae8 100644 --- a/config_example.py +++ b/config_example.py @@ -27,14 +27,14 @@ logLevel = logging.INFO # number of parallel workers. -1: all cores; 1: sequential # for more details, see joblib.Parallel -numJobs = 3 +numJobs = -1 # distribute rows/columns evenly between validators (True) # or generate it using local randomness (False) evenLineDistribution = True # Number of simulation runs with the same parameters for statistical relevance -runs = range(10) +runs = range(2) # Number of validators numberNodes = range(256, 513, 128) @@ -49,14 +49,14 @@ blockSizes = range(32,65,16) netDegrees = range(6, 9, 2) # number of rows and columns a validator is interested in -chis = range(1, 5, 2) +chis = range(2, 5, 2) # ratio of class1 nodes (see below for parameters per class) -class1ratios = np.arange(0, 1, .2) +class1ratios = [0.8, 0.9] # Number of validators per beacon node validatorsPerNode1 = [1] -validatorsPerNode2 = [2, 4, 8, 16, 32] +validatorsPerNode2 = [500] # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 @@ -64,8 +64,11 @@ bwUplinksProd = [2200] bwUplinks1 = [110] bwUplinks2 = [2200] +# Step duration in miliseconds (Classic RTT is about 100ms) +stepDuration = 50 + # Set to True if you want your run to be deterministic, False if not -deterministic = False +deterministic = True # If your run is deterministic you can decide the random seed. This is ignore otherwise. randomSeed = "DAS" diff --git a/study.py b/study.py index fde8099..aa27a5f 100644 --- a/study.py +++ b/study.py @@ -28,7 +28,7 @@ def runOnce(config, shape, execID): shape.setSeed(config.randomSeed+"-"+str(shape)) random.seed(shape.randomSeed) - sim = Simulator(shape, config) + sim = Simulator(shape, config, execID) sim.initLogger() sim.initValidators() sim.initNetwork() From 98423d29c056ee3424d65850be5551d0cf7e9072 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 30 Mar 2023 13:49:01 +0200 Subject: [PATCH 134/162] Typos and sets --- DAS/simulator.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 6ec3bfa..83ba876 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -59,8 +59,8 @@ class Simulator: self.logger.debug("Shuffled rows: %s" % str(rows), extra=self.format) self.logger.debug("Shuffled columns: %s" % str(columns), extra=self.format) - assignatedRows = [] - assignatedCols = [] + assignedRows = [] + assignedCols = [] for i in range(self.shape.numberNodes): if self.config.evenLineDistribution: if i < int(heavyVal/self.shape.vpn2): # First start with the heavy nodes @@ -71,15 +71,13 @@ class Simulator: start = offset+( j *self.shape.chi) end = offset+((j+1)*self.shape.chi) # Remove duplicates - r = list(dict.fromkeys(rows[start:end])) - c = list(dict.fromkeys(columns[start:end])) - r.sort() - c.sort() + r = set(rows[start:end]) + c = set(columns[start:end]) val = Validator(i, int(not i!=0), self.logger, self.shape, r, c) self.logger.debug("Validators %d row IDs: %s" % (val.ID, val.rowIDs), extra=self.format) self.logger.debug("Validators %d column IDs: %s" % (val.ID, val.columnIDs), extra=self.format) - assignatedRows = assignatedRows + r - assignatedCols = assignatedCols + c + assignedRows = assignedRows + list(r) + assignedCols = assignedCols + list(c) else: val = Validator(i, int(not i!=0), self.logger, self.shape) @@ -89,10 +87,10 @@ class Simulator: val.logIDs() self.validators.append(val) - assignatedRows.sort() - assignatedCols.sort() - self.logger.debug("Rows assignated: %s" % str(assignatedRows), extra=self.format) - self.logger.debug("Columns assignated: %s" % str(assignatedCols), extra=self.format) + assignedRows.sort() + assignedCols.sort() + self.logger.debug("Rows assigned: %s" % str(assignedRows), extra=self.format) + self.logger.debug("Columns assigned: %s" % str(assignedCols), extra=self.format) self.logger.debug("Validators initialized.", extra=self.format) def initNetwork(self): From 4b7bf81cee8b7125facf544d3c1fa402db4e3fda Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 30 Mar 2023 13:52:40 +0200 Subject: [PATCH 135/162] Remove stop condition fix --- DAS/simulator.py | 10 ++++------ config_example.py | 3 --- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 83ba876..b7b7dff 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -273,13 +273,11 @@ class Simulator: }) if missingSamples == oldMissingSamples: - if len(missingVector) > self.config.steps4StopCondition: - if missingSamples == missingVector[len(missingVector)-1-self.config.steps4StopCondition]: - self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) - if self.config.diagnostics: - self.printDiagnostics() - break + self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) + if self.config.diagnostics: + self.printDiagnostics() missingVector.append(missingSamples) + break elif missingSamples == 0: #self.logger.info("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) missingVector.append(missingSamples) diff --git a/config_example.py b/config_example.py index d07a899..f799c20 100644 --- a/config_example.py +++ b/config_example.py @@ -77,9 +77,6 @@ randomSeed = "DAS" # If True, print diagnostics when the block is not available diagnostics = False -# Number of steps without progress to stop simulation -steps4StopCondition = 7 - def nextShape(): for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nn, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberNodes, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): From d2a653b07c637204929473da3ef9ea42a86d9b27 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 30 Mar 2023 14:11:12 +0200 Subject: [PATCH 136/162] Remove plotting config --- DAS/simulator.py | 1 - config_example.py | 4 ---- 2 files changed, 5 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 674c1e7..b0ea19f 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -3,7 +3,6 @@ import networkx as nx import logging, random import pandas as pd -import matplotlib from functools import partial, partialmethod from datetime import datetime from DAS.tools import * diff --git a/config_example.py b/config_example.py index 2187108..e048028 100644 --- a/config_example.py +++ b/config_example.py @@ -22,10 +22,6 @@ dumpXML = 1 # save progress vectors to XML saveProgress = 1 - -# plot progress for each run to PNG -plotProgress = 1 - visualization = 1 logLevel = logging.INFO From ae36844e7f5a66450e64701af01007a8f9732bb7 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 30 Mar 2023 14:26:14 +0200 Subject: [PATCH 137/162] Add stop condition fix --- DAS/simulator.py | 6 ++++-- config_example.py | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index a8d5509..6561ea0 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -229,9 +229,11 @@ class Simulator: }) if missingSamples == oldMissingSamples: - self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) + if len(missingVector) > self.config.steps4StopCondition: + if missingSamples == missingVector[len(missingVector)-1-self.config.steps4StopCondition]: + self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) + break missingVector.append(missingSamples) - break elif missingSamples == 0: self.logger.debug("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) missingVector.append(missingSamples) diff --git a/config_example.py b/config_example.py index 3ff5ae8..6725280 100644 --- a/config_example.py +++ b/config_example.py @@ -73,6 +73,9 @@ deterministic = True # If your run is deterministic you can decide the random seed. This is ignore otherwise. randomSeed = "DAS" +# Number of steps without progress to stop simulation +steps4StopCondition = 7 + def nextShape(): for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nn, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberNodes, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): From c4ad3cf80e64a1c14c8ff022cafb2c6180cabe49 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 30 Mar 2023 16:10:10 +0200 Subject: [PATCH 138/162] Small fix --- DAS/simulator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 6561ea0..734f0d3 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -230,7 +230,7 @@ class Simulator: if missingSamples == oldMissingSamples: if len(missingVector) > self.config.steps4StopCondition: - if missingSamples == missingVector[len(missingVector)-1-self.config.steps4StopCondition]: + if missingSamples == missingVector[-self.config.steps4StopCondition]: self.logger.debug("The block cannot be recovered, failure rate %d!" % self.shape.failureRate, extra=self.format) break missingVector.append(missingSamples) From 73e02a132db23adeff65efaa235ec7fb97b2e85f Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 30 Mar 2023 16:22:00 +0200 Subject: [PATCH 139/162] fix formatting Signed-off-by: Csaba Kiraly --- config_example.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_example.py b/config_example.py index 6725280..a17477f 100644 --- a/config_example.py +++ b/config_example.py @@ -75,7 +75,7 @@ randomSeed = "DAS" # Number of steps without progress to stop simulation steps4StopCondition = 7 - + def nextShape(): for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nn, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberNodes, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): From ea93e9412f297865942f35c5ed6704ca7b89a398 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 13 Apr 2023 15:22:50 +0200 Subject: [PATCH 140/162] Changing the success condition --- DAS/results.py | 4 +++- config_example.py | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/DAS/results.py b/DAS/results.py index 7134ff2..c6a87f1 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -21,7 +21,9 @@ class Result: self.shape = shape self.missingVector = missingVector missingSamples = missingVector[-1] - if missingSamples == 0: + validatorsReady = self.metrics["progress"]["validators ready"][-1] + #print("There are %05.3f%% validators ready" % (validatorsReady*100)) + if validatorsReady > config.successCondition: self.blockAvailable = 1 self.tta = len(missingVector) * (config.stepDuration) else: diff --git a/config_example.py b/config_example.py index 39a0591..7263ca1 100644 --- a/config_example.py +++ b/config_example.py @@ -76,6 +76,9 @@ randomSeed = "DAS" # Number of steps without progress to stop simulation steps4StopCondition = 7 +# Number of validators ready to asume block is available +successCondition = 0.9 + # If True, print diagnostics when the block is not available diagnostics = False From 9855f1b8c4550cb00c40c944b987f56b354b0f1e Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 13 Apr 2023 23:28:40 +0200 Subject: [PATCH 141/162] calcualate tta based on successCondition Signed-off-by: Csaba Kiraly --- DAS/results.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DAS/results.py b/DAS/results.py index c6a87f1..60cfc81 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -1,6 +1,7 @@ #!/bin/python3 import os +import bisect from xml.dom import minidom from dicttoxml import dicttoxml @@ -20,12 +21,11 @@ class Result: """It populates part of the result data inside a vector.""" self.shape = shape self.missingVector = missingVector - missingSamples = missingVector[-1] - validatorsReady = self.metrics["progress"]["validators ready"][-1] - #print("There are %05.3f%% validators ready" % (validatorsReady*100)) - if validatorsReady > config.successCondition: + v = self.metrics["progress"]["validators ready"] + tta = bisect.bisect(v, config.successCondition) + if tta != len(v): self.blockAvailable = 1 - self.tta = len(missingVector) * (config.stepDuration) + self.tta = tta * (config.stepDuration) else: self.blockAvailable = 0 self.tta = -1 From b4f3d35f91aa869217936db1b62f3d32e4897278 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 13 Apr 2023 06:01:04 +0200 Subject: [PATCH 142/162] save config and code state for reproducibility Signed-off-by: Csaba Kiraly --- study.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/study.py b/study.py index 74dba63..8d6c088 100644 --- a/study.py +++ b/study.py @@ -2,6 +2,7 @@ import time, sys, random, copy import importlib +import subprocess from joblib import Parallel, delayed from DAS import * @@ -63,6 +64,18 @@ def study(): now = datetime.now() execID = now.strftime("%Y-%m-%d_%H-%M-%S_")+str(random.randint(100,999)) + # save config and code state for reproducibility + if not os.path.exists("results"): + os.makedirs("results") + dir = "results/"+execID + if not os.path.exists(dir): + os.makedirs(dir) + with open(dir+"/git.diff", 'w') as f: + subprocess.run(["git", "diff"], stdout=f) + with open(dir+"/git.describe", 'w') as f: + subprocess.run(["git", "describe", "--always"], stdout=f) + subprocess.run(["cp", sys.argv[1], dir+"/"]) + logger.info("Starting simulations:", extra=format) start = time.time() results = Parallel(config.numJobs)(delayed(runOnce)(config, shape ,execID) for shape in config.nextShape()) From f3a9e4b8fdd941ba403dddeac7244a87d7bf5ea2 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Mon, 17 Apr 2023 10:56:10 +0200 Subject: [PATCH 143/162] Fix corner case when last iteration is equal to success condition --- DAS/results.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DAS/results.py b/DAS/results.py index 60cfc81..76d96d1 100644 --- a/DAS/results.py +++ b/DAS/results.py @@ -23,7 +23,7 @@ class Result: self.missingVector = missingVector v = self.metrics["progress"]["validators ready"] tta = bisect.bisect(v, config.successCondition) - if tta != len(v): + if v[-1] >= config.successCondition: self.blockAvailable = 1 self.tta = tta * (config.stepDuration) else: From ebe1a4c87b1f6b37e2ca598bad49c217a67b47ca Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Mon, 17 Apr 2023 12:14:39 +0200 Subject: [PATCH 144/162] Make git save an option for when code is downloaded instead of cloned --- config_example.py | 3 +++ study.py | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/config_example.py b/config_example.py index 39a0591..7c2267c 100644 --- a/config_example.py +++ b/config_example.py @@ -79,6 +79,9 @@ steps4StopCondition = 7 # If True, print diagnostics when the block is not available diagnostics = False +# True to save git diff and git commit +saveGit = False + def nextShape(): for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nn, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberNodes, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): diff --git a/study.py b/study.py index 8d6c088..6fb9340 100644 --- a/study.py +++ b/study.py @@ -70,10 +70,11 @@ def study(): dir = "results/"+execID if not os.path.exists(dir): os.makedirs(dir) - with open(dir+"/git.diff", 'w') as f: - subprocess.run(["git", "diff"], stdout=f) - with open(dir+"/git.describe", 'w') as f: - subprocess.run(["git", "describe", "--always"], stdout=f) + if config.saveGit: + with open(dir+"/git.diff", 'w') as f: + subprocess.run(["git", "diff"], stdout=f) + with open(dir+"/git.describe", 'w') as f: + subprocess.run(["git", "describe", "--always"], stdout=f) subprocess.run(["cp", sys.argv[1], dir+"/"]) logger.info("Starting simulations:", extra=format) From b74ac19557536212d55a4f6f5fe28b70234f5ede Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 10 Apr 2023 22:05:48 +0200 Subject: [PATCH 145/162] fixup: increase step counter while steps4StopCondition Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 6a9db26..34ed8d7 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -283,8 +283,7 @@ class Simulator: self.logger.debug("The entire block is available at step %d, with failure rate %d !" % (steps, self.shape.failureRate), extra=self.format) missingVector.append(missingSamples) break - else: - steps += 1 + steps += 1 progress = pd.DataFrame(progressVector) if self.config.saveProgress: From 1638a185071ec93e26a85bd1e1bf61e1064a0e54 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Sun, 9 Apr 2023 01:13:28 +0200 Subject: [PATCH 146/162] make failureRate exact simplify code and make sure failureRate is the exact portion of segments missing, not just a probability per sample. Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 1 - DAS/validator.py | 23 ++++------------------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 6a9db26..c61818d 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -210,7 +210,6 @@ class Simulator: def run(self): """It runs the main simulation until the block is available or it gets stucked.""" self.glob.checkRowsColumns(self.validators) - self.validators[self.proposerID].broadcastBlock() arrived, expected, ready, validated = self.glob.checkStatus(self.validators) missingSamples = expected - arrived missingVector = [] diff --git a/DAS/validator.py b/DAS/validator.py index cfa7fac..79d9ea2 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -113,33 +113,18 @@ class Validator: def initBlock(self): """It initializes the block for the proposer.""" - if self.amIproposer == 1: - self.logger.debug("I am a block proposer.", extra=self.format) - self.block = Block(self.shape.blockSize) - self.block.fill() - #self.block.print() - else: - self.logger.warning("I am not a block proposer."% self.ID) - - def broadcastBlock(self): - """The block proposer broadcasts the block to all validators.""" if self.amIproposer == 0: self.logger.warning("I am not a block proposer", extra=self.format) else: - self.logger.debug("Broadcasting my block...", extra=self.format) + self.logger.debug("Creating block...", extra=self.format) order = [i for i in range(self.shape.blockSize * self.shape.blockSize)] - random.shuffle(order) - while(order): - i = order.pop() - if (random.randint(0,99) >= self.shape.failureRate): - self.block.data[i] = 1 - else: - self.block.data[i] = 0 + order = random.sample(order, int((1 - self.shape.failureRate/100) * len(order))) + for i in order: + self.block.data[i] = 1 nbFailures = self.block.data.count(0) measuredFailureRate = nbFailures * 100 / (self.shape.blockSize * self.shape.blockSize) self.logger.debug("Number of failures: %d (%0.02f %%)", nbFailures, measuredFailureRate, extra=self.format) - #broadcasted.print() def getColumn(self, index): """It returns a given column.""" From b36a94e269a02a3785b00add18d95783c19da567 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 20 Apr 2023 18:15:02 +0200 Subject: [PATCH 147/162] Fix runs bug --- DAS/visualizer.py | 16 ++++++++-------- study.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index be05ed0..8f4abc6 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -6,12 +6,12 @@ import matplotlib.pyplot as plt import numpy as np import seaborn as sns from itertools import combinations -from config_example import runs class Visualizer: - def __init__(self, execID): + def __init__(self, execID, config): self.execID = execID + self.config = config self.folderPath = "results/"+self.execID self.parameters = ['run', 'blockSize', 'failureRate', 'numberNodes', 'netDegree', 'chi', 'vpn1', 'vpn2', 'class1ratio', 'bwUplinkProd', 'bwUplink1', 'bwUplink2'] self.minimumDataPoints = 2 @@ -81,7 +81,7 @@ class Visualizer: data[key]['ttas'].append(tta) print("Getting data from the folder...") return data - + def averageRuns(self, data, runs): """Get the average of run 0 and run 1 for each key""" newData = {} @@ -146,12 +146,12 @@ class Visualizer: """Plot and store the 2D heatmaps in subfolders""" data= self.plottingData() """Average the runs if needed""" - if(len(runs) > 1): - data = self.averageRuns(data, len(runs)) + if(len(self.config.runs) > 1): + data = self.averageRuns(data, len(self.config.runs)) filteredKeys = self.similarKeys(data) vmin, vmax = 0, self.maxTTA print("Plotting heatmaps...") - + """Create the directory if it doesn't exist already""" heatmapsFolder = self.folderPath + '/heatmaps' if not os.path.exists(heatmapsFolder): @@ -189,7 +189,7 @@ class Visualizer: plt.savefig(os.path.join(targetFolder, filename)) plt.close() plt.clf() - + def plotHist(self, bandwidth): """Plot Bandwidth Frequency Histogram""" plt.hist(bandwidth, bins=5) @@ -203,4 +203,4 @@ class Visualizer: os.makedirs(histogramFolder) filename = os.path.join(histogramFolder, 'histogram.png') plt.savefig(filename) - plt.clf() \ No newline at end of file + plt.clf() diff --git a/study.py b/study.py index 2b2aab6..a15e7b2 100644 --- a/study.py +++ b/study.py @@ -60,7 +60,7 @@ def study(): sim.logger.info("Results dumped into results/%s/" % (execID), extra=sim.format) if config.visualization: - vis = Visualizer(execID) + vis = Visualizer(execID, config) vis.plotHeatmaps() From c7f9577d4531e80a47d7e6baeb2b0ab1d6102c04 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 20 Apr 2023 21:53:25 +0200 Subject: [PATCH 148/162] Fix max value for tta --- DAS/visualizer.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 8f4abc6..c237a95 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -85,6 +85,8 @@ class Visualizer: def averageRuns(self, data, runs): """Get the average of run 0 and run 1 for each key""" newData = {} + allTta = [] + print("Getting the average of the runs...") for key, value in data.items(): runExists = False """Check if the key contains 'run_' with a numerical value""" @@ -97,12 +99,15 @@ class Visualizer: """Create a new key with the other items in the tuple""" if item.startswith('run_'): newKey = tuple([x for x in key if x != item]) + print(newKey) """Average the similar key values""" total = [0] * len(data[key]['ttas']) for i in range(runs): key0 = (f'run_{i}',) + newKey for cnt, tta in enumerate(data[key0]['ttas']): total[cnt] += tta + allTta.append(tta) + print(tta) for i in range(len(total)): total[i] = total[i]/runs averages = {} @@ -112,7 +117,7 @@ class Visualizer: else: averages[subkey] = data[key][subkey] newData[newKey] = averages - print("Getting the average of the runs...") + self.maxTTA = max(allTta) + 10 return newData def similarKeys(self, data): From 9d699ada5127f332ac66542d90daabd711bc9c66 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Fri, 21 Apr 2023 07:14:45 +0200 Subject: [PATCH 149/162] Remove debug lines --- DAS/visualizer.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index c237a95..0d72a94 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -99,7 +99,6 @@ class Visualizer: """Create a new key with the other items in the tuple""" if item.startswith('run_'): newKey = tuple([x for x in key if x != item]) - print(newKey) """Average the similar key values""" total = [0] * len(data[key]['ttas']) for i in range(runs): @@ -107,7 +106,6 @@ class Visualizer: for cnt, tta in enumerate(data[key0]['ttas']): total[cnt] += tta allTta.append(tta) - print(tta) for i in range(len(total)): total[i] = total[i]/runs averages = {} From 4f0e888c1bdc1a312e61e06f167c6cd95a51162d Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Fri, 21 Apr 2023 09:45:17 +0000 Subject: [PATCH 150/162] Other plots --- .gitignore | 1 + DAS/visualizer.py | 38 ++++++++++++++++++++++++++++++- config_example.py => smallConf.py | 37 +++++++++++++++++++++++------- 3 files changed, 67 insertions(+), 9 deletions(-) rename config_example.py => smallConf.py (79%) diff --git a/.gitignore b/.gitignore index 492044a..3304f8f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ myenv doc/_build !results/plots.py Frontend/ +smallConf.py diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 0d72a94..b28016a 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -6,6 +6,7 @@ import matplotlib.pyplot as plt import numpy as np import seaborn as sns from itertools import combinations +from mplfinance.original_flavor import candlestick_ohlc class Visualizer: @@ -83,7 +84,7 @@ class Visualizer: return data def averageRuns(self, data, runs): - """Get the average of run 0 and run 1 for each key""" + """Get the average of all runs for each key""" newData = {} allTta = [] print("Getting the average of the runs...") @@ -207,3 +208,38 @@ class Visualizer: filename = os.path.join(histogramFolder, 'histogram.png') plt.savefig(filename) plt.clf() + + def plotHist(self, bandwidth): + """Plot Bandwidth Frequency Histogram""" + plt.hist(bandwidth, bins=5) + plt.xlabel('Bandwidth') + plt.ylabel('Frequency') + plt.title('Bandwidth Histogram') + + """Create the directory if it doesn't exist already""" + histogramFolder = self.folderPath + '/histogram' + if not os.path.exists(histogramFolder): + os.makedirs(histogramFolder) + filename = os.path.join(histogramFolder, 'histogram.png') + plt.savefig(filename) + plt.clf() + + def plotCandleStick(self, TX_prod, TX_avg, TX_max): + #x-axis corresponding to steps + steps = range(len(TX_prod)) + + #Plot the candlestick chart + ohlc = [] + for i in range(len(TX_prod)): + ohlc.append([steps[i], TX_prod[i], TX_max[i], TX_avg[i]]) + fig, ax = plt.subplots() + candlestick_ohlc(ax, ohlc, width=0.6, colorup='green', colordown='red') + + #Ticks, title and labels + plt.xticks(steps, ['run{}'.format(i) for i in steps], rotation=45) + plt.title('Candlestick Chart') + plt.xlabel('Step') + plt.ylabel('Price') + + #Test + plt.show() \ No newline at end of file diff --git a/config_example.py b/smallConf.py similarity index 79% rename from config_example.py rename to smallConf.py index 9e99c18..5711380 100644 --- a/config_example.py +++ b/smallConf.py @@ -19,6 +19,13 @@ import numpy as np from DAS.shape import Shape dumpXML = 1 + +# save progress vectors to XML +saveProgress = 1 + +# plot progress for each run to PNG +plotProgress = 1 + visualization = 1 logLevel = logging.INFO @@ -34,26 +41,26 @@ evenLineDistribution = True runs = range(3) # Number of validators -numberNodes = range(256, 313, 128) +numberNodes = range(128, 513, 128) # Percentage of block not released by producer -failureRates = range(10, 31, 40) +failureRates = range(40, 81, 20) # Block size in one dimension in segments. Block is blockSizes * blockSizes segments. -blockSizes = range(32,35,16) +blockSizes = range(64, 113, 128) # Per-topic mesh neighborhood size -netDegrees = range(6, 9, 2) +netDegrees = range(8, 9, 2) # number of rows and columns a validator is interested in -chis = range(2, 5, 2) +chis = range(2, 3, 2) # ratio of class1 nodes (see below for parameters per class) -class1ratios = [0.8, 0.9] +class1ratios = [0.8] # Number of validators per beacon node -validatorsPerNode1 = [1] -validatorsPerNode2 = [50] +validatorsPerNode1 = [2] +validatorsPerNode2 = [4] # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 @@ -67,6 +74,20 @@ deterministic = True # If your run is deterministic you can decide the random seed. This is ignore otherwise. randomSeed = "DAS" +saveProgress = 1 +saveRCdist = 1 + +# If True, print diagnostics when the block is not available +diagnostics = False + +# Number of steps without progress to stop simulation +steps4StopCondition = 7 + +saveGit = False + +successCondition = 0.9 +stepDuration = 50 + def nextShape(): for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nn, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberNodes, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): From ffeac4608b3e353f2e581c21e7cd9f24f9f1b198 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Fri, 21 Apr 2023 17:13:53 +0200 Subject: [PATCH 151/162] Update requirements --- DAS/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DAS/requirements.txt b/DAS/requirements.txt index da7dcc7..83eca18 100644 --- a/DAS/requirements.txt +++ b/DAS/requirements.txt @@ -1,7 +1,8 @@ bitarray==2.6.0 -DAS==0.29.0 +DAS==0.30.0 dicttoxml==1.7.16 matplotlib==3.6.2 +mplfinance==0.12.9b7 networkx==3.0 numpy==1.23.5 seaborn==0.12.2 From 6fe0fab6d083f2478b89beb58e83a3a7315afb98 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Fri, 21 Apr 2023 17:14:55 +0200 Subject: [PATCH 152/162] Inverse heatmap --- DAS/visualizer.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index b28016a..5d2f341 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -16,12 +16,13 @@ class Visualizer: self.folderPath = "results/"+self.execID self.parameters = ['run', 'blockSize', 'failureRate', 'numberNodes', 'netDegree', 'chi', 'vpn1', 'vpn2', 'class1ratio', 'bwUplinkProd', 'bwUplink1', 'bwUplink2'] self.minimumDataPoints = 2 - self.maxTTA = 999 + self.maxTTA = 99 def plottingData(self): """Store data with a unique key for each params combination""" data = {} bw = [] + print("Getting data from the folder...") """Loop over the xml files in the folder""" for filename in os.listdir(self.folderPath): """Loop over the xmls and store the data in variables""" @@ -41,9 +42,8 @@ class Visualizer: bwUplink1 = int(root.find('bwUplink1').text) bwUplink2 = int(root.find('bwUplink2').text) tta = int(root.find('tta').text) - - # if tta == -1: - # tta = self.maxTTA + if tta == -1: + tta = self.maxTTA """Store BW""" bw.append(bwUplinkProd) @@ -80,7 +80,6 @@ class Visualizer: else: data[key][otherParams[1]] = [selectedValues[otherIndices[1]]] data[key]['ttas'].append(tta) - print("Getting data from the folder...") return data def averageRuns(self, data, runs): @@ -116,7 +115,6 @@ class Visualizer: else: averages[subkey] = data[key][subkey] newData[newKey] = averages - self.maxTTA = max(allTta) + 10 return newData def similarKeys(self, data): @@ -171,7 +169,7 @@ class Visualizer: hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas'], normed=False) hist = hist.T fig, ax = plt.subplots(figsize=(10, 6)) - sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax, vmin=vmin, vmax=vmax) + sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='hot_r', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax, vmin=vmin, vmax=vmax) plt.xlabel(self.formatLabel(labels[0])) plt.ylabel(self.formatLabel(labels[1])) filename = "" @@ -242,4 +240,4 @@ class Visualizer: plt.ylabel('Price') #Test - plt.show() \ No newline at end of file + plt.show() From e7c2807acaaa7721bc223f56f012a38316a92aa6 Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Sun, 23 Apr 2023 14:55:31 +0000 Subject: [PATCH 153/162] Minor changes --- .gitignore | 1 - DAS/visualizer.py | 20 +++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 3304f8f..492044a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,3 @@ myenv doc/_build !results/plots.py Frontend/ -smallConf.py diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 5d2f341..ca19d99 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -7,6 +7,8 @@ import numpy as np import seaborn as sns from itertools import combinations from mplfinance.original_flavor import candlestick_ohlc +import os + class Visualizer: @@ -42,8 +44,6 @@ class Visualizer: bwUplink1 = int(root.find('bwUplink1').text) bwUplink2 = int(root.find('bwUplink2').text) tta = int(root.find('tta').text) - if tta == -1: - tta = self.maxTTA """Store BW""" bw.append(bwUplinkProd) @@ -83,9 +83,11 @@ class Visualizer: return data def averageRuns(self, data, runs): + '''Debugging''' + if not os.path.exists('debug'): + os.makedirs('debug') """Get the average of all runs for each key""" newData = {} - allTta = [] print("Getting the average of the runs...") for key, value in data.items(): runExists = False @@ -101,13 +103,21 @@ class Visualizer: newKey = tuple([x for x in key if x != item]) """Average the similar key values""" total = [0] * len(data[key]['ttas']) + with open('debug/debug.txt', 'a') as f: + f.write('TTAs:\n') for i in range(runs): key0 = (f'run_{i}',) + newKey + with open('debug/debug.txt', 'a') as f: + f.write(str(data[key0]['ttas']) + '\n') for cnt, tta in enumerate(data[key0]['ttas']): total[cnt] += tta - allTta.append(tta) for i in range(len(total)): total[i] = total[i]/runs + if(total[i] == -1): + total[i] = self.maxTTA + with open('debug/debug.txt', 'a') as f: + f.write('Average:\n') + f.write(str(total)+ '\n') averages = {} for subkey in data[key].keys(): if subkey == 'ttas': @@ -166,7 +176,7 @@ class Visualizer: ylabels = np.sort(np.unique(data[key][labels[1]])) if len(xlabels) < self.minimumDataPoints or len(ylabels) < self.minimumDataPoints: continue - hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas'], normed=False) + hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas']) hist = hist.T fig, ax = plt.subplots(figsize=(10, 6)) sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='hot_r', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax, vmin=vmin, vmax=vmax) From 3fbda15272f601194667f68f3edd771f2015b261 Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Tue, 25 Apr 2023 21:32:31 +0000 Subject: [PATCH 154/162] Avg changes --- DAS/visualizer.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index ca19d99..4712687 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -83,9 +83,6 @@ class Visualizer: return data def averageRuns(self, data, runs): - '''Debugging''' - if not os.path.exists('debug'): - os.makedirs('debug') """Get the average of all runs for each key""" newData = {} print("Getting the average of the runs...") @@ -97,33 +94,37 @@ class Visualizer: runExists = True break if runExists: + ps = list(data[key].keys()) for item in key: """Create a new key with the other items in the tuple""" if item.startswith('run_'): newKey = tuple([x for x in key if x != item]) """Average the similar key values""" - total = [0] * len(data[key]['ttas']) - with open('debug/debug.txt', 'a') as f: - f.write('TTAs:\n') + tta_sums = {} + total = [] + p0 = [] + p1 = [] for i in range(runs): key0 = (f'run_{i}',) + newKey - with open('debug/debug.txt', 'a') as f: - f.write(str(data[key0]['ttas']) + '\n') - for cnt, tta in enumerate(data[key0]['ttas']): - total[cnt] += tta + #Create a dictionary to store the sums of ttas for each unique pair of values in subkeys + for i in range(len(data[key0][ps[0]])): + keyPair = (data[key0][ps[0]][i], data[key0][ps[1]][i]) + try: + tta_sums[keyPair] += data[key0]['ttas'][i] + except KeyError: + tta_sums[keyPair] = data[key0]['ttas'][i] + for k, tta in tta_sums.items(): + p0.append(k[0]) + p1.append(k[1]) + total.append(tta) for i in range(len(total)): total[i] = total[i]/runs if(total[i] == -1): total[i] = self.maxTTA - with open('debug/debug.txt', 'a') as f: - f.write('Average:\n') - f.write(str(total)+ '\n') averages = {} - for subkey in data[key].keys(): - if subkey == 'ttas': - averages[subkey] = total - else: - averages[subkey] = data[key][subkey] + averages[ps[0]] = p0 + averages[ps[1]] = p1 + averages['ttas'] = total newData[newKey] = averages return newData From eed410e4db53bc66761e7cdeb7ccb1948473599f Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 26 Apr 2023 18:22:17 +0200 Subject: [PATCH 155/162] Do not count unavailable block on averages --- DAS/visualizer.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 4712687..621f579 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -18,7 +18,7 @@ class Visualizer: self.folderPath = "results/"+self.execID self.parameters = ['run', 'blockSize', 'failureRate', 'numberNodes', 'netDegree', 'chi', 'vpn1', 'vpn2', 'class1ratio', 'bwUplinkProd', 'bwUplink1', 'bwUplink2'] self.minimumDataPoints = 2 - self.maxTTA = 99 + self.maxTTA = 50 def plottingData(self): """Store data with a unique key for each params combination""" @@ -101,26 +101,46 @@ class Visualizer: newKey = tuple([x for x in key if x != item]) """Average the similar key values""" tta_sums = {} + nbRuns = {} + ttRuns = [] total = [] p0 = [] p1 = [] + p2 = [] + p3 = [] for i in range(runs): key0 = (f'run_{i}',) + newKey #Create a dictionary to store the sums of ttas for each unique pair of values in subkeys for i in range(len(data[key0][ps[0]])): keyPair = (data[key0][ps[0]][i], data[key0][ps[1]][i]) + if data[key0]["ttas"][i] == -1: + data[key0]["ttas"][i] = self.maxTTA try: tta_sums[keyPair] += data[key0]['ttas'][i] + if data[key0]["ttas"][i] != self.maxTTA: + nbRuns[keyPair] += 1 except KeyError: tta_sums[keyPair] = data[key0]['ttas'][i] + if data[key0]["ttas"][i] != self.maxTTA: + nbRuns[keyPair] = 1 + else: + nbRuns[keyPair] = 0 for k, tta in tta_sums.items(): p0.append(k[0]) p1.append(k[1]) total.append(tta) + for k, run in nbRuns.items(): + p2.append(k[0]) + p3.append(k[1]) + ttRuns.append(run) for i in range(len(total)): - total[i] = total[i]/runs - if(total[i] == -1): + if(ttRuns[i] == 0): # All tta = -1 total[i] = self.maxTTA + elif ttRuns[i] < runs: # Some tta = -1 + total[i] -= (runs-ttRuns[i]) * self.maxTTA + total[i] = total[i]/ttRuns[i] + else: # No tta = -1 + total[i] = total[i]/ttRuns[i] averages = {} averages[ps[0]] = p0 averages[ps[1]] = p1 @@ -162,7 +182,7 @@ class Visualizer: if(len(self.config.runs) > 1): data = self.averageRuns(data, len(self.config.runs)) filteredKeys = self.similarKeys(data) - vmin, vmax = 0, self.maxTTA + vmin, vmax = 0, self.maxTTA+10 print("Plotting heatmaps...") """Create the directory if it doesn't exist already""" @@ -189,7 +209,8 @@ class Visualizer: for param in self.parameters: if param != labels[0] and param != labels[1] and param != 'run': filename += f"{key[paramValueCnt]}" - formattedTitle = self.formatTitle(key[paramValueCnt]) + #formattedTitle = self.formatTitle(key[paramValueCnt]) + formattedTitle = "Time to block availability" title += formattedTitle paramValueCnt += 1 title_obj = plt.title(title) From 08e67cbeb196de1abc25e579dc22f1ec97c3491d Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Sun, 9 Apr 2023 23:21:23 +0200 Subject: [PATCH 156/162] measure validation progress more precisely Signed-off-by: Csaba Kiraly --- DAS/observer.py | 13 ++++++++----- DAS/simulator.py | 8 ++++---- DAS/validator.py | 42 +++++++++++++++++++++++++++++------------- 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/DAS/observer.py b/DAS/observer.py index 235ed60..beba4ad 100644 --- a/DAS/observer.py +++ b/DAS/observer.py @@ -46,16 +46,18 @@ class Observer: arrived = 0 expected = 0 ready = 0 + validatedall = 0 validated = 0 for val in validators: if val.amIproposer == 0: - (a, e) = val.checkStatus() + (a, e, v) = val.checkStatus() arrived += a expected += e if a == e: ready += 1 - validated += val.vpn - return (arrived, expected, ready, validated) + validatedall += val.vpn + validated += v + return (arrived, expected, ready, validatedall, validated) def getProgress(self, validators): """Calculate current simulation progress with different metrics. @@ -69,14 +71,15 @@ class Observer: but counts a validator only if its support node's all validators see all interesting segments TODO: add real per validator progress counter """ - arrived, expected, ready, validated = self.checkStatus(validators) + arrived, expected, ready, validatedall, validated = self.checkStatus(validators) missingSamples = expected - arrived sampleProgress = arrived / expected nodeProgress = ready / (len(validators)-1) validatorCnt = sum([v.vpn for v in validators[1:]]) + validatorAllProgress = validatedall / validatorCnt validatorProgress = validated / validatorCnt - return missingSamples, sampleProgress, nodeProgress, validatorProgress + return missingSamples, sampleProgress, nodeProgress, validatorAllProgress, validatorProgress def getTrafficStats(self, validators): """Summary statistics of traffic measurements in a timestep.""" diff --git a/DAS/simulator.py b/DAS/simulator.py index 8bebd89..9eb5f49 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -210,7 +210,7 @@ class Simulator: def run(self): """It runs the main simulation until the block is available or it gets stucked.""" self.glob.checkRowsColumns(self.validators) - arrived, expected, ready, validated = self.glob.checkStatus(self.validators) + arrived, expected, ready, validatedall, validated = self.glob.checkStatus(self.validators) missingSamples = expected - arrived missingVector = [] progressVector = [] @@ -242,9 +242,9 @@ class Simulator: self.validators[i].updateStats() trafficStatsVector.append(trafficStats) - missingSamples, sampleProgress, nodeProgress, validatorProgress = self.glob.getProgress(self.validators) - self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validated %0.02f %%" - % (steps, sampleProgress*100, nodeProgress*100, validatorProgress*100), extra=self.format) + missingSamples, sampleProgress, nodeProgress, validatorAllProgress, validatorProgress = self.glob.getProgress(self.validators) + self.logger.info("step %d, arrived %0.02f %%, ready %0.02f %%, validatedall %0.02f %%, , validated %0.02f %%" + % (steps, sampleProgress*100, nodeProgress*100, validatorAllProgress*100, validatorProgress*100), extra=self.format) cnS = "samples received" cnN = "nodes ready" diff --git a/DAS/validator.py b/DAS/validator.py index 79d9ea2..bd7769e 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -69,8 +69,13 @@ class Validator: # random.seed(self.ID) self.nodeClass = 1 if (self.ID <= shape.numberNodes * shape.class1ratio) else 2 self.vpn = self.shape.vpn1 if (self.nodeClass == 1) else self.shape.vpn2 - self.rowIDs = rows if rows else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) - self.columnIDs = columns if columns else unionOfSamples(range(self.shape.blockSize), self.shape.chi, self.vpn) + self.vRowIDs = [] + self.vColumnIDs = [] + for i in range(self.vpn): + self.vRowIDs.append(set(rows[i*self.shape.chi:(i+1)*self.shape.chi]) if rows else set(random.sample(range(self.shape.blockSize), self.shape.chi))) + self.vColumnIDs.append(set(columns[i*self.shape.chi:(i+1)*self.shape.chi]) if columns else set(random.sample(range(self.shape.blockSize), self.shape.chi))) + self.rowIDs = set.union(*self.vRowIDs) + self.columnIDs = set.union(*self.vColumnIDs) self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) @@ -469,16 +474,27 @@ class Validator: def checkStatus(self): """It checks how many expected/arrived samples are for each assigned row/column.""" - arrived = 0 - expected = 0 - for id in self.columnIDs: - line = self.getColumn(id) - arrived += line.count(1) - expected += len(line) - for id in self.rowIDs: - line = self.getRow(id) - arrived += line.count(1) - expected += len(line) + + def checkStatus(columnIDs, rowIDs): + arrived = 0 + expected = 0 + for id in columnIDs: + line = self.getColumn(id) + arrived += line.count(1) + expected += len(line) + for id in rowIDs: + line = self.getRow(id) + arrived += line.count(1) + expected += len(line) + return arrived, expected + + arrived, expected = checkStatus(self.columnIDs, self.rowIDs) self.logger.debug("status: %d / %d", arrived, expected, extra=self.format) - return (arrived, expected) + validated = 0 + for i in range(self.vpn): + a, e = checkStatus(self.vColumnIDs[i], self.vRowIDs[i]) + if a == e: + validated+=1 + + return arrived, expected, validated From f47f46a3305477719528da9a80299f2edadd5669 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 18 Apr 2023 15:45:51 +0200 Subject: [PATCH 157/162] fix validator assignment when evenLineDistribution = True Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 9eb5f49..bf7e1de 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -51,7 +51,7 @@ class Simulator: totalRows = totalValidators * self.shape.chi rows = list(range(self.shape.blockSize)) * (int(totalRows/self.shape.blockSize)+1) columns = list(range(self.shape.blockSize)) * (int(totalRows/self.shape.blockSize)+1) - offset = heavyVal*self.shape.chi + offset = lightVal*self.shape.chi random.shuffle(rows) random.shuffle(columns) self.logger.debug("There is a total of %d validators" % totalValidators, extra=self.format) @@ -63,15 +63,15 @@ class Simulator: assignedCols = [] for i in range(self.shape.numberNodes): if self.config.evenLineDistribution: - if i < int(heavyVal/self.shape.vpn2): # First start with the heavy nodes - start = i *self.shape.chi*self.shape.vpn2 - end = (i+1)*self.shape.chi*self.shape.vpn2 - else: # Then the solo stakers - j = i - int(heavyVal/self.shape.vpn2) - start = offset+( j *self.shape.chi) - end = offset+((j+1)*self.shape.chi) - r = set(rows[start:end]) - c = set(columns[start:end]) + if i < int(lightVal/self.shape.vpn1): # First start with the light nodes + start = i *self.shape.chi*self.shape.vpn1 + end = (i+1)*self.shape.chi*self.shape.vpn1 + else: + j = i - int(lightVal/self.shape.vpn1) + start = offset+( j *self.shape.chi*self.shape.vpn2) + end = offset+((j+1)*self.shape.chi*self.shape.vpn2) + r = rows[start:end] + c = columns[start:end] val = Validator(i, int(not i!=0), self.logger, self.shape, r, c) self.logger.debug("Validators %d row IDs: %s" % (val.ID, val.rowIDs), extra=self.format) self.logger.debug("Validators %d column IDs: %s" % (val.ID, val.columnIDs), extra=self.format) From dfec7bcde82c7b5ef44b15effb9984a199c66ee2 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 20 Apr 2023 15:58:13 +0200 Subject: [PATCH 158/162] Clearer debugging data and add row/column distribution to results --- DAS/simulator.py | 40 ++++++++++++++++++++++++++-------------- smallConf.py | 2 +- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index bf7e1de..0a3073e 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -26,6 +26,10 @@ class Simulator: self.proposerID = 0 self.glob = [] self.execID = execID + self.distR = [] + self.distC = [] + self.nodeRows = [] + self.nodeColumns = [] # In GossipSub the initiator might push messages without participating in the mesh. # proposerPublishOnly regulates this behavior. If set to true, the proposer is not @@ -45,17 +49,22 @@ class Simulator: self.validators = [] if self.config.evenLineDistribution: - lightVal = int(self.shape.numberNodes * self.shape.class1ratio * self.shape.vpn1) - heavyVal = int(self.shape.numberNodes * (1-self.shape.class1ratio) * self.shape.vpn2) + lightNodes = int(self.shape.numberNodes * self.shape.class1ratio) + heavyNodes = self.shape.numberNodes - lightNodes + lightVal = lightNodes * self.shape.vpn1 + heavyVal = heavyNodes * self.shape.vpn2 totalValidators = lightVal + heavyVal totalRows = totalValidators * self.shape.chi rows = list(range(self.shape.blockSize)) * (int(totalRows/self.shape.blockSize)+1) columns = list(range(self.shape.blockSize)) * (int(totalRows/self.shape.blockSize)+1) - offset = lightVal*self.shape.chi + rows = rows[0:totalRows] + columns = columns[0:totalRows] random.shuffle(rows) random.shuffle(columns) - self.logger.debug("There is a total of %d validators" % totalValidators, extra=self.format) - self.logger.debug("Shuffling a total of %d rows/columns" % len(rows), extra=self.format) + offset = lightVal*self.shape.chi + self.logger.debug("There is a total of %d nodes, %d light and %d heavy." % (self.shape.numberNodes, lightNodes, heavyNodes), extra=self.format) + self.logger.debug("There is a total of %d validators, %d in light nodes and %d in heavy nodes" % (totalValidators, lightVal, heavyVal), extra=self.format) + self.logger.debug("Shuffling a total of %d rows/columns to be assigned (X=%d)" % (len(rows), self.shape.chi), extra=self.format) self.logger.debug("Shuffled rows: %s" % str(rows), extra=self.format) self.logger.debug("Shuffled columns: %s" % str(columns), extra=self.format) @@ -73,10 +82,12 @@ class Simulator: r = rows[start:end] c = columns[start:end] val = Validator(i, int(not i!=0), self.logger, self.shape, r, c) - self.logger.debug("Validators %d row IDs: %s" % (val.ID, val.rowIDs), extra=self.format) - self.logger.debug("Validators %d column IDs: %s" % (val.ID, val.columnIDs), extra=self.format) + self.logger.debug("Node %d has row IDs: %s" % (val.ID, val.rowIDs), extra=self.format) + self.logger.debug("Node %d has column IDs: %s" % (val.ID, val.columnIDs), extra=self.format) assignedRows = assignedRows + list(r) assignedCols = assignedCols + list(c) + self.nodeRows.append(val.rowIDs) + self.nodeColumns.append(val.columnIDs) else: val = Validator(i, int(not i!=0), self.logger, self.shape) @@ -104,14 +115,12 @@ class Simulator: columnChannels[id].append(v) # Check rows/columns distribution - distR = [] - distC = [] for r in rowChannels: - distR.append(len(r)) + self.distR.append(len(r)) for c in columnChannels: - distC.append(len(c)) - self.logger.debug("Number of validators per row; Min: %d, Max: %d" % (min(distR), max(distR)), extra=self.format) - self.logger.debug("Number of validators per column; Min: %d, Max: %d" % (min(distC), max(distC)), extra=self.format) + self.distC.append(len(c)) + self.logger.debug("Number of validators per row; Min: %d, Max: %d" % (min(self.distR), max(self.distR)), extra=self.format) + self.logger.debug("Number of validators per column; Min: %d, Max: %d" % (min(self.distC), max(self.distC)), extra=self.format) for id in range(self.shape.blockSize): @@ -243,7 +252,7 @@ class Simulator: trafficStatsVector.append(trafficStats) missingSamples, sampleProgress, nodeProgress, validatorAllProgress, validatorProgress = self.glob.getProgress(self.validators) - self.logger.info("step %d, arrived %0.02f %%, ready %0.02f %%, validatedall %0.02f %%, , validated %0.02f %%" + self.logger.debug("step %d, arrived %0.02f %%, ready %0.02f %%, validatedall %0.02f %%, , validated %0.02f %%" % (steps, sampleProgress*100, nodeProgress*100, validatorAllProgress*100, validatorProgress*100), extra=self.format) cnS = "samples received" @@ -285,6 +294,9 @@ class Simulator: steps += 1 progress = pd.DataFrame(progressVector) + if self.config.saveRCdist: + self.result.addMetric("rowDist", self.distR) + self.result.addMetric("columnDist", self.distC) if self.config.saveProgress: self.result.addMetric("progress", progress.to_dict(orient='list')) self.result.populate(self.shape, self.config, missingVector) diff --git a/smallConf.py b/smallConf.py index 1e4b3a8..782a2c0 100644 --- a/smallConf.py +++ b/smallConf.py @@ -21,7 +21,7 @@ from DAS.shape import Shape # Dump results into XML files dumpXML = 1 -# save progress vectors to XML +# save progress and row/column distribution vectors to XML saveProgress = 1 # plot progress for each run to PNG From 06e70e1b40033610e6dadafed1b47a1765123e12 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 18 Apr 2023 15:53:38 +0200 Subject: [PATCH 159/162] configure bandwidth in mbps Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 4 ++-- DAS/validator.py | 9 +++++---- smallConf.py | 12 +++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 0a3073e..73d9afc 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -81,7 +81,7 @@ class Simulator: end = offset+((j+1)*self.shape.chi*self.shape.vpn2) r = rows[start:end] c = columns[start:end] - val = Validator(i, int(not i!=0), self.logger, self.shape, r, c) + val = Validator(i, int(not i!=0), self.logger, self.shape, self.config, r, c) self.logger.debug("Node %d has row IDs: %s" % (val.ID, val.rowIDs), extra=self.format) self.logger.debug("Node %d has column IDs: %s" % (val.ID, val.columnIDs), extra=self.format) assignedRows = assignedRows + list(r) @@ -90,7 +90,7 @@ class Simulator: self.nodeColumns.append(val.columnIDs) else: - val = Validator(i, int(not i!=0), self.logger, self.shape) + val = Validator(i, int(not i!=0), self.logger, self.shape, self.config) if i == self.proposerID: val.initBlock() else: diff --git a/DAS/validator.py b/DAS/validator.py index bd7769e..7b5d0cc 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -38,7 +38,7 @@ class Validator: """It returns the validator ID.""" return str(self.ID) - def __init__(self, ID, amIproposer, logger, shape, rows = None, columns = None): + def __init__(self, ID, amIproposer, logger, shape, config, rows = None, columns = None): """It initializes the validator with the logger shape and rows/columns. If rows/columns are specified these are observed, otherwise (default) @@ -87,15 +87,16 @@ class Validator: self.statsRxDupInSlot = 0 self.statsRxDupPerSlot = [] - # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) - # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 - # TODO: this should be a parameter + # Set uplink bandwidth. + # Assuming segments of ~560 bytes and timesteps of 50ms, we get + # 1 Mbps ~= 1e6 mbps * 0.050 s / (560*8) bits ~= 11 segments/timestep if self.amIproposer: self.bwUplink = shape.bwUplinkProd elif self.nodeClass == 1: self.bwUplink = shape.bwUplink1 else: self.bwUplink = shape.bwUplink2 + self.bwUplink *= 1e3 / 8 * config.stepDuration / config.segmentSize self.repairOnTheFly = True self.sendLineUntil = (self.shape.blockSize + 1) // 2 # stop sending on a p2p link if at least this amount of samples passed diff --git a/smallConf.py b/smallConf.py index 782a2c0..7ebecba 100644 --- a/smallConf.py +++ b/smallConf.py @@ -69,15 +69,17 @@ class1ratios = [0.8] validatorsPerNode1 = [1] validatorsPerNode2 = [500] -# Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) -# 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 -bwUplinksProd = [2200] -bwUplinks1 = [110] -bwUplinks2 = [2200] +# Set uplink bandwidth in megabits/second +bwUplinksProd = [200] +bwUplinks1 = [10] +bwUplinks2 = [200] # Step duration in miliseconds (Classic RTT is about 100ms) stepDuration = 50 +# Segment size in bytes (with proof) +segmentSize = 560 + # Set to True if you want your run to be deterministic, False if not deterministic = True From 3c0898c92524900f61cac344210553125dc03ae2 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Sun, 9 Apr 2023 23:49:11 +0200 Subject: [PATCH 160/162] adding failureModes with special erasure patterns Signed-off-by: Csaba Kiraly --- DAS/shape.py | 4 +++- DAS/validator.py | 52 ++++++++++++++++++++++++++++++++++++++++++++---- smallConf.py | 9 ++++++--- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/DAS/shape.py b/DAS/shape.py index d83351d..9f6d573 100644 --- a/DAS/shape.py +++ b/DAS/shape.py @@ -3,11 +3,12 @@ class Shape: """This class represents a set of parameters for a specific simulation.""" - def __init__(self, blockSize, numberNodes, failureRate, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run): + def __init__(self, blockSize, numberNodes, failureModel, failureRate, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run): """Initializes the shape with the parameters passed in argument.""" self.run = run self.numberNodes = numberNodes self.blockSize = blockSize + self.failureModel = failureModel self.failureRate = failureRate self.netDegree = netDegree self.class1ratio = class1ratio @@ -24,6 +25,7 @@ class Shape: shastr = "" shastr += "bs-"+str(self.blockSize) shastr += "-nn-"+str(self.numberNodes) + shastr += "-fm-"+str(self.failureModel) shastr += "-fr-"+str(self.failureRate) shastr += "-c1r-"+str(self.class1ratio) shastr += "-chi-"+str(self.chi) diff --git a/DAS/validator.py b/DAS/validator.py index bd7769e..0c37891 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -122,10 +122,54 @@ class Validator: self.logger.warning("I am not a block proposer", extra=self.format) else: self.logger.debug("Creating block...", extra=self.format) - order = [i for i in range(self.shape.blockSize * self.shape.blockSize)] - order = random.sample(order, int((1 - self.shape.failureRate/100) * len(order))) - for i in order: - self.block.data[i] = 1 + if self.shape.failureModel == "random": + order = [i for i in range(self.shape.blockSize * self.shape.blockSize)] + order = random.sample(order, int((1 - self.shape.failureRate/100) * len(order))) + for i in order: + self.block.data[i] = 1 + elif self.shape.failureModel == "sequential": + order = order[:int((1 - self.shape.failureRate/100) * len(order))] + for i in order: + self.block.data[i] = 1 + elif self.shape.failureModel == "MEP": # Minimal size non-recoverable Erasure Pattern + for r in range(self.shape.blockSize): + for c in range(self.shape.blockSize): + k = self.shape.blockSize/2 + if r > k or c > k: + self.block.setSegment(r,c) + elif self.shape.failureModel == "MEP+1": # MEP +1 segment to make it recoverable + for r in range(self.shape.blockSize): + for c in range(self.shape.blockSize): + k = self.shape.blockSize/2 + if r > k or c > k: + self.block.setSegment(r,c) + self.block.setSegment(0, 0) + elif self.shape.failureModel == "DEP": + for r in range(self.shape.blockSize): + for c in range(self.shape.blockSize): + k = self.shape.blockSize/2 + if (r+c) % self.shape.blockSize > k: + self.block.setSegment(r,c) + elif self.shape.failureModel == "DEP+1": + for r in range(self.shape.blockSize): + for c in range(self.shape.blockSize): + k = self.shape.blockSize/2 + if (r+c) % self.shape.blockSize > k: + self.block.setSegment(r,c) + self.block.setSegment(0, 0) + elif self.shape.failureModel == "MREP": # Minimum size Recoverable Erasure Pattern + for r in range(self.shape.blockSize): + for c in range(self.shape.blockSize): + k = self.shape.blockSize/2 + if r < k and c < k: + self.block.setSegment(r,c) + elif self.shape.failureModel == "MREP-1": # make MREP non-recoverable + for r in range(self.shape.blockSize): + for c in range(self.shape.blockSize): + k = self.shape.blockSize/2 + if r < k and c < k: + self.block.setSegment(r,c) + self.block.setSegment(0, 0, 0) nbFailures = self.block.data.count(0) measuredFailureRate = nbFailures * 100 / (self.shape.blockSize * self.shape.blockSize) diff --git a/smallConf.py b/smallConf.py index 782a2c0..042ca50 100644 --- a/smallConf.py +++ b/smallConf.py @@ -50,6 +50,9 @@ runs = range(3) # Number of validators numberNodes = range(128, 513, 128) +# select failure model between: "random, sequential, MEP, MEP+1, DEP, DEP+1, MREP, MREP-1" +failureModels = ["random"] + # Percentage of block not released by producer failureRates = range(40, 81, 20) @@ -97,9 +100,9 @@ diagnostics = False saveGit = False def nextShape(): - for run, fr, class1ratio, chi, vpn1, vpn2, blockSize, nn, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( - runs, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberNodes, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): + for run, fm, fr, class1ratio, chi, vpn1, vpn2, blockSize, nn, netDegree, bwUplinkProd, bwUplink1, bwUplink2 in itertools.product( + runs, failureModels, failureRates, class1ratios, chis, validatorsPerNode1, validatorsPerNode2, blockSizes, numberNodes, netDegrees, bwUplinksProd, bwUplinks1, bwUplinks2): # Network Degree has to be an even number if netDegree % 2 == 0: - shape = Shape(blockSize, nn, fr, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run) + shape = Shape(blockSize, nn, fm, fr, class1ratio, chi, vpn1, vpn2, netDegree, bwUplinkProd, bwUplink1, bwUplink2, run) yield shape From cec9b9f6a728865858d0aa6a36621da3794114e8 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 12 Apr 2023 16:02:51 +0200 Subject: [PATCH 161/162] fixup: fix missing 'order' in failureModel == "sequential" Signed-off-by: Csaba Kiraly --- DAS/validator.py | 1 + 1 file changed, 1 insertion(+) diff --git a/DAS/validator.py b/DAS/validator.py index 0c37891..eab4977 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -128,6 +128,7 @@ class Validator: for i in order: self.block.data[i] = 1 elif self.shape.failureModel == "sequential": + order = [i for i in range(self.shape.blockSize * self.shape.blockSize)] order = order[:int((1 - self.shape.failureRate/100) * len(order))] for i in order: self.block.data[i] = 1 From 293914e1c365fc1433ec089bcc8ed68c4b72b1bf Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 18 Apr 2023 16:12:46 +0200 Subject: [PATCH 162/162] move initBlock code after network setup Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 0a3073e..1250558 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -91,10 +91,6 @@ class Simulator: else: val = Validator(i, int(not i!=0), self.logger, self.shape) - if i == self.proposerID: - val.initBlock() - else: - val.logIDs() self.validators.append(val) assignedRows.sort() @@ -219,6 +215,11 @@ class Simulator: def run(self): """It runs the main simulation until the block is available or it gets stucked.""" self.glob.checkRowsColumns(self.validators) + for i in range(0,self.shape.numberNodes): + if i == self.proposerID: + self.validators[i].initBlock() + else: + self.validators[i].logIDs() arrived, expected, ready, validatedall, validated = self.glob.checkStatus(self.validators) missingSamples = expected - arrived missingVector = []

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 diff --git a/heatmaps/run=1_numberValidators=384_netDegree=6_chi=4.png b/heatmaps/run=1_numberValidators=384_netDegree=6_chi=4.png deleted file mode 100644 index 164eaca9982e52a5374592fc3b290b77c2f55212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22586 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 Tl>fq&C{ib7P9z=Ix$=JjEkInt diff --git a/heatmaps/run=1_numberValidators=384_netDegree=6_chi=6.png b/heatmaps/run=1_numberValidators=384_netDegree=6_chi=6.png deleted file mode 100644 index 559d709b2d98bcf7ae8b7c5420f16004add35829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22686 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 ClU9-d diff --git a/heatmaps/run=1_numberValidators=384_netDegree=6_chi=8.png b/heatmaps/run=1_numberValidators=384_netDegree=6_chi=8.png deleted file mode 100644 index b58912acc26e4cabab804104b9acd91822d8a6a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22697 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 diff --git a/heatmaps/run=1_numberValidators=512_netDegree=6_chi=4.png b/heatmaps/run=1_numberValidators=512_netDegree=6_chi=4.png deleted file mode 100644 index ecc3324a8d9ab6d2344cbac5f6609342f92dc0ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22664 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 diff --git a/plots.py b/plots.py deleted file mode 100644 index e3e83cb..0000000 --- a/plots.py +++ /dev/null @@ -1,51 +0,0 @@ -import os -import xml.etree.ElementTree as ET -import matplotlib.pyplot as plt -import numpy as np - -#Yet to update with the execID format -folder_path = 'results/2023-01-26_10-41-29_912' - -#Store data with a unique key for each (run, numberValidators, netDegree, chi) combination -data = {} - -for filename in os.listdir(folder_path): - #Loop over the xmls and store the data in variables - if filename.endswith('.xml'): - tree = ET.parse(os.path.join(folder_path, filename)) - root = tree.getroot() - run = int(root.find('run').text) - numberValidators = int(root.find('numberValidators').text) - netDegree = int(root.find('netDegree').text) - chi = int(root.find('chi').text) - blockSize = int(root.find('blockSize').text) - failureRate = int(root.find('failureRate').text) - tta = int(root.find('tta').text) - - #Create a key for this combination of run, numberValidators, netDegree, and chi if it does not exist yet - key = (run, numberValidators, netDegree, chi) - if key not in data: - data[key] = {'blockSizes': [], 'failureRates': [], 'ttas': []} - - #Append the data used for the plot - data[key]['blockSizes'].append(blockSize) - data[key]['failureRates'].append(failureRate) - data[key]['ttas'].append(tta) - -#Store the 2D heatmaps in a folder -heatmaps_folder = 'heatmaps' -if not os.path.exists(heatmaps_folder): - os.makedirs(heatmaps_folder) - -#Plot the heatmaps -for key, values in data.items(): - hist, xedges, yedges = np.histogram2d(values['blockSizes'], values['failureRates'], bins=(10, 10), weights=values['ttas']) - plt.imshow(hist, extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]]) - plt.xlabel('blockSize') - plt.ylabel('failureRate') - plt.colorbar().set_label('tta') - title = f"run={key[0]}, numberValidators={key[1]}, netDegree={key[2]}, chi={key[3]}" - plt.title(title) - filename = f"run={key[0]}_numberValidators={key[1]}_netDegree={key[2]}_chi={key[3]}.png" - plt.savefig(os.path.join(heatmaps_folder, filename)) - plt.clf() From a6896a60dde6c2ba45639aa315465d3e13e2c131 Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Wed, 22 Feb 2023 13:47:52 +0100 Subject: [PATCH 012/162] Fixed Plots --- results/plots.py | 208 +++++++++++++++++++++++++---------------------- 1 file changed, 113 insertions(+), 95 deletions(-) diff --git a/results/plots.py b/results/plots.py index 7955ef5..2eacb95 100644 --- a/results/plots.py +++ b/results/plots.py @@ -6,115 +6,133 @@ import numpy as np import seaborn as sns from itertools import combinations +parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', 'chi'] + #Title formatting for the figures def formatTitle(key): name = ''.join([f" {char}" if char.isupper() else char for char in key.split('_')[0]]) number = key.split('_')[1] return f"{name.title()}: {number} " - -results_folder = os.getcwd() -#Get all folders and store their time info and sort -directories = [d for d in os.listdir(results_folder) if os.path.isdir(os.path.join(results_folder, d))] -directories_ctime = [(d, os.path.getctime(os.path.join(results_folder, d))) for d in directories] -directories_ctime.sort(key=lambda x: x[1], reverse=True) +def getLatestDirectory(): + resultsFolder = os.getcwd() -#Get the path of the latest created folder -latest_directory = directories_ctime[0][0] -folder_path = os.path.join(results_folder, latest_directory) + #Get all folders and store their time info and sort + directories = [d for d in os.listdir(resultsFolder) if os.path.isdir(os.path.join(resultsFolder, d))] + directoriesTime = [(d, os.path.getctime(os.path.join(resultsFolder, d))) for d in directories] + directoriesTime.sort(key=lambda x: x[1], reverse=True) -#Store data with a unique key for each params combination -data = {} -plotInfo = {} + #Get the path of the latest created folder + latestDirectory = directoriesTime[0][0] + folderPath = os.path.join(resultsFolder, latestDirectory) + return folderPath -parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', 'chi'] +def plottingData(folderPath): + #Store data with a unique key for each params combination + data = {} + plotInfo = {} -#Loop over the xml files in the folder -for filename in os.listdir(folder_path): - #Loop over the xmls and store the data in variables - if filename.endswith('.xml'): - tree = ET.parse(os.path.join(folder_path, filename)) - root = tree.getroot() - run = int(root.find('run').text) - blockSize = int(root.find('blockSize').text) - failureRate = int(root.find('failureRate').text) - numberValidators = int(root.find('numberValidators').text) - netDegree = int(root.find('netDegree').text) - chi = int(root.find('chi').text) - tta = int(root.find('tta').text) + #Loop over the xml files in the folder + for filename in os.listdir(folderPath): + #Loop over the xmls and store the data in variables + if filename.endswith('.xml'): + tree = ET.parse(os.path.join(folderPath, filename)) + root = tree.getroot() + run = int(root.find('run').text) + blockSize = int(root.find('blockSize').text) + failureRate = int(root.find('failureRate').text) + numberValidators = int(root.find('numberValidators').text) + netDegree = int(root.find('netDegree').text) + chi = int(root.find('chi').text) + tta = int(root.find('tta').text) - # Loop over all possible combinations of length 4 of the parameters - for combination in combinations(parameters, 4): - # Get the indices and values of the parameters in the combination - indices = [parameters.index(element) for element in combination] - selected_values = [run, blockSize, failureRate, numberValidators, netDegree, chi] - values = [selected_values[index] for index in indices] - names = [parameters[i] for i in indices] - keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] - key = tuple(keyComponents[:4]) - #Get the names of the other 2 parameters that are not included in the key - other_params = [parameters[i] for i in range(6) if i not in indices] - #Append the values of the other 2 parameters and the ttas to the lists for the key - other_indices = [i for i in range(len(parameters)) if i not in indices] + # Loop over all possible combinations of length 4 of the parameters + for combination in combinations(parameters, 4): + # Get the indices and values of the parameters in the combination + indices = [parameters.index(element) for element in combination] + selectedValues = [run, blockSize, failureRate, numberValidators, netDegree, chi] + values = [selectedValues[index] for index in indices] + names = [parameters[i] for i in indices] + keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] + key = tuple(keyComponents[:4]) + #Get the names of the other 2 parameters that are not included in the key + otherParams = [parameters[i] for i in range(6) if i not in indices] + #Append the values of the other 2 parameters and the ttas to the lists for the key + otherIndices = [i for i in range(len(parameters)) if i not in indices] - #Initialize the dictionary for the key if it doesn't exist yet - if key not in data: - data[key] = {} - #Initialize lists for the other 2 parameters and the ttas with the key - data[key][other_params[0]] = [] - data[key][other_params[1]] = [] - data[key]['ttas'] = [] + #Initialize the dictionary for the key if it doesn't exist yet + if key not in data: + data[key] = {} + #Initialize lists for the other 2 parameters and the ttas with the key + data[key][otherParams[0]] = [] + data[key][otherParams[1]] = [] + data[key]['ttas'] = [] - if other_params[0] in data[key]: - data[key][other_params[0]].append(selected_values[other_indices[0]]) - else: - data[key][other_params[0]] = [selected_values[other_indices[0]]] - if other_params[1] in data[key]: - data[key][other_params[1]].append(selected_values[other_indices[1]]) - else: - data[key][other_params[1]] = [selected_values[other_indices[1]]] - data[key]['ttas'].append(tta) + if otherParams[0] in data[key]: + data[key][otherParams[0]].append(selectedValues[otherIndices[0]]) + else: + data[key][otherParams[0]] = [selectedValues[otherIndices[0]]] + if otherParams[1] in data[key]: + data[key][otherParams[1]].append(selectedValues[otherIndices[1]]) + else: + data[key][otherParams[1]] = [selectedValues[otherIndices[1]]] + data[key]['ttas'].append(tta) + return data +def similarKeys(data): + #Get the keys for all data with the same x and y labels + filteredKeys = {} + for key1, value1 in data.items(): + subKeys1 = list(value1.keys()) + filteredKeys[(subKeys1[0], subKeys1[1])] = [key1] + for key2, value2 in data.items(): + subKeys2 = list(value2.keys()) + if key1 != key2 and subKeys1[0] == subKeys2[0] and subKeys1[1] == subKeys2[1]: + try: + filteredKeys[(subKeys1[0], subKeys1[1])].append(key2) + except KeyError: + filteredKeys[(subKeys1[0], subKeys1[1])] = [key2] + return filteredKeys -#Get the keys for all data with the same x and y labels -filtered_keys = {} -for key1, value1 in data.items(): - sub_keys1 = list(value1.keys()) - filtered_keys[(sub_keys1[0], sub_keys1[1])] = [key1] - for key2, value2 in data.items(): - sub_keys2 = list(value2.keys()) - if key1 != key2 and sub_keys1[0] == sub_keys2[0] and sub_keys1[1] == sub_keys2[1]: - try: - filtered_keys[(sub_keys1[0], sub_keys1[1])].append(key2) - except KeyError: - filtered_keys[(sub_keys1[0], sub_keys1[1])] = [key2] +def plotHeatmaps(filteredKeys, data): + #Store the 2D heatmaps in a folder + heatmapsFolder = 'heatmaps' + if not os.path.exists(heatmapsFolder): + os.makedirs(heatmapsFolder) -#Store the 2D heatmaps in a folder -heatmaps_folder = 'heatmaps' -if not os.path.exists(heatmaps_folder): - os.makedirs(heatmaps_folder) + for labels, keys in filteredKeys.items(): + for key in keys: + xlabels = np.sort(np.unique(data[key][labels[0]])) + ylabels = np.sort(np.unique(data[key][labels[1]])) + hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas']) + hist = hist.T + fig, ax = plt.subplots(figsize=(10, 6)) + sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax) + plt.xlabel(labels[0]) + plt.ylabel(labels[1]) + filename = "" + title = "" + paramValueCnt = 0 + for param in parameters: + if param != labels[0] and param != labels[1]: + filename += f"{key[paramValueCnt]}" + title += formatTitle(key[paramValueCnt]) + paramValueCnt += 1 + title_obj = plt.title(title) + font_size = 16 * fig.get_size_inches()[0] / 10 + title_obj.set_fontsize(font_size) + filename = filename + ".png" + targetFolder = os.path.join(heatmapsFolder, f"{labels[0]}Vs{labels[1]}") + if not os.path.exists(targetFolder): + os.makedirs(targetFolder) + plt.savefig(os.path.join(targetFolder, filename)) + plt.close() + plt.clf() -for labels, keys in filtered_keys.items(): - for key in keys: - hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(3, 3), weights=data[key]['ttas']) - hist = hist.T - xlabels = [f'{val:.2f}' for val in xedges[::2]] + [f'{xedges[-1]:.2f}'] - ylabels = [f'{val:.2f}' for val in yedges[::2]] + [f'{yedges[-1]:.2f}'] - sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f") - plt.xlabel(labels[0]) - plt.ylabel(labels[1]) - filename = "" - title = "" - paramValueCnt = 0 - for param in parameters: - if param != labels[0] and param != labels[1]: - filename += f"{key[paramValueCnt]}" - title += formatTitle(key[paramValueCnt]) - paramValueCnt += 1 - plt.title(title) - filename = filename + ".png" - target_folder = os.path.join(heatmaps_folder, f"{labels[0]}Vs{labels[1]}") - if not os.path.exists(target_folder): - os.makedirs(target_folder) - plt.savefig(os.path.join(target_folder, filename)) - plt.clf() \ No newline at end of file +def generateHeatmaps(): + folderPath = getLatestDirectory() + data = plottingData(folderPath) + filteredKeys = similarKeys(data) + plotHeatmaps(filteredKeys, data) + +generateHeatmaps() \ No newline at end of file From d5e7ae7ea7580c2a0fa2aff924bbcc97b20c1518 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 22 Feb 2023 14:49:46 +0100 Subject: [PATCH 013/162] Fix net degree bug --- DAS/simulator.py | 1 - study.py | 20 +++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 75a6692..bbb200c 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -42,7 +42,6 @@ class Simulator: self.validators.append(val) def initNetwork(self): - self.shape.netDegree = 6 rowChannels = [[] for i in range(self.shape.blockSize)] columnChannels = [[] for i in range(self.shape.blockSize)] for v in self.validators: diff --git a/study.py b/study.py index e1ce157..c5eed14 100644 --- a/study.py +++ b/study.py @@ -26,20 +26,22 @@ def study(): 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, config.netDegreeStep): + for netDegree in range(config.netDegreeStart, config.netDegreeStop+1, config.netDegreeStep): for chi in range(config.chiStart, config.chiStop+1, config.chiStep): if not config.deterministic: random.seed(datetime.now()) - 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" % (str(sim.shape.__dict__), result.blockAvailable), extra=sim.format) - results.append(copy.deepcopy(result)) - simCnt += 1 + # 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" % (str(sim.shape.__dict__), result.blockAvailable), 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) From 8b763b2425169d04c16ef779827f6766a0db96e3 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 22 Feb 2023 15:52:55 +0100 Subject: [PATCH 014/162] Passing execID in parameter and moving heatmaps directory inside the execID directory --- results/plots.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/results/plots.py b/results/plots.py index 2eacb95..b22dd2f 100644 --- a/results/plots.py +++ b/results/plots.py @@ -1,4 +1,4 @@ -import os +import os, sys import time import xml.etree.ElementTree as ET import matplotlib.pyplot as plt @@ -14,7 +14,7 @@ def formatTitle(key): number = key.split('_')[1] return f"{name.title()}: {number} " -def getLatestDirectory(): +def getLatestDirectory(): resultsFolder = os.getcwd() #Get all folders and store their time info and sort @@ -94,9 +94,9 @@ def similarKeys(data): filteredKeys[(subKeys1[0], subKeys1[1])] = [key2] return filteredKeys -def plotHeatmaps(filteredKeys, data): +def plotHeatmaps(folderPath, filteredKeys, data): #Store the 2D heatmaps in a folder - heatmapsFolder = 'heatmaps' + heatmapsFolder = folderPath+'/heatmaps' if not os.path.exists(heatmapsFolder): os.makedirs(heatmapsFolder) @@ -129,10 +129,10 @@ def plotHeatmaps(filteredKeys, data): plt.close() plt.clf() -def generateHeatmaps(): - folderPath = getLatestDirectory() +def generateHeatmaps(folderPath): + #folderPath = getLatestDirectory() data = plottingData(folderPath) filteredKeys = similarKeys(data) - plotHeatmaps(filteredKeys, data) + plotHeatmaps(folderPath, filteredKeys, data) -generateHeatmaps() \ No newline at end of file +generateHeatmaps(sys.argv[1]) From 93c318028b6dfe9774e59b722ec7caed741bfa89 Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Wed, 22 Feb 2023 16:45:39 +0100 Subject: [PATCH 015/162] Add visualizer class --- DAS/__init__.py | 1 + DAS/visualizer.py | 22 ++++++++++++++++++++++ study.py | 4 ++++ 3 files changed, 27 insertions(+) create mode 100644 DAS/visualizer.py diff --git a/DAS/__init__.py b/DAS/__init__.py index 8dd11bf..c7fc7c0 100644 --- a/DAS/__init__.py +++ b/DAS/__init__.py @@ -1,3 +1,4 @@ from DAS.simulator import * from DAS.configuration import * from DAS.shape import * +from DAS.visualizer import * diff --git a/DAS/visualizer.py b/DAS/visualizer.py new file mode 100644 index 0000000..881d658 --- /dev/null +++ b/DAS/visualizer.py @@ -0,0 +1,22 @@ +#!/bin/python3 + +class Visualizer: + + def __init__(self, execID): + self.execID = execID + self.folderPath = "results/"+self.execID + + def plottingData(self): + data = [] + print("Getting data from the folder...") + return data + + def similarKeys(self, data): + filteredKeys = [] + print("Getting filtered keys from data...") + return filteredKeys + + def plotHeatmaps(self): + data = self.plottingData() + filteredKeys = self.similarKeys(data) + print("Plotting heatmaps...") diff --git a/study.py b/study.py index c5eed14..438fba4 100644 --- a/study.py +++ b/study.py @@ -51,6 +51,10 @@ def study(): res.dump(execID) sim.logger.info("Results dumped into results/%s/" % (execID), extra=sim.format) + visualization = 1 + if visualization: + vis = Visualizer(execID) + vis.plotHeatmaps() study() From 22e4c89989eb42df6fe5eea244d68a3a45b5dd89 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 16 Feb 2023 17:32:57 +0100 Subject: [PATCH 016/162] fix: column IDs matching row IDs Fixes a simple copy paste error. Signed-off-by: Csaba Kiraly --- DAS/validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DAS/validator.py b/DAS/validator.py index 6344925..3270c38 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -50,7 +50,7 @@ class Validator: self.columnIDs = range(shape.blockSize) else: self.rowIDs = rows[(self.ID*self.shape.chi):(self.ID*self.shape.chi + self.shape.chi)] - self.columnIDs = rows[(self.ID*self.shape.chi):(self.ID*self.shape.chi + self.shape.chi)] + self.columnIDs = columns[(self.ID*self.shape.chi):(self.ID*self.shape.chi + self.shape.chi)] #if shape.deterministic: # random.seed(self.ID) #self.rowIDs = random.sample(range(self.shape.blockSize), self.shape.chi) From 8c9ddcca5598bb312db3b84b5fd7c5e53cc086dc Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 02:51:47 +0100 Subject: [PATCH 017/162] add debug logging of topology Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/DAS/simulator.py b/DAS/simulator.py index 3e6e496..33d7794 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -75,6 +75,11 @@ class Simulator: val1.columnNeighbors[id].update({val2.ID : Neighbor(val2, self.shape.blockSize)}) val2.columnNeighbors[id].update({val1.ID : Neighbor(val1, self.shape.blockSize)}) + if self.logger.isEnabledFor(logging.DEBUG): + for i in range(1, self.shape.numberValidators): + self.logger.debug("Val %d : rowN %s", i, self.validators[i].rowNeighbors, extra=self.format) + self.logger.debug("Val %d : colN %s", i, self.validators[i].columnNeighbors, extra=self.format) + def initLogger(self): """It initializes the logger.""" logger = logging.getLogger("DAS") From 2775d180f11be032047fdc709555a2549ffc68c7 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 16 Feb 2023 17:33:31 +0100 Subject: [PATCH 018/162] debug log neighborhood of producer as well Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 33d7794..07cd5d4 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -76,7 +76,7 @@ class Simulator: val2.columnNeighbors[id].update({val1.ID : Neighbor(val1, self.shape.blockSize)}) if self.logger.isEnabledFor(logging.DEBUG): - for i in range(1, self.shape.numberValidators): + for i in range(0, self.shape.numberValidators): self.logger.debug("Val %d : rowN %s", i, self.validators[i].rowNeighbors, extra=self.format) self.logger.debug("Val %d : colN %s", i, self.validators[i].columnNeighbors, extra=self.format) From 91a4b489479825aa95885d0b5cb6b787728e59b0 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 3 Feb 2023 23:05:37 +0100 Subject: [PATCH 019/162] log number of steps as well Signed-off-by: Csaba Kiraly --- study.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/study.py b/study.py index 68663b8..25e8735 100644 --- a/study.py +++ b/study.py @@ -37,7 +37,7 @@ def study(): sim.initValidators() sim.initNetwork() result = sim.run() - sim.logger.info("Shape: %s ... Block Available: %d" % (str(sim.shape.__dict__), result.blockAvailable), extra=sim.format) + 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 From e5c657e31e6642cca88af4f393331ff9a0d12132 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 02:55:06 +0100 Subject: [PATCH 020/162] more debug logging Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DAS/simulator.py b/DAS/simulator.py index 3e6e496..a8cec35 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -106,14 +106,18 @@ class Simulator: while(True): missingVector.append(missingSamples) oldMissingSamples = missingSamples + self.logger.debug("PHASE SEND %d" % steps, extra=self.format) for i in range(0,self.shape.numberValidators): self.validators[i].sendRows() self.validators[i].sendColumns() + self.logger.debug("PHASE RECEIVE %d" % steps, extra=self.format) for i in range(1,self.shape.numberValidators): self.validators[i].receiveRowsColumns() + self.logger.debug("PHASE RESTORE %d" % steps, extra=self.format) for i in range(1,self.shape.numberValidators): self.validators[i].restoreRows() self.validators[i].restoreColumns() + self.logger.debug("PHASE LOG %d" % steps, extra=self.format) for i in range(0,self.shape.numberValidators): self.validators[i].logRows() self.validators[i].logColumns() From 763ebfe1369891d6ba7bc03197bffd8d1fe97561 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 02:50:03 +0100 Subject: [PATCH 021/162] set up complete graph if n<=d If the number of nodes in a channel is smaller or equal than the requested degree, a fully connected graph is used. For n>d, a random d-regular graph is set up. (For n=d+1, the two are the same.) Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 3e6e496..5553087 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -53,9 +53,14 @@ class Simulator: for id in range(self.shape.blockSize): - if (len(rowChannels[id]) < self.shape.netDegree): - self.logger.error("Graph degree higher than %d" % len(rowChannels[id]), extra=self.format) - G = nx.random_regular_graph(self.shape.netDegree, len(rowChannels[id])) + # If the number of nodes in a channel is smaller or equal to the + # requested degree, a fully connected graph is used. For n>d, a random + # d-regular graph is set up. (For n=d+1, the two are the same.) + if (len(rowChannels[id]) <= self.shape.netDegree): + self.logger.debug("Graph fully connected with degree %d !" % (len(rowChannels[id]) - 1), extra=self.format) + G = nx.complete_graph(len(rowChannels[id])) + else: + G = nx.random_regular_graph(self.shape.netDegree, len(rowChannels[id])) if not nx.is_connected(G): self.logger.error("Graph not connected for row %d !" % id, extra=self.format) for u, v in G.edges: @@ -64,9 +69,11 @@ class Simulator: val1.rowNeighbors[id].update({val2.ID : Neighbor(val2, self.shape.blockSize)}) val2.rowNeighbors[id].update({val1.ID : Neighbor(val1, self.shape.blockSize)}) - if (len(columnChannels[id]) < self.shape.netDegree): - self.logger.error("Graph degree higher than %d" % len(columnChannels[id]), extra=self.format) - G = nx.random_regular_graph(self.shape.netDegree, len(columnChannels[id])) + if (len(columnChannels[id]) <= self.shape.netDegree): + self.logger.debug("Graph fully connected with degree %d !" % (len(columnChannels[id]) - 1), extra=self.format) + G = nx.complete_graph(len(columnChannels[id])) + else: + G = nx.random_regular_graph(self.shape.netDegree, len(columnChannels[id])) if not nx.is_connected(G): self.logger.error("Graph not connected for column %d !" % id, extra=self.format) for u, v in G.edges: From 6e42055cb9c768de5653d192fc4a973411f51d4e Mon Sep 17 00:00:00 2001 From: Leonardo Bautista-Gomez Date: Thu, 23 Feb 2023 12:16:43 +0100 Subject: [PATCH 022/162] Add some more configuration parameters and some more testing --- DAS/configuration.py | 90 +++++++++++++++++++++++++++++++------------- DAS/simulator.py | 4 +- config.ini | 4 +- study.py | 2 +- 4 files changed, 69 insertions(+), 31 deletions(-) diff --git a/DAS/configuration.py b/DAS/configuration.py index c840366..2ff9d68 100644 --- a/DAS/configuration.py +++ b/DAS/configuration.py @@ -1,6 +1,6 @@ #!/bin/python3 -import configparser +import configparser, logging, sys class Configuration: """This class stores all the configuration parameters for the given run.""" @@ -11,39 +11,75 @@ class Configuration: config = configparser.RawConfigParser() config.read(fileName) - self.nvStart = int(config.get("Simulation Space", "numberValidatorStart")) - self.nvStop = int(config.get("Simulation Space", "numberValidatorStop")) - self.nvStep = int(config.get("Simulation Space", "numberValidatorStep")) + 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.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.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.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")) + 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 :( ") - self.numberRuns = int(config.get("Advanced", "numberRuns")) - self.deterministic = config.get("Advanced", "deterministic") - self.dumpXML = config.get("Advanced", "dumpXML") - if self.nvStop < (self.blockSizeStart*4): - print("ERROR: The number of validators cannot be lower than the block size * 4") - exit(1) - if self.chiStart < 1: - print("Chi has to be greater than 0") - exit(1) + + 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: - print("Chi (%d) has to be smaller or equal to block the size (%d)" % (self.chiStop, self.blockSizeStart)) - exit(1) + sys.exit("Configuration Error: Chi (%d) has to be smaller or equal to block the size (%d)" % (self.chiStop, self.blockSizeStart)) diff --git a/DAS/simulator.py b/DAS/simulator.py index 267fa82..b0902d9 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -11,14 +11,14 @@ from DAS.validator import * class Simulator: """This class implements the main DAS simulator.""" - def __init__(self, shape): + def __init__(self, shape, config): """It initializes the simulation with a set of parameters (shape).""" self.shape = shape self.format = {"entity": "Simulator"} self.result = Result(self.shape) self.validators = [] self.logger = [] - self.logLevel = logging.INFO + self.logLevel = config.logLevel self.proposerID = 0 self.glob = [] diff --git a/config.ini b/config.ini index 052f754..12bd749 100644 --- a/config.ini +++ b/config.ini @@ -14,7 +14,7 @@ blockSizeStep = 16 netDegreeStart = 6 netDegreeStop = 8 -netDegreeStep = 1 +netDegreeStep = 2 chiStart = 4 chiStop = 8 @@ -26,3 +26,5 @@ chiStep = 2 deterministic = 0 numberRuns = 2 dumpXML = 1 +visualization = 1 +logLevel = INFO diff --git a/study.py b/study.py index 25e8735..0df9365 100644 --- a/study.py +++ b/study.py @@ -11,7 +11,7 @@ def study(): config = Configuration(sys.argv[1]) shape = Shape(0, 0, 0, 0, 0, 0) - sim = Simulator(shape) + sim = Simulator(shape, config) sim.initLogger() results = [] simCnt = 0 From 7ae66810f70b24e14e2c82ef45bff3edb2965c5d Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Thu, 23 Feb 2023 14:37:45 +0100 Subject: [PATCH 023/162] vis class --- DAS/visualizer.py | 112 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 881d658..9ab37c2 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -1,22 +1,130 @@ #!/bin/python3 +import os, sys +import time +import xml.etree.ElementTree as ET +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns +from itertools import combinations class Visualizer: def __init__(self, execID): self.execID = execID self.folderPath = "results/"+self.execID + self.parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', 'chi'] + #Store data with a unique key for each params combination def plottingData(self): - data = [] + data = {} + #Loop over the xml files in the folder + for filename in os.listdir(self.folderPath): + #Loop over the xmls and store the data in variables + if filename.endswith('.xml'): + tree = ET.parse(os.path.join(self.folderPath, filename)) + root = tree.getroot() + run = int(root.find('run').text) + blockSize = int(root.find('blockSize').text) + failureRate = int(root.find('failureRate').text) + numberValidators = int(root.find('numberValidators').text) + netDegree = int(root.find('netDegree').text) + chi = int(root.find('chi').text) + tta = int(root.find('tta').text) + + # Loop over all possible combinations of length 4 of the parameters + for combination in combinations(self.parameters, 4): + # Get the indices and values of the parameters in the combination + indices = [self.parameters.index(element) for element in combination] + selectedValues = [run, blockSize, failureRate, numberValidators, netDegree, chi] + values = [selectedValues[index] for index in indices] + names = [self.parameters[i] for i in indices] + keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] + key = tuple(keyComponents[:4]) + #Get the names of the other 2 parameters that are not included in the key + otherParams = [self.parameters[i] for i in range(6) if i not in indices] + #Append the values of the other 2 parameters and the ttas to the lists for the key + otherIndices = [i for i in range(len(self.parameters)) if i not in indices] + + #Initialize the dictionary for the key if it doesn't exist yet + if key not in data: + data[key] = {} + #Initialize lists for the other 2 parameters and the ttas with the key + data[key][otherParams[0]] = [] + data[key][otherParams[1]] = [] + data[key]['ttas'] = [] + + if otherParams[0] in data[key]: + data[key][otherParams[0]].append(selectedValues[otherIndices[0]]) + else: + data[key][otherParams[0]] = [selectedValues[otherIndices[0]]] + if otherParams[1] in data[key]: + data[key][otherParams[1]].append(selectedValues[otherIndices[1]]) + else: + data[key][otherParams[1]] = [selectedValues[otherIndices[1]]] + data[key]['ttas'].append(tta) print("Getting data from the folder...") return data + #Get the keys for all data with the same x and y labels def similarKeys(self, data): - filteredKeys = [] + filteredKeys = {} + for key1, value1 in data.items(): + subKeys1 = list(value1.keys()) + filteredKeys[(subKeys1[0], subKeys1[1])] = [key1] + for key2, value2 in data.items(): + subKeys2 = list(value2.keys()) + if key1 != key2 and subKeys1[0] == subKeys2[0] and subKeys1[1] == subKeys2[1]: + try: + filteredKeys[(subKeys1[0], subKeys1[1])].append(key2) + except KeyError: + filteredKeys[(subKeys1[0], subKeys1[1])] = [key2] print("Getting filtered keys from data...") return filteredKeys + #Title formatting for the figures + def formatTitle(self, key): + name = ''.join([f" {char}" if char.isupper() else char for char in key.split('_')[0]]) + number = key.split('_')[1] + return f"{name.title()}: {number} " + + #Plot and store the 2D heatmaps in subfolders def plotHeatmaps(self): data = self.plottingData() filteredKeys = self.similarKeys(data) print("Plotting heatmaps...") + + #Create the directory if it doesn't exist already + heatmapsFolder = self.folderPath + '/heatmaps' + if not os.path.exists(heatmapsFolder): + os.makedirs(heatmapsFolder) + + #Plot + for labels, keys in filteredKeys.items(): + for key in keys: + xlabels = np.sort(np.unique(data[key][labels[0]])) + ylabels = np.sort(np.unique(data[key][labels[1]])) + hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas']) + hist = hist.T + fig, ax = plt.subplots(figsize=(10, 6)) + sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax) + plt.xlabel(labels[0]) + plt.ylabel(labels[1]) + filename = "" + title = "" + paramValueCnt = 0 + for param in self.parameters: + if param != labels[0] and param != labels[1]: + filename += f"{key[paramValueCnt]}" + formattedTitle = self.formatTitle(key[paramValueCnt]) + title += formattedTitle + paramValueCnt += 1 + title_obj = plt.title(title) + font_size = 16 * fig.get_size_inches()[0] / 10 + title_obj.set_fontsize(font_size) + filename = filename + ".png" + targetFolder = os.path.join(heatmapsFolder, f"{labels[0]}Vs{labels[1]}") + if not os.path.exists(targetFolder): + os.makedirs(targetFolder) + plt.savefig(os.path.join(targetFolder, filename)) + plt.close() + plt.clf() From bb8d05257bfe80c1ec2a97dbd6b4bd5e132680d0 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 26 Jan 2023 14:29:12 +0100 Subject: [PATCH 024/162] WIP: initial implementation of uplink bandwidth limit - approximate: BW is not handled strict, entire rows are sent and can go over limit - WIP: work in progress implementation Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 3 +- DAS/validator.py | 126 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 88 insertions(+), 41 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index b0902d9..5b60413 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -120,8 +120,7 @@ class Simulator: oldMissingSamples = missingSamples self.logger.debug("PHASE SEND %d" % steps, extra=self.format) for i in range(0,self.shape.numberValidators): - self.validators[i].sendRows() - self.validators[i].sendColumns() + self.validators[i].send() self.logger.debug("PHASE RECEIVE %d" % steps, extra=self.format) for i in range(1,self.shape.numberValidators): self.validators[i].receiveRowsColumns() diff --git a/DAS/validator.py b/DAS/validator.py index 3270c38..89ca316 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -7,6 +7,17 @@ from DAS.block import * from bitarray import bitarray from bitarray.util import zeros +def shuffled(lis): + # based on https://stackoverflow.com/a/60342323 + for index in random.sample(range(len(lis)), len(lis)): + yield lis[index] + +class NextToSend: + def __init__(self, neigh, toSend, id, dim): + self.neigh = neigh + self.toSend = toSend + self.id = id + self.dim = dim class Neighbor: """This class implements a node neighbor to monitor sent and received data.""" @@ -55,8 +66,6 @@ class Validator: # random.seed(self.ID) #self.rowIDs = random.sample(range(self.shape.blockSize), self.shape.chi) #self.columnIDs = random.sample(range(self.shape.blockSize), self.shape.chi) - self.changedRow = {id:False for id in self.rowIDs} - self.changedColumn = {id:False for id in self.columnIDs} self.rowNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict) @@ -66,6 +75,13 @@ class Validator: self.statsRxInSlot = 0 self.statsRxPerSlot = [] + # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) + # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 + # TODO: this should be a parameter + self.bwUplink = 1100 if not self.amIproposer else 22000 # approx. 100Mbps and 2Gbps + + self.sched = self.nextToSend() + def logIDs(self): """It logs the assigned rows and columns.""" if self.amIproposer == 1: @@ -99,9 +115,6 @@ class Validator: else: self.block.data[i] = 0 - self.changedRow = {id:True for id in self.rowIDs} - self.changedColumn = {id:True for id in self.columnIDs} - nbFailures = self.block.data.count(0) measuredFailureRate = nbFailures * 100 / (self.shape.blockSize * self.shape.blockSize) self.logger.debug("Number of failures: %d (%0.02f %%)", nbFailures, measuredFailureRate, extra=self.format) @@ -144,16 +157,6 @@ class Validator: self.logger.debug("Receiving the data...", extra=self.format) #self.logger.debug("%s -> %s", self.block.data, self.receivedBlock.data, extra=self.format) - self.changedRow = { id: - self.getRow(id) != self.receivedBlock.getRow(id) - for id in self.rowIDs - } - - self.changedColumn = { id: - self.getColumn(id) != self.receivedBlock.getColumn(id) - for id in self.columnIDs - } - self.block.merge(self.receivedBlock) for neighs in self.rowNeighbors.values(): @@ -175,47 +178,92 @@ class Validator: self.statsTxInSlot = 0 - def sendColumn(self, columnID): - """It sends any new sample in the given column.""" + def nextColumnToSend(self, columnID): line = self.getColumn(columnID) if line.any(): self.logger.debug("col %d -> %s", columnID, self.columnNeighbors[columnID] , extra=self.format) - for n in self.columnNeighbors[columnID].values(): + for n in shuffled(list(self.columnNeighbors[columnID].values())): # if there is anything new to send, send it toSend = line & ~n.sent & ~n.received if (toSend).any(): - n.sent |= toSend; - n.node.receiveColumn(columnID, toSend, self.ID) - self.statsTxInSlot += toSend.count(1) + yield NextToSend(n, toSend, columnID, 1) - def sendRow(self, rowID): - """It sends any new sample in the given row.""" + def nextRowToSend(self, rowID): line = self.getRow(rowID) if line.any(): self.logger.debug("row %d -> %s", rowID, self.rowNeighbors[rowID], extra=self.format) - for n in self.rowNeighbors[rowID].values(): + for n in shuffled(list(self.rowNeighbors[rowID].values())): # if there is anything new to send, send it toSend = line & ~n.sent & ~n.received if (toSend).any(): - n.sent |= toSend; - n.node.receiveRow(rowID, toSend, self.ID) - self.statsTxInSlot += toSend.count(1) + yield NextToSend(n, toSend, rowID, 0) - def sendRows(self): - """It sends all restored rows.""" - self.logger.debug("Sending restored rows...", extra=self.format) - for r in self.rowIDs: - if self.changedRow[r]: - self.sendRow(r) + def nextToSend(self): + """ Send scheduler as a generator function + + Yields next segment(s) to send when asked for it. + Generates an infinite flow, returning with exit only when + there is nothing more to send. - def sendColumns(self): - """It sends all restored columns.""" - self.logger.debug("Sending restored columns...", extra=self.format) - for c in self.columnIDs: - if self.changedColumn[c]: - self.sendColumn(c) + Generates a randomized order of columns and rows, sending to one neighbor + at each before sending to another neighbor. + Generates a new randomized ordering once all columns, rows, and neighbors + are processed once. + """ + + while True: + perLine = [] + for c in self.columnIDs: + perLine.append(self.nextColumnToSend(c)) + + for r in self.rowIDs: + perLine.append(self.nextRowToSend(r)) + + count = 0 + random.shuffle(perLine) + while (perLine): + for g in perLine.copy(): # we need a shallow copy to allow remove + n = next(g, None) + if not n: + perLine.remove(g) + continue + count += 1 + yield n + + # return if there is nothing more to send + if not count: + return + + def send(self): + """ Send as much as we can in the timeslot, limited by bwUplink + """ + + for n in self.sched: + neigh = n.neigh + toSend = n.toSend + id = n.id + dim = n.dim + + neigh.sent |= toSend; + if dim == 0: + neigh.node.receiveRow(id, toSend, self.ID) + else: + neigh.node.receiveColumn(id, toSend, self.ID) + + sent = toSend.count(1) + self.statsTxInSlot += sent + self.logger.debug("sending %s %d to %d (%d)", + "col" if dim else "row", id, neigh.node.ID, sent, extra=self.format) + + # until we exhaust capacity + # TODO: use exact limit + if self.statsTxInSlot >self.bwUplink: + return + + # Scheduler exited, nothing to send. Create new one for next round. + self.sched = self.nextToSend() def logRows(self): """It logs the rows assigned to the validator.""" From 07437ddde8cfca782d51bf8cac9f4f2704e2e643 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 7 Feb 2023 14:44:33 +0100 Subject: [PATCH 025/162] fixup bwUplink check (still approximate) Signed-off-by: Csaba Kiraly --- DAS/validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DAS/validator.py b/DAS/validator.py index 89ca316..ba33170 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -259,7 +259,7 @@ class Validator: # until we exhaust capacity # TODO: use exact limit - if self.statsTxInSlot >self.bwUplink: + if self.statsTxInSlot >= self.bwUplink: return # Scheduler exited, nothing to send. Create new one for next round. From eb277d9b4307c7596436f4c49036968182157845 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 3 Feb 2023 23:07:55 +0100 Subject: [PATCH 026/162] limit batchsize of sending from a line Signed-off-by: Csaba Kiraly --- DAS/validator.py | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index ba33170..88ef42a 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -3,6 +3,7 @@ import random import collections import logging +import sys from DAS.block import * from bitarray import bitarray from bitarray.util import zeros @@ -12,6 +13,34 @@ def shuffled(lis): for index in random.sample(range(len(lis)), len(lis)): yield lis[index] +def sampleLine(line, limit): + """ sample up to 'limit' bits from a bitarray + + Since this is quite expensive, we use a number of heuristics to get it fast. + """ + if limit == sys.maxsize : + return line + else: + w = line.count(1) + if limit >= w : + return line + else: + l = len(line) + r = zeros(l) + if w < l/10 or limit > l/2 : + indices = [ i for i in range(l) if line[i] ] + sample = random.sample(indices, limit) + for i in sample: + r[i] = 1 + return r + else: + while limit: + i = random.randrange(0, l) + if line[i] and not r[i]: + r[i] = 1 + limit -= 1 + return r + class NextToSend: def __init__(self, neigh, toSend, id, dim): self.neigh = neigh @@ -177,8 +206,7 @@ class Validator: self.statsRxInSlot = 0 self.statsTxInSlot = 0 - - def nextColumnToSend(self, columnID): + def nextColumnToSend(self, columnID, limit = sys.maxsize): line = self.getColumn(columnID) if line.any(): self.logger.debug("col %d -> %s", columnID, self.columnNeighbors[columnID] , extra=self.format) @@ -187,9 +215,10 @@ class Validator: # if there is anything new to send, send it toSend = line & ~n.sent & ~n.received if (toSend).any(): + toSend = sampleLine(toSend, limit) yield NextToSend(n, toSend, columnID, 1) - def nextRowToSend(self, rowID): + def nextRowToSend(self, rowID, limit = sys.maxsize): line = self.getRow(rowID) if line.any(): self.logger.debug("row %d -> %s", rowID, self.rowNeighbors[rowID], extra=self.format) @@ -198,6 +227,7 @@ class Validator: # if there is anything new to send, send it toSend = line & ~n.sent & ~n.received if (toSend).any(): + toSend = sampleLine(toSend, limit) yield NextToSend(n, toSend, rowID, 0) def nextToSend(self): From 3917001e6ae8b6eac661c22dc8c6548b93545742 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 3 Feb 2023 23:08:53 +0100 Subject: [PATCH 027/162] send one segment at a time Signed-off-by: Csaba Kiraly --- DAS/validator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 88ef42a..244f2a0 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -246,10 +246,10 @@ class Validator: while True: perLine = [] for c in self.columnIDs: - perLine.append(self.nextColumnToSend(c)) + perLine.append(self.nextColumnToSend(c, 1)) for r in self.rowIDs: - perLine.append(self.nextRowToSend(r)) + perLine.append(self.nextRowToSend(r, 1)) count = 0 random.shuffle(perLine) From 3fc7455c0beafcae28ae9ca54404d5b68e392114 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Feb 2023 02:09:28 +0100 Subject: [PATCH 028/162] reduce default BW to more interesting values Signed-off-by: Csaba Kiraly --- DAS/validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DAS/validator.py b/DAS/validator.py index 244f2a0..fcdebf4 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -107,7 +107,7 @@ class Validator: # Set uplink bandwidth. In segments (~560 bytes) per timestep (50ms?) # 1 Mbps ~= 1e6 / 20 / 8 / 560 ~= 11 # TODO: this should be a parameter - self.bwUplink = 1100 if not self.amIproposer else 22000 # approx. 100Mbps and 2Gbps + self.bwUplink = 110 if not self.amIproposer else 2200 # approx. 10Mbps and 200Mbps self.sched = self.nextToSend() From 382954de027071fb6ffc4a8aa35e880dbc521971 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Feb 2023 02:11:44 +0100 Subject: [PATCH 029/162] add segment level send/receive Signed-off-by: Csaba Kiraly --- DAS/block.py | 6 ++++++ DAS/validator.py | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/DAS/block.py b/DAS/block.py index 693d7b6..e052fcb 100644 --- a/DAS/block.py +++ b/DAS/block.py @@ -20,6 +20,12 @@ class Block: """It merges (OR) the existing block with the received one.""" self.data |= merged.data + def getSegment(self, rowID, columnID): + return self.data[rowID*self.blockSize + columnID] + + def setSegment(self, rowID, columnID, v = 1): + self.data[rowID*self.blockSize + columnID] = v + def getColumn(self, columnID): """It returns the block column corresponding to columnID.""" return self.data[columnID::self.blockSize] diff --git a/DAS/validator.py b/DAS/validator.py index fcdebf4..5cec9e3 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -177,6 +177,20 @@ class Validator: else: pass + def receiveSegment(self, rID, cID, src): + # register receive so that we are not sending back + if rID in self.rowIDs: + if src in self.rowNeighbors[rID]: + self.rowNeighbors[rID][src].receiving[cID] = 1 + if cID in self.columnIDs: + if src in self.columnNeighbors[cID]: + self.columnNeighbors[cID][src].receiving[rID] = 1 + if not self.receivedBlock.getSegment(rID, cID): + self.receivedBlock.setSegment(rID, cID) + # else: + # self.statsRxDuplicateInSlot += 1 + self.statsRxInSlot += 1 + def receiveRowsColumns(self): """It receives rows and columns.""" @@ -266,6 +280,15 @@ class Validator: if not count: return + def sendSegmentToNeigh(self, rID, cID, neigh): + if not neigh.sent[cID] and not neigh.receiving[cID] : + neigh.sent[cID] = 1 + neigh.node.receiveSegment(rID, cID, self.ID) + self.statsTxInSlot += 1 + return True + else: + return False # received or already sent + def send(self): """ Send as much as we can in the timeslot, limited by bwUplink """ From 0f4883bf268c36e6a4668b9bf64dc72ea28b663a Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Feb 2023 02:13:00 +0100 Subject: [PATCH 030/162] add node level send queue Signed-off-by: Csaba Kiraly --- DAS/validator.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/DAS/validator.py b/DAS/validator.py index 5cec9e3..a887bb5 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -7,6 +7,8 @@ import sys from DAS.block import * from bitarray import bitarray from bitarray.util import zeros +from collections import deque + def shuffled(lis): # based on https://stackoverflow.com/a/60342323 @@ -78,6 +80,8 @@ class Validator: self.format = {"entity": "Val "+str(self.ID)} self.block = Block(self.shape.blockSize) self.receivedBlock = Block(self.shape.blockSize) + self.receivedQueue = [] + self.sendQueue = deque() self.amIproposer = amIproposer self.logger = logger if self.shape.chi < 1: @@ -187,6 +191,7 @@ class Validator: self.columnNeighbors[cID][src].receiving[rID] = 1 if not self.receivedBlock.getSegment(rID, cID): self.receivedBlock.setSegment(rID, cID) + self.receivedQueue.append((rID, cID)) # else: # self.statsRxDuplicateInSlot += 1 self.statsRxInSlot += 1 @@ -212,6 +217,10 @@ class Validator: neigh.received |= neigh.receiving neigh.receiving.setall(0) + # add newly received segments to the send queue + self.sendQueue.extend(self.receivedQueue) + self.receivedQueue.clear() + def updateStats(self): """It updates the stats related to sent and received data.""" self.logger.debug("Stats: tx %d, rx %d", self.statsTxInSlot, self.statsRxInSlot, extra=self.format) @@ -293,6 +302,25 @@ class Validator: """ Send as much as we can in the timeslot, limited by bwUplink """ + while self.sendQueue: + (rID, cID) = self.sendQueue[0] + + if rID in self.rowIDs: + for neigh in self.rowNeighbors[rID].values(): + self.sendSegmentToNeigh(rID, cID, neigh) + + if self.statsTxInSlot >= self.bwUplink: + return + + if cID in self.columnIDs: + for neigh in self.columnNeighbors[cID].values(): + self.sendSegmentToNeigh(rID, cID, neigh) + + if self.statsTxInSlot >= self.bwUplink: + return + + self.sendQueue.popleft() + for n in self.sched: neigh = n.neigh toSend = n.toSend From 1403ca7ad03b4128475e20d99ef5e62084da3e1f Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Feb 2023 02:18:37 +0100 Subject: [PATCH 031/162] add random scheduler --- DAS/validator.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/DAS/validator.py b/DAS/validator.py index a887bb5..67ef141 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -321,6 +321,35 @@ class Validator: self.sendQueue.popleft() + tries = 100 + while tries: + if self.rowIDs: + rID = random.choice(self.rowIDs) + cID = random.randrange(0, self.shape.blockSize) + if self.block.getSegment(rID, cID) : + neigh = random.choice(list(self.rowNeighbors[rID].values())) + if not neigh.sent[cID] and not neigh.receiving[cID] : + neigh.sent[cID] = 1 + neigh.node.receiveSegment(rID, cID, self.ID) + self.statsTxInSlot += 1 + tries = 100 + if self.statsTxInSlot >= self.bwUplink: + return + if self.columnIDs: + cID = random.choice(self.columnIDs) + rID = random.randrange(0, self.shape.blockSize) + if self.block.getSegment(rID, cID) : + neigh = random.choice(list(self.columnNeighbors[cID].values())) + if not neigh.sent[rID] and not neigh.receiving[rID] : + neigh.sent[rID] = 1 + neigh.node.receiveSegment(rID, cID, self.ID) + self.statsTxInSlot += 1 + tries = 100 + tries -= 1 + if self.statsTxInSlot >= self.bwUplink: + return + return + for n in self.sched: neigh = n.neigh toSend = n.toSend From 9ab51278c880ed52473e257cb5b6089d72d4258d Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Feb 2023 11:45:55 +0100 Subject: [PATCH 032/162] add shuffledDict helper Signed-off-by: Csaba Kiraly --- DAS/validator.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 67ef141..311205d 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -15,6 +15,12 @@ def shuffled(lis): for index in random.sample(range(len(lis)), len(lis)): yield lis[index] +def shuffledDict(d): + lis = list(d.values()) + # based on https://stackoverflow.com/a/60342323 + for index in random.sample(range(len(d)), len(d)): + yield lis[index] + def sampleLine(line, limit): """ sample up to 'limit' bits from a bitarray @@ -233,7 +239,7 @@ class Validator: line = self.getColumn(columnID) if line.any(): self.logger.debug("col %d -> %s", columnID, self.columnNeighbors[columnID] , extra=self.format) - for n in shuffled(list(self.columnNeighbors[columnID].values())): + for n in shuffledDict(self.columnNeighbors[columnID]): # if there is anything new to send, send it toSend = line & ~n.sent & ~n.received @@ -245,7 +251,7 @@ class Validator: line = self.getRow(rowID) if line.any(): self.logger.debug("row %d -> %s", rowID, self.rowNeighbors[rowID], extra=self.format) - for n in shuffled(list(self.rowNeighbors[rowID].values())): + for n in shuffledDict(self.rowNeighbors[rowID]): # if there is anything new to send, send it toSend = line & ~n.sent & ~n.received From f67c70896c8965f36b3be8a3a67edfaa5c36fe58 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Feb 2023 11:48:18 +0100 Subject: [PATCH 033/162] add to receivedQueue also in row/column receive code Signed-off-by: Csaba Kiraly --- DAS/validator.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DAS/validator.py b/DAS/validator.py index 311205d..6c5575c 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -173,6 +173,9 @@ class Validator: # register receive so that we are not sending back self.columnNeighbors[id][src].receiving |= column self.receivedBlock.mergeColumn(id, column) + for i in range(len(column)): + if column[i]: + self.receivedQueue.append((i, id)) self.statsRxInSlot += column.count(1) else: pass @@ -183,6 +186,9 @@ class Validator: # register receive so that we are not sending back self.rowNeighbors[id][src].receiving |= row self.receivedBlock.mergeRow(id, row) + for i in range(len(row)): + if row[i]: + self.receivedQueue.append((id, i)) self.statsRxInSlot += row.count(1) else: pass From 7c0fcaba7891efe6ff73956cc0270d49007fb1a4 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Feb 2023 11:51:04 +0100 Subject: [PATCH 034/162] add validator.perNodeQueue conf option Signed-off-by: Csaba Kiraly --- DAS/validator.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/DAS/validator.py b/DAS/validator.py index 6c5575c..88e32d6 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -119,6 +119,7 @@ class Validator: # TODO: this should be a parameter self.bwUplink = 110 if not self.amIproposer else 2200 # approx. 10Mbps and 200Mbps + self.perNodeQueue = False # keep a global queue of incoming messages for later sequential dispatch self.sched = self.nextToSend() def logIDs(self): @@ -230,7 +231,8 @@ class Validator: neigh.receiving.setall(0) # add newly received segments to the send queue - self.sendQueue.extend(self.receivedQueue) + if self.perNeighborQueue: + self.sendQueue.extend(self.receivedQueue) self.receivedQueue.clear() def updateStats(self): From 23e40693f18cde9cb5aac8de03e8e2bc529545b7 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 14 Feb 2023 11:52:47 +0100 Subject: [PATCH 035/162] add perNeighborQueue option If enabled, queue incoming messages to outgoing connections on arrival, as typical in some GossipSub implementations. Signed-off-by: Csaba Kiraly --- DAS/validator.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/DAS/validator.py b/DAS/validator.py index 88e32d6..9c43967 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -69,6 +69,7 @@ class Neighbor: self.receiving = zeros(blockSize) self.received = zeros(blockSize) self.sent = zeros(blockSize) + self.sendQueue = deque() class Validator: @@ -86,7 +87,7 @@ class Validator: self.format = {"entity": "Val "+str(self.ID)} self.block = Block(self.shape.blockSize) self.receivedBlock = Block(self.shape.blockSize) - self.receivedQueue = [] + self.receivedQueue = deque() self.sendQueue = deque() self.amIproposer = amIproposer self.logger = logger @@ -119,6 +120,7 @@ class Validator: # TODO: this should be a parameter self.bwUplink = 110 if not self.amIproposer else 2200 # approx. 10Mbps and 200Mbps + self.perNeighborQueue = False # queue incoming messages to outgoing connections on arrival (as typical GossipSub impl) self.perNodeQueue = False # keep a global queue of incoming messages for later sequential dispatch self.sched = self.nextToSend() @@ -233,6 +235,19 @@ class Validator: # add newly received segments to the send queue if self.perNeighborQueue: self.sendQueue.extend(self.receivedQueue) + + if self.perNodeQueue: + while self.receivedQueue: + (rID, cID) = self.receivedQueue.popleft() + + if rID in self.rowIDs: + for neigh in self.rowNeighbors[rID].values(): + neigh.sendQueue.append(cID) + + if cID in self.columnIDs: + for neigh in self.columnNeighbors[cID].values(): + neigh.sendQueue.append(rID) + self.receivedQueue.clear() def updateStats(self): @@ -335,6 +350,25 @@ class Validator: self.sendQueue.popleft() + progress = True + while (progress): + progress = False + for rID, neighs in self.rowNeighbors.items(): + for neigh in neighs.values(): + if (neigh.sendQueue): + self.sendSegmentToNeigh(rID, neigh.sendQueue.popleft(), neigh) + progress = True + if self.statsTxInSlot >= self.bwUplink: + return + + for cID, neighs in self.columnNeighbors.items(): + for neigh in neighs.values(): + if (neigh.sendQueue): + self.sendSegmentToNeigh(neigh.sendQueue.popleft(), cID, neigh) + progress = True + if self.statsTxInSlot >= self.bwUplink: + return + tries = 100 while tries: if self.rowIDs: From b7dab5bad9c8e291cdc619239e5b0620f159fe7a Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 03:10:55 +0100 Subject: [PATCH 036/162] fix sendSegmentToNeigh: specify dimension Specify along which dimension (row/column) a segment was sent. Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 8 ++++---- DAS/validator.py | 11 ++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 5b60413..3261ad7 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -66,8 +66,8 @@ class Simulator: for u, v in G.edges: val1=rowChannels[id][u] val2=rowChannels[id][v] - val1.rowNeighbors[id].update({val2.ID : Neighbor(val2, self.shape.blockSize)}) - val2.rowNeighbors[id].update({val1.ID : Neighbor(val1, self.shape.blockSize)}) + val1.rowNeighbors[id].update({val2.ID : Neighbor(val2, 0, self.shape.blockSize)}) + val2.rowNeighbors[id].update({val1.ID : Neighbor(val1, 0, self.shape.blockSize)}) if (len(columnChannels[id]) <= self.shape.netDegree): self.logger.debug("Graph fully connected with degree %d !" % (len(columnChannels[id]) - 1), extra=self.format) @@ -79,8 +79,8 @@ class Simulator: for u, v in G.edges: val1=columnChannels[id][u] val2=columnChannels[id][v] - val1.columnNeighbors[id].update({val2.ID : Neighbor(val2, self.shape.blockSize)}) - val2.columnNeighbors[id].update({val1.ID : Neighbor(val1, self.shape.blockSize)}) + val1.columnNeighbors[id].update({val2.ID : Neighbor(val2, 1, self.shape.blockSize)}) + val2.columnNeighbors[id].update({val1.ID : Neighbor(val1, 1, self.shape.blockSize)}) if self.logger.isEnabledFor(logging.DEBUG): for i in range(0, self.shape.numberValidators): diff --git a/DAS/validator.py b/DAS/validator.py index 9c43967..aecbc37 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -63,9 +63,10 @@ class Neighbor: """It returns the amount of sent and received data.""" return "%d:%d/%d" % (self.node.ID, self.sent.count(1), self.received.count(1)) - def __init__(self, v, blockSize): + def __init__(self, v, dim, blockSize): """It initializes the neighbor with the node and sets counters to zero.""" self.node = v + self.dim = dim # 0:row 1:col self.receiving = zeros(blockSize) self.received = zeros(blockSize) self.sent = zeros(blockSize) @@ -319,8 +320,12 @@ class Validator: return def sendSegmentToNeigh(self, rID, cID, neigh): - if not neigh.sent[cID] and not neigh.receiving[cID] : - neigh.sent[cID] = 1 + if neigh.dim == 0: #row + i = cID + else: + i = rID + if not neigh.sent[i] and not neigh.receiving[i] : + neigh.sent[i] = 1 neigh.node.receiveSegment(rID, cID, self.ID) self.statsTxInSlot += 1 return True From 0c91eff67be2594f1625446cb25b80d8fd8f9481 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 03:15:00 +0100 Subject: [PATCH 037/162] add dumbRandomScheduler parameter Signed-off-by: Csaba Kiraly --- DAS/validator.py | 60 ++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index aecbc37..8e52f93 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -123,6 +123,7 @@ class Validator: self.perNeighborQueue = False # queue incoming messages to outgoing connections on arrival (as typical GossipSub impl) self.perNodeQueue = False # keep a global queue of incoming messages for later sequential dispatch + self.dumbRandomScheduler = False # dumb random scheduler self.sched = self.nextToSend() def logIDs(self): @@ -374,34 +375,37 @@ class Validator: if self.statsTxInSlot >= self.bwUplink: return - tries = 100 - while tries: - if self.rowIDs: - rID = random.choice(self.rowIDs) - cID = random.randrange(0, self.shape.blockSize) - if self.block.getSegment(rID, cID) : - neigh = random.choice(list(self.rowNeighbors[rID].values())) - if not neigh.sent[cID] and not neigh.receiving[cID] : - neigh.sent[cID] = 1 - neigh.node.receiveSegment(rID, cID, self.ID) - self.statsTxInSlot += 1 - tries = 100 - if self.statsTxInSlot >= self.bwUplink: - return - if self.columnIDs: - cID = random.choice(self.columnIDs) - rID = random.randrange(0, self.shape.blockSize) - if self.block.getSegment(rID, cID) : - neigh = random.choice(list(self.columnNeighbors[cID].values())) - if not neigh.sent[rID] and not neigh.receiving[rID] : - neigh.sent[rID] = 1 - neigh.node.receiveSegment(rID, cID, self.ID) - self.statsTxInSlot += 1 - tries = 100 - tries -= 1 - if self.statsTxInSlot >= self.bwUplink: - return - return + if self.dumbRandomScheduler: + # dumb random scheduler picking segments at random and trying to send it + tries = 100 + t = tries + while t: + if self.rowIDs: + rID = random.choice(self.rowIDs) + cID = random.randrange(0, self.shape.blockSize) + if self.block.getSegment(rID, cID) : + neigh = random.choice(list(self.rowNeighbors[rID].values())) + if not neigh.sent[cID] and not neigh.receiving[cID] : + neigh.sent[cID] = 1 + neigh.node.receiveSegment(rID, cID, self.ID) + self.statsTxInSlot += 1 + t = tries + if self.statsTxInSlot >= self.bwUplink: + return + if self.columnIDs: + cID = random.choice(self.columnIDs) + rID = random.randrange(0, self.shape.blockSize) + if self.block.getSegment(rID, cID) : + neigh = random.choice(list(self.columnNeighbors[cID].values())) + if not neigh.sent[rID] and not neigh.receiving[rID] : + neigh.sent[rID] = 1 + neigh.node.receiveSegment(rID, cID, self.ID) + self.statsTxInSlot += 1 + t = tries + t -= 1 + if self.statsTxInSlot >= self.bwUplink: + return + return for n in self.sched: neigh = n.neigh From dff0e5523af3598242284a5de4a8cd73f0129321 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 03:18:00 +0100 Subject: [PATCH 038/162] factorize addToSendQueue Signed-off-by: Csaba Kiraly --- DAS/validator.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 8e52f93..d152472 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -213,6 +213,18 @@ class Validator: # self.statsRxDuplicateInSlot += 1 self.statsRxInSlot += 1 + def addToSendQueue(self, rID, cID): + if self.perNodeQueue: + self.sendQueue.append((rID, cID)) + + if self.perNeighborQueue: + if rID in self.rowIDs: + for neigh in self.rowNeighbors[rID].values(): + neigh.sendQueue.append(cID) + + if cID in self.columnIDs: + for neigh in self.columnNeighbors[cID].values(): + neigh.sendQueue.append(rID) def receiveRowsColumns(self): """It receives rows and columns.""" @@ -235,22 +247,9 @@ class Validator: neigh.receiving.setall(0) # add newly received segments to the send queue - if self.perNeighborQueue: - self.sendQueue.extend(self.receivedQueue) - - if self.perNodeQueue: - while self.receivedQueue: - (rID, cID) = self.receivedQueue.popleft() - - if rID in self.rowIDs: - for neigh in self.rowNeighbors[rID].values(): - neigh.sendQueue.append(cID) - - if cID in self.columnIDs: - for neigh in self.columnNeighbors[cID].values(): - neigh.sendQueue.append(rID) - - self.receivedQueue.clear() + while self.receivedQueue: + (rID, cID) = self.receivedQueue.popleft() + self.addToSendQueue(rID, cID) def updateStats(self): """It updates the stats related to sent and received data.""" From f05c3cd233e2c3d462a7ce4e65a8381064fe32ee Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 03:22:37 +0100 Subject: [PATCH 039/162] fix queuing: should queue after repair If operation is based on send queues, segments should be queued after successful repair. Signed-off-by: Csaba Kiraly --- DAS/block.py | 22 ++++++++++++++++++---- DAS/validator.py | 20 ++++++++++++++++++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/DAS/block.py b/DAS/block.py index e052fcb..228e743 100644 --- a/DAS/block.py +++ b/DAS/block.py @@ -35,10 +35,17 @@ class Block: self.data[columnID::self.blockSize] |= column def repairColumn(self, id): - """It repairs the entire column if it has at least blockSize/2 ones.""" - success = self.data[id::self.blockSize].count(1) + """It repairs the entire column if it has at least blockSize/2 ones. + Returns: list of repaired segments + """ + line = self.data[id::self.blockSize] + success = line.count(1) if success >= self.blockSize/2: + ret = ~line self.data[id::self.blockSize] = 1 + else: + ret = zeros(self.blockSize) + return ret def getRow(self, rowID): """It returns the block row corresponding to rowID.""" @@ -49,10 +56,17 @@ class Block: self.data[rowID*self.blockSize:(rowID+1)*self.blockSize] |= row def repairRow(self, id): - """It repairs the entire row if it has at least blockSize/2 ones.""" - success = self.data[id*self.blockSize:(id+1)*self.blockSize].count(1) + """It repairs the entire row if it has at least blockSize/2 ones. + Returns: list of repaired segments + """ + line = self.data[id*self.blockSize:(id+1)*self.blockSize] + success = line.count(1) if success >= self.blockSize/2: + ret = ~line self.data[id*self.blockSize:(id+1)*self.blockSize] = 1 + else: + ret = zeros(self.blockSize) + return ret def print(self): """It prints the block in the terminal (outside of the logger rules)).""" diff --git a/DAS/validator.py b/DAS/validator.py index d152472..5065e16 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -446,12 +446,28 @@ class Validator: def restoreRows(self): """It restores the rows assigned to the validator, that can be repaired.""" for id in self.rowIDs: - self.block.repairRow(id) + rep = self.block.repairRow(id) + if (rep.any()): + # If operation is based on send queues, segments should + # be queued after successful repair. + for i in range(len(rep)): + if rep[i]: + self.logger.debug("Rep: %d,%d", id, i, extra=self.format) + self.addToSendQueue(id, i) + # self.statsRepairInSlot += rep.count(1) def restoreColumns(self): """It restores the columns assigned to the validator, that can be repaired.""" for id in self.columnIDs: - self.block.repairColumn(id) + rep = self.block.repairColumn(id) + if (rep.any()): + # If operation is based on send queues, segments should + # be queued after successful repair. + for i in range(len(rep)): + if rep[i]: + self.logger.debug("Rep: %d,%d", i, id, extra=self.format) + self.addToSendQueue(i, id) + # self.statsRepairInSlot += rep.count(1) def checkStatus(self): """It checks how many expected/arrived samples are for each assigned row/column.""" From d0641e4568f605cddfa0adcd2d80117d899bd07f Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 03:23:39 +0100 Subject: [PATCH 040/162] add repairOnTheFly parameter Signed-off-by: Csaba Kiraly --- DAS/validator.py | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 5065e16..f447848 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -121,6 +121,7 @@ class Validator: # TODO: this should be a parameter self.bwUplink = 110 if not self.amIproposer else 2200 # approx. 10Mbps and 200Mbps + self.repairOnTheFly = True self.perNeighborQueue = False # queue incoming messages to outgoing connections on arrival (as typical GossipSub impl) self.perNodeQueue = False # keep a global queue of incoming messages for later sequential dispatch self.dumbRandomScheduler = False # dumb random scheduler @@ -445,29 +446,31 @@ class Validator: def restoreRows(self): """It restores the rows assigned to the validator, that can be repaired.""" - for id in self.rowIDs: - rep = self.block.repairRow(id) - if (rep.any()): - # If operation is based on send queues, segments should - # be queued after successful repair. - for i in range(len(rep)): - if rep[i]: - self.logger.debug("Rep: %d,%d", id, i, extra=self.format) - self.addToSendQueue(id, i) - # self.statsRepairInSlot += rep.count(1) + if self.repairOnTheFly: + for id in self.rowIDs: + rep = self.block.repairRow(id) + if (rep.any()): + # If operation is based on send queues, segments should + # be queued after successful repair. + for i in range(len(rep)): + if rep[i]: + self.logger.debug("Rep: %d,%d", id, i, extra=self.format) + self.addToSendQueue(id, i) + # self.statsRepairInSlot += rep.count(1) def restoreColumns(self): """It restores the columns assigned to the validator, that can be repaired.""" - for id in self.columnIDs: - rep = self.block.repairColumn(id) - if (rep.any()): - # If operation is based on send queues, segments should - # be queued after successful repair. - for i in range(len(rep)): - if rep[i]: - self.logger.debug("Rep: %d,%d", i, id, extra=self.format) - self.addToSendQueue(i, id) - # self.statsRepairInSlot += rep.count(1) + if self.repairOnTheFly: + for id in self.columnIDs: + rep = self.block.repairColumn(id) + if (rep.any()): + # If operation is based on send queues, segments should + # be queued after successful repair. + for i in range(len(rep)): + if rep[i]: + self.logger.debug("Rep: %d,%d", i, id, extra=self.format) + self.addToSendQueue(i, id) + # self.statsRepairInSlot += rep.count(1) def checkStatus(self): """It checks how many expected/arrived samples are for each assigned row/column.""" From 5383c59f6f8e55b172e23c477ce1a9cd7fdc7f63 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 03:25:52 +0100 Subject: [PATCH 041/162] add shuffleLines and shuffleNeighbors params Signed-off-by: Csaba Kiraly --- DAS/validator.py | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index f447848..dcd6779 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -11,15 +11,24 @@ from collections import deque def shuffled(lis): + ''' Generator yielding list in shuffled order + ''' # based on https://stackoverflow.com/a/60342323 for index in random.sample(range(len(lis)), len(lis)): yield lis[index] -def shuffledDict(d): - lis = list(d.values()) - # based on https://stackoverflow.com/a/60342323 - for index in random.sample(range(len(d)), len(d)): - yield lis[index] +def shuffledDict(d, shuffle=True): + ''' Generator yielding dictionary in shuffled order + + Shuffle, except if not (optional parameter useful for experiment setup) + ''' + if shuffle: + lis = list(d.items()) + for index in random.sample(range(len(d)), len(d)): + yield lis[index] + else: + for kv in d.items(): + yield kv def sampleLine(line, limit): """ sample up to 'limit' bits from a bitarray @@ -124,6 +133,8 @@ class Validator: self.repairOnTheFly = True self.perNeighborQueue = False # queue incoming messages to outgoing connections on arrival (as typical GossipSub impl) self.perNodeQueue = False # keep a global queue of incoming messages for later sequential dispatch + self.shuffleLines = True # shuffle the order of rows/columns in each iteration while trying to send + self.shuffleNeighbors = True # shuffle the order of neighbors when sending the same segment to each neighbor self.dumbRandomScheduler = False # dumb random scheduler self.sched = self.nextToSend() @@ -264,7 +275,7 @@ class Validator: line = self.getColumn(columnID) if line.any(): self.logger.debug("col %d -> %s", columnID, self.columnNeighbors[columnID] , extra=self.format) - for n in shuffledDict(self.columnNeighbors[columnID]): + for _, n in shuffledDict(self.columnNeighbors[columnID]): # if there is anything new to send, send it toSend = line & ~n.sent & ~n.received @@ -276,7 +287,7 @@ class Validator: line = self.getRow(rowID) if line.any(): self.logger.debug("row %d -> %s", rowID, self.rowNeighbors[rowID], extra=self.format) - for n in shuffledDict(self.rowNeighbors[rowID]): + for _, n in shuffledDict(self.rowNeighbors[rowID]): # if there is anything new to send, send it toSend = line & ~n.sent & ~n.received @@ -341,14 +352,14 @@ class Validator: (rID, cID) = self.sendQueue[0] if rID in self.rowIDs: - for neigh in self.rowNeighbors[rID].values(): + for _, neigh in shuffledDict(self.rowNeighbors[rID], self.shuffleNeighbors): self.sendSegmentToNeigh(rID, cID, neigh) if self.statsTxInSlot >= self.bwUplink: return if cID in self.columnIDs: - for neigh in self.columnNeighbors[cID].values(): + for _, neigh in shuffledDict(self.columnNeighbors[cID], self.shuffleNeighbors): self.sendSegmentToNeigh(rID, cID, neigh) if self.statsTxInSlot >= self.bwUplink: @@ -359,16 +370,16 @@ class Validator: progress = True while (progress): progress = False - for rID, neighs in self.rowNeighbors.items(): - for neigh in neighs.values(): + for rID, neighs in shuffledDict(self.rowNeighbors, self.shuffleLines): + for _, neigh in shuffledDict(neighs, self.shuffleNeighbors): if (neigh.sendQueue): self.sendSegmentToNeigh(rID, neigh.sendQueue.popleft(), neigh) progress = True if self.statsTxInSlot >= self.bwUplink: return - for cID, neighs in self.columnNeighbors.items(): - for neigh in neighs.values(): + for cID, neighs in shuffledDict(self.columnNeighbors, self.shuffleLines): + for _, neigh in shuffledDict(neighs, self.shuffleNeighbors): if (neigh.sendQueue): self.sendSegmentToNeigh(neigh.sendQueue.popleft(), cID, neigh) progress = True From 1669ec92366f5b4f994643ba4ad7e1db7d975a05 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 03:26:31 +0100 Subject: [PATCH 042/162] more debug logging Signed-off-by: Csaba Kiraly --- DAS/validator.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index dcd6779..e2264b7 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -70,7 +70,7 @@ class Neighbor: def __repr__(self): """It returns the amount of sent and received data.""" - return "%d:%d/%d" % (self.node.ID, self.sent.count(1), self.received.count(1)) + return "%d:%d/%d, q:%d" % (self.node.ID, self.sent.count(1), self.received.count(1), len(self.sendQueue)) def __init__(self, v, dim, blockSize): """It initializes the neighbor with the node and sets counters to zero.""" @@ -192,6 +192,7 @@ class Validator: self.receivedBlock.mergeColumn(id, column) for i in range(len(column)): if column[i]: + self.logger.debug("Recv: %d->%d: %d,%d", src, self.ID, i, id, extra=self.format) self.receivedQueue.append((i, id)) self.statsRxInSlot += column.count(1) else: @@ -205,6 +206,7 @@ class Validator: self.receivedBlock.mergeRow(id, row) for i in range(len(row)): if row[i]: + self.logger.debug("Recv %d->%d: %d,%d", src, self.ID, id, i, extra=self.format) self.receivedQueue.append((id, i)) self.statsRxInSlot += row.count(1) else: @@ -219,9 +221,11 @@ class Validator: if src in self.columnNeighbors[cID]: self.columnNeighbors[cID][src].receiving[rID] = 1 if not self.receivedBlock.getSegment(rID, cID): + self.logger.debug("Recv new: %d->%d: %d,%d", src, self.ID, rID, cID, extra=self.format) self.receivedBlock.setSegment(rID, cID) self.receivedQueue.append((rID, cID)) - # else: + else: + self.logger.debug("Recv DUP: %d->%d: %d,%d", src, self.ID, rID, cID, extra=self.format) # self.statsRxDuplicateInSlot += 1 self.statsRxInSlot += 1 From af72e58d08d003d533cecbe5a2ed1a9c50ad8350 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 14:17:17 +0100 Subject: [PATCH 043/162] collect receivedQueue only if it is used later Signed-off-by: Csaba Kiraly --- DAS/validator.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index e2264b7..5af772a 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -193,7 +193,8 @@ class Validator: for i in range(len(column)): if column[i]: self.logger.debug("Recv: %d->%d: %d,%d", src, self.ID, i, id, extra=self.format) - self.receivedQueue.append((i, id)) + if self.perNodeQueue or self.perNeighborQueue: + self.receivedQueue.append((i, id)) self.statsRxInSlot += column.count(1) else: pass @@ -207,7 +208,8 @@ class Validator: for i in range(len(row)): if row[i]: self.logger.debug("Recv %d->%d: %d,%d", src, self.ID, id, i, extra=self.format) - self.receivedQueue.append((id, i)) + if self.perNodeQueue or self.perNeighborQueue: + self.receivedQueue.append((id, i)) self.statsRxInSlot += row.count(1) else: pass @@ -223,7 +225,8 @@ class Validator: if not self.receivedBlock.getSegment(rID, cID): self.logger.debug("Recv new: %d->%d: %d,%d", src, self.ID, rID, cID, extra=self.format) self.receivedBlock.setSegment(rID, cID) - self.receivedQueue.append((rID, cID)) + if self.perNodeQueue or self.perNeighborQueue: + self.receivedQueue.append((rID, cID)) else: self.logger.debug("Recv DUP: %d->%d: %d,%d", src, self.ID, rID, cID, extra=self.format) # self.statsRxDuplicateInSlot += 1 @@ -263,9 +266,10 @@ class Validator: neigh.receiving.setall(0) # add newly received segments to the send queue - while self.receivedQueue: - (rID, cID) = self.receivedQueue.popleft() - self.addToSendQueue(rID, cID) + if self.perNodeQueue or self.perNeighborQueue: + while self.receivedQueue: + (rID, cID) = self.receivedQueue.popleft() + self.addToSendQueue(rID, cID) def updateStats(self): """It updates the stats related to sent and received data.""" From 655f3a6642ec54d5181d281c266f50bc03226576 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 14:19:21 +0100 Subject: [PATCH 044/162] fix: avoid looking into the future Checking neigh.receiving is cheating in the current model. If the timeslot is small, information can't propagate that fast. Signed-off-by: Csaba Kiraly --- DAS/validator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 5af772a..8923a9a 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -344,7 +344,7 @@ class Validator: i = cID else: i = rID - if not neigh.sent[i] and not neigh.receiving[i] : + if not neigh.sent[i] and not neigh.received[i] : neigh.sent[i] = 1 neigh.node.receiveSegment(rID, cID, self.ID) self.statsTxInSlot += 1 @@ -404,7 +404,7 @@ class Validator: cID = random.randrange(0, self.shape.blockSize) if self.block.getSegment(rID, cID) : neigh = random.choice(list(self.rowNeighbors[rID].values())) - if not neigh.sent[cID] and not neigh.receiving[cID] : + if not neigh.sent[cID] and not neigh.received[cID] : neigh.sent[cID] = 1 neigh.node.receiveSegment(rID, cID, self.ID) self.statsTxInSlot += 1 @@ -416,7 +416,7 @@ class Validator: rID = random.randrange(0, self.shape.blockSize) if self.block.getSegment(rID, cID) : neigh = random.choice(list(self.columnNeighbors[cID].values())) - if not neigh.sent[rID] and not neigh.receiving[rID] : + if not neigh.sent[rID] and not neigh.received[rID] : neigh.sent[rID] = 1 neigh.node.receiveSegment(rID, cID, self.ID) self.statsTxInSlot += 1 From cd2b69149bda81692ee37c056749b0ec6bb7af29 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 14:22:55 +0100 Subject: [PATCH 045/162] add segmentShuffleScheduler This scheduler check which owned segments needs sending (at least one neighbor needing it). Then it sends each segment that's worth sending once, in shuffled order. This is repeated until bw limit. Signed-off-by: Csaba Kiraly --- DAS/validator.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/DAS/validator.py b/DAS/validator.py index 8923a9a..f9571da 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -65,6 +65,12 @@ class NextToSend: self.id = id self.dim = dim +class SegmentToSend: + def __init__(self, dim, id, i): + self.dim = dim + self.id = id + self.i = i + class Neighbor: """This class implements a node neighbor to monitor sent and received data.""" @@ -136,6 +142,7 @@ class Validator: self.shuffleLines = True # shuffle the order of rows/columns in each iteration while trying to send self.shuffleNeighbors = True # shuffle the order of neighbors when sending the same segment to each neighbor self.dumbRandomScheduler = False # dumb random scheduler + self.segmentShuffleScheduler = True # send each segment that's worth sending once in shuffled order, then repeat self.sched = self.nextToSend() def logIDs(self): @@ -394,6 +401,56 @@ class Validator: if self.statsTxInSlot >= self.bwUplink: return + # process possible segments to send in shuffled breadth-first order + if self.segmentShuffleScheduler: + while True: + self.segmentsToSend = [] + for rID, neighs in self.rowNeighbors.items(): + line = self.getRow(rID) + needed = zeros(self.shape.blockSize) + for neigh in neighs.values(): + needed |= ~(neigh.received | neigh.sent) + needed &= line + if (needed).any(): + for i in range(len(needed)): + if needed[i]: + self.segmentsToSend.append(SegmentToSend(0, rID, i)) + + for cID, neighs in self.columnNeighbors.items(): + line = self.getColumn(cID) + needed = zeros(self.shape.blockSize) + for neigh in neighs.values(): + needed |= ~(neigh.received | neigh.sent) + needed &= line + if (needed).any(): + for i in range(len(needed)): + if needed[i]: + self.segmentsToSend.append(SegmentToSend(1, cID, i)) + + if self.segmentsToSend: + self.logger.debug("TX:%d q:%d", self.statsTxInSlot, len(self.segmentsToSend), extra=self.format) + for s in shuffled(self.segmentsToSend): + self.logger.debug("%d:%d/%d", s.dim, s.id, s.i, extra=self.format) + if s.dim == 0: + for _, neigh in shuffledDict(self.rowNeighbors[s.id], self.shuffleNeighbors): + self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) + if not neigh.sent[s.i] and not neigh.received[s.i]: + self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) + self.sendSegmentToNeigh(s.id, s.i, neigh) + break + else: + for _, neigh in shuffledDict(self.columnNeighbors[s.id], self.shuffleNeighbors): + self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) + if not neigh.sent[s.i] and not neigh.received[s.i]: + self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) + self.sendSegmentToNeigh(s.i, s.id, neigh) + break + + if self.statsTxInSlot >= self.bwUplink: + return + else: + break + if self.dumbRandomScheduler: # dumb random scheduler picking segments at random and trying to send it tries = 100 From 54d101e5b875e8337fd996b88cd1bb4369d4f7b0 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 14:28:38 +0100 Subject: [PATCH 046/162] segmentShuffleScheduler: persist scheduler state between timesteps Signed-off-by: Csaba Kiraly --- DAS/validator.py | 52 ++++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index f9571da..725bc98 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -143,6 +143,7 @@ class Validator: self.shuffleNeighbors = True # shuffle the order of neighbors when sending the same segment to each neighbor self.dumbRandomScheduler = False # dumb random scheduler self.segmentShuffleScheduler = True # send each segment that's worth sending once in shuffled order, then repeat + self.segmentShuffleSchedulerPersist = True # Persist scheduler state between timesteps self.sched = self.nextToSend() def logIDs(self): @@ -403,7 +404,35 @@ class Validator: # process possible segments to send in shuffled breadth-first order if self.segmentShuffleScheduler: + # This scheduler check which owned segments needs sending (at least + # one neighbor needing it). Then it sends each segment that's worth sending + # once, in shuffled order. This is repeated until bw limit. while True: + if hasattr(self, 'segmentsToSend') and self.segmentsToSend: + self.logger.debug("TX:%d q:%d", self.statsTxInSlot, len(self.segmentsToSend), extra=self.format) + for s in shuffled(self.segmentsToSend): + self.logger.debug("%d:%d/%d", s.dim, s.id, s.i, extra=self.format) + if s.dim == 0: + for _, neigh in shuffledDict(self.rowNeighbors[s.id], self.shuffleNeighbors): + self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) + if not neigh.sent[s.i] and not neigh.received[s.i]: + self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) + self.sendSegmentToNeigh(s.id, s.i, neigh) + break + else: + for _, neigh in shuffledDict(self.columnNeighbors[s.id], self.shuffleNeighbors): + self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) + if not neigh.sent[s.i] and not neigh.received[s.i]: + self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) + self.sendSegmentToNeigh(s.i, s.id, neigh) + break + + if self.statsTxInSlot >= self.bwUplink: + if not self.segmentShuffleSchedulerPersist: + # remove scheduler state before leaving + self.segmentsToSend = [] + return + self.segmentsToSend = [] for rID, neighs in self.rowNeighbors.items(): line = self.getRow(rID) @@ -427,28 +456,7 @@ class Validator: if needed[i]: self.segmentsToSend.append(SegmentToSend(1, cID, i)) - if self.segmentsToSend: - self.logger.debug("TX:%d q:%d", self.statsTxInSlot, len(self.segmentsToSend), extra=self.format) - for s in shuffled(self.segmentsToSend): - self.logger.debug("%d:%d/%d", s.dim, s.id, s.i, extra=self.format) - if s.dim == 0: - for _, neigh in shuffledDict(self.rowNeighbors[s.id], self.shuffleNeighbors): - self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) - if not neigh.sent[s.i] and not neigh.received[s.i]: - self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) - self.sendSegmentToNeigh(s.id, s.i, neigh) - break - else: - for _, neigh in shuffledDict(self.columnNeighbors[s.id], self.shuffleNeighbors): - self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) - if not neigh.sent[s.i] and not neigh.received[s.i]: - self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) - self.sendSegmentToNeigh(s.i, s.id, neigh) - break - - if self.statsTxInSlot >= self.bwUplink: - return - else: + if not self.segmentsToSend: break if self.dumbRandomScheduler: From bb55abe2b0fc921e382583f0acea23229a75a15d Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Wed, 15 Feb 2023 14:34:24 +0100 Subject: [PATCH 047/162] comments only Signed-off-by: Csaba Kiraly --- DAS/validator.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DAS/validator.py b/DAS/validator.py index 725bc98..26d4e6c 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -364,6 +364,7 @@ class Validator: """ Send as much as we can in the timeslot, limited by bwUplink """ + # process node level send queue while self.sendQueue: (rID, cID) = self.sendQueue[0] @@ -383,6 +384,7 @@ class Validator: self.sendQueue.popleft() + # process neighbor level send queues in shuffled breadth-first order progress = True while (progress): progress = False From f91f3da5d2e6eeeffcb6acc147570f515e56d9d0 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 16 Feb 2023 09:19:45 +0100 Subject: [PATCH 048/162] fixup: segmentShuffleScheduler Signed-off-by: Csaba Kiraly --- DAS/validator.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 26d4e6c..0d10425 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -410,9 +410,9 @@ class Validator: # one neighbor needing it). Then it sends each segment that's worth sending # once, in shuffled order. This is repeated until bw limit. while True: - if hasattr(self, 'segmentsToSend') and self.segmentsToSend: - self.logger.debug("TX:%d q:%d", self.statsTxInSlot, len(self.segmentsToSend), extra=self.format) - for s in shuffled(self.segmentsToSend): + if hasattr(self, 'segmentShuffleGen') and self.segmentShuffleGen is not None: + #self.logger.debug("TX:%d queue:%d", self.statsTxInSlot, len(self.segmentsToSend), extra=self.format) + for s in self.segmentShuffleGen: self.logger.debug("%d:%d/%d", s.dim, s.id, s.i, extra=self.format) if s.dim == 0: for _, neigh in shuffledDict(self.rowNeighbors[s.id], self.shuffleNeighbors): @@ -433,6 +433,7 @@ class Validator: if not self.segmentShuffleSchedulerPersist: # remove scheduler state before leaving self.segmentsToSend = [] + self.segmentShuffleGen = None return self.segmentsToSend = [] @@ -460,6 +461,8 @@ class Validator: if not self.segmentsToSend: break + else: + self.segmentShuffleGen = shuffled(self.segmentsToSend) if self.dumbRandomScheduler: # dumb random scheduler picking segments at random and trying to send it From e70740f530a2724455cd7a28fe3fb0dce86861f7 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 16 Feb 2023 17:34:11 +0100 Subject: [PATCH 049/162] handle duplicates in receiveRow/Column Signed-off-by: Csaba Kiraly --- DAS/validator.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 0d10425..7e02da3 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -197,12 +197,17 @@ class Validator: if id in self.columnIDs: # register receive so that we are not sending back self.columnNeighbors[id][src].receiving |= column - self.receivedBlock.mergeColumn(id, column) + #check for duplicates + old = self.receivedBlock.getColumn(id) for i in range(len(column)): if column[i]: - self.logger.debug("Recv: %d->%d: %d,%d", src, self.ID, i, id, extra=self.format) - if self.perNodeQueue or self.perNeighborQueue: - self.receivedQueue.append((i, id)) + if old[i]: + self.logger.debug("Recv DUP: %d->%d: %d,%d", src, self.ID, i, id, extra=self.format) + else: + self.logger.debug("Recv new: %d->%d: %d,%d", src, self.ID, i, id, extra=self.format) + if self.perNodeQueue or self.perNeighborQueue: + self.receivedQueue.append((i, id)) + self.receivedBlock.mergeColumn(id, column) self.statsRxInSlot += column.count(1) else: pass @@ -212,12 +217,17 @@ class Validator: if id in self.rowIDs: # register receive so that we are not sending back self.rowNeighbors[id][src].receiving |= row - self.receivedBlock.mergeRow(id, row) + #check for duplicates + old = self.receivedBlock.getRow(id) for i in range(len(row)): if row[i]: - self.logger.debug("Recv %d->%d: %d,%d", src, self.ID, id, i, extra=self.format) - if self.perNodeQueue or self.perNeighborQueue: - self.receivedQueue.append((id, i)) + if old[i]: + self.logger.debug("Recv DUP: %d->%d: %d,%d", src, self.ID, id, i, extra=self.format) + else: + self.logger.debug("Recv new: %d->%d: %d,%d", src, self.ID, id, i, extra=self.format) + if self.perNodeQueue or self.perNeighborQueue: + self.receivedQueue.append((id, i)) + self.receivedBlock.mergeRow(id, row) self.statsRxInSlot += row.count(1) else: pass From c0650bf75a4b797b91a2b8b94c4177a0738f6580 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 23 Feb 2023 11:21:58 +0100 Subject: [PATCH 050/162] implement partial line sending logic On any given p2p link, it only makes sense to send up to k messages, after that repair kicks in. Signed-off-by: Csaba Kiraly --- DAS/validator.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 7e02da3..f71277e 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -137,6 +137,7 @@ class Validator: self.bwUplink = 110 if not self.amIproposer else 2200 # approx. 10Mbps and 200Mbps self.repairOnTheFly = True + self.sendLineUntil = (self.shape.blockSize + 1) // 2 # stop sending on a p2p link if at least this amount of samples passed self.perNeighborQueue = False # queue incoming messages to outgoing connections on arrival (as typical GossipSub impl) self.perNodeQueue = False # keep a global queue of incoming messages for later sequential dispatch self.shuffleLines = True # shuffle the order of rows/columns in each iteration while trying to send @@ -358,6 +359,8 @@ class Validator: return def sendSegmentToNeigh(self, rID, cID, neigh): + if (neigh.sent | neigh.received).count(1) >= self.sendLineUntil: + return False # sent enough, other side can restore if neigh.dim == 0: #row i = cID else: @@ -451,7 +454,9 @@ class Validator: line = self.getRow(rID) needed = zeros(self.shape.blockSize) for neigh in neighs.values(): - needed |= ~(neigh.received | neigh.sent) + sentOrReceived = neigh.received | neigh.sent + if sentOrReceived.count(1) < self.sendLineUntil: + needed |= ~sentOrReceived needed &= line if (needed).any(): for i in range(len(needed)): @@ -462,7 +467,9 @@ class Validator: line = self.getColumn(cID) needed = zeros(self.shape.blockSize) for neigh in neighs.values(): - needed |= ~(neigh.received | neigh.sent) + sentOrReceived = neigh.received | neigh.sent + if sentOrReceived.count(1) < self.sendLineUntil: + needed |= ~sentOrReceived needed &= line if (needed).any(): for i in range(len(needed)): From a1a8a4282d9b876c4129b49438aab59409afd187 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 23 Feb 2023 11:22:28 +0100 Subject: [PATCH 051/162] fix scheduler to check result of endSegmentToNeigh Signed-off-by: Csaba Kiraly --- DAS/validator.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index f71277e..bfd1109 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -431,16 +431,16 @@ class Validator: for _, neigh in shuffledDict(self.rowNeighbors[s.id], self.shuffleNeighbors): self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) if not neigh.sent[s.i] and not neigh.received[s.i]: - self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) - self.sendSegmentToNeigh(s.id, s.i, neigh) - break + if self.sendSegmentToNeigh(s.id, s.i, neigh): + self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) + break else: for _, neigh in shuffledDict(self.columnNeighbors[s.id], self.shuffleNeighbors): self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) if not neigh.sent[s.i] and not neigh.received[s.i]: - self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) - self.sendSegmentToNeigh(s.i, s.id, neigh) - break + if self.sendSegmentToNeigh(s.i, s.id, neigh): + self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) + break if self.statsTxInSlot >= self.bwUplink: if not self.segmentShuffleSchedulerPersist: From 186d430ad12f3b8a6e51e4d05545fb2c0c550b59 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 23 Feb 2023 12:55:19 +0100 Subject: [PATCH 052/162] consider shuffleLines in segmentShuffleScheduler Signed-off-by: Csaba Kiraly --- DAS/validator.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index bfd1109..dc19ed7 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -10,13 +10,16 @@ from bitarray.util import zeros from collections import deque -def shuffled(lis): +def shuffled(lis, shuffle=True): ''' Generator yielding list in shuffled order ''' # based on https://stackoverflow.com/a/60342323 - for index in random.sample(range(len(lis)), len(lis)): - yield lis[index] - + if shuffle: + for index in random.sample(range(len(lis)), len(lis)): + yield lis[index] + else: + for v in lis: + yield v def shuffledDict(d, shuffle=True): ''' Generator yielding dictionary in shuffled order @@ -479,7 +482,7 @@ class Validator: if not self.segmentsToSend: break else: - self.segmentShuffleGen = shuffled(self.segmentsToSend) + self.segmentShuffleGen = shuffled(self.segmentsToSend, self.shuffleLines) if self.dumbRandomScheduler: # dumb random scheduler picking segments at random and trying to send it From b33f829b0e42547d6e0ddabaef7e93484f662fcb Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 23 Feb 2023 20:58:16 +0100 Subject: [PATCH 053/162] proposer might push segments without participating in mesh Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 3261ad7..506775c 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -22,6 +22,18 @@ class Simulator: self.proposerID = 0 self.glob = [] + # In GossipSub the initiator might push messages without participating in the mesh. + # proposerPublishOnly regulates this behavior. If set to true, the proposer is not + # part of the p2p distribution graph, only pushes segments to it. If false, the proposer + # might get back segments from other peers since links are symmetric. + self.proposerPublishOnly = True + + # If proposerPublishOnly == True, this regulates how many copies of each segment are + # pushed out by the proposer. + # 1: the data is sent out exactly once on rows and once on columns (2 copies in total) + # self.shape.netDegree: default behavior similar (but not same) to previous code + self.proposerPublishTo = self.shape.netDegree + def initValidators(self): """It initializes all the validators in the network.""" self.glob = Observer(self.logger, self.shape) @@ -46,10 +58,11 @@ class Simulator: rowChannels = [[] for i in range(self.shape.blockSize)] columnChannels = [[] for i in range(self.shape.blockSize)] for v in self.validators: - for id in v.rowIDs: - rowChannels[id].append(v) - for id in v.columnIDs: - columnChannels[id].append(v) + if not (self.proposerPublishOnly and v.amIproposer): + for id in v.rowIDs: + rowChannels[id].append(v) + for id in v.columnIDs: + columnChannels[id].append(v) for id in range(self.shape.blockSize): @@ -82,6 +95,19 @@ class Simulator: val1.columnNeighbors[id].update({val2.ID : Neighbor(val2, 1, self.shape.blockSize)}) val2.columnNeighbors[id].update({val1.ID : Neighbor(val1, 1, self.shape.blockSize)}) + for v in self.validators: + if (self.proposerPublishOnly and v.amIproposer): + for id in v.rowIDs: + count = min(self.proposerPublishTo, len(rowChannels[id])) + publishTo = random.sample(rowChannels[id], count) + for vi in publishTo: + v.rowNeighbors[id].update({vi.ID : Neighbor(vi, 0, self.shape.blockSize)}) + for id in v.columnIDs: + count = min(self.proposerPublishTo, len(columnChannels[id])) + publishTo = random.sample(columnChannels[id], count) + for vi in publishTo: + v.columnNeighbors[id].update({vi.ID : Neighbor(vi, 1, self.shape.blockSize)}) + if self.logger.isEnabledFor(logging.DEBUG): for i in range(0, self.shape.numberValidators): self.logger.debug("Val %d : rowN %s", i, self.validators[i].rowNeighbors, extra=self.format) From dfacd6bb18b72cddaa5577329f8a45aeaca7d428 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 23 Feb 2023 20:58:55 +0100 Subject: [PATCH 054/162] allow push from non-neighbor Signed-off-by: Csaba Kiraly --- DAS/validator.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index dc19ed7..5dfd99c 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -200,7 +200,10 @@ class Validator: """It receives the given column if it has been assigned to it.""" if id in self.columnIDs: # register receive so that we are not sending back - self.columnNeighbors[id][src].receiving |= column + if src in self.columnNeighbors[id]: # (check if peer or initial publish) + self.columnNeighbors[id][src].receiving |= column + else: + pass #check for duplicates old = self.receivedBlock.getColumn(id) for i in range(len(column)): @@ -220,7 +223,10 @@ class Validator: """It receives the given row if it has been assigned to it.""" if id in self.rowIDs: # register receive so that we are not sending back - self.rowNeighbors[id][src].receiving |= row + if src in self.rowNeighbors[id]: # (check if peer or initial publish) + self.rowNeighbors[id][src].receiving |= row + else: + pass #check for duplicates old = self.receivedBlock.getRow(id) for i in range(len(row)): From 2707269836abe0542fc5ba87d3d44e2f2761362c Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Thu, 23 Feb 2023 22:21:16 +0100 Subject: [PATCH 055/162] fixup: moving simulator config to resetShape Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/DAS/simulator.py b/DAS/simulator.py index 506775c..74d310e 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -22,18 +22,6 @@ class Simulator: self.proposerID = 0 self.glob = [] - # In GossipSub the initiator might push messages without participating in the mesh. - # proposerPublishOnly regulates this behavior. If set to true, the proposer is not - # part of the p2p distribution graph, only pushes segments to it. If false, the proposer - # might get back segments from other peers since links are symmetric. - self.proposerPublishOnly = True - - # If proposerPublishOnly == True, this regulates how many copies of each segment are - # pushed out by the proposer. - # 1: the data is sent out exactly once on rows and once on columns (2 copies in total) - # self.shape.netDegree: default behavior similar (but not same) to previous code - self.proposerPublishTo = self.shape.netDegree - def initValidators(self): """It initializes all the validators in the network.""" self.glob = Observer(self.logger, self.shape) @@ -132,6 +120,18 @@ class Simulator: val.shape.failureRate = shape.failureRate val.shape.chi = shape.chi + # In GossipSub the initiator might push messages without participating in the mesh. + # proposerPublishOnly regulates this behavior. If set to true, the proposer is not + # part of the p2p distribution graph, only pushes segments to it. If false, the proposer + # might get back segments from other peers since links are symmetric. + self.proposerPublishOnly = True + + # If proposerPublishOnly == True, this regulates how many copies of each segment are + # pushed out by the proposer. + # 1: the data is sent out exactly once on rows and once on columns (2 copies in total) + # self.shape.netDegree: default behavior similar (but not same) to previous code + self.proposerPublishTo = self.shape.netDegree + def run(self): """It runs the main simulation until the block is available or it gets stucked.""" From 89a6b1cdf70f24553191a6a1ee99c241f5165319 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 24 Feb 2023 00:35:17 +0100 Subject: [PATCH 056/162] remove old scheduler Signed-off-by: Csaba Kiraly --- DAS/validator.py | 132 ----------------------------------------------- 1 file changed, 132 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 5dfd99c..1b15fb4 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -148,7 +148,6 @@ class Validator: self.dumbRandomScheduler = False # dumb random scheduler self.segmentShuffleScheduler = True # send each segment that's worth sending once in shuffled order, then repeat self.segmentShuffleSchedulerPersist = True # Persist scheduler state between timesteps - self.sched = self.nextToSend() def logIDs(self): """It logs the assigned rows and columns.""" @@ -196,52 +195,6 @@ class Validator: """It returns a given row.""" return self.block.getRow(index) - def receiveColumn(self, id, column, src): - """It receives the given column if it has been assigned to it.""" - if id in self.columnIDs: - # register receive so that we are not sending back - if src in self.columnNeighbors[id]: # (check if peer or initial publish) - self.columnNeighbors[id][src].receiving |= column - else: - pass - #check for duplicates - old = self.receivedBlock.getColumn(id) - for i in range(len(column)): - if column[i]: - if old[i]: - self.logger.debug("Recv DUP: %d->%d: %d,%d", src, self.ID, i, id, extra=self.format) - else: - self.logger.debug("Recv new: %d->%d: %d,%d", src, self.ID, i, id, extra=self.format) - if self.perNodeQueue or self.perNeighborQueue: - self.receivedQueue.append((i, id)) - self.receivedBlock.mergeColumn(id, column) - self.statsRxInSlot += column.count(1) - else: - pass - - def receiveRow(self, id, row, src): - """It receives the given row if it has been assigned to it.""" - if id in self.rowIDs: - # register receive so that we are not sending back - if src in self.rowNeighbors[id]: # (check if peer or initial publish) - self.rowNeighbors[id][src].receiving |= row - else: - pass - #check for duplicates - old = self.receivedBlock.getRow(id) - for i in range(len(row)): - if row[i]: - if old[i]: - self.logger.debug("Recv DUP: %d->%d: %d,%d", src, self.ID, id, i, extra=self.format) - else: - self.logger.debug("Recv new: %d->%d: %d,%d", src, self.ID, id, i, extra=self.format) - if self.perNodeQueue or self.perNeighborQueue: - self.receivedQueue.append((id, i)) - self.receivedBlock.mergeRow(id, row) - self.statsRxInSlot += row.count(1) - else: - pass - def receiveSegment(self, rID, cID, src): # register receive so that we are not sending back if rID in self.rowIDs: @@ -307,66 +260,6 @@ class Validator: self.statsRxInSlot = 0 self.statsTxInSlot = 0 - def nextColumnToSend(self, columnID, limit = sys.maxsize): - line = self.getColumn(columnID) - if line.any(): - self.logger.debug("col %d -> %s", columnID, self.columnNeighbors[columnID] , extra=self.format) - for _, n in shuffledDict(self.columnNeighbors[columnID]): - - # if there is anything new to send, send it - toSend = line & ~n.sent & ~n.received - if (toSend).any(): - toSend = sampleLine(toSend, limit) - yield NextToSend(n, toSend, columnID, 1) - - def nextRowToSend(self, rowID, limit = sys.maxsize): - line = self.getRow(rowID) - if line.any(): - self.logger.debug("row %d -> %s", rowID, self.rowNeighbors[rowID], extra=self.format) - for _, n in shuffledDict(self.rowNeighbors[rowID]): - - # if there is anything new to send, send it - toSend = line & ~n.sent & ~n.received - if (toSend).any(): - toSend = sampleLine(toSend, limit) - yield NextToSend(n, toSend, rowID, 0) - - def nextToSend(self): - """ Send scheduler as a generator function - - Yields next segment(s) to send when asked for it. - Generates an infinite flow, returning with exit only when - there is nothing more to send. - - Generates a randomized order of columns and rows, sending to one neighbor - at each before sending to another neighbor. - Generates a new randomized ordering once all columns, rows, and neighbors - are processed once. - """ - - while True: - perLine = [] - for c in self.columnIDs: - perLine.append(self.nextColumnToSend(c, 1)) - - for r in self.rowIDs: - perLine.append(self.nextRowToSend(r, 1)) - - count = 0 - random.shuffle(perLine) - while (perLine): - for g in perLine.copy(): # we need a shallow copy to allow remove - n = next(g, None) - if not n: - perLine.remove(g) - continue - count += 1 - yield n - - # return if there is nothing more to send - if not count: - return - def sendSegmentToNeigh(self, rID, cID, neigh): if (neigh.sent | neigh.received).count(1) >= self.sendLineUntil: return False # sent enough, other side can restore @@ -521,31 +414,6 @@ class Validator: if self.statsTxInSlot >= self.bwUplink: return return - - for n in self.sched: - neigh = n.neigh - toSend = n.toSend - id = n.id - dim = n.dim - - neigh.sent |= toSend; - if dim == 0: - neigh.node.receiveRow(id, toSend, self.ID) - else: - neigh.node.receiveColumn(id, toSend, self.ID) - - sent = toSend.count(1) - self.statsTxInSlot += sent - self.logger.debug("sending %s %d to %d (%d)", - "col" if dim else "row", id, neigh.node.ID, sent, extra=self.format) - - # until we exhaust capacity - # TODO: use exact limit - if self.statsTxInSlot >= self.bwUplink: - return - - # Scheduler exited, nothing to send. Create new one for next round. - self.sched = self.nextToSend() def logRows(self): """It logs the rows assigned to the validator.""" From ead127e73edc124b8b833e7dfcd274822b54057e Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 24 Feb 2023 08:42:35 +0100 Subject: [PATCH 057/162] change defaults to queue per p2p link Signed-off-by: Csaba Kiraly --- DAS/validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DAS/validator.py b/DAS/validator.py index 1b15fb4..00acc91 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -141,7 +141,7 @@ class Validator: self.repairOnTheFly = True self.sendLineUntil = (self.shape.blockSize + 1) // 2 # stop sending on a p2p link if at least this amount of samples passed - self.perNeighborQueue = False # queue incoming messages to outgoing connections on arrival (as typical GossipSub impl) + self.perNeighborQueue = True # queue incoming messages to outgoing connections on arrival (as typical GossipSub impl) self.perNodeQueue = False # keep a global queue of incoming messages for later sequential dispatch self.shuffleLines = True # shuffle the order of rows/columns in each iteration while trying to send self.shuffleNeighbors = True # shuffle the order of neighbors when sending the same segment to each neighbor From fa1818a43b314d67035c025a8b409ad389912c00 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 24 Feb 2023 08:43:18 +0100 Subject: [PATCH 058/162] simplify code Signed-off-by: Csaba Kiraly --- DAS/validator.py | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 00acc91..25ca426 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -8,7 +8,7 @@ from DAS.block import * from bitarray import bitarray from bitarray.util import zeros from collections import deque - +from itertools import chain def shuffled(lis, shuffle=True): ''' Generator yielding list in shuffled order @@ -236,12 +236,7 @@ class Validator: self.block.merge(self.receivedBlock) - for neighs in self.rowNeighbors.values(): - for neigh in neighs.values(): - neigh.received |= neigh.receiving - neigh.receiving.setall(0) - - for neighs in self.columnNeighbors.values(): + for neighs in chain (self.rowNeighbors.values(), self.columnNeighbors.values()): for neigh in neighs.values(): neigh.received |= neigh.receiving neigh.receiving.setall(0) @@ -332,17 +327,15 @@ class Validator: if s.dim == 0: for _, neigh in shuffledDict(self.rowNeighbors[s.id], self.shuffleNeighbors): self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) - if not neigh.sent[s.i] and not neigh.received[s.i]: - if self.sendSegmentToNeigh(s.id, s.i, neigh): - self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) - break + if self.sendSegmentToNeigh(s.id, s.i, neigh): + self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) + break else: for _, neigh in shuffledDict(self.columnNeighbors[s.id], self.shuffleNeighbors): self.logger.debug("%d or %d", neigh.sent[s.i], neigh.received[s.i], extra=self.format) - if not neigh.sent[s.i] and not neigh.received[s.i]: - if self.sendSegmentToNeigh(s.i, s.id, neigh): - self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) - break + if self.sendSegmentToNeigh(s.i, s.id, neigh): + self.logger.debug("sending to %d", neigh.node.ID, extra=self.format) + break if self.statsTxInSlot >= self.bwUplink: if not self.segmentShuffleSchedulerPersist: From 300bc19c677b3bedb4a611698b23d06dc56a3f8d Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 24 Feb 2023 08:55:26 +0100 Subject: [PATCH 059/162] factorize send code Signed-off-by: Csaba Kiraly --- DAS/validator.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 25ca426..8f0436d 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -270,11 +270,7 @@ class Validator: else: return False # received or already sent - def send(self): - """ Send as much as we can in the timeslot, limited by bwUplink - """ - - # process node level send queue + def processSendQueue(self): while self.sendQueue: (rID, cID) = self.sendQueue[0] @@ -294,7 +290,7 @@ class Validator: self.sendQueue.popleft() - # process neighbor level send queues in shuffled breadth-first order + def processPerNeighborSendQueue(self): progress = True while (progress): progress = False @@ -314,8 +310,7 @@ class Validator: if self.statsTxInSlot >= self.bwUplink: return - # process possible segments to send in shuffled breadth-first order - if self.segmentShuffleScheduler: + def runSegmentShuffleScheduler(self): # This scheduler check which owned segments needs sending (at least # one neighbor needing it). Then it sends each segment that's worth sending # once, in shuffled order. This is repeated until bw limit. @@ -376,7 +371,7 @@ class Validator: else: self.segmentShuffleGen = shuffled(self.segmentsToSend, self.shuffleLines) - if self.dumbRandomScheduler: + def runDumbRandomScheduler(self): # dumb random scheduler picking segments at random and trying to send it tries = 100 t = tries @@ -408,6 +403,23 @@ class Validator: return return + def send(self): + """ Send as much as we can in the timeslot, limited by bwUplink + """ + + # process node level send queue + self.processSendQueue() + + # process neighbor level send queues in shuffled breadth-first order + self.processPerNeighborSendQueue() + + # process possible segments to send in shuffled breadth-first order + if self.segmentShuffleScheduler: + self.runSegmentShuffleScheduler() + + if self.dumbRandomScheduler: + self.runDumbRandomScheduler() + def logRows(self): """It logs the rows assigned to the validator.""" if self.logger.isEnabledFor(logging.DEBUG): From a03371cf4eb34c8948e1c5a5d1d6420e975f44fe Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 24 Feb 2023 10:21:28 +0100 Subject: [PATCH 060/162] add logging of TX and RX statistics Signed-off-by: Csaba Kiraly --- DAS/simulator.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/DAS/simulator.py b/DAS/simulator.py index 74d310e..2fed35f 100644 --- a/DAS/simulator.py +++ b/DAS/simulator.py @@ -3,6 +3,7 @@ import networkx as nx import logging, random from datetime import datetime +from statistics import mean from DAS.tools import * from DAS.results import * from DAS.observer import * @@ -158,6 +159,15 @@ class Simulator: for i in range(0,self.shape.numberValidators): self.validators[i].logRows() self.validators[i].logColumns() + + # log TX and RX statistics + statsTxInSlot = [v.statsTxInSlot for v in self.validators] + statsRxInSlot = [v.statsRxInSlot for v in self.validators] + self.logger.debug("step %d: TX_prod=%.1f, RX_prod=%.1f, TX_avg=%.1f, TX_max=%.1f, Rx_avg=%.1f, Rx_max=%.1f" % + (steps, statsTxInSlot[0], statsRxInSlot[0], + mean(statsTxInSlot[1:]), max(statsTxInSlot[1:]), + mean(statsRxInSlot[1:]), max(statsRxInSlot[1:])), extra=self.format) + for i in range(0,self.shape.numberValidators): self.validators[i].updateStats() arrived, expected = self.glob.checkStatus(self.validators) From 0a418b35b2c1ebb63f21d9a9d40b7d2d76ef2ee3 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 24 Feb 2023 10:24:19 +0100 Subject: [PATCH 061/162] parametrize dumbRandomScheduler Signed-off-by: Csaba Kiraly --- DAS/validator.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 8f0436d..2f4bf8e 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -371,9 +371,8 @@ class Validator: else: self.segmentShuffleGen = shuffled(self.segmentsToSend, self.shuffleLines) - def runDumbRandomScheduler(self): + def runDumbRandomScheduler(self, tries = 100): # dumb random scheduler picking segments at random and trying to send it - tries = 100 t = tries while t: if self.rowIDs: From d9a2d5d606f8738cd7a76793742ee5009925fa00 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 24 Feb 2023 12:04:07 +0100 Subject: [PATCH 062/162] fixup: ensure bw limit is respected Lost meaning of return while factorizing schedulers. Fix it by checking limits after each call. Signed-off-by: Csaba Kiraly --- DAS/validator.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/DAS/validator.py b/DAS/validator.py index 2f4bf8e..4d5aa27 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -408,16 +408,24 @@ class Validator: # process node level send queue self.processSendQueue() + if self.statsTxInSlot >= self.bwUplink: + return # process neighbor level send queues in shuffled breadth-first order self.processPerNeighborSendQueue() + if self.statsTxInSlot >= self.bwUplink: + return # process possible segments to send in shuffled breadth-first order if self.segmentShuffleScheduler: self.runSegmentShuffleScheduler() + if self.statsTxInSlot >= self.bwUplink: + return if self.dumbRandomScheduler: self.runDumbRandomScheduler() + if self.statsTxInSlot >= self.bwUplink: + return def logRows(self): """It logs the rows assigned to the validator.""" From f95a393068f03fd27b117d830267091b01167c48 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Fri, 24 Feb 2023 12:10:34 +0100 Subject: [PATCH 063/162] improve perNeighborSendQueue - improve shuffling between rows and columns - speed up code execution Signed-off-by: Csaba Kiraly --- DAS/validator.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/DAS/validator.py b/DAS/validator.py index 4d5aa27..6410422 100644 --- a/DAS/validator.py +++ b/DAS/validator.py @@ -142,6 +142,7 @@ class Validator: self.repairOnTheFly = True self.sendLineUntil = (self.shape.blockSize + 1) // 2 # stop sending on a p2p link if at least this amount of samples passed self.perNeighborQueue = True # queue incoming messages to outgoing connections on arrival (as typical GossipSub impl) + self.shuffleQueues = True # shuffle the order of picking from active queues of a sender node self.perNodeQueue = False # keep a global queue of incoming messages for later sequential dispatch self.shuffleLines = True # shuffle the order of rows/columns in each iteration while trying to send self.shuffleNeighbors = True # shuffle the order of neighbors when sending the same segment to each neighbor @@ -294,21 +295,27 @@ class Validator: progress = True while (progress): progress = False - for rID, neighs in shuffledDict(self.rowNeighbors, self.shuffleLines): - for _, neigh in shuffledDict(neighs, self.shuffleNeighbors): - if (neigh.sendQueue): - self.sendSegmentToNeigh(rID, neigh.sendQueue.popleft(), neigh) - progress = True - if self.statsTxInSlot >= self.bwUplink: - return - for cID, neighs in shuffledDict(self.columnNeighbors, self.shuffleLines): - for _, neigh in shuffledDict(neighs, self.shuffleNeighbors): + queues = [] + # collect and shuffle + for rID, neighs in self.rowNeighbors.items(): + for neigh in neighs.values(): if (neigh.sendQueue): - self.sendSegmentToNeigh(neigh.sendQueue.popleft(), cID, neigh) - progress = True - if self.statsTxInSlot >= self.bwUplink: - return + queues.append((0, rID, neigh)) + + for cID, neighs in self.columnNeighbors.items(): + for neigh in neighs.values(): + if (neigh.sendQueue): + queues.append((1, cID, neigh)) + + for dim, lineID, neigh in shuffled(queues, self.shuffleQueues): + if dim == 0: + self.sendSegmentToNeigh(lineID, neigh.sendQueue.popleft(), neigh) + else: + self.sendSegmentToNeigh(neigh.sendQueue.popleft(), lineID, neigh) + progress = True + if self.statsTxInSlot >= self.bwUplink: + return def runSegmentShuffleScheduler(self): # This scheduler check which owned segments needs sending (at least From 39c454d3f4ce69012c28519573f7a81ea83ed9a3 Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Sun, 26 Feb 2023 18:36:02 +0100 Subject: [PATCH 064/162] minor plot fixes --- .gitignore | 3 +- DAS/visualizer.py | 20 +++++-- results/plots.py | 138 ---------------------------------------------- 3 files changed, 16 insertions(+), 145 deletions(-) delete mode 100644 results/plots.py diff --git a/.gitignore b/.gitignore index 026d904..42fd1ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.swp *.pyc results/* -!results/plots.py \ No newline at end of file +!results/plots.py +Frontend/ \ No newline at end of file diff --git a/DAS/visualizer.py b/DAS/visualizer.py index 9ab37c2..047e513 100644 --- a/DAS/visualizer.py +++ b/DAS/visualizer.py @@ -13,9 +13,10 @@ class Visualizer: self.execID = execID self.folderPath = "results/"+self.execID self.parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', 'chi'] + self.minimumDataPoints = 2 - #Store data with a unique key for each params combination def plottingData(self): + #Store data with a unique key for each params combination data = {} #Loop over the xml files in the folder for filename in os.listdir(self.folderPath): @@ -65,8 +66,8 @@ class Visualizer: print("Getting data from the folder...") return data - #Get the keys for all data with the same x and y labels def similarKeys(self, data): + #Get the keys for all data with the same x and y labels filteredKeys = {} for key1, value1 in data.items(): subKeys1 = list(value1.keys()) @@ -81,14 +82,19 @@ class Visualizer: print("Getting filtered keys from data...") return filteredKeys - #Title formatting for the figures + def formatLabel(self, label): + #Label formatting for the figures + result = ''.join([f" {char}" if char.isupper() else char for char in label]) + return result.title() + def formatTitle(self, key): + #Title formatting for the figures name = ''.join([f" {char}" if char.isupper() else char for char in key.split('_')[0]]) number = key.split('_')[1] return f"{name.title()}: {number} " - #Plot and store the 2D heatmaps in subfolders def plotHeatmaps(self): + #Plot and store the 2D heatmaps in subfolders data = self.plottingData() filteredKeys = self.similarKeys(data) print("Plotting heatmaps...") @@ -103,12 +109,14 @@ class Visualizer: for key in keys: xlabels = np.sort(np.unique(data[key][labels[0]])) ylabels = np.sort(np.unique(data[key][labels[1]])) + if len(xlabels) < self.minimumDataPoints or len(ylabels) < self.minimumDataPoints: + continue hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas']) hist = hist.T fig, ax = plt.subplots(figsize=(10, 6)) sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax) - plt.xlabel(labels[0]) - plt.ylabel(labels[1]) + plt.xlabel(self.formatLabel(labels[0])) + plt.ylabel(self.formatLabel(labels[1])) filename = "" title = "" paramValueCnt = 0 diff --git a/results/plots.py b/results/plots.py deleted file mode 100644 index b22dd2f..0000000 --- a/results/plots.py +++ /dev/null @@ -1,138 +0,0 @@ -import os, sys -import time -import xml.etree.ElementTree as ET -import matplotlib.pyplot as plt -import numpy as np -import seaborn as sns -from itertools import combinations - -parameters = ['run', 'blockSize', 'failureRate', 'numberValidators', 'netDegree', 'chi'] - -#Title formatting for the figures -def formatTitle(key): - name = ''.join([f" {char}" if char.isupper() else char for char in key.split('_')[0]]) - number = key.split('_')[1] - return f"{name.title()}: {number} " - -def getLatestDirectory(): - resultsFolder = os.getcwd() - - #Get all folders and store their time info and sort - directories = [d for d in os.listdir(resultsFolder) if os.path.isdir(os.path.join(resultsFolder, d))] - directoriesTime = [(d, os.path.getctime(os.path.join(resultsFolder, d))) for d in directories] - directoriesTime.sort(key=lambda x: x[1], reverse=True) - - #Get the path of the latest created folder - latestDirectory = directoriesTime[0][0] - folderPath = os.path.join(resultsFolder, latestDirectory) - return folderPath - -def plottingData(folderPath): - #Store data with a unique key for each params combination - data = {} - plotInfo = {} - - #Loop over the xml files in the folder - for filename in os.listdir(folderPath): - #Loop over the xmls and store the data in variables - if filename.endswith('.xml'): - tree = ET.parse(os.path.join(folderPath, filename)) - root = tree.getroot() - run = int(root.find('run').text) - blockSize = int(root.find('blockSize').text) - failureRate = int(root.find('failureRate').text) - numberValidators = int(root.find('numberValidators').text) - netDegree = int(root.find('netDegree').text) - chi = int(root.find('chi').text) - tta = int(root.find('tta').text) - - # Loop over all possible combinations of length 4 of the parameters - for combination in combinations(parameters, 4): - # Get the indices and values of the parameters in the combination - indices = [parameters.index(element) for element in combination] - selectedValues = [run, blockSize, failureRate, numberValidators, netDegree, chi] - values = [selectedValues[index] for index in indices] - names = [parameters[i] for i in indices] - keyComponents = [f"{name}_{value}" for name, value in zip(names, values)] - key = tuple(keyComponents[:4]) - #Get the names of the other 2 parameters that are not included in the key - otherParams = [parameters[i] for i in range(6) if i not in indices] - #Append the values of the other 2 parameters and the ttas to the lists for the key - otherIndices = [i for i in range(len(parameters)) if i not in indices] - - #Initialize the dictionary for the key if it doesn't exist yet - if key not in data: - data[key] = {} - #Initialize lists for the other 2 parameters and the ttas with the key - data[key][otherParams[0]] = [] - data[key][otherParams[1]] = [] - data[key]['ttas'] = [] - - if otherParams[0] in data[key]: - data[key][otherParams[0]].append(selectedValues[otherIndices[0]]) - else: - data[key][otherParams[0]] = [selectedValues[otherIndices[0]]] - if otherParams[1] in data[key]: - data[key][otherParams[1]].append(selectedValues[otherIndices[1]]) - else: - data[key][otherParams[1]] = [selectedValues[otherIndices[1]]] - data[key]['ttas'].append(tta) - return data - -def similarKeys(data): - #Get the keys for all data with the same x and y labels - filteredKeys = {} - for key1, value1 in data.items(): - subKeys1 = list(value1.keys()) - filteredKeys[(subKeys1[0], subKeys1[1])] = [key1] - for key2, value2 in data.items(): - subKeys2 = list(value2.keys()) - if key1 != key2 and subKeys1[0] == subKeys2[0] and subKeys1[1] == subKeys2[1]: - try: - filteredKeys[(subKeys1[0], subKeys1[1])].append(key2) - except KeyError: - filteredKeys[(subKeys1[0], subKeys1[1])] = [key2] - return filteredKeys - -def plotHeatmaps(folderPath, filteredKeys, data): - #Store the 2D heatmaps in a folder - heatmapsFolder = folderPath+'/heatmaps' - if not os.path.exists(heatmapsFolder): - os.makedirs(heatmapsFolder) - - for labels, keys in filteredKeys.items(): - for key in keys: - xlabels = np.sort(np.unique(data[key][labels[0]])) - ylabels = np.sort(np.unique(data[key][labels[1]])) - hist, xedges, yedges = np.histogram2d(data[key][labels[0]], data[key][labels[1]], bins=(len(xlabels), len(ylabels)), weights=data[key]['ttas']) - hist = hist.T - fig, ax = plt.subplots(figsize=(10, 6)) - sns.heatmap(hist, xticklabels=xlabels, yticklabels=ylabels, cmap='Purples', cbar_kws={'label': 'Time to block availability'}, linecolor='black', linewidths=0.3, annot=True, fmt=".2f", ax=ax) - plt.xlabel(labels[0]) - plt.ylabel(labels[1]) - filename = "" - title = "" - paramValueCnt = 0 - for param in parameters: - if param != labels[0] and param != labels[1]: - filename += f"{key[paramValueCnt]}" - title += formatTitle(key[paramValueCnt]) - paramValueCnt += 1 - title_obj = plt.title(title) - font_size = 16 * fig.get_size_inches()[0] / 10 - title_obj.set_fontsize(font_size) - filename = filename + ".png" - targetFolder = os.path.join(heatmapsFolder, f"{labels[0]}Vs{labels[1]}") - if not os.path.exists(targetFolder): - os.makedirs(targetFolder) - plt.savefig(os.path.join(targetFolder, filename)) - plt.close() - plt.clf() - -def generateHeatmaps(folderPath): - #folderPath = getLatestDirectory() - data = plottingData(folderPath) - filteredKeys = similarKeys(data) - plotHeatmaps(folderPath, filteredKeys, data) - -generateHeatmaps(sys.argv[1]) From 57f35091020bc7f6cc49ba5f653541d5c8e1a1d4 Mon Sep 17 00:00:00 2001 From: HajarZaiz Date: Sun, 26 Feb 2023 18:38:20 +0100 Subject: [PATCH 065/162] Removed Frontend directory from Git index --- Frontend/Imgs/logo.png | Bin 15639 -> 0 bytes Frontend/Plots/plot1.png | Bin 15025 -> 0 bytes Frontend/Plots/plot2_10_8192.png | Bin 14795 -> 0 bytes Frontend/Plots/plot3_70_8192.png | Bin 16900 -> 0 bytes Frontend/Plots/plot4_80_8192.png | Bin 16917 -> 0 bytes Frontend/Plots/plot5_90_8192.png | Bin 16917 -> 0 bytes Frontend/Plots/plot6_100_8192.png | Bin 16662 -> 0 bytes Frontend/Plots/plot7_110_8192.png | Bin 16917 -> 0 bytes Frontend/Plots/plot8_120_8192.png | Bin 16662 -> 0 bytes Frontend/Plots/plot9_130_8192.png | Bin 15025 -> 0 bytes Frontend/Plots/plt1.png | Bin 16907 -> 0 bytes Frontend/css/style.css | 85 ------------------------------ Frontend/index.html | 32 ----------- Frontend/script.js | 33 ------------ 14 files changed, 150 deletions(-) delete mode 100644 Frontend/Imgs/logo.png delete mode 100644 Frontend/Plots/plot1.png delete mode 100644 Frontend/Plots/plot2_10_8192.png delete mode 100644 Frontend/Plots/plot3_70_8192.png delete mode 100644 Frontend/Plots/plot4_80_8192.png delete mode 100644 Frontend/Plots/plot5_90_8192.png delete mode 100644 Frontend/Plots/plot6_100_8192.png delete mode 100644 Frontend/Plots/plot7_110_8192.png delete mode 100644 Frontend/Plots/plot8_120_8192.png delete mode 100644 Frontend/Plots/plot9_130_8192.png delete mode 100644 Frontend/Plots/plt1.png delete mode 100644 Frontend/css/style.css delete mode 100644 Frontend/index.html delete mode 100644 Frontend/script.js diff --git a/Frontend/Imgs/logo.png b/Frontend/Imgs/logo.png deleted file mode 100644 index 6e90de275073e5421e92487cadb02bd1f1e9f8a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15639 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 diff --git a/Frontend/Plots/plot1.png b/Frontend/Plots/plot1.png deleted file mode 100644 index e6ac52946ff514b52ba34409194ba9e5b92d3551..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15025 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 S3_c%45G_ub=N+Z~`ab~hk@r9V diff --git a/Frontend/Plots/plot2_10_8192.png b/Frontend/Plots/plot2_10_8192.png deleted file mode 100644 index fedae4386bc48752b1a48921b1994ae19607cfe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14795 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 I>?dFPAF7^W{Qv*} diff --git a/Frontend/Plots/plot3_70_8192.png b/Frontend/Plots/plot3_70_8192.png deleted file mode 100644 index b0f328ee74840135c644623ed7dc82397beba373..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16900 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 O5QJmaM@vkJSN6elo5hx5J9D=L=Zth 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 O5QJmaM@vkJSN-sk=E{X>oC?7jBdYwy)QYn^*% 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 S3_c%45G_ub=N+Z~`ab~hk@r9V diff --git a/Frontend/Plots/plt1.png b/Frontend/Plots/plt1.png deleted file mode 100644 index 85ca6e96e155807b9f2485b92160acfd7a833316..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16907 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 - - - - - - - DAS Dashboard - - -