jsuarez/CPUUtils.py (60 lines of code) (raw):
#Utilities for Neural CPUs to interact with the set of actions.
from pdb import set_trace as T
from sim.lib import Utils
from sim.modules import Skill
from sim.entity.NPC import NPC
from sim.action import Action
class ActionStats:
numMoves = 4
numAttacks = 2
numEntities = 1 + len(Utils.terminalClasses(NPC))
numSkills = len(Utils.terminalClasses(Skill.Skill))
numActions = 2 + numSkills
class ActionSpec:
def __init__(self):
self.prev = None
self.roots = [Action.ActionNode, Action.ActionLeaf]
#self.roots = [Actions.ActionLeaf]
def edges(self):
ret = []
blacklist = (Action.ActionLeaf, Action.Args)
for root in self.roots:
for e in root.__subclasses__():
if e not in blacklist:
ret += [e]
return ret
def leaves(self):
return Action.ActionLeaf.__subclasses__()
class SaveManager():
def __init__(self, root):
self.tl, self.ta, self.vl, self.va = [], [], [], []
self.root = root
self.stateDict = None
self.lock = False
def update(self, net, tl, ta, vl, va):
nan = np.isnan(sum([t.sum(e) for e in net.state_dict().values()]))
if nan or self.lock:
self.lock = True
print('NaN in update. Locking. Call refresh() to reset')
return
if self.epoch() == 1 or vl < np.min(self.vl):
self.stateDict = net.state_dict().copy()
t.save(net.state_dict(), self.root+'weights')
self.tl += [tl]; self.ta += [ta]
self.vl += [vl]; self.va += [va]
np.save(self.root + 'tl.npy', self.tl)
np.save(self.root + 'ta.npy', self.ta)
np.save(self.root + 'vl.npy', self.vl)
np.save(self.root + 'va.npy', self.va)
def load(self, net, raw=False):
stateDict = t.load(self.root+'weights')
self.stateDict = stateDict
if not raw:
net.load_state_dict(stateDict)
self.tl = np.load(self.root + 'tl.npy').tolist()
self.ta = np.load(self.root + 'ta.npy').tolist()
self.vl = np.load(self.root + 'vl.npy').tolist()
self.va = np.load(self.root + 'va.npy').tolist()
def refresh(self, net):
self.lock = False
net.load_state_dict(self.stateDict)
def epoch(self):
return len(self.tl)+1