-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathutility.py
67 lines (55 loc) · 1.71 KB
/
utility.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
def reestablish_priority(initial,adjusted):
output={}
to_be_removed = {k for k,v in adjusted.items() if v<0}
initial_order = sorted(initial.items(),key=lambda x:x[1])
adjusted_order = sorted(adjusted.items(),key=lambda x:x[1])
already_assigned_values = set(adjusted.values())
for k,v in adjusted_order:
output[k] = v
for k,v in initial_order:
if k not in output:
while v in already_assigned_values:
v = v + 1
output[k] = v
already_assigned_values.add(v)
if len(set(adjusted.keys())-to_be_removed)!=len(set(adjusted.values()))-(1 if to_be_removed else 0):
raise Exception("you cannot assign the same priority for two strategies",adjusted)
return output
class ResultAccumulator():
"""docstring for ResultAccumulator"""
def __init__(self,penalized=[], penalty=0):
self.accumulator = {}
self.penalized = set(penalized)
self.penalty = penalty
self.history = []
def push(self,node,priority,penalty = 0):
self.history.append((node,priority))
if not node:
return None
if node in self.penalized:
priority = self.penalize(priority,self.penalty)
priority = self.penalize(priority,penalty)
if priority < 0:
return
elif priority not in self.accumulator:
self.accumulator[priority] = [node]
else:
self.accumulator[priority].append(node)
def penalize(self,priority,penalty):
if priority<0:
return priority
else:
return priority+penalty
def get_result(self):
visited = set()
finalists = []
sorted_keys = sorted(self.accumulator.keys())
for x in sorted_keys:
for node in self.accumulator[x]:
if node not in visited:
visited.add(node)
finalists.append(node)
if len(finalists)>=1:
return finalists[0],finalists[1:]
else:
return None,None