diff --git a/tests/fixtures/efg/4cards_large_game.efg b/tests/fixtures/efg/4cards_large_game.efg index 09deeac..023552a 100644 --- a/tests/fixtures/efg/4cards_large_game.efg +++ b/tests/fixtures/efg/4cards_large_game.efg @@ -4,20 +4,20 @@ From Gambit's sample games " c "" 1 "" { "A-K" 1/12 "A-Q" 1/12 "A-J" 1/12 "K-A" 1/12 "K-Q" 1/12 "K-J" 1/12 "Q-A" 1/12 "Q-K" 1/12 "Q-J" 1/12 "J-A" 1/12 "J-K" 1/12 "J-Q" 1/12 } 0 -p "player 1" 1 1 "A" { "raise" "check" } 0 -p "player 2" 2 1 "1rK" { "call" "fold" } 0 +p "" 1 1 "A" { "raise" "check" } 0 +p "" 2 1 "1rK" { "call" "fold" } 0 t "" 1 "Outcome 1" { 3, -1 } t "" 2 "Outcome 2" { 2, 0 } -p "player 2" 2 2 "1pK" { "raise" "check" } 0 -p "player 1" 1 2 "1p2rA" { "call" "fold" } 0 +p "" 2 2 "1pK" { "raise" "check" } 0 +p "" 1 2 "1p2rA" { "call" "fold" } 0 t "" 1 "Outcome 1" { 3, -1 } t "" 3 "Outcome 3" { 0, 2 } t "" 2 "Outcome 2" { 2, 0 } p "" 1 1 "A" { "raise" "check" } 0 -p "player 2" 2 3 "1rQ" { "call" "fold" } 0 +p "" 2 3 "1rQ" { "call" "fold" } 0 t "" 1 "Outcome 1" { 3, -1 } t "" 2 "Outcome 2" { 2, 0 } -p "player 2" 2 4 "1pQ" { "raise" "check" } 0 +p "" 2 4 "1pQ" { "raise" "check" } 0 p "" 1 2 "1p2rA" { "call" "fold" } 0 t "" 1 "Outcome 1" { 3, -1 } t "" 3 "Outcome 3" { 0, 2 } @@ -26,17 +26,17 @@ p "" 1 1 "A" { "raise" "check" } 0 p "player 2" 2 5 "1rJ" { "call" "fold" } 0 t "" 1 "Outcome 1" { 3, -1 } t "" 2 "Outcome 2" { 2, 0 } -p "player 2" 2 6 "1pJ" { "raise" "check" } 0 +p "" 2 6 "1pJ" { "raise" "check" } 0 p "" 1 2 "1p2rA" { "call" "fold" } 0 t "" 1 "Outcome 1" { 3, -1 } t "" 3 "Outcome 3" { 0, 2 } t "" 2 "Outcome 2" { 2, 0 } -p "player 1" 1 3 "K" { "raise" "check" } 0 +p "" 1 3 "K" { "raise" "check" } 0 p "" 2 7 "1rA" { "call" "fold" } 0 t "" 4 "Outcome 4" { -1, 3 } t "" 2 "Outcome 2" { 2, 0 } -p "player 2" 2 8 "1pA" { "raise" "check" } 0 -p "player 1" 1 4 "1p2rK" { "call" "fold" } 0 +p "" 2 8 "1pA" { "raise" "check" } 0 +p "" 1 4 "1p2rK" { "call" "fold" } 0 t "" 4 "Outcome 4" { -1, 3 } t "" 3 "Outcome 3" { 0, 2 } t "" 3 "Outcome 3" { 0, 2 } @@ -58,12 +58,12 @@ p "" 1 4 "1p2rK" { "call" "fold" } 0 t "" 1 "Outcome 1" { 3, -1 } t "" 3 "Outcome 3" { 0, 2 } t "" 2 "Outcome 2" { 2, 0 } -p "player 1" 1 5 "Q" { "raise" "check" } 0 -p "player 2" 2 7 "1rA" { "call" "fold" } 0 +p "" 1 5 "Q" { "raise" "check" } 0 +p "" 2 7 "1rA" { "call" "fold" } 0 t "" 4 "Outcome 4" { -1, 3 } t "" 2 "Outcome 2" { 2, 0 } p "" 2 8 "1pA" { "raise" "check" } 0 -p "player 1" 1 6 "1p2rQ" { "call" "fold" } 0 +p "" 1 6 "1p2rQ" { "call" "fold" } 0 t "" 4 "Outcome 4" { -1, 3 } t "" 3 "Outcome 3" { 0, 2 } t "" 3 "Outcome 3" { 0, 2 } @@ -85,12 +85,12 @@ p "" 1 6 "1p2rQ" { "call" "fold" } 0 t "" 1 "Outcome 1" { 3, -1 } t "" 3 "Outcome 3" { 0, 2 } t "" 2 "Outcome 2" { 2, 0 } -p "player 1" 1 7 "J" { "raise" "check" } 0 +p "" 1 7 "J" { "raise" "check" } 0 p "" 2 7 "1rA" { "call" "fold" } 0 t "" 4 "Outcome 4" { -1, 3 } t "" 2 "Outcome 2" { 2, 0 } p "" 2 8 "1pA" { "raise" "check" } 0 -p "player 1" 1 8 "1p2rJ" { "call" "fold" } 0 +p "" 1 8 "1p2rJ" { "call" "fold" } 0 t "" 4 "Outcome 4" { -1, 3 } t "" 3 "Outcome 3" { 0, 2 } t "" 3 "Outcome 3" { 0, 2 } diff --git a/tests/fixtures/efg/zero_sum_chance_imperfect_info.efg b/tests/fixtures/efg/zero_sum_chance_imperfect_info.efg index 1d5b844..45a930d 100644 --- a/tests/fixtures/efg/zero_sum_chance_imperfect_info.efg +++ b/tests/fixtures/efg/zero_sum_chance_imperfect_info.efg @@ -1,4 +1,4 @@ -EFG 2 R "Zero-sum with chance & imperfect info" { "1" "2" } +EFG 2 R "Zero-sum with chance & imperfect info" { "Player 1" "Player 2" } " Example from diff --git a/tests/fixtures/efg/zero_sum_imperfect_info.efg b/tests/fixtures/efg/zero_sum_imperfect_info.efg index 161567e..def1021 100644 --- a/tests/fixtures/efg/zero_sum_imperfect_info.efg +++ b/tests/fixtures/efg/zero_sum_imperfect_info.efg @@ -1,4 +1,4 @@ -EFG 2 R "Matching pennies (zero-sum with imperfect info)" { "1" "2" } +EFG 2 R "Matching pennies (zero-sum with imperfect info)" { "Player 1" "Player 2" } p "" 1 1 "P1 choice" { "Heads" "Tails" } 0 p "" 2 1 "P2 Response" { "Heads" "Tails" } 0 diff --git a/tests/fixtures/efg/zero_sum_perfect_info.efg b/tests/fixtures/efg/zero_sum_perfect_info.efg index 9836234..bfba90e 100644 --- a/tests/fixtures/efg/zero_sum_perfect_info.efg +++ b/tests/fixtures/efg/zero_sum_perfect_info.efg @@ -1,4 +1,4 @@ -EFG 2 R "Zero-sum with perfect info" { "1" "2" } +EFG 2 R "Zero-sum with perfect info" { "Player 1" "Player 2" } "" p "" 1 1 "" { "L" "R" } 0 diff --git a/tests/fixtures/efg/zero_sum_perfect_info_missing_outcome.efg b/tests/fixtures/efg/zero_sum_perfect_info_missing_outcome.efg index 4bbd84e..ff10b0c 100644 --- a/tests/fixtures/efg/zero_sum_perfect_info_missing_outcome.efg +++ b/tests/fixtures/efg/zero_sum_perfect_info_missing_outcome.efg @@ -1,4 +1,4 @@ -EFG 2 R "Zero-sum with perfect info" { "1" "2" } +EFG 2 R "Zero-sum with perfect info" { "Player 1" "Player 2" } "" p "" 1 1 "" { "L" "R" } 0 diff --git a/tests/sequence_form_helper.py b/tests/sequence_form_helper.py index a9a0cd5..5bc6678 100644 --- a/tests/sequence_form_helper.py +++ b/tests/sequence_form_helper.py @@ -6,6 +6,9 @@ EMPTY: tuple[()] = () # empty sequence +PLAYER_1 = "Player 1" +PLAYER_2 = "Player 2" + def lcp_from_data(M: list[list[Fr]], q: list[Fr], d: list[Fr]) -> lcp: """Creates an LCP instance with given M, q, d.""" @@ -44,7 +47,8 @@ def build_sequence_form_lcp(game): # . -F . . . . f # . F . . . . -f - p1, p2 = game.players[0], game.players[1] + p1 = game.players[PLAYER_1] + p2 = game.players[PLAYER_2] # sequences for each player (infoset, action) seqs1, seqs2 = [EMPTY], [EMPTY] @@ -58,7 +62,7 @@ def build_sequence_form_lcp(game): def dfs(node, s1, s2, prob, u1=Fr(0), u2=Fr(0)): # accumulate payoffs from outcome nodes along the path - if node.outcome is not None: + if node.outcome: u1 += Fr(node.outcome[p1]) u2 += Fr(node.outcome[p2]) @@ -228,7 +232,7 @@ def solve_via_sequence_form(game): x = x_y[:ns1] y = x_y[ns1:] - x_probs = get_action_probabilities(game.players[0], infoset_to_parent1, idx1, x) - y_probs = get_action_probabilities(game.players[1], infoset_to_parent2, idx2, y) + x_probs = get_action_probabilities(game.players[PLAYER_1], infoset_to_parent1, idx1, x) + y_probs = get_action_probabilities(game.players[PLAYER_2], infoset_to_parent2, idx2, y) return x_probs, y_probs