diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index c0a8cbbc9..872c5ebaa 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -17,7 +17,7 @@ jobs:
name: clang-format
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Run clang-format style check for C/C++
uses: jidicula/clang-format-action@v4.15.0
with:
@@ -29,7 +29,7 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Install dependencies
run: |
sudo apt-key adv --fetch-keys http://repos.codelite.org/CodeLite.asc
@@ -45,14 +45,14 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- uses: chartboost/ruff-action@v1
flake8:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.12"
@@ -62,7 +62,7 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
with:
diff --git a/.github/workflows/osxbinary.yml b/.github/workflows/osxbinary.yml
index 025da0132..54a2af93f 100644
--- a/.github/workflows/osxbinary.yml
+++ b/.github/workflows/osxbinary.yml
@@ -13,10 +13,10 @@ on:
jobs:
macos-13:
- runs-on: macos-13
+ runs-on: macos-14
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Install dependencies
run: |
brew install automake autoconf
@@ -37,5 +37,5 @@ jobs:
- run: make osx-dmg
- uses: actions/upload-artifact@v5
with:
- name: artifact-osx-13
+ name: artifact-osx-14
path: "*.dmg"
diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index 44af9bb9b..803659d4b 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -21,7 +21,7 @@ jobs:
python-version: ['3.9', '3.13']
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
@@ -41,14 +41,14 @@ jobs:
run: pytest
macos-13:
- runs-on: macos-13
+ runs-on: macos-14
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
strategy:
matrix:
python-version: ['3.13']
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
@@ -64,14 +64,14 @@ jobs:
run: pytest
macos-14:
- runs-on: macos-14
+ runs-on: macos-15
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
strategy:
matrix:
python-version: ['3.13']
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
@@ -94,7 +94,7 @@ jobs:
python-version: ['3.13']
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml
index 4cd26bc61..373cd44bf 100644
--- a/.github/workflows/tools.yml
+++ b/.github/workflows/tools.yml
@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Install dependencies
run: |
sudo apt-key adv --fetch-keys http://repos.codelite.org/CodeLite.asc
@@ -41,10 +41,10 @@ jobs:
sudo make install
macos:
- runs-on: macos-13
+ runs-on: macos-14
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Install dependencies
run: brew install automake autoconf wxwidgets
- run: aclocal
@@ -56,14 +56,14 @@ jobs:
- run: make osx-dmg
- uses: actions/upload-artifact@v5
with:
- name: artifact-osx-13
+ name: artifact-osx-14
path: "*.dmg"
macos-14:
- runs-on: macos-14
+ runs-on: macos-15
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Install dependencies
run: brew install automake autoconf wxwidgets
- run: aclocal
@@ -75,7 +75,7 @@ jobs:
- run: make osx-dmg
- uses: actions/upload-artifact@v5
with:
- name: artifact-osx-14
+ name: artifact-osx-15
path: "*.dmg"
windows:
@@ -85,7 +85,7 @@ jobs:
run:
shell: msys2 {0}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- uses: msys2/setup-msys2@v2
with:
install: mingw-w64-x86_64-toolchain make automake autoconf
diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml
index 7a128e639..bff183887 100644
--- a/.github/workflows/wheels.yml
+++ b/.github/workflows/wheels.yml
@@ -17,7 +17,7 @@ jobs:
runs-on: windows-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
diff --git a/ChangeLog b/ChangeLog
index da05cf682..118118491 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,6 @@
# Changelog
-## [16.4.1] - unreleased
+## [16.4.1] - 2025-12-17
### Fixed
- Fixed a regression in which null outcomes in strategic game tables were not handled correctly
@@ -15,7 +15,7 @@
mixed behavior profiles (#616)
-## [16.3.2] - unreleased
+## [16.3.2] - 2025-12-04
### Fixed
- Parsing of output of `gambit-logit` in the graphical interface did not handle the
diff --git a/configure.ac b/configure.ac
index e0170be0b..1266f5e8a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,7 +20,7 @@ dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
dnl
-AC_INIT([gambit],[16.4.0])
+AC_INIT([gambit],[16.4.1])
AC_CONFIG_SRCDIR([src/gambit.h])
AM_INIT_AUTOMAKE([subdir-objects foreign])
dnl AC_CONFIG_MACRO_DIR([m4])
diff --git a/contrib/mac/Info.plist b/contrib/mac/Info.plist
index a17bd7905..15deeb647 100644
--- a/contrib/mac/Info.plist
+++ b/contrib/mac/Info.plist
@@ -19,13 +19,13 @@
CFBundleSignature
????
CFBundleVersion
- 16.4.0
+ 16.4.1
CFBundleShortVersionString
- 16.4.0
+ 16.4.1
CFBundleGetInfoString
- Gambit version 16.4.0, (c) 1994-2025 The Gambit Project
+ Gambit version 16.4.1, (c) 1994-2025 The Gambit Project
CFBundleLongVersionString
- 16.4.0, (c) 1994-2025 The Gambit Project
+ 16.4.1, (c) 1994-2025 The Gambit Project
NSHumanReadableCopyright
Copyright 1994-2025 The Gambit Project
LSRequiresCarbon
diff --git a/doc/conf.py b/doc/conf.py
index 57de0b53a..35d034efa 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -55,7 +55,7 @@
# The short X.Y version.
version = "16.4"
# The full version, including alpha/beta/rc tags.
-release = "16.4.0"
+release = "16.4.1"
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/doc/tools.convert.rst b/doc/tools.convert.rst
index 7db467c7c..3c4f8d416 100644
--- a/doc/tools.convert.rst
+++ b/doc/tools.convert.rst
@@ -40,7 +40,7 @@ Example invocation for HTML output::
$ gambit-convert -O html 2x2.nfg
Convert games among various file formats
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
Two person 2 x 2 game with unique mixed equilibrium
@@ -55,7 +55,7 @@ Example invocation for LaTeX output::
$ gambit-convert -O sgame 2x2.nfg
Convert games among various file formats
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
\begin{game}{2}{2}[Player 1][Player 2]
diff --git a/doc/tools.enummixed.rst b/doc/tools.enummixed.rst
index 8a2432672..0ad3abd0e 100644
--- a/doc/tools.enummixed.rst
+++ b/doc/tools.enummixed.rst
@@ -70,7 +70,7 @@ in Figure 2 of Selten (International Journal of Game Theory,
$ gambit-enummixed e02.nfg
Compute Nash equilibria by enumerating extreme points
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1,0,0,1,0
@@ -82,7 +82,7 @@ information using the `-c` switch::
$ gambit-enummixed -c e02.nfg
Compute Nash equilibria by enumerating extreme points
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1,0,0,1,0
diff --git a/doc/tools.enumpoly.rst b/doc/tools.enumpoly.rst
index f3c46bd9a..2e211c885 100644
--- a/doc/tools.enumpoly.rst
+++ b/doc/tools.enumpoly.rst
@@ -98,7 +98,7 @@ Computing equilibria of the strategic game :download:`e01.nfg
$ gambit-enumpoly e01.nfg
Compute Nash equilibria by solving polynomial systems
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1.000000,0.000000,1.000000,0.000000,0.000000,1.000000
diff --git a/doc/tools.enumpure.rst b/doc/tools.enumpure.rst
index 407461fd0..a179a267e 100644
--- a/doc/tools.enumpure.rst
+++ b/doc/tools.enumpure.rst
@@ -66,7 +66,7 @@ Computing the pure-strategy equilibria of extensive game :download:`e02.efg
$ gambit-enumpure e02.efg
Search for Nash equilibria in pure strategies
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1,0,0,0,1,0
@@ -77,7 +77,7 @@ strategies::
$ gambit-enumpure -S e02.efg
Search for Nash equilibria in pure strategies
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1,0,0,1,0
@@ -88,7 +88,7 @@ only one information set; therefore the set of solutions is larger::
$ gambit-enumpure -A e02.efg
Search for Nash equilibria in pure strategies
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1,0,1,0,1,0
diff --git a/doc/tools.gnm.rst b/doc/tools.gnm.rst
index 88ca23eb4..2051b07b0 100644
--- a/doc/tools.gnm.rst
+++ b/doc/tools.gnm.rst
@@ -88,7 +88,7 @@ the reduced strategic form of the example in Figure 2 of Selten
$ gambit-gnm e02.nfg
Compute Nash equilibria using a global Newton method
Gametracer version 0.2, Copyright (C) 2002, Ben Blum and Christian Shelton
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1,0,2.99905e-12,0.5,0.5
diff --git a/doc/tools.ipa.rst b/doc/tools.ipa.rst
index 219faa95b..e4054fbc3 100644
--- a/doc/tools.ipa.rst
+++ b/doc/tools.ipa.rst
@@ -55,7 +55,7 @@ the reduced strategic form of the example in Figure 2 of Selten
$ gambit-ipa e02.nfg
Compute Nash equilibria using iterated polymatrix approximation
Gametracer version 0.2, Copyright (C) 2002, Ben Blum and Christian Shelton
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1.000000,0.000000,0.000000,1.000000,0.000000
diff --git a/doc/tools.lcp.rst b/doc/tools.lcp.rst
index 486ce6c20..b106a101e 100644
--- a/doc/tools.lcp.rst
+++ b/doc/tools.lcp.rst
@@ -9,7 +9,7 @@ computes Nash equilibria by finding solutions to a linear
complementarity problem. For extensive games, the program uses the
sequence form representation of the extensive game, as defined by
Koller, Megiddo, and von Stengel [KolMegSte94]_, and applies the
-algorithm developed by Lemke. For strategic games, the program using
+algorithm developed by Lemke. For strategic games, the program uses
the method of Lemke and Howson [LemHow64]_. There exist strategic
games for which some equilibria cannot be located by this method; see
Shapley [Sha74]_.
@@ -79,7 +79,7 @@ Computing an equilibrium of extensive game :download:`e02.efg
$ gambit-lcp e02.efg
Compute Nash equilibria by solving a linear complementarity program
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1,0,1/2,1/2,1/2,1/2
diff --git a/doc/tools.liap.rst b/doc/tools.liap.rst
index 561059d45..d341d4dac 100644
--- a/doc/tools.liap.rst
+++ b/doc/tools.liap.rst
@@ -85,7 +85,7 @@ Computing an equilibrium in mixed strategies of :download:`e02.efg
$ gambit-liap e02.nfg
Compute Nash equilibria by minimizing the Lyapunov function
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,0.998701,0.000229,0.001070,0.618833,0.381167
diff --git a/doc/tools.logit.rst b/doc/tools.logit.rst
index 59eaf7e52..172633e07 100644
--- a/doc/tools.logit.rst
+++ b/doc/tools.logit.rst
@@ -108,7 +108,7 @@ in Figure 2 of Selten (International Journal of Game Theory,
$ gambit-logit e02.nfg
Compute a branch of the logit equilibrium correspondence
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
0.000000,0.333333,0.333333,0.333333,0.5,0.5
diff --git a/doc/tools.lp.rst b/doc/tools.lp.rst
index f032fee9e..75edf2ebb 100644
--- a/doc/tools.lp.rst
+++ b/doc/tools.lp.rst
@@ -65,7 +65,7 @@ strategies each, with a unique equilibrium in mixed strategies::
$ gambit-lp 2x2const.nfg
Compute Nash equilibria by solving a linear program
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1/3,2/3,1/3,2/3
diff --git a/doc/tools.simpdiv.rst b/doc/tools.simpdiv.rst
index 324025dd6..5ebfe3087 100644
--- a/doc/tools.simpdiv.rst
+++ b/doc/tools.simpdiv.rst
@@ -92,7 +92,7 @@ Computing an equilibrium in mixed strategies of :download:`e02.efg
$ gambit-simpdiv e02.nfg
Compute Nash equilibria using simplicial subdivision
- Gambit version 16.4.0, Copyright (C) 1994-2025, The Gambit Project
+ Gambit version 16.4.1, Copyright (C) 1994-2025, The Gambit Project
This is free software, distributed under the GNU GPL
NE,1,0,0,1,0
diff --git a/gambit.wxs b/gambit.wxs
index 7563a8404..1c83e6b5f 100644
--- a/gambit.wxs
+++ b/gambit.wxs
@@ -1,6 +1,6 @@
-
+
diff --git a/pyproject.toml b/pyproject.toml
index 1206c9a1b..0172c6986 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "pygambit"
-version = "16.4.0"
+version = "16.4.1"
description = "The package for computation in game theory"
readme = "src/README.rst"
requires-python = ">=3.9"
diff --git a/src/gui/gameframe.cc b/src/gui/gameframe.cc
index b99aa496e..b468566fb 100644
--- a/src/gui/gameframe.cc
+++ b/src/gui/gameframe.cc
@@ -489,6 +489,10 @@ void gbtGameFrame::MakeMenus()
viewMenu->Append(GBT_MENU_VIEW_STRATEGIC, _("&Strategic game"),
wxT("Display the reduced strategic representation ") wxT("of the game"), true);
+ if (!m_doc->GetGame()->IsTree()) {
+ viewMenu->Check(GBT_MENU_VIEW_STRATEGIC, true);
+ viewMenu->Enable(GBT_MENU_VIEW_STRATEGIC, false);
+ }
auto *formatMenu = new wxMenu;
AppendBitmapItem(formatMenu, GBT_MENU_FORMAT_LAYOUT, _("&Layout"),
diff --git a/src/pygambit/__init__.py b/src/pygambit/__init__.py
index 7c7607874..3ad1cc43b 100644
--- a/src/pygambit/__init__.py
+++ b/src/pygambit/__init__.py
@@ -28,4 +28,4 @@
supports, # noqa: F401
)
-__version__ = "16.4.0"
+__version__ = "16.4.1"
diff --git a/src/pygambit/game.pxi b/src/pygambit/game.pxi
index 082b08b62..b426ff58f 100644
--- a/src/pygambit/game.pxi
+++ b/src/pygambit/game.pxi
@@ -1488,7 +1488,7 @@ class Game:
except KeyError:
raise KeyError(f"{funcname}(): no information set with label '{infoset}'")
raise TypeError(
- f"{funcname}(): {argname} must be Infoset or str, not {node.__class__.__name__}"
+ f"{funcname}(): {argname} must be Infoset or str, not {infoset.__class__.__name__}"
)
def _resolve_action(self,