-
Notifications
You must be signed in to change notification settings - Fork 1
/
core.py
53 lines (42 loc) · 1.78 KB
/
core.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
from agent import *
from piece import *
from subcore import *
from debug import *
'''''''''
Returns an envy-free partial allocation of the piece passed in
Comment styles:
## Comments: Code from Aziz and Mackenzie's algorithm
# Comments: Disabled code
Triple quotes: Implementation commentary
'''''''''
def core(agent_to_cut, agents, piece):
assert agent_to_cut in agents
## 1: Ask agent i to cut the cake R into n equally preferred pieces
pieces = agent_to_cut.cut_into_n_pieces_of_equal_value(len(agents), piece)
## 2: Run SubCore Protocol on the n pieces with agents set N \ {i} with each agent having a benchmark value as zero.
for a in agents:
a.benchmark = 0
subcore(pieces, [a for a in agents if a != agent_to_cut])
## 3: Give i one of the unallocated untrimmed pieces from the previous step
unallocated_pieces = [p for p in pieces if p.allocated == None]
assert len(unallocated_pieces) == 1
unallocated_pieces[0].allocated = agent_to_cut
## 4: Return an envy-free partial allocation as well as the unallocated cake
''' Leave commented to avoid caching values that will mess up value_counts '''
#assert envy_free(pieces)
'''
Note that our implementation returns pieces with trims placed on them
to indicate where the residue should be cut off
'''
return pieces
def iterate_core(cutter, agents, piece):
pieces = core(cutter, agents, piece)
residue = Piece.extract_residue_from_pieces(pieces)
''' Add to player's total allocations '''
for p in pieces:
p.allocated.allocated_cake += p
''' Fractalize the player preferences to maintain detail in succeeding calls '''
if fractalize:
for a in agents:
a.fractalize_preferences(residue.intervals)
return pieces, residue