Skip to content

Commit ef0ed7f

Browse files
Merge branch 'dev-install-fix' into catalog/744
2 parents 8c19a37 + ce211bd commit ef0ed7f

Some content is hidden

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

45 files changed

+7667
-3691
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
### Changed
66
- `Game.comment` has been renamed to `Game.description`
77

8+
### Fixed
9+
- `enumpoly` would take a very long time on some supports where an equilibrium is located on the
10+
boundary of the projected game. Search is now restricted to the interior of the space ruling
11+
these out; these will always be found by another projection. (#756)
812

913
## [16.5.1] - unreleased
1014

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010

1111
**Gambit** is the package for doing computation in (non-cooperative) game theory.
1212

13-
- See our [documentation](https://gambitproject.readthedocs.io/)
14-
- Check our [project website](https://www.gambit-project.org/)
13+
- **Documentation:** for the package is hosted at [gambitproject.readthedocs.io](https://gambitproject.readthedocs.io/).
14+
- **The Gambit project:** Find out more about the project at [gambit-project.org](https://www.gambit-project.org/)
15+
- **Contributors:** Please read the [code of conduct and contribution guidelines](https://gambitproject.readthedocs.io/en/latest/developer.contributing.html) before posting on GitHub.
1516

1617
Gambit provides:
1718

build_support/osx/Info.plist.in

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,31 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
3-
<plist version="0.9">
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
44
<dict>
55
<key>CFBundleInfoDictionaryVersion</key>
66
<string>6.0</string>
77
<key>CFBundleIdentifier</key>
88
<string>org.gambit-project.gambit</string>
99
<key>CFBundleDevelopmentRegion</key>
10-
<string>English</string>
10+
<string>en</string>
1111
<key>CFBundleExecutable</key>
1212
<string>gambit</string>
1313
<key>CFBundleIconFile</key>
1414
<string>gambit</string>
1515
<key>CFBundleName</key>
1616
<string>Gambit</string>
17+
<key>CFBundleDisplayName</key>
18+
<string>Gambit</string>
1719
<key>CFBundlePackageType</key>
1820
<string>APPL</string>
19-
<key>CFBundleSignature</key>
20-
<string>????</string>
2121
<key>CFBundleVersion</key>
2222
<string>@GAMBIT_VERSION@</string>
2323
<key>CFBundleShortVersionString</key>
2424
<string>@GAMBIT_VERSION@</string>
2525
<key>CFBundleGetInfoString</key>
26-
<string>Gambit version @GAMBIT_VERSION@, (c) 1994-2025 The Gambit Project</string>
27-
<key>CFBundleLongVersionString</key>
28-
<string>@GAMBIT_VERSION@, (c) 1994-2025 The Gambit Project</string>
26+
<string>Gambit version @GAMBIT_VERSION@, (c) 1994-2026 The Gambit Project</string>
2927
<key>NSHumanReadableCopyright</key>
30-
<string>Copyright 1994-2025 The Gambit Project</string>
31-
<key>LSRequiresCarbon</key>
32-
<true/>
33-
<key>CSResourcesFileMapped</key>
34-
<true/>
28+
<string>Copyright 1994-2026 The Gambit Project</string>
3529
<key>CFBundleDocumentTypes</key>
3630
<array>
3731
<dict>

build_support/osx/gambit.icns

137 KB
Binary file not shown.

doc/developer.build.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ Use `pip` to install from the **root directory of the source tree**:
188188
189189
python -m venv venv
190190
source venv/bin/activate
191-
python -m pip install .[test,doc]
191+
python -m pip install ".[test,doc]"
192192
193193
.. tip::
194194

doc/developer.contributing.rst

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,25 @@ Contributing to Gambit
66
This section provides guidelines for contributing to Gambit, including how to report bugs, suggest features, and contribute code.
77
It includes information relevant to both core developers and external contributors.
88

9+
.. _code-of-conduct:
10+
11+
Code of Conduct
12+
---------------
13+
14+
All participants in the Gambit community are expected to show respect and courtesy to others.
15+
We are committed to fostering a welcoming and harassment-free environment for everyone, regardless of background or identity.
16+
Please be kind and considerate in your interactions. We are all here to build a better tool for game theory research and education.
17+
Disagreements may happen, but they should be handled with respect and a focus on constructive resolution.
18+
19+
To raise any concerns, please contact `Ted Turocy <mailto:ted.turocy@gmail.com>` or `Rahul Savani <mailto:rahul.savani@gmail.com>`.
20+
921
.. _github-issues:
1022

1123
GitHub issues
1224
-------------
1325

26+
Newcomer to the project? Please read the :ref:`code of conduct <code-of-conduct>` and :ref:`new contributors section <new-contributors>` sections before posting on GitHub.
27+
1428
In the first instance, bug reports, feature requests and improvements to the Gambit documentation should be
1529
posted to the Gambit issue tracker, located at
1630
`<http://github.com/gambitproject/gambit/issues>`_.
@@ -39,6 +53,44 @@ latest development version. New development should in general always
3953
be based off this branch. Branches labeled ``maintX_Y``, where ``X`` is the major version number and ``Y`` is the minor version number, point to the latest commit on a stable
4054
version.
4155

56+
.. _new-contributors:
57+
58+
A Note for New Contributors
59+
^^^^^^^^^^^^^^^^^^^^^^^^^^^
60+
61+
We warmly welcome new contributors to the Gambit project! Your help is valuable to us.
62+
63+
Before you start working on a contribution, we encourage you to familiarize yourself with the project.
64+
Gambit is a mature and complex codebase. Even issues marked as "good first issue" may require some understanding of the context and how different parts of the project interact.
65+
66+
We have always valued thoughtful contributions. A common issue for open-source projects is receiving pull requests that are not well-aligned with the project's needs or coding standards. To avoid unproductive effort on your part and on ours, we strongly encourage you to engage with us before you spend a lot of time on implementation.
67+
68+
A great way to start is by:
69+
70+
1. Looking through the code to understand the relevant parts for your intended change.
71+
2. Contacting the maintainers via commenting with a question on an open issue, or opening a Discussion on GitHub.
72+
3. After your discussion with the maintainers, open a draft pull request early in your process. This allows for discussion and feedback before you've invested too much time.
73+
74+
We are happy to answer questions and provide guidance. Engaging with the maintainers early ensures that your contribution is likely to be accepted and integrated smoothly.
75+
76+
.. _ai-policy:
77+
78+
Policy on AI-Assisted Contributions
79+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
80+
81+
We recognize that generative AI tools can be a useful aid in software development. We also expect authentic and thoughtful engagement from our contributors.
82+
83+
- **You are responsible for your contributions.** If you use generative AI to help you write code or documentation, you must fully understand the output. You should be able to explain the changes and why they are the correct approach for the project.
84+
- **Add value.** Simply taking a prompt, feeding it to an AI, and posting the result as a contribution is not helpful. We expect you to use your own expertise to verify, test, and refine any AI-generated content. Out of respect for everyone's time, we reserve the right to rigorously reject low-value contributions, whether AI-generated or not.
85+
- **No AI-generated comments.** Please do not post output from Large Language Models (LLMs) or similar tools as comments on GitHub issues or pull requests. Such comments are often generic and do not add to the discussion.
86+
- **Humans over bots.** We discourage the use of automated tools, such as bots or agents, to post AI-generated content to issues or pull requests, without the advance approval of the core development team.
87+
88+
89+
How to submit a contribution
90+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
91+
92+
To contribute code, please follow these steps:
93+
4294
1. To get started contributing code in the `Gambit GitHub repo <https://github.com/gambitproject/gambit>`__, do one of the following:
4395

4496
- Core developers: request contributor access from one of the `team <https://www.gambit-project.org/team/>`__

doc/index.rst

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
##########################
21
Gambit: User documentation
3-
##########################
2+
^^^^^^^^^^^^^^^^^^^^^^^^^^
43

54
**Gambit** is a library of game theory software and tools for the
65
construction and analysis of finite extensive and strategic games.
7-
We recommended most new users install the PyGambit Python package and read the associated documentation, which includes tutorials and a complete API reference.
6+
7+
- **Users:** We recommend most newcomers install the PyGambit Python package and read the associated documentation, which includes tutorials and a complete API reference.
8+
- **Contributors:** Please read the :ref:`code of conduct and contribution guidelines <contributing>` before posting on GitHub.
89

910
.. grid::
1011

pyproject.toml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ dependencies = [
3232
]
3333

3434
[project.optional-dependencies]
35-
test = ["pytest", "nbformat", "nbclient", "ipykernel"]
35+
test = ["pytest", "pytest-subtests", "nbformat", "nbclient", "ipykernel"]
3636
doc = [
3737
"pydata-sphinx-theme",
3838
"sphinx_design",
@@ -100,6 +100,16 @@ markers = [
100100
"nash_lcp_behavior: tests of lcp_solve in mixed behaviors",
101101
"nash_lp_strategy: tests of lp_solve in mixed strategies",
102102
"nash_lp_behavior: tests of lp_solve in mixed behaviors",
103+
"nash_logit_strategy: tests of logit_solve in mixed strategies",
104+
"nash_logit_behavior: tests of logit_solve in behavior strategies",
105+
"nash_gnm_strategy: tests of gnm_solve in mixed strategies",
106+
"nash_ipa_strategy: tests of lpa_solve in mixed strategies",
107+
"nash_simpdiv: tests of simpdiv_solve (in mixed strategies)",
108+
"nash_liap_strategy: tests of liap_solve (in mixed strategies)",
109+
"nash_liap_agent: tests of liap_agent_solve (in mixed behaviors)",
110+
"qre_logit: tests of logit_solve and related methods",
111+
"qre_logit_lambda: tests of logit_solve_lambda",
112+
"qre_logit_branch: tests of logit_solve_branch",
103113
"nash: all tests of Nash equilibrium solvers",
104114
"slow: all time-consuming tests",
105115
]

src/gui/app.cc

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,55 @@
2626
#ifndef WX_PRECOMP
2727
#include <wx/wx.h>
2828
#endif // WX_PRECOMP
29+
#include <wx/display.h>
2930
#include <wx/image.h>
30-
#include <wx/splash.h>
3131

3232
#include "gambit.h"
3333

3434
#include "app.h"
3535
#include "gameframe.h"
3636

37+
#include "bitmaps/gambitbig.xpm"
38+
3739
namespace Gambit::GUI {
3840

39-
bool Application::OnInit()
41+
static wxBitmap MakeScaledSplashBitmap(const wxBitmap &srcBmp, double fracOfShortSide)
4042
{
41-
#include "bitmaps/gambitbig.xpm"
43+
const wxPoint mouse = wxGetMousePosition();
44+
const int dispIdx = wxDisplay::GetFromPoint(mouse);
45+
wxDisplay disp(dispIdx == wxNOT_FOUND ? 0 : dispIdx);
46+
47+
wxRect geom = disp.GetGeometry(); // pixels in that display
48+
const int shortSide = std::min(geom.width, geom.height);
49+
const int targetMax = std::max(200, int(shortSide * fracOfShortSide));
50+
51+
const int w = srcBmp.GetWidth();
52+
const int h = srcBmp.GetHeight();
53+
const double s = double(targetMax) / double(std::max(w, h));
54+
55+
const int newW = std::max(1, int(std::lround(w * s)));
56+
const int newH = std::max(1, int(std::lround(h * s)));
57+
58+
wxImage img = srcBmp.ConvertToImage();
59+
img.Rescale(newW, newH, wxIMAGE_QUALITY_HIGH);
60+
61+
return wxBitmap(img);
62+
}
63+
64+
wxBEGIN_EVENT_TABLE(Application, wxApp) EVT_TIMER(wxID_ANY, Application::OnSplashDismissTimer)
65+
wxEND_EVENT_TABLE()
66+
67+
bool Application::OnInit()
68+
{
69+
wxApp::OnInit();
70+
71+
const wxBitmap bitmap(gambitbig_xpm);
72+
m_splashTimer.Start();
73+
m_splash = new wxSplashScreen(MakeScaledSplashBitmap(bitmap, 0.45),
74+
wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, nullptr,
75+
wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE);
76+
m_splash->Show();
77+
m_splash->Update();
4278
wxConfigBase::Set(new wxConfig(_T("Gambit"), _T("Gambit")));
4379
m_fileHistory.Load(*wxConfigBase::Get());
4480
// Immediately saving this back forces the entries to be created at
@@ -47,12 +83,6 @@ bool Application::OnInit()
4783
// m_fileHistory.Save(config);
4884
wxConfigBase::Get()->Read(_T("/General/CurrentDirectory"), &m_currentDir, _T(""));
4985

50-
const wxBitmap bitmap(gambitbig_xpm);
51-
/*wxSplashScreen *splash =*/
52-
new wxSplashScreen(bitmap, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, 2000, nullptr, -1,
53-
wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER | wxSTAY_ON_TOP);
54-
wxYield();
55-
5686
// Process command line arguments, if any.
5787
for (int i = 1; i < wxApp::argc; i++) {
5888
const AppLoadResult result = LoadFile(wxApp::argv[i]);
@@ -86,9 +116,30 @@ bool Application::OnInit()
86116
// Set up the help system.
87117
wxInitAllImageHandlers();
88118

119+
this->CallAfter(&Application::DismissSplash);
120+
89121
return true;
90122
}
91123

124+
void Application::DismissSplash()
125+
{
126+
if (!m_splash) {
127+
return;
128+
}
129+
130+
const long minDisplay = 1000;
131+
const long elapsed = m_splashTimer.Time();
132+
133+
if (elapsed < minDisplay) {
134+
m_splashDismissTimer.SetOwner(this);
135+
m_splashDismissTimer.StartOnce(minDisplay - elapsed);
136+
return;
137+
}
138+
139+
m_splash->Destroy();
140+
m_splash = nullptr;
141+
}
142+
92143
AppLoadResult Application::LoadFile(const wxString &p_filename)
93144
{
94145
std::ifstream infile((const char *)p_filename.mb_str());

src/gui/app.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <wx/wx.h>
2727
#include <wx/config.h> // for wxConfig
2828
#include <wx/docview.h> // for wxFileHistory
29+
#include <wx/splash.h>
2930

3031
namespace Gambit::GUI {
3132

@@ -37,8 +38,15 @@ class Application final : public wxApp {
3738
wxString m_currentDir; /* Current position in directory tree. */
3839
wxFileHistory m_fileHistory{10};
3940
std::list<GameDocument *> m_documents;
41+
wxSplashScreen *m_splash{nullptr};
42+
wxStopWatch m_splashTimer;
43+
wxTimer m_splashDismissTimer;
4044

4145
bool OnInit() override;
46+
void DismissSplash();
47+
void OnSplashDismissTimer(wxTimerEvent &) { DismissSplash(); }
48+
49+
wxDECLARE_EVENT_TABLE();
4250

4351
public:
4452
Application() = default;

0 commit comments

Comments
 (0)