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
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
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)
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
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)
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)
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])