Source code for gameanalysis.gamereader
"""Module for loading an arbitrary game with its associated serializer"""
import contextlib
import json
import logging
[docs]def load(filelike):
"""Read a game from a file
Parameters
----------
filelike : file-like
A file-like object to read the game from. The entire file will be
consumed by this action.
"""
return loads(filelike.read())
[docs]def loads(string):
"""Read a game from a string
Parameters
----------
string : str
A string representation of the game.
"""
with contextlib.suppress(json.JSONDecodeError):
obj = json.loads(string)
return loadj(obj)
with contextlib.suppress(ValueError):
logging.info("loading game with gambit format")
from gameanalysis import gambit
return gambit.loads(string)
raise ValueError("no known format for game")
[docs]def loadj(obj): # pylint: disable=too-many-branches,too-many-return-statements
"""Read a game from serializable python objects
Parameters
----------
json : {...}
The python object representation of a game encoded as json. Any valid
game will be read and returned.
"""
game_type, _ = obj.get("type", "samplegame.").split(".", 1)
if game_type == "add":
logging.info("loading game with added game format")
from gameanalysis import rsgame
return rsgame.add_json(obj)
elif game_type == "aggfn":
logging.info("loading game with aggfn format")
from gameanalysis import aggfn
return aggfn.aggfn_json(obj)
elif game_type == "canon":
logging.info("loading game with canonical format")
from gameanalysis import canongame
return canongame.canon_json(obj)
elif game_type == "const":
logging.info("loading game with const format")
from gameanalysis import rsgame
return rsgame.const_json(obj)
elif game_type == "empty" or game_type == "emptygame":
logging.info("loading game with empty")
from gameanalysis import rsgame
return rsgame.empty_json(obj)
elif game_type == "game":
logging.info("loading game with payoff game format")
from gameanalysis import paygame
return paygame.game_json(obj)
elif game_type == "matrix":
logging.info("loading game with matrix format")
from gameanalysis import matgame
return matgame.matgame_json(obj)
elif game_type == "neighbor":
logging.info("loading game with neighbor learning format")
from gameanalysis import learning
return learning.neighbor_json(obj)
elif game_type == "point":
logging.info("loading game with point learning format")
from gameanalysis import learning
return learning.point_json(obj)
elif game_type == "rbf":
logging.info("loading game with rbf learning format")
from gameanalysis import learning
return learning.rbfgame_json(obj)
elif game_type == "sample":
logging.info("loading game with sample learning format")
from gameanalysis import learning
return learning.sample_json(obj)
elif game_type == "samplegame":
logging.info("loading game with sample payoff format")
from gameanalysis import paygame
return paygame.samplegame_json(obj)
else:
raise ValueError("unknown game type {}".format(game_type))
[docs]def dumpj(game):
"""Dump a game to json"""
return game.to_json()
[docs]def dumps(game):
"""Dump a game to a string"""
return json.dumps(dumpj(game))
[docs]def dump(game, file_like):
"""Dump a game to a file object"""
return json.dump(dumpj(game), file_like)