Skip to main content

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).

CI Docs Docker PyPI Python Ruff uv License: MIT

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]"

With numpy-backed primitives for large-scale / numerical work (adds numpy >= 2.0):

pip install "gale-shapley-algorithm[numeric]"

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'}

Numerical / large-scale usage

For high-throughput work (many random instances, enumerating the stable-matching lattice, using the output as input to downstream ML/RL pipelines), the numeric subpackage provides numpy-array APIs:

import numpy as np
from gale_shapley_algorithm.numeric import (
    gale_shapley, men_optimal_gs, women_optimal_gs,
    is_stable, find_blocking_pairs, enumerate_stable_matchings,
)

# Rank matrices: men_rank[i, j] is woman j's 1-indexed position on man i's list.
men_rank   = np.array([[1, 2, 3], [3, 1, 2], [2, 3, 1]], dtype=np.int16)
women_rank = np.array([[3, 1, 2], [1, 3, 2], [2, 1, 3]], dtype=np.int16)

mo = men_optimal_gs(men_rank, women_rank)    # match[m] = w
wo = women_optimal_gs(men_rank, women_rank)
lattice = enumerate_stable_matchings(men_rank, women_rank)  # (|L|, n) int16 array

See examples/numeric_usage.py for a more complete walk-through. The lattice enumerator handles up to n=10 via batched brute force; a rotation-based enumerator that scales past n=50 is documented as future work.

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

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gale_shapley_algorithm-1.6.0.tar.gz (472.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gale_shapley_algorithm-1.6.0-py3-none-any.whl (25.7 kB view details)

Uploaded Python 3

File details

Details for the file gale_shapley_algorithm-1.6.0.tar.gz.

File metadata

  • Download URL: gale_shapley_algorithm-1.6.0.tar.gz
  • Upload date:
  • Size: 472.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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

Hashes for gale_shapley_algorithm-1.6.0.tar.gz
Algorithm Hash digest
SHA256 b031d8f342304fd4e8b38f0ecc0ca36b80b6b3c1f0a0c0271a837a0e356fc124
MD5 feec74e9d109b005f7695939332f8087
BLAKE2b-256 5bb77523ed8690295df9970bc6997b02dbf59002c618ff98b10a2ed8b47c6cd3

See more details on using hashes here.

File details

Details for the file gale_shapley_algorithm-1.6.0-py3-none-any.whl.

File metadata

  • Download URL: gale_shapley_algorithm-1.6.0-py3-none-any.whl
  • Upload date:
  • Size: 25.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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

Hashes for gale_shapley_algorithm-1.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2293625bf9cf40358b443855e080b0efefd6e6b8dd2ee3c2e7ea4c1fb1cd0023
MD5 a66fd4e17691852b2e82f619a01e9016
BLAKE2b-256 cd9a2845e4149193907bb4134c791cd05d9873a5c8e53770784c779be3b387b2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page