Small classroom market: a saved run
A saved example run
One run of the simulator, saved with its parameters and seed, so that everyone sees the same market: its key numbers, who got an interview and a match by applicant strength, its checks, downloads, stages, version stamps and parameters.
What to do here
- The tabs above lead to the population, the views before interviews, the applications, the match, and the lists of applicants and programs.
- Run this market yourself to change its parameters, or to draw it again with another seed; that needs a free account.
A saved run of the simulator: everyone who opens it sees this same market. Simulated from the assumptions in the parameters; not a prediction of any real applicant's or program's match.
About this example
The same model in a market small enough to follow by hand: 60 applicants and 8 programs. Open any applicant or program to see every application, interview invitation, interview and rank, and how the match came out.
What to look at
- Applicants: Follow one applicant from their applications to the match.
- Programs: See whom a program invited, how it ranked them and who filled its positions.
- Applications and interviews: Every application in one table, from the invitation to the match.
- Match: Which choice each applicant got, and who was left unmatched.
This is one run of the market, with seed 2026 and model 2.1. Another seed draws other applicants and programs, so the numbers differ from run to run: run the market yourself to see by how much, or to change its parameters. The run's files are kept with the project's source code.
Summary
- Market
- 60 × 8
- Applicants per position
- 1.200
- Match rate
- 83.3%
- Positions filled
- 100.0%
- Seed
- 2026
- Matched to first choice
- 18.0%
- Interviews per applicant
- 6.0
- Time
- 4 ms
- Saved
- 2026-10-06
- Applicants
- 60 (generated)
- Programs
- 8 with 50 positions (generated)
Checks passed The match is stable, within capacity and follows the rank order lists. See the match.
Which applicants get an interview and a match?
Every applicant counted once: whether they had at least one interview, and whether they matched. With Colour by strength on, each stage splits into five groups by strength percentile (fifths; applicants of equal strength stay in the same group), from the bottom 20% in red through the middle in grey to the top 20% in blue, and each drop-off shows which groups it holds, so the quality of the applicants can be followed through the stages. Each band's width is a number of applicants. Hover a stage or a band for its count and its share of all applicants (with the switch on, of its group) and to highlight its path; a band after the first stage also gives its share of the stage it leaves. No interview splits into never invited and invited without an interview. With the switch on, each drop-off's bar is split into the groups' colours in proportion, and the small bar beside its label shows the same mix from weaker to stronger; hover the drop-off for each group's count, its share of the drop-off and the share of the group it holds: a group that loses a larger share of its applicants does worse. Strength is the applicant's latent strength. The view all programs share is mostly strength, mixed with the applicant's attributes, and each program sees it only through its own noisy view. The funnel above counts applications instead: strong applicants hold many interviews but match only once.
Learn more in the helpOf 60 applicants, 60 had at least one interview and 50 matched (83.3%); 0 had no interview, 0 of them never invited. By strength, 50.0% of the bottom 20% matched, against 100.0% of the top 20%. The bottom 20% make up 6 of the 10 interviewed but not matched.
- Bottom 20%: 0–20
- 20th–40th percentile: 20–40
- 40th–60th percentile: 40–60
- 60th–80th percentile: 60–80
- Top 20%: 80–100
The numbers
| Who | Strength (z) | Applicants | Never invited | Invited, no interview | Interviewed | Interviewed, not matched | Matched | Share matched |
|---|---|---|---|---|---|---|---|---|
| Bottom 20% | -3.03 to -0.90 | 12 | 0 | 0 | 12 | 6 | 6 | 50.0% |
| 20th–40th percentile | -0.76 to -0.27 | 12 | 0 | 0 | 12 | 2 | 10 | 83.3% |
| 40th–60th percentile | -0.26 to 0.10 | 12 | 0 | 0 | 12 | 1 | 11 | 91.7% |
| 60th–80th percentile | 0.12 to 0.93 | 12 | 0 | 0 | 12 | 1 | 11 | 91.7% |
| Top 20% | 0.95 to 2.34 | 12 | 0 | 0 | 12 | 0 | 12 | 100.0% |
| All applicants | 60 | 0 | 0 | 60 | 10 | 50 | 83.3% |
Downloads
- Applicants (CSV) – uploads back unchanged
- Programs (CSV) – uploads back unchanged
- The match: every applicant's result (CSV)
- Every program's results (CSV)
- Every application, from signal to match (CSV)
- Every applicant–program pair (CSV)
- Diagnostics and versions (JSON)
- Parameters with the seed (JSON)
Model 2.1, engine 2.1.0, app 0.1.0, numpy 2.5.3, Python 3.14.2.
Stages
| Stage | Status | Time | Result |
|---|---|---|---|
| Population | Finished | 0 ms | 60 applicants, 50 positions, 8 programs |
| Pre-interview | Finished | 1 ms | 480 pairs |
| Applications | Finished | 0 ms | 461 applications |
| Signals | Finished | 0 ms | 0 signals |
| Invitations | Finished | 0 ms | 362 interviews, 388 invitations |
| Interviews | Finished | 0 ms | 362 interviews |
| Rank order lists | Finished | 0 ms | 362 applicant list entries, 329 program list entries |
| Match | Finished | 1 ms | 0 blocking pairs, 50 matched |
Checks
How this match was checked
| Check | Result |
|---|---|
| Blocking pairs: an applicant and a program that rank each other above their match | 0 |
| Programs matched to more applicants than they have positions | 0 |
| Matches that are not on both rank order lists | 0 |
| List entries without an interview | 0 |
| Rank order lists whose ranks are not exactly 1, 2, ..., k | 0 |
| Applicant list entries beyond rank 300 (the NRMP limit) | 0 |
| Both proposing sides match the same applicants and fill each program equally (rural hospitals) | not run |
| No applicant prefers the program-proposing result (applicant optimality) | not run |
The last two checks run when Compare both sides proposing is on in the match settings. The engine is also checked on hundreds of random markets against an independent solver (docs/VALIDATION.md).
Parameters of this run
Show the parameters
Run
- Random seed
- 2026
Market
- Applicants
- 60
- Applicants per position
- 1.2
- Programs
- 8
- Program sizes
- lognormal
- Mean positions per program
- 6.5
- Program size spread
- 0.8
Applicants
| Name | Share | Strength mean | Strength SD | Applications (mean) | Signals |
|---|---|---|---|---|---|
| us_md | 0.44 | 0.5 | 1.0 | None | None |
| us_do | 0.18 | 0.35 | 1.0 | None | None |
| us_img | 0.09 | -1.0 | 1.0 | None | None |
| non_us_img | 0.25 | -1.3 | 1.0 | None | None |
| other | 0.04 | -0.5 | 1.0 | None | None |
| Attribute | Correlation with strength | Average weight |
|---|---|---|
| board_scores | 0.8 | 0.5 |
| research | 0.5 | 0.3 |
| honors | 0.6 | 0.2 |
Programs
- Quality SD within tiers
- 1.0
| Attribute | Correlation with quality | Average weight |
|---|---|---|
| reputation | 0.9 | 0.5 |
| program_size | 0.0 | 0.2 |
| location | 0.0 | 0.3 |
Preferences
- Applicant agreement
- 0.6
- Program agreement
- 0.7
- Taste share of personal preferences
- 0.5
- Attribute share of the common view
- 0.3
- Weight concentration
- 10.0
Information
- Applicant pre-interview noise
- 0.5
- Program pre-interview noise
- 0.5
- Interview informativeness
- 0.6
- Interview fit shock
- 0.3
- Visibility effect
- 0.0
- Shared error (halo)
- 0.0
Applications
- Application count
- negbin
- Applications (mean)
- 30.0
- Application strategy
- portfolio
- Reach
- 0.25
- Target
- 0.5
- Safety
- 0.25
- Self-assessment error
- 0.5
- Application dispersion
- 0.5
- Target band
- 0.15
Signals
- Signal allocation
- realistic
- Programs using signals
- 1.0
- Signals affect rank lists
- False
Invitations
- Interviews per position
- 10.0
- Invitation strategy
- top_score
- Invitation rounds
- 3
- Screening attribute
- blank
- Screening minimum percentile
- 0.0
- Yield protection
- 0.0
Interviews
- Interviews per applicant (max)
- 12
- Acceptance order
- first_come
Rank order lists
- Applicant rank lists
- all_interviewed
- Applicant list length
- 20
- Program rank lists
- dnr_quantile
- Do-not-rank share
- 0.1
- Reservation utility
- -1.0
Match
- Algorithm
- applicant_proposing
- Compare both sides proposing
- False
Parameter hash 9a7b1c371c61b594274b5061dd73493be543e10452f0099c84af532ad191752c; population digest 79557f0ec40e6645eb6a48fed628defbc01cda8482418f449122fdc5f18fcfc3.