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