figures.py (133 lines of code) (raw):

import numpy as np import sys, json from forge.blade.lib.enums import Neon, Color256 from forge.blade.lib.log import InkWell from matplotlib import pyplot as plt from pdb import set_trace as T from itertools import groupby from collections import defaultdict import collections import logs as loglib import experiments import pickle import os.path as osp import os def plot(x, idxs, label, idx, path): colors = Neon.color12() loglib.dark() c = colors[idx % 12] loglib.plot(x, inds=idxs, label=str(idx), c=c.norm) loglib.godsword() loglib.save(path + label + '.png') plt.close() def plots(x, label, idx, path, split): colors = Neon.color12() loglib.dark() for idx, item in enumerate(x.items()): annID, val = item c = colors[idx % 12] idxs, val = compress(val, split) loglib.plot(val, inds=idxs, label=str(annID), c=c.norm) loglib.godsword() loglib.save(path + label + '.png') plt.close() def meanfilter(x, n=1): ret = [] for idx in range(len(x) - n): val = np.mean(x[idx:(idx+n)]) ret.append(val) return ret def compress(x, split): rets, idxs = [], [] if split == 'train': n = 1 + len(x) // 20 else: n = 1 + len(x) // 20 for idx in range(0, len(x) - n, n): rets.append(np.mean(x[idx:(idx+n)])) idxs.append(idx) return 10*np.array(idxs), rets def popPlots(popLogs, path, split): idx = 0 print(path) for key, val in popLogs.items(): print(key) #val = meanfilter(val, 1+len(val)//100) plots(val, str(key), idx, path, split) idx += 1 def flip(popLogs): ret = defaultdict(dict) for annID, logs in popLogs.items(): for key, log in logs.items(): if annID not in ret[key]: ret[key][annID] = [] if type(log) != list: ret[key][annID].append(log) else: ret[key][annID] += log return ret def group(blobs, idmaps): rets = defaultdict(list) for blob in blobs: groupID = idmaps[blob.annID] rets[groupID].append(blob) return rets def mergePops(blobs, idMap): #blobs = sorted(blobs, key=lambda x: x.annID) #blobs = dict(blobs) #idMap = {} #for idx, accumList in enumerate(accum): # for e in accumList: # idMap[e] = idx blobs = group(blobs, idMap) pops = defaultdict(list) for groupID, blobList in blobs.items(): pops[groupID] += list(blobList) return pops def individual(blobs, logDir, name, accum, split): savedir = logDir + name + '/' + split + '/' if not osp.exists(savedir): os.makedirs(savedir) blobs = mergePops(blobs, accum) popLogs = {} for annID, blobList in blobs.items(): logs, blobList = {}, list(blobList) logs = {**logs, **InkWell.counts(blobList)} logs = {**logs, **InkWell.unique(blobList)} logs = {**logs, **InkWell.explore(blobList)} logs = {**logs, **InkWell.lifetime(blobList)} logs = {**logs, **InkWell.reward(blobList)} logs = {**logs, **InkWell.value(blobList)} popLogs[annID] = logs popLogs = flip(popLogs) popPlots(popLogs, savedir, split) def makeAccum(config, form='single'): assert form in 'pops single split'.split() if form == 'pops': return dict((idx, idx) for idx in range(config.NPOP)) elif form == 'single': return dict((idx, 0) for idx in range(config.NPOP)) elif form == 'split': pop1 = dict((idx, 0) for idx in range(config.NPOP1)) pop2 = dict((idx, 0) for idx in range(config.NPOP2)) return {**pop1, **pop2} if __name__ == '__main__': arg = None if len(sys.argv) > 1: arg = sys.argv[1] logDir = 'resource/exps/' logName = '/model/logs.p' fName = 'frag.png' name = 'newfig' exps = [] for name, config in experiments.exps.items(): try: with open(logDir + name + logName, 'rb') as f: dat = [] idx = 0 while True: idx += 1 try: dat += pickle.load(f) except EOFError as e: break print('Blob length: ', idx) split = 'test' if config.TEST else 'train' accum = makeAccum(config) individual(dat, logDir, name, accum, split) print('Log success: ', name) except Exception as err: print(str(err))