From c43744dd0042e73ac77b0316bee8ab3d958f7b0c Mon Sep 17 00:00:00 2001 From: Simon Rey Date: Thu, 7 Nov 2024 16:04:17 +0100 Subject: [PATCH] Emergency reviewers example --- easychair_extra/reviewassignment.py | 7 ++++++- examples/form_emergency_reviewers_pool.py | 13 ++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/easychair_extra/reviewassignment.py b/easychair_extra/reviewassignment.py index 5e6a498..7df20f9 100644 --- a/easychair_extra/reviewassignment.py +++ b/easychair_extra/reviewassignment.py @@ -203,9 +203,14 @@ def find_emergency_reviewers( for s, rev_vars in submissions_vars.items(): m += submissions_covered_vars[s] <= xsum(rev_vars.values()) + # If the submission is covered and the reviewer is used, then we have to assign them the sub + for r, sub_vars in reviewers_vars.items(): + for s, sub_var in sub_vars.items(): + m += sub_var >= submissions_covered_vars[s] + reviewers_used_vars[r] - 2 + m += xsum(reviewers_used_vars.values()) <= max_num_reviewers - objective = xsum(submissions_covered_vars.values()) + objective = xsum(submissions_covered_vars.values()) * len(submissions_vars) + xsum(xsum(v) for v in reviewers_vars.values()) m.objective = maximize(objective) m.verbose = verbose diff --git a/examples/form_emergency_reviewers_pool.py b/examples/form_emergency_reviewers_pool.py index 48e0745..958a3e9 100644 --- a/examples/form_emergency_reviewers_pool.py +++ b/examples/form_emergency_reviewers_pool.py @@ -14,25 +14,28 @@ def main(): os.path.join(root_dir, "committee.csv"), bids_file_path=os.path.join(root_dir, "bidding.csv"), ) - committee = committee.head(300) # Reduce size for performance reason + committee = committee.head(600) # Reduce size for performance reason # Read the submission file submissions = read_submission(os.path.join(root_dir, "submission.csv")) - submissions = submissions.head(150) # Reduce size for performance reason + submissions = submissions.head(200) # Reduce size for performance reason # Compute a bid profile bid_level_weights = {"yes": 1, "maybe": 0.5} bid_profile = committee_to_bid_profile(committee, submissions, bid_level_weights) + # Compute a set of emergency reviewers - max_num_emergency_revs = int(len(committee.index) * 0.2) + max_num_emergency_revs = int(len(committee.index) * 0.1) emergency_revs_assignment = find_emergency_reviewers( bid_profile, bid_level_weights, max_num_emergency_revs ) emergency_reviewers = sorted(emergency_revs_assignment) - num_submission_covered = sum(len(p) for p in emergency_revs_assignment.values()) + num_submission_covered = len(set(s for p in emergency_revs_assignment.values() for s in p)) + cum_submission_covered = sum(len(p) for p in emergency_revs_assignment.values()) print(f"These {len(emergency_reviewers)} reviewers can serve as emergency reviewers: " f"{emergency_reviewers}.") - print(f"This pool of emergency reviewers covers {num_submission_covered}.\n") + print(f"This pool of emergency reviewers covers {num_submission_covered} submissions " + f"out of {len(submissions.index)} (cumulative covering is {cum_submission_covered}).\n") # Check that a review assignment would still be possible without the emergency reviewers new_bid_profile = {