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¶
Features¶
gale_shapley_tracedwith proposal stats and a pluggable proposer-selection rule ingale_shapley_algorithm.numeric.gs. Runs the same sequential M-W loop asgale_shapleybut returns aGSStats(frozen dataclass withmatch, totalproposals, and per-proposerproposals_per_proposer). Accepts aSelectorcallback that picks the next free proposer; included presets arelifo_selector(default, matches the historicalfree.pop()behavior),fifo_selector, and arandom_selector(rng)factory backed by annp.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_tracedandwomen_optimal_tracedmirror the orientation conventions ofmen_optimal_gs/women_optimal_gs(women-optimal returns men-indexedmatch, women-indexedproposals_per_proposer; documented on the function). gale_shapleyis refactored to a thin wrapper overgale_shapley_traced(returns.match); behavior is identical.
Tests / CI¶
- 13 new tests (140 total); 100% coverage on
numeric/gs.pyretained, total project coverage 98.47%. New parametrized test verifies the canonicaln*(n+1)/2worst-case proposal count for shared preferences (n in 2..8) — the pathological clustering case where every proposer has the same ranking.
Docs¶
docs/index.mdand thenumericsubpackage docstring document the traced API with a short example.
v1.7.0 - 2026-04-18¶
Features¶
- Rotation-based stable-matching-lattice enumeration (Gusfield-Irving 1989) in
gale_shapley_algorithm.numeric.lattice. Scales comfortably pastn=50; runtime isO(n**2 + |L| * n**2)where|L|is the number of stable matchings.enumerate_stable_matchingsnow defaults tomethod="rotation"; the previous vectorized brute-force is still available viamethod="brute"(useful as a correctness oracle). - Public rotation primitives
exposed_rotations(men_rank, women_rank, matching)andapply_rotation(matching, rotation). Given a stable matching,exposed_rotationsreturns the currently-applicable rotations;apply_rotationtakes 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..7instances; full set equality in every case. New tests also confirmexposed_rotationsis 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
numericsubpackage 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¶
Features¶
- New
numericsubpackage for numpy-backed primitives (gale_shapley_algorithm.numeric). Install thenumericextra (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. Defaultmax_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/ResponderAPI on random instances; numeric subpackage at 100% test coverage.
Tests / CI¶
- Install the
numericextra 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.pydemonstrating rank-matrix GS, stability checks, and lattice enumeration.
v1.5.7 - 2026-04-07¶
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¶
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¶
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¶
Build¶
- bump hono (020c880 by dependabot[bot]).
v1.5.3 - 2026-03-04¶
Build¶
- bump the npm_and_yarn group across 1 directory with 2 updates (4f0df8a by dependabot[bot]).
v1.5.2 - 2026-03-01¶
Bug Fixes¶
- add explicit permissions to CI workflow (27e1265 by oedokumaci).
v1.5.1 - 2026-03-01¶
Bug Fixes¶
- resolve 5 Dependabot security alerts in frontend dependencies (062d729 by oedokumaci).
v1.5.0 - 2026-02-23¶
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¶
v1.4.0 - 2026-02-20¶
Features¶
- add Clear All button to GUI editor (closes #29) (cbb5834 by oedokumaci).
v1.3.2 - 2026-02-20¶
Bug Fixes¶
- show warning for duplicate names in GUI editor (closes #28) (8a16033 by oedokumaci).
v1.3.1 - 2026-02-20¶
Bug Fixes¶
- allow empty preference ranking in CLI (closes #27) (a8aec10 by oedokumaci).
v1.3.0 - 2026-02-20¶
Features¶
- run algorithm twice with --swap-sides (closes #26) (1572ea3 by oedokumaci).
v1.2.3 - 2026-02-20¶
Build¶
- bump hono (3b9e174 by dependabot[bot]).
v1.2.2 - 2026-02-20¶
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¶
Bug Fixes¶
- fix git-changelog config and release skill (2ff9f0d by oedokumaci).
v1.2.0 - 2026-02-18¶
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¶
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¶
Build¶
- rename PyPI package to gale-shapley-algorithm (1213c90 by oedokumaci).
v1.1.1 - 2026-02-18¶
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¶
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¶
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]).