forge/blade/lib/log.py (107 lines of code) (raw):

from pdb import set_trace as T from collections import defaultdict from forge.blade.lib.enums import Material from forge.blade.lib import enums from copy import deepcopy import os import numpy as np import json, pickle import time import ray #Static blob analytics class InkWell: def unique(blobs): tiles = defaultdict(list) for blob in blobs: for t, v in blob.unique.items(): tiles['unique_'+t.tex].append(v) return tiles def counts(blobs): tiles = defaultdict(list) for blob in blobs: for t, v in blob.counts.items(): tiles['counts_'+t.tex].append(v) return tiles def explore(blobs): tiles = defaultdict(list) for blob in blobs: for t in blob.counts.keys(): counts = blob.counts[t] unique = blob.unique[t] if counts != 0: tiles['explore_'+t.tex].append(unique / counts) return tiles def lifetime(blobs): return {'lifetime':[blob.lifetime for blob in blobs]} def reward(blobs): return {'reward':[blob.reward for blob in blobs]} def value(blobs): return {'value': [blob.value for blob in blobs]} #Agent logger class Blob: def __init__(self): self.unique = {Material.GRASS.value: 0, Material.SCRUB.value: 0, Material.FOREST.value: 0} self.counts = deepcopy(self.unique) self.lifetime = 0 self.reward, self.ret = [], [] self.value, self.entropy= [], [] self.pg_loss, self.val_loss = [], [] def finish(self): self.lifetime = len(self.reward) self.reward = np.sum(self.reward) self.value = np.mean(self.value) class Quill: def __init__(self, modeldir): self.time = time.time() self.dir = modeldir self.index = 0 try: os.remove(modeldir + 'logs.p') except: pass def timestamp(self): cur = time.time() ret = cur - self.time self.time = cur return str(ret) def print(self): print( 'Time: ', self.timestamp(), ', Iter: ', str(self.index)) def scrawl(self, logs): #Collect log update self.index += 1 rewards, blobs = [], [] for blobList in logs: blobs += blobList for blob in blobList: rewards.append(float(blob.lifetime)) self.lifetime = np.mean(rewards) blobRet = [] for e in blobs: if np.random.rand() < 0.1: blobRet.append(e) self.save(blobRet) def latest(self): return self.lifetime def save(self, blobs): with open(self.dir + 'logs.p', 'ab') as f: pickle.dump(blobs, f) def scratch(self): pass #Log wrapper and benchmarker class Benchmarker: def __init__(self, logdir): self.benchmarks = {} def wrap(self, func): self.benchmarks[func] = Utils.BenchmarkTimer() def wrapped(*args): self.benchmarks[func].startRecord() ret = func(*args) self.benchmarks[func].stopRecord() return ret return wrapped def bench(self, tick): if tick % 100 == 0: for k, benchmark in self.benchmarks.items(): bench = benchmark.benchmark() print(k.__func__.__name__, 'Tick: ', tick, ', Benchmark: ', bench, ', FPS: ', 1/bench)