Reviewer-Proposal Matching System
The Waldur proposal module includes an automated reviewer-proposal matching system that computes expertise affinity scores and generates optimal reviewer assignments. This ensures qualified reviewers are matched with proposals in their area of expertise.
Architecture Overview
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 | |
Affinity Scoring Methods
The system computes affinity scores between reviewers and proposals using configurable methods.
Keyword-Based Scoring
Matches reviewer expertise keywords against proposal text content.
How it works:
- Extracts reviewer's expertise keywords with proficiency weights
- Searches proposal text (title, summary, description) for keyword matches
- Calculates weighted match score
Proficiency weights:
| Proficiency Level | Weight |
|---|---|
| Expert | 1.0 |
| Familiar | 0.7 |
| Basic | 0.3 |
1 2 3 4 5 6 7 8 9 10 | |
TF-IDF Text Similarity
Computes semantic similarity between reviewer expertise and proposal content using Term Frequency-Inverse Document Frequency (TF-IDF) vectors.
Reviewer text sources:
- Expertise keywords (weighted by proficiency)
- Recent publication titles and abstracts (last 5 years)
- Biography text
Proposal text sources:
- Proposal name/title
- Project summary
- Project description
Algorithm:
- Tokenize text (lowercase, remove stopwords)
- Compute TF-IDF vectors for reviewer and proposal
- Calculate cosine similarity between vectors
1 2 3 4 5 6 | |
Combined Method
Default method that combines keyword and text-based scoring with configurable weights.
1 2 3 4 5 | |
Matching Configuration
Each call can have its own matching configuration via MatchingConfiguration:
| Field | Type | Default | Description |
|---|---|---|---|
affinity_method |
choice | combined |
Scoring method: keyword, tfidf, or combined |
keyword_weight |
float | 0.4 | Weight for keyword scoring (0-1) |
text_weight |
float | 0.6 | Weight for TF-IDF scoring (0-1) |
min_reviewers_per_proposal |
int | 3 | Minimum reviewers per proposal |
max_reviewers_per_proposal |
int | 5 | Maximum reviewers per proposal |
min_proposals_per_reviewer |
int | 3 | Minimum proposals per reviewer |
max_proposals_per_reviewer |
int | 10 | Maximum proposals per reviewer |
algorithm |
choice | minmax |
Assignment algorithm |
min_affinity_threshold |
float | 0.1 | Minimum affinity for suggestions |
use_reviewer_bids |
bool | true | Consider reviewer preferences |
bid_weight |
float | 0.3 | Weight for reviewer bids |
Validation: keyword_weight + text_weight must equal 1.0
Assignment Algorithms
Three algorithms are available for computing optimal reviewer-proposal assignments:
MinMax (Balanced Load)
Balances reviewer workload while maximizing total affinity.
Characteristics:
- Prioritizes even distribution of reviews
- Good for calls with many proposals and limited reviewers
- Prevents reviewer overload
FairFlow (Quality Threshold)
Ensures minimum quality threshold for all assignments.
Characteristics:
- Only assigns pairs above
min_affinity_threshold - Better match quality at cost of some assignments
- Useful for specialized domains
Hungarian (Global Optimum)
Finds globally optimal assignment maximizing total affinity.
Characteristics:
- Optimal solution for the assignment problem
- May result in uneven workload distribution
- Best for small to medium-sized calls
Reviewer Bids
Reviewers can express preferences for reviewing specific proposals:
| Bid Value | Weight | Description |
|---|---|---|
eager |
+1.0 | Reviewer wants to review this proposal |
willing |
+0.5 | Reviewer is willing to review |
not_willing |
-0.5 | Reviewer prefers not to review |
conflict |
-1.0 | Reviewer has conflict of interest |
When use_reviewer_bids is enabled, bid weights are incorporated into the final affinity score:
1 | |
Reviewer Discovery Workflow
The system supports two paths for finding reviewers:
Path A: Algorithm-Based Discovery
For reviewers with published profiles:
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 | |
Path B: Direct Email Invitation
For reviewers without existing profiles:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Reviewer Profile Visibility
Reviewer profiles have visibility controls:
| Field | Default | Description |
|---|---|---|
is_published |
false | Profile discoverable by algorithm |
available_for_reviews |
true | Currently accepting review requests |
published_at |
null | When profile was published |
Visibility rules:
- Own profile: Always visible to the profile owner
- Pool members: Managers see ACCEPTED pool members only
- Suggestions: Managers see full profile in suggestion list
- Discovery: Algorithm only considers published + available profiles
Suggestion Status Workflow
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
API Endpoints
Affinity Computation
1 | |
Computes affinity scores for all reviewer-proposal pairs in the call.
Response:
1 2 3 4 5 | |
Get Affinity Matrix
1 | |
Returns the complete affinity matrix for visualization.
Response:
1 2 3 4 5 6 7 8 9 10 11 | |
Generate Suggestions
1 | |
Runs affinity algorithm on all published profiles to generate reviewer suggestions.
Response:
1 2 3 4 5 | |
View Suggestions
1 | |
Lists all suggestions for a call with affinity scores.
Filter parameters:
status: Filter by status (pending,confirmed,rejected,invited)min_affinity_score: Minimum affinity score (0-1)reviewer_uuid: Filter by specific reviewer
Manage Suggestions
1 2 | |
Manager confirms or rejects suggestions. Rejection requires a reason.
Send Invitations
1 | |
Sends invitations to all confirmed suggestions.
Invite by Email
1 | |
Invites a reviewer by email address (profile not required initially).
Request:
1 2 3 4 5 | |
View Invitation Details
1 | |
Returns invitation details for reviewers to review before accepting.
Response:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Accept Invitation
1 | |
Accepts an invitation with optional COI self-declaration.
Request:
1 2 3 4 5 6 7 8 9 10 | |
Notes:
declared_conflictsis optional- Creates
ConflictOfInterestrecords withdetection_method='self_disclosed' - Acceptance NOT blocked by declared conflicts (manager handles via COI workflow)
- For email invitations, requires published profile first
Decline Invitation
1 | |
Declines a reviewer invitation.
Request:
1 2 3 | |
Manage Reviewer Bids
1 2 3 | |
Manage reviewer preferences for proposals.
Data Models
ReviewerProposalAffinity
Cached affinity scores between reviewers and proposals.
| Field | Type | Description |
|---|---|---|
call |
FK | Call for this affinity |
reviewer |
FK | Reviewer profile |
proposal |
FK | Proposal |
affinity_score |
float | Combined score (0-1) |
keyword_score |
float | Keyword-based score |
text_score |
float | TF-IDF score |
ReviewerSuggestion
Algorithm-generated reviewer suggestions.
| Field | Type | Description |
|---|---|---|
call |
FK | Call for suggestion |
reviewer |
FK | Suggested reviewer profile |
affinity_score |
float | Combined score (0-1) |
keyword_score |
float | Keyword match score |
text_score |
float | Text similarity score |
status |
choice | pending/confirmed/rejected/invited |
reviewed_by |
FK | Manager who reviewed |
reviewed_at |
datetime | When reviewed |
rejection_reason |
text | Reason for rejection |
ProposedAssignment
Final reviewer assignments from matching algorithm.
| Field | Type | Description |
|---|---|---|
call |
FK | Call for assignment |
reviewer |
FK | Assigned reviewer |
proposal |
FK | Assigned proposal |
affinity_score |
float | Score at assignment time |
algorithm_used |
choice | minmax/fairflow/hungarian |
rank |
int | Assignment priority (1=best) |
is_deployed |
bool | Assignment finalized |
deployed_at |
datetime | When deployed |
deployed_by |
FK | Who deployed |
ReviewerBid
Reviewer preferences for proposals.
| Field | Type | Description |
|---|---|---|
call |
FK | Call |
reviewer |
FK | Reviewer profile |
proposal |
FK | Proposal |
bid |
choice | eager/willing/not_willing/conflict |
comment |
text | Optional explanation |
Integration with COI Detection
The matching system integrates with Conflict of Interest Detection:
- Before computing suggestions, COI status is checked
- Reviewers with confirmed COIs are excluded from matching
- Self-disclosed conflicts (via bids) affect affinity scores
- Waived conflicts may still be assigned with oversight
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Performance Considerations
Affinity Computation
- Computation is O(reviewers × proposals)
- Results cached in
ReviewerProposalAffinitytable - Recompute when profiles or proposals change significantly
Corpus IDF
- TF-IDF uses corpus-wide IDF for better term weighting
- Corpus includes all reviewer texts and proposal texts
- Computed once per call, reused for all pairs
Large Calls
- For calls with 100+ proposals and 50+ reviewers:
- Use batch processing
- Consider incremental updates
- Monitor computation time
Related Documentation
- Proposals Overview - Complete proposal module documentation
- Conflict of Interest Detection - COI detection and management
- Review System - Review assignment and scoring