adding individual Validator objects behind Node

Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
This commit is contained in:
Csaba Kiraly 2023-12-12 13:31:39 +01:00
parent 4d0a000a67
commit 2eb92b755a
No known key found for this signature in database
GPG Key ID: 0FE274EE8C95166E
2 changed files with 44 additions and 28 deletions

View File

@ -31,15 +31,26 @@ class Neighbor:
self.sendQueue = deque() self.sendQueue = deque()
class Validator:
def __init__(self, rowIDs, columnIDs):
self.rowIDs = rowIDs
self.columnIDs = columnIDs
def initValidator(blockSizeC, chiR, blockSizeR, chiC):
rowIDs = set(random.sample(range(blockSizeC), chiR))
columnIDs = set(random.sample(range(blockSizeR), chiC))
return Validator(rowIDs, columnIDs)
class Node: class Node:
"""This class implements a validator/node in the network.""" """This class implements a node in the network."""
def __repr__(self): def __repr__(self):
"""It returns the validator ID.""" """It returns the node ID."""
return str(self.ID) return str(self.ID)
def __init__(self, ID, amIproposer, logger, shape, config, rows = None, columns = None): def __init__(self, ID, amIproposer, logger, shape, config,
"""It initializes the validator with the logger shape and rows/columns. validators, rows = set(), columns = set()):
"""It initializes the node, and eventual validators, following the simulation configuration in shape and config.
If rows/columns are specified these are observed, otherwise (default) If rows/columns are specified these are observed, otherwise (default)
chiR rows and chiC columns are selected randomly. chiR rows and chiC columns are selected randomly.
@ -55,27 +66,22 @@ class Node:
self.sendQueue = deque() self.sendQueue = deque()
self.amIproposer = amIproposer self.amIproposer = amIproposer
self.logger = logger self.logger = logger
if self.shape.chiC > self.shape.blockSizeR: self.validators = validators
self.logger.error("ChiC has to be smaller than %d" % self.shape.blockSizeR, extra=self.format)
elif self.shape.chiR > self.shape.blockSizeC:
self.logger.error("ChiR has to be smaller than %d" % self.shape.blockSizeC, extra=self.format)
else:
if amIproposer: if amIproposer:
self.nodeClass = 0 self.nodeClass = 0
self.rowIDs = range(shape.blockSizeC) self.rowIDs = range(shape.blockSizeC)
self.columnIDs = range(shape.blockSizeR) self.columnIDs = range(shape.blockSizeR)
else: else:
#if shape.deterministic:
# random.seed(self.ID)
self.nodeClass = 1 if (self.ID <= shape.numberNodes * shape.class1ratio) else 2 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.vpn = len(validators) #TODO: needed by old code, change to fn
self.vRowIDs = []
self.vColumnIDs = [] self.rowIDs = set(rows)
for i in range(self.vpn): self.columnIDs = set(columns)
self.vRowIDs.append(set(rows[i*self.shape.chiR:(i+1)*self.shape.chiR]) if rows else set(random.sample(range(self.shape.blockSizeC), self.shape.chiR))) for v in validators:
self.vColumnIDs.append(set(columns[i*self.shape.chiC:(i+1)*self.shape.chiC]) if columns else set(random.sample(range(self.shape.blockSizeR), self.shape.chiC))) self.rowIDs = self.rowIDs.union(v.rowIDs)
self.rowIDs = set.union(*self.vRowIDs) self.columnIDs = self.columnIDs.union(v.columnIDs)
self.columnIDs = set.union(*self.vColumnIDs)
self.rowNeighbors = collections.defaultdict(dict) self.rowNeighbors = collections.defaultdict(dict)
self.columnNeighbors = collections.defaultdict(dict) self.columnNeighbors = collections.defaultdict(dict)
@ -113,7 +119,7 @@ class Node:
def logIDs(self): def logIDs(self):
"""It logs the assigned rows and columns.""" """It logs the assigned rows and columns."""
if self.amIproposer == 1: if self.amIproposer == 1:
self.logger.warning("I am a block proposer."% self.ID) self.logger.warning("I am a block proposer.", extra=self.format)
else: else:
self.logger.debug("Selected rows: "+str(self.rowIDs), extra=self.format) self.logger.debug("Selected rows: "+str(self.rowIDs), extra=self.format)
self.logger.debug("Selected columns: "+str(self.columnIDs), extra=self.format) self.logger.debug("Selected columns: "+str(self.columnIDs), extra=self.format)
@ -535,8 +541,8 @@ class Node:
self.logger.debug("status: %d / %d", arrived, expected, extra=self.format) self.logger.debug("status: %d / %d", arrived, expected, extra=self.format)
validated = 0 validated = 0
for i in range(self.vpn): for v in self.validators:
a, e = checkStatus(self.vColumnIDs[i], self.vRowIDs[i]) a, e = checkStatus(v.columnIDs, v.rowIDs)
if a == e: if a == e:
validated+=1 validated+=1

View File

@ -97,7 +97,17 @@ class Simulator:
self.nodeColumns.append(val.columnIDs) self.nodeColumns.append(val.columnIDs)
else: else:
val = Node(i, int(not i!=0), self.logger, self.shape, self.config) if self.shape.chiC > self.shape.blockSizeR:
self.logger.error("ChiC has to be smaller than %d" % self.shape.blockSizeR)
elif self.shape.chiR > self.shape.blockSizeC:
self.logger.error("ChiR has to be smaller than %d" % self.shape.blockSizeC)
vs = []
nodeClass = 1 if (i <= self.shape.numberNodes * self.shape.class1ratio) else 2
vpn = self.shape.vpn1 if (nodeClass == 1) else self.shape.vpn2
for v in range(vpn):
vs.append(initValidator(self.shape.blockSizeC, self.shape.chiR, self.shape.blockSizeR, self.shape.chiC))
val = Node(i, int(not i!=0), self.logger, self.shape, self.config, vs)
if i == self.proposerID: if i == self.proposerID:
val.initBlock() val.initBlock()
else: else: