-
Notifications
You must be signed in to change notification settings - Fork 168
Description
Where did you find this bug?
PyGambit
What operating system are you using?
macOS
What version of Gambit are you using?
16.4.0
What happened?
This was spotted when working on issue #636, which is about using UndefinedToCentroid rather than leaving probabilities at certain infosets as 0 in pygambit, or *s in the GUI. In making that change I noticed the following case (currently incorrectly included as a test case in test_enumpoly_ordered_behavior in test_nash.py).
The game in question is the "one-shot trust game", created in tests/games.py::create_one_shot_trust_efg, with the following efg file:
EFG 2 R "One-shot trust game, after Kreps (1990)" { "Buyer" "Seller" }
""
p "" 1 1 "" { "Trust" "Not trust" } 0
p "" 2 1 "" { "Honor" "Abuse" } 0
t "" 1 "Trustworthy" { 1, 1 }
t "" 2 "Untrustworthy" { -1, 2 }
t "" 3 "Opt-out" { 0, 0 }
The issue is that the second "equilibrium" found by enum_poly in mixed behaviors is not always an equilibrium:
import pygambit as gbt
g = gbt.read_efg('one_shot_trust.efg')
result = gbt.nash.enumpoly_solve(g)
print(result.equilibria[0])
print(result.equilibria[1])
giving
In [14]: print(result.equilibria[0])
[[[0.0, 1.0]], [[0.5, 0.5]]]
In [15]: print(result.equilibria[1])
[[[0.0, 1.0]], [[0.0, 0.0]]]
The second once should have [0.0, 1.0] for player 2, but is instead returned as "undefined", i.e. [0.0, 0.0] in pygambit, and wildcards * in the GUI:
However, if player 2 puts more than 0.5 probability on "Honor" then "No Trust" is no longer a best response for player 1.
Player 2's info set is only one deviation from the equilibrium path (i.e. "Not Trust"), and so actually should have specified probabilities and not be undefined (which should occur only for info sets that would only be reached with deviations of more than one player).