def dsatur(orig, g, trans, frat, col, silent=True): satdeg = {} ncols = {} for v in g: satdeg[v] = 0 ncols[v] = set() def upd(v, coloring, colorstats, graph): vcol = coloring[v] for w in graph.neighbours(v): if w in ncols and vcol not in ncols[w]: ncols[w].add(vcol) satdeg[w] += 1 def vchoice(uncolored, coloring, graph): # First choice: some max deg vertex if len(coloring) == 0: maxv = None maxdeg = -1 for v in graph: d = graph.degree(v) if d > maxdeg: maxdeg = d maxv = v del satdeg[v] del ncols[v] return v # Now choose vertex that sees a maximum num of colors # Todo: us a priority queue here. res = maxsat = -1 for v in satdeg: if satdeg[v] > maxsat: maxsat = satdeg[v] res = v del satdeg[res] del ncols[res] return res return color_by_ordering(g.undirected(), vchoice, next_free_color, upd)
def min_deg(orig, g, trans, frat, col, silent=True): undir_g = g.undirected() degBuckets = [] degrees = {} # Keep track of remaining degree maxdegree = 0 for v in g: d = undir_g.degree(v) if d >= len(degBuckets): degBuckets.extend([set() for x in range(len(degBuckets), d + 1)]) degBuckets[d].add(v) degrees[v] = d maxdegree = max(maxdegree, d) for d in xrange(0, maxdegree+1): if d >= len(degBuckets): degBuckets.extend([set() for x in range(len(degBuckets), d + 1)]) def vchoice(uncolored, coloring, graph): mindeg = 0 while len(degBuckets[mindeg]) == 0: mindeg += 1 v = iter(degBuckets[mindeg]).next() # Just get any degBuckets[mindeg].remove(v) # Update neighbours for w in graph.neighbours(v): if w not in degrees or w == v: continue # Was already processed deg = degrees[w] degBuckets[deg].remove(w) degBuckets[deg-1].add(w) degrees[w] -= 1 del degrees[v] return v return color_by_ordering(undir_g, vchoice, next_free_color)
def min_deg(orig, g, trans, frat, col, silent=True): undir_g = g.undirected() degBuckets = [] degrees = {} # Keep track of remaining degree maxdegree = 0 for v in g: d = undir_g.degree(v) if d >= len(degBuckets): degBuckets.extend([set() for x in range(len(degBuckets), d + 1)]) degBuckets[d].add(v) degrees[v] = d maxdegree = max(maxdegree, d) for d in xrange(0, maxdegree + 1): if d >= len(degBuckets): degBuckets.extend([set() for x in range(len(degBuckets), d + 1)]) def vchoice(uncolored, coloring, graph): mindeg = 0 while len(degBuckets[mindeg]) == 0: mindeg += 1 v = iter(degBuckets[mindeg]).next() # Just get any degBuckets[mindeg].remove(v) # Update neighbours for w in graph.neighbours(v): if w not in degrees or w == v: continue # Was already processed deg = degrees[w] degBuckets[deg].remove(w) degBuckets[deg - 1].add(w) degrees[w] -= 1 del degrees[v] return v return color_by_ordering(undir_g, vchoice, next_free_color)