def gen_simple_ConcreteNet(genLabel, deltaTime, sortable = True, pathMustExist = False, maxNodes = 12, maxEdgesPerNode = 3): numNodes = randint(2, maxNodes + 1) edgesForwards = dict() for node in range(0, numNodes - 1): edgesForwards[node] = [] for edge in range(randint(0, maxEdgesPerNode + 1)): label = genLabel() minNode = (node + 1) if sortable and deltaTime(label) == 0 else 1 nextNode = randint(minNode, numNodes) edgesForwards[node].append((label, nextNode)) edgesForwards[numNodes - 1] = [] elems = [ None for node in range(numNodes) ] net = wnet.ConcreteNet(startNode = 0, endNode = numNodes - 1, elems = elems, edgesForwards = edgesForwards) if pathMustExist and not wnet.nodeSetCompute(net, accessibleOnly = True): return gen_simple_ConcreteNet(genLabel = genLabel, deltaTime = deltaTime, sortable = sortable, pathMustExist = pathMustExist, maxNodes = maxNodes, maxEdgesPerNode = maxEdgesPerNode) else: perm = list(range(numNodes)) random.shuffle(perm) netPerm = wnet.concretizeNet(net, perm) wnet.checkConsistent(netPerm, nodeSet = set(range(numNodes))) return netPerm
def test_concretizeNetTopSort(self, its = 1000): for it in range(its): net = gen_simple_ConcreteNet(defaultGenLabel, defaultDeltaTime, sortable = True, pathMustExist = True) if randBool(): net = wnet.concretizeNetSimple(net, accessibleOnly = True) sortedNodes = wnet.topSort(net, defaultDeltaTime) sortedNet = wnet.concretizeNetTopSort(net, defaultDeltaTime) sortedNetNodeSet = wnet.nodeSetCompute(sortedNet, accessibleOnly = False) assert wnet.netIsTopSorted(sortedNet, sortedNetNodeSet, defaultDeltaTime) assert len(sortedNetNodeSet) == len(sortedNodes)
def is_valid_topSort(net, sortedNodes, deltaTime): nodeLookup = dict() for pos, node in enumerate(sortedNodes): assert node not in nodeLookup nodeLookup[node] = pos for node in wnet.nodeSetCompute(net, accessibleOnly = True): assert node in nodeLookup for node in nodeLookup: for forwards in [True, False]: for label, nextNode in net.next(node, forwards): if nextNode in nodeLookup and deltaTime(label) == 0: leftNode = node if forwards else nextNode rightNode = nextNode if forwards else node if nodeLookup[leftNode] >= nodeLookup[rightNode]: return False return True