A Python implementation of the celebrated Gale-Shapley Algorithm.
Project description
gale-shapley-algorithm
A Python implementation of the celebrated Gale-Shapley (a.k.a. the Deferred Acceptance) Algorithm.
Time complexity is O(n^2), space complexity is O(n).
GUI with Docker
The easiest way to try the algorithm is with the interactive web GUI:
docker pull oedokumaci/gale-shapley-algorithm
docker run --rm -p 8000:8000 oedokumaci/gale-shapley-algorithm
Then open http://localhost:8000 in your browser.
Or build locally for development:
docker build -t gale-shapley-algorithm .
docker run --rm -p 8000:8000 gale-shapley-algorithm
The GUI lets you:
- Add and remove people on each side (proposers and responders)
- Set preferences by drag-and-drop reordering
- Randomize all preferences with one click
- Run the matching and see results in a table with stability info
- Animate step-by-step to watch proposals, rejections, and tentative matches unfold round by round in an SVG visualization
- Upload images for each person to personalize the visualization
- Toggle dark/light mode
Installation
pip install gale-shapley-algorithm
With CLI support:
pip install "gale-shapley-algorithm[cli]"
Quick Start
As a Library
import gale_shapley_algorithm as gsa
result = gsa.create_matching(
proposer_preferences={
"alice": ["bob", "charlie"],
"dave": ["charlie", "bob"],
},
responder_preferences={
"bob": ["alice", "dave"],
"charlie": ["dave", "alice"],
},
)
print(result.matches) # {'alice': 'bob', 'dave': 'charlie'}
As a CLI
The CLI uses interactive prompts -- no config files needed:
# Interactive mode: enter names and rank preferences
uvx --from "gale-shapley-algorithm[cli]" python -m gale_shapley_algorithm
# Random mode: auto-generate names and preferences
uvx --from "gale-shapley-algorithm[cli]" python -m gale_shapley_algorithm --random
# Swap proposers and responders
uvx --from "gale-shapley-algorithm[cli]" python -m gale_shapley_algorithm --swap-sides
Interactive mode example:
$ python -m gale_shapley_algorithm
Gale-Shapley Algorithm
Enter proposer side name [Proposers]: Men
Enter responder side name [Responders]: Women
Enter names for Men (comma-separated): Will, Hampton
Enter names for Women (comma-separated): April, Summer
Ranking preferences for Men...
Available for Will:
1. April
2. Summer
Enter ranking for Will (e.g. 1,2): 1,2
-> Will: April > Summer
Available for Hampton:
1. April
2. Summer
Enter ranking for Hampton (e.g. 1,2): 2,1
-> Hampton: Summer > April
Ranking preferences for Women...
...
┌──────── Matching Result ────────┐
│ Men │ Women │
├─────────┼───────────────────────┤
│ Will │ April │
│ Hampton │ Summer │
└─────────┴───────────────────────┘
Completed in 1 round. Stable: Yes
Random mode example:
$ python -m gale_shapley_algorithm --random
Gale-Shapley Algorithm
Enter proposer side name [Proposers]: Cats
Enter responder side name [Responders]: Dogs
Number of Cats [3]: 3
Number of Dogs [3]: 3
... (random preferences generated and displayed) ...
Completed in 2 rounds. Stable: Yes
Development
This project is managed with uv and uses taskipy for task running.
git clone https://github.com/oedokumaci/gale-shapley-algorithm
cd gale-shapley-algorithm
uvx --from taskipy task setup # Install dependencies
uvx --from taskipy task run # Run the application
uvx --from taskipy task fix # Auto-format + lint fix
uvx --from taskipy task ci # Run all CI checks
uvx --from taskipy task test # Run tests
uvx --from taskipy task docs # Serve docs locally
Install pre-commit hooks:
uv run pre-commit install
Documentation
Full documentation is available at oedokumaci.github.io/gale-shapley-algorithm.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gale_shapley_algorithm-1.5.3.tar.gz.
File metadata
- Download URL: gale_shapley_algorithm-1.5.3.tar.gz
- Upload date:
- Size: 458.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e8ab5982d22f8a7689222f1ae8e9b042fbadb8faec8ea279a05a974afc51b05
|
|
| MD5 |
261d882cc8c106b319b187c6740b10bc
|
|
| BLAKE2b-256 |
8f2c6190966fb8337286b14404bc22e6997da3b8ff57fc21928c653d98d5dc51
|
File details
Details for the file gale_shapley_algorithm-1.5.3-py3-none-any.whl.
File metadata
- Download URL: gale_shapley_algorithm-1.5.3-py3-none-any.whl
- Upload date:
- Size: 19.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fef96ed09f64f4a0c3a1aa7a246741ac61fd41eb7a68c50c682db5686b353d50
|
|
| MD5 |
e08b1ee74bddcf7ce8a01c4d2e8e1118
|
|
| BLAKE2b-256 |
a3e974f3b907eeb2f5121c832290764934b2796671200f7b27bdcffb320e0a35
|