Skip to content

Commit c4778fa

Browse files
committed
Adds check for reviews unbalanced and attempt to fix them
1 parent 23ac9ca commit c4778fa

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

scripts/distribute_proposals.py

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,24 +84,46 @@ def has_conflict(reviewer, proposal):
8484
if len(assignments[reviewer]) >= proposals_per_reviewer:
8585
reviewers_left.remove(reviewer)
8686

87+
# Who has been assigned to each proposal?
88+
projects = {}
89+
for p in proposals:
90+
projects[p] = who_is_reviewing(p)
91+
8792
# How many proposals was each reviewer assigned?
8893
# Sometimes 1-2 reviewers are under-assigned. Can re-run
8994
# until a good split is achieved, or rebalance manually,
9095
# or leave as-is.
91-
print([f"{r}: {len(assignments[r])}" for r in reviewers])
9296

93-
# Who has been assigned to each proposal?
94-
for p in proposals:
95-
print(f"{p}: {who_is_reviewing(p)}")
97+
# is it unbalanced?
98+
projects_count = [(k,len(v)) for k,v in projects.items()]
99+
# sorted list of reviewers, to assign projects to the ones with less number
100+
reviewers_count = sorted([(k, len(v)) for k,v in assignments.items()], key=lambda x: x[1])
101+
102+
for proj, proj_count in projects_count:
103+
if proj_count < reviews_per_proposal:
104+
print(f"Unbalanced found for {proj}")
105+
# try to assign it to someone
106+
for rev, rev_count in reviewers_count:
107+
if proj not in assignments[rev] and not has_conflict(rev, proj):
108+
assignments[rev].append(proj)
109+
print(f"{rev} has been assigned {proj}")
110+
break
96111

97-
# Which proposals was each person assigned?
98-
for r in assignments:
99-
print(r)
100-
print(" " + "\n ".join(assignments[r]))
112+
print([f"{r}: {len(assignments[r])}" for r in reviewers])
113+
114+
# # Who has been assigned to each proposal?
115+
# for p in proposals:
116+
# print(f"{p}: {who_is_reviewing(p)}")
117+
118+
# # Which proposals was each person assigned?
119+
# for r in assignments:
120+
# print(r)
121+
# # print(" " + "\n ".join(assignments[r]))
101122

102123
# Are there any conflicts? A 'False' value here means no conflicts.
103124
for p, rs in conflicts.items():
104-
print(f"{p}: {any(p in assignments[r] for r in rs)}")
125+
assert not any(p in assignments[r] for r in rs), f"CoI found for {p}"
126+
# print(f"{p}: {any(p in assignments[r] for r in rs)}")
105127

106128
payload = {
107129
"reviewers": reviewers,
@@ -110,5 +132,5 @@ def has_conflict(reviewer, proposal):
110132
"assignments": assignments,
111133
}
112134
# base64.b64encode(json.dumps(payload).encode("utf-8"))
113-
print(json.dumps(payload, indent=2))
135+
# print(json.dumps(payload, indent=2))
114136
return assignments

0 commit comments

Comments
 (0)