Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions build_support/catalog/catalog.am
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ CATALOG_FILES = \
catalog/journals/geb/bagwell1995.efg \
catalog/journals/geb/gilboa1997/fig1.efg \
catalog/journals/geb/gilboa1997/fig2.efg \
catalog/journals/geb/wichardt2008.efg \
catalog/journals/ijgt/nau2004/sec3.nfg \
catalog/journals/ijgt/nau2004/sec4.nfg \
catalog/journals/ijgt/nau2004/sec5.nfg \
Expand Down
1 change: 1 addition & 0 deletions build_support/catalog/catalog_hierarchy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ labels:
books/vonstengel2022: "von Stengel (2022) — Game Theory Basics"
books/watson2013: "Watson (2013) — Strategy: An Introduction to Game Theory"
journals/geb/gilboa1997: "Gilboa (1997)"
journals/geb/wichardt2008: "Wichardt (2008)"
journals/ijgt/nau2004: "Nau et al. (2004)"
journals/ijgt/selten1975: "Selten (1975)"
journals/mor/vonstengelforges2008: "von Stengel & Forges (2008)"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
EFG 2 R "Wichardt (2008): 2 players, imperfect recall" { "Player 1" "Player 2" }
""
"The first counterexample showing that finite extensive-form games
with imperfect recall need not have a Nash equilibrium in behaviour strategies"

p "" 1 1 "" { "R" "L" } 0
p "" 1 2 "" { "r" "l" } 0
Expand Down
12 changes: 12 additions & 0 deletions doc/references.bib
Original file line number Diff line number Diff line change
Expand Up @@ -392,3 +392,15 @@ @inbook{Shap74
pages = {175--189},
category = {articles_equilibria}
}


@article{Wichardt2008,
author = {Wichardt, P. C.},
title = {Existence of Nash equilibria in finite extensive form games with imperfect recall: A counterexample},
journal = {Games and Economic Behavior},
volume = {63},
number = {1},
pages = {366--369},
year = {2008},
category = {articles_equilibria}
}
4 changes: 2 additions & 2 deletions tests/test_extensive.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def test_game_add_players_nolabel():

# Games with imperfect recall from files (game_input is a string)
# - imperfect recall without absent-mindedness
("wichardt.efg", False), # forgetting past action; Wichardt (GEB, 2008)
(gbt.catalog.load("journals/geb/wichardt2008"), False), # forgetting past action
("gilboa_two_am_agents.efg", False), # forgetting past information; Gilboa (GEB, 1997)
# - imperfect recall with absent-mindedness
("noPR-AM-driver-one-player.efg", False), # 1 players, one infoset unreached
Expand Down Expand Up @@ -370,7 +370,7 @@ def test_outcome_index_exception_label():
# I M P E R F E C T R E C A L L --- commented out in the test suite
# Wichardt (2008): binary tree of height 3; 2 players; the root player forgets the action
# (
# games.read_from_file("wichardt.efg"),
# gbt.catalog.load("journals/geb/wichardt2008"),
# [["11", "12", "21", "22"], ["1", "2"]],
# [
# np.array([[1, -1], [-5, -5], [-5, -5], [-1, 1]]),
Expand Down
4 changes: 2 additions & 2 deletions tests/test_infosets.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ class AbsentMindednessTestCase:
),
pytest.param(
PriorActionsTestCase(
factory=functools.partial(games.read_from_file, "wichardt.efg"),
factory=functools.partial(gbt.catalog.load, "journals/geb/wichardt2008"),
expected_results=[
("Player 1", 0, {None}),
("Player 1", 1, {("Player 1", 0, "L"), ("Player 1", 0, "R")}),
Expand Down Expand Up @@ -178,7 +178,7 @@ class AbsentMindednessTestCase:
),
pytest.param(
AbsentMindednessTestCase(
factory=functools.partial(games.read_from_file, "wichardt.efg"),
factory=functools.partial(gbt.catalog.load, "journals/geb/wichardt2008"),
expected_am_paths=[]
),
id="wichardt_forgetting_action"
Expand Down
12 changes: 6 additions & 6 deletions tests/test_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ class SubgameRootsTestCase:
# ------------------------------------------------------------------------
pytest.param(
SubgameRootsTestCase(
factory=functools.partial(games.read_from_file, "wichardt.efg"),
factory=functools.partial(gbt.catalog.load, "journals/geb/wichardt2008"),
expected_paths=[[]]
),
id="wichardt_no_nontrivial_subgames"
Expand Down Expand Up @@ -261,7 +261,7 @@ class SubgameStructureTestCase:
# ------------------------------------------------------------------------
pytest.param(
SubgameStructureTestCase(
factory=functools.partial(games.read_from_file, "wichardt.efg"),
factory=functools.partial(gbt.catalog.load, "journals/geb/wichardt2008"),
roots=[[]],
parents={(): None},
children={(): set()},
Expand Down Expand Up @@ -390,7 +390,7 @@ def test_minimal_subgame_for_each_infoset(test_case: SubgameStructureTestCase):
]
),
(
"wichardt.efg",
gbt.catalog.load("journals/geb/wichardt2008"),
[
([], None),
(["R"], ("Player 1", 0, "R")),
Expand Down Expand Up @@ -438,7 +438,7 @@ def test_node_own_prior_action_non_terminal(game_file, expected_node_data):
Tests `node.own_prior_action` for non-terminal nodes.
Also verifies that all terminal nodes return None.
"""
game = games.read_from_file(game_file)
game = game_file if isinstance(game_file, gbt.Game) else games.read_from_file(game_file)

actual_node_data = []

Expand All @@ -461,7 +461,7 @@ def test_node_own_prior_action_non_terminal(game_file, expected_node_data):

@pytest.mark.parametrize("game_file, expected_unreachable_paths", [
# Games without absent-mindedness, where all nodes are reachable
("wichardt.efg", []),
(gbt.catalog.load("journals/geb/wichardt2008"), []),
("subgames.efg", []),

# An absent-minded driver game with an unreachable terminal node
Expand All @@ -482,7 +482,7 @@ def test_is_strategy_reachable(game_file: str, expected_unreachable_paths: list[
converting them to their action-label paths, and comparing the resulting
list of paths against a known-correct list.
"""
game = games.read_from_file(game_file)
game = game_file if isinstance(game_file, gbt.Game) else games.read_from_file(game_file)
nodes = game.nodes

actual_unreachable_paths = [
Expand Down
Loading