in Luminous4Alfred/TaskParser/cdf_gene/utils.py [0:0]
def modify(cdf_dict):
'''
Modify cdf by implicit rules
'''
#{"name": "Box_1", "location": [{"Sofa_1": "on"}]}, {"name": "DeskLamp_1"}]}
required_objects = cdf_dict["scene"]["required_objects"]
solving_scripts = cdf_dict["script"]
task_goals = cdf_dict["task_goals"]
# if len(required_objects) == 0:
# return
# #print(required_objects)
# # different room cases:
# if cdf_dict["scene"]["scene_type"][0] in [1]: # living room
# # modify desklamp: put it on a side table
# side_table_index = 1
# for req_obj in required_objects:
# if "SideTable" in req_obj["name"]:
# side_table_index += 1
# has_desklamp = False
# for req_obj in required_objects:
# if "DeskLamp_1" in req_obj["name"]:
# req_obj["name"] = "SideTable_{}".format(side_table_index)
# has_desklamp = True
# break
# if has_desklamp:
# new_req_obj = {"name": "DeskLamp_1", "location": [{"SideTable_{}".format(side_table_index): "on"}]}
# required_objects.append(new_req_obj)
# # rename Shelf: doesn't exist in the new version of ithor
# for req_obj in required_objects:
# if "Shelf_" in req_obj["name"] or "Drawer_" in req_obj["name"]:
# req_obj["name"] = req_obj["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# if "location" in req_obj:
# #print(req_obj["location"])
# key_value = req_obj["location"][0]
# key = list(key_value)[0]
# value = key_value[key]
# if "Shelf_" in str(key) or "Drawer_" in str(key):
# new_key = str(key).replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# req_obj["location"].append({new_key: value})
# req_obj["location"].remove(key_value)
# # rename shelf for solving script
# for script in solving_scripts:
# if "Shelf_" in script["name"] or "Drawer_" in script["name"]:
# script["name"] = script["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# # rename shelf for target goals
# for goal in task_goals:
# for obj_state in goal["object_states"]:
# if "name" in obj_state and ("Shelf_" in obj_state["name"] or "Drawer_" in obj_state["name"]):
# obj_state["name"] = obj_state["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# if "receptacle_name" in obj_state and ("Shelf_" in obj_state["receptacle_name"] or "Drawer_" in obj_state["receptacle_name"]):
# obj_state["receptacle_name"] = obj_state["receptacle_name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# elif cdf_dict["scene"]["scene_type"][0] in [2]: #bedroom
# # modify desklamp: put it on a side table
# desk_index = 1
# # for req_obj in required_objects:
# # if "SideTable" in req_obj["name"]:
# # desk_index += 1
# has_desklamp = False
# for req_obj in required_objects:
# if "DeskLamp_1" in req_obj["name"]:
# req_obj["name"] = "Desk_{}".format(desk_index)
# has_desklamp = True
# break
# if has_desklamp:
# new_req_obj = {"name": "DeskLamp_1", "location": [{"Desk_{}".format(desk_index): "on"}]}
# required_objects.append(new_req_obj)
# # rename Shelf: doesn't exist in the new version of ithor
# for req_obj in required_objects:
# if "Shelf_" in req_obj["name"] or "Drawer_" in req_obj["name"]:
# req_obj["name"] = req_obj["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# if "location" in req_obj:
# #print(req_obj["location"])
# key_value = req_obj["location"][0]
# key = list(key_value)[0]
# value = key_value[key]
# if "Shelf_" in str(key) or "Drawer_" in str(key):
# new_key = str(key).replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# req_obj["location"].append({new_key: value})
# req_obj["location"].remove(key_value)
# # rename shelf for solving script
# for script in solving_scripts:
# if "Shelf_" in script["name"] or "Drawer_" in script["name"]:
# script["name"] = script["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# # rename shelf for target goals
# # print(task_goals)
# for goal in task_goals:
# for obj_state in goal["object_states"]:
# if "name" in obj_state and ("Shelf_" in obj_state["name"] or "Drawer_" in obj_state["name"]):
# obj_state["name"] = obj_state["name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# if "receptacle_name" in obj_state and ("Shelf_" in obj_state["receptacle_name"] or "Drawer_" in obj_state["receptacle_name"]):
# obj_state["receptacle_name"] = obj_state["receptacle_name"].replace("Shelf_", "SideTable_").replace("Drawer_", "Desk_")
# # Delete Kitchen CounterTop: for default, we already include some countertops in the scene
# elif cdf_dict["scene"]["scene_type"][0] in [0]: # Kitchen
# new_required_objects = []
# for req_obj in required_objects:
# req_obj_name = req_obj["name"].split("_")[0]
# #print(req_obj_name)
# if not ("CounterTop" in req_obj["name"] or "SinkBasin" in req_obj["name"] or "StoveBurner" in req_obj["name"] or \
# "Sink" in req_obj["name"] or "Drawer" in req_obj["name"] or "Cabinet" in req_obj["name"] or "Shelf" in req_obj["name"]):
# new_required_objects.append(req_obj)
# required_objects = new_required_objects
# cdf_dict["scene"]["required_objects"] = required_objects
# # for req_obj in required_objects:
# # if "CounterTop" in req_obj["name"] or "SinkBasin" in req_obj["name"] or "StoveBurner" in req_obj["name"] or \
# # "Sink" in req_obj["name"] or "Drawer" in req_obj["name"] or "Cabinet" in req_obj["name"]:
# # required_objects.remove(req_obj)
# # rename bottle
# for req_obj in required_objects:
# if "Glassbottle" in req_obj["name"]:
# req_obj["name"] = req_obj["name"].replace("Glassbottle","Bottle")
# #print("req_obj", req_obj["name"])
# # Delete Bath tub: for default, we already include some Bathtub in the scene
# else: # Bathroom
# #print("enter bathroom")
# remove_obj_list = ["BathtubBasin", "Cabinet", "CounterTop", "Drawer", "SinkBasin", "Sink", "ToiletPaperHanger",
# "HandTowelHolder", "Shelf", "Bathtub"]
# new_required_objects = []
# for req_obj in required_objects:
# req_obj_name = req_obj["name"].split("_")[0]
# #print(req_obj_name)
# if req_obj_name not in remove_obj_list:
# new_required_objects.append(req_obj)
# required_objects = new_required_objects
# cdf_dict["scene"]["required_objects"] = required_objects
# has_cart, need_cart = False, False
# # modify shelf : put it on a side cart
# # modify toilet paper hanger : put it on toilet
# has_toilet, need_toilet = False, False
# for req_obj in required_objects:
# if "Cart" in req_obj["name"]:
# has_cart = True
# if "Toilet" in req_obj["name"]:
# has_toilet = True
# if "location" in req_obj:
# #print(req_obj["location"])
# key_value = req_obj["location"][0]
# key = list(key_value)[0]
# value = key_value[key]
# if "Shelf_" in str(key) or "HandTowelHolder_" in str(key):
# need_cart = True
# new_key = str(key).replace("Shelf_", "Cart_").replace("HandTowelHolder_", "Cart_")
# req_obj["location"].append({new_key: value})
# req_obj["location"].remove(key_value)
# if "ToiletPaperHanger_" in str(key):
# need_toilet = True
# new_key = str(key).replace("ToiletPaperHanger_", "Toilet_")
# req_obj["location"].append({new_key: value})
# req_obj["location"].remove(key_value)
# if (not has_cart) and need_cart:
# new_req_obj = {"name": "Cart_1"}
# required_objects.insert(0, new_req_obj)
# if not has_toilet:
# new_req_obj = {"name": "Toilet_1"}
# required_objects.insert(0, new_req_obj)
# # cdf_dict["scene"]["required_objects"] = required_objects
# # general cases
# # remove duplicated objects
# new_required_objects = []
# for required_obj in required_objects:
# obj_name = required_obj["name"]
# recept_name = list(required_obj["location"][0].keys())[0] if "location" in required_obj else None
# if recept_name == None or recept_name != obj_name:
# # print("name duplicated loc", required_obj)
# new_required_objects.append(required_obj)
# cdf_dict["scene"]["required_objects"] = new_required_objects
# modify scripts
new_high_pddl = []
for script in solving_scripts:
if script["action"] == "GotoLocation":
obj_name = script["name"]
target_name = obj_name
for required_obj in cdf_dict["scene"]["required_objects"]:
if required_obj["name"] == obj_name:
if "location" in required_obj:
recept_name = list(required_obj["location"][0].keys())[0]
target_name = recept_name
break
new_high_pddl.append({
"action": "GotoLocation",
"name": target_name
})
else:
new_high_pddl.append(script)
cdf_dict["high_pddl"] = new_high_pddl