Source code for gameanalysis.scripts.samp

"""sample profiles from a mixture"""
import argparse
import itertools
import json
import sys

from gameanalysis import gameio


[docs]def add_parser(subparsers): parser = subparsers.add_parser('sample', aliases=['samp'], help="""Sample profiles from a mixture""", description="""Sample profiles from a mixture.""") parser.add_argument('--input', '-i', metavar='<input-file>', default=sys.stdin, type=argparse.FileType('r'), help="""Game file to draw samples from. (default: stdin)""") parser.add_argument('--mix', '-m', metavar='<mixture-file>', default=sys.stdin, type=argparse.FileType('r'), help="""Mixture to sample profiles from. (default: stdin)""") parser.add_argument('--output', '-o', metavar='<output-file>', default=sys.stdout, type=argparse.FileType('w'), help="""File to write stream of profiles too. (default: stdout)""") parser.add_argument('--num', '-n', metavar='<num-samples>', default=1, type=int, help="""The number of samples to gather. (default: %(default)d)""") parser.add_argument('--deviations', '-d', action='store_true', help="""Sample deviation profiles instead of general mixture profiles. This will sample `num` profiles from each deviation. The output will be a stream of json objects with a devrole, devstrat, and profile field.""") return parser
[docs]def main(args): game, serial = gameio.read_game(json.load(args.input)) mix = serial.from_prof_json(json.load(args.mix)) if args.deviations: profs = (game.random_deviator_profiles(mix, args.num) .reshape((-1, game.num_role_strats))) dev_names = itertools.cycle(itertools.chain.from_iterable( ((r, s) for s in ses) for r, ses in zip(serial.role_names, serial.strat_names))) for prof, (devrole, devstrat) in zip(profs, dev_names): json.dump(dict( devrole=devrole, devstrat=devstrat, profile=serial.to_prof_json(prof)), args.output) args.output.write('\n') else: for prof in game.random_profiles(mix, args.num): json.dump(serial.to_prof_json(prof), args.output) args.output.write('\n')