Table of Contents
Fetching ...

LiteEFG: An Efficient Python Library for Solving Extensive-form Games

Mingyang Liu, Gabriele Farina, Asuman Ozdaglar

TL;DR

LiteEFG addresses the computational bottlenecks of solving multiplayer extensive-form games by combining a lightweight Python API with a high-performance C++ backend. It lets users express CFR update rules as computation graphs that are replicated across information sets, while automatically handling aggregation over imperfect-information structures. The framework supports standard CFR variants and provides training, evaluation, debugging, and benchmarking tools, along with compatibility with OpenSpiel. Empirically, LiteEFG delivers substantial speedups (approximately 100x) over OpenSpiel for tabular games, enabling faster experimentation and broader accessibility for EFG research.

Abstract

LiteEFG is an efficient library with easy-to-use Python bindings, which can solve multiplayer extensive-form games (EFGs). LiteEFG enables the user to express computation graphs in Python to define updates on the game tree structure. The graph is then executed by the C++ backend, leading to significant speedups compared to running the algorithm in Python. Moreover, in LiteEFG, the user needs to only specify the computation graph of the update rule in a decision node of the game, and LiteEFG will automatically distribute the update rule to each decision node and handle the structure of the imperfect-information game.

LiteEFG: An Efficient Python Library for Solving Extensive-form Games

TL;DR

LiteEFG addresses the computational bottlenecks of solving multiplayer extensive-form games by combining a lightweight Python API with a high-performance C++ backend. It lets users express CFR update rules as computation graphs that are replicated across information sets, while automatically handling aggregation over imperfect-information structures. The framework supports standard CFR variants and provides training, evaluation, debugging, and benchmarking tools, along with compatibility with OpenSpiel. Empirically, LiteEFG delivers substantial speedups (approximately 100x) over OpenSpiel for tabular games, enabling faster experimentation and broader accessibility for EFG research.

Abstract

LiteEFG is an efficient library with easy-to-use Python bindings, which can solve multiplayer extensive-form games (EFGs). LiteEFG enables the user to express computation graphs in Python to define updates on the game tree structure. The graph is then executed by the C++ backend, leading to significant speedups compared to running the algorithm in Python. Moreover, in LiteEFG, the user needs to only specify the computation graph of the update rule in a decision node of the game, and LiteEFG will automatically distribute the update rule to each decision node and handle the structure of the imperfect-information game.
Paper Structure (23 sections, 3 equations, 7 figures, 1 table)

This paper contains 23 sections, 3 equations, 7 figures, 1 table.

Figures (7)

  • Figure 1: At the very beginning, when the computation graph for the environment is determined by LiteEFG.Environment.set_graph, the static backward nodes and static forward nodes will be executed sequentially. Then, each time LiteEFG.Environment.update is called, the dynamic backward nodes and dynamic forward nodes will be executed.
  • Figure 2: Implementation of Counterfactual Regret Minimization (CFR) DBLP:conf/nips/ZinkevichJBP07-CFR by LiteEFG. The green box displays the definition of static variables that will only be updated once at initialization. The red box displays the variables that will be updated every time updating the graph.
  • Figure 3: An example of Kuhn Poker Kuhn represented in the game file format supported by LiteEFG.
  • Figure 4: Training and evaluation of CFR algorithm defined in \ref{['fig:API-CFR']}.
  • Figure 5: A snapshot of the strategy of player 1 generated by CFR algorithm in leduc_poker(suit_isomorphism=True) of OpenSpiel. The first column displays the name of the infoset, and the second to the fourth column is the probability of choosing fold / call / raise in that infoset. The index of fold / call / raise in the representation of infoset is 0, 1, 2.
  • ...and 2 more figures