def feature_RES_tensor_map(csv_roomrecord_groupby, csv_object, LOS, *map_args):
    for (Filename), group in csv_roomrecord_groupby:
        print(Filename)
        game_state = GameState(Filename, csv_object)
        bops, bops_last_pos = game_state.bops, game_state.bops_last_pos
        stage_groupby = group.groupby(["StageID"])
        states_tensor_red = []
        states_tensor_blue = []
        bops_odd = []
        bops_even = []
        soldier_red = [bops["red_soldier1"]["Pos"]]
        soldier_blue = [bops["blue_soldier1"]["Pos"]]
        for (stageid), group in stage_groupby:
            group1 = group.sort_values(by=["TimeID", "ObjStep"],
                                       axis=0,
                                       ascending=[False, False])

            game_state.initCancelKeep()
            bops["stage"] = stageid
            bops["red_win"] = group.iloc[0]["JmResult"]

            bops_one_stage = []

            for indexs, row in group1.iterrows():
                bop_name = game_state.Get_bop_name(row.ObjID)
                if row.ObjNewPos == row.ObjPos:
                    if row.ObjInto != 0:
                        game_state.UpdateOn(row, bop_name)
                    if row.ObjOut != 0:
                        game_state.UpdateOut(row, bop_name)

                    if row.AttackID != 0:
                        game_state.Attack(row, bop_name)
                    if row.CityTake != 0:
                        game_state.Occupy(row)
                    if row.ObjHide != 0:
                        game_state.Hide(row, bop_name)
                    if row.ObjPass == 1:
                        game_state.Pass(row, bop_name)
                    if row.ObjKeepCancel != 0:
                        game_state.KeepCancel(row, bop_name)
                else:
                    game_state.Move(row, bop_name)
                    soldier_red.append(bops["red_soldier1"]["Pos"])
                    soldier_blue.append(bops["blue_soldier1"]["Pos"])
        dirs = '../data/test/'
        if not os.path.isdir(dirs):
            os.makedirs(dirs)
        plot_position(soldier_red, soldier_blue, dirs, Filename)
def feature_RES_tensor(csv_roomrecord_groupby, csv_object, LOS):
    for (Filename), group in csv_roomrecord_groupby:
        print(Filename)
        game_state = GameState(Filename, csv_object)
        bops, bops_last_pos = game_state.bops, game_state.bops_last_pos
        stage_groupby = group.groupby(["StageID"])
        states_tensor_red = []
        states_tensor_blue = []
        bops_odd = []
        bops_even = []
        for (stageid), group in stage_groupby:
            group1 = group.sort_values(by=["TimeID", "ObjStep"],
                                       axis=0,
                                       ascending=[False, False])

            game_state.initCancelKeep()
            bops["stage"] = stageid
            bops["red_win"] = group.iloc[0]["JmResult"]

            bops_one_stage = []
            for indexs, row in group1.iterrows():
                bop_name = game_state.Get_bop_name(row.ObjID)
                if row.ObjNewPos == row.ObjPos:
                    if row.ObjInto != 0:
                        game_state.UpdateOn(row, bop_name)
                    if row.ObjOut != 0:
                        game_state.UpdateOut(row, bop_name)

                    if row.AttackID != 0:
                        game_state.Attack(row, bop_name)
                    if row.CityTake != 0:
                        game_state.Occupy(row)
                    if row.ObjHide != 0:
                        game_state.Hide(row, bop_name)
                    if row.ObjPass == 1:
                        game_state.Pass(row, bop_name)
                    if row.ObjKeepCancel != 0:
                        game_state.KeepCancel(row, bop_name)
                else:
                    game_state.Move(row, bop_name)
                bops_one_stage.append(copy.deepcopy(bops))

            if stageid % 2 == 1:  # 奇数阶段,采集红方预测蓝方棋子信息
                bops_odd = bops_one_stage
                flag, tensor_one_stage_red, = StateFeature_two_stage(
                    bops_odd, bops_even, bops_last_pos, LOS, 1)
                if flag:
                    states_tensor_red.append(tensor_one_stage_red)
            else:  # 偶数阶段,采集蓝方预测红方棋子信息
                bops_even = bops_one_stage
                flag, tensor_one_stage_blue, = StateFeature_two_stage(
                    bops_odd, bops_even, bops_last_pos, LOS, 0)
                if flag:
                    states_tensor_blue.append(tensor_one_stage_blue)

        spatial_states_np_red = np.concatenate(states_tensor_red)
        spatial_states_np_blue = np.concatenate(states_tensor_blue)
        spatial_states_np_red = spatial_states_np_red.reshape(
            [spatial_states_np_red.shape[0], -1])
        spatial_states_np_blue = spatial_states_np_blue.reshape(
            [spatial_states_np_blue.shape[0], -1])
        print(spatial_states_np_blue.shape)
        print(spatial_states_np_red.shape, "--------")
        vs1 = 'red2blue'
        vs2 = 'blue2red'

        path = os.path.join('../data/feature_data/feature_RES_tensor/')
        if not os.path.isdir(path):
            os.makedirs(path)
        sparse.save_npz(os.path.join(path, Filename + vs1 + '@S'),
                        sparse.csc_matrix(spatial_states_np_red))

        sparse.save_npz(os.path.join(path, Filename + vs2 + '@S'),
                        sparse.csc_matrix(spatial_states_np_blue))