-
Notifications
You must be signed in to change notification settings - Fork 0
/
coloration.py
134 lines (102 loc) · 3.02 KB
/
coloration.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from algopy import graph
from algopy import queue
import os
"""
Created on Sat Feb 3 13:49:12 2018
@author: Nathalie
"""
from algopy import graph
import os
def __graphlist(dirpath):
"""builds a list of graphs from a given directory
Args:
dirpath (str): path to the graph directory (".gra" format)
Returns:
Graph list
"""
files = os.listdir(dirpath)
L = []
for f in files:
L.append(dirpath + "/" + f)
L = sorted(L)
return [graph.loadgra(f) for f in L]
# pour les adeptes des "list comprehensions"
def __graphlist2(dirpath):
return [graph.loadgra(dirpath + "/" + f) for f in os.listdir(dirpath)]
#without verification!
def run_coloration(f, dirpath):
return [f(G)[0] for G in __graphlist(dirpath)]
# with verification
def __testcolors(G, colors):
for s in range(G.order):
for adj in G.adjlists[s]:
if colors[s] == colors[adj]:
print(s, adj, colors)
return False
return True
def run_verif_coloration(f, dirpath):
"""tests coloration function on a list of graphs
Args:
f (function): the coloration function (returns (nbcol, color list))
dirpath (str): path to the graph directory (".gra" format)
Returns:
the result list: list of color numbers
"""
tests = __graphlist(dirpath)
results = []
for G in tests:
(nb, colors) = f(G)
if not __testcolors(G, colors):
a = graph.todot(G)
f2 = open("test.dot", 'w')
f2.write(a)
f2.close()
print("wrong coloration")
results.append(nb)
return results
""" @author: audran doublet """
# Fix_color et Add_color sont totalement à revoir, car absolument pas optimisés que ce soit au
# niveau de la mémoire comme de la complexité...
def __fix_color(col, precolors):
if not precolors:
return col + 1
precolors = [-1] + sorted(precolors)
for i in range(len(precolors) - 1):
if precolors[i + 1] - precolors[i] > 1:
return precolors[i] + 1
return precolors[-1] + 1
def __add_color(col, precolors):
if col not in precolors:
precolors.append(col)
return precolors
def __colorize_graph(G, result, precolors, vec, cur):
maxcol = 0
q = queue.Queue()
q.enqueue(cur)
vec[cur] = 1
while not q.isempty():
cur = q.dequeue()
col = result[cur]
maxcol = max(maxcol, col)
for child in G.adjlists[cur]:
if not vec[child]:
q.enqueue(child)
vec[child] = 1
childcol = result[child]
if col == childcol:
__add_color(col, precolors[child])
result[child] = __fix_color(col, precolors[child])
elif col > childcol:
__add_color(col, precolors[child])
return maxcol
def colorize_graph(G):
result = G.order * [0]
precolors = [[] for _ in range(G.order)]
vec = G.order * [0]
maxcol = 0
for i in range(G.order):
if not vec[i]:
col = __colorize_graph(G, result, precolors, vec, i)
maxcol = max(maxcol, col)
return maxcol + 1, result
print(run_verif_coloration(colorize_graph, "graph_example/coloration"))