jsuarez/extra/figures.py (169 lines of code) (raw):
import numpy as np
import sys, json
from forge.blade.lib.enums import Neon, Color256
from matplotlib import pyplot as plt
from pdb import set_trace as T
import logs as loglib
import experiments
import os.path as osp
import os
def gen_plot(log, keys, savename, train=True):
loglib.dark()
if len(keys) > 12:
colors = Color256.colors
else:
colors = Neon.color12()
pops = []
for i, key in enumerate(keys):
c = colors[i]
if not train:
log[key] = np.cumsum(np.array(log[key])) / (1+np.arange(len(log[key])))
if i == 0:
loglib.plot(log[key], key, (1.0, 0, 0))
else:
loglib.plot(log[key], key, c.norm)
loglib.godsword()
loglib.save(savename)
plt.close()
def individual(log, label, npop, logDir='resource/data/exps/', train=True):
if train:
split = 'train'
else:
split = 'test'
savedir = osp.join(logDir, label, split)
if not osp.exists(savedir):
os.makedirs(savedir)
if len(log['return']) > 0:
loglib.dark()
keys = reversed('return lifespan value value_loss pg_loss entropy grad_mean grad_std grad_min grad_max'.split())
colors = Neon.color12()
fName = 'frag.png'
for idx, key in enumerate(keys):
if idx == 0:
c = colors[idx]
loglib.plot(log[key], key, (1.0, 0, 0))
else:
c = colors[idx]
loglib.plot(log[key], key, c.norm)
maxLife = np.max(log['return'])
loglib.limits(ylims=[0, 50*(1+maxLife//50)])
loglib.godsword()
savepath = osp.join(logDir, label, split, fName)
loglib.save(savepath)
print(savepath)
plt.close()
# Construct population specific code
pop_mean_keys = ['lifespan{}_mean'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_mean.png')
gen_plot(log, pop_mean_keys, savefile, train=train)
# Per population movement probability
pop_move_keys = ['pop{}_move'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_move.png')
gen_plot(log, pop_move_keys, savefile, train=train)
# Attack probability plots
pop_move_keys = ['pop{}_range'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_range.png')
gen_plot(log, pop_move_keys, savefile, train=train)
pop_move_keys = ['pop{}_melee'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_melee.png')
gen_plot(log, pop_move_keys, savefile, train=train)
pop_move_keys = ['pop{}_mage'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_mage.png')
gen_plot(log, pop_move_keys, savefile, train=train)
# Movement tile entropy
pop_move_keys = ['pop{}_entropy'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_move_entropy.png')
gen_plot(log, pop_move_keys, savefile, train=train)
# Population attack probabilities when action is selected
pop_move_keys = ['pop{}_melee_logit'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_melee_logit.png')
gen_plot(log, pop_move_keys, savefile, train=train)
pop_move_keys = ['pop{}_range_logit'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_range_logit.png')
gen_plot(log, pop_move_keys, savefile, train=train)
pop_move_keys = ['pop{}_mage_logit'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_mage_logit.png')
gen_plot(log, pop_move_keys, savefile, train=train)
# Sum up all the logits to check if they actually sum to zero
for i in range(npop):
logit_sum = np.array(log['pop{}_melee_logit'.format(i)]) + np.array(log['pop{}_range_logit'.format(i)]) + np.array(log['pop{}_mage_logit'.format(i)])
log['pop{}_sum_logit'.format(i)] = logit_sum
pop_move_keys = ['pop{}_sum_logit'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_sum_logit.png')
gen_plot(log, pop_move_keys, savefile, train=train)
# Tile exploration statistics
pop_move_keys = ['pop{}_grass_tiles'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_grass_tiles.png')
gen_plot(log, pop_move_keys, savefile, train=train)
pop_move_keys = ['pop{}_forest_tiles'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_forest_tiles.png')
gen_plot(log, pop_move_keys, savefile, train=train)
pop_move_keys = ['pop{}_forest_tiles_depleted'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_forest_depleted.png')
gen_plot(log, pop_move_keys, savefile, train=train)
# pop_move_keys = ['pop{}_forest_tiles_other'.format(i) for i in range(npop)]
# savefile = osp.join(logDir, label, 'pop_forest_tiles_other.png')
# gen_plot(log, pop_move_keys, savefile, train=train)
for i in range(npop):
forest_tiles = np.array(log['pop{}_forest_tiles'.format(i)])
other_tiles = np.array(log['pop{}_grass_tiles'.format(i)]) + np.array(log['pop{}_forest_tiles_depleted'.format(i)]) + forest_tiles
forage_percent = forest_tiles / other_tiles
log['pop{}_forage_success'.format(i)] = forage_percent
pop_move_keys = ['pop{}_forage_success'.format(i) for i in range(npop)]
savefile = osp.join(logDir, label, split, 'pop_forage_success.png')
gen_plot(log, pop_move_keys, savefile, train=train)
def individuals(exps):
for name, npop, log in exps:
try:
individual(log, name, npop)
print('Log success: ', name)
except Exception as e:
print(e)
print('Log failure: ', name)
def joints(exps):
print('Joints...')
keys = reversed('return lifespan value value_loss pg_loss entropy grad_mean grad_std grad_min grad_max'.split())
colors = Neon.color12()
for key in keys:
loglib.dark()
maxVal = 0
for idx, dat in enumerate(exps):
name, _, log = dat
loglib.plot(log[key], name, colors[idx].norm, lw=3)
maxVal = max(maxVal, np.max(log[key]))
loglib.limits(ylims=[0, 50*(1+maxVal//50)])
loglib.godsword()
loglib.save(logDir+'joint/'+key)
plt.close()
def agents():
exps = list(experiments.exps.keys())
loglib.dark()
colors = Neon.color12()
maxVal = 0
for idx, exp in enumerate(exps):
name, log = exp
c = colors[idx]
loglib.plot(log['lifespan'], name, c.norm)
maxVal = max(maxVal, np.max(log['lifespan']))
loglib.limits(ylims=[0, 50*(1+maxVal//50)])
loglib.godsword()
loglib.save(logDir+'/agents.png')
plt.close()
def populations():
pass
def combat():
pass
if __name__ == '__main__':
arg = None
if len(sys.argv) > 1:
arg = sys.argv[1]
logDir = 'resource/data/exps/'
logName = 'logs.json'
fName = 'frag.png'
#exps = [(name, config.NPOP, loglib.load(logDir+name+'/'+logName))
# for name, config in experiments.exps.items()]
exps = []
for name, config in experiments.exps.items():
try:
exp = loglib.load(logDir + name + '/' + logName)
individual(exp, name, config.NPOP)
exps.append(exp)
print('Log success: ', name)
except Exception as e:
print(e)
print('Log failure: ', name)
if arg == 'individual':
individuals(exps)
elif arg == 'joint':
joints(exps)
else:
individuals(exps)
joints(exps)
# agents()