def get_roundwise_dialog_actions()

in mm_action_prediction/tools/extract_actions.py [0:0]


def get_roundwise_dialog_actions(subtask, dialog_actions):
    """From NLU / NLG + Assistant logs, get finalized actions + carousel states.

    Args:
        subtask: sub-task, one of DOMINANT_ACTION or MULTI_ACTION
        dialog_actions: Dialog actions with metainformation
    """
    # Initialize the turn carousel state as empty.
    carousel_pos = ["left", "center", "right"]
    ignore_actions = ["BringObjectToFocus", "FurnitureClick"]
    turn_carousel_state = get_carousel_state(None)
    roundwise_actions = []
    for _turn_id, turn_datum in enumerate(dialog_actions):
        # Report action and supervision for assistant.
        action_datum = {}
        # Defaults.
        cur_action = NONE_ACTION
        cur_supervision = None
        action_output_state = None
        action_datum["carousel_state"] = copy.deepcopy(turn_carousel_state)
        relevant_actions = turn_datum["relevant_apis_with_args"]
        # search_results = turn_datum["current_search_results"]
        if len(relevant_actions) == 1:
            cur_action = relevant_actions[0]["api"]
            if cur_action in ignore_actions:
                cur_action = NONE_ACTION
                action_datum["carousel_state"] = copy.deepcopy(turn_carousel_state)
            else:
                cur_supervision = relevant_actions[0]
                # Update carousel state and store.
                insert_state, action_output_state = update_carousel_state(
                    relevant_actions[0], turn_carousel_state
                )
                action_datum["carousel_state"] = insert_state
        elif len(relevant_actions) > 1:
            combo_actions = [ii["api"] for ii in relevant_actions]
            # For combos, use the following priority:
            combo_args = {ii["api"]: ii for ii in relevant_actions}
            preference_order = [
                ADD_TO_CART_ACTION,
                GET_INFO_ACTION,
                ROTATE_ACTION,
                SEARCH_FURNITURE_ACTION,
                FOCUS_ON_FURNITURE_ACTION,
                NAVIGATE_CAROUSEL_ACTION,
                NONE_ACTION,
            ]
            cur_supervision = None
            for order in preference_order:
                if order in combo_actions:
                    cur_action = order
                    break
            if order == NONE_ACTION:
                action_datum["carousel_state"] = copy.deepcopy(turn_carousel_state)
            else:
                cur_supervision = combo_args[order]
                # Update carousel state and store.
                insert_state, action_output_state = update_carousel_state(
                    combo_args[order], turn_carousel_state
                )
                action_datum["carousel_state"] = insert_state

        if subtask == DOMINANT_ACTION:
            # for DOMINANT_ACTION subtask remove absolute reference from ARGS
            if cur_action == NAVIGATE_CAROUSEL_ACTION:
                cur_supervision[ARGS] = {
                    NAVIGATE_DIRECTION: cur_supervision[ARGS][NAVIGATE_DIRECTION]
                }
            # if cur_action == FOCUS_ON_FURNITURE_ACTION:
            #    cur_supervision[ARGS] = {
            #        POSITION: cur_supervision[ARGS][POSITION]
            #    }  <-- clean up, and align with below FOCUS_ON_FURNITURE_ACTION
            if cur_action == ROTATE_ACTION:
                cur_supervision[ARGS] = {
                    DIRECTION: cur_supervision[ARGS][DIRECTION]
                }
            if (
                cur_action == GET_INFO_ACTION
                or cur_action == ADD_TO_CART_ACTION
            ):
                # for GET_INFO_ACTION and ADD_TO_CART_ACTION subtask create a
                # single reference relative to the carousel
                furniture_ids = cur_supervision[ARGS][FURNITURE_ID]
                if turn_carousel_state["focus"]:
                    if turn_carousel_state["focus"] in furniture_ids:
                        cur_supervision[ARGS][FURNITURE_ID] = "focus"
                    else:
                        cur_supervision[ARGS][FURNITURE_ID] = ""
                else:
                    in_carousel = False
                    for id in furniture_ids:
                        if id in turn_carousel_state["carousel"]:
                            index = turn_carousel_state["carousel"].index(id)
                            cur_supervision[ARGS][FURNITURE_ID] = \
                                carousel_pos[index]
                            in_carousel = True
                            break  # take first only
                    if not in_carousel:
                        cur_supervision[ARGS][FURNITURE_ID] = ""

        if cur_action == FOCUS_ON_FURNITURE_ACTION:
            furniture_id = cur_supervision["args"]["furniture_id"]
            # Check if furniture is in shared carousel.
            shared_carousel = cur_supervision["nextState"]["sharedPrefabsInCarousel"]
            if furniture_id in shared_carousel:
                position = shared_carousel.index(furniture_id)
            # Else, check assistant carousel (did not share)!
            else:
                assistant_carousel = cur_supervision["nextState"]["prefabsInCarousel"]
                position = assistant_carousel.index(furniture_id)
            cur_supervision["args"] = {
                # "furniture_id": furniture_id,
                "position": carousel_pos[position],
            }
        action_datum["action"] = cur_action
        action_datum["action_supervision"] = cur_supervision
        action_datum["action_output_state"] = action_output_state

        # Go through all the raw_actions to get the next turn_state 
        # (only if Share is the last action)
        raw_actions = turn_datum["raw_action_with_args"]
        for raw_act in raw_actions:
            if raw_act[API] == SHARE:
                turn_carousel_state = {
                    "focus": raw_act[NEXT_STATE][SHARED_FOCUS],
                    "carousel": raw_act[NEXT_STATE][SHARED_CAROUSEL],
                }

        # Also record the final carousel_state.
        action_datum["final_carousel_state"] = copy.deepcopy(turn_carousel_state)
        roundwise_actions.append(action_datum)
    return roundwise_actions