diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index a31e9152f..42003ebf7 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -30,7 +30,7 @@ jobs: cd dist sdist=$(ls pygambit-*.tar.gz) pip install -v "${sdist}[test,doc]" - pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.9.1" + pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.11.0" - name: Run tests run: pytest --run-tutorials @@ -53,7 +53,7 @@ jobs: - name: Build extension run: | python -m pip install -v .[test,doc] - pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.9.1" + pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.11.0" - name: Run tests run: pytest --run-tutorials @@ -76,7 +76,7 @@ jobs: - name: Build extension run: | python -m pip install -v .[test,doc] - pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.9.1" + pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.11.0" - name: Run tests run: pytest --run-tutorials @@ -99,6 +99,6 @@ jobs: - name: Build extension run: | python -m pip install -v .[test,doc] - pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.9.1" + pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.11.0" - name: Run tests run: pytest --run-tutorials diff --git a/.readthedocs.yml b/.readthedocs.yml index d06f69e2b..74390c37d 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -17,7 +17,7 @@ build: - pdf2svg jobs: post_install: - - pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.9.1" + - pip install "draw-tree @ git+https://github.com/gambitproject/draw_tree.git@v0.11.0" # Create RST for catalog table in docs - $READTHEDOCS_VIRTUALENV_PATH/bin/python build_support/catalog/update.py diff --git a/build_support/catalog/catalog.am b/build_support/catalog/catalog.am index 58c225f42..c540b730a 100644 --- a/build_support/catalog/catalog.am +++ b/build_support/catalog/catalog.am @@ -1,6 +1,25 @@ CATALOG_FILES = \ + catalog/books/bonanno18/fig12_18.efg \ + catalog/books/bonanno18/fig3_1.efg \ + catalog/books/bonanno18/fig3_10.efg \ + catalog/books/bonanno18/fig3_17.efg \ + catalog/books/bonanno18/fig4_17.efg \ + catalog/books/bonanno18/fig4_19.efg \ + catalog/books/bonanno18/fig4_26.efg \ + catalog/books/bonanno18/fig4_3.efg \ + catalog/books/bonanno18/fig4_40.efg \ + catalog/books/bonanno18/fig4_5.efg \ catalog/books/myerson1991/fig2_1.efg \ catalog/books/myerson1991/fig4_2.efg \ + catalog/books/shohambrown2008/fig5_1.efg \ + catalog/books/shohambrown2008/fig5_10.efg \ + catalog/books/shohambrown2008/fig5_11.efg \ + catalog/books/shohambrown2008/fig5_12.efg \ + catalog/books/shohambrown2008/fig5_15.efg \ + catalog/books/shohambrown2008/fig5_2.efg \ + catalog/books/shohambrown2008/fig5_9.efg \ + catalog/books/shohambrown2008/fig6_2.efg \ + catalog/books/shohambrown2008/fig6_8.efg \ catalog/books/vonstengel2022/fig10.1.efg \ catalog/books/vonstengel2022/fig10.12.efg \ catalog/books/vonstengel2022/fig10.5.efg \ diff --git a/build_support/catalog/catalog_hierarchy.yaml b/build_support/catalog/catalog_hierarchy.yaml index 9280493a6..55aa115a7 100644 --- a/build_support/catalog/catalog_hierarchy.yaml +++ b/build_support/catalog/catalog_hierarchy.yaml @@ -14,6 +14,8 @@ labels: books/myerson1991: "Myerson (1991) — Game Theory: Analysis of Conflict" books/vonstengel2022: "von Stengel (2022) — Game Theory Basics" books/watson2013: "Watson (2013) — Strategy: An Introduction to Game Theory" + books/shohambrown2008: "Shoham and Leyton-Brown (2008) — Multiagent Systems, Algorithmic, Game-Theoretic, and Logical Foundations" + books/bonanno18: "Giacomo Bonanno (2018) — Game Theory" journals/geb/gilboa1997: "Gilboa (1997)" journals/geb/wichardt2008: "Wichardt (2008)" journals/ijgt/nau2004: "Nau et al. (2004)" diff --git a/build_support/catalog/draw_tree_settings.yaml b/build_support/catalog/draw_tree_settings.yaml index d0b414f55..1a4fe1459 100644 --- a/build_support/catalog/draw_tree_settings.yaml +++ b/build_support/catalog/draw_tree_settings.yaml @@ -31,3 +31,60 @@ overrides: sublevel_scaling: 0.5 journals/geb/gilboa1997/fig1: action_label_dist: 5.0 + books/shohambrown2008/fig5_12: + action_label_dist: 5.0 + width_scaling: 0.75 + books/shohambrown2008/fig6_2: + action_label_dist: 5.0 + books/shohambrown2008/fig6_8: + sublevel_scaling: 1 + action_label_dist: 5.0 + books/bonanno18/fig12_18: + scale_factor: 1.0 + level_scaling: 1.0 + sublevel_scaling: 1.0 + width_scaling: 2.0 + shared_terminal_depth: false + action_label_position_by: player + action_label_dist: 1.5 + vary_action_label_positions: true + vary_action_label_positions_by: player + label_bg: + 3: true + label_bg_opacity: 0.8 + vary_action_label_positions_choices: + - 3 + books/bonanno18/fig3_10: + width_scaling: 1.6 + books/bonanno18/fig3_17: + action_label_position: 0.8 + books/bonanno18/fig4_17: + sublevel_scaling: 1.0 + action_label_position: 0.35 + width_scaling: 1.25 + books/bonanno18/fig4_19: + sublevel_scaling: 0 + shared_terminal_depth: true + action_label_position_by: player + label_bg: + 0: true + label_bg_color: white + label_bg_opacity: 0.8 + books/bonanno18/fig4_3: + sublevel_scaling: 0.5 + width_scaling: 1.25 + action_label_position_by: player + vary_action_label_positions: true + vary_action_label_positions_by: player + label_bg: + 3: true + vary_action_label_positions_choices: + - 3 + books/bonanno18/fig4_40: + sublevel_scaling: 1 + shared_terminal_depth: true + action_label_position_by: player + label_bg: + 0: true + label_bg_color: white + label_bg_opacity: 0.8 diff --git a/build_support/catalog/test_update.py b/build_support/catalog/test_update.py index b3abfa56b..9f88e39f2 100644 --- a/build_support/catalog/test_update.py +++ b/build_support/catalog/test_update.py @@ -147,6 +147,27 @@ def _make_image_files(catalog_dir, slug, fmt="efg"): (img_dir / f"{slug}.ef").touch() +# --------------------------------------------------------------------------- +# Tests for catalog resource selection +# --------------------------------------------------------------------------- + + +@pytest.mark.catalog_update +class TestCatalogResourceSelection: + """Tests for selecting the catalog source used by update.py.""" + + def test_use_catalog_dir_overrides_stale_package_catalog(self, tmp_path, monkeypatch): + """The updater points pygambit's catalog helpers at the local catalog dir.""" + stale_catalog = tmp_path / "stale_catalog_data" + local_catalog = tmp_path / "catalog" + monkeypatch.setattr(update.gbt.catalog, "_CATALOG_RESOURCE", stale_catalog) + + selected = update.use_catalog_dir(local_catalog) + + assert selected == local_catalog + assert local_catalog == update.gbt.catalog._CATALOG_RESOURCE + + # --------------------------------------------------------------------------- # Tests for catalog_draw_tree_settings # --------------------------------------------------------------------------- diff --git a/build_support/catalog/update.py b/build_support/catalog/update.py index ccfb77634..c7c530770 100644 --- a/build_support/catalog/update.py +++ b/build_support/catalog/update.py @@ -17,6 +17,17 @@ SUPPORTED_GAME_FORMATS = {"efg", "nfg"} +def use_catalog_dir(catalog_dir: Path | None = None) -> Path: + """Point pygambit's catalog helpers at this checkout's catalog directory. + + update.py is a source-tree maintenance script, so it should not read stale + package-data copies from an installed or previously built pygambit. + """ + catalog_dir = catalog_dir or CATALOG_DIR + gbt.catalog._CATALOG_RESOURCE = catalog_dir + return catalog_dir + + def catalog_draw_tree_settings(slug: str) -> dict: """Return the draw_tree settings for a given catalog slug.""" with open(DRAW_TREE_SETTINGS_CONFIG, encoding="utf-8") as f: @@ -408,11 +419,18 @@ def update_makefile( ) args = parser.parse_args() + catalog_dir = use_catalog_dir() + # Create RST list-table used by doc/catalog.rst df = gbt.catalog.games(include_descriptions=True) _warn_missing_descriptions(df) - generate_rst_table(df, CATALOG_RST_TABLE, regenerate_images=args.regenerate_images) + generate_rst_table( + df, + CATALOG_RST_TABLE, + regenerate_images=args.regenerate_images, + catalog_dir=catalog_dir, + ) 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() + update_makefile(catalog_dir=catalog_dir) diff --git a/catalog/books/bonanno18/fig12_18.efg b/catalog/books/bonanno18/fig12_18.efg new file mode 100644 index 000000000..bc9471e22 --- /dev/null +++ b/catalog/books/bonanno18/fig12_18.efg @@ -0,0 +1,23 @@ +EFG 2 R "Fig 12.18 from Bonanno (2018)" { "Player 1" "Player 2" "Player 3" } +" +Fig 12.18 from :cite:p:`Gia18`. + +This is a game from exercise 12.5. +" + +p "" 1 1 "" { "Off" "On" } 0 +p "" 2 1 "" { "Off" "On" } 0 +p "" 3 1 "" { "Guess (Off,Off)" "Guess (Off,On)" "Guess (On,Off)" } 0 +t "" 1 "All 200 (correct guess)" { 200, 200, 200 } +t "" 2 "P1 correct, P2 wrong, P3 gets 50" { 100, 0, 50 } +t "" 3 "P2 correct, P1 wrong, P3 gets 50" { 0, 100, 50 } +p "" 3 1 "" { "Guess (Off,Off)" "Guess (Off,On)" "Guess (On,Off)" } 0 +t "" 2 "P1 correct, P2 wrong, P3 gets 50" { 100, 0, 50 } +t "" 1 "All 200 (correct guess)" { 200, 200, 200 } +t "" 4 "All 0 (guess entirely wrong)" { 0, 0, 0 } +p "" 2 1 "" { "Off" "On" } 0 +p "" 3 1 "" { "Guess (Off,Off)" "Guess (Off,On)" "Guess (On,Off)" } 0 +t "" 3 "P2 correct, P1 wrong, P3 gets 50" { 0, 100, 50 } +t "" 4 "All 0 (guess entirely wrong)" { 0, 0, 0 } +t "" 1 "All 200 (correct guess)" { 200, 200, 200 } +t "" 5 "Both On -> immediate payoffs" { 100, 100, 300 } \ No newline at end of file diff --git a/catalog/books/bonanno18/fig3_1.efg b/catalog/books/bonanno18/fig3_1.efg new file mode 100644 index 000000000..830f00207 --- /dev/null +++ b/catalog/books/bonanno18/fig3_1.efg @@ -0,0 +1,14 @@ +EFG 2 R "Fig 3.1 from Bonanno (2018)" { "Amy" "Beth" } +" +Fig 3.1 from :cite:p:`Gia18`. + +This is an ultimatum game. +" + +p "" 1 1 "" { "50-50" "70-30" } 0 +p "" 2 1 "" { "Accept" "Reject" } 0 +t "" 1 "50-50 Accept" { 50000, 50000 } +t "" 2 "Litigation" { 40000, 20000 } +p "" 2 2 "" { "Accept" "Reject" } 0 +t "" 3 "70-30 Accept" { 70000, 30000 } +t "" 2 "Litigation" { 40000, 20000 } \ No newline at end of file diff --git a/catalog/books/bonanno18/fig3_10.efg b/catalog/books/bonanno18/fig3_10.efg new file mode 100644 index 000000000..2b3ef1da9 --- /dev/null +++ b/catalog/books/bonanno18/fig3_10.efg @@ -0,0 +1,12 @@ +EFG 2 R "Fig 3.10 from Bonanno (2018)" { "Entrant" "Incumbent" } +" +Fig 3.10 from :cite:p:`Gia18`. + +This is a market entry game. +" + +p "" 1 1 "" { "Enter" "Stay out" } 0 +p "" 2 1 "" { "Fight" "Accommodate" } 0 +t "" 2 "Fight (both 0)" { 0, 0 } +t "" 3 "Accommodate (both 2)" { 2, 2 } +t "" 1 "Stay out (Entrant=1, Incumbent=5)" { 1, 5 } \ No newline at end of file diff --git a/catalog/books/bonanno18/fig3_17.efg b/catalog/books/bonanno18/fig3_17.efg new file mode 100644 index 000000000..2a31291aa --- /dev/null +++ b/catalog/books/bonanno18/fig3_17.efg @@ -0,0 +1,26 @@ +EFG 2 R "Fig 3.17 from Bonanno (2018)" { "A" "B" "C" } +" +Fig 3.17 from :cite:p:`Gia18`. + +This is a board voting game from exercise 3.2. +" + +p "" 1 1 "" { "Promote" "Keep" "Fire" } 0 +p "" 2 1 "" { "Accept" "Disagree" } 0 +t "" 1 "Promote" { 3, 1, 2 } +p "" 3 1 "" { "Promote" "Keep" "Fire" } 0 +t "" 1 "Promote" { 3, 1, 2 } +t "" 2 "Keep" { 2, 3, 1 } +t "" 3 "Fire" { 1, 2, 3 } +p "" 2 2 "" { "Accept" "Disagree" } 0 +t "" 2 "Keep" { 2, 3, 1 } +p "" 3 2 "" { "Promote" "Keep" "Fire" } 0 +t "" 1 "Promote" { 3, 1, 2 } +t "" 2 "Keep" { 2, 3, 1 } +t "" 3 "Fire" { 1, 2, 3 } +p "" 2 3 "" { "Accept" "Disagree" } 0 +t "" 3 "Fire" { 1, 2, 3 } +p "" 3 3 "" { "Promote" "Keep" "Fire" } 0 +t "" 1 "Promote" { 3, 1, 2 } +t "" 2 "Keep" { 2, 3, 1 } +t "" 3 "Fire" { 1, 2, 3 } \ No newline at end of file diff --git a/catalog/books/bonanno18/fig4_17.efg b/catalog/books/bonanno18/fig4_17.efg new file mode 100644 index 000000000..05a13c53f --- /dev/null +++ b/catalog/books/bonanno18/fig4_17.efg @@ -0,0 +1,22 @@ +EFG 2 R "Fig 4.17 from Bonanno (2018)" { "Adele" "Ben" } +" +Fig 4.17 from :cite:p:`Gia18`. + +This is an example for chance moves in EFGs. +" + +c "" 1 "" { "Black" 1/3 "Red" 2/3 } 0 +p "" 1 1 "" { "Say Black" "Say Red" } 0 +p "" 2 1 "" { "Guess Black" "Guess Red" } 0 +t "" 1 "Ben correct" { -9, 9 } +t "" 2 "Ben incorrect" { 9, -9 } +p "" 2 2 "" { "Guess Black" "Guess Red" } 0 +t "" 1 "Ben correct" { -9, 9 } +t "" 2 "Ben incorrect" { 9, -9 } +p "" 1 2 "" { "Say Black" "Say Red" } 0 +p "" 2 1 "" { "Guess Black" "Guess Red" } 0 +t "" 2 "Ben incorrect" { 9, -9 } +t "" 1 "Ben correct" { -9, 9 } +p "" 2 2 "" { "Guess Black" "Guess Red" } 0 +t "" 2 "Ben incorrect" { 9, -9 } +t "" 1 "Ben correct" { -9, 9 } \ No newline at end of file diff --git a/catalog/books/bonanno18/fig4_19.efg b/catalog/books/bonanno18/fig4_19.efg new file mode 100644 index 000000000..ffc995bb7 --- /dev/null +++ b/catalog/books/bonanno18/fig4_19.efg @@ -0,0 +1,38 @@ +EFG 2 R "Fig 4.19 from Bonanno (2018)" { "Player 1" "Player 2" } +" +Fig 4.19 from :cite:p:`Gia18`. + +This is a game where two players decide whether to exchange envelopes that contain money. +" + +c "" 1 "" { "P1:100 P2:200" 1/6 "P1:100 P2:300" 1/6 "P1:200 P2:100" 1/6 "P1:200 P2:300" 1/6 "P1:300 P2:100" 1/6 "P1:300 P2:200" 1/6 } 0 +p "" 1 1 "" { "Pass" "Request trade" } 0 +t "" 1 "P1 keeps 100, P2 keeps 200" { 100, 200 } +p "" 2 1 "" { "Yes" "No" } 0 +t "" 2 "Traded: P1 200, P2 100" { 200, 100 } +t "" 1 "P1 keeps 100, P2 keeps 200" { 100, 200 } +p "" 1 1 "" { "Pass" "Request trade" } 0 +t "" 3 "P1 keeps 100, P2 keeps 300" { 100, 300 } +p "" 2 1 "" { "Yes" "No" } 0 +t "" 4 "Traded: P1 300, P2 100" { 300, 100 } +t "" 3 "P1 keeps 100, P2 keeps 300" { 100, 300 } +p "" 1 2 "" { "Pass" "Request trade" } 0 +t "" 5 "P1 keeps 200, P2 keeps 100" { 200, 100 } +p "" 2 1 "" { "Yes" "No" } 0 +t "" 6 "Traded: P1 100, P2 200" { 100, 200 } +t "" 5 "P1 keeps 200, P2 keeps 100" { 200, 100 } +p "" 1 2 "" { "Pass" "Request trade" } 0 +t "" 7 "P1 keeps 200, P2 keeps 300" { 200, 300 } +p "" 2 1 "" { "Yes" "No" } 0 +t "" 8 "Traded: P1 300, P2 200" { 300, 200 } +t "" 7 "P1 keeps 200, P2 keeps 300" { 200, 300 } +p "" 1 3 "" { "Pass" "Request trade" } 0 +t "" 9 "P1 keeps 300, P2 keeps 100" { 300, 100 } +p "" 2 1 "" { "Yes" "No" } 0 +t "" 10 "Traded: P1 100, P2 300" { 100, 300 } +t "" 9 "P1 keeps 300, P2 keeps 100" { 300, 100 } +p "" 1 3 "" { "Pass" "Request trade" } 0 +t "" 11 "P1 keeps 300, P2 keeps 200" { 300, 200 } +p "" 2 1 "" { "Yes" "No" } 0 +t "" 12 "Traded: P1 200, P2 300" { 200, 300 } +t "" 11 "P1 keeps 300, P2 keeps 200" { 300, 200 } diff --git a/catalog/books/bonanno18/fig4_26.efg b/catalog/books/bonanno18/fig4_26.efg new file mode 100644 index 000000000..7270bf635 --- /dev/null +++ b/catalog/books/bonanno18/fig4_26.efg @@ -0,0 +1,23 @@ +EFG 2 R "Fig 4.26 from Bonanno (2018)" { "Amy" "Bill" } +" +Fig 4.26 from :cite:p:`Gia18`. + +This is a simple auction where two players bid on a piece of paper. +We add the value of the object, which is not specified in the original description, since this is necessary for determining payoffs. +" + +p "" 1 1 "" { "2" "3" } 0 +p "" 2 1 "" { "2" "3" } 0 +p "" 1 2 "" { "Pass" "Double" } 0 +t "" 1 "A2_B2_Pass" { 0, 8 } +t "" 2 "A4_B2_Double" { 6, 0 } +p "" 1 2 "" { "Pass" "Double" } 0 +t "" 3 "A2_B3_Pass" { 0, 7 } +t "" 4 "A4_B3_Double" { 6, 0 } +p "" 2 1 "" { "2" "3" } 0 +p "" 1 3 "" { "Pass" "Double" } 0 +t "" 5 "A3_B2_Pass" { 7, 0 } +t "" 6 "A6_B2_Double" { 4, 0 } +p "" 1 4 "" { "Pass" "Double" } 0 +t "" 7 "A3_B3_Pass" { 0, 7 } +t "" 8 "A6_B3_Double" { 4, 0 } \ No newline at end of file diff --git a/catalog/books/bonanno18/fig4_3.efg b/catalog/books/bonanno18/fig4_3.efg new file mode 100644 index 000000000..fce55d72b --- /dev/null +++ b/catalog/books/bonanno18/fig4_3.efg @@ -0,0 +1,22 @@ +EFG 2 R "Fig 4.3 from Bonanno (2018)" { "Ann" "Bob" "Carla" } +" +Fig 4.3 from :cite:p:`Gia18`. + +This is an example of imperfect-information games to explain information sets. +" + +p "" 1 1 "" { "Red" "Black" } 0 +p "" 2 1 "" { "Say Red" "Say Black" } 0 +p "" 3 1 "" { "Guess Red" "Guess Black" } 0 +t "" 1 "Carla correct" { -1, -1, 2 } +t "" 2 "Carla incorrect" { 1, 1, -2 } +p "" 3 2 "" { "Guess Red" "Guess Black" } 0 +t "" 1 "Carla correct" { -1, -1, 2 } +t "" 2 "Carla incorrect" { 1, 1, -2 } +p "" 2 2 "" { "Say Red" "Say Black" } 0 +p "" 3 1 "" { "Guess Red" "Guess Black" } 0 +t "" 2 "Carla incorrect" { 1, 1, -2 } +t "" 1 "Carla correct" { -1, -1, 2 } +p "" 3 2 "" { "Guess Red" "Guess Black" } 0 +t "" 2 "Carla incorrect" { 1, 1, -2 } +t "" 1 "Carla correct" { -1, -1, 2 } \ No newline at end of file diff --git a/catalog/books/bonanno18/fig4_40.efg b/catalog/books/bonanno18/fig4_40.efg new file mode 100644 index 000000000..5448a1770 --- /dev/null +++ b/catalog/books/bonanno18/fig4_40.efg @@ -0,0 +1,38 @@ +EFG 2 R "Fig 4.40 from Bonanno (2018)" { "Yvonne" "Zoe" } +" +Fig 4.40 from :cite:p:`Gia18`. + +This is a simplified poker game. +" + +c "" 1 "" { "Y:A,Z:B" 1/6 "Y:A,Z:C" 1/6 "Y:B,Z:A" 1/6 "Y:B,Z:C" 1/6 "Y:C,Z:A" 1/6 "Y:C,Z:B" 1/6 } 0 +p "" 1 1 "" { "Pass" "Bet" } 0 +t "" 1 "Yvonne wins small" { 1, -1 } +p "" 2 1 "" { "Fold" "Meet" } 0 +t "" 1 "Yvonne wins small" { 1, -1 } +t "" 2 "Yvonne wins big" { 2, -2 } +p "" 1 1 "" { "Pass" "Bet" } 0 +t "" 1 "Yvonne wins small" { 1, -1 } +p "" 2 2 "" { "Fold" "Meet" } 0 +t "" 1 "Yvonne wins small" { 1, -1 } +t "" 2 "Yvonne wins big" { 2, -2 } +p "" 1 2 "" { "Pass" "Bet" } 0 +t "" 3 "Zoe wins small" { -1, 1 } +p "" 2 3 "" { "Fold" "Meet" } 0 +t "" 1 "Yvonne wins small" { 1, -1 } +t "" 4 "Zoe wins big" { -2, 2 } +p "" 1 2 "" { "Pass" "Bet" } 0 +t "" 1 "Yvonne wins small" { 1, -1 } +p "" 2 2 "" { "Fold" "Meet" } 0 +t "" 1 "Yvonne wins small" { 1, -1 } +t "" 2 "Yvonne wins big" { 2, -2 } +p "" 1 3 "" { "Pass" "Bet" } 0 +t "" 3 "Zoe wins small" { -1, 1 } +p "" 2 3 "" { "Fold" "Meet" } 0 +t "" 1 "Yvonne wins small" { 1, -1 } +t "" 4 "Zoe wins big" { -2, 2 } +p "" 1 3 "" { "Pass" "Bet" } 0 +t "" 3 "Zoe wins small" { -1, 1 } +p "" 2 1 "" { "Fold" "Meet" } 0 +t "" 1 "Yvonne wins small" { 1, -1 } +t "" 4 "Zoe wins big" { -2, 2 } \ No newline at end of file diff --git a/catalog/books/bonanno18/fig4_5.efg b/catalog/books/bonanno18/fig4_5.efg new file mode 100644 index 000000000..752c507bc --- /dev/null +++ b/catalog/books/bonanno18/fig4_5.efg @@ -0,0 +1,18 @@ +EFG 2 R "Fig 4.5 from Bonanno (2018)" { "Employer" "Yvonne" "Fran" } +" +Fig 4.5 from :cite:p:`Gia18`. + +This is a game where two players interview for the same job. Only one person will be hired. +" + +p "" 1 1 "" { "Call Yvonne" "Call Fran" } 0 +p "" 2 1 "" { "Accept" "Reject" } 0 +t "" 1 "Yvonne accepts first" { 1, 2, 1 } +p "" 3 1 "" { "Accept" "Reject" } 0 +t "" 2 "Fran accepts recycled" { 1, 1, 0 } +t "" 3 "Both reject (unfilled)" { 0, 1, 1 } +p "" 3 1 "" { "Accept" "Reject" } 0 +t "" 4 "Fran accepts first" { 1, 1, 2 } +p "" 2 1 "" { "Accept" "Reject" } 0 +t "" 5 "Yvonne accepts recycled" { 1, 0, 1 } +t "" 3 "Both reject (unfilled)" { 0, 1, 1 } \ No newline at end of file diff --git a/catalog/books/shohambrown2008/fig5_1.efg b/catalog/books/shohambrown2008/fig5_1.efg new file mode 100644 index 000000000..b83e826c9 --- /dev/null +++ b/catalog/books/shohambrown2008/fig5_1.efg @@ -0,0 +1,21 @@ +EFG 2 R "Fig 5.1 from Shoham and Leyton-Brown (2008)" { "1" "2" } + +" +Figure 5.1 from :cite:p:`ShoLeyB08`. +This is a sharing game. Imagine a brother and sister sharing two indivisible and identical presents +from their parents. First the brother suggests a split, which can be one of three-he +keeps both, she keeps both, or they each keep one. Then the sister chooses whether +to accept or reject the split. If she accepts they each get their allocated present(s), +and otherwise neither gets any gift. +" + +p "" 1 1 "" { "2-0" "1-1" "0-2" } 0 +p "" 2 2 "" { "no" "yes" } 0 +t "" 1 "" { 0 0 } +t "" 2 "" { 2 0 } +p "" 2 3 "" { "no" "yes" } 0 +t "" 3 "" { 0 0 } +t "" 4 "" { 1 1 } +p "" 2 4 "" { "no" "yes" } 0 +t "" 5 "" { 0 0 } +t "" 6 "" { 0 2 } diff --git a/catalog/books/shohambrown2008/fig5_10.efg b/catalog/books/shohambrown2008/fig5_10.efg new file mode 100644 index 000000000..94cd759ff --- /dev/null +++ b/catalog/books/shohambrown2008/fig5_10.efg @@ -0,0 +1,16 @@ +EFG 2 R "Fig 5.10 from Shoham and Leyton-Brown (2008)" { "1" "2" } + +" +Figure 5.10 from :cite:p:`ShoLeyB08`. +This is an example of an imperfect-information game. +" + +p "" 1 2 "" { "L" "R" } 0 +p "" 2 3 "" { "A" "B" } 0 +p "" 1 1 "" { "l" "r" } 0 +t "" 1 "" { 0 0 } +t "" 2 "" { 2 4 } +p "" 1 1 0 +t "" 3 "" { 4 2 } +t "" 4 "" { 0 0 } +t "" 5 "" { 0 0 } diff --git a/catalog/books/shohambrown2008/fig5_11.efg b/catalog/books/shohambrown2008/fig5_11.efg new file mode 100644 index 000000000..a972fb90b --- /dev/null +++ b/catalog/books/shohambrown2008/fig5_11.efg @@ -0,0 +1,14 @@ +EFG 2 R "Fig 5.11 from Shoham and Leyton-Brown (2008)" { "1" "2" } + +" +Figure 5.11 from :cite:p:`ShoLeyB08`. +The Prisoner's Dilemma game in extensive form. +" + +p "" 1 2 "" { "C" "D" } 0 +p "" 2 1 "" { "c" "d" } 0 +t "" 1 "" { -1 -1 } +t "" 2 "" { -4 0 } +p "" 2 1 0 +t "" 3 "" { 0 -4 } +t "" 4 "" { -3 -3 } diff --git a/catalog/books/shohambrown2008/fig5_12.efg b/catalog/books/shohambrown2008/fig5_12.efg new file mode 100644 index 000000000..2e08ce364 --- /dev/null +++ b/catalog/books/shohambrown2008/fig5_12.efg @@ -0,0 +1,16 @@ +EFG 2 R "Fig 5.12 from Shoham and Leyton-Brown (2008)" { "1" "2" } + +" +Figure 5.12 from :cite:p:`ShoLeyB08`. +A game with imperfect recall. +Please read carefully about the definition of perfect recall, which infers three types of imperfect recall. +" + + +p "" 1 1 "" { "L" "R" } 0 +p "" 1 1 0 +t "" 1 "" { 1 0 } +t "" 2 "" { 100 100 } +p "" 2 2 "" { "U" "D" } 0 +t "" 3 "" { 5 1 } +t "" 4 "" { 2 2 } diff --git a/catalog/books/shohambrown2008/fig5_15.efg b/catalog/books/shohambrown2008/fig5_15.efg new file mode 100644 index 000000000..8f5a9414f --- /dev/null +++ b/catalog/books/shohambrown2008/fig5_15.efg @@ -0,0 +1,17 @@ +EFG 2 R "Fig 5.15 from Shoham and Leyton-Brown (2008)" { "1" "2" } + +" +Figure 5.15 from :cite:p:`ShoLeyB08`. +A game with imperfect information. +This example shows how a requirement that a substrategy be a best response in +all subgames is too simplistic for defining SPE in games with imperfect information. +" + +p "" 1 2 "" { "L" "C" "R" } 0 +t "" 1 "" { 1 1 } +p "" 2 1 "" { "U" "D" } 0 +t "" 2 "" { 0 1000 } +t "" 3 "" { 0 0 } +p "" 2 1 0 +t "" 4 "" { 1 0 } +t "" 5 "" { 3 1 } diff --git a/catalog/books/shohambrown2008/fig5_2.efg b/catalog/books/shohambrown2008/fig5_2.efg new file mode 100644 index 000000000..5ed1bd189 --- /dev/null +++ b/catalog/books/shohambrown2008/fig5_2.efg @@ -0,0 +1,16 @@ +EFG 2 R "Fig 5.2 from Shoham and Leyton-Brown (2008)" { "1" "2" } + +" +Figure 5.2 from :cite:p:`ShoLeyB08`. +This is an example of a perfect-information game in extensive form. +" + +p "" 1 1 "" { "A" "B" } 0 +p "" 2 2 "" { "C" "D" } 0 +t "" 1 "" { 3 8 } +t "" 2 "" { 8 3 } +p "" 2 3 "" { "E" "F" } 0 +t "" 3 "" { 5 5 } +p "" 1 4 "" { "G" "H" } 0 +t "" 4 "" { 2 10 } +t "" 5 "" { 1 0 } diff --git a/catalog/books/shohambrown2008/fig5_9.efg b/catalog/books/shohambrown2008/fig5_9.efg new file mode 100644 index 000000000..68e2181ea --- /dev/null +++ b/catalog/books/shohambrown2008/fig5_9.efg @@ -0,0 +1,22 @@ +EFG 2 R "Fig 5.9 from Shoham and Leyton-Brown (2008)" { "1" "2" } + +" +Figure 5.9 from :cite:p:`ShoLeyB08`. +This is the centipede game. In this game two players alternate in making decisions, at each +turn choosing between going down and ending the game or going across and +continuing it. +This example is usd to explain the criticisms of backward induction for finding subgame-perfect equilibrium. +Note that centipede is also a parametrized game, with the parameter being the number of rounds. +" + +p "" 1 1 "" { "A" "D" } 0 +t "" 1 "" { 1 0 } +p "" 2 2 "" { "A" "D" } 0 +t "" 2 "" { 0 2 } +p "" 1 3 "" { "A" "D" } 0 +t "" 3 "" { 3 1 } +p "" 2 4 "" { "A" "D" } 0 +t "" 4 "" { 2 4 } +p "" 1 5 "" { "A" "D" } 0 +t "" 5 "" { 4 3 } +t "" 6 "" { 3 5 } diff --git a/catalog/books/shohambrown2008/fig6_2.efg b/catalog/books/shohambrown2008/fig6_2.efg new file mode 100644 index 000000000..6a543e361 --- /dev/null +++ b/catalog/books/shohambrown2008/fig6_2.efg @@ -0,0 +1,38 @@ +EFG 2 R "Fig 6.2 from Shoham and Leyton-Brown (2008)" { "1" "2" } + +" +Figure 6.2 from :cite:p:`ShoLeyB08`. +This is a repeated game, where Prisoner's Dilemma is played twice. +" + +p "" 1 6 "" { "C" "D" } 0 +p "" 2 1 "" { "c" "d" } 0 +p "" 1 7 "" { "C" "D" } 0 +p "" 2 4 "" { "c" "d" } 0 +t "" 1 "" { -2 -2 } +t "" 2 "" { -5 -1 } +p "" 2 4 0 +t "" 3 "" { -1 -5 } +t "" 4 "" { -4 -4 } +p "" 1 8 "" { "C" "D" } 0 +p "" 2 5 "" { "c" "d" } 0 +t "" 5 "" { -5 -1 } +t "" 6 "" { -8 0 } +p "" 2 5 0 +t "" 7 "" { -4 -4 } +t "" 8 "" { -7 -3 } +p "" 2 1 0 +p "" 1 9 "" { "C" "D" } 0 +p "" 2 2 "" { "c" "d" } 0 +t "" 9 "" { -1 -5 } +t "" 10 "" { -4 -4 } +p "" 2 2 0 +t "" 11 "" { 0 -8 } +t "" 12 "" { -3 -7 } +p "" 1 10 "" { "C" "D" } 0 +p "" 2 3 "" { "c" "d" } 0 +t "" 13 "" { -4 -4 } +t "" 14 "" { -7 -3 } +p "" 2 3 0 +t "" 15 "" { -3 -7 } +t "" 16 "" { -6 -6 } diff --git a/catalog/books/shohambrown2008/fig6_8.efg b/catalog/books/shohambrown2008/fig6_8.efg new file mode 100644 index 000000000..08e0e3cba --- /dev/null +++ b/catalog/books/shohambrown2008/fig6_8.efg @@ -0,0 +1,36 @@ +EFG 2 R "Fig 6.8 from Shoham and Leyton-Brown (2008)" { "1" "2" } + +" +Figure 6.8 from :cite:p:`ShoLeyB08`. +This is a Bayesian game, represented in EFG with Nature deciding the types. +" + +c "" 5 "" { "MP" 1/4 "PD" 1/4 "Coord" 1/4 "BoS" 1/4 } 0 +p "" 1 1 "" { "U" "D" } 0 +p "" 2 3 "" { "L" "R" } 0 +t "" 1 "" { 2 0 } +t "" 2 "" { 0 2 } +p "" 2 3 0 +t "" 3 "" { 0 2 } +t "" 4 "" { 2 0 } +p "" 1 1 0 +p "" 2 4 "" { "L" "R" } 0 +t "" 5 "" { 2 2 } +t "" 6 "" { 0 3 } +p "" 2 4 0 +t "" 7 "" { 3 0 } +t "" 8 "" { 1 1 } +p "" 1 2 "" { "U" "D" } 0 +p "" 2 3 0 +t "" 9 "" { 2 2 } +t "" 10 "" { 0 0 } +p "" 2 3 0 +t "" 11 "" { 0 0 } +t "" 12 "" { 1 1 } +p "" 1 2 0 +p "" 2 4 0 +t "" 13 "" { 2 1 } +t "" 14 "" { 0 0 } +p "" 2 4 0 +t "" 15 "" { 0 0 } +t "" 16 "" { 1 2 } diff --git a/doc/references.bib b/doc/references.bib index 4c17e1cf8..61d2c7943 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -409,5 +409,30 @@ @book{ShoLeyB08 title={Multiagent systems: Algorithmic, game-theoretic, and logical foundations}, author={Shoham, Yoav and Leyton-Brown, Kevin}, year={2008}, - publisher={Cambridge University Press} + publisher={Cambridge University Press}, + category = {textbooks} } + +@book{OsbRub94, + title={A course in game theory}, + author={Osborne, Martin J and Rubinstein, Ariel}, + year={1994}, + publisher={MIT press}, + category = {textbooks} +} + +@book{Gia18, + title={Game theory}, + author={Giacomo Bonanno}, + year={2018}, + publisher={CreateSpace Independent Publishing Platform}, + category = {textbooks} +} + +@book{NiouOrde15, + title={Strategy and politics: an introduction to game theory}, + author={Niou, Emerson and Ordeshook, Peter C}, + year={2015}, + publisher={Routledge}, + category = {textbooks} +} \ No newline at end of file