Skip to content

BUG: liap_value incorrect for mixed strategy profile on an extensive game #616

Description

@tturocy

Overview

The value of liap_value() is not being reported correctly for at least some mixed strategy profiles defined on a game that has an underlying extensive representation.

Steps to reproduce

Consider the game below, which is Figure 4.2 from Myerson's 1991 textbook:

Image

This is an example of a game that has an equilibrium in the agent form that is not an equilibrium in behaviors. The .efg representation of the game is included at the bottom of this note.

In [1]: import pygambit as gbt

In [2]: efg = gbt.read_efg("myerson_fig_4_2.efg")

In [3]: efg_eqa = gbt.nash.enumpure_solve(efg, use_strategic=False).equilibria

In [4]: for eqm in efg_eqa:
   ...:     print(eqm)
   ...: 
[[[Rational(1, 1), Rational(0, 1)], [Rational(0, 1), Rational(1, 1)]], [[Rational(0, 1), Rational(1, 1)]]]
[[[Rational(0, 1), Rational(1, 1)], [Rational(0, 1), Rational(1, 1)]], [[Rational(1, 1), Rational(0, 1)]]]

In [5]: for eqm in efg_eqa:
   ...:     print(eqm.max_regret())
   ...: 
0
0

In [6]: for eqm in efg_eqa:
   ...:     print(eqm.liap_value())
   ...: 
0
0

enumpure_solve returns two equilibria - which is expected because this is actually documented to find agent-form equilibria (clarifying this nomenclature is the subject of a separate set of issues). At least insofar as liap_value is actually reporting the value for the multiagent form, then this is as expected.

However, only the first of these profiles is a Nash equilibrium of the game in behavior strategies (as Myerson points out). The second one is not. So indeed if we convert these to strategies and look at regret, we do find that the second one has a positive regret (for the first player):

In [12]: for eqm in efg_eqa:
    ...:     print(eqm.as_strategy().max_regret())
    ...: 
0
1

However, when we check liap_value on the strategy, we find an incorrect value:

In [13]: for eqm in efg_eqa:
    ...:     print(eqm.as_strategy().liap_value())
    ...: 
0
0

The liap_value for this must be positive (because max_regret is clearly positive), but it is being reported as zero.

If you create the normal form representation and create the same mixed strategy profile on the game represented as normal form, liap_value is reported correctly:

In [14]: nfg = gbt.read_nfg("myerson_fig_4_2.nfg")

In [15]: profile = nfg.mixed_strategy_profile([[0, 0, 1], [1, 0]])

In [16]: profile.max_regret()
Out[16]: 1.0

In [17]: profile.liap_value()
Out[17]: 1.0
EFG 2 R "Untitled Extensive Game" { "Player 1" "Player 2" }
""

p "" 1 1 "" { "A1" "B1" } 0
p "" 2 1 "" { "W2" "X2" } 0
p "" 1 2 "" { "Y1" "Z1" } 0
t "" 1 "" { 3, 0 }
t "" 2 "" { 0, 0 }
p "" 1 2 "" { "Y1" "Z1" } 0
t "" 3 "" { 2, 3 }
t "" 4 "" { 4, 1 }
p "" 2 1 "" { "W2" "X2" } 0
t "" 5 "" { 2, 3 }
t "" 6 "" { 3, 2 }
NFG 1 R "Untitled Extensive Game" { "Player 1" "Player 2" }

{ { "11" "12" "2*" }
{ "1" "2" }
}
""

3 0
0 0
2 3
2 3
4 1
3 2

Metadata

Metadata

Labels

bugc++Items which involve writing in C++

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions