Skip to main content

A homotopy-based solver for stochastic games

Project description

sgamesolver

Stochastic game solver, short: sgamesolver, is a python package to compute stationary or Markov-perfect equilibria of stochastic games, using the homotopy continuation method.

Some useful links:

sgamesolver is free and open source, under the MIT license. If you use the program for any published research, please cite Eibelshäuser/Poensgen (2019).

Installation

sgamesolver is hosted on PyPI, so installation is usually as simple as

pip install sgamesolver

Head over to the docs for other options for installation.

Usage

Solving a stochastic game is done in three steps:

  • define a game
  • pick a homotopy function
  • set up and run the solver
import sgamesolver

game = sgamesolver.SGame.random_game(64, 2, 4, seed=42)

qre = sgamesolver.homotopy.QRE(game)

qre.solver_setup()
qre.solve()

print(qre.equilibrium)

A quick rundown of these steps – more details are found in the docs:

1. Set up a stochastic game
game = sgamesolver.SGame.random_game(64, 2, 4, seed=42)

Stochastic games are represented by the class SGame. For this quick example, we are using the method random_game to randomize a game with 64 states, 2 players, and 4 actions per player and state. (Setting a seed just makes the result reproducible.)

Of course, you probably didn't come here to solve a random game, but have a specific game in mind. The documentation contains instructions and examples on how to create an SGame which represents the stochastic game you want to solve. (By the way, sgamesolver can also solve normal form games, sequential games, repeated games, and also finite Markov decision problems – each of these is just a simple case of a stochastic game.)

2. Select and set up a homotopy function for your game
qre = sgamesolver.homotopy.QRE(game)

sgamesolver uses the homotopy principle to solve stochastic games, a general technique to solve systems of non-linear equations. In short, the idea is as follows: Instead of solving some very hard problem directly (in our case: finding an equilibrium), a continuous transformation is applied to the system, yielding a related, but much simpler problem, for which one can easily obtain a solution. This transformation is then gradually reversed while tracking the solution, until arriving at a solution for the original problem – here, the desired stationary equilibrium. (You can find more background in the documentation – although such knowledge is not necessary for using the program.)

The (mathematical) function used for this transformation is called homotopy function. In general, there are many possibilities to construct a suitable one. sgamesolver currently includes two: The one we picked for this example, sgamesolver.homotopy.QRE, is based on an extension of quantal response equilibrium to stochastic games (Eibelshäuser/Poensgen 2019b). The other, sgamesolver.homotopy.LogTracing, implements the logarithmic tracing procedure for stochastic games (Eibelshäuser/Klockmann/Poensgen/von Schenk 2022). Which one to pick? In our experience, the former is more robust – while the latter has the advantage that it allows to search for multiple equilibria. More homotopy functions are to come! In any case, please make sure to cite the paper that introduced whichever homotopy you end up using.

3. Let the homotopy solver do its job

Finally, we will set up the solver and start it:

qre.solver_setup()
qre.solve()

Then it's time to lean back and watch for a bit:

==================================================
Start homotopy continuation
Step    37: t =  3.612 ↑, s =  20.47, ds =  3.418

... until ...

Step   247: t = 1.147e+04 ↑, s = 9.385e+04, ds =  1000.
Step   247: Continuation successful. Total time elapsed: 0:00:15
End homotopy continuation
==================================================
An equilibrium was found via homotopy continuation.

... success! Ideally, the solver will be able to find a solution without requiring any further interaction, as in this example. In cases where this does not work out, check out the section on troubleshooting in the documentation.

4. Aftermath

We can now display the solution:

print(qre.equilibrium)

which outputs equilibrium strategies and values for all 64 states:

+++++++++ state00 +++++++++
                       a0    a1    a2    a3  
player0 : v=15.09, σ=[1.000 0.000 0.000 0.000]
player1 : v=15.63, σ=[0.000 0.000 1.000 0.000]

+++++++++ state01 +++++++++
                       a0    a1    a2    a3  
player0 : v=14.76, σ=[0.000 0.961 0.000 0.039]
player1 : v=15.61, σ=[0.354 0.000 0.000 0.646]

+++++++++ state02 +++++++++
                       a0    a1    a2    a3  
player0 : v=14.84, σ=[1.000 0.000 0.000 0.000]
player1 : v=15.61, σ=[0.000 0.000 1.000 0.000]

... (abridged here for brevity) ...

+++++++++ state63 +++++++++
                       a0    a1    a2    a3  
player0 : v=14.92, σ=[0.000 1.000 0.000 0.000]
player1 : v=15.75, σ=[1.000 0.000 0.000 0.000]

Of course, you now also can access equilibrium strategies (and values) as numpy arrays and use them for further calculations or simulations.

eq_strat = qre.equilibrium.strategies
eq_values = qre.equilibrium.values

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sgamesolver-1.0.2.tar.gz (458.1 kB view details)

Uploaded Source

Built Distributions

sgamesolver-1.0.2-cp311-cp311-win_amd64.whl (338.1 kB view details)

Uploaded CPython 3.11 Windows x86-64

sgamesolver-1.0.2-cp310-cp310-win_amd64.whl (305.6 kB view details)

Uploaded CPython 3.10 Windows x86-64

sgamesolver-1.0.2-cp39-cp39-win_amd64.whl (308.5 kB view details)

Uploaded CPython 3.9 Windows x86-64

sgamesolver-1.0.2-cp38-cp38-win_amd64.whl (307.4 kB view details)

Uploaded CPython 3.8 Windows x86-64

sgamesolver-1.0.2-cp37-cp37m-win_amd64.whl (299.6 kB view details)

Uploaded CPython 3.7m Windows x86-64

sgamesolver-1.0.2-cp36-cp36m-win_amd64.whl (329.4 kB view details)

Uploaded CPython 3.6m Windows x86-64

File details

Details for the file sgamesolver-1.0.2.tar.gz.

File metadata

  • Download URL: sgamesolver-1.0.2.tar.gz
  • Upload date:
  • Size: 458.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.4

File hashes

Hashes for sgamesolver-1.0.2.tar.gz
Algorithm Hash digest
SHA256 714433b1a421a5c24ac39cf0eebfddfed023140fe652a05dbd7d509ce5f87c46
MD5 d38fccd7699a841ba9542e5f4e9a0aad
BLAKE2b-256 26568fbc6cbdcc5ca50c8d6a7594e84ef614f1965fac4b2ab1b49ce83f3dea97

See more details on using hashes here.

File details

Details for the file sgamesolver-1.0.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for sgamesolver-1.0.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 45ff044162d43242b923f3e25265052b18dca4a119c8ff8033af8d53ca131111
MD5 b679d797823b48430b0c000de32209c3
BLAKE2b-256 9bf646e9d7afad33d88b667d17acca32fd9194514d0d83acffe8f9707f72109d

See more details on using hashes here.

File details

Details for the file sgamesolver-1.0.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for sgamesolver-1.0.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d2f679d879ca20228ed585ee917f207f523dccd55c8e11e116b3538de49c0107
MD5 c41dc878f8787dbc8c4ddc6f4876c95f
BLAKE2b-256 e344c16778deb36a3fc68c0c2d025ffc7b02b197b5b5da0fbc3bfcb30a14d6e7

See more details on using hashes here.

File details

Details for the file sgamesolver-1.0.2-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for sgamesolver-1.0.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 888c36a0c14b3b2ed9f6f5d9216d8fe1dadb5d9391d3320576069e0d5cdfcf6e
MD5 e8606cbdd740156c3460eb82e48fbdf6
BLAKE2b-256 525440d7730728dafd3e926297323f855c3a22791b6bc45e95194f8393350c0f

See more details on using hashes here.

File details

Details for the file sgamesolver-1.0.2-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for sgamesolver-1.0.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 4a9d69e6fbe254d9f6ef739ea64929537a2903c73fb347bc4c835881f31659f4
MD5 2aa3c948163d0b531b42aec09168e6a0
BLAKE2b-256 f56bdf57f2f830f6d2b1c96b1884d815ca1bcc2e7192155171063a663ae1795d

See more details on using hashes here.

File details

Details for the file sgamesolver-1.0.2-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for sgamesolver-1.0.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 1d2bf62cf8486034b3912d1ad7c95370359eeb0eb76667cf302fd84bd05e8631
MD5 db4bfdfa2130f9092681755c27234150
BLAKE2b-256 6fe319d46a4ebc169e0e523ff8644403c15bb982a668c26fc2e321a045b310de

See more details on using hashes here.

File details

Details for the file sgamesolver-1.0.2-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for sgamesolver-1.0.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 8c282f1d21b834c20ca8930bbbcf130fb68b92a2cdcb436a1a1e34b5c0e024b1
MD5 32d1752f172ad0fa92496ff501918e7c
BLAKE2b-256 3d42cbbd70ded9179c417069938003f4fd2114706cabeaca3c4d33833e3a2fb4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page