Expand source code
Browse git
def condense(api, tuples, condenseType, multiple=False):
    F = api.F
    E = api.E
    L = api.L
    N = api.N
    fOtype = F.otype.v
    sortNodes = N.sortNodes
    otypeRank = N.otypeRank
    maxSlot = F.otype.maxSlot
    eoslots = E.oslots.data
    slotType = F.otype.slotType
    condenseRank = otypeRank[condenseType]
    containers = {}
    if not multiple:
        tuples = (tuples,)
    for tup in tuples:
        for (i, n) in enumerate(tup):
            nType = fOtype(n)
            if nType == condenseType:
                containers.setdefault(n, set())
            elif nType == slotType:
                up = L.u(n, otype=condenseType)
                if up:
                    containers.setdefault(up[0], set()).add(n)
            elif otypeRank[nType] < condenseRank:
                slots = eoslots[n - maxSlot - 1]
                first = slots[0]
                last = slots[-1]
                firstUp = L.u(first, otype=condenseType)
                lastUp = L.u(last, otype=condenseType)
                allUps = set()
                if firstUp:
                    allUps.add(firstUp[0])
                if lastUp:
                    allUps.add(lastUp[0])
                for up in allUps:
                    containers.setdefault(up, set()).add(n)
            else:
                pass
                # containers.setdefault(n, set())
    return tuple((c,) + tuple(containers[c]) for c in sortNodes(containers))