Skip to content

Commit b0ab55c

Browse files
Merge branch 'master' into fix/658
2 parents 736738c + a63fdab commit b0ab55c

File tree

282 files changed

+7482
-3530
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

282 files changed

+7482
-3530
lines changed

.github/pull_request_template.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
_Thanks for contributing to Gambit! Before you submitting or reviewing a pull request, check out our [guidelines for contributing](https://gambitproject.readthedocs.io/en/latest/developer.contributing.html)._
2+
3+
_The person submitting the PR should ensure it has an informative title and update the headers below, before marking the PR as ready for review and assigning reviewers._
4+
5+
### Issues closed by this PR
6+
7+
_Add any issues that are being closed by this PR to the list. Use "Closes" or [another keyword](https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) followed by the issue number._
8+
9+
- Closes #ISSUE_NUMBER
10+
11+
### Description of the changes in this PR
12+
13+
_Update the description of the changes made in this PR. You can delete this section if the changes are already fully described in the linked issues._
14+
15+
This PR ...
16+
17+
### How to review this PR
18+
19+
_The gambit repository contains source code and documentation for several different components. Explain how a reviewer should approach reviewing the specific changes made in this PR._
20+
21+
_For example, you might include instructions like:_
22+
- _"Review code changes and ensure tests cover edge cases"_
23+
- _"Rebuild the GUI from this branch, then test features X, Y, Z work as expected"_
24+
- _"Click the link to the documentation page and sense check by reading"_

.github/workflows/lint.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
name: clang-format
1010
runs-on: ubuntu-latest
1111
steps:
12-
- uses: actions/checkout@v5
12+
- uses: actions/checkout@v6
1313
- name: Run clang-format style check for C/C++
1414
uses: jidicula/clang-format-action@v4.16.0
1515
with:
@@ -21,7 +21,7 @@ jobs:
2121
runs-on: ubuntu-latest
2222
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
2323
steps:
24-
- uses: actions/checkout@v5
24+
- uses: actions/checkout@v6
2525
- name: Install dependencies
2626
run: |
2727
sudo apt-key adv --fetch-keys http://repos.codelite.org/CodeLite.asc
@@ -37,14 +37,14 @@ jobs:
3737
runs-on: ubuntu-latest
3838
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
3939
steps:
40-
- uses: actions/checkout@v5
40+
- uses: actions/checkout@v6
4141
- uses: chartboost/ruff-action@v1
4242

4343
flake8:
4444
runs-on: ubuntu-latest
4545
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
4646
steps:
47-
- uses: actions/checkout@v5
47+
- uses: actions/checkout@v6
4848
- uses: actions/setup-python@v6
4949
with:
5050
python-version: "3.14"
@@ -54,7 +54,7 @@ jobs:
5454
runs-on: ubuntu-latest
5555
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
5656
steps:
57-
- uses: actions/checkout@v5
57+
- uses: actions/checkout@v6
5858
- name: Setup Python
5959
uses: actions/setup-python@v6
6060
with:

.github/workflows/osxbinary.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
runs-on: macos-14
1313
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
1414
steps:
15-
- uses: actions/checkout@v5
15+
- uses: actions/checkout@v6
1616
- name: Install dependencies
1717
run: |
1818
brew install automake autoconf
@@ -31,7 +31,7 @@ jobs:
3131
- run: make
3232
- run: sudo make install
3333
- run: make osx-dmg
34-
- uses: actions/upload-artifact@v5
34+
- uses: actions/upload-artifact@v6
3535
with:
3636
name: artifact-osx-14
3737
path: "*.dmg"

.github/workflows/python.yml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
python-version: ['3.10', '3.14']
1414

1515
steps:
16-
- uses: actions/checkout@v5
16+
- uses: actions/checkout@v6
1717
- name: Set up Python ${{ matrix.python-version }}
1818
uses: actions/setup-python@v6
1919
with:
@@ -34,15 +34,15 @@ jobs:
3434
- name: Run tests
3535
run: pytest --run-tutorials
3636

37-
macos-13:
37+
macos-14:
3838
runs-on: macos-14
3939
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
4040
strategy:
4141
matrix:
4242
python-version: ['3.14']
4343

4444
steps:
45-
- uses: actions/checkout@v4
45+
- uses: actions/checkout@v6
4646
- name: Set up Python ${{ matrix.python-version }}
4747
uses: actions/setup-python@v6
4848
with:
@@ -52,21 +52,22 @@ jobs:
5252
python -m pip install --upgrade pip
5353
pip install setuptools build cython wheel
5454
pip install -r tests/requirements.txt
55+
pip install -r doc/requirements.txt
5556
- name: Build extension
5657
run: |
5758
python -m pip install -v .
5859
- name: Run tests
59-
run: pytest
60+
run: pytest --run-tutorials
6061

61-
macos-14:
62+
macos-15:
6263
runs-on: macos-15
6364
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
6465
strategy:
6566
matrix:
6667
python-version: ['3.14']
6768

6869
steps:
69-
- uses: actions/checkout@v4
70+
- uses: actions/checkout@v6
7071
- name: Set up Python ${{ matrix.python-version }}
7172
uses: actions/setup-python@v6
7273
with:
@@ -91,7 +92,7 @@ jobs:
9192
python-version: ['3.14']
9293

9394
steps:
94-
- uses: actions/checkout@v5
95+
- uses: actions/checkout@v6
9596
- name: Set up Python ${{ matrix.python-version }}
9697
uses: actions/setup-python@v6
9798
with:

.github/workflows/tools.yml

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
runs-on: ubuntu-latest
1010
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
1111
steps:
12-
- uses: actions/checkout@v5
12+
- uses: actions/checkout@v6
1313
- name: Install dependencies
1414
run: |
1515
sudo apt-key adv --fetch-keys http://repos.codelite.org/CodeLite.asc
@@ -33,42 +33,17 @@ jobs:
3333
sudo make install
3434
3535
macos:
36-
runs-on: macos-14
37-
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
38-
steps:
39-
- uses: actions/checkout@v5
40-
- name: Install dependencies
41-
run: brew install automake autoconf wxwidgets
42-
- run: aclocal
43-
- run: automake --add-missing
44-
- run: autoconf
45-
- run: ./configure
46-
- run: make
47-
- run: sudo make install
48-
- run: make osx-dmg
49-
- uses: actions/upload-artifact@v5
50-
with:
51-
name: artifact-osx-14
52-
path: "*.dmg"
53-
54-
macos-14:
5536
runs-on: macos-15
5637
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
5738
steps:
58-
- uses: actions/checkout@v5
39+
- uses: actions/checkout@v6
5940
- name: Install dependencies
6041
run: brew install automake autoconf wxwidgets
6142
- run: aclocal
6243
- run: automake --add-missing
6344
- run: autoconf
6445
- run: ./configure
6546
- run: make
66-
- run: sudo make install
67-
- run: make osx-dmg
68-
- uses: actions/upload-artifact@v5
69-
with:
70-
name: artifact-osx-15
71-
path: "*.dmg"
7247

7348
windows:
7449
runs-on: windows-latest
@@ -77,7 +52,7 @@ jobs:
7752
run:
7853
shell: msys2 {0}
7954
steps:
80-
- uses: actions/checkout@v5
55+
- uses: actions/checkout@v6
8156
- uses: msys2/setup-msys2@v2
8257
with:
8358
install: mingw-w64-x86_64-toolchain make automake autoconf
@@ -93,7 +68,7 @@ jobs:
9368
cp gambit* installer
9469
"${WIX}bin/candle" build_support/msw/gambit.wxs
9570
"${WIX}bin/light" -ext WixUIExtension gambit.wixobj
96-
- uses: actions/upload-artifact@v5
71+
- uses: actions/upload-artifact@v6
9772
with:
9873
name: artifact-msw
9974
path: "*.msi"

.github/workflows/wheels.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
runs-on: windows-latest
1414

1515
steps:
16-
- uses: actions/checkout@v5
16+
- uses: actions/checkout@v6
1717
- name: Set up Python
1818
uses: actions/setup-python@v6
1919
with:
@@ -27,6 +27,6 @@ jobs:
2727
python -m cibuildwheel --output-dir wheelhouse/
2828
env:
2929
CIBW_SKIP: "pp*"
30-
- uses: actions/upload-artifact@v5
30+
- uses: actions/upload-artifact@v6
3131
with:
3232
path: ./wheelhouse/*.whl

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,8 @@ Gambit.app/*
4343
*.so
4444
doc/tutorials/games/*.nfg
4545
doc/tutorials/games/*.efg
46+
doc/tutorials/*.png
4647
*.dmg
4748
Gambit.app/*
49+
*.ipynb_checkpoints
50+
*.ef

.readthedocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ build:
1212
apt_packages:
1313
- libgmp-dev
1414
- pandoc
15+
- texlive-full
1516

1617
python:
1718
install:

ChangeLog

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,53 @@
11
# Changelog
22

3-
## [16.5.0] - unreleased
3+
## [16.5.0] - 2026-01-05
44

5-
### Changed
6-
- In the graphical interface, removed option to configure information set link drawing; information sets
7-
are always drawn and indicators are always drawn if an information set spans multiple levels.
8-
- In `pygambit`, indexing the children of a node by a string inteprets the string as an action label,
9-
not a label of a child node. In addition, indexing by an action object is now supported. (#587)
10-
- In `pygambit`, `min_payoff` and `max_payoff` (for both games and players) now refers to payoffs in
11-
any play of the game; previously this referred only to the set of outcomes. (#498)
5+
### Fixed
6+
- Sequence-form based equilibrium-finding methods returned incorrect output on games with
7+
outcomes at non-terminal nodes. (#654)
128

139
### Added
14-
- Tests for EFG Nash solvers -- `enumpoly_solve`, `lp_solve`, `lcp_solve` -- in behavior stratgegies
10+
- Implement `IsAbsentMinded()` on information sets (C++) and `Infoset.is_absent_minded` (Python)
11+
to detect if an information is absent-minded.
12+
- Tests for EFG Nash solvers -- `enumpoly_solve`, `lp_solve`, `lcp_solve` -- in behavior strategies
1513
- In `pygambit`, `Node` objects now have a read-only property `own_prior_action` and `Infoset` objects
1614
have a read-only property `own_prior_actions` to retrieve the last action or the set of last actions
1715
taken by the player before reaching the node or information set, respectively. (#582)
1816
- In `pygambit`, `Node` objects now have a read-only property `is_strategy_reachable` to determine
1917
if the node is reachable by at least one pure strategy profile. This proves useful for identifying
2018
unreachable parts of the game tree in games with absent-mindedness. (#629)
2119

20+
### Changed
21+
- Labels for players, outcomes, strategies, and actions are expected to be non-empty and unique within
22+
the relevant scope (games for players and outcomes, players for strategies, and information sets for
23+
actions). `pygambit` now issues a `FutureWarning` if a label is changed that does not conform to these
24+
expectations. There is now an optional flag `normalize_labels` to `read_*` which will automatically
25+
fill in non-confirming sets of labels. In version 16.6 these will be enforced; invalid label sets will
26+
generate an error and files will be normalized automatically on read. (#614)
27+
- Terminology for agent-form calculations on extensive games has been clarified. Mixed behavior profiles
28+
distinguish "agent" regret and liap values from their strategy-based analogs. Methods which compute
29+
using the agent-form - specifically `enumpure_solve` and `liap_solve`, now clarify this by being named
30+
differently in `pygambit`. (#617)
31+
- For clarity, the `stop_after` and `max_depth` arguments to `lcp_solve` are no longer permitted when solving using
32+
the sequence form. These actually had no effect in previous versions. (#671)
33+
- In the graphical interface, removed option to configure information set link drawing; information sets
34+
are always drawn and indicators are always drawn if an information set spans multiple levels.
35+
- In `pygambit`, indexing the children of a node by a string inteprets the string as an action label,
36+
not a label of a child node. In addition, indexing by an action object is now supported. (#587)
37+
- In `pygambit`, `min_payoff` and `max_payoff` (for both games and players) now refers to payoffs in
38+
any play of the game; previously this referred only to the set of outcomes. (#498)
39+
- In `pygambit`, calls to `sort_infosets` are no longer required to normalise the game representation.
40+
Iteration ordering of information sets and their members is ensured internally. `sort_infosets`
41+
is therefore now a no-op and is deprecated; it will be removed in a future version.
42+
2243
### Removed
2344
- Eliminating dominated actions has been removed from the GUI as it was implementing a non-standard
2445
formulation of dominance. (#612)
2546
- The C++ method for computing subgame perfect equilibria with selected methods has been removed
2647
(and as a result from the `enumpure`, `lp`, and `lcp` command-line tools); this will be replaced
2748
with new and more customisable approaches. (#639)
2849

29-
## [16.4.1] - unreleased
50+
## [16.4.1] - 2025-12-17
3051

3152
### Fixed
3253
- Fixed a regression in which null outcomes in strategic game tables were not handled correctly
@@ -41,7 +62,7 @@
4162
mixed behavior profiles (#616)
4263

4364

44-
## [16.3.2] - unreleased
65+
## [16.3.2] - 2025-12-04
4566

4667
### Fixed
4768
- Parsing of output of `gambit-logit` in the graphical interface did not handle the

Makefile.am

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
##
22
## This file is part of Gambit
3-
## Copyright (c) 1994-2025, The Gambit Project (https://www.gambit-project.org)
3+
## Copyright (c) 1994-2026, The Gambit Project (https://www.gambit-project.org)
44
##
55
## FILE: Makefile.am
66
## Top-level automake input file for Gambit
@@ -246,19 +246,14 @@ core_SOURCES = \
246246
src/core/core.h \
247247
src/core/util.h \
248248
src/core/array.h \
249-
src/core/list.h \
250249
src/core/vector.h \
251250
src/core/recarray.h \
252251
src/core/matrix.h \
253-
src/core/matrix.imp \
254-
src/core/sqmatrix.h \
255-
src/core/sqmatrix.imp \
256252
src/core/integer.cc \
257253
src/core/integer.h \
258254
src/core/rational.cc \
259255
src/core/rational.h \
260256
src/core/matrix.cc \
261-
src/core/sqmatrix.cc \
262257
src/core/function.cc \
263258
src/core/function.h \
264259
src/core/tinyxml.cc \
@@ -407,7 +402,6 @@ gambit_enumpoly_SOURCES = \
407402
src/solvers/enumpoly/rectangle.h \
408403
src/solvers/enumpoly/poly.cc \
409404
src/solvers/enumpoly/poly.h \
410-
src/solvers/enumpoly/poly.imp \
411405
src/solvers/enumpoly/polysystem.h \
412406
src/solvers/enumpoly/polypartial.h \
413407
src/solvers/enumpoly/polypartial.imp \

0 commit comments

Comments
 (0)