jsuarez/BatchSnippets.py (93 lines of code) (raw):

# ann, rets = self.anns[0], [] # for entID, ent, stim in ents: # annID = hash(entID) % self.nANN # unpacked = unpackStim(ent, stim) # self.anns[annID].recv(unpacked, ent, stim, entID) # # #Ret order matters # for logits, val, ent, stim, atn, entID in ann.send(): # action, args = self.actionArgs(stim, ent, atn.item()) # rets.append((action, args, float(val))) # if ent.alive and not self.args.test: # self.collectStep(entID, (logits, val, atn)) # return rets class CosineNet(nn.Module): def __init__(self, xdim, h, ydim): super().__init__() self.feats = FeatNet(xdim, h, ydim) self.fc1 = torch.nn.Linear(h, h) self.ent1 = torch.nn.Linear(5, h) def forward(self, stim, conv, flat, ents, ent, actions): x = self.feats(conv, flat, ents) x = self.fc1(x) arguments = actions.args(stim, ent) ents = torch.tensor(np.array([e.stim for e in arguments])).float() args = self.ent1(ents) #center this in preprocess arg, argIdx = CosineClassifier(x, args) argument = [arguments[int(argIdx)]] return actions, argument, (arg, argIdx) def CosineClassifier(x, a): ret = torch.sum(x*a, dim=1).view(1, -1) return ret, classify(ret) class AtnNet(nn.Module): def __init__(self, xdim, h, ydim): super().__init__() self.feats = FeatNet(xdim, h, ydim) self.atn1 = torch.nn.Linear(h, 2) def forward(self, conv, flat, ent, flatEnts, actions): x = self.feats(conv, flat, flatEnts) atn = self.atn1(x) atnIdx = classify(atn) return x, atn, atnIdx class ActionEmbed(nn.Module): def __init__(self, nEmbed, dim): super().__init__() self.embed = torch.nn.Embedding(nEmbed, dim) self.atnIdx = {} def forward(self, actions): idxs = [] for a in actions: if a not in self.atnIdx: self.atnIdx[a] = len(self.atnIdx) idxs.append(self.atnIdx[a]) idxs = torch.tensor(idxs) atns = self.embed(idxs) return atns def vDiffs(v): pad = v[0] * 0 diffs = [vNew - vOld for vNew, vOld in zip(v[1:], v[:-1])] vRet = diffs + [pad] return vRet def embedArgsLists(argsLists): args = [embedArgs(args) for args in argsLists] return np.stack(args) def embedArgs(args): args = [embedArg(arg) for arg in args] return np.concatenate(args) def embedArg(arg): arg = Arg(arg) arg = oneHot(arg.val - arg.min, arg.n) return arg def matOneHot(mat, dim): r, c = mat.shape x = np.zeros((r, c, dim)) for i in range(r): for j in range(c): x[i, j, mat[i,j]] = 1 return x #Old unzip. Don't use. Soft breaks PG def unzipRollouts(rollouts): atnArgList, atnArgIdxList, valList, rewList = [], [], [], [] for atnArgs, val, rew in rollouts: for atnArg, idx in atnArgs: atnArgList.append(atnArg) atnArgIdxList.append(idx) valList.append(val) rewList.append(rew) atnArgs = atnArgList atnArgsIdx = torch.stack(atnArgIdxList) vals = torch.stack(valList).view(-1, 1) rews = torch.tensor(rewList).view(-1, 1).float() return atnArgs, atnArgsIdx, vals, rews def l1Range(ent, sz, me, rng): R, C = sz rs, cs = me.pos rt = max(0, rs-rng) rb = min(R, rs+rng+1) cl = max(0, cs-rng) cr = min(C, cs+rng+1) ret = [] for r in range(rt, rb): for c in range(cl, cr): if me in ent[r, c].ents: continue if len(ent[r, c].ents) > 0: ret += ent[r, c].ents return ret