@@ -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