Ejemplo n.º 1
0
def bruteForce(V, E):
    '''
	Brute force search through all k=(n-1)-subsets in (E)
	'''

    validTrees = []

    k = len(V) - 1
    m = len(E)

    numSubsets = combination(m, k)

    for i in range(numSubsets):

        subset = colexUnrank(i, k, m)

        edgeSubset = []

        for j in subset:

            edgeSubset.append(E[j - 1])

        isTree = checkIfTree(V, edgeSubset)

        if isTree:
            validTrees.append(edgeSubset)

    return validTrees
Ejemplo n.º 2
0
def colexRank(T, k):
    '''ranks colex ordering
	Algorithm 2.9 in book'''

    r = 0
    for i in range(1, k + 1):
        r += combination(T[i - 1] - 1, k + 1 - i)
    return r
Ejemplo n.º 3
0
def stirling2(m, n):

    s = 0

    for j in range(1, n + 1):

        s += (-1)**(n - j) * combination(n, j) * (j**m)

    return s / factorial(n)
Ejemplo n.º 4
0
def colexUnrank(r, k, n):
    '''unranks colex ordering
	Algorithm 2.10 in book'''

    T = [0] * k
    x = n
    for i in range(1, k + 1):

        c = combination(x, k + 1 - i)

        while c > r:

            x -= 1
            c = combination(x, k + 1 - i)

        T[i - 1] = x + 1
        r -= combination(x, k + 1 - i)
    return T
Ejemplo n.º 5
0
def lexUnrank(r, k, n):

    if k == 1:
        return [r]
    if r == 1:
        return [1] * k
    if n == 1:
        return [1]

    if r > combination(n + k - 1, k):
        return 'undefined'

    else:
        c = 0
        for i in range(k):
            c += combination(n + k - (i + 2), n - (i + 2))
            if r <= c:
                return [i + 1] + unrank(r - k, k - 1, n)
Ejemplo n.º 6
0
def lexRank(T, k, n):

    #base cases
    if k == 1:
        return T[0]
    elif n == 1:
        return 1
    else:

        if T[0] != 1:
            T = [x - 1 for x in T]
            return combination(n + k - 2, k - 1) + rank(T, k, n - 1)
        else:
            return rank(T[1:], k - 1, n)
Ejemplo n.º 7
0
def selectPartition(n):
    '''
	Selects a random partition of a graph on 2*(n) vertices
	returns two parts X0, X1
	Algorithm 5.7 in book
	'''

    #selects random partition to be X0
    r = np.random.randint(0, combination(2 * n, n))
    X0 = lexUnrank(2 * n, r)

    #X1 is the complement of X0
    X1 = np.array(range(2 * n))
    X1 = np.delete(X1, X0)

    return ([X0, X1])