Skip to content

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

v1.8.0 - 2026-04-30

Compare with v1.7.0

Features

  • gale_shapley_traced with proposal stats and a pluggable proposer-selection rule in gale_shapley_algorithm.numeric.gs. Runs the same sequential M-W loop as gale_shapley but returns a GSStats (frozen dataclass with match, total proposals, and per-proposer proposals_per_proposer). Accepts a Selector callback that picks the next free proposer; included presets are lifo_selector (default, matches the historical free.pop() behavior), fifo_selector, and a random_selector(rng) factory backed by an np.random.Generator. The proposer-optimal matching and total proposal count are both invariant under selector choice (Knuth) for one-sided M-W; the hook is intended for callers driving the loop from a custom policy (RL agents, custom heuristics, randomized analyses).
  • Convenience wrappers men_optimal_traced and women_optimal_traced mirror the orientation conventions of men_optimal_gs / women_optimal_gs (women-optimal returns men-indexed match, women-indexed proposals_per_proposer; documented on the function).
  • gale_shapley is refactored to a thin wrapper over gale_shapley_traced (returns .match); behavior is identical.

Tests / CI

  • 13 new tests (140 total); 100% coverage on numeric/gs.py retained, total project coverage 98.47%. New parametrized test verifies the canonical n*(n+1)/2 worst-case proposal count for shared preferences (n in 2..8) — the pathological clustering case where every proposer has the same ranking.

Docs

  • docs/index.md and the numeric subpackage docstring document the traced API with a short example.

v1.7.0 - 2026-04-18

Compare with v1.6.0

Features

  • Rotation-based stable-matching-lattice enumeration (Gusfield-Irving 1989) in gale_shapley_algorithm.numeric.lattice. Scales comfortably past n=50; runtime is O(n**2 + |L| * n**2) where |L| is the number of stable matchings. enumerate_stable_matchings now defaults to method="rotation"; the previous vectorized brute-force is still available via method="brute" (useful as a correctness oracle).
  • Public rotation primitives exposed_rotations(men_rank, women_rank, matching) and apply_rotation(matching, rotation). Given a stable matching, exposed_rotations returns the currently-applicable rotations; apply_rotation takes one step down the lattice. These are the building blocks for any algorithm that navigates the lattice (search, incremental maintenance under preference changes, learned policies).
  • Cross-validated against brute force on random n=3..7 instances; full set equality in every case. New tests also confirm exposed_rotations is empty at the women-optimal matching, non-empty at the men-optimal when the lattice has more than one matching, and that applying any exposed rotation produces a stable matching different from the starting one.

Tests / CI

  • 18 tests pass (up from 13); 100% coverage on the numeric subpackage retained.
  • New scaling smoke test at n=20 (impossible for the brute-force method to reach — 20! = 2.4e18).

v1.6.0 - 2026-04-17

Compare with v1.5.7

Features

  • New numeric subpackage for numpy-backed primitives (gale_shapley_algorithm.numeric). Install the numeric extra (pip install "gale-shapley-algorithm[numeric]") to pull in numpy as a dependency. The core remains zero-dep.
    • numeric.gs.gale_shapley / men_optimal_gs / women_optimal_gs: fast numpy deferred acceptance on int16 rank matrices.
    • numeric.stability.is_stable / find_blocking_pairs / is_stable_batch: single-matching and vectorized stability checks. The batched variant filters all K candidate matchings in one tensor operation.
    • numeric.lattice.enumerate_stable_matchings: full stable-matching lattice enumeration via batched brute force. Default max_n=10; a rotation-based enumerator that scales past n=50 (Gusfield-Irving 1989) is documented as future work.
    • Cross-validated against the existing Algorithm/Proposer/Responder API on random instances; numeric subpackage at 100% test coverage.

Tests / CI

  • Install the numeric extra in the CI test job so numpy-backed tests run against a real numpy install on every supported matrix cell.

Docs

  • README + docs landing page now include a "Numerical / large-scale usage" section with a runnable snippet.
  • New examples/numeric_usage.py demonstrating rank-matrix GS, stability checks, and lattice enumeration.

v1.5.7 - 2026-04-07

Compare with v1.5.6

Bug Fixes

  • remove stale ty: ignore directive to fix CI (986230e by oedokumaci).

Build

  • bump vite (8a71517 by dependabot[bot]).

v1.5.6 - 2026-03-26

Compare with v1.5.5

Security

  • bump picomatch from 4.0.3 to 4.0.4 and from 2.3.1 to 2.3.2 to fix CVE-2026-33671 and CVE-2026-33672 (68dbb1b by dependabot[bot]).

v1.5.5 - 2026-03-25

Compare with v1.5.4

Security

  • bump express-rate-limit from 8.2.1 to 8.3.1 to fix IPv4-mapped IPv6 address bypass for per-client rate limiting (ee60527).
  • bump flatted from 3.3.3 to 3.4.2 to fix unbounded recursion DoS and prototype pollution in parse() (ee60527).

Bug Fixes

  • pass --venv to ty typecheck and suppress false positive (02afa1e by Claude).
  • bump express-rate-limit and flatted to fix high-severity vulnerabilities (a377af3 by Claude).

v1.5.4 - 2026-03-19

Compare with v1.5.3

Build

  • bump hono (020c880 by dependabot[bot]).

v1.5.3 - 2026-03-04

Compare with v1.5.2

Build

  • bump the npm_and_yarn group across 1 directory with 2 updates (4f0df8a by dependabot[bot]).

v1.5.2 - 2026-03-01

Compare with v1.5.1

Bug Fixes

  • add explicit permissions to CI workflow (27e1265 by oedokumaci).

v1.5.1 - 2026-03-01

Compare with v1.5.0

Bug Fixes

  • resolve 5 Dependabot security alerts in frontend dependencies (062d729 by oedokumaci).

v1.5.0 - 2026-02-23

Compare with v1.4.1

Features

  • show tentative matches in all animation stages (c56a355 by oedokumaci).
  • add docs and GitHub links to header (4765f78 by oedokumaci).

Bug Fixes

  • restore pointer cursor on interactive elements (682b948 by oedokumaci).
  • remove default Vite favicon causing 404 (2eada46 by oedokumaci).

v1.4.1 - 2026-02-20

Compare with v1.4.0

v1.4.0 - 2026-02-20

Compare with v1.3.2

Features

  • add Clear All button to GUI editor (closes #29) (cbb5834 by oedokumaci).

v1.3.2 - 2026-02-20

Compare with v1.3.1

Bug Fixes

  • show warning for duplicate names in GUI editor (closes #28) (8a16033 by oedokumaci).

v1.3.1 - 2026-02-20

Compare with v1.3.0

Bug Fixes

  • allow empty preference ranking in CLI (closes #27) (a8aec10 by oedokumaci).

v1.3.0 - 2026-02-20

Compare with v1.2.3

Features

  • run algorithm twice with --swap-sides (closes #26) (1572ea3 by oedokumaci).

v1.2.3 - 2026-02-20

Compare with v1.2.2

Build

  • bump hono (3b9e174 by dependabot[bot]).

v1.2.2 - 2026-02-20

Compare with v1.2.1

Bug Fixes

  • add explicit permissions to docker-publish workflow (537580e by oedokumaci).

Code Refactoring

  • rename gale-shapley to gale-shapley-algorithm everywhere (bbdb4d7 by oedokumaci).

v1.2.1 - 2026-02-18

Compare with v1.2.0

Bug Fixes

  • fix git-changelog config and release skill (2ff9f0d by oedokumaci).

v1.2.0 - 2026-02-18

Compare with v1.1.3

Features

  • replace YAML config with interactive terminal prompts (7d3d742 by oedokumaci).
  • add algorithm explainer, randomize button, and polish SVG layout (9f38fa6 by oedokumaci).
  • replace text-based animation with SVG visualization and celebrity defaults (2d74fd1 by oedokumaci).

Bug Fixes

  • fix Docker build and serve frontend from FastAPI (6741e1d by oedokumaci).

Code Refactoring

  • address PR review findings (39e2858 by oedokumaci).

v1.1.3 - 2026-02-18

Compare with v1.1.2

Bug Fixes

  • add missing shadcn/ui utility needed by frontend components (f444af3 by oedokumaci).

Code Refactoring

  • align import name with package name and modernize project infrastructure (4166c70 by oedokumaci).

v1.1.2 - 2026-02-18

Compare with v1.1.1

Build

  • rename PyPI package to gale-shapley-algorithm (1213c90 by oedokumaci).

v1.1.1 - 2026-02-18

Compare with v1.1.0

Bug Fixes

  • update hardcoded version test and resolve EncodingWarnings (44509fb by oedokumaci).

Build

  • modernize Dockerfile and add comprehensive .dockerignore (e0d598e by oedokumaci).

v1.1.0 - 2026-02-18

Compare with v1.0.0

Features

  • add FastAPI backend and React frontend for GUI (2e35e3a by oedokumaci).

Code Refactoring

  • convert to zero-dep library with tests and modern tooling (9888b86 by oedokumaci).

Build

  • migrate to dependency-groups and align tasks with template-repo (f0a9576 by oedokumaci).

v1.0.0 - 2024-12-29

Compare with first commit

Features

  • pass cli args and config to container (c5082b4 by oedokumaci).
  • add rich logging to std_out and refactor (5168a21 by oedokumaci).
  • add number_of_simulations arg to make run (f91375f by oedokumaci).
  • update dependencies (a06feeb by oedokumaci).
  • add override log user input (458f507 by oedokumaci).
  • add swap_sides cli option (d288608 by oedokumaci).
  • custom deterministic input (d742469 by oedokumaci).

Bug Fixes

  • workdir already changed (44ca259 by oedokumaci).
  • requirements (945b99c by oedokumaci).
  • avoid recursive calls (fd68e0f by oedokumaci).
  • fixes the wrong logging with custom input if number_of_side does not match with input side a warning is produced in that case logger does not log the true number of persons in that side (444ed37 by oedokumaci).

Code Refactoring

  • rename config_parser.py to config.py (87c1e29 by oedokumaci).
  • no need to str wrap also change timer decorator precision to .4f (86a6ec0 by oral.ersoy.dokumaci).
  • style prints (aa9c3ad by oedokumaci).
  • add !r (b0ed891 by oral.ersoy.dokumaci).

Build

  • bump pydantic from 1.10.8 to 1.10.13 in the pip group across 1 directory (#15) (d243318 by dependabot[bot]).