def getAdditionalIntermediate(stateList, step, viewPoint, detail=False): # 指定したステップ番号のデータを取得する bState = stateList[step] # 取得したデータに対して次の状態を予測する aState = manager.predictwithViewPoint(bState, viewPoint) # 予測した状態に最も近い状態を stateList から推定する output = None tempdiff = 1000000000 for state in stateList: if state["step"] <= bState["step"]: continue curError = manager.calcDifference(state, aState) if detail == True: debugLine = "[DynamicalProgramming]getAdditionalIntermediate:" debugLine += "step:" + str(state["step"]) debugLine += "\t\terror:" + str(curError) print(debugLine) # もしtempdiff より小さくなったなら更新する if curError < tempdiff: tempdiff = curError output = state # もし tempdiff + RANGE 以上になったなら, # もうその先で更新の見込みはないとして終了する # elif curError >= tempdiff + 1500: elif curError >= 5 * tempdiff: print("TOKEN") break return output
def getWorstData(stateDict, detail=False): if detail == True: print("[predictMatching]getWorstData:start") # TODO 暫定的に「ステップ数の遠いデータにはペナルティ」としよう # 本質的ではないので他の方法を考える bMean = int( sum([b["step"] for b in stateDict["before"]]) / len(stateDict["before"])) aMean = int( sum([a["step"] for a in stateDict["after"]]) / len(stateDict["before"])) output = {} output["score"] = 0 output["worstIndex"] = -1 output["worstScore"] = 0 for i in range(len(stateDict["before"])): if detail == True: log = "step " + str(i) + "/" + str(len(stateDict["before"])) print("[predictMatching]getWorstData:" + log) # 学習データをコピーし,テストデータ分をポップ tempDict = copy.deepcopy(stateDict) tempTest = {} tempTest["before"] = tempDict["before"].pop(i) tempTest["after"] = tempDict["after"].pop(i) tempTest["fname"] = tempDict["fname"].pop(i) tempTest["isadd"] = tempDict["isadd"].pop(i) # 学習データで学習を行う vp = manager.getViewPoint(tempDict) # 学習した観点でテストデータの推定を行う predicted = manager.predictwithViewPoint(tempTest["before"], vp) # 推定結果と実際の状態とのずれを計算する error = manager.calcDifference(predicted, tempTest["after"]) # TODO ステップ数のずれを考慮する # TODO 他の方法を考える tempsteprate = 2 error += tempsteprate * (tempTest["before"]["step"] - bMean) * (tempTest["before"]["step"] - bMean) error += tempsteprate * (tempTest["after"]["step"] - aMean) * (tempTest["after"]["step"] - aMean) # ずれが最大を更新したら記録する output["score"] += error if error > output["worstScore"]: if detail == True: print("[predictMatching]getWorstData: updateWorst") output["worstIndex"] = i output["worstScore"] = error # score は平均化 output["score"] /= len(stateDict["before"]) if detail == True: print("[predictMatching]getWorstData:score:" + str(output["score"])) return output
def pruningInterDict_2(datas, interDict): output = {} print(interDict) for filename in interDict.keys(): output[filename] = [] before = None after = None for step in interDict[filename]: after = datas[filename][step] # 目測で大体 4500 前後 if len(output[filename]) == 0 or manager.calcDifference(before, after) > 4500: output[filename].append(step) before = datas[filename][step] return output
def DP_main(datas, interDict): output = {"matching": [], "pending": []} rests = copy.deepcopy(interDict) # 境界が 0 番, 500番以外にないデータはここで除外する temprests = {} for r in rests: if len(rests[r]) > 2: temprests[r] = rests[r] rests = temprests # 最初の stateDict を作る stateDict = {"before": [], "after": [], "fname": [], "isadd": []} for fname in rests: fdata = datas[fname] stateDict["before"].append(fdata[rests[fname].pop(0)]) stateDict["after"].append(fdata[rests[fname].pop(0)]) stateDict["fname"].append(fname) stateDict["isadd"].append(False) while True: # rests が空なら終了 flg = True for fname in rests: if len(rests[fname]) != 0: flg = False break if flg == True: break # サンプリングを用いて vp を取得 vp = manager.getViewPointwothSampling(stateDict) # これをもとに predicts を作成 predicts = {} moved = manager.getMovedObject(stateDict) for i in range(len(stateDict["before"])): predicts[stateDict["fname"][i]] = getAdditionalIntermediate( datas[pending["fname"][i]], pending["before"][i]["step"], vp) # predicts と after の関係から,動作を決定する matching = {"before": [], "after": [], "fname": [], "isadd": []} # ignored = {"before":[], "after":[], "fname":[], "isadd":[]} # pending = {"before":[], "after":[], "fname":[], "isadd":[]} pending = {} for i in range(len(stateDict["before"])): # predicts と after の差が score の一定倍程度なら # matching として保存 if manager.calcDifference(predicts[stateDict["fname"][i]], stateDict["after"], objs=moved) < vp["score"] * 0.8: matching["before"].append(stateDict["before"][i]) matching["after"].append(predicts[stateDict["fname"][i]]) matching["fname"].append(stateDict["fname"]) matching["isadd"].append(stateDict["isadd"]) # 新手法は matching すべてに対して predicts を適用していくという # ものなので,ignored に対して特別な処理はしない # pending であるもののみ,rests に返却するために保存する elif predicts[stateDict["fname"] [i]]["step"] < stateDict["after"][i]["step"]: pending[stateDict["fname"][i]] = stateDict["after"][i]["step"] # rests に pending を返却 for fname in pending: rests[fname] = [pending[fname]] + rests[fname] # output に matching と pending を追加 output["matching"].append(matching) output["pending"].append(pending) # 次の stateDict を作る stateDict = {"before": [], "after": [], "fname": [], "isadd": []} for fname in rests: fdata = datas[fname] stateDict["before"].append(predicts[fname]) stateDict["after"].append(fdata[rests[fname].pop(0)]) stateDict["fname"].append(fname) stateDict["isadd"].append(False) for fname in stateDict["fname"]: # すでに境界状態を使い果たした(本来そうならないでほしいが)fnameを表示して無視 if len(rests[fname]) == 0: print("[predictMatching]DP_main:Empty - " + fname) for i in range(len(stateDict["fname"])): if stateDict["fname"][i] == fname: stateDict["before"].pop(i) stateDict["fname"].pop(i) break continue return output
def DP_main_2(datas, interDict, sampleSize=0.5, n_iter=50, distError=0.005): output = {"matching": [], "pending": []} rests = copy.deepcopy(interDict) # 境界が 0 番, 500番以外にないデータはここで除外する temprests = {} for r in rests: if len(rests[r]) > 2: temprests[r] = rests[r] rests = temprests for r in rests: print(rests[r]) # 最初の stateDict を作る stateDict = {"before": [], "after": [], "fname": [], "isadd": []} for fname in rests: fdata = datas[fname] stateDict["before"].append(fdata[rests[fname].pop(0)]) stateDict["after"].append(fdata[rests[fname].pop(0)]) stateDict["fname"].append(fname) stateDict["isadd"].append(False) while True: # rests が空なら終了 flg = True for fname in rests: if len(rests[fname]) != 0: flg = False break if flg == True: break # サンプリングを用いて vp を取得 vp = manager.getViewPointwithSampling(stateDict, sampleSize, n_iter) print("get vp:" + str(vp[0]["base"]) + "," + str(vp[0]["ref"])) # これをもとに predicts を作成 predicts = {} moved = manager.getMovedObject(stateDict) for i in range(len(stateDict["before"])): # step を使う場合は -1 predicts[stateDict["fname"][i]] = getAdditionalIntermediate( datas[stateDict["fname"][i]], stateDict["before"][i]["step"] - 1, vp) # predicts と after の関係から,動作を決定する matching = {"before": [], "after": [], "fname": [], "isadd": []} pending = {} for i in range(len(stateDict["before"])): # predicts と after の差が score の一定倍程度なら # matching として保存 matching["before"].append(stateDict["before"][i]) matching["after"].append(predicts[stateDict["fname"][i]]) matching["fname"].append(stateDict["fname"][i]) matching["isadd"].append(stateDict["isadd"][i]) # 新手法は matching すべてに対して predicts を適用していくという # ものなので,ignored に対して特別な処理はしない # pending であるもののみ,rests に返却するために保存する print("aaa" + str(predicts[stateDict["fname"][i]])) print("bbb" + str(stateDict["after"][i])) if manager.calcDifference( predicts[stateDict["fname"][i]], stateDict["after"][i], objs=moved) >= vp[0]["score"] * distError and predicts[ stateDict["fname"] [i]]["step"] < stateDict["after"][i]["step"]: pending[stateDict["fname"][i]] = stateDict["after"][i]["step"] # rests に pending を返却 for fname in pending: # インデックスのずれを修正するために -1 rests[fname] = [pending[fname] - 1] + rests[fname] # output に matching と pending を追加 output["matching"].append(matching) output["pending"].append(pending) with open("tmp/log_MakerMain/dills/DP_main_2_temp.dill", "wb") as f: dill.dump(output, f) print("new Matching") print([[matching["before"][i]["step"], matching["after"][i]["step"]] for i in range(len(matching["after"]))]) print("new Pending") print([pending[fname] for fname in pending]) # 次の stateDict を作る stateDict = {"before": [], "after": [], "fname": [], "isadd": []} for fname in rests: fdata = datas[fname] stateDict["before"].append(predicts[fname]) if len(rests[fname]) > 0: stateDict["after"].append(fdata[rests[fname].pop(0)]) else: print("EMPTY - " + fname) stateDict["after"].append(fdata[-1]) stateDict["fname"].append(fname) stateDict["isadd"].append(False) return output