Beispiel #1
0
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
Beispiel #2
0
 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)
Beispiel #3
0
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