Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
90a5e36
Create catalog dir and move one EFG and one NFG into it from contrib/…
edwardchalstrey1 Feb 3, 2026
83dd410
ignore catalog files copied into pygambit
edwardchalstrey1 Feb 3, 2026
7fc2199
add failing tests
edwardchalstrey1 Feb 3, 2026
3c53bea
improve tests
edwardchalstrey1 Feb 3, 2026
898a916
add pandas to pyproject.toml
edwardchalstrey1 Feb 3, 2026
8f916db
add test_catalog_load_invalid_slug
edwardchalstrey1 Feb 3, 2026
606dd8a
create load function
edwardchalstrey1 Feb 3, 2026
00beed3
add catalog to __init__
edwardchalstrey1 Feb 3, 2026
64eb310
add games() function
edwardchalstrey1 Feb 3, 2026
d24befd
refactor to define READERS once
edwardchalstrey1 Feb 3, 2026
72aade1
Big refactor to get catalog files from catalog dir external to pygambit
edwardchalstrey1 Feb 3, 2026
e7953e9
update Makefile.am for the 2 examples we moved into the catalog so far
edwardchalstrey1 Feb 3, 2026
7490ae6
update Game.comment to be Game.description in Python code
edwardchalstrey1 Feb 4, 2026
ebf6829
Revert "update Game.comment to be Game.description in Python code"
edwardchalstrey1 Feb 4, 2026
fbf6b89
Add initial update catalog script and RST page
edwardchalstrey1 Feb 4, 2026
1ca3461
rename table headers on output df from game() func
edwardchalstrey1 Feb 4, 2026
bd3c1f3
add generating the catalog csv for docs into GH actions
edwardchalstrey1 Feb 4, 2026
569148c
Revert "add generating the catalog csv for docs into GH actions"
edwardchalstrey1 Feb 4, 2026
8cf0396
refactor update script so its run from repo root
edwardchalstrey1 Feb 4, 2026
1b20438
update readthedocs to build the catalog csv before docs build
edwardchalstrey1 Feb 4, 2026
e977e64
add function which updates Makefile.am
edwardchalstrey1 Feb 4, 2026
af08d29
use a proper path for CATALOG_CSV
edwardchalstrey1 Feb 4, 2026
cd2ffc9
tidy update script
edwardchalstrey1 Feb 4, 2026
5675444
use explicit python executable from the virtualenv to create CSV for …
edwardchalstrey1 Feb 4, 2026
f574223
add developer doc for updating the catalog
edwardchalstrey1 Feb 4, 2026
5147278
Don't update Makefile.am by default
edwardchalstrey1 Feb 4, 2026
4b033c9
consistency in notebook comment
edwardchalstrey1 Feb 4, 2026
b14402a
demo loading from catalog in tutorial 1
edwardchalstrey1 Feb 4, 2026
264f7fb
load from catalog for game examples in advanced tutorials
edwardchalstrey1 Feb 4, 2026
0e268a2
Try using pip instead of setuptools to ensure pyproject.toml deps ins…
edwardchalstrey1 Feb 4, 2026
8649946
remove deleted contrib games from Makefile.am
edwardchalstrey1 Feb 4, 2026
adea4f2
add a warning about moving games from contrib
edwardchalstrey1 Feb 4, 2026
a72f7a2
check if pandas duplications error exists if we dont save outputs on …
edwardchalstrey1 Feb 4, 2026
57863d4
fix problem with print function
edwardchalstrey1 Feb 4, 2026
b687e20
resave notebook outputs
edwardchalstrey1 Feb 4, 2026
6562433
Update writer.cc
tturocy Feb 10, 2026
39fde9d
Merge branch 'master' into ehancement/731/take2
edwardchalstrey1 Feb 10, 2026
f84bcc8
move catalog update script into build support
edwardchalstrey1 Feb 10, 2026
d17f976
rename script
edwardchalstrey1 Feb 10, 2026
f07fdae
rename var
edwardchalstrey1 Feb 10, 2026
fd66e41
update path to catalog update script in readthedocs yml and docs page
edwardchalstrey1 Feb 10, 2026
bb1e920
move myserson fig into subfolder
edwardchalstrey1 Feb 10, 2026
5c7a60f
clarify script usage
edwardchalstrey1 Feb 10, 2026
dc7a373
add test_catalog_load_subdir_slug
edwardchalstrey1 Feb 10, 2026
7850585
update makefile
edwardchalstrey1 Feb 10, 2026
f6ea5df
update agent nb
edwardchalstrey1 Feb 10, 2026
f655645
add test for slug in subdir of catalog
edwardchalstrey1 Feb 10, 2026
56cd19a
update games func to list slugs correctly
edwardchalstrey1 Feb 10, 2026
6a4df8f
update test to avoid duplicates
edwardchalstrey1 Feb 10, 2026
886131c
fix code for handling slugs that duplicates of those in subfolders
edwardchalstrey1 Feb 10, 2026
68909b9
tidy the games() refactor
edwardchalstrey1 Feb 10, 2026
bb8f483
resave notebook
edwardchalstrey1 Feb 10, 2026
50e618b
strip nb outputs
edwardchalstrey1 Feb 10, 2026
67dedb2
remove modification to games() that was fixing a local issue
edwardchalstrey1 Feb 10, 2026
1794a83
fix the update script to get correct paths
edwardchalstrey1 Feb 10, 2026
079aacd
remove unused var
edwardchalstrey1 Feb 10, 2026
e57cfce
Add Windows handling
edwardchalstrey1 Feb 10, 2026
bdc5d3a
fix incorrect var name and make consistent
edwardchalstrey1 Feb 11, 2026
69d8cb9
use as_posix for slugs
edwardchalstrey1 Feb 11, 2026
b045083
move load and games functions from __init__.py to utils.py
edwardchalstrey1 Feb 13, 2026
d8ee58e
add families module
edwardchalstrey1 Feb 13, 2026
a0b66c0
add family games to games()
edwardchalstrey1 Feb 13, 2026
939a56f
update load function to look in family games
edwardchalstrey1 Feb 13, 2026
1df3db7
alternate titles in example game family
edwardchalstrey1 Feb 13, 2026
e0c4b7c
Add to developer doc page
edwardchalstrey1 Feb 13, 2026
5bea9ea
Bump clang-format-version to 18
edwardchalstrey1 Feb 16, 2026
b63291c
Revert "Bump clang-format-version to 18"
edwardchalstrey1 Feb 16, 2026
122c168
move utils.py and families.py back into __init__.py so linux installa…
edwardchalstrey1 Feb 17, 2026
6b863d7
add slug collision error
edwardchalstrey1 Feb 17, 2026
196b8d6
update doc to reflect move back to __init__.py
edwardchalstrey1 Feb 17, 2026
ed1db2e
Merge branch 'master' into catalog/758
edwardchalstrey1 Feb 18, 2026
82e5154
add tests for filtering options based on game object attributes
edwardchalstrey1 Feb 19, 2026
f9e0424
use a fixture for all_games
edwardchalstrey1 Feb 19, 2026
95ba60b
update tests to assume df always returned by games()
edwardchalstrey1 Feb 19, 2026
39f8c27
add check_filters
edwardchalstrey1 Feb 19, 2026
6196a0b
Fix filter names and rules
edwardchalstrey1 Feb 19, 2026
63f767f
comment out perfect recall test
edwardchalstrey1 Feb 19, 2026
87eb32d
Make sure tree specific filters handled correctly
edwardchalstrey1 Feb 19, 2026
a7d5fb8
Merge branch 'master' into catalog/758
edwardchalstrey1 Feb 26, 2026
d245e8f
remove notebook 1 changes
edwardchalstrey1 Feb 26, 2026
9579150
revert makefile changes
edwardchalstrey1 Feb 26, 2026
da8a4a1
remove catalog games added by merge
edwardchalstrey1 Feb 26, 2026
5e712af
and put them back in contrib
edwardchalstrey1 Feb 26, 2026
379461f
Merge branch 'catalog/759' into catalog/758
edwardchalstrey1 Feb 26, 2026
f39f34c
Add tests for games filtering
edwardchalstrey1 Feb 26, 2026
80930fb
Merge branch 'master' into catalog/758
edwardchalstrey1 Feb 26, 2026
fb4a90c
suppress is_tree test for now
edwardchalstrey1 Feb 26, 2026
de35e54
Merge branch 'master' into catalog/758
edwardchalstrey1 Feb 26, 2026
68965d1
remove doc duplication
edwardchalstrey1 Mar 2, 2026
97e015d
update docstring for games()
edwardchalstrey1 Mar 2, 2026
d424d7a
update tests to assume returned df from games() has slug strings, not…
edwardchalstrey1 Mar 2, 2026
900b3b8
Ensure games() always returns slug strings, not instantiated Game obj…
edwardchalstrey1 Mar 2, 2026
b6e371a
add valueerror for invalid kwargs
edwardchalstrey1 Mar 2, 2026
b20240a
switch kwargs for args in games()
edwardchalstrey1 Mar 2, 2026
ef7e446
Add catalog functions to API docs
edwardchalstrey1 Mar 2, 2026
e838f51
improve docstring of load
edwardchalstrey1 Mar 2, 2026
b385681
improve docstring for family_games
edwardchalstrey1 Mar 2, 2026
d1f4901
Add links from the main catalog page to API reference and developer docs
edwardchalstrey1 Mar 2, 2026
8820a4d
clarify docstring
edwardchalstrey1 Mar 2, 2026
8077cd6
update filter tests to assert the first game of the returned datafram…
edwardchalstrey1 Mar 2, 2026
09f2a33
Only assert the filter criteria when at least one game returned
edwardchalstrey1 Mar 2, 2026
0b30460
Catalog/761 (#793)
edwardchalstrey1 Mar 11, 2026
1f72f48
Merge branch 'master' into catalog/758
edwardchalstrey1 Mar 11, 2026
57fec10
Merge branch 'master' into catalog/758
edwardchalstrey1 Mar 19, 2026
d8129c5
complete merge for catalog tests
edwardchalstrey1 Mar 19, 2026
6342fe1
update test_catalog_games to check for family games
edwardchalstrey1 Mar 19, 2026
48dd30a
update biblio links in EFGs
edwardchalstrey1 Mar 19, 2026
67076e5
reference bibliography in updating the catalog
edwardchalstrey1 Mar 19, 2026
93cae0e
update bagwell biblio link
edwardchalstrey1 Mar 19, 2026
8faf7d0
Merge branch 'master' into catalog/758
edwardchalstrey1 Mar 19, 2026
9b89655
update biblio
edwardchalstrey1 Mar 19, 2026
ac15fb8
remove rogue underscores
edwardchalstrey1 Mar 19, 2026
5c1fd87
Harvard style in biblio.rst; Reiley and Bagwell to general papers; Wa…
rahulsavani Mar 19, 2026
6821e24
docs: Add developer notes for the catalog module and its packaging.
edwardchalstrey1 Mar 24, 2026
5cc9571
revise update script to single column
edwardchalstrey1 Mar 24, 2026
9130d7f
add format to df returned by games()
edwardchalstrey1 Mar 24, 2026
ffcae37
Further edits to update.py
edwardchalstrey1 Mar 24, 2026
cce0284
dont include catalog games without description
edwardchalstrey1 Mar 24, 2026
0baeb8c
Ignore NFG for now since there are none in the catalog
edwardchalstrey1 Mar 24, 2026
0e81a04
remove family games code
edwardchalstrey1 Mar 24, 2026
1ea66cc
remove game family test
edwardchalstrey1 Mar 24, 2026
de82854
Use readthedocs biblio links in EFG files
edwardchalstrey1 Mar 24, 2026
4c6e901
update links in watson games
edwardchalstrey1 Mar 24, 2026
01fd96b
add missing underscore
edwardchalstrey1 Mar 24, 2026
aae1504
update how to include the game files
edwardchalstrey1 Mar 24, 2026
90b1c7a
Merge branch 'master' into catalog/758
edwardchalstrey1 Mar 24, 2026
3b014b4
remove coded games section of doc
edwardchalstrey1 Mar 24, 2026
d434613
update homepage with catalog
edwardchalstrey1 Mar 24, 2026
292a3fe
refactor: Adjust grid-item-card column widths and reorder sections in…
edwardchalstrey1 Mar 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,4 @@ Gambit.app/*
build_support/msw/gambit.wxs
build_support/osx/Info.plist
src/pygambit/catalog
doc/catalog.csv
doc/catalog_table.rst
106 changes: 99 additions & 7 deletions build_support/catalog/update.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,106 @@
import argparse
from pathlib import Path

import pandas as pd

import pygambit as gbt

CATALOG_CSV = Path(__file__).parent.parent.parent / "doc" / "catalog.csv"
CATALOG_RST_TABLE = Path(__file__).parent.parent.parent / "doc" / "catalog_table.rst"
CATALOG_DIR = Path(__file__).parent.parent.parent / "catalog"
MAKEFILE_AM = Path(__file__).parent.parent.parent / "Makefile.am"


def _write_efg_table(df: pd.DataFrame, f):
"""Write the EFG games list-table to file handle f."""
f.write(".. list-table::\n")
f.write(" :header-rows: 1\n")
f.write(" :widths: 100\n")
f.write(" :class: tight-table\n")
f.write("\n")
f.write(" * - **Extensive form games**\n")

efg_df = df[df["Format"] == "efg"]
for _, row in efg_df.iterrows():
slug = row["Game"]
title = str(row.get("Title", "")).strip()
description = str(row.get("Description", "")).strip()
# Skip any games which lack a description
if description:
# Main dropdown
f.write(f" * - .. dropdown:: {title}\n")
f.write(" :open:\n")
f.write(" \n")
for line in description.splitlines():
f.write(f" {line}\n")
f.write(" \n")
f.write(" **Load in PyGambit:**\n")
f.write(" \n")
f.write(" .. code-block:: python\n")
f.write(" \n")
f.write(f' pygambit.catalog.load("{slug}")\n')
f.write(" \n")

# Download links (inside the dropdown)
download_links = [row["Download"]]
f.write(" **Download:**\n")
f.write(" \n")
f.write(f" {' '.join(download_links)}\n")
f.write(" \n")


# def _write_nfg_table(df: pd.DataFrame, f):
# """Write the NFG games list-table to file handle f."""
# f.write(".. list-table::\n")
# f.write(" :header-rows: 1\n")
# f.write(" :widths: 100\n")
# f.write(" :class: tight-table\n")
# f.write("\n")
# f.write(" * - **Strategic form games**\n")

# nfg_df = df[df["Format"] == "nfg"]
# for _, row in nfg_df.iterrows():
# slug = row["Game"]

# # Title as plain text header
# f.write(" * - \n")
# f.write(" \n")

# # Jupyter-execute block (no dropdown)
# f.write(" .. jupyter-execute::\n")
# f.write(" \n")
# f.write(" import pygambit\n")
# f.write(f' pygambit.catalog.load("{slug}")\n')
# f.write(" \n")

# # Download link (plain, no dropdown)
# f.write(f" :download:`{slug}.nfg <../catalog/{slug}.nfg>`\n")
# f.write(" \n")


def generate_rst_table(df: pd.DataFrame, rst_path: Path):
"""Generate RST output with two list-tables: one for EFG and one for NFG games."""

with open(rst_path, "w", encoding="utf-8") as f:
# TOC linking to both sections
# f.write(".. contents::\n")
# f.write(" :local:\n")
# f.write(" :depth: 1\n")
# f.write("\n")

# EFG section
# f.write("Extensive form games\n")
# f.write("--------------------\n")
# f.write("\n")
_write_efg_table(df, f)
# f.write("\n")

# # NFG section
# f.write("Strategic form games\n")
# f.write("--------------------\n")
# f.write("\n")
# _write_nfg_table(df, f)


def update_makefile():
"""Update the Makefile.am with all games from the catalog."""

Expand Down Expand Up @@ -60,15 +153,14 @@ def update_makefile():


if __name__ == "__main__":

parser = argparse.ArgumentParser()
parser.add_argument("--build", action="store_true")
args = parser.parse_args()

# Create CSV used by RST docs page
gbt.catalog.games().to_csv(CATALOG_CSV, index=False)
print(f"Generated {CATALOG_CSV} for use in local docs build. DO NOT COMMIT.")

# Update the Makefile.am with the current list of catalog files
# Create RST list-table used by doc/catalog.rst
df = gbt.catalog.games(include_descriptions=True)
generate_rst_table(df, CATALOG_RST_TABLE)
print(f"Generated {CATALOG_RST_TABLE} for use in local docs build. DO NOT COMMIT.")
if args.build:
# Update the Makefile.am with the current list of catalog files
update_makefile()
151 changes: 134 additions & 17 deletions catalog/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from importlib.resources import as_file, files
from pathlib import Path
from typing import Any

import pandas as pd

Expand All @@ -17,44 +18,160 @@
def load(slug: str) -> gbt.Game:
"""
Load a game from the package catalog.

Parameters
----------
slug : str
The slug of the game to load.

Returns
-------
gbt.Game
The loaded game.

Raises
------
FileNotFoundError
If the game does not exist in the catalog.
"""
slug = str(Path(slug)).replace("\\", "/")

# Try to load from file
for suffix, reader in READERS.items():
resource_path = _CATALOG_RESOURCE / f"{slug}{suffix}"

if resource_path.is_file():
# as_file ensures we have a real filesystem path for the reader
with as_file(resource_path) as path:
return reader(str(path))

raise FileNotFoundError(f"No catalog entry called {slug}.nfg or {slug}.efg")


def games() -> pd.DataFrame:
# Raise error if game does not exist
raise FileNotFoundError(f"No catalog entry called {slug}")


def games(
n_actions: int | None = None,
n_contingencies: int | None = None,
n_infosets: int | None = None,
is_const_sum: bool | None = None,
is_perfect_recall: bool | None = None,
is_tree: bool | None = None,
min_payoff: float | None = None,
max_payoff: float | None = None,
n_nodes: int | None = None,
n_outcomes: int | None = None,
n_players: int | None = None,
n_strategies: int | None = None,
include_descriptions: bool = False,
) -> pd.DataFrame:
"""
List games available in the package catalog, including subdirectories.
List games available in the package catalog.

Most arguments are treated as filters on the
attributes of the Game objects.

Parameters
----------
n_actions: int, optional
The number of actions in the game. Only extensive games are returned.
n_contingencies: int, optional
The number of contingencies in the game.
n_infosets: int, optional
The number of information sets in the game. Only extensive games are returned.
is_const_sum: bool, optional
Whether the game is constant-sum.
is_perfect_recall: bool, optional
Whether the game has perfect recall.
is_tree: bool, optional
Whether the game is an extensive game (a tree).
min_payoff: float, optional
The minimum payoff in the game. Games returned have `min_payoff >= value`.
max_payoff: float, optional
The maximum payoff in the game. Games returned have `max_payoff <= value`.
n_nodes: int, optional
The number of nodes in the game. Only extensive games are returned.
n_outcomes: int, optional
The number of outcomes in the game.
n_players: int, optional
The number of players in the game.
n_strategies: int, optional
The number of pure strategies in the game.
include_descriptions: bool, optional
Whether to include the description of each game in the returned DataFrame.
Defaults to False.

Returns
-------
pd.DataFrame
A DataFrame with columns "Game" and "Title", where "Game" is the slug to load the game.
If `include_descriptions=True`, the DataFrame will also include a "Description" column.
"""
records: list[dict[str, str]] = []

# Using rglob("*") to find files in all subdirectories
records: list[dict[str, Any]] = []

def check_filters(game: gbt.Game) -> bool:
if n_actions is not None:
if not game.is_tree:
return False
if len(game.actions) != n_actions:
return False
if n_contingencies is not None and len(game.contingencies) != n_contingencies:
return False
if n_infosets is not None:
if not game.is_tree:
return False
if len(game.infosets) != n_infosets:
return False
if is_const_sum is not None and game.is_const_sum != is_const_sum:
return False
if is_perfect_recall is not None and game.is_perfect_recall != is_perfect_recall:
return False
if is_tree is not None and game.is_tree != is_tree:
return False
if min_payoff is not None and game.min_payoff < min_payoff:
return False
if max_payoff is not None and game.max_payoff > max_payoff:
return False
if n_nodes is not None:
if not game.is_tree:
return False
if len(game.nodes) != n_nodes:
return False
if n_outcomes is not None and len(game.outcomes) != n_outcomes:
return False
if n_players is not None and len(game.players) != n_players:
return False
return not (n_strategies is not None and len(game.strategies) != n_strategies)

def append_record(
slug: str,
game: gbt.Game,
) -> None:
record = {
"Game": slug,
"Title": game.title,
}
if include_descriptions:
record["Description"] = game.description
ext = "efg" if game.is_tree else "nfg"
record["Download"] = f":download:`{slug}.{ext} <../catalog/{slug}.{ext}>`"
record["Format"] = ext
records.append(record)

# Add all the games stored as EFG/NFG files
for resource_path in sorted(_CATALOG_RESOURCE.rglob("*")):
reader = READERS.get(resource_path.suffix)

if reader is not None and resource_path.is_file():

# Calculate the path relative to the root resource
# and remove the suffix to get the "slug"
rel_path = resource_path.relative_to(_CATALOG_RESOURCE)
slug = rel_path.with_suffix("").as_posix()

with as_file(resource_path) as path:
game = reader(str(path))
records.append(
{
"Game": slug,
"Title": game.title,
}
)
if check_filters(game):
append_record(slug, game)

if include_descriptions:
return pd.DataFrame.from_records(
records, columns=["Game", "Title", "Description", "Download", "Format"]
)
return pd.DataFrame.from_records(records, columns=["Game", "Title"])
5 changes: 1 addition & 4 deletions catalog/bagwell1995.efg
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
EFG 2 R "Bagwell (GEB 1995) commitment and (un)observability" { "Player 1" "Player 2" }
"This is a Stackelberg-type game with imperfectly observed commitment, following the
analysis of Bagwell [^Bag1995]. The outcomes and payoffs are the same as in Bagwell's
analysis of `Bag1995 <https://gambitproject.readthedocs.io/en/latest/biblio.html#Bag1995>`_. The outcomes and payoffs are the same as in Bagwell's
model. This example sets the probability that the follower 'correctly' observes the
leader's action as .99 (99/100). The key result is that the only pure-strategy
equilibrium that survives if observability is imperfect is the one in which players
choose the actions that would form an equilibrium if the game was a *simultaneous-move*
game. There is an equilibrium in which the 'Stackelberg' action is played with high
probability, but strictly less than one.

[^Bag1995]: Bagwell, Kyle (1995) Commitment and observability in games.
_Games and Economic Behavior_ 8: 271-280.
"

p "" 1 1 "" { "S" "C" } 0
Expand Down
10 changes: 2 additions & 8 deletions catalog/myerson1991/fig2_1.efg
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
EFG 2 R "A simple Poker game" { "Fred" "Alice" }
"This is a simple game of one-card poker from Myerson [^Mye91], used as the
"This is a simple game of one-card poker from `Mye91 <https://gambitproject.readthedocs.io/en/latest/biblio.html#Mye91>`_, used as the
introductory example for game models.

Note that as specified in the text, the game has the slightly unusual feature
that folding with the high (red) card results in the player winning rather than
losing.

See also
--------
reiley2008/fig1
See also `Rei2008 <https://gambitproject.readthedocs.io/en/latest/biblio.html#Rei2008>`_
Another one-card poker game where folding with the high card is a loss rather
than a win.


[^Mye1991]: Myerson, Roger B. (1991) Game Theory: Analysis of Conflict.
Cambridge: Harvard University Press.
"

c "" 1 "" { "Red" 1/2 "Black" 1/2 } 0
Expand Down
5 changes: 1 addition & 4 deletions catalog/myerson1991/fig4_2.efg
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
EFG 2 R "Myerson (1991) Figure 4.2" { "Player 1" "Player 2" }
"An example from Myerson [^Mye1991] which illustrates the distinction between
"An example from `Mye91 <https://gambitproject.readthedocs.io/en/latest/biblio.html#Mye91>`_ which illustrates the distinction between
an equilibrium of an extensive form game and an equilibrium of its
(multi)agent representation. The actions B1, Z1, and W2 form a
behavior profile which is an equilibrium in the (multi)agent
representation. However, it is not a Nash equilibrium of the extensive
game, because Player 1 would prefer to switch from (B1, Z1) to
(A1, Y1); the (multi)agent representation rules out such coordinated
deviations across information sets.

[^Mye1991]: Myerson, Roger B. (1991) Game Theory: Analysis of Conflict.
Cambridge: Harvard University Press.
"

p "" 1 1 "" { "A1" "B1" } 0
Expand Down
10 changes: 2 additions & 8 deletions catalog/reiley2008/fig1.efg
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
EFG 2 R "Stripped-down poker (Reiley et al 2008)" { "Professor" "Student" }
"This is a one-card poker game used in [^Rei2008] as a teaching exercise.
"This is a one-card poker game used in `Rei2008 <https://gambitproject.readthedocs.io/en/latest/biblio.html#Rei2008>`_ as a teaching exercise.

See also
--------
myerson1991/fig2_1
See also `Mye91 <https://gambitproject.readthedocs.io/en/latest/biblio.html#Mye91>`_
Another one-card poker game with slightly different rules.

[^Rei2008]: Reiley, David H., Urbancic, Michael B, and Walker, Mark. (2008)
Stripped-Down Poker: A Classroom Game with Signaling and Bluffing.
_The Journal of Economic Education_ 4: 323-341.
"

c "" 1 "" { "King" 1/2 "Queen" 1/2 } 0
Expand Down
Loading
Loading