Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #4
0
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
Beispiel #5
0
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